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.


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

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.


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

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.


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

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('&'.freeze)}" if query.any?
end

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

Internal: Join file: URI component parts into String.

Returns String.


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

def join_file_uri(scheme, host, path, query)
  str = String.new("#{scheme}://")
  str << host if host
  path = "/#{path}" unless path.start_with?("/".freeze)
  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.


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

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.


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

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.


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

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.


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

def parse_uri_query_params(query)
  query.to_s.split('&'.freeze).reduce({}) do |h, p|
    k, v = p.split('='.freeze, 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].


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

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.


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

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)

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

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