cached_resource 2.3.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|