ngmoco-cache-money 0.2.23 → 0.2.24.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README +30 -34
- data/README.markdown +30 -34
- data/config/environment.rb +0 -8
- data/config/memcached.yml +0 -2
- data/init.rb +1 -1
- data/lib/cache_money.rb +55 -36
- data/lib/cash/adapter/memcache_client.rb +36 -0
- data/lib/cash/adapter/memcached.rb +131 -0
- data/lib/cash/adapter/redis.rb +152 -0
- data/lib/cash/config.rb +7 -4
- data/lib/cash/finders.rb +15 -3
- data/lib/cash/index.rb +3 -6
- data/lib/cash/local.rb +1 -1
- data/lib/cash/lock.rb +2 -2
- data/lib/cash/mock.rb +16 -12
- data/lib/cash/query/abstract.rb +29 -3
- data/lib/cash/version.rb +3 -0
- data/lib/cash/write_through.rb +9 -5
- data/lib/mem_cached_support_store.rb +1 -1
- data/rails/init.rb +1 -40
- data/spec/cash/calculations_spec.rb +11 -0
- data/spec/cash/finders_spec.rb +4 -4
- data/spec/cash/lock_spec.rb +30 -24
- data/spec/cash/marshal_spec.rb +1 -1
- data/spec/cash/transactional_spec.rb +19 -17
- data/spec/cash/without_caching_spec.rb +32 -0
- data/spec/cash/write_through_spec.rb +7 -0
- data/spec/spec_helper.rb +32 -6
- metadata +136 -45
- data/lib/memcached_wrapper.rb +0 -263
- data/spec/memcached_wrapper_test.rb +0 -209
@@ -36,6 +36,17 @@ module Cash
|
|
36
36
|
mock(Story.connection).execute.never
|
37
37
|
story.characters.count(:all, :conditions => { :name => name }).should == characters.size
|
38
38
|
end
|
39
|
+
|
40
|
+
it 'has correct counter cache' do
|
41
|
+
story = Story.create!
|
42
|
+
characters = [story.characters.create!(:name => name = 'name'), story.characters.create!(:name => name)]
|
43
|
+
$memcache.flush_all
|
44
|
+
story.characters.find(:all, :conditions => { :name => name }) == characters
|
45
|
+
story.characters.count(:all, :conditions => { :name => name }).should == characters.size
|
46
|
+
story.characters.find(:all, :conditions => { :name => name }) == characters
|
47
|
+
mock(Story.connection).execute.never
|
48
|
+
# story.characters.count(:all, :conditions => { :name => name }).should == characters.size
|
49
|
+
end
|
39
50
|
end
|
40
51
|
end
|
41
52
|
end
|
data/spec/cash/finders_spec.rb
CHANGED
@@ -369,6 +369,7 @@ module Cash
|
|
369
369
|
@short2 = Short.create(:title => 'another title',
|
370
370
|
:subtitle => 'subtitle')
|
371
371
|
$memcache.flush_all
|
372
|
+
# debugger
|
372
373
|
Short.find(:all, :conditions => { :subtitle => @short1.subtitle },
|
373
374
|
:order => 'title')
|
374
375
|
end
|
@@ -387,10 +388,9 @@ module Cash
|
|
387
388
|
:order => 'title').map(&:id).should == [@short2.id, @short1.id]
|
388
389
|
end
|
389
390
|
|
390
|
-
# it '
|
391
|
-
|
392
|
-
|
393
|
-
# :order => 'title').should_not be_empty
|
391
|
+
# it 'populates cache for each object' do
|
392
|
+
# Short.fetch("id/#{@short1.id}").should == [@short1]
|
393
|
+
# Short.fetch("id/#{@short2.id}").should == [@short2]
|
394
394
|
# end
|
395
395
|
end
|
396
396
|
|
data/spec/cash/lock_spec.rb
CHANGED
@@ -2,10 +2,12 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
module Cash
|
4
4
|
describe Lock do
|
5
|
+
let(:lock) { Cash::Lock.new($memcache) }
|
6
|
+
|
5
7
|
describe '#synchronize' do
|
6
8
|
it "yields the block" do
|
7
9
|
block_was_called = false
|
8
|
-
|
10
|
+
lock.synchronize('lock_key') do
|
9
11
|
block_was_called = true
|
10
12
|
end
|
11
13
|
block_was_called.should == true
|
@@ -13,26 +15,26 @@ module Cash
|
|
13
15
|
|
14
16
|
it "acquires the specified lock before the block is run" do
|
15
17
|
$memcache.get("lock/lock_key").should == nil
|
16
|
-
|
18
|
+
lock.synchronize('lock_key') do
|
17
19
|
$memcache.get("lock/lock_key").should_not == nil
|
18
20
|
end
|
19
21
|
end
|
20
22
|
|
21
23
|
it "releases the lock after the block is run" do
|
22
24
|
$memcache.get("lock/lock_key").should == nil
|
23
|
-
|
25
|
+
lock.synchronize('lock_key') {}
|
24
26
|
$memcache.get("lock/lock_key").should == nil
|
25
27
|
end
|
26
28
|
|
27
29
|
it "releases the lock even if the block raises" do
|
28
30
|
$memcache.get("lock/lock_key").should == nil
|
29
|
-
|
31
|
+
lock.synchronize('lock_key') { raise } rescue nil
|
30
32
|
$memcache.get("lock/lock_key").should == nil
|
31
33
|
end
|
32
34
|
|
33
35
|
it "does not block on recursive lock acquisition" do
|
34
|
-
|
35
|
-
lambda {
|
36
|
+
lock.synchronize('lock_key') do
|
37
|
+
lambda { lock.synchronize('lock_key') {} }.should_not raise_error
|
36
38
|
end
|
37
39
|
end
|
38
40
|
end
|
@@ -40,47 +42,51 @@ module Cash
|
|
40
42
|
describe '#acquire_lock' do
|
41
43
|
it "creates a lock at a given cache key" do
|
42
44
|
$memcache.get("lock/lock_key").should == nil
|
43
|
-
|
45
|
+
lock.acquire_lock("lock_key")
|
44
46
|
$memcache.get("lock/lock_key").should_not == nil
|
45
47
|
end
|
46
48
|
|
47
49
|
describe 'when given a timeout for the lock' do
|
48
50
|
it "correctly sets timeout on memcache entries" do
|
49
51
|
mock($memcache).add('lock/lock_key', "#{Socket.gethostname} #{Process.pid}", timeout = 10) { true }
|
50
|
-
#
|
51
|
-
lambda {
|
52
|
+
# lock.acquire_lock('lock_key', timeout)
|
53
|
+
lambda { lock.acquire_lock('lock_key', timeout, 1) }.should raise_error(Cash::Lock::Error)
|
52
54
|
end
|
53
55
|
end
|
54
56
|
|
55
|
-
describe 'when
|
57
|
+
describe 'when two processes contend for a lock' do
|
56
58
|
it "prevents two processes from acquiring the same lock at the same time" do
|
57
|
-
|
59
|
+
lock.acquire_lock('lock_key')
|
58
60
|
as_another_process do
|
59
|
-
stub(
|
60
|
-
lambda {
|
61
|
+
stub(lock).exponential_sleep
|
62
|
+
lambda { lock.acquire_lock('lock_key') }.should raise_error(Cash::Lock::Error)
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
64
66
|
describe 'when given a number of times to retry' do
|
65
67
|
it "retries specified number of times" do
|
66
|
-
|
68
|
+
lock.acquire_lock('lock_key')
|
67
69
|
as_another_process do
|
68
70
|
mock($memcache).add("lock/lock_key", "#{Socket.gethostname} #{Process.pid}", timeout = 10) { false }.times(retries = 3)
|
69
|
-
stub(
|
70
|
-
lambda {
|
71
|
+
stub(lock).exponential_sleep
|
72
|
+
lambda { lock.acquire_lock('lock_key', timeout, retries) }.should raise_error(Cash::Lock::Error)
|
71
73
|
end
|
72
74
|
end
|
73
75
|
end
|
74
76
|
|
75
77
|
describe 'when given an initial wait' do
|
76
78
|
it 'sleeps exponentially starting with the initial wait' do
|
77
|
-
stub(
|
78
|
-
stub(
|
79
|
-
stub(
|
80
|
-
stub(
|
81
|
-
|
79
|
+
stub(lock).sleep(initial_wait = 0.123)
|
80
|
+
stub(lock).sleep(2 * initial_wait)
|
81
|
+
stub(lock).sleep(4 * initial_wait)
|
82
|
+
stub(lock).sleep(8 * initial_wait)
|
83
|
+
stub(lock).sleep(16 * initial_wait)
|
84
|
+
stub(lock).sleep(32 * initial_wait)
|
85
|
+
stub(lock).sleep(64 * initial_wait)
|
86
|
+
stub(lock).sleep(128 * initial_wait)
|
87
|
+
lock.acquire_lock('lock_key')
|
82
88
|
as_another_process do
|
83
|
-
lambda {
|
89
|
+
lambda { lock.acquire_lock('lock_key', Lock::DEFAULT_EXPIRY, Lock::DEFAULT_RETRY, initial_wait) }.should raise_error(Cash::Lock::Error)
|
84
90
|
end
|
85
91
|
end
|
86
92
|
end
|
@@ -98,9 +104,9 @@ module Cash
|
|
98
104
|
describe '#release_lock' do
|
99
105
|
it "deletes the lock for a given cache key" do
|
100
106
|
$memcache.get("lock/lock_key").should == nil
|
101
|
-
|
107
|
+
lock.acquire_lock("lock_key")
|
102
108
|
$memcache.get("lock/lock_key").should_not == nil
|
103
|
-
|
109
|
+
lock.release_lock("lock_key")
|
104
110
|
$memcache.get("lock/lock_key").should == nil
|
105
111
|
end
|
106
112
|
end
|
data/spec/cash/marshal_spec.rb
CHANGED
@@ -2,8 +2,10 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
module Cash
|
4
4
|
describe Transactional do
|
5
|
+
let(:lock) { Cash::Lock.new($memcache) }
|
6
|
+
|
5
7
|
before do
|
6
|
-
@cache = Transactional.new($memcache,
|
8
|
+
@cache = Transactional.new($memcache, lock)
|
7
9
|
@value = "stuff to be cached"
|
8
10
|
@key = "key"
|
9
11
|
end
|
@@ -230,9 +232,9 @@ module Cash
|
|
230
232
|
|
231
233
|
describe 'Lock Acquisition' do
|
232
234
|
it "locks @keys to be written before writing to memcache and release them after" do
|
233
|
-
mock(
|
235
|
+
mock(lock).acquire_lock(@key)
|
234
236
|
mock($memcache).set(@key, @value)
|
235
|
-
mock(
|
237
|
+
mock(lock).release_lock(@key)
|
236
238
|
|
237
239
|
@cache.transaction do
|
238
240
|
@cache.set(@key, @value)
|
@@ -240,8 +242,8 @@ module Cash
|
|
240
242
|
end
|
241
243
|
|
242
244
|
it "does not acquire locks on reads" do
|
243
|
-
mock(
|
244
|
-
mock(
|
245
|
+
mock(lock).acquire_lock.never
|
246
|
+
mock(lock).release_lock.never
|
245
247
|
|
246
248
|
@cache.transaction do
|
247
249
|
@cache.get(@key)
|
@@ -250,11 +252,11 @@ module Cash
|
|
250
252
|
|
251
253
|
it "locks @keys in lexically sorted order" do
|
252
254
|
keys = ['c', 'a', 'b']
|
253
|
-
keys.sort.inject(mock(
|
255
|
+
keys.sort.inject(mock(lock)) do |mock, key|
|
254
256
|
mock.acquire_lock(key).then
|
255
257
|
end
|
256
258
|
keys.each { |key| mock($memcache).set(key, @value) }
|
257
|
-
keys.each { |key| mock(
|
259
|
+
keys.each { |key| mock(lock).release_lock(key) }
|
258
260
|
@cache.transaction do
|
259
261
|
@cache.set(keys[0], @value)
|
260
262
|
@cache.set(keys[1], @value)
|
@@ -263,8 +265,8 @@ module Cash
|
|
263
265
|
end
|
264
266
|
|
265
267
|
it "releases locks even if memcache blows up" do
|
266
|
-
mock(
|
267
|
-
mock(
|
268
|
+
mock(lock).acquire_lock.with(@key)
|
269
|
+
mock(lock).release_lock.with(@key)
|
268
270
|
stub($memcache).set(anything, anything) { raise }
|
269
271
|
@cache.transaction do
|
270
272
|
@cache.set(@key, @value)
|
@@ -414,8 +416,8 @@ module Cash
|
|
414
416
|
end
|
415
417
|
|
416
418
|
it "does not acquire locks if transaction is rolled back" do
|
417
|
-
mock(
|
418
|
-
mock(
|
419
|
+
mock(lock).acquire_lock.never
|
420
|
+
mock(lock).release_lock.never
|
419
421
|
|
420
422
|
@cache.transaction do
|
421
423
|
@cache.set(@key, value)
|
@@ -474,11 +476,11 @@ module Cash
|
|
474
476
|
|
475
477
|
it "acquire locks in lexical order for all keys" do
|
476
478
|
keys = ['c', 'a', 'b']
|
477
|
-
keys.sort.inject(mock(
|
479
|
+
keys.sort.inject(mock(lock)) do |mock, key|
|
478
480
|
mock.acquire_lock(key).then
|
479
481
|
end
|
480
482
|
keys.each { |key| mock($memcache).set(key, @value) }
|
481
|
-
keys.each { |key| mock(
|
483
|
+
keys.each { |key| mock(lock).release_lock(key) }
|
482
484
|
@cache.transaction do
|
483
485
|
@cache.set(keys[0], @value)
|
484
486
|
@cache.transaction do
|
@@ -504,8 +506,8 @@ module Cash
|
|
504
506
|
|
505
507
|
describe 'Error Handling' do
|
506
508
|
it "releases locks even if memcache blows up" do
|
507
|
-
mock(
|
508
|
-
mock(
|
509
|
+
mock(lock).acquire_lock(@key)
|
510
|
+
mock(lock).release_lock(@key)
|
509
511
|
stub($memcache).set(anything, anything) { raise }
|
510
512
|
@cache.transaction do
|
511
513
|
@cache.transaction do
|
@@ -543,8 +545,8 @@ module Cash
|
|
543
545
|
end
|
544
546
|
|
545
547
|
it "not acquire locks if transaction is rolled back" do
|
546
|
-
mock(
|
547
|
-
mock(
|
548
|
+
mock(lock).acquire_lock.never
|
549
|
+
mock(lock).release_lock.never
|
548
550
|
|
549
551
|
@cache.transaction do
|
550
552
|
@cache.transaction do
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Cash do
|
4
|
+
describe 'when disabled' do
|
5
|
+
before(:each) do
|
6
|
+
Cash.enabled = false
|
7
|
+
|
8
|
+
mock($memcache).get.never
|
9
|
+
mock($memcache).add.never
|
10
|
+
mock($memcache).set.never
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
Cash.enabled = true
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'creates and looks up objects without using cache' do
|
18
|
+
story = Story.create!
|
19
|
+
Story.find(story.id).should == story
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'updates objects without using cache' do
|
23
|
+
story = Story.create!
|
24
|
+
story.title = 'test'
|
25
|
+
story.save!
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should find using indexed condition without using cache' do
|
29
|
+
Story.find(:all, :conditions => {:title => 'x'})
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -64,6 +64,13 @@ module Cash
|
|
64
64
|
Story.get("title/").should == nil
|
65
65
|
end
|
66
66
|
end
|
67
|
+
|
68
|
+
it 'should not remember instance variables' do
|
69
|
+
story = Story.new(:title => 'story')
|
70
|
+
story.instance_eval { @forgetme = "value" }
|
71
|
+
story.save!
|
72
|
+
Story.find(story.id).instance_variables.should_not include("@forgetme")
|
73
|
+
end
|
67
74
|
end
|
68
75
|
|
69
76
|
describe 'after update' do
|
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
dir = File.dirname(__FILE__)
|
2
2
|
$LOAD_PATH.unshift "#{dir}/../lib"
|
3
3
|
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler'
|
6
|
+
|
4
7
|
require File.join(dir, '../config/environment')
|
5
8
|
require 'spec'
|
6
9
|
require 'pp'
|
7
10
|
require 'cache_money'
|
8
|
-
#require 'memcache'
|
9
|
-
require 'memcached'
|
10
|
-
require 'memcached_wrapper'
|
11
11
|
|
12
12
|
Spec::Runner.configure do |config|
|
13
13
|
config.mock_with :rr
|
@@ -15,8 +15,32 @@ Spec::Runner.configure do |config|
|
|
15
15
|
load File.join(dir, "../db/schema.rb")
|
16
16
|
|
17
17
|
config = YAML.load(IO.read((File.expand_path(File.dirname(__FILE__) + "/../config/memcached.yml"))))['test']
|
18
|
-
|
19
|
-
|
18
|
+
|
19
|
+
case ENV['ADAPTER']
|
20
|
+
when 'memcache_client'
|
21
|
+
# Test with MemCache client
|
22
|
+
require 'cash/adapter/memcache_client'
|
23
|
+
$memcache = Cash::Adapter::MemcacheClient.new(MemCache.new(config['servers']),
|
24
|
+
:default_ttl => 1.minute.to_i)
|
25
|
+
|
26
|
+
when 'redis'
|
27
|
+
# Test with Redis client
|
28
|
+
require 'cash/adapter/redis'
|
29
|
+
require 'fakeredis'
|
30
|
+
$memcache = Cash::Adapter::Redis.new(FakeRedis::Redis.new(),
|
31
|
+
:default_ttl => 1.minute.to_i)
|
32
|
+
when 'mock'
|
33
|
+
# Test with Mock client
|
34
|
+
require 'cash/adapter/memcache_client'
|
35
|
+
require 'cash/mock'
|
36
|
+
$memcache = Cash::Adapter::MemcacheClient.new(Cash::Mock.new(),
|
37
|
+
:default_ttl => 1.minute.to_i)
|
38
|
+
else
|
39
|
+
require 'cash/adapter/memcached'
|
40
|
+
# Test with memcached client
|
41
|
+
$memcache = Cash::Adapter::Memcached.new(Memcached.new(config["servers"], config),
|
42
|
+
:default_ttl => 1.minute.to_i)
|
43
|
+
end
|
20
44
|
end
|
21
45
|
|
22
46
|
config.before :each do
|
@@ -26,8 +50,10 @@ Spec::Runner.configure do |config|
|
|
26
50
|
end
|
27
51
|
|
28
52
|
config.before :suite do
|
53
|
+
Cash.configure :repository => $memcache, :adapter => false
|
54
|
+
|
29
55
|
ActiveRecord::Base.class_eval do
|
30
|
-
is_cached
|
56
|
+
is_cached
|
31
57
|
end
|
32
58
|
|
33
59
|
Character = Class.new(ActiveRecord::Base)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ngmoco-cache-money
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash: 57
|
5
4
|
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
8
7
|
- 2
|
9
|
-
-
|
10
|
-
|
8
|
+
- 24
|
9
|
+
- 2
|
10
|
+
version: 0.2.24.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Nick Kallen
|
@@ -18,41 +18,149 @@ autorequire:
|
|
18
18
|
bindir: bin
|
19
19
|
cert_chain: []
|
20
20
|
|
21
|
-
date:
|
21
|
+
date: 2012-05-07 00:00:00 -07:00
|
22
22
|
default_executable:
|
23
23
|
dependencies:
|
24
24
|
- !ruby/object:Gem::Dependency
|
25
|
-
|
26
|
-
|
25
|
+
type: :runtime
|
26
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
28
|
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
hash: 7
|
31
30
|
segments:
|
32
31
|
- 2
|
33
32
|
- 2
|
34
33
|
- 0
|
35
34
|
version: 2.2.0
|
36
|
-
|
35
|
+
- - <
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
segments:
|
38
|
+
- 3
|
39
|
+
- 0
|
40
|
+
version: "3.0"
|
41
|
+
requirement: *id001
|
37
42
|
name: activerecord
|
38
43
|
prerelease: false
|
39
|
-
version_requirements: *id001
|
40
44
|
- !ruby/object:Gem::Dependency
|
41
|
-
|
42
|
-
|
45
|
+
type: :runtime
|
46
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
43
47
|
requirements:
|
44
48
|
- - ">="
|
45
49
|
- !ruby/object:Gem::Version
|
46
|
-
hash: 7
|
47
50
|
segments:
|
48
51
|
- 2
|
49
52
|
- 2
|
50
53
|
- 0
|
51
54
|
version: 2.2.0
|
52
|
-
|
55
|
+
- - <
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 3
|
59
|
+
- 0
|
60
|
+
version: "3.0"
|
61
|
+
requirement: *id002
|
53
62
|
name: activesupport
|
54
63
|
prerelease: false
|
55
|
-
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
type: :development
|
66
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
segments:
|
71
|
+
- 0
|
72
|
+
version: "0"
|
73
|
+
requirement: *id003
|
74
|
+
name: rake
|
75
|
+
prerelease: false
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
type: :development
|
78
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
segments:
|
83
|
+
- 0
|
84
|
+
- 10
|
85
|
+
- 0
|
86
|
+
version: 0.10.0
|
87
|
+
requirement: *id004
|
88
|
+
name: ruby-debug
|
89
|
+
prerelease: false
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
type: :development
|
92
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
segments:
|
97
|
+
- 1
|
98
|
+
- 3
|
99
|
+
- 0
|
100
|
+
version: 1.3.0
|
101
|
+
requirement: *id005
|
102
|
+
name: rspec
|
103
|
+
prerelease: false
|
104
|
+
- !ruby/object:Gem::Dependency
|
105
|
+
type: :development
|
106
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
segments:
|
111
|
+
- 0
|
112
|
+
version: "0"
|
113
|
+
requirement: *id006
|
114
|
+
name: sqlite3-ruby
|
115
|
+
prerelease: false
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
type: :development
|
118
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
segments:
|
123
|
+
- 0
|
124
|
+
version: "0"
|
125
|
+
requirement: *id007
|
126
|
+
name: rr
|
127
|
+
prerelease: false
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
type: :development
|
130
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
segments:
|
135
|
+
- 0
|
136
|
+
version: "0"
|
137
|
+
requirement: *id008
|
138
|
+
name: memcached
|
139
|
+
prerelease: false
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
type: :development
|
142
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
segments:
|
147
|
+
- 0
|
148
|
+
version: "0"
|
149
|
+
requirement: *id009
|
150
|
+
name: memcache-client
|
151
|
+
prerelease: false
|
152
|
+
- !ruby/object:Gem::Dependency
|
153
|
+
type: :development
|
154
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
segments:
|
159
|
+
- 0
|
160
|
+
version: "0"
|
161
|
+
requirement: *id010
|
162
|
+
name: fakeredis
|
163
|
+
prerelease: false
|
56
164
|
description: Write-through and Read-through Cacheing for ActiveRecord
|
57
165
|
email: teamplatform@ngmoco.com
|
58
166
|
executables: []
|
@@ -68,9 +176,11 @@ files:
|
|
68
176
|
- README
|
69
177
|
- TODO
|
70
178
|
- UNSUPPORTED_FEATURES
|
71
|
-
- init.rb
|
72
179
|
- lib/cache_money.rb
|
73
180
|
- lib/cash/accessor.rb
|
181
|
+
- lib/cash/adapter/memcache_client.rb
|
182
|
+
- lib/cash/adapter/memcached.rb
|
183
|
+
- lib/cash/adapter/redis.rb
|
74
184
|
- lib/cash/buffered.rb
|
75
185
|
- lib/cash/config.rb
|
76
186
|
- lib/cash/fake.rb
|
@@ -87,62 +197,43 @@ files:
|
|
87
197
|
- lib/cash/transactional.rb
|
88
198
|
- lib/cash/util/array.rb
|
89
199
|
- lib/cash/util/marshal.rb
|
200
|
+
- lib/cash/version.rb
|
90
201
|
- lib/cash/write_through.rb
|
91
202
|
- lib/mem_cached_session_store.rb
|
92
203
|
- lib/mem_cached_support_store.rb
|
93
|
-
- lib/memcached_wrapper.rb
|
94
204
|
- rails/init.rb
|
205
|
+
- init.rb
|
95
206
|
- LICENSE
|
96
207
|
- README.markdown
|
97
|
-
- config/environment.rb
|
98
|
-
- config/memcached.yml
|
99
|
-
- db/schema.rb
|
100
|
-
- spec/cash/accessor_spec.rb
|
101
|
-
- spec/cash/active_record_spec.rb
|
102
|
-
- spec/cash/buffered_spec.rb
|
103
|
-
- spec/cash/calculations_spec.rb
|
104
|
-
- spec/cash/finders_spec.rb
|
105
|
-
- spec/cash/local_buffer_spec.rb
|
106
|
-
- spec/cash/local_spec.rb
|
107
|
-
- spec/cash/lock_spec.rb
|
108
|
-
- spec/cash/marshal_spec.rb
|
109
|
-
- spec/cash/order_spec.rb
|
110
|
-
- spec/cash/transactional_spec.rb
|
111
|
-
- spec/cash/window_spec.rb
|
112
|
-
- spec/cash/write_through_spec.rb
|
113
|
-
- spec/memcached_wrapper_test.rb
|
114
|
-
- spec/spec_helper.rb
|
115
208
|
has_rdoc: true
|
116
209
|
homepage: http://github.com/ngmoco/cache-money
|
117
210
|
licenses: []
|
118
211
|
|
119
212
|
post_install_message:
|
120
|
-
rdoc_options:
|
121
|
-
|
213
|
+
rdoc_options: []
|
214
|
+
|
122
215
|
require_paths:
|
123
216
|
- lib
|
124
217
|
required_ruby_version: !ruby/object:Gem::Requirement
|
125
|
-
none: false
|
126
218
|
requirements:
|
127
219
|
- - ">="
|
128
220
|
- !ruby/object:Gem::Version
|
129
|
-
hash: 3
|
130
221
|
segments:
|
131
222
|
- 0
|
132
223
|
version: "0"
|
133
224
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
134
|
-
none: false
|
135
225
|
requirements:
|
136
|
-
- - "
|
226
|
+
- - "="
|
137
227
|
- !ruby/object:Gem::Version
|
138
|
-
hash: 3
|
139
228
|
segments:
|
140
|
-
-
|
141
|
-
|
229
|
+
- 1
|
230
|
+
- 3
|
231
|
+
- 7
|
232
|
+
version: 1.3.7
|
142
233
|
requirements: []
|
143
234
|
|
144
235
|
rubyforge_project:
|
145
|
-
rubygems_version: 1.3.
|
236
|
+
rubygems_version: 1.3.6
|
146
237
|
signing_key:
|
147
238
|
specification_version: 3
|
148
239
|
summary: Write-through and Read-through Cacheing for ActiveRecord
|
@@ -162,6 +253,6 @@ test_files:
|
|
162
253
|
- spec/cash/order_spec.rb
|
163
254
|
- spec/cash/transactional_spec.rb
|
164
255
|
- spec/cash/window_spec.rb
|
256
|
+
- spec/cash/without_caching_spec.rb
|
165
257
|
- spec/cash/write_through_spec.rb
|
166
|
-
- spec/memcached_wrapper_test.rb
|
167
258
|
- spec/spec_helper.rb
|