sprockets 3.7.0 → 3.7.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f3dc22bf9c6e294e72cca5cf894e39d28d56b419
4
- data.tar.gz: 58e0dcc75e743f649f83e48080c5f060c091dd85
2
+ SHA256:
3
+ metadata.gz: d8d2739c5e14edf6aa95989aef8057d65eeb1525b4fccda72ba6099a8fe94bd3
4
+ data.tar.gz: 42fea69a2cf60adff7848fea3c8cd7fff222703611feda467aa8c5236aed9d84
5
5
  SHA512:
6
- metadata.gz: 2c2cd23c31002b28297944e76fff80b8a05fcdc1f4aa64652bf43c5481c2f006854b20e6d4e45e234a482bf45ddd2e8cf122f0a9a5b1ae71ee421f346a2ba478
7
- data.tar.gz: 06168eae576a776fef2b13ba12f5c4a51e6e7846e1b7e098e0052e9da52fd40e9aef3830aad0bb36dc099643d113182eae39e1d0ac09456bd63bb3e19e5e5cac
6
+ metadata.gz: 753ee6f089d3e281ba3eb81fe4fbd133d50065337f84c02891895de4544d2204bc884c1599781d632f290b1d407d684f473e101e5ba535f12afebc82a979cdd8
7
+ data.tar.gz: 9c57173eb38957dc992617903bd15b922caf20468c5952c158ffa00472c52ce6e0029011495f8b2fcd9a9148cd7b4ce3525b1749b3c9b1a982038ca9afe0e737
data/CHANGELOG.md CHANGED
@@ -1,4 +1,16 @@
1
- ** 3.7.0** (July 21, 2016)
1
+ **3.7.3** (March 28, 2024)
2
+
3
+ * Various compatibility fixes for newer Ruby versions.
4
+
5
+ **3.7.2** (June 19, 2018)
6
+
7
+ * Security release for [CVE-2018-3760](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-3760).
8
+
9
+ **3.7.1** (December 19, 2016)
10
+
11
+ * Ruby 2.4 support for Sprockets 3.
12
+
13
+ **3.7.0** (July 21, 2016)
2
14
 
3
15
  * Deprecated interfaces now emit deprecation warnings #345
4
16
 
@@ -103,7 +115,7 @@
103
115
 
104
116
  **3.0.0** (April 12, 2015)
105
117
 
106
- [Guide to upgrading from Sprockets 2.x to 3.x](https://github.com/rails/sprockets/blob/master/UPGRADING.md)
118
+ [Guide to upgrading from Sprockets 2.x to 3.x](https://github.com/rails/sprockets/blob/3.x/UPGRADING.md)
107
119
 
108
120
  * New processor API. Tilt interface is deprecated.
109
121
  * Improved file store caching backend.
data/bin/sprockets CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ $VERBOSE = nil
2
3
 
3
4
  require 'sprockets'
4
5
  require 'optparse'
@@ -35,11 +35,12 @@ module Sprockets
35
35
  attr_reader :cache_key
36
36
 
37
37
  def initialize(options = {})
38
- @compiler = Autoload::Closure::Compiler.new(options)
38
+ @options = options
39
39
  @cache_key = "#{self.class.name}:#{Autoload::Closure::VERSION}:#{Autoload::Closure::COMPILER_VERSION}:#{VERSION}:#{DigestUtils.digest(options)}".freeze
40
40
  end
41
41
 
42
42
  def call(input)
43
+ @compiler ||= Autoload::Closure::Compiler.new(@options)
43
44
  @compiler.compile(input[:data])
44
45
  end
45
46
  end
@@ -44,12 +44,8 @@ module Sprockets
44
44
  digest << 'Symbol'.freeze
45
45
  digest << val.to_s
46
46
  },
47
- Fixnum => ->(val, digest) {
48
- digest << 'Fixnum'.freeze
49
- digest << val.to_s
50
- },
51
- Bignum => ->(val, digest) {
52
- digest << 'Bignum'.freeze
47
+ Integer => ->(val, digest) {
48
+ digest << 'Integer'.freeze
53
49
  digest << val.to_s
54
50
  },
55
51
  Array => ->(val, digest) {
@@ -73,6 +69,16 @@ module Sprockets
73
69
  digest << val.name
74
70
  },
75
71
  }
72
+ if 0.class != Integer # Ruby < 2.4
73
+ ADD_VALUE_TO_DIGEST[Fixnum] = ->(val, digest) {
74
+ digest << 'Integer'.freeze
75
+ digest << val.to_s
76
+ }
77
+ ADD_VALUE_TO_DIGEST[Bignum] = ->(val, digest) {
78
+ digest << 'Integer'.freeze
79
+ digest << val.to_s
80
+ }
81
+ end
76
82
  ADD_VALUE_TO_DIGEST.default_proc = ->(_, val) {
77
83
  raise TypeError, "couldn't digest #{ val }"
78
84
  }
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: false
2
+
1
3
  require 'set'
2
4
  require 'shellwords'
3
5
 
@@ -18,7 +18,12 @@ module Sprockets
18
18
  end
19
19
 
20
20
  def call(input)
21
- engine = ::ERB.new(input[:data], nil, '<>')
21
+ if keyword_constructor? # Ruby 2.6+
22
+ engine = ::ERB.new(input[:data], trim_mode: '<>')
23
+ else
24
+ engine = ::ERB.new(input[:data], nil, '<>')
25
+ end
26
+
22
27
  context = input[:environment].context_class.new(input)
23
28
  klass = (class << context; self; end)
24
29
  klass.class_eval(&@block) if @block
@@ -26,5 +31,12 @@ module Sprockets
26
31
  data = context._evaluate_template
27
32
  context.metadata.merge(data: data)
28
33
  end
34
+
35
+ private
36
+
37
+ def keyword_constructor?
38
+ return @keyword_constructor if defined? @keyword_constructor
39
+ @keyword_constructor = ::ERB.instance_method(:initialize).parameters.include?([:key, :trim_mode])
40
+ end
29
41
  end
30
42
  end
@@ -161,7 +161,8 @@ module Sprockets
161
161
  end
162
162
  else
163
163
  args.each do |path|
164
- yield File.binread(File.join(dir, assets[path]))
164
+ asset = assets[path]
165
+ yield File.binread(File.join(dir, asset)) if asset
165
166
  end
166
167
  end
167
168
  end
@@ -111,17 +111,37 @@ module Sprockets
111
111
  def compute_extname_map
112
112
  graph = {}
113
113
 
114
+ engine_extname_permutation = []
115
+
116
+ 4.times do |n|
117
+ config[:engines].keys.permutation(n).each do |engine_extnames|
118
+ engine_extname_permutation << engine_extnames
119
+ end
120
+ end
121
+
122
+ mime_exts_grouped_by_mime_type = {}
123
+ config[:mime_exts].each do |format_extname,format_type|
124
+ mime_exts_grouped_by_mime_type[format_type] ||= []
125
+ mime_exts_grouped_by_mime_type[format_type] << format_extname
126
+ end
127
+
114
128
  ([nil] + pipelines.keys.map(&:to_s)).each do |pipeline|
115
- pipeline_extname = ".#{pipeline}" if pipeline
116
- ([[nil, nil]] + config[:mime_exts].to_a).each do |format_extname, format_type|
117
- 4.times do |n|
118
- config[:engines].keys.permutation(n).each do |engine_extnames|
129
+ pipeline_extname = pipeline ? ".#{pipeline}" : ''.freeze
130
+ engine_extname_permutation.each do |engine_extnames|
131
+ mime_exts_grouped_by_mime_type.each do |format_type, format_extnames|
132
+ type = format_type
133
+ value = [type, engine_extnames, pipeline]
134
+ format_extnames.each do |format_extname|
119
135
  key = "#{pipeline_extname}#{format_extname}#{engine_extnames.join}"
120
- type = format_type || config[:engine_mime_types][engine_extnames.first]
121
- graph[key] = {type: type, engines: engine_extnames, pipeline: pipeline}
136
+ graph[key] = value
137
+ end
138
+ if format_type == config[:engine_mime_types][engine_extnames.first]
139
+ key = "#{pipeline_extname}#{engine_extnames.join}"
140
+ graph[key] = value
122
141
  end
123
142
  end
124
143
  end
144
+ graph[pipeline_extname] = [nil, [], pipeline]
125
145
  end
126
146
 
127
147
  graph
@@ -232,7 +232,7 @@ module Sprockets
232
232
  end
233
233
 
234
234
  def deprecate_legacy_processor_interface(interface)
235
- msg = "You are using the a deprecated processor interface #{ interface.inspect }.\n" +
235
+ msg = "You are using a deprecated processor interface #{ interface.inspect }.\n" +
236
236
  "Please update your processor interface:\n" +
237
237
  "https://github.com/rails/sprockets/blob/master/guides/extending_sprockets.md#supporting-all-versions-of-sprockets-in-processors\n"
238
238
 
@@ -107,12 +107,10 @@ module Sprockets
107
107
  VALID_METADATA_VALUE_TYPES = Set.new([
108
108
  String,
109
109
  Symbol,
110
- Fixnum,
111
- Bignum,
112
110
  TrueClass,
113
111
  FalseClass,
114
112
  NilClass
115
- ]).freeze
113
+ ] + (0.class == Integer ? [Integer] : [Bignum, Fixnum])).freeze
116
114
 
117
115
  # Internal: Set of all nested compound metadata types that can nest values.
118
116
  VALID_METADATA_COMPOUND_TYPES = Set.new([
@@ -202,7 +202,7 @@ module Sprockets
202
202
 
203
203
  if extname
204
204
  path = path.chomp(extname)
205
- type, engines, pipeline = value.values_at(:type, :engines, :pipeline)
205
+ type, engines, pipeline = value
206
206
  end
207
207
 
208
208
  return path, type, engines, pipeline
@@ -23,7 +23,7 @@ module Sprockets
23
23
  start_time = Time.now.to_f
24
24
  time_elapsed = lambda { ((Time.now.to_f - start_time) * 1000).to_i }
25
25
 
26
- if env['REQUEST_METHOD'] != 'GET'
26
+ if !['GET', 'HEAD'].include?(env['REQUEST_METHOD'])
27
27
  return method_not_allowed_response
28
28
  end
29
29
 
@@ -39,7 +39,7 @@ module Sprockets
39
39
 
40
40
  # URLs containing a `".."` are rejected for security reasons.
41
41
  if forbidden_request?(path)
42
- return forbidden_response
42
+ return forbidden_response(env)
43
43
  end
44
44
 
45
45
  # Look up the asset.
@@ -86,10 +86,10 @@ module Sprockets
86
86
  not_modified_response(env, if_none_match)
87
87
  when :not_found
88
88
  logger.info "#{msg} 404 Not Found (#{time_elapsed.call}ms)"
89
- not_found_response
89
+ not_found_response(env)
90
90
  when :precondition_failed
91
91
  logger.info "#{msg} 412 Precondition Failed (#{time_elapsed.call}ms)"
92
- precondition_failed_response
92
+ precondition_failed_response(env)
93
93
  end
94
94
  rescue Exception => e
95
95
  logger.error "Error compiling asset #{path}:"
@@ -115,12 +115,20 @@ module Sprockets
115
115
  #
116
116
  # http://example.org/assets/../../../etc/passwd
117
117
  #
118
- path.include?("..") || absolute_path?(path)
118
+ path.include?("..") || absolute_path?(path) || path.include?("://")
119
+ end
120
+
121
+ def head_request?(env)
122
+ env['REQUEST_METHOD'] == 'HEAD'
119
123
  end
120
124
 
121
125
  # Returns a 200 OK response tuple
122
126
  def ok_response(asset, env)
123
- [ 200, headers(env, asset, asset.length), asset ]
127
+ if head_request?(env)
128
+ [ 200, headers(env, asset, 0), [] ]
129
+ else
130
+ [ 200, headers(env, asset, asset.length), asset ]
131
+ end
124
132
  end
125
133
 
126
134
  # Returns a 304 Not Modified response tuple
@@ -129,21 +137,33 @@ module Sprockets
129
137
  end
130
138
 
131
139
  # Returns a 403 Forbidden response tuple
132
- def forbidden_response
133
- [ 403, { "Content-Type" => "text/plain", "Content-Length" => "9" }, [ "Forbidden" ] ]
140
+ def forbidden_response(env)
141
+ if head_request?(env)
142
+ [ 403, { "Content-Type" => "text/plain", "Content-Length" => "0" }, [] ]
143
+ else
144
+ [ 403, { "Content-Type" => "text/plain", "Content-Length" => "9" }, [ "Forbidden" ] ]
145
+ end
134
146
  end
135
147
 
136
148
  # Returns a 404 Not Found response tuple
137
- def not_found_response
138
- [ 404, { "Content-Type" => "text/plain", "Content-Length" => "9", "X-Cascade" => "pass" }, [ "Not found" ] ]
149
+ def not_found_response(env)
150
+ if head_request?(env)
151
+ [ 404, { "Content-Type" => "text/plain", "Content-Length" => "0", "X-Cascade" => "pass" }, [] ]
152
+ else
153
+ [ 404, { "Content-Type" => "text/plain", "Content-Length" => "9", "X-Cascade" => "pass" }, [ "Not found" ] ]
154
+ end
139
155
  end
140
156
 
141
157
  def method_not_allowed_response
142
158
  [ 405, { "Content-Type" => "text/plain", "Content-Length" => "18" }, [ "Method Not Allowed" ] ]
143
159
  end
144
160
 
145
- def precondition_failed_response
146
- [ 412, { "Content-Type" => "text/plain", "Content-Length" => "19", "X-Cascade" => "pass" }, [ "Precondition Failed" ] ]
161
+ def precondition_failed_response(env)
162
+ if head_request?(env)
163
+ [ 412, { "Content-Type" => "text/plain", "Content-Length" => "0", "X-Cascade" => "pass" }, [] ]
164
+ else
165
+ [ 412, { "Content-Type" => "text/plain", "Content-Length" => "19", "X-Cascade" => "pass" }, [ "Precondition Failed" ] ]
166
+ end
147
167
  end
148
168
 
149
169
  # Returns a JavaScript response that re-throws a Ruby exception
@@ -231,11 +251,11 @@ module Sprockets
231
251
  # If the request url contains a fingerprint, set a long
232
252
  # expires on the response
233
253
  if path_fingerprint(env["PATH_INFO"])
234
- headers["Cache-Control"] << ", max-age=31536000"
254
+ headers["Cache-Control"] += ", max-age=31536000"
235
255
 
236
256
  # Otherwise set `must-revalidate` since the asset could be modified.
237
257
  else
238
- headers["Cache-Control"] << ", must-revalidate"
258
+ headers["Cache-Control"] += ", must-revalidate"
239
259
  headers["Vary"] = "Accept-Encoding"
240
260
  end
241
261
 
@@ -44,11 +44,12 @@ module Sprockets
44
44
  options[:comments] ||= :none
45
45
  end
46
46
 
47
- @uglifier = Autoload::Uglifier.new(options)
47
+ @options = options
48
48
  @cache_key = "#{self.class.name}:#{Autoload::Uglifier::VERSION}:#{VERSION}:#{DigestUtils.digest(options)}".freeze
49
49
  end
50
50
 
51
51
  def call(input)
52
+ @uglifier ||= Autoload::Uglifier.new(@options)
52
53
  @uglifier.compile(input[:data])
53
54
  end
54
55
  end
@@ -50,6 +50,9 @@ module Sprockets
50
50
  # Hack for parsing Windows "file:///C:/Users/IEUser" paths
51
51
  path.gsub!(/^\/([a-zA-Z]:)/, '\1'.freeze)
52
52
 
53
+ host = nil if host && host.empty?
54
+ query = nil if query && query.empty?
55
+
53
56
  [scheme, host, path, query]
54
57
  end
55
58
 
@@ -14,11 +14,15 @@ module Sprockets
14
14
  #
15
15
  # Returns false if .dup would raise a TypeError, otherwise true.
16
16
  def duplicable?(obj)
17
- case obj
18
- when NilClass, FalseClass, TrueClass, Symbol, Numeric
19
- false
20
- else
17
+ if RUBY_VERSION >= "2.4.0"
21
18
  true
19
+ else
20
+ case obj
21
+ when NilClass, FalseClass, TrueClass, Symbol, Numeric
22
+ false
23
+ else
24
+ true
25
+ end
22
26
  end
23
27
  end
24
28
 
@@ -98,6 +102,7 @@ module Sprockets
98
102
  #
99
103
  # Returns buf String.
100
104
  def concat_javascript_sources(buf, source)
105
+ buf = +buf
101
106
  if source.bytesize > 0
102
107
  buf << source
103
108
 
@@ -1,3 +1,3 @@
1
1
  module Sprockets
2
- VERSION = "3.7.0"
2
+ VERSION = "3.7.3"
3
3
  end
data/lib/sprockets.rb CHANGED
@@ -105,7 +105,7 @@ module Sprockets
105
105
  register_bundle_processor 'application/javascript', Bundle
106
106
  register_bundle_processor 'text/css', Bundle
107
107
 
108
- register_bundle_metadata_reducer '*/*', :data, proc { "" }, :concat
108
+ register_bundle_metadata_reducer '*/*', :data, proc { "" }, :+
109
109
  register_bundle_metadata_reducer 'application/javascript', :data, proc { "" }, Utils.method(:concat_javascript_sources)
110
110
  register_bundle_metadata_reducer '*/*', :links, :+
111
111
 
metadata CHANGED
@@ -1,16 +1,30 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sprockets
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.0
4
+ version: 3.7.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Stephenson
8
8
  - Joshua Peek
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-07-21 00:00:00.000000000 Z
12
+ date: 2024-03-28 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: base64
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '0'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '0'
14
28
  - !ruby/object:Gem::Dependency
15
29
  name: rack
16
30
  requirement: !ruby/object:Gem::Requirement
@@ -175,16 +189,16 @@ dependencies:
175
189
  name: rake
176
190
  requirement: !ruby/object:Gem::Requirement
177
191
  requirements:
178
- - - "~>"
192
+ - - ">="
179
193
  - !ruby/object:Gem::Version
180
- version: '10.0'
194
+ version: '0'
181
195
  type: :development
182
196
  prerelease: false
183
197
  version_requirements: !ruby/object:Gem::Requirement
184
198
  requirements:
185
- - - "~>"
199
+ - - ">="
186
200
  - !ruby/object:Gem::Version
187
- version: '10.0'
201
+ version: '0'
188
202
  - !ruby/object:Gem::Dependency
189
203
  name: sass
190
204
  requirement: !ruby/object:Gem::Requirement
@@ -317,7 +331,7 @@ homepage: https://github.com/rails/sprockets
317
331
  licenses:
318
332
  - MIT
319
333
  metadata: {}
320
- post_install_message:
334
+ post_install_message:
321
335
  rdoc_options: []
322
336
  require_paths:
323
337
  - lib
@@ -332,9 +346,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
332
346
  - !ruby/object:Gem::Version
333
347
  version: '0'
334
348
  requirements: []
335
- rubyforge_project: sprockets
336
- rubygems_version: 2.5.1
337
- signing_key:
349
+ rubygems_version: 3.5.3
350
+ signing_key:
338
351
  specification_version: 4
339
352
  summary: Rack-based asset packaging system
340
353
  test_files: []