Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Shorter digest length #173

Merged
merged 2 commits into from
Dec 29, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/propshaft/asset.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def length
end

def digest
@digest ||= Digest::SHA1.hexdigest("#{content}#{version}")
@digest ||= Digest::SHA1.hexdigest("#{content}#{version}")[0,8]
wlipa marked this conversation as resolved.
Show resolved Hide resolved
end

def digested_path
Expand Down
2 changes: 1 addition & 1 deletion test/fixtures/output/.manifest.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "one.txt": "one-f2e1ec14d6856e1958083094170ca6119c529a73.txt" }
{ "one.txt": "one-f2e1ec14.txt" }
10 changes: 5 additions & 5 deletions test/propshaft/asset_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,18 @@ class Propshaft::AssetTest < ActiveSupport::TestCase
end

test "digest" do
assert_equal "f2e1ec14d6856e1958083094170ca6119c529a73", find_asset("one.txt").digest
assert_equal "f2e1ec14", find_asset("one.txt").digest
end

test "fresh" do
assert find_asset("one.txt").fresh?("f2e1ec14d6856e1958083094170ca6119c529a73")
assert_not find_asset("one.txt").fresh?("e206c34fe404c8e2f25d60dd8303f61c02b8d381")
assert find_asset("one.txt").fresh?("f2e1ec14")
assert_not find_asset("one.txt").fresh?("e206c34f")

assert find_asset("file-already-abcdefVWXYZ0123456789_-.digested.css").fresh?(nil)
end

test "digested path" do
assert_equal "one-f2e1ec14d6856e1958083094170ca6119c529a73.txt",
assert_equal "one-f2e1ec14.txt",
find_asset("one.txt").digested_path.to_s

assert_equal "file-already-abcdefVWXYZ0123456789_-.digested.css",
Expand All @@ -38,7 +38,7 @@ class Propshaft::AssetTest < ActiveSupport::TestCase
assert_equal "file-already-abcdefVWXYZ0123456789_-.digested.debug.css",
find_asset("file-already-abcdefVWXYZ0123456789_-.digested.debug.css").digested_path.to_s

assert_equal "file-not.digested-e206c34fe404c8e2f25d60dd8303f61c02b8d381.css",
assert_equal "file-not.digested-e206c34f.css",
find_asset("file-not.digested.css").digested_path.to_s
end

Expand Down
32 changes: 16 additions & 16 deletions test/propshaft/compiler/css_asset_urls_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,62 +15,62 @@ class Propshaft::Compiler::CssAssetUrlsTest < ActiveSupport::TestCase

test "basic" do
compiled = compile_asset_with_content(%({ background: url(file.jpg); }))
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "blank spaces around name" do
compiled = compile_asset_with_content(%({ background: url( file.jpg ); }))
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "quotes around name" do
compiled = compile_asset_with_content(%({ background: url("file.jpg"); }))
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "single quotes around name" do
compiled = compile_asset_with_content(%({ background: url('file.jpg'); }))
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "root directory" do
compiled = compile_asset_with_content(%({ background: url('/file.jpg'); }))
assert_match(/{ background: url\("\/assets\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "same directory" do
compiled = compile_asset_with_content(%({ background: url('./file.jpg'); }))
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "subdirectory" do
compiled = compile_asset_with_content(%({ background: url('./images/file.jpg'); }))
assert_match(/{ background: url\("\/assets\/foobar\/source\/images\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/source\/images\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "parent directory" do
compiled = compile_asset_with_content(%({ background: url('../file.jpg'); }))
assert_match(/{ background: url\("\/assets\/foobar\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "grandparent directory" do
compiled = compile_asset_with_content(%({ background: url('../../file.jpg'); }))
assert_match(/{ background: url\("\/assets\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "sibling directory" do
compiled = compile_asset_with_content(%({ background: url('../sibling/file.jpg'); }))
assert_match(/{ background: url\("\/assets\/foobar\/sibling\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/foobar\/sibling\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

test "mixed" do
compiled = compile_asset_with_content(%({ mask-image: image(url(file.jpg), skyblue, linear-gradient(rgba(0, 0, 0, 1.0), transparent)); }))
assert_match(/{ mask-image: image\(url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.jpg"\), skyblue, linear-gradient\(rgba\(0, 0, 0, 1.0\), transparent\)\); }/, compiled)
assert_match(/{ mask-image: image\(url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.jpg"\), skyblue, linear-gradient\(rgba\(0, 0, 0, 1.0\), transparent\)\); }/, compiled)
end

test "multiple" do
compiled = compile_asset_with_content(%({ content: url(file.svg) url(file.svg); }))
assert_match(/{ content: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.svg"\) url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.svg"\); }/, compiled)
assert_match(/{ content: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.svg"\) url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.svg"\); }/, compiled)
end

test "url" do
Expand All @@ -95,12 +95,12 @@ class Propshaft::Compiler::CssAssetUrlsTest < ActiveSupport::TestCase

test "fingerprint" do
compiled = compile_asset_with_content(%({ background: url('/file.jpg?30af91bf14e37666a085fb8a161ff36d'); }))
assert_match(/{ background: url\("\/assets\/file-[a-z0-9]{40}.jpg\?30af91bf14e37666a085fb8a161ff36d"\); }/, compiled)
assert_match(/{ background: url\("\/assets\/file-[a-z0-9]{8}.jpg\?30af91bf14e37666a085fb8a161ff36d"\); }/, compiled)
end

test "svg anchor" do
compiled = compile_asset_with_content(%({ content: url(file.svg#rails); }))
assert_match(/{ content: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.svg#rails"\); }/, compiled)
assert_match(/{ content: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.svg#rails"\); }/, compiled)
end

test "svg mask encoded anchor" do
Expand All @@ -110,7 +110,7 @@ class Propshaft::Compiler::CssAssetUrlsTest < ActiveSupport::TestCase

test "non greedy anchors" do
compiled = compile_asset_with_content(%({ content: url(file.svg#demo) url(file.svg#demo); }))
assert_match(/{ content: url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.svg#demo"\) url\("\/assets\/foobar\/source\/file-[a-z0-9]{40}.svg#demo"\); }/, compiled)
assert_match(/{ content: url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.svg#demo"\) url\("\/assets\/foobar\/source\/file-[a-z0-9]{8}.svg#demo"\); }/, compiled)
end

test "missing asset" do
Expand All @@ -122,7 +122,7 @@ class Propshaft::Compiler::CssAssetUrlsTest < ActiveSupport::TestCase
@options.relative_url_root = "/url-root"

compiled = compile_asset_with_content(%({ background: url(file.jpg); }))
assert_match(/{ background: url\("\/url-root\/assets\/foobar\/source\/file-[a-z0-9]{40}.jpg"\); }/, compiled)
assert_match(/{ background: url\("\/url-root\/assets\/foobar\/source\/file-[a-z0-9]{8}.jpg"\); }/, compiled)
end

private
Expand Down
12 changes: 6 additions & 6 deletions test/propshaft/compiler/source_mapping_urls_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ class Propshaft::Compiler::SourceMappingUrlsTest < ActiveSupport::TestCase
end

test "matching source map" do
assert_match %r{//# sourceMappingURL=/assets/source.js-[a-z0-9]{40}\.map},
assert_match %r{//# sourceMappingURL=/assets/source.js-[a-z0-9]{8}\.map},
compile_asset(find_asset("source.js", fixture_path: "mapped"))
assert_match %r{/\*# sourceMappingURL=/assets/source.css-[a-z0-9]{40}\.map},
assert_match %r{/\*# sourceMappingURL=/assets/source.css-[a-z0-9]{8}\.map},
compile_asset(find_asset("source.css", fixture_path: "mapped"))
end

test "matching nested source map" do
assert_match %r{//# sourceMappingURL=/assets/nested/another-source.js-[a-z0-9]{40}\.map},
assert_match %r{//# sourceMappingURL=/assets/nested/another-source.js-[a-z0-9]{8}\.map},
compile_asset(find_asset("nested/another-source.js", fixture_path: "mapped"))
end

Expand All @@ -38,9 +38,9 @@ class Propshaft::Compiler::SourceMappingUrlsTest < ActiveSupport::TestCase
end

test "sourceMappingURL not at the beginning of the line, but at end of file, is processed" do
assert_match %r{//# sourceMappingURL=/assets/sourceMappingURL-not-at-start.js-[a-z0-9]{40}\.map},
assert_match %r{//# sourceMappingURL=/assets/sourceMappingURL-not-at-start.js-[a-z0-9]{8}\.map},
compile_asset(find_asset("sourceMappingURL-not-at-start.js", fixture_path: "mapped"))
assert_match %r{/\*# sourceMappingURL=/assets/sourceMappingURL-not-at-start.css-[a-z0-9]{40}\.map \*/},
assert_match %r{/\*# sourceMappingURL=/assets/sourceMappingURL-not-at-start.css-[a-z0-9]{8}\.map \*/},
compile_asset(find_asset("sourceMappingURL-not-at-start.css", fixture_path: "mapped"))
end

Expand All @@ -56,7 +56,7 @@ class Propshaft::Compiler::SourceMappingUrlsTest < ActiveSupport::TestCase
test "relative url root" do
@options.relative_url_root = "/url-root"

assert_match %r{//# sourceMappingURL=/url-root/assets/source.js-[a-z0-9]{40}\.map},
assert_match %r{//# sourceMappingURL=/url-root/assets/source.js-[a-z0-9]{8}\.map},
compile_asset(find_asset("source.js", fixture_path: "mapped"))
end

Expand Down
2 changes: 1 addition & 1 deletion test/propshaft/compilers_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ class Propshaft::CompilersTest < ActiveSupport::TestCase

test "replace asset-path function in css with digested url" do
@assembly.compilers.register "text/css", Propshaft::Compiler::CssAssetUrls
assert_match(/"\/assets\/archive-[a-z0-9]{40}.svg/, @assembly.compilers.compile(find_asset("another.css")))
assert_match(/"\/assets\/archive-[a-z0-9]{8}.svg/, @assembly.compilers.compile(find_asset("another.css")))
end

private
Expand Down
8 changes: 4 additions & 4 deletions test/propshaft/load_path_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,16 @@ class Propshaft::LoadPathTest < ActiveSupport::TestCase

test "manifest" do
@load_path.manifest.tap do |manifest|
assert_equal "one-f2e1ec14d6856e1958083094170ca6119c529a73.txt", manifest["one.txt"]
assert_equal "nested/three-6c2b86a0206381310375abdd9980863c2ea7b2c3.txt", manifest["nested/three.txt"]
assert_equal "one-f2e1ec14.txt", manifest["one.txt"]
assert_equal "nested/three-6c2b86a0.txt", manifest["nested/three.txt"]
end
end

test "manifest with version" do
@load_path = Propshaft::LoadPath.new(@load_path.paths, version: "1")
@load_path.manifest.tap do |manifest|
assert_equal "one-c9373b685d5a63e4a1de7c6836a73239df552e2b.txt", manifest["one.txt"]
assert_equal "nested/three-a41a5d38da5afe428eca74b243f50405f28a6b54.txt", manifest["nested/three.txt"]
assert_equal "one-c9373b68.txt", manifest["one.txt"]
assert_equal "nested/three-a41a5d38.txt", manifest["nested/three.txt"]
end
end

Expand Down
6 changes: 3 additions & 3 deletions test/propshaft/output_path_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,17 @@ class Propshaft::OutputPathTest < ActiveSupport::TestCase
setup do
@manifest = {
".manifest.json": ".manifest.json",
"one.txt": "one-f2e1ec14d6856e1958083094170ca6119c529a73.txt"
"one.txt": "one-f2e1ec14.txt"
}.stringify_keys
@output_path = Propshaft::OutputPath.new(Pathname.new("#{__dir__}/../fixtures/output"), @manifest)
end

test "files" do
files = @output_path.files

file = files["one-f2e1ec14d6856e1958083094170ca6119c529a73.txt"]
file = files["one-f2e1ec14.txt"]
assert_equal "one.txt", file[:logical_path]
assert_equal "f2e1ec14d6856e1958083094170ca6119c529a73", file[:digest]
assert_equal "f2e1ec14", file[:digest]
assert file[:mtime].is_a?(Time)
end

Expand Down
6 changes: 3 additions & 3 deletions test/propshaft/processor_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,17 @@ class Propshaft::ProcessorTest < ActiveSupport::TestCase

test "manifest is written" do
processed do |processor|
assert_equal "one-f2e1ec14d6856e1958083094170ca6119c529a73.txt",
assert_equal "one-f2e1ec14.txt",
JSON.parse(processor.output_path.join(".manifest.json").read)["one.txt"]
end
end

test "assets are copied" do
processed do |processor|
digested_asset_name = "one-f2e1ec14d6856e1958083094170ca6119c529a73.txt"
digested_asset_name = "one-f2e1ec14.txt"
assert processor.output_path.join(digested_asset_name).exist?

nested_digested_asset_name = "nested/three-6c2b86a0206381310375abdd9980863c2ea7b2c3.txt"
nested_digested_asset_name = "nested/three-6c2b86a0.txt"
assert processor.output_path.join(nested_digested_asset_name).exist?
end
end
Expand Down
2 changes: 1 addition & 1 deletion test/propshaft/resolver/dynamic_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ class Propshaft::Resolver::DynamicTest < ActiveSupport::TestCase
end

test "resolving present asset returns uri path" do
assert_equal "/assets/one-f2e1ec14d6856e1958083094170ca6119c529a73.txt",
assert_equal "/assets/one-f2e1ec14.txt",
@resolver.resolve("one.txt")
end

Expand Down
2 changes: 1 addition & 1 deletion test/propshaft/resolver/static_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Propshaft::Resolver::StaticTest < ActiveSupport::TestCase

test "resolving present asset returns uri path" do
assert_equal \
"/assets/one-f2e1ec14d6856e1958083094170ca6119c529a73.txt",
"/assets/one-f2e1ec14.txt",
@resolver.resolve("one.txt")
end

Expand Down
4 changes: 2 additions & 2 deletions test/propshaft/server_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,12 @@ class Propshaft::ServerTest < ActiveSupport::TestCase
get "/#{asset.digested_path}"

assert_equal 200, last_response.status
assert_equal "94", last_response.headers['content-length']
assert_equal "62", last_response.headers['content-length']
assert_equal "text/css", last_response.headers['content-type']
assert_equal "Accept-Encoding", last_response.headers['vary']
assert_equal asset.digest, last_response.headers['etag']
assert_equal "public, max-age=31536000, immutable", last_response.headers['cache-control']
assert_equal ".hero { background: url(\"/foobar/source/file-3e6a129785ee3caf8eff23db339997e85334bfa9.jpg\") }\n",
assert_equal ".hero { background: url(\"/foobar/source/file-3e6a1297.jpg\") }\n",
last_response.body
end

Expand Down
6 changes: 3 additions & 3 deletions test/propshaft_integration_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ class PropshaftIntegrationTest < ActionDispatch::IntegrationTest

assert_response :success

assert_select 'link[href="/assets/hello_world-4137140a1298c3924d5f7135617c23e23fb167a8.css"]'
assert_select 'link[href="/assets/goodbye-b1dc9940e9800d8bc96f7434617c043e58277419.css"]'
assert_select 'link[href="/assets/hello_world-4137140a.css"]'
assert_select 'link[href="/assets/goodbye-b1dc9940.css"]'

assert_select 'script[src="/assets/hello_world-888761f849ba63a95a56f6ef898a9eb70ca4c46e.js"]'
assert_select 'script[src="/assets/hello_world-888761f8.js"]'
end

test "should raise an exception when resolving nonexistent assets" do
Expand Down