Skip to content

Commit 6b093c9

Browse files
authored
Merge pull request #2361 from alexzherdev/2358-sha1
Add config to use SHA1 instead of MD5 for caching
2 parents 5ce94fd + 628eff2 commit 6b093c9

File tree

4 files changed

+45
-1
lines changed

4 files changed

+45
-1
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ Breaking changes:
66

77
Features:
88

9+
- [#2361](https://github.com/rails-api/active_model_serializers/pull/2361) Add `ActiveModelSerializers.config.use_sha1_digests` to allow customization of the hashing algorithm used for serializer caching (@alexzherdev)
10+
911
Fixes:
1012

1113
- [#2344](https://github.com/rails-api/active_model_serializers/pull/2344) Fixes #2341 introduced since #2223 (@wasifhossain)

docs/general/configuration_options.md

+12
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,18 @@ ActiveModelSerializers.config.serializer_lookup_chain.unshift(
111111

112112
See [lookup_chain.rb](https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model_serializers/lookup_chain.rb) for further explanations and examples.
113113

114+
#### use_sha1_digests
115+
116+
Determines which hashing algorithm to use internally when caching serializers.
117+
118+
Possible values:
119+
120+
- `true`
121+
- `false` (default)
122+
123+
When `true`, ActiveModelSerializers will use SHA1. Otherwise, it will default to using MD5.
124+
Be warned that changing this value may result in serializer caches being invalidated.
125+
114126
## JSON API
115127

116128
##### jsonapi_resource_type

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::MD5.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

+29
Original file line numberDiff line numberDiff line change
@@ -446,17 +446,41 @@ 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)
449450
render_object_with_cache(@blog)
450451
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
451452
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{file_digest}"
452453
assert_equal(@blog_serializer.attributes, cache_store.fetch(key))
453454
end
454455

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
460+
render_object_with_cache(@blog)
461+
file_digest = Digest::SHA1.hexdigest(File.open(__FILE__).read)
462+
key = "#{@blog.cache_key}/#{adapter.cache_key}/#{file_digest}"
463+
assert_equal(@blog_serializer.attributes, cache_store.fetch(key))
464+
ensure
465+
ActiveModelSerializers.config.use_sha1_digests = previous_use_sha1_digests
466+
end
467+
455468
def test_cache_digest_definition
469+
reset_cache_digest(@post_serializer)
456470
file_digest = Digest::MD5.hexdigest(File.open(__FILE__).read)
457471
assert_equal(file_digest, @post_serializer.class._cache_digest)
458472
end
459473

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
478+
file_digest = Digest::SHA1.hexdigest(File.open(__FILE__).read)
479+
assert_equal(file_digest, @post_serializer.class._cache_digest)
480+
ensure
481+
ActiveModelSerializers.config.use_sha1_digests = previous_use_sha1_digests
482+
end
483+
460484
def test_object_cache_keys
461485
serializable = ActiveModelSerializers::SerializableResource.new([@comment, @comment])
462486
include_directive = JSONAPI::IncludeDirective.new('*', allow_wildcard: true)
@@ -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)