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.
@@ -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
@@ -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 'pulls multiple objects from the cache, not the database' do
391
- # mock(Story.connection).execute.never
392
- # Short.find(:all, :conditions => { :subtitle => @short1.subtitle },
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
 
@@ -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
- $lock.synchronize('lock_key') do
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
- $lock.synchronize('lock_key') do
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
- $lock.synchronize('lock_key') {}
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
- $lock.synchronize('lock_key') { raise } rescue nil
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
- $lock.synchronize('lock_key') do
35
- lambda { $lock.synchronize('lock_key') {} }.should_not raise_error
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
- $lock.acquire_lock("lock_key")
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
- # $lock.acquire_lock('lock_key', timeout)
51
- lambda { $lock.acquire_lock('lock_key', timeout, 1) }.should raise_error
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 to processes contend for a lock' do
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
- $lock.acquire_lock('lock_key')
59
+ lock.acquire_lock('lock_key')
58
60
  as_another_process do
59
- stub($lock).exponential_sleep
60
- lambda { $lock.acquire_lock('lock_key') }.should raise_error
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
- $lock.acquire_lock('lock_key')
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($lock).exponential_sleep
70
- lambda { $lock.acquire_lock('lock_key', timeout, retries) }.should raise_error
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($lock).sleep(initial_wait = 0.123)
78
- stub($lock).sleep(2 * initial_wait)
79
- stub($lock).sleep(4 * initial_wait)
80
- stub($lock).sleep(8 * initial_wait)
81
- $lock.acquire_lock('lock_key')
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 { $lock.acquire_lock('lock_key', Lock::DEFAULT_EXPIRY, Lock::DEFAULT_RETRY, initial_wait) }.should raise_error
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
- $lock.acquire_lock("lock_key")
107
+ lock.acquire_lock("lock_key")
102
108
  $memcache.get("lock/lock_key").should_not == nil
103
- $lock.release_lock("lock_key")
109
+ lock.release_lock("lock_key")
104
110
  $memcache.get("lock/lock_key").should == nil
105
111
  end
106
112
  end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), '..', 'spec_helper')
1
+ require 'spec_helper'
2
2
 
3
3
  describe Marshal do
4
4
  describe '#load' do
@@ -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, $lock)
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($lock).acquire_lock(@key)
235
+ mock(lock).acquire_lock(@key)
234
236
  mock($memcache).set(@key, @value)
235
- mock($lock).release_lock(@key)
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($lock).acquire_lock.never
244
- mock($lock).release_lock.never
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($lock)) do |mock, key|
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($lock).release_lock(key) }
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($lock).acquire_lock.with(@key)
267
- mock($lock).release_lock.with(@key)
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($lock).acquire_lock.never
418
- mock($lock).release_lock.never
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($lock)) do |mock, key|
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($lock).release_lock(key) }
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($lock).acquire_lock(@key)
508
- mock($lock).release_lock(@key)
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($lock).acquire_lock.never
547
- mock($lock).release_lock.never
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
@@ -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
- $memcache = MemcachedWrapper.new(config["servers"].gsub(' ', '').split(','), config)
19
- $lock = Cash::Lock.new($memcache)
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 :repository => Cash::Transactional.new($memcache, $lock)
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
- - 23
10
- version: 0.2.23
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: 2010-11-23 00:00:00 -08:00
21
+ date: 2012-05-07 00:00:00 -07:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
25
- requirement: &id001 !ruby/object:Gem::Requirement
26
- none: false
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
- type: :runtime
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
- requirement: &id002 !ruby/object:Gem::Requirement
42
- none: false
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
- type: :runtime
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
- version_requirements: *id002
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
- - --charset=UTF-8
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
- - 0
141
- version: "0"
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.7
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