From 1c028785ebeeb130e2d42a3ade5fc86bf9ab495d Mon Sep 17 00:00:00 2001 From: Alex Zherdev Date: Wed, 16 Oct 2019 12:39:02 -0700 Subject: [PATCH] Introduce use_sha1_digests config option --- .../serializer/concerns/caching.rb | 3 +- test/cache_test.rb | 33 +++++++++++++++++-- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/active_model/serializer/concerns/caching.rb b/lib/active_model/serializer/concerns/caching.rb index 7b3ff37e..cdcd5685 100644 --- a/lib/active_model/serializer/concerns/caching.rb +++ b/lib/active_model/serializer/concerns/caching.rb @@ -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}'. diff --git a/test/cache_test.rb b/test/cache_test.rb index f67f98a6..112e366c 100644 --- a/test/cache_test.rb +++ b/test/cache_test.rb @@ -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 `'" 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