cache_crispies 0.3.1 → 1.0.1

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.
@@ -2,11 +2,10 @@ require 'spec_helper'
2
2
 
3
3
  describe CacheCrispies::Plan do
4
4
  class CerealSerializerForPlan < CacheCrispies::Base
5
- def self.key
6
- :cereal
7
- end
5
+ key :cereal
6
+ dependency_key :'v1-beta'
8
7
 
9
- def self.cache_key_addons(options)
8
+ cache_key_addons do |options|
10
9
  ['addon1', options[:extra_addon]]
11
10
  end
12
11
 
@@ -15,7 +14,7 @@ describe CacheCrispies::Plan do
15
14
 
16
15
  let(:serializer) { CerealSerializerForPlan }
17
16
  let(:serializer_file_path) {
18
- File.expand_path('fixtures/test_serializer.rb', __dir__)
17
+ File.expand_path('../fixtures/test_serializer.rb', __dir__)
19
18
  }
20
19
  let(:model_cache_key) { 'model-cache-key' }
21
20
  let(:model) { OpenStruct.new(name: 'Sugar Smacks', cache_key: model_cache_key) }
@@ -86,6 +85,10 @@ describe CacheCrispies::Plan do
86
85
  expect(subject.cache_key).to include serializer.cache_key_base
87
86
  end
88
87
 
88
+ it "includes the serializer's #dependency_key" do
89
+ expect(subject.cache_key).to include 'v1-beta'
90
+ end
91
+
89
92
  it "includes the addons_key" do
90
93
  expect(subject.cache_key).to include(
91
94
  Digest::MD5.hexdigest('addon1|addon2')
@@ -104,6 +107,7 @@ describe CacheCrispies::Plan do
104
107
  expect(subject.cache_key).to eq(
105
108
  'cache-crispies' \
106
109
  "+CerealSerializerForPlan-#{Digest::MD5.file(serializer_file_path)}" \
110
+ '+v1-beta' \
107
111
  "+#{Digest::MD5.hexdigest('addon1|addon2')}" \
108
112
  '+model-cache-key'
109
113
  )
@@ -116,6 +120,7 @@ describe CacheCrispies::Plan do
116
120
  expect(subject.cache_key).to eq(
117
121
  'cache-crispies' \
118
122
  "+CerealSerializerForPlan-#{Digest::MD5.file(serializer_file_path)}" \
123
+ '+v1-beta' \
119
124
  '+model-cache-key'
120
125
  )
121
126
  end
@@ -125,7 +130,7 @@ describe CacheCrispies::Plan do
125
130
  describe '#cache' do
126
131
  context 'when the plan is not cacheable' do
127
132
  it "doesn't cache the results" do
128
- expect(Rails).to_not receive(:cache)
133
+ expect(CacheCrispies).to_not receive(:cache)
129
134
  subject.cache {}
130
135
  end
131
136
  end
@@ -134,7 +139,7 @@ describe CacheCrispies::Plan do
134
139
  it "doesn't cache the results" do
135
140
  expect(subject).to receive(:cache?).and_return true
136
141
  expect(subject).to receive(:cache_key).and_return 'bar'
137
- expect(Rails).to receive_message_chain(:cache, :fetch).with('bar')
142
+ expect(CacheCrispies).to receive_message_chain(:cache, :fetch).with('bar')
138
143
  subject.cache {}
139
144
  end
140
145
  end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe CacheCrispies do
4
+ after { described_class.config.reset! }
5
+
6
+ describe '.configure and .config' do
7
+ it 'allows setting values' do
8
+ expect {
9
+ described_class.configure do |conf|
10
+ conf.etags = true
11
+ end
12
+ }.to change { described_class.config.etags }.from(false).to true
13
+ end
14
+ end
15
+
16
+ describe '.cache' do
17
+ it 'delegates to config.cache_store' do
18
+ cache_store = ActiveSupport::Cache::NullStore.new
19
+
20
+ expect {
21
+ described_class.configure do |conf|
22
+ conf.cache_store = cache_store
23
+ end
24
+ }.to change { described_class.cache }.to cache_store
25
+ end
26
+ end
27
+ end
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cache_crispies
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 1.0.1
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-08-28 00:00:00.000000000 Z
11
+ date: 2019-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: railties
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 5.0.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.1'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 5.0.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.1'
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: oj
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -25,7 +45,7 @@ dependencies:
25
45
  - !ruby/object:Gem::Version
26
46
  version: '3.7'
27
47
  - !ruby/object:Gem::Dependency
28
- name: rails
48
+ name: activemodel
29
49
  requirement: !ruby/object:Gem::Requirement
30
50
  requirements:
31
51
  - - ">="
@@ -34,7 +54,7 @@ dependencies:
34
54
  - - "<"
35
55
  - !ruby/object:Gem::Version
36
56
  version: '6.1'
37
- type: :runtime
57
+ type: :development
38
58
  prerelease: false
39
59
  version_requirements: !ruby/object:Gem::Requirement
40
60
  requirements:
@@ -48,16 +68,16 @@ dependencies:
48
68
  name: appraisal
49
69
  requirement: !ruby/object:Gem::Requirement
50
70
  requirements:
51
- - - ">="
71
+ - - "~>"
52
72
  - !ruby/object:Gem::Version
53
- version: '0'
73
+ version: '2.2'
54
74
  type: :development
55
75
  prerelease: false
56
76
  version_requirements: !ruby/object:Gem::Requirement
57
77
  requirements:
58
- - - ">="
78
+ - - "~>"
59
79
  - !ruby/object:Gem::Version
60
- version: '0'
80
+ version: '2.2'
61
81
  - !ruby/object:Gem::Dependency
62
82
  name: bundler
63
83
  requirement: !ruby/object:Gem::Requirement
@@ -126,20 +146,23 @@ files:
126
146
  - lib/cache_crispies/base.rb
127
147
  - lib/cache_crispies/collection.rb
128
148
  - lib/cache_crispies/condition.rb
149
+ - lib/cache_crispies/configuration.rb
129
150
  - lib/cache_crispies/controller.rb
130
151
  - lib/cache_crispies/hash_builder.rb
131
152
  - lib/cache_crispies/memoizer.rb
132
153
  - lib/cache_crispies/plan.rb
133
154
  - lib/cache_crispies/version.rb
134
- - spec/attribute_spec.rb
135
- - spec/base_spec.rb
136
- - spec/collection_spec.rb
137
- - spec/condition_spec.rb
138
- - spec/controller_spec.rb
155
+ - spec/cache_crispies/attribute_spec.rb
156
+ - spec/cache_crispies/base_spec.rb
157
+ - spec/cache_crispies/collection_spec.rb
158
+ - spec/cache_crispies/condition_spec.rb
159
+ - spec/cache_crispies/configuration_spec.rb
160
+ - spec/cache_crispies/controller_spec.rb
161
+ - spec/cache_crispies/hash_builder_spec.rb
162
+ - spec/cache_crispies/memoizer_spec.rb
163
+ - spec/cache_crispies/plan_spec.rb
164
+ - spec/cache_crispies_spec.rb
139
165
  - spec/fixtures/test_serializer.rb
140
- - spec/hash_builder_spec.rb
141
- - spec/memoizer_spec.rb
142
- - spec/plan_spec.rb
143
166
  - spec/spec_helper.rb
144
167
  homepage: https://github.com/codenoble/cache-crispies
145
168
  licenses:
@@ -165,13 +188,15 @@ signing_key:
165
188
  specification_version: 4
166
189
  summary: Fast Rails serializer with built-in caching
167
190
  test_files:
168
- - spec/attribute_spec.rb
169
- - spec/base_spec.rb
170
- - spec/collection_spec.rb
171
- - spec/condition_spec.rb
172
- - spec/controller_spec.rb
191
+ - spec/cache_crispies/attribute_spec.rb
192
+ - spec/cache_crispies/base_spec.rb
193
+ - spec/cache_crispies/collection_spec.rb
194
+ - spec/cache_crispies/condition_spec.rb
195
+ - spec/cache_crispies/configuration_spec.rb
196
+ - spec/cache_crispies/controller_spec.rb
197
+ - spec/cache_crispies/hash_builder_spec.rb
198
+ - spec/cache_crispies/memoizer_spec.rb
199
+ - spec/cache_crispies/plan_spec.rb
200
+ - spec/cache_crispies_spec.rb
173
201
  - spec/fixtures/test_serializer.rb
174
- - spec/hash_builder_spec.rb
175
- - spec/memoizer_spec.rb
176
- - spec/plan_spec.rb
177
202
  - spec/spec_helper.rb
@@ -1,186 +0,0 @@
1
- require 'spec_helper'
2
- require 'ostruct'
3
-
4
- describe CacheCrispies::Base do
5
- class NutritionSerializer < CacheCrispies::Base
6
- serialize :calories
7
- end
8
-
9
- class CacheCrispiesTestSerializer < CacheCrispies::Base
10
- serialize :id, :company, to: String
11
-
12
- show_if -> { true } do
13
- show_if -> { true } do
14
- show_if -> { true } do
15
- serialize :name, from: :brand
16
- end
17
- end
18
- end
19
-
20
- nest_in :nested do
21
- nest_in :nested_again do
22
- serialize :deeply_nested
23
- end
24
- end
25
-
26
- serialize :nutrition_info, with: NutritionSerializer
27
-
28
- serialize :organic, to: :bool
29
-
30
- def id
31
- model.id.to_s
32
- end
33
- end
34
-
35
- let(:model) do
36
- OpenStruct.new(
37
- id: 42,
38
- brand: 'Cookie Crisp',
39
- company: 'General Mills',
40
- deeply_nested: true,
41
- nutrition_info: OpenStruct.new(calories: 1_000),
42
- organic: 'true'
43
- )
44
- end
45
-
46
- let(:instance) { CacheCrispiesTestSerializer.new(model) }
47
- subject { instance }
48
-
49
- describe '#as_json' do
50
- it 'serializes to a hash' do
51
- expect(subject.as_json).to eq(
52
- id: '42',
53
- name: 'Cookie Crisp',
54
- company: 'General Mills',
55
- nested: {
56
- nested_again: {
57
- deeply_nested: true
58
- }
59
- },
60
- nutrition_info: {
61
- calories: 1000
62
- },
63
- organic: true
64
- )
65
- end
66
- end
67
-
68
- describe '.key' do
69
- it 'underscores the demodulized class name' do
70
- expect(subject.class.key).to eq :cache_crispies_test
71
- end
72
- end
73
-
74
- describe '.collection_key' do
75
- it 'pluralizes the #key' do
76
- expect(subject.class.collection_key).to eq :cache_crispies_tests
77
- end
78
- end
79
-
80
- describe '.do_caching?' do
81
- it 'is false by default' do
82
- expect(subject.class.do_caching?).to be false
83
- end
84
- end
85
-
86
- describe '.cache_key_addons' do
87
- it 'returns an empty array by default' do
88
- expect(subject.class.cache_key_addons).to eq []
89
- end
90
- end
91
-
92
- describe '.cache_key_base' do
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
127
- end
128
-
129
- describe '.attributes' do
130
- subject { instance.class.attributes }
131
-
132
- it 'contains all the attributes' do
133
- expect(subject.length).to eq 6
134
- end
135
-
136
- it 'preserves the attribute order' do
137
- expect(subject.map(&:key)).to eq(
138
- %i[id company name deeply_nested nutrition_info organic]
139
- )
140
- end
141
-
142
- it 'contains the correct attribute values' do
143
- expect(subject[0].method_name).to eq :id
144
- expect(subject[0].key).to eq :id
145
- expect(subject[0].serializer).to be nil
146
- expect(subject[0].coerce_to).to be String
147
- expect(subject[0].nesting).to eq []
148
- expect(subject[0].conditions).to eq []
149
-
150
- expect(subject[1].method_name).to eq :company
151
- expect(subject[1].key).to eq :company
152
- expect(subject[1].serializer).to be nil
153
- expect(subject[1].coerce_to).to be String
154
- expect(subject[1].nesting).to eq []
155
- expect(subject[1].conditions).to eq []
156
-
157
- expect(subject[2].method_name).to eq :brand
158
- expect(subject[2].key).to eq :name
159
- expect(subject[2].serializer).to be nil
160
- expect(subject[2].coerce_to).to be nil
161
- expect(subject[2].nesting).to eq []
162
- expect(subject[2].conditions.length).to be 3
163
-
164
- expect(subject[3].method_name).to eq :deeply_nested
165
- expect(subject[3].key).to eq :deeply_nested
166
- expect(subject[3].serializer).to be nil
167
- expect(subject[3].coerce_to).to be nil
168
- expect(subject[3].nesting).to eq %i[nested nested_again]
169
- expect(subject[3].conditions).to eq []
170
-
171
- expect(subject[4].method_name).to eq :nutrition_info
172
- expect(subject[4].key).to eq :nutrition_info
173
- expect(subject[4].serializer).to be NutritionSerializer
174
- expect(subject[4].coerce_to).to be nil
175
- expect(subject[4].nesting).to eq []
176
- expect(subject[4].conditions).to eq []
177
-
178
- expect(subject[5].method_name).to eq :organic
179
- expect(subject[5].key).to eq :organic
180
- expect(subject[5].serializer).to be nil
181
- expect(subject[5].coerce_to).to be :bool
182
- expect(subject[5].nesting).to eq []
183
- expect(subject[5].conditions).to eq []
184
- end
185
- end
186
- end
@@ -1,69 +0,0 @@
1
- require 'spec_helper'
2
- require 'active_model'
3
- require 'action_controller'
4
-
5
- describe CacheCrispies::Controller do
6
- class Cereal
7
- include ActiveModel::Model
8
- attr_accessor :name
9
- end
10
-
11
- class CerealController < ActionController::Base
12
- include CacheCrispies::Controller
13
- end
14
-
15
- class CerealSerializerForController < CacheCrispies::Base
16
- serialize :name
17
-
18
- def self.key
19
- 'cereal'
20
- end
21
- end
22
-
23
- let(:cereal_names) { ['Count Chocula', 'Eyeholes'] }
24
- let(:collection) { cereal_names.map { |name| Cereal.new(name: name) } }
25
-
26
- subject { CerealController.new }
27
-
28
- before do
29
- allow_any_instance_of(
30
- CacheCrispies::Plan
31
- ).to receive(:etag).and_return 'test-etag'
32
- allow(subject).to receive_message_chain(:response, :weak_etag=).with 'test-etag'
33
- end
34
-
35
- describe '#cache_render' do
36
- it 'renders a json collection' do
37
- expect(subject).to receive(:render).with(
38
- json: {
39
- cereals: cereal_names.map { |name| { name: name } }
40
- }.to_json
41
- )
42
-
43
- subject.cache_render CerealSerializerForController, collection
44
- end
45
-
46
- it 'renders a single json object' do
47
- expect(subject).to receive(:render).with(
48
- json: { cereal: { name: cereal_names.first } }.to_json
49
- )
50
-
51
- subject.cache_render CerealSerializerForController, collection.first
52
- end
53
-
54
- context 'with a status: option' do
55
- it 'passes the status option to the Rails render call' do
56
- expect(subject).to receive(:render).with(
57
- json: { cereal: { name: cereal_names.first } }.to_json,
58
- status: 418
59
- )
60
-
61
- subject.cache_render(
62
- CerealSerializerForController,
63
- collection.first,
64
- status: 418
65
- )
66
- end
67
- end
68
- end
69
- end