Skip to content

Commit 1c02878

Browse files
author
Alex Zherdev
committed
Introduce use_sha1_digests config option
1 parent 5d3f56f commit 1c02878

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

lib/active_model/serializer/concerns/caching.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ def _cache_digest
5656
def digest_caller_file(caller_line)
5757
serializer_file_path = caller_line[CALLER_FILE]
5858
serializer_file_contents = IO.read(serializer_file_path)
59-
Digest::SHA1.hexdigest(serializer_file_contents)
59+
algorithm = ActiveModelSerializers.config.use_sha1_digests ? Digest::SHA1 : Digest::MD5
60+
algorithm.hexdigest(serializer_file_contents)
6061
rescue TypeError, Errno::ENOENT
6162
warn <<-EOF.strip_heredoc
6263
Cannot digest non-existent file: '#{caller_line}'.

test/cache_test.rb

+30-1
Original file line numberDiff line numberDiff line change
@@ -446,15 +446,39 @@ def test_a_serializer_rendered_by_two_adapter_returns_differently_fetch_attribut
446446
# rubocop:enable Metrics/AbcSize
447447

448448
def test_uses_file_digest_in_cache_key
449+
reset_cache_digest(@blog_serializer)
450+
render_object_with_cache(@blog)
451+
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
452+
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{file_digest}"
453+
assert_equal(@blog_serializer.attributes, cache_store.fetch(key))
454+
end
455+
456+
def test_uses_sha1_digest_in_cache_key_when_configured
457+
reset_cache_digest(@blog_serializer)
458+
previous_use_sha1_digests = ActiveModelSerializers.config.use_sha1_digests
459+
ActiveModelSerializers.config.use_sha1_digests = true
449460
render_object_with_cache(@blog)
450461
file_digest = Digest::SHA1.hexdigest(File.open(__FILE__).read)
451462
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{file_digest}"
452463
assert_equal(@blog_serializer.attributes, cache_store.fetch(key))
464+
ensure
465+
ActiveModelSerializers.config.use_sha1_digests = previous_use_sha1_digests
453466
end
454467

455468
def test_cache_digest_definition
469+
reset_cache_digest(@post_serializer)
470+
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
471+
assert_equal(file_digest, @post_serializer.class._cache_digest)
472+
end
473+
474+
def test_cache_sha1_digest_definition
475+
reset_cache_digest(@post_serializer)
476+
previous_use_sha1_digests = ActiveModelSerializers.config.use_sha1_digests
477+
ActiveModelSerializers.config.use_sha1_digests = true
456478
file_digest = Digest::SHA1.hexdigest(File.open(__FILE__).read)
457479
assert_equal(file_digest, @post_serializer.class._cache_digest)
480+
ensure
481+
ActiveModelSerializers.config.use_sha1_digests = previous_use_sha1_digests
458482
end
459483

460484
def test_object_cache_keys
@@ -560,7 +584,7 @@ def test_digest_caller_file
560584
path = file.path
561585
caller_line = "#{path}:1:in `<top (required)>'"
562586
file.close
563-
assert_equal ActiveModel::Serializer.digest_caller_file(caller_line), Digest::SHA1.hexdigest(contents)
587+
assert_equal ActiveModel::Serializer.digest_caller_file(caller_line), Digest::MD5.hexdigest(contents)
564588
ensure
565589
file.unlink
566590
FileUtils.remove_entry dir
@@ -715,5 +739,10 @@ def render_object_with_cache(obj, options = {})
715739
def adapter
716740
@serializable_resource.adapter
717741
end
742+
743+
def reset_cache_digest(serializer)
744+
return unless serializer.class.instance_variable_defined?(:@_cache_digest)
745+
serializer.class.remove_instance_variable(:@_cache_digest)
746+
end
718747
end
719748
end

0 commit comments

Comments
 (0)