Introduce use_sha1_digests config option

This commit is contained in:
Alex Zherdev 2019-10-16 12:39:02 -07:00
parent 5d3f56f0a4
commit 1c028785eb
2 changed files with 33 additions and 3 deletions

View File

@ -56,7 +56,8 @@ module ActiveModel
def digest_caller_file(caller_line)
serializer_file_path = caller_line[CALLER_FILE]
serializer_file_contents = IO.read(serializer_file_path)
Digest::SHA1.hexdigest(serializer_file_contents)
algorithm = ActiveModelSerializers.config.use_sha1_digests ? Digest::SHA1 : Digest::MD5
algorithm.hexdigest(serializer_file_contents)
rescue TypeError, Errno::ENOENT
warn <<-EOF.strip_heredoc
Cannot digest non-existent file: '#{caller_line}'.

View File

@ -446,15 +446,39 @@ module ActiveModelSerializers
# rubocop:enable Metrics/AbcSize
def test_uses_file_digest_in_cache_key
reset_cache_digest(@blog_serializer)
render_object_with_cache(@blog)
file_digest = Digest::SHA1.hexdigest(File.open(__FILE__).read)
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{file_digest}"
assert_equal(@blog_serializer.attributes, cache_store.fetch(key))
end
def test_uses_sha1_digest_in_cache_key_when_configured
reset_cache_digest(@blog_serializer)
previous_use_sha1_digests = ActiveModelSerializers.config.use_sha1_digests
ActiveModelSerializers.config.use_sha1_digests = true
render_object_with_cache(@blog)
file_digest = Digest::SHA1.hexdigest(File.open(__FILE__).read)
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{file_digest}"
assert_equal(@blog_serializer.attributes, cache_store.fetch(key))
ensure
ActiveModelSerializers.config.use_sha1_digests = previous_use_sha1_digests
end
def test_cache_digest_definition
reset_cache_digest(@post_serializer)
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
assert_equal(file_digest, @post_serializer.class._cache_digest)
end
def test_cache_sha1_digest_definition
reset_cache_digest(@post_serializer)
previous_use_sha1_digests = ActiveModelSerializers.config.use_sha1_digests
ActiveModelSerializers.config.use_sha1_digests = true
file_digest = Digest::SHA1.hexdigest(File.open(__FILE__).read)
assert_equal(file_digest, @post_serializer.class._cache_digest)
ensure
ActiveModelSerializers.config.use_sha1_digests = previous_use_sha1_digests
end
def test_object_cache_keys
@ -560,7 +584,7 @@ module ActiveModelSerializers
path = file.path
caller_line = "#{path}:1:in `<top (required)>'"
file.close
assert_equal ActiveModel::Serializer.digest_caller_file(caller_line), Digest::SHA1.hexdigest(contents)
assert_equal ActiveModel::Serializer.digest_caller_file(caller_line), Digest::MD5.hexdigest(contents)
ensure
file.unlink
FileUtils.remove_entry dir
@ -715,5 +739,10 @@ module ActiveModelSerializers
def adapter
@serializable_resource.adapter
end
def reset_cache_digest(serializer)
return unless serializer.class.instance_variable_defined?(:@_cache_digest)
serializer.class.remove_instance_variable(:@_cache_digest)
end
end
end