cache_crispies 1.2.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/cache_crispies/attribute.rb +5 -0
- data/lib/cache_crispies/base.rb +2 -0
- data/lib/cache_crispies/collection.rb +1 -1
- data/lib/cache_crispies/condition.rb +17 -12
- data/lib/cache_crispies/hash_builder.rb +1 -1
- data/lib/cache_crispies/optional.rb +36 -0
- data/lib/cache_crispies/version.rb +1 -1
- data/lib/cache_crispies.rb +1 -0
- data/spec/cache_crispies/base_spec.rb +5 -1
- data/spec/cache_crispies/collection_spec.rb +2 -2
- data/spec/cache_crispies/condition_spec.rb +24 -4
- data/spec/cache_crispies/hash_builder_spec.rb +68 -1
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1a93c5ab1a386306488b41307cb945164dcf1a0d0646cd5b02f828b87b2836d8
|
4
|
+
data.tar.gz: dadb16037bb994b1a17157cc7568afbd962d446a007838ba003a0fea29e7745f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '078816fce3ff0dc88fd45dd378dec482843229bdc28b83c188dd0ae04e984b18b14e81ab1d62f5930e26d3724133df3b6aac2033fbd647acad278409ce77c47b'
|
7
|
+
data.tar.gz: 26ec8aa1c7f4a55c1e58b76606ca0cafb1384ce2579b0131d3f9a2fa09391da8c0882524a379420c92c13eda3e0173b2c4fbad3356bdd529eb35c1beb1348e18
|
@@ -15,6 +15,8 @@ module CacheCrispies
|
|
15
15
|
# @param with [CacheCrispies::Base] a serializer to use to serialize the
|
16
16
|
# @param to [Class, Symbol] the data type to coerce the value into
|
17
17
|
# @param collection [Boolean] force rendering as single or collection
|
18
|
+
# @param optional [Boolean] render only if included in the option's
|
19
|
+
# `included` array
|
18
20
|
# @param nesting [Array<Symbol>] the JSON keys this attribute will be
|
19
21
|
# nested inside
|
20
22
|
# @param conditions [Array<CacheCrispies::Condition>] the show_if condition
|
@@ -24,6 +26,7 @@ module CacheCrispies
|
|
24
26
|
def initialize(
|
25
27
|
key,
|
26
28
|
from: nil, with: nil, through: nil, to: nil, collection: nil,
|
29
|
+
optional: nil,
|
27
30
|
nesting: [], conditions: [],
|
28
31
|
&block
|
29
32
|
)
|
@@ -36,6 +39,8 @@ module CacheCrispies
|
|
36
39
|
@nesting = Array(nesting)
|
37
40
|
@conditions = Array(conditions)
|
38
41
|
@block = block
|
42
|
+
|
43
|
+
@conditions << Optional.new(key) if optional
|
39
44
|
end
|
40
45
|
|
41
46
|
attr_reader(
|
data/lib/cache_crispies/base.rb
CHANGED
@@ -221,6 +221,7 @@ module CacheCrispies
|
|
221
221
|
def self.serialize(
|
222
222
|
*attribute_names,
|
223
223
|
from: nil, with: nil, through: nil, to: nil, collection: nil,
|
224
|
+
optional: nil,
|
224
225
|
&block
|
225
226
|
)
|
226
227
|
attribute_names.flat_map do |attrib|
|
@@ -236,6 +237,7 @@ module CacheCrispies
|
|
236
237
|
through: through,
|
237
238
|
to: to,
|
238
239
|
collection: collection,
|
240
|
+
optional: optional,
|
239
241
|
nesting: current_nesting,
|
240
242
|
conditions: current_conditions,
|
241
243
|
&block
|
@@ -19,24 +19,29 @@ module CacheCrispies
|
|
19
19
|
block.object_id
|
20
20
|
end
|
21
21
|
|
22
|
-
# Test the truthiness of the condition against
|
22
|
+
# Test the truthiness of the condition against the serializer instance
|
23
23
|
#
|
24
|
-
# @param
|
25
|
-
# @param options [Hash] any optional values from the serializer instance
|
24
|
+
# @param serializer [Object] CacheCrispies::Base serializer instance
|
26
25
|
# @return [Boolean] the condition's truthiness
|
27
|
-
def true_for?(
|
28
|
-
!!
|
29
|
-
|
30
|
-
|
31
|
-
when 1
|
32
|
-
block.call(model)
|
33
|
-
else
|
34
|
-
block.call(model, options)
|
35
|
-
end
|
26
|
+
def true_for?(serializer)
|
27
|
+
return !!serializer.public_send(block) if block.is_a?(Symbol)
|
28
|
+
|
29
|
+
!!execute_block(serializer.model, serializer.options)
|
36
30
|
end
|
37
31
|
|
38
32
|
private
|
39
33
|
|
40
34
|
attr_reader :block
|
35
|
+
|
36
|
+
def execute_block(model, options)
|
37
|
+
case block.arity
|
38
|
+
when 0
|
39
|
+
block.call
|
40
|
+
when 1
|
41
|
+
block.call(model)
|
42
|
+
else
|
43
|
+
block.call(model, options)
|
44
|
+
end
|
45
|
+
end
|
41
46
|
end
|
42
47
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module CacheCrispies
|
4
|
+
# Represents an optional condition
|
5
|
+
class Optional
|
6
|
+
# Returns a new instance of Optional
|
7
|
+
#
|
8
|
+
# @param block [Proc] the key of the attribute to include
|
9
|
+
def initialize(key)
|
10
|
+
@key = key
|
11
|
+
end
|
12
|
+
|
13
|
+
# A system-wide unique ID used for memoizaiton
|
14
|
+
#
|
15
|
+
# @eturn [Integer] the unique ID for this condition
|
16
|
+
def uid
|
17
|
+
# Just reusing the key seems to make sense
|
18
|
+
key
|
19
|
+
end
|
20
|
+
|
21
|
+
# Test the truthiness of the optional condition against a model and options
|
22
|
+
#
|
23
|
+
# @param model [Object] typically ActiveRecord::Base, but could be anything
|
24
|
+
# @param options [Hash] any optional values from the serializer instance
|
25
|
+
# @return [Boolean] the condition's truthiness
|
26
|
+
def true_for?(serializer)
|
27
|
+
included = Array(serializer.options.fetch(:include, [])).map(&:to_sym)
|
28
|
+
|
29
|
+
included.include?(key) || included.include?(:*)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :key
|
35
|
+
end
|
36
|
+
end
|
data/lib/cache_crispies.rb
CHANGED
@@ -19,6 +19,7 @@ module CacheCrispies
|
|
19
19
|
autoload :Base, 'cache_crispies/base'
|
20
20
|
autoload :Collection, 'cache_crispies/collection'
|
21
21
|
autoload :Condition, 'cache_crispies/condition'
|
22
|
+
autoload :Optional, 'cache_crispies/optional'
|
22
23
|
autoload :Configuration, 'cache_crispies/configuration'
|
23
24
|
autoload :HashBuilder, 'cache_crispies/hash_builder'
|
24
25
|
autoload :Memoizer, 'cache_crispies/memoizer'
|
@@ -11,7 +11,7 @@ describe CacheCrispies::Base do
|
|
11
11
|
|
12
12
|
show_if -> { true } do
|
13
13
|
show_if -> { true } do
|
14
|
-
show_if
|
14
|
+
show_if :visible? do
|
15
15
|
serialize :name, from: :brand
|
16
16
|
end
|
17
17
|
end
|
@@ -33,6 +33,10 @@ describe CacheCrispies::Base do
|
|
33
33
|
def id
|
34
34
|
model.id.to_s
|
35
35
|
end
|
36
|
+
|
37
|
+
def visible?
|
38
|
+
true
|
39
|
+
end
|
36
40
|
end
|
37
41
|
|
38
42
|
let(:model) do
|
@@ -58,11 +58,11 @@ describe CacheCrispies::Collection do
|
|
58
58
|
|
59
59
|
it 'fetches the cache for each object in the collection' do
|
60
60
|
expect(CacheCrispies::Plan).to receive(:new).with(
|
61
|
-
serializer, model1
|
61
|
+
serializer, model1
|
62
62
|
).and_return double('plan-dbl-1', cache_key: 'cereal-key-1')
|
63
63
|
|
64
64
|
expect(CacheCrispies::Plan).to receive(:new).with(
|
65
|
-
serializer, model2
|
65
|
+
serializer, model2
|
66
66
|
).and_return double('plan-dbl-2', cache_key: 'cereal-key-2')
|
67
67
|
|
68
68
|
expect(CacheCrispies).to receive_message_chain(
|
@@ -1,7 +1,18 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe CacheCrispies::Condition do
|
4
|
+
class TestSerializer < CacheCrispies::Base
|
5
|
+
show_if :boolean_method? do
|
6
|
+
serialize :name
|
7
|
+
end
|
8
|
+
|
9
|
+
def boolean_method?
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
4
13
|
let(:block) { -> {} }
|
14
|
+
let(:model) { OpenStruct.new(name: 'Name') }
|
15
|
+
let(:serializer) { TestSerializer.new(model) }
|
5
16
|
subject { described_class.new(block) }
|
6
17
|
|
7
18
|
describe '#uid' do
|
@@ -17,7 +28,7 @@ describe CacheCrispies::Condition do
|
|
17
28
|
|
18
29
|
it 'calls the block with model and options arguments' do
|
19
30
|
expect(block).to receive(:call).with(model, options)
|
20
|
-
subject.true_for?
|
31
|
+
subject.true_for? serializer
|
21
32
|
end
|
22
33
|
|
23
34
|
context 'when the block has one argument' do
|
@@ -25,7 +36,7 @@ describe CacheCrispies::Condition do
|
|
25
36
|
|
26
37
|
it 'calls the block with the model only' do
|
27
38
|
expect(block).to receive(:call).with(model)
|
28
|
-
subject.true_for?
|
39
|
+
subject.true_for? serializer
|
29
40
|
end
|
30
41
|
end
|
31
42
|
|
@@ -34,12 +45,21 @@ describe CacheCrispies::Condition do
|
|
34
45
|
|
35
46
|
it 'calls the block with no arguments' do
|
36
47
|
expect(block).to receive(:call).with(no_args)
|
37
|
-
subject.true_for?
|
48
|
+
subject.true_for? serializer
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'when the block is a symbol' do
|
53
|
+
let(:block) { :boolean_method? }
|
54
|
+
|
55
|
+
it 'calls the method on serializer instance' do
|
56
|
+
expect(serializer).to receive(block).with(no_args)
|
57
|
+
subject.true_for? serializer
|
38
58
|
end
|
39
59
|
end
|
40
60
|
|
41
61
|
it 'returns a boolean' do
|
42
|
-
expect(subject.true_for?(
|
62
|
+
expect(subject.true_for?(serializer)).to be true
|
43
63
|
end
|
44
64
|
end
|
45
65
|
end
|
@@ -8,6 +8,10 @@ describe CacheCrispies::HashBuilder do
|
|
8
8
|
serialize :name
|
9
9
|
end
|
10
10
|
|
11
|
+
class AllergySerializer < CacheCrispies::Base
|
12
|
+
serialize :name
|
13
|
+
end
|
14
|
+
|
11
15
|
class MarketingBsSerializer < CacheCrispies::Base
|
12
16
|
serialize :tagline, :small_print
|
13
17
|
|
@@ -29,6 +33,8 @@ describe CacheCrispies::HashBuilder do
|
|
29
33
|
nest_in :nutritional_information do
|
30
34
|
serialize :calories
|
31
35
|
serialize :ingredients, with: IngredientSerializer
|
36
|
+
|
37
|
+
serialize :allergies, with: AllergySerializer, optional: true
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
@@ -54,6 +60,12 @@ describe CacheCrispies::HashBuilder do
|
|
54
60
|
OpenStruct.new(name: 'Other Kind of Sugar')
|
55
61
|
]
|
56
62
|
}
|
63
|
+
let(:allergies) {
|
64
|
+
[
|
65
|
+
OpenStruct.new(name: 'Peanuts'),
|
66
|
+
OpenStruct.new(name: 'Lactose')
|
67
|
+
]
|
68
|
+
}
|
57
69
|
let(:model) {
|
58
70
|
OpenStruct.new(
|
59
71
|
id: 42,
|
@@ -62,7 +74,8 @@ describe CacheCrispies::HashBuilder do
|
|
62
74
|
calories: 1_000,
|
63
75
|
organic: organic,
|
64
76
|
tagline: "Part of a balanced breakfast",
|
65
|
-
ingredients: ingredients
|
77
|
+
ingredients: ingredients,
|
78
|
+
allergies: allergies
|
66
79
|
)
|
67
80
|
}
|
68
81
|
let(:options) { { footnote_marker: '*' } }
|
@@ -141,5 +154,59 @@ describe CacheCrispies::HashBuilder do
|
|
141
154
|
end
|
142
155
|
end
|
143
156
|
end
|
157
|
+
|
158
|
+
context 'when allergies are included' do
|
159
|
+
let(:options) { { footnote_marker: '*', include: :allergies } }
|
160
|
+
|
161
|
+
it 'includes the allergies' do
|
162
|
+
expect(subject.call).to eq ({
|
163
|
+
uid: '42',
|
164
|
+
name: 'Lucky Charms',
|
165
|
+
company: 'General Mills',
|
166
|
+
tagline: 'Part of a balanced breakfast*',
|
167
|
+
small_print: "*this doesn't mean jack-squat",
|
168
|
+
about: {
|
169
|
+
nutritional_information: {
|
170
|
+
calories: 1000,
|
171
|
+
ingredients: [
|
172
|
+
{ name: 'Sugar' },
|
173
|
+
{ name: 'Other Kind of Sugar' },
|
174
|
+
],
|
175
|
+
allergies: [
|
176
|
+
{ name: 'Peanuts' },
|
177
|
+
{ name: 'Lactose' },
|
178
|
+
]
|
179
|
+
}
|
180
|
+
}
|
181
|
+
})
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'when everything is included' do
|
186
|
+
let(:options) { { footnote_marker: '*', include: '*' } }
|
187
|
+
|
188
|
+
it 'includes the allergies' do
|
189
|
+
expect(subject.call).to eq ({
|
190
|
+
uid: '42',
|
191
|
+
name: 'Lucky Charms',
|
192
|
+
company: 'General Mills',
|
193
|
+
tagline: 'Part of a balanced breakfast*',
|
194
|
+
small_print: "*this doesn't mean jack-squat",
|
195
|
+
about: {
|
196
|
+
nutritional_information: {
|
197
|
+
calories: 1000,
|
198
|
+
ingredients: [
|
199
|
+
{ name: 'Sugar' },
|
200
|
+
{ name: 'Other Kind of Sugar' },
|
201
|
+
],
|
202
|
+
allergies: [
|
203
|
+
{ name: 'Peanuts' },
|
204
|
+
{ name: 'Lactose' },
|
205
|
+
]
|
206
|
+
}
|
207
|
+
}
|
208
|
+
})
|
209
|
+
end
|
210
|
+
end
|
144
211
|
end
|
145
212
|
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: 1.2
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Crownoble
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: 5.0.0
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '8.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: 5.0.0
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '8.0'
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: oj
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,7 +53,7 @@ dependencies:
|
|
53
53
|
version: 5.0.0
|
54
54
|
- - "<"
|
55
55
|
- !ruby/object:Gem::Version
|
56
|
-
version: '
|
56
|
+
version: '8.0'
|
57
57
|
type: :development
|
58
58
|
prerelease: false
|
59
59
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -63,7 +63,7 @@ dependencies:
|
|
63
63
|
version: 5.0.0
|
64
64
|
- - "<"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version: '
|
66
|
+
version: '8.0'
|
67
67
|
- !ruby/object:Gem::Dependency
|
68
68
|
name: appraisal
|
69
69
|
requirement: !ruby/object:Gem::Requirement
|
@@ -164,6 +164,7 @@ files:
|
|
164
164
|
- lib/cache_crispies/controller.rb
|
165
165
|
- lib/cache_crispies/hash_builder.rb
|
166
166
|
- lib/cache_crispies/memoizer.rb
|
167
|
+
- lib/cache_crispies/optional.rb
|
167
168
|
- lib/cache_crispies/plan.rb
|
168
169
|
- lib/cache_crispies/version.rb
|
169
170
|
- spec/cache_crispies/attribute_spec.rb
|
@@ -197,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
198
|
- !ruby/object:Gem::Version
|
198
199
|
version: '0'
|
199
200
|
requirements: []
|
200
|
-
rubygems_version: 3.
|
201
|
+
rubygems_version: 3.3.7
|
201
202
|
signing_key:
|
202
203
|
specification_version: 4
|
203
204
|
summary: Fast Rails serializer with built-in caching
|