cache_crispies 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cache_crispies/base.rb +18 -2
- data/lib/cache_crispies/controller.rb +5 -2
- data/lib/cache_crispies/plan.rb +13 -4
- data/lib/cache_crispies/version.rb +1 -1
- data/spec/base_spec.rb +35 -2
- data/spec/hash_builder_spec.rb +2 -2
- data/spec/plan_spec.rb +17 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76074205a976b800720f4573f27c03e60e0d9aaa6467c20b2e2ad70fe8b2df61
|
4
|
+
data.tar.gz: 8c26453bad074e191ce415009917ffb8b99a4d7b1273f15b9be774d8bc42c686
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 361709a032d7b2e8c1d4600945fc2897021c8665f6b51b5e82a5d1edff3003afc547d7905b2679569f945f3a98066b256defea701835bf9317990e896ada65c0
|
7
|
+
data.tar.gz: 5562570b2b96d1c18b336c28229749a9d98a9ecddf27772f586c7ea95b21134c5862574a37577499f80c901ec21cd298b2b8698d2b4d7a4747cdf59f4e2c18a1
|
data/lib/cache_crispies/base.rb
CHANGED
@@ -100,8 +100,19 @@ module CacheCrispies
|
|
100
100
|
#
|
101
101
|
# @return [String] a cache key for the class
|
102
102
|
def self.cache_key_base
|
103
|
-
|
104
|
-
|
103
|
+
@cache_key_base ||= "#{self}-#{file_hashes.join(CACHE_KEY_SEPARATOR)}"
|
104
|
+
end
|
105
|
+
|
106
|
+
# Return an array of cache key string for this serializer and all nested
|
107
|
+
# and deeply nested serializers. The purpose of grabbing all this data is
|
108
|
+
# to be able to construct a cache key that will be busted if any of the
|
109
|
+
# nested serializers, no matter how deep, change at all.
|
110
|
+
#
|
111
|
+
# @return [Array<String>] an array of uniq, sorted serializer file hashes
|
112
|
+
def self.file_hashes
|
113
|
+
@file_hashes ||= (
|
114
|
+
[file_hash] + nested_serializers.flat_map(&:file_hashes)
|
115
|
+
).uniq.sort
|
105
116
|
end
|
106
117
|
|
107
118
|
private
|
@@ -139,6 +150,11 @@ module CacheCrispies
|
|
139
150
|
end
|
140
151
|
private_class_method :show_if
|
141
152
|
|
153
|
+
def self.nested_serializers
|
154
|
+
attributes.map(&:serializer).compact
|
155
|
+
end
|
156
|
+
private_class_method :nested_serializers
|
157
|
+
|
142
158
|
def self.serialize(*attribute_names, from: nil, with: nil, to: nil)
|
143
159
|
attribute_names.flatten.map { |att| att&.to_sym }.map do |attrib|
|
144
160
|
current_nesting = Array(@nesting).dup
|
@@ -16,8 +16,11 @@ module CacheCrispies
|
|
16
16
|
# CacheCrispies::Base
|
17
17
|
# @param cacheable [Object] can be any object. But is typically a Rails
|
18
18
|
# model inheriting from ActiveRecord::Base
|
19
|
-
# @param
|
20
|
-
#
|
19
|
+
# @param [Hash] options any optional values from the serializer instance
|
20
|
+
# @option options [Symbol] :key the name of the root key to nest the JSON
|
21
|
+
# data under
|
22
|
+
# @option options [Boolean] :collection whether to render the data as a
|
23
|
+
# collection/array or a single object
|
21
24
|
# @return [void]
|
22
25
|
def cache_render(serializer, cacheable, options = {})
|
23
26
|
plan = CacheCrispies::Plan.new(serializer, cacheable, options)
|
data/lib/cache_crispies/plan.rb
CHANGED
@@ -11,19 +11,28 @@ module CacheCrispies
|
|
11
11
|
# CacheCrispies::Base
|
12
12
|
# @param cacheable [Object] typically ActiveRecord::Base or an enumerable
|
13
13
|
# containing instances of ActiveRecord::Base, but could be anything
|
14
|
-
# @param
|
14
|
+
# @param [Hash] options any optional values from the serializer instance
|
15
|
+
# @option options [Symbol] :key the name of the root key to nest the JSON
|
16
|
+
# data under
|
17
|
+
# @option options [Boolean] :collection whether to render the data as a
|
18
|
+
# collection/array or a single object
|
15
19
|
def initialize(serializer, cacheable, options = {})
|
16
20
|
@serializer = serializer
|
17
21
|
@cacheable = cacheable
|
18
|
-
|
19
|
-
|
22
|
+
|
23
|
+
opts = options.dup
|
24
|
+
@key = opts.delete(:key)
|
25
|
+
@collection = opts.delete(:collection)
|
26
|
+
@options = opts
|
20
27
|
end
|
21
28
|
|
22
29
|
# Whether or not the cacheable should be treated like a collection
|
23
30
|
#
|
24
31
|
# @return [Boolean] true if cacheable is a collection
|
25
32
|
def collection?
|
26
|
-
|
33
|
+
return @collection unless @collection.nil?
|
34
|
+
|
35
|
+
@collection = cacheable.respond_to?(:each)
|
27
36
|
end
|
28
37
|
|
29
38
|
# Returns the cache_key in a format suitable for an ETag header
|
data/spec/base_spec.rb
CHANGED
@@ -90,7 +90,40 @@ describe CacheCrispies::Base do
|
|
90
90
|
end
|
91
91
|
|
92
92
|
describe '.cache_key_base' do
|
93
|
-
|
93
|
+
let(:nested_serializer_digest) { 'nutrition-serializer-digest' }
|
94
|
+
let(:serializer_file_path) {
|
95
|
+
File.expand_path('fixtures/test_serializer.rb', __dir__)
|
96
|
+
}
|
97
|
+
let(:serializer_file_digest) {
|
98
|
+
Digest::MD5.file(serializer_file_path).to_s
|
99
|
+
}
|
100
|
+
|
101
|
+
before do
|
102
|
+
allow(NutritionSerializer).to receive(:file_hash).and_return(
|
103
|
+
nested_serializer_digest
|
104
|
+
)
|
105
|
+
allow(Rails).to receive_message_chain(:root, :join).and_return(
|
106
|
+
serializer_file_path
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'includes the file name' do
|
111
|
+
expect(subject.class.cache_key_base).to include subject.class.to_s
|
112
|
+
end
|
113
|
+
|
114
|
+
it "includes a digest of the serializer class file's contents" do
|
115
|
+
expect(subject.class.cache_key_base).to include serializer_file_digest
|
116
|
+
end
|
117
|
+
|
118
|
+
it "includes a digest of the nested serializer class file's contents" do
|
119
|
+
expect(subject.class.cache_key_base).to include nested_serializer_digest
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'correctly formats the key' do
|
123
|
+
expect(subject.class.cache_key_base).to eq(
|
124
|
+
"#{subject.class}-#{serializer_file_digest}+#{nested_serializer_digest}"
|
125
|
+
)
|
126
|
+
end
|
94
127
|
end
|
95
128
|
|
96
129
|
describe '.attributes' do
|
@@ -150,4 +183,4 @@ describe CacheCrispies::Base do
|
|
150
183
|
expect(subject[5].conditions).to eq []
|
151
184
|
end
|
152
185
|
end
|
153
|
-
end
|
186
|
+
end
|
data/spec/hash_builder_spec.rb
CHANGED
@@ -32,7 +32,7 @@ describe CacheCrispies::HashBuilder do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
show_if ->(
|
35
|
+
show_if ->(_model, options) { options[:be_trendy] } do
|
36
36
|
nest_in :health do
|
37
37
|
serialize :organic
|
38
38
|
|
@@ -142,4 +142,4 @@ describe CacheCrispies::HashBuilder do
|
|
142
142
|
end
|
143
143
|
end
|
144
144
|
end
|
145
|
-
end
|
145
|
+
end
|
data/spec/plan_spec.rb
CHANGED
@@ -37,6 +37,14 @@ describe CacheCrispies::Plan do
|
|
37
37
|
it 'returns false' do
|
38
38
|
expect(subject.collection?).to be false
|
39
39
|
end
|
40
|
+
|
41
|
+
context 'when the :collection option is true' do
|
42
|
+
let(:options) { { collection: true } }
|
43
|
+
|
44
|
+
it 'returns true' do
|
45
|
+
expect(subject.collection?).to be true
|
46
|
+
end
|
47
|
+
end
|
40
48
|
end
|
41
49
|
|
42
50
|
context 'when a collection' do
|
@@ -45,6 +53,14 @@ describe CacheCrispies::Plan do
|
|
45
53
|
it 'returns false' do
|
46
54
|
expect(subject.collection?).to be true
|
47
55
|
end
|
56
|
+
|
57
|
+
context 'when the :collection option is false' do
|
58
|
+
let(:options) { { collection: false } }
|
59
|
+
|
60
|
+
it 'returns false' do
|
61
|
+
expect(subject.collection?).to be false
|
62
|
+
end
|
63
|
+
end
|
48
64
|
end
|
49
65
|
end
|
50
66
|
|
@@ -166,4 +182,4 @@ describe CacheCrispies::Plan do
|
|
166
182
|
end
|
167
183
|
end
|
168
184
|
end
|
169
|
-
end
|
185
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cache_crispies
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Crownoble
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-07-
|
11
|
+
date: 2019-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|