Module: Sprockets::URIUtils

Extended by:
URIUtils
Included in:
Dependencies, Loader, PathDependencyUtils, Processing, Resolve, URIUtils
Defined in:
lib/sprockets/uri_utils.rb

Overview

Internal: Asset URI related parsing utilities. Mixed into Environment.

An Asset URI identifies the compiled Asset result. It shares the file: scheme and requires an absolute path.

Other query parameters

type - String output content type. Otherwise assumed from file extension.

This maybe different than the extension if the asset is transformed
from one content type to another. For an example .coffee -> .js.

id - Unique fingerprint of the entire asset and all its metadata. Assets

will only have the same id if they serialize to an identical value.

pipeline - String name of pipeline.

Instance Method Summary collapse

Instance Method Details

#build_asset_uri(path, params = {}) ⇒ Object

Internal: Build Asset URI.

Examples

build("/tmp/js/application.coffee", type: "application/javascript")
# => "file:///tmp/js/application.coffee?type=application/javascript"

path - String file path params - Hash of optional parameters

Returns String URI.



111
112
113
# File 'lib/sprockets/uri_utils.rb', line 111

def build_asset_uri(path, params = {})
  join_file_uri("file", nil, path, encode_uri_query_params(params))
end

#build_file_digest_uri(path) ⇒ Object

Internal: Build file-digest dependency URI.

Examples

build("/tmp/js/application.js")
# => "file-digest:/tmp/js/application.js"

path - String file path

Returns String URI.



145
146
147
# File 'lib/sprockets/uri_utils.rb', line 145

def build_file_digest_uri(path)
  join_file_uri('file-digest'.freeze, nil, path, nil)
end

#encode_uri_query_params(params) ⇒ Object

Internal: Serialize hash of params into query string.

params - Hash of params to serialize

Returns String query or nil if empty.



154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# File 'lib/sprockets/uri_utils.rb', line 154

def encode_uri_query_params(params)
  query = []

  params.each do |key, value|
    case value
    when Integer
      query << "#{key}=#{value}"
    when String, Symbol
      query << "#{key}=#{URI::Generic::DEFAULT_PARSER.escape(value.to_s)}"
    when TrueClass
      query << "#{key}"
    when FalseClass, NilClass
    else
      raise TypeError, "unexpected type: #{value.class}"
    end
  end

  "#{query.join('&')}" if query.any?
end

#join_file_uri(scheme, host, path, query) ⇒ Object

Internal: Join file: URI component parts into String.

Returns String.



59
60
61
62
63
64
65
66
# File 'lib/sprockets/uri_utils.rb', line 59

def join_file_uri(scheme, host, path, query)
  str = "#{scheme}://"
  str << host if host
  path = "/#{path}" unless path.start_with?("/")
  str << URI::Generic::DEFAULT_PARSER.escape(path)
  str << "?#{query}" if query
  str
end

#join_uri(scheme, userinfo, host, port, registry, path, opaque, query, fragment) ⇒ Object

Internal: Join URI component parts into String.

Returns String.



35
36
37
# File 'lib/sprockets/uri_utils.rb', line 35

def join_uri(scheme, userinfo, host, port, registry, path, opaque, query, fragment)
  URI::Generic.new(scheme, userinfo, host, port, registry, path, opaque, query, fragment).to_s
end

#parse_asset_uri(uri) ⇒ Object

Internal: Parse Asset URI.

Examples

parse("file:///tmp/js/application.coffee?type=application/javascript")
# => "/tmp/js/application.coffee", {type: "application/javascript"}

uri - String asset URI

Returns String path and Hash of symbolized parameters.



90
91
92
93
94
95
96
97
98
# File 'lib/sprockets/uri_utils.rb', line 90

def parse_asset_uri(uri)
  scheme, _, path, query = split_file_uri(uri)

  unless scheme == 'file'
    raise URI::InvalidURIError, "expected file:// scheme: #{uri}"
  end

  return path, parse_uri_query_params(query)
end

#parse_file_digest_uri(uri) ⇒ Object

Internal: Parse file-digest dependency URI.

Examples

parse("file-digest:/tmp/js/application.js")
# => "/tmp/js/application.js"

uri - String file-digest URI

Returns String path.



125
126
127
128
129
130
131
132
133
# File 'lib/sprockets/uri_utils.rb', line 125

def parse_file_digest_uri(uri)
  scheme, _, path, _ = split_file_uri(uri)

  unless scheme == 'file-digest'.freeze
    raise URI::InvalidURIError, "expected file-digest scheme: #{uri}"
  end

  path
end

#parse_uri_query_params(query) ⇒ Object

Internal: Parse query string into hash of params

query - String query string

Return Hash of params.



179
180
181
182
183
184
185
186
# File 'lib/sprockets/uri_utils.rb', line 179

def parse_uri_query_params(query)
  query.to_s.split('&').reduce({}) do |h, p|
    k, v = p.split('=', 2)
    v = URI::Generic::DEFAULT_PARSER.unescape(v) if v
    h[k.to_sym] = v || true
    h
  end
end

#split_file_uri(uri) ⇒ Object

Internal: Parse file: URI into component parts.

uri - String uri

Returns [scheme, host, path, query].



44
45
46
47
48
49
50
51
52
53
54
# File 'lib/sprockets/uri_utils.rb', line 44

def split_file_uri(uri)
  scheme, _, host, _, _, path, _, query, _ = URI.split(uri)

  path = URI::Generic::DEFAULT_PARSER.unescape(path)
  path.force_encoding(Encoding::UTF_8)

  # Hack for parsing Windows "file:///C:/Users/IEUser" paths
  path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze)

  [scheme, host, path, query]
end

#split_uri(uri) ⇒ Object

Internal: Parse URI into component parts.

uri - String uri

Returns Array of components.



28
29
30
# File 'lib/sprockets/uri_utils.rb', line 28

def split_uri(uri)
  URI.split(uri)
end

#valid_asset_uri?(str) ⇒ Boolean

Internal: Check if String is a valid Asset URI.

str - Possible String asset URI.

Returns true or false.

Returns:

  • (Boolean)


73
74
75
76
77
78
# File 'lib/sprockets/uri_utils.rb', line 73

def valid_asset_uri?(str)
  # Quick prefix check before attempting a full parse
  str.start_with?("file://") && parse_asset_uri(str) ? true : false
rescue URI::InvalidURIError
  false
end