Skip to content

Commit 441bd82

Browse files
author
007lva
committed
Merge branch 'master' into chore/replace-Fixnum-and-Bignum-with-Integer
2 parents 20563f1 + 8fc492a commit 441bd82

File tree

10 files changed

+121
-15
lines changed

10 files changed

+121
-15
lines changed

.travis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@ before_install: gem install bundler -v '<2'
99
rvm:
1010
- 2.5.3
1111
- 2.6.0
12+
- 2.7.1
1213
- jruby-9.2.5.0
1314
- jruby-head
1415
- ruby-head
1516

1617
matrix:
1718
include:
18-
- rvm: 2.6.0
19+
- rvm: 2.7.1
1920
script: bundle exec rake test_isolated
20-
include:
21-
- rvm: 2.6.0
21+
- rvm: 2.7.1
2222
script: bundle exec rake rubocop
2323
allow_failures:
2424
- rvm: jruby-9.2.5.0

CHANGELOG.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,17 @@ Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprocket
44

55
## Master
66

7+
- Remove remaining support for Ruby < 2.4.[#672](https://github.com/rails/sprockets/pull/672)
8+
9+
## 4.0.2
10+
11+
- Fix `etag` and digest path compilation that were generating string with invalid digest since 4.0.1.
12+
13+
## 4.0.1
14+
715
- Fix for Ruby 2.7 keyword arguments warning in `base.rb`. [#660](https://github.com/rails/sprockets/pull/660)
816
- Fix for when `x_sprockets_linecount` is missing from a source map.
9-
- Remove remaining support for Ruby < 2.4.[#672](https://github.com/rails/sprockets/pull/672)
17+
- Fix subresource integrity to match the digest of the asset.
1018

1119
## 4.0.0
1220

lib/sprockets/asset.rb

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,26 @@ def digest
123123
metadata[:digest]
124124
end
125125

126+
# Private: Return the version of the environment where the asset was generated.
127+
def environment_version
128+
metadata[:environment_version]
129+
end
130+
126131
# Public: Returns String hexdigest of source.
127132
def hexdigest
128133
DigestUtils.pack_hexdigest(digest)
129134
end
130135

131136
# Pubic: ETag String of Asset.
132-
alias_method :etag, :hexdigest
137+
def etag
138+
version = environment_version
139+
140+
if version && version != ""
141+
DigestUtils.hexdigest(version + digest)
142+
else
143+
DigestUtils.pack_hexdigest(digest)
144+
end
145+
end
133146

134147
# Public: Returns String base64 digest of source.
135148
def base64digest
@@ -138,7 +151,7 @@ def base64digest
138151

139152
# Public: A "named information" URL for subresource integrity.
140153
def integrity
141-
DigestUtils.integrity_uri(metadata[:digest])
154+
DigestUtils.integrity_uri(digest)
142155
end
143156

144157
# Public: Add enumerator to allow `Asset` instances to be used as Rack

lib/sprockets/exporters/base.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,3 @@ def write(filename = target)
6969
end
7070
end
7171
end
72-

lib/sprockets/loader.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,14 +195,16 @@ def load_from_unloaded(unloaded)
195195
source = result.delete(:data)
196196
metadata = result
197197
metadata[:charset] = source.encoding.name.downcase unless metadata.key?(:charset)
198-
metadata[:digest] = digest(self.version + source)
198+
metadata[:digest] = digest(source)
199199
metadata[:length] = source.bytesize
200+
metadata[:environment_version] = version
200201
else
201202
dependencies << build_file_digest_uri(unloaded.filename)
202203
metadata = {
203204
digest: file_digest(unloaded.filename),
204205
length: self.stat(unloaded.filename).size,
205-
dependencies: dependencies
206+
dependencies: dependencies,
207+
environment_version: version,
206208
}
207209
end
208210

lib/sprockets/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
# frozen_string_literal: true
22
module Sprockets
3-
VERSION = "4.0.0"
3+
VERSION = "4.0.2"
44
end

test/test_asset.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,12 @@ def setup
435435
@asset.digest_path
436436
end
437437

438+
test "environment version" do
439+
@env.version = "v1"
440+
441+
assert_equal "v1", @env['application.js'].environment_version
442+
end
443+
438444
test "content type" do
439445
assert_equal "application/javascript", @asset.content_type
440446
end

test/test_environment.rb

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -720,10 +720,64 @@ def setup
720720
assert_equal 2, asset.metadata[:selector_count]
721721
end
722722

723-
test "changing version changes the digest of the asset" do
724-
old_asset_digest = @env["gallery.js"].hexdigest
723+
test "changing version changes the digest_path of the asset" do
724+
old_asset_digest = @env["gallery.js"].digest_path
725725
@env.version = 'v2'
726-
assert old_asset_digest != @env["gallery.js"].hexdigest
726+
refute_equal old_asset_digest, @env["gallery.js"].digest_path
727+
end
728+
729+
test "changing version changes the digest_path of the asset when there is no preposessor" do
730+
old_asset_digest = @env["blank.gif"].digest_path
731+
@env.version = 'v2'
732+
refute_equal old_asset_digest, @env["blank.gif"].digest_path
733+
end
734+
735+
test "changing version changes the etag of the asset" do
736+
old_asset_etag = @env["gallery.js"].etag
737+
@env.version = 'v2'
738+
new_asset_etag = @env["gallery.js"].etag
739+
refute_equal old_asset_etag, new_asset_etag
740+
assert_equal old_asset_etag.size, new_asset_etag.size
741+
end
742+
743+
test "changing version to nil does not break etag" do
744+
old_asset_etag = @env["gallery.js"].etag
745+
@env.version = nil
746+
new_asset_etag = @env["gallery.js"].etag
747+
assert_equal old_asset_etag, new_asset_etag
748+
assert_equal old_asset_etag.size, new_asset_etag.size
749+
end
750+
751+
test "changing version does not changes the digest of the asset" do
752+
old_asset_digest = @env["gallery.js"].digest
753+
754+
@env.version = 'v2'
755+
756+
assert_equal old_asset_digest, @env["gallery.js"].digest
757+
end
758+
759+
test "changing version does not changes the hexdigest of the asset" do
760+
old_asset_hexdigest = @env["gallery.js"].hexdigest
761+
762+
@env.version = 'v2'
763+
764+
assert_equal old_asset_hexdigest, @env["gallery.js"].hexdigest
765+
end
766+
767+
test "changing version does not changes the base64digest of the asset" do
768+
old_asset_base64digest = @env["gallery.js"].base64digest
769+
770+
@env.version = 'v2'
771+
772+
assert_equal old_asset_base64digest, @env["gallery.js"].base64digest
773+
end
774+
775+
test "changing version does not changes the integrity of the asset" do
776+
old_asset_integrity = @env["gallery.js"].integrity
777+
778+
@env.version = 'v2'
779+
780+
assert_equal old_asset_integrity, @env["gallery.js"].integrity
727781
end
728782

729783
test "bundled asset is stale if its mtime is updated or deleted" do

test/test_manifest.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def teardown
8686
end
8787

8888
test "compile asset" do
89+
@env.version = '1.1.2'
8990
manifest = Sprockets::Manifest.new(@env, File.join(@dir, 'manifest.json'))
9091

9192
digest_path = @env['application.js'].digest_path
@@ -327,6 +328,29 @@ def teardown
327328
assert_equal subdep_digest_path, data['assets']['gallery.js']
328329
end
329330

331+
test "recompile asset when environment version is changed" do
332+
manifest = Sprockets::Manifest.new(@env, File.join(@dir, 'manifest.json'))
333+
334+
digest_path = @env['application.js'].digest_path
335+
filename = fixture_path('default/application.coffee')
336+
337+
sandbox filename do
338+
assert !File.exist?("#{@dir}/#{digest_path}"), Dir["#{@dir}/*"].inspect
339+
340+
manifest.compile('application.js')
341+
342+
assert File.exist?("#{@dir}/manifest.json")
343+
assert File.exist?("#{@dir}/#{digest_path}")
344+
345+
@env.version = '1.1.3'
346+
new_digest_path = @env['application.js'].digest_path
347+
348+
assert !File.exist?("#{@dir}/#{new_digest_path}"), Dir["#{@dir}/*"].inspect
349+
manifest.compile('application.js')
350+
assert File.exist?("#{@dir}/#{new_digest_path}")
351+
end
352+
end
353+
330354
test "recompile asset" do
331355
manifest = Sprockets::Manifest.new(@env, File.join(@dir, 'manifest.json'))
332356

test/test_source_maps.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ def get_sources(map)
345345
filename = fixture_path('source-maps/sub/a.js')
346346
sandbox filename do
347347
expected = JSON.parse(@env.find_asset('sub/directory.js.map').source).tap do |map|
348-
index = map["sections"].find_index { |s| /sub\/a\.js$/ =~ s["map"]["file"] }
348+
index = map["sections"].find_index { |s| s["map"]["file"].end_with?('sub/a.js') }
349349
map["sections"][index]["map"]["mappings"] << ";AACA"
350350
map["sections"][(index+1)..-1].each do |s|
351351
s["offset"]["line"] += 1
@@ -391,7 +391,7 @@ def setup
391391
assert_equal "sass/main.css.map", asset.logical_path
392392
assert_equal "application/css-sourcemap+json", asset.content_type
393393
assert_equal [
394-
"file:///#{ fixture_path('source-maps/sass/main.scss').sub(/\A\//, '') }?type=text/scss&pipeline=source"
394+
"file:///#{ fixture_path('source-maps/sass/main.scss').delete_prefix('/') }?type=text/scss&pipeline=source"
395395
], normalize_uris(asset.links)
396396

397397
assert map = JSON.parse(asset.source)

0 commit comments

Comments
 (0)