cache_crispies 1.0.1 → 1.1.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7be596f4546279c27b355a83a6c87b5d986cbcc65779def4310df106c3017557
4
- data.tar.gz: e7b5ceb4ac6c68d7149bb45246bdba99864c5fbd289277d054b22c5c622f748d
3
+ metadata.gz: 35d549e631ed6401a8d401b28e77f192ffc0661ed7ad4afd5f6e70b7e85770a0
4
+ data.tar.gz: 2b118175b85d5d5be47c43c8c9359be7dd496502c056ec5694fb2cbad7778d04
5
5
  SHA512:
6
- metadata.gz: ac4fe247753da8c9afa3e2d5a27d8f673c780b6bbb0d71a8777e736e9b9761be4791c33e5370a3f6a1ade8df2ff65befd648c9004908f1d4ebaafb3ce3678aa1
7
- data.tar.gz: 823e1a06a9a007e74cb148751f765cf506e96849b5947e5132b2fffadfbaaa447a3c379cbd805d72fb03ceffd2bb8daf12a8649e282020d1d91b98656af97e82
6
+ metadata.gz: a3279adc9b9e20800159b2cdcf0aaa173d58d030d22027dcb62818b3fafa12aa2ed5776f824261daf184d8a83cb011e74f617d71bd2d36d5e16aa46ce7446ed0
7
+ data.tar.gz: '0030582a6e0bc880adff6e350a0f38412dc04f40e04a902ef0aeb5b93d2f6eb5206e6d0960ed414e978d3c3604a789c0d199a93d95cf3da85f4fcc463ba70029'
@@ -14,6 +14,7 @@ module CacheCrispies
14
14
  # @param from [Symbol] the method on the model to call to get the value
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
+ # @param collection [Boolean] force rendering as single or collection
17
18
  # @param nesting [Array<Symbol>] the JSON keys this attribute will be
18
19
  # nested inside
19
20
  # @param conditions [Array<CacheCrispies::Condition>] the show_if condition
@@ -22,7 +23,8 @@ module CacheCrispies
22
23
  # argument's value
23
24
  def initialize(
24
25
  key,
25
- from: nil, with: nil, through: nil, to: nil, nesting: [], conditions: [],
26
+ from: nil, with: nil, through: nil, to: nil, collection: nil,
27
+ nesting: [], conditions: [],
26
28
  &block
27
29
  )
28
30
  @key = key
@@ -30,6 +32,7 @@ module CacheCrispies
30
32
  @serializer = with
31
33
  @through = through
32
34
  @coerce_to = to
35
+ @collection = collection
33
36
  @nesting = Array(nesting)
34
37
  @conditions = Array(conditions)
35
38
  @block = block
@@ -41,6 +44,7 @@ module CacheCrispies
41
44
  :serializer,
42
45
  :through,
43
46
  :coerce_to,
47
+ :collection,
44
48
  :nesting,
45
49
  :conditions,
46
50
  :block
@@ -66,8 +70,6 @@ module CacheCrispies
66
70
  serializer ? serialize(value, options) : coerce(value)
67
71
  end
68
72
 
69
-
70
-
71
73
  private
72
74
 
73
75
  def through?
@@ -81,7 +83,9 @@ module CacheCrispies
81
83
  # Here we'll render the attribute with a given serializer and attempt to
82
84
  # cache the results for better cache reusability
83
85
  def serialize(value, options)
84
- plan = CacheCrispies::Plan.new(serializer, value, options)
86
+ plan = CacheCrispies::Plan.new(
87
+ serializer, value, collection: collection, **options
88
+ )
85
89
 
86
90
  if plan.collection?
87
91
  plan.cache { Collection.new(value, serializer, options).as_json }
@@ -220,10 +220,11 @@ module CacheCrispies
220
220
 
221
221
  def self.serialize(
222
222
  *attribute_names,
223
- from: nil, with: nil, through: nil, to: nil,
223
+ from: nil, with: nil, through: nil, to: nil, collection: nil,
224
224
  &block
225
225
  )
226
- attribute_names.flatten.map { |att| att&.to_sym }.map do |attrib|
226
+ attribute_names.flat_map do |attrib|
227
+ attrib = attrib&.to_sym
227
228
  current_nesting = Array(@nesting).dup
228
229
  current_conditions = Array(@conditions).dup
229
230
 
@@ -234,6 +235,7 @@ module CacheCrispies
234
235
  with: with,
235
236
  through: through,
236
237
  to: to,
238
+ collection: collection,
237
239
  nesting: current_nesting,
238
240
  conditions: current_conditions,
239
241
  &block
@@ -16,17 +16,30 @@ 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 [Hash] options any optional values from the serializer instance
20
- # @option options [Symbol] :key the name of the root key to nest the JSON
19
+ # @param key [Symbol] the name of the root key to nest the JSON
21
20
  # data under
22
- # @option options [Boolean] :collection whether to render the data as a
21
+ # @param collection [Boolean] whether to render the data as a
23
22
  # collection/array or a single object
24
- # @option options [Integer, Symbol] :status the HTTP response status code
25
- # or Rails-supported symbol. See
23
+ # @param status [Integer, Symbol] the HTTP response status code or
24
+ # Rails-supported symbol. See
26
25
  # https://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option
26
+ # @param meta [Hash] data to include as metadata under a root key
27
+ # @param meta_key [Symbol] they key to store the metadata under
28
+ # @param [Hash] options any optional values from the serializer instance
27
29
  # @return [void]
28
- def cache_render(serializer, cacheable, options = {})
29
- plan = CacheCrispies::Plan.new(serializer, cacheable, options)
30
+ def cache_render(
31
+ serializer,
32
+ cacheable,
33
+ key: nil, collection: nil, status: nil,
34
+ meta: {}, meta_key: :meta,
35
+ **options
36
+ )
37
+ plan = CacheCrispies::Plan.new(
38
+ serializer,
39
+ cacheable,
40
+ key: key, collection: collection,
41
+ **options
42
+ )
30
43
 
31
44
  if CacheCrispies.config.etags?
32
45
  response.weak_etag = plan.etag
@@ -43,8 +56,11 @@ module CacheCrispies
43
56
  plan.cache { serializer.new(cacheable, options).as_json }
44
57
  end
45
58
 
46
- render_hash = { json: Oj.dump(plan.wrap(serializer_json), mode: OJ_MODE) }
47
- render_hash[:status] = options[:status] if options.key?(:status)
59
+ json_hash = plan.wrap(serializer_json)
60
+ json_hash[meta_key] = meta if meta.present?
61
+
62
+ render_hash = { json: Oj.dump(json_hash, mode: OJ_MODE) }
63
+ render_hash[:status] = status if status
48
64
 
49
65
  render render_hash
50
66
  end
@@ -16,18 +16,20 @@ module CacheCrispies
16
16
  #
17
17
  # @return [Hash]
18
18
  def call
19
+ return unless @serializer.model
20
+
19
21
  hash = {}
20
22
 
21
23
  serializer.attributes.each do |attrib|
22
24
  deepest_hash = hash
23
25
 
26
+ next unless show?(attrib)
27
+
24
28
  attrib.nesting.each do |key|
25
29
  deepest_hash[key] ||= {}
26
30
  deepest_hash = deepest_hash[key]
27
31
  end
28
32
 
29
- next unless show?(attrib)
30
-
31
33
  value = value_for(attrib)
32
34
 
33
35
  if attrib.key
@@ -16,14 +16,13 @@ module CacheCrispies
16
16
  # data under
17
17
  # @option options [Boolean] :collection whether to render the data as a
18
18
  # collection/array or a single object
19
- def initialize(serializer, cacheable, options = {})
19
+ def initialize(serializer, cacheable, key: nil, collection: nil, **options)
20
20
  @serializer = serializer
21
21
  @cacheable = cacheable
22
22
 
23
- opts = options.dup
24
- @key = opts.delete(:key)
25
- @collection = opts.delete(:collection)
26
- @options = opts
23
+ @key = key
24
+ @collection = collection
25
+ @options = options
27
26
  end
28
27
 
29
28
  # Whether or not the cacheable should be treated like a collection
@@ -2,5 +2,5 @@
2
2
 
3
3
  module CacheCrispies
4
4
  # The version of the gem
5
- VERSION = '1.0.1'
5
+ VERSION = '1.1.3'
6
6
  end
@@ -69,6 +69,26 @@ describe CacheCrispies::Base do
69
69
  parent_company: 'Disney probably'
70
70
  )
71
71
  end
72
+
73
+ context 'when nutrition_info is nil' do
74
+ before { model.nutrition_info = nil }
75
+
76
+ it 'serializes to a hash' do
77
+ expect(subject.as_json).to eq(
78
+ id: '42',
79
+ name: 'Cookie Crisp',
80
+ company: 'General Mills',
81
+ nested: {
82
+ nested_again: {
83
+ deeply_nested: 'TRUE'
84
+ }
85
+ },
86
+ nutrition_info: nil,
87
+ organic: true,
88
+ parent_company: 'Disney probably'
89
+ )
90
+ end
91
+ end
72
92
  end
73
93
 
74
94
  describe '.key' do
@@ -24,7 +24,8 @@ describe CacheCrispies::Controller do
24
24
 
25
25
  describe '#cache_render' do
26
26
  let(:etags) { false }
27
- let(:single_json) { { cereal: { name: cereal_names.first } }.to_json }
27
+ let(:single_hash) { { cereal: { name: cereal_names.first } } }
28
+ let(:single_json) { single_hash.to_json }
28
29
  let(:collection_json) {
29
30
  { cereals: cereal_names.map { |name| { name: name } } }.to_json
30
31
  }
@@ -86,5 +87,34 @@ describe CacheCrispies::Controller do
86
87
  )
87
88
  end
88
89
  end
90
+
91
+ context 'with a meta: option' do
92
+ it 'adds a meta data hash to the JSON' do
93
+ expect(subject).to receive(:render).with(
94
+ json: single_hash.merge(meta: { page: 42 }).to_json
95
+ )
96
+
97
+ subject.cache_render(
98
+ CerealSerializerForController,
99
+ collection.first,
100
+ meta: { page: 42 }
101
+ )
102
+ end
103
+ end
104
+
105
+ context 'with a meta_key: option' do
106
+ it 'adds a meta data hash to the JSON with the provided key' do
107
+ expect(subject).to receive(:render).with(
108
+ json: single_hash.merge(test_meta_data: { page: 42 }).to_json
109
+ )
110
+
111
+ subject.cache_render(
112
+ CerealSerializerForController,
113
+ collection.first,
114
+ meta: { page: 42 },
115
+ meta_key: :test_meta_data
116
+ )
117
+ end
118
+ end
89
119
  end
90
120
  end
@@ -85,8 +85,7 @@ describe CacheCrispies::HashBuilder do
85
85
  { name: 'Other Kind of Sugar' },
86
86
  ]
87
87
  }
88
- },
89
- health: {}
88
+ }
90
89
  })
91
90
  end
92
91
 
@@ -20,7 +20,7 @@ describe CacheCrispies::Plan do
20
20
  let(:model) { OpenStruct.new(name: 'Sugar Smacks', cache_key: model_cache_key) }
21
21
  let(:cacheable) { model }
22
22
  let(:options) { {} }
23
- let(:instance) { described_class.new(serializer, cacheable, options) }
23
+ let(:instance) { described_class.new(serializer, cacheable, **options) }
24
24
  subject { instance }
25
25
 
26
26
  before do
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.0.1
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Crownoble
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-12 00:00:00.000000000 Z
11
+ date: 2020-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -134,7 +134,7 @@ dependencies:
134
134
  - - "~>"
135
135
  - !ruby/object:Gem::Version
136
136
  version: '0.17'
137
- description:
137
+ description:
138
138
  email: adam@codenoble.com
139
139
  executables: []
140
140
  extensions: []
@@ -168,7 +168,7 @@ homepage: https://github.com/codenoble/cache-crispies
168
168
  licenses:
169
169
  - MIT
170
170
  metadata: {}
171
- post_install_message:
171
+ post_install_message:
172
172
  rdoc_options: []
173
173
  require_paths:
174
174
  - lib
@@ -184,7 +184,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  version: '0'
185
185
  requirements: []
186
186
  rubygems_version: 3.0.3
187
- signing_key:
187
+ signing_key:
188
188
  specification_version: 4
189
189
  summary: Fast Rails serializer with built-in caching
190
190
  test_files: