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.

encoding - A content encoding such as “gzip” or “deflate”. NOT a charset

like "utf-8".

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.



114
115
116
# File 'lib/sprockets/uri_utils.rb', line 114

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.



148
149
150
# File 'lib/sprockets/uri_utils.rb', line 148

def build_file_digest_uri(path)
  join_file_uri("file-digest", 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.



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

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.



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

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.



38
39
40
# File 'lib/sprockets/uri_utils.rb', line 38

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.



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

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.



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

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

  unless scheme == 'file-digest'
    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.



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

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].



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

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')

  [scheme, host, path, query]
end

#split_uri(uri) ⇒ Object

Internal: Parse URI into component parts.

uri - String uri

Returns Array of components.



31
32
33
# File 'lib/sprockets/uri_utils.rb', line 31

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)


76
77
78
79
80
81
# File 'lib/sprockets/uri_utils.rb', line 76

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