cached_resource 2.3.4 → 3.0.0
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/.travis.yml +10 -1
- data/README.md +11 -5
- data/cached_resource.gemspec +2 -2
- data/gemfiles/Gemfile.rails-3.2.x +8 -0
- data/lib/cached_resource/caching.rb +17 -10
- data/lib/cached_resource/configuration.rb +5 -4
- data/lib/cached_resource/version.rb +1 -1
- data/spec/cached_resource/caching_spec.rb +127 -7
- data/spec/cached_resource/configuration_spec.rb +5 -3
- metadata +8 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a93c586d68149afe39b531b4fa7b9230a1ad71f5
|
4
|
+
data.tar.gz: 66c08229d6334ebd4f79d771a70d26fa3d82c495
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84c687552fa91f2bcd6384e01f63b1682b086442d57d0311d4a0c1e77e13ec602cee0ddb2aa9f62595b17a3b3a1bc70622f745b66117934640d313eb5c6323aa
|
7
|
+
data.tar.gz: 17655fde4e9427fcd3989be0c1aa9cfce1b5e93a0ea9797e71da4d3f40f8287954189d59e6fbfb28f4361578c5e6c45272be28e384eb948e45c55059915efd08
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -5,15 +5,17 @@ CachedResource is a Ruby gem whose goal is to increase the performance of intera
|
|
5
5
|
gem install cached_resource
|
6
6
|
|
7
7
|
## Compatibility
|
8
|
-
CachedResource
|
8
|
+
CachedResource supports the following Ruby versions:
|
9
9
|
|
10
|
-
* 1.8.7
|
11
10
|
* 1.9.2, 1.9.3
|
11
|
+
* 2.0.0
|
12
12
|
|
13
|
-
|
13
|
+
If you require 1.8.7 support, please use version 2.3.4.
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
CachedResource is designed to be framework agnostic, but will hook into Rails for caching and logging if available. CachedResource officially supports the following Rails versions:
|
16
|
+
|
17
|
+
* 3.2.x
|
18
|
+
* 4.0.0
|
17
19
|
|
18
20
|
## Configuration
|
19
21
|
**Set up CachedResource across all ActiveResources:**
|
@@ -98,6 +100,10 @@ Sit back and relax! If you need to reload a particular request you can pass `:re
|
|
98
100
|
|
99
101
|
MyActiveResource.find(:all, :reload => true)
|
100
102
|
|
103
|
+
If you need to clear the entire cache just do the following:
|
104
|
+
|
105
|
+
MyActiveResource.clear_cache
|
106
|
+
|
101
107
|
## Testing
|
102
108
|
rake
|
103
109
|
|
data/cached_resource.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
19
|
s.add_dependency "rake"
|
20
|
-
s.add_dependency "activeresource", "
|
21
|
-
s.add_dependency "activesupport", "
|
20
|
+
s.add_dependency "activeresource", ">= 3.2"
|
21
|
+
s.add_dependency "activesupport", ">= 3.2"
|
22
22
|
s.add_dependency "nilio", ">= 1.0"
|
23
23
|
|
24
24
|
s.add_development_dependency "rspec"
|
@@ -22,6 +22,11 @@ module CachedResource
|
|
22
22
|
should_reload ? find_via_reload(key, *arguments) : find_via_cache(key, *arguments)
|
23
23
|
end
|
24
24
|
|
25
|
+
# Clear the cache.
|
26
|
+
def clear_cache
|
27
|
+
cache_clear
|
28
|
+
end
|
29
|
+
|
25
30
|
private
|
26
31
|
|
27
32
|
# Try to find a cached response for the given key. If
|
@@ -43,7 +48,7 @@ module CachedResource
|
|
43
48
|
# write cache entries for all its members
|
44
49
|
# otherwise update an existing collection if possible.
|
45
50
|
def cache_collection_synchronize(object, *arguments)
|
46
|
-
if object.is_a?
|
51
|
+
if object.is_a? Enumerable
|
47
52
|
update_singles_cache(object)
|
48
53
|
# update the collection only if this is a subset of it
|
49
54
|
update_collection_cache(object) unless is_collection?(*arguments)
|
@@ -55,19 +60,18 @@ module CachedResource
|
|
55
60
|
# Update the cache of singles with an array of updates.
|
56
61
|
def update_singles_cache(updates)
|
57
62
|
updates = Array(updates)
|
58
|
-
updates.each { |object| cache_write(object.send(primary_key), object) }
|
63
|
+
updates.each { |object| cache_write(cache_key(object.send(primary_key)), object) }
|
59
64
|
end
|
60
65
|
|
61
66
|
# Update the "mother" collection with an array of updates.
|
62
67
|
def update_collection_cache(updates)
|
63
68
|
updates = Array(updates)
|
64
|
-
collection = cache_read(cached_resource.collection_arguments)
|
69
|
+
collection = cache_read(cache_key(cached_resource.collection_arguments))
|
65
70
|
|
66
71
|
if collection && !updates.empty?
|
67
|
-
|
68
|
-
index = collection.inject(store) { |hash, object| hash[object.send(primary_key)] = object; hash }
|
72
|
+
index = collection.inject({}) { |hash, object| hash[object.send(primary_key)] = object; hash }
|
69
73
|
updates.each { |object| index[object.send(primary_key)] = object }
|
70
|
-
cache_write(cached_resource.collection_arguments, index.values)
|
74
|
+
cache_write(cache_key(cached_resource.collection_arguments), index.values)
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
@@ -78,9 +82,7 @@ module CachedResource
|
|
78
82
|
end
|
79
83
|
|
80
84
|
# Read a entry from the cache for the given key.
|
81
|
-
# The key is processed to make sure it is valid.
|
82
85
|
def cache_read(key)
|
83
|
-
key = cache_key(Array(key)) unless key.is_a? String
|
84
86
|
object = cached_resource.cache.read(key).try do |cache|
|
85
87
|
if cache.is_a? Enumerable
|
86
88
|
cache.map { |record| full_dup(record) }
|
@@ -93,14 +95,19 @@ module CachedResource
|
|
93
95
|
end
|
94
96
|
|
95
97
|
# Write an entry to the cache for the given key and value.
|
96
|
-
# The key is processed to make sure it is valid.
|
97
98
|
def cache_write(key, object)
|
98
|
-
key = cache_key(Array(key)) unless key.is_a? String
|
99
99
|
result = cached_resource.cache.write(key, object, :expires_in => cached_resource.generate_ttl)
|
100
100
|
result && cached_resource.logger.info("#{CachedResource::Configuration::LOGGER_PREFIX} WRITE #{key}")
|
101
101
|
result
|
102
102
|
end
|
103
103
|
|
104
|
+
# Clear the cache.
|
105
|
+
def cache_clear
|
106
|
+
cached_resource.cache.clear.tap do |result|
|
107
|
+
cached_resource.logger.info("#{CachedResource::Configuration::LOGGER_PREFIX} CLEAR")
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
104
111
|
# Generate the request cache key.
|
105
112
|
def cache_key(*arguments)
|
106
113
|
"#{name.parameterize.gsub("-", "/")}/#{arguments.join('/')}".downcase
|
@@ -3,14 +3,15 @@ module CachedResource
|
|
3
3
|
# for cached resource.
|
4
4
|
class Configuration < OpenStruct
|
5
5
|
|
6
|
-
# Determine and set an appropriate ordered hash based on the current ruby version
|
7
|
-
ORDERED_HASH = RUBY_VERSION.to_f < 1.9 ? ActiveSupport::OrderedHash : Hash
|
8
|
-
|
9
6
|
# default or fallback cache without rails
|
10
7
|
CACHE = ActiveSupport::Cache::MemoryStore.new
|
11
8
|
|
12
9
|
# default of fallback logger without rails
|
13
|
-
LOGGER = ActiveSupport::
|
10
|
+
LOGGER = if defined?(ActiveSupport::Logger)
|
11
|
+
ActiveSupport::Logger.new(NilIO.instance)
|
12
|
+
else
|
13
|
+
ActiveSupport::BufferedLogger.new(NilIO.instance)
|
14
|
+
end
|
14
15
|
|
15
16
|
# prefix for log messages
|
16
17
|
LOGGER_PREFIX = "[cached_resource]"
|
@@ -13,8 +13,12 @@ describe CachedResource do
|
|
13
13
|
@thing2 = {:thing => {:id => 2, :name => "Joe"}}
|
14
14
|
@other_thing2 = {:thing => {:id => 2, :name => "Jeb"}}
|
15
15
|
@thing3 = {:thing => {:id => 3, :name => "Stu"}}
|
16
|
+
@string_thing = {:thing => {:id => "fded", :name => "Lev"}}
|
17
|
+
@other_string_thing = {:thing => {:id => "fded", :name => "Lon"}}
|
16
18
|
@thing_json = @thing.to_json
|
17
19
|
@other_thing_json = @other_thing.to_json
|
20
|
+
@string_thing_json = @string_thing.to_json
|
21
|
+
@other_string_thing_json = @other_string_thing.to_json
|
18
22
|
end
|
19
23
|
|
20
24
|
after(:each) do
|
@@ -32,6 +36,7 @@ describe CachedResource do
|
|
32
36
|
ActiveResource::HttpMock.reset!
|
33
37
|
ActiveResource::HttpMock.respond_to do |mock|
|
34
38
|
mock.get "/things/1.json", {}, @thing_json
|
39
|
+
mock.get "/things/fded.json", {}, @string_thing_json
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
@@ -40,6 +45,17 @@ describe CachedResource do
|
|
40
45
|
Thing.cached_resource.cache.read("thing/1").should == result
|
41
46
|
end
|
42
47
|
|
48
|
+
it "should cache a response for a string primary key" do
|
49
|
+
result = Thing.find("fded")
|
50
|
+
Thing.cached_resource.cache.read("thing/fded").should == result
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should empty the cache when clear_cache is called" do
|
54
|
+
result = Thing.find(1)
|
55
|
+
Thing.clear_cache
|
56
|
+
Thing.cached_resource.cache.read("thing/1").should == nil
|
57
|
+
end
|
58
|
+
|
43
59
|
it "should cache a response with the same persistence" do
|
44
60
|
result1 = Thing.find(1)
|
45
61
|
result2 = Thing.find(1)
|
@@ -55,6 +71,15 @@ describe CachedResource do
|
|
55
71
|
ActiveResource::HttpMock.requests.length.should == 1
|
56
72
|
end
|
57
73
|
|
74
|
+
it "should read a response when the request is made again for a string primary key" do
|
75
|
+
# make a request
|
76
|
+
Thing.find("fded")
|
77
|
+
# make the same request
|
78
|
+
Thing.find("fded")
|
79
|
+
# only one request should have happened
|
80
|
+
ActiveResource::HttpMock.requests.length.should == 1
|
81
|
+
end
|
82
|
+
|
58
83
|
it "should remake a request when reloaded" do
|
59
84
|
# make a request
|
60
85
|
Thing.find(1)
|
@@ -64,6 +89,15 @@ describe CachedResource do
|
|
64
89
|
ActiveResource::HttpMock.requests.length.should == 2
|
65
90
|
end
|
66
91
|
|
92
|
+
it "should remake a request when reloaded for a string primary key" do
|
93
|
+
# make a request
|
94
|
+
Thing.find("fded")
|
95
|
+
# make the same request, but reload it
|
96
|
+
Thing.find("fded", :reload => true)
|
97
|
+
# we should get two requests
|
98
|
+
ActiveResource::HttpMock.requests.length.should == 2
|
99
|
+
end
|
100
|
+
|
67
101
|
it "should rewrite the cache when the request is reloaded" do
|
68
102
|
# make a request
|
69
103
|
Thing.find(1)
|
@@ -156,6 +190,15 @@ describe CachedResource do
|
|
156
190
|
|
157
191
|
end
|
158
192
|
|
193
|
+
shared_examples "collection_cache_clearing" do
|
194
|
+
it "should empty the cache when clear_cache is called" do
|
195
|
+
Thing.clear_cache
|
196
|
+
Thing.cached_resource.cache.read("thing/all").should == nil
|
197
|
+
Thing.cached_resource.cache.read("thing/1").should == nil
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
159
202
|
describe "when collection synchronize is enabled" do
|
160
203
|
before(:each) do
|
161
204
|
Thing.cached_resource.cache.clear
|
@@ -164,7 +207,8 @@ describe CachedResource do
|
|
164
207
|
ActiveResource::HttpMock.reset!
|
165
208
|
ActiveResource::HttpMock.respond_to do |mock|
|
166
209
|
mock.get "/things/1.json", {}, @thing_json
|
167
|
-
mock.get "/things.json", {},
|
210
|
+
mock.get "/things/fded.json", {}, @string_thing_json
|
211
|
+
mock.get "/things.json", {}, [@thing[:thing], @string_thing[:thing]].to_json(:root => :thing)
|
168
212
|
end
|
169
213
|
|
170
214
|
# make a request for all things
|
@@ -175,19 +219,25 @@ describe CachedResource do
|
|
175
219
|
|
176
220
|
it "should write cache entries for its members" do
|
177
221
|
result = Thing.find(1)
|
222
|
+
string_result = Thing.find("fded")
|
178
223
|
# only the all request should have been made
|
179
224
|
ActiveResource::HttpMock.requests.length.should == 1
|
180
225
|
# the result should be cached with the appropriate key
|
181
226
|
Thing.cached_resource.cache.read("thing/1").should == result
|
227
|
+
Thing.cached_resource.cache.read("thing/fded").should == string_result
|
182
228
|
end
|
183
229
|
|
230
|
+
include_examples "collection_cache_clearing"
|
231
|
+
|
184
232
|
it "should rewrite cache entries for its members when reloaded" do
|
185
233
|
# get the soon to be stale result so that we have a cache entry
|
186
234
|
old_result = Thing.find(1)
|
235
|
+
old_string_result = Thing.find("fded")
|
187
236
|
# change the server
|
188
237
|
ActiveResource::HttpMock.respond_to do |mock|
|
189
238
|
mock.get "/things/1.json", {}, @other_thing_json
|
190
|
-
mock.get "/things.json", {},
|
239
|
+
mock.get "/things/fded.json", {}, @other_string_thing_json
|
240
|
+
mock.get "/things.json", {}, [@other_thing[:thing], @other_string_thing[:thing]].to_json(:root => :thing)
|
191
241
|
end
|
192
242
|
# reload the collection
|
193
243
|
Thing.all(:reload => true)
|
@@ -195,19 +245,26 @@ describe CachedResource do
|
|
195
245
|
result = Thing.find(1)
|
196
246
|
Thing.cached_resource.cache.read("thing/all")[0].should == result
|
197
247
|
Thing.cached_resource.cache.read("thing/all")[0].name.should == result.name
|
248
|
+
string_result = Thing.find("fded")
|
249
|
+
Thing.cached_resource.cache.read("thing/all")[1].should == string_result
|
250
|
+
Thing.cached_resource.cache.read("thing/all")[1].name.should == string_result.name
|
198
251
|
end
|
199
252
|
|
200
253
|
it "should update the collection when an individual request is reloaded" do
|
201
254
|
# change the server
|
202
255
|
ActiveResource::HttpMock.respond_to do |mock|
|
203
256
|
mock.get "/things/1.json", {}, @other_thing_json
|
204
|
-
mock.get "/things.json", {},
|
257
|
+
mock.get "/things/fded.json", {}, @other_string_thing_json
|
258
|
+
mock.get "/things.json", {}, [@other_thing[:thing], @other_string_thing[:thing]].to_json(:root => :thing)
|
205
259
|
end
|
206
260
|
|
207
261
|
# reload the individual
|
208
262
|
result = Thing.find(1, :reload => true)
|
209
263
|
Thing.cached_resource.cache.read("thing/all")[0].should == result
|
210
264
|
Thing.cached_resource.cache.read("thing/all")[0].name.should == result.name
|
265
|
+
string_result = Thing.find("fded", :reload => true)
|
266
|
+
Thing.cached_resource.cache.read("thing/all")[1].should == string_result
|
267
|
+
Thing.cached_resource.cache.read("thing/all")[1].name.should == string_result.name
|
211
268
|
end
|
212
269
|
|
213
270
|
it "should update both the collection and the member cache entries when a subset of the collection is retrieved" do
|
@@ -218,6 +275,7 @@ describe CachedResource do
|
|
218
275
|
# change the server
|
219
276
|
ActiveResource::HttpMock.respond_to do |mock|
|
220
277
|
mock.get "/things.json?name=Ari", {}, [@other_thing[:thing]].to_json(:root => :thing)
|
278
|
+
mock.get "/things.json?name=Lon", {}, [@other_string_thing[:thing]].to_json(:root => :thing)
|
221
279
|
end
|
222
280
|
|
223
281
|
# make a request for a subset of the "mother" collection
|
@@ -228,12 +286,21 @@ describe CachedResource do
|
|
228
286
|
# the individual should be updated to reflect the server change
|
229
287
|
Thing.cached_resource.cache.read("thing/1").should == result[0]
|
230
288
|
Thing.cached_resource.cache.read("thing/1").name.should == result[0].name
|
289
|
+
|
290
|
+
# make a request for a subset of the "mother" collection
|
291
|
+
result = Thing.find(:all, :params => {:name => "Lon"})
|
292
|
+
# the collection should be updated to reflect the server change
|
293
|
+
Thing.cached_resource.cache.read("thing/all")[1].should == result[0]
|
294
|
+
Thing.cached_resource.cache.read("thing/all")[1].name.should == result[0].name
|
295
|
+
# the individual should be updated to reflect the server change
|
296
|
+
Thing.cached_resource.cache.read("thing/fded").should == result[0]
|
297
|
+
Thing.cached_resource.cache.read("thing/fded").name.should == result[0].name
|
231
298
|
end
|
232
299
|
|
233
300
|
it "should maintain the order of the collection when updating it" do
|
234
301
|
# change the server to return a longer collection
|
235
302
|
ActiveResource::HttpMock.respond_to do |mock|
|
236
|
-
mock.get "/things.json", {}, [@thing[:thing], @thing3[:thing], @thing2[:thing]].to_json(:root => :thing)
|
303
|
+
mock.get "/things.json", {}, [@thing[:thing], @thing3[:thing], @thing2[:thing], @string_thing[:thing]].to_json(:root => :thing)
|
237
304
|
end
|
238
305
|
|
239
306
|
# create cache entry for the collection (we reload because in before block we make an all request)
|
@@ -242,6 +309,7 @@ describe CachedResource do
|
|
242
309
|
# change the server's response for the thing with id 2
|
243
310
|
ActiveResource::HttpMock.respond_to do |mock|
|
244
311
|
mock.get "/things/2.json", {}, @other_thing2.to_json(:root => :thing)
|
312
|
+
mock.get "/things/fded.json", {}, @other_string_thing.to_json(:root => :thing)
|
245
313
|
end
|
246
314
|
|
247
315
|
# get thing 2, thereby updating the collection
|
@@ -254,6 +322,17 @@ describe CachedResource do
|
|
254
322
|
old_collection.each_with_index do |thing, i|
|
255
323
|
updated_collection[i].id.should == thing.id
|
256
324
|
end
|
325
|
+
|
326
|
+
# get string thing, thereby updating the collection
|
327
|
+
string_result = Thing.find("fded", :reload => true)
|
328
|
+
# get the updated collection from the cache
|
329
|
+
updated_collection = Thing.all
|
330
|
+
# name should have changed to "Lon"
|
331
|
+
updated_collection[3].name.should == string_result.name
|
332
|
+
# the updated collection should have the elements in the same order
|
333
|
+
old_collection.each_with_index do |thing, i|
|
334
|
+
updated_collection[i].id.should == thing.id
|
335
|
+
end
|
257
336
|
end
|
258
337
|
end
|
259
338
|
|
@@ -265,7 +344,8 @@ describe CachedResource do
|
|
265
344
|
ActiveResource::HttpMock.reset!
|
266
345
|
ActiveResource::HttpMock.respond_to do |mock|
|
267
346
|
mock.get "/things/1.json", {}, @thing_json
|
268
|
-
mock.get "/things.json", {},
|
347
|
+
mock.get "/things/fded.json", {}, @string_thing_json
|
348
|
+
mock.get "/things.json", {}, [@thing[:thing], @string_thing[:thing]].to_json(:root => :thing)
|
269
349
|
end
|
270
350
|
|
271
351
|
# make a request for all things
|
@@ -276,21 +356,30 @@ describe CachedResource do
|
|
276
356
|
|
277
357
|
it "should not write cache entries for its members" do
|
278
358
|
result = Thing.find(1)
|
359
|
+
result = Thing.find("fded")
|
279
360
|
# both the all in the before each and this request should have been made
|
280
|
-
ActiveResource::HttpMock.requests.length.should ==
|
361
|
+
ActiveResource::HttpMock.requests.length.should == 3
|
281
362
|
end
|
282
363
|
|
364
|
+
include_examples "collection_cache_clearing"
|
365
|
+
|
283
366
|
it "should not update the collection when an individual request is reloaded" do
|
284
367
|
# change the server
|
285
368
|
ActiveResource::HttpMock.respond_to do |mock|
|
286
369
|
mock.get "/things/1.json", {}, @other_thing_json
|
287
|
-
mock.get "/things.json", {},
|
370
|
+
mock.get "/things/fded.json", {}, @other_string_thing_json
|
371
|
+
mock.get "/things.json", {}, [@other_thing[:thing], @other_string_thing[:thing]].to_json(:root => :thing)
|
288
372
|
end
|
289
373
|
|
290
374
|
# reload the individual
|
291
375
|
result = Thing.find(1, :reload => true)
|
292
376
|
# the ids are the same, but the names should be different
|
293
377
|
Thing.cached_resource.cache.read("thing/all")[0].name.should_not == result.name
|
378
|
+
|
379
|
+
# reload the individual
|
380
|
+
string_result = Thing.find("fded", :reload => true)
|
381
|
+
# the ids are the same, but the names should be different
|
382
|
+
Thing.cached_resource.cache.read("thing/all")[1].name.should_not == string_result.name
|
294
383
|
end
|
295
384
|
end
|
296
385
|
|
@@ -324,6 +413,7 @@ describe CachedResource do
|
|
324
413
|
ActiveResource::HttpMock.reset!
|
325
414
|
ActiveResource::HttpMock.respond_to do |mock|
|
326
415
|
mock.get "/things/1.json", {}, @thing_json
|
416
|
+
mock.get "/things/fded.json", {}, @string_thing_json
|
327
417
|
end
|
328
418
|
end
|
329
419
|
|
@@ -332,6 +422,11 @@ describe CachedResource do
|
|
332
422
|
Thing.cached_resource.cache.read("thing/1").should == result
|
333
423
|
end
|
334
424
|
|
425
|
+
it "should cache a response for a string primary key" do
|
426
|
+
result = Thing.find("fded")
|
427
|
+
Thing.cached_resource.cache.read("thing/fded").should == result
|
428
|
+
end
|
429
|
+
|
335
430
|
it "should always remake the request" do
|
336
431
|
Thing.find(1)
|
337
432
|
ActiveResource::HttpMock.requests.length.should == 1
|
@@ -339,6 +434,13 @@ describe CachedResource do
|
|
339
434
|
ActiveResource::HttpMock.requests.length.should == 2
|
340
435
|
end
|
341
436
|
|
437
|
+
it "should always remake the request for a string primary key" do
|
438
|
+
Thing.find("fded")
|
439
|
+
ActiveResource::HttpMock.requests.length.should == 1
|
440
|
+
Thing.find("fded")
|
441
|
+
ActiveResource::HttpMock.requests.length.should == 2
|
442
|
+
end
|
443
|
+
|
342
444
|
it "should rewrite the cache for each request" do
|
343
445
|
Thing.find(1)
|
344
446
|
old_result = Thing.cached_resource.cache.read("thing/1")
|
@@ -356,5 +458,23 @@ describe CachedResource do
|
|
356
458
|
# not new?, and have the same id.
|
357
459
|
new_result.name.should_not == old_result.name
|
358
460
|
end
|
461
|
+
|
462
|
+
it "should rewrite the cache for each request for a string primary key" do
|
463
|
+
Thing.find("fded")
|
464
|
+
old_result = Thing.cached_resource.cache.read("thing/fded")
|
465
|
+
|
466
|
+
# change the response
|
467
|
+
ActiveResource::HttpMock.reset!
|
468
|
+
ActiveResource::HttpMock.respond_to do |mock|
|
469
|
+
mock.get "/things/fded.json", {}, @other_string_thing_json
|
470
|
+
end
|
471
|
+
|
472
|
+
Thing.find("fded")
|
473
|
+
new_result = Thing.cached_resource.cache.read("thing/fded")
|
474
|
+
# since active resources are equal if and only if they
|
475
|
+
# are the same object or an instance of the same class,
|
476
|
+
# not new?, and have the same id.
|
477
|
+
new_result.name.should_not == old_result.name
|
478
|
+
end
|
359
479
|
end
|
360
480
|
end
|
@@ -3,6 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe "CachedResource::Configuration" do
|
4
4
|
|
5
5
|
let(:configuration) { CachedResource::Configuration.new }
|
6
|
+
let(:default_logger) { defined?(ActiveSupport::Logger) ? ActiveSupport::Logger : ActiveSupport::BufferedLogger }
|
6
7
|
|
7
8
|
describe "by default" do
|
8
9
|
it "should be enabled" do
|
@@ -23,12 +24,13 @@ describe "CachedResource::Configuration" do
|
|
23
24
|
|
24
25
|
describe "outside a Rails environment" do
|
25
26
|
it "should be logging to a buffered logger attached to a NilIO" do
|
26
|
-
configuration.logger.class.should ==
|
27
|
+
configuration.logger.class.should == default_logger
|
27
28
|
# ActiveSupport switched around the log destination variables
|
28
29
|
# Check if either are what we expect to be compatible
|
29
30
|
old_as = configuration.logger.instance_variable_get(:@log).class == NilIO
|
30
31
|
new_as = configuration.logger.instance_variable_get(:@log_dest).class == NilIO
|
31
|
-
|
32
|
+
newer_as = configuration.logger.instance_variable_get(:@logdev).instance_variable_get(:@dev).class == NilIO
|
33
|
+
(old_as || new_as || newer_as).should == true
|
32
34
|
end
|
33
35
|
|
34
36
|
it "should cache responses in a memory store" do
|
@@ -173,7 +175,7 @@ describe "CachedResource::Configuration" do
|
|
173
175
|
it "should have the default options for anything unspecified" do
|
174
176
|
cr = Foo.cached_resource
|
175
177
|
cr.cache.class.should == ActiveSupport::Cache::MemoryStore
|
176
|
-
cr.logger.class.should ==
|
178
|
+
cr.logger.class.should == default_logger
|
177
179
|
cr.enabled.should == true
|
178
180
|
cr.collection_synchronize.should == false
|
179
181
|
cr.collection_arguments.should == [:all]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cached_resource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Chan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -28,28 +28,28 @@ dependencies:
|
|
28
28
|
name: activeresource
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - '>='
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '3.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - '>='
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '3.2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- README.md
|
95
95
|
- Rakefile
|
96
96
|
- cached_resource.gemspec
|
97
|
+
- gemfiles/Gemfile.rails-3.2.x
|
97
98
|
- lib/cached_resource.rb
|
98
99
|
- lib/cached_resource/cached_resource.rb
|
99
100
|
- lib/cached_resource/caching.rb
|
@@ -121,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
122
|
version: '0'
|
122
123
|
requirements: []
|
123
124
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.0.
|
125
|
+
rubygems_version: 2.0.5
|
125
126
|
signing_key:
|
126
127
|
specification_version: 4
|
127
128
|
summary: Caching for ActiveResource
|