mongo-lock 1.1.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +8 -8
  2. data/Gemfile.lock +41 -38
  3. data/README.md +7 -4
  4. data/lib/mongo-lock.rb +22 -37
  5. data/lib/mongo-lock/configuration.rb +38 -4
  6. data/lib/mongo-lock/drivers/base.rb +41 -0
  7. data/lib/mongo-lock/drivers/mongo.rb +99 -0
  8. data/lib/mongo-lock/drivers/moped.rb +62 -0
  9. data/lib/mongo-lock/send_with_raise_methods.rb +28 -0
  10. data/lib/mongo-lock/version.rb +1 -1
  11. data/mongo-lock.gemspec +4 -3
  12. data/spec/configuration_spec.rb +66 -0
  13. data/spec/configure_spec.rb +8 -2
  14. data/spec/examples/acquire_example.rb +219 -0
  15. data/spec/examples/acquired_example.rb +54 -0
  16. data/spec/examples/available_example.rb +70 -0
  17. data/spec/examples/clear_expired_example.rb +100 -0
  18. data/spec/examples/ensure_indexes_example.rb +38 -0
  19. data/spec/examples/expired_example.rb +41 -0
  20. data/spec/examples/extend_by_example.rb +137 -0
  21. data/spec/examples/release_all_example.rb +117 -0
  22. data/spec/examples/release_example.rb +166 -0
  23. data/spec/initialise_spec.rb +2 -0
  24. data/spec/mongo_driver_spec.rb +22 -0
  25. data/spec/moped_driver_spec.rb +22 -0
  26. data/spec/rake_spec.rb +1 -1
  27. data/spec/spec_helper.rb +2 -7
  28. data/spec/support/mongo_helper.rb +41 -0
  29. metadata +58 -23
  30. data/lib/mongo-lock/mongo_queries.rb +0 -97
  31. data/spec/acquire_spec.rb +0 -217
  32. data/spec/acquired_spec.rb +0 -53
  33. data/spec/available_spec.rb +0 -68
  34. data/spec/clear_expired_spec.rb +0 -98
  35. data/spec/ensure_indexes_spec.rb +0 -34
  36. data/spec/expired_spec.rb +0 -39
  37. data/spec/extend_by_spec.rb +0 -135
  38. data/spec/release_all_spec.rb +0 -115
  39. data/spec/release_spec.rb +0 -164
@@ -0,0 +1,166 @@
1
+ shared_examples "MongoLock driver that can release locks" do
2
+
3
+ describe Mongo::Lock do
4
+
5
+ let(:lock) { Mongo::Lock.acquire('my_lock', owner: 'spence', expire_in: 0.1.seconds, timeout_in: 0.01, frequency: 0.01) }
6
+
7
+ describe '.release' do
8
+
9
+ it "creates a new Mongo::Lock instance" do
10
+ lock
11
+ expect(Mongo::Lock.release 'my_lock', owner: 'spence').to be_a Mongo::Lock
12
+ end
13
+
14
+ it "calls #release to release the lock" do
15
+ expect_any_instance_of(Mongo::Lock).to receive(:release)
16
+ Mongo::Lock.release 'my_lock', owner: 'spence'
17
+ end
18
+
19
+ context "when options are provided" do
20
+
21
+ it "passes them to the new lock" do
22
+ l = Mongo::Lock.release 'my_lock', owner: 'spence'
23
+ # expect(l.configuration.owner).to eql 'spence'
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ describe '#release' do
31
+
32
+ context "when lock is acquired" do
33
+
34
+ before :each do
35
+ my_collection.insert key: 'my_lock', owner: 'spence'
36
+ end
37
+
38
+ let(:lock) { Mongo::Lock.acquire 'my_lock', owner: 'spence' }
39
+
40
+ it "releases the lock" do
41
+ lock.release
42
+ expect(my_collection.find(key: 'my_lock', owner: 'spence').count).to be 0
43
+ end
44
+
45
+ it "returns true" do
46
+ expect(lock.release).to be_true
47
+ end
48
+
49
+ end
50
+
51
+ context "when the lock isn't acquired" do
52
+
53
+ let(:lock) { Mongo::Lock.new 'my_lock', timeout_in: 0.01, frequency: 0.01 }
54
+
55
+ it "acquires the lock first" do
56
+ expect(lock).to receive(:acquire).and_call_original
57
+ lock.release
58
+ end
59
+
60
+ it "returns true" do
61
+ expect(lock.release).to be_true
62
+ end
63
+
64
+ end
65
+
66
+ context "when the lock isn't acquired and cant be" do
67
+
68
+ let(:lock) { Mongo::Lock.new 'my_lock', timeout_in: 1, frequency: 0.01 }
69
+
70
+ it "returns false" do
71
+ my_collection.insert key: 'my_lock', owner: 'tobie', expires_at: 1.seconds.from_now
72
+ expect(lock.release timeout_in: 0.01).to be_false
73
+ end
74
+
75
+ it "doesn't release the lock" do
76
+ my_collection.insert key: 'my_lock', owner: 'tobie', expires_at: 1.seconds.from_now
77
+ lock.release timeout_in: 0.01
78
+ expect(my_collection.find(key: 'my_lock', owner: 'tobie').count).to be 1
79
+ end
80
+
81
+ end
82
+
83
+ context "when the lock was acquired but has since expired" do
84
+
85
+ it "returns true" do
86
+ lock
87
+ sleep 0.2
88
+ expect(lock.release).to be_true
89
+ end
90
+
91
+ end
92
+
93
+ context "when the lock was acquired but has already been released" do
94
+
95
+ it "returns true" do
96
+ lock.release
97
+ expect(lock.release).to be_true
98
+ end
99
+
100
+ end
101
+
102
+ context "when the lock is already acquired but by the same owner in a different instance" do
103
+
104
+ let (:different_instance) { Mongo::Lock.release 'my_lock', owner: 'spence' }
105
+
106
+ it "releases the lock" do
107
+ lock
108
+ different_instance.release
109
+ expect(my_collection.find(key: 'my_lock', owner: 'spence').count).to be 0
110
+ end
111
+
112
+ it "returns true" do
113
+ lock
114
+ expect(different_instance.release).to be_true
115
+ end
116
+
117
+ end
118
+
119
+ context "when the raise option is set to true" do
120
+
121
+ let(:lock) { Mongo::Lock.new 'my_lock', should_raise: true, timeout_in: 0.1, frequency: 0.01 }
122
+
123
+ context "when the lock isn't acquired and cant be" do
124
+
125
+ it "raises Mongo::Lock::NotReleasedError" do
126
+ my_collection.insert key: 'my_lock', owner: 'tobie', expires_at: 1.seconds.from_now
127
+ expect{ lock.release }.to raise_error Mongo::Lock::NotReleasedError
128
+ end
129
+
130
+ end
131
+
132
+ end
133
+
134
+ context "when options are provided" do
135
+
136
+ it "they override the defaults" do
137
+ my_collection.insert key: 'my_lock', owner: 'tobie', expires_at: 1.seconds.from_now
138
+ expect(lock.release owner: 'tobie').to be_true
139
+ expect(my_collection.find(key: 'my_lock', owner: 'tobie').count).to be 0
140
+ end
141
+
142
+ end
143
+
144
+ end
145
+
146
+ describe '.release!' do
147
+
148
+ it "calls .release with raise errors option set to true" do
149
+ expect(Mongo::Lock).to receive(:init_and_send).with('my_lock', { owner: 'tobie' }, :release!)
150
+ Mongo::Lock.release! 'my_lock', owner: 'tobie'
151
+ end
152
+
153
+ end
154
+
155
+ describe '#release!' do
156
+
157
+ it "calls .release with raise errors option set to true" do
158
+ expect(lock).to receive(:release).with({ limit: 3, should_raise: true })
159
+ lock.release! limit: 3
160
+ end
161
+
162
+ end
163
+
164
+ end
165
+
166
+ end
@@ -2,6 +2,8 @@ require 'spec_helper'
2
2
 
3
3
  describe Mongo::Lock do
4
4
 
5
+ configure_for_mongo
6
+
5
7
  describe '#initialise' do
6
8
 
7
9
  let(:lock) { Mongo::Lock.new 'my_lock', owner: 'spence', timeout_in: 0.01, frequency: 0.01 }
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'mongo-lock/drivers/mongo'
3
+
4
+ describe Mongo::Lock::Drivers::Mongo do
5
+
6
+ let(:collection1) { my_collection }
7
+ let(:collection2) { other_collection }
8
+ let(:collection3) { another_collection }
9
+
10
+ configure_for_mongo
11
+
12
+ it_behaves_like "MongoLock driver that can aquire locks"
13
+ it_behaves_like "MongoLock driver that can find if a lock is acquired"
14
+ it_behaves_like "MongoLock driver that can find if a lock is available"
15
+ it_behaves_like "MongoLock driver that can clear expired locks"
16
+ it_behaves_like "MongoLock driver that can ensure indexes"
17
+ it_behaves_like "MongoLock driver that can find if a lock have expired"
18
+ it_behaves_like "MongoLock driver that can extend locks"
19
+ it_behaves_like "MongoLock driver that can release all locks"
20
+ it_behaves_like "MongoLock driver that can release locks"
21
+
22
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'mongo-lock/drivers/moped'
3
+
4
+ describe Mongo::Lock::Drivers::Moped do
5
+
6
+ let(:collection1) { my_moped_collection }
7
+ let(:collection2) { other_moped_collection }
8
+ let(:collection3) { another_moped_collection }
9
+
10
+ configure_for_moped
11
+
12
+ it_behaves_like "MongoLock driver that can aquire locks"
13
+ it_behaves_like "MongoLock driver that can find if a lock is acquired"
14
+ it_behaves_like "MongoLock driver that can find if a lock is available"
15
+ it_behaves_like "MongoLock driver that can clear expired locks"
16
+ it_behaves_like "MongoLock driver that can ensure indexes"
17
+ it_behaves_like "MongoLock driver that can find if a lock have expired"
18
+ it_behaves_like "MongoLock driver that can extend locks"
19
+ it_behaves_like "MongoLock driver that can release all locks"
20
+ it_behaves_like "MongoLock driver that can release locks"
21
+
22
+ end
@@ -4,7 +4,7 @@ require 'rake'
4
4
  load 'mongo-lock/railties/mongo.rake'
5
5
  task :environment do ; end
6
6
 
7
- describe 'mongolock' do
7
+ describe 'rake tasks' do
8
8
 
9
9
  describe 'mongolock:clear_expired' do
10
10
 
@@ -3,6 +3,7 @@ Coveralls.wear!
3
3
  require 'rails'
4
4
  require 'mongo-lock'
5
5
  require 'mongo'
6
+ require 'moped'
6
7
  require 'active_support/core_ext/numeric/time'
7
8
 
8
9
  RSpec.configure do |config|
@@ -18,18 +19,12 @@ RSpec.configure do |config|
18
19
  config.filter_run_excluding :wip => true
19
20
 
20
21
  Dir[File.expand_path("../support/**/*.rb", __FILE__)].each {|f| require f }
22
+ Dir[File.expand_path("../examples/**/*.rb", __FILE__)].each {|f| require f }
21
23
 
22
24
  require 'pry'
23
25
 
24
26
  include MongoHelper
25
27
 
26
- config.before :each do
27
- database.drop_collection("locks")
28
- database.drop_collection("other_locks")
29
- database.drop_collection("another_locks")
30
- Mongo::Lock.configure collection: my_collection
31
- end
32
-
33
28
  config.after :each do
34
29
  end
35
30
 
@@ -1,5 +1,15 @@
1
1
  module MongoHelper
2
2
 
3
+ def configure_for_mongo
4
+ before :each do
5
+ Mongo::Lock.configure collections: {}
6
+ database.drop_collection("locks")
7
+ database.drop_collection("other_locks")
8
+ database.drop_collection("another_locks")
9
+ Mongo::Lock.configure collection: my_collection
10
+ end
11
+ end
12
+
3
13
  def connection
4
14
  @connection ||= Mongo::Connection.new("localhost")
5
15
  end
@@ -20,4 +30,35 @@ module MongoHelper
20
30
  @another_collection ||= database.collection :another_locks
21
31
  end
22
32
 
33
+ def configure_for_moped
34
+ before :each do
35
+ Mongo::Lock.configure collections: {}
36
+ database.drop_collection("locks")
37
+ database.drop_collection("other_locks")
38
+ database.drop_collection("another_locks")
39
+ Mongo::Lock.configure collection: my_moped_collection
40
+ end
41
+ end
42
+
43
+ def moped_connection
44
+ @moped_connection ||= Moped::Session.new([ "127.0.0.1:27017" ])
45
+ end
46
+
47
+ def moped_database
48
+ moped_connection.use "mongo_lock_tests"
49
+ moped_connection
50
+ end
51
+
52
+ def my_moped_collection
53
+ @my_moped_collection ||= moped_database[:locks]
54
+ end
55
+
56
+ def other_moped_collection
57
+ @other_moped_collection ||= moped_database[:other_locks]
58
+ end
59
+
60
+ def another_moped_collection
61
+ @another_moped_collection ||= moped_database[:another_locks]
62
+ end
63
+
23
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo-lock
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.4
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Spence
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-14 00:00:00.000000000 Z
11
+ date: 2014-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongo
@@ -17,7 +17,21 @@ dependencies:
17
17
  - - ! '>='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
- type: :runtime
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ! '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: moped
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ! '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
@@ -95,7 +109,7 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: rails
112
+ name: bson_ext
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - ! '>='
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - ! '>='
109
123
  - !ruby/object:Gem::Version
110
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rails
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 4.0.0
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 4.0.0
111
139
  description: Key based pessimistic locking for Ruby and MongoDB. Is this key avaliable?
112
140
  Yes - Lock it for me for a sec will you. No - OK I'll just wait here until its ready.
113
141
  email: msaspence@gmail.com
@@ -127,24 +155,29 @@ files:
127
155
  - lib/mongo-lock.rb
128
156
  - lib/mongo-lock/class_convenience_methods.rb
129
157
  - lib/mongo-lock/configuration.rb
130
- - lib/mongo-lock/mongo_queries.rb
158
+ - lib/mongo-lock/drivers/base.rb
159
+ - lib/mongo-lock/drivers/mongo.rb
160
+ - lib/mongo-lock/drivers/moped.rb
131
161
  - lib/mongo-lock/railtie.rb
132
162
  - lib/mongo-lock/railties/mongo.rake
163
+ - lib/mongo-lock/send_with_raise_methods.rb
133
164
  - lib/mongo-lock/version.rb
134
165
  - mongo-lock.gemspec
135
- - spec/acquire_spec.rb
136
- - spec/acquired_spec.rb
137
- - spec/available_spec.rb
138
- - spec/clear_expired_spec.rb
139
166
  - spec/configuration_spec.rb
140
167
  - spec/configure_spec.rb
141
- - spec/ensure_indexes_spec.rb
142
- - spec/expired_spec.rb
143
- - spec/extend_by_spec.rb
168
+ - spec/examples/acquire_example.rb
169
+ - spec/examples/acquired_example.rb
170
+ - spec/examples/available_example.rb
171
+ - spec/examples/clear_expired_example.rb
172
+ - spec/examples/ensure_indexes_example.rb
173
+ - spec/examples/expired_example.rb
174
+ - spec/examples/extend_by_example.rb
175
+ - spec/examples/release_all_example.rb
176
+ - spec/examples/release_example.rb
144
177
  - spec/initialise_spec.rb
178
+ - spec/mongo_driver_spec.rb
179
+ - spec/moped_driver_spec.rb
145
180
  - spec/rake_spec.rb
146
- - spec/release_all_spec.rb
147
- - spec/release_spec.rb
148
181
  - spec/spec_helper.rb
149
182
  - spec/support/mongo_helper.rb
150
183
  homepage: https://github.com/trakio/mongo-lock
@@ -172,18 +205,20 @@ signing_key:
172
205
  specification_version: 4
173
206
  summary: Pessimistic locking for Ruby and MongoDB
174
207
  test_files:
175
- - spec/acquire_spec.rb
176
- - spec/acquired_spec.rb
177
- - spec/available_spec.rb
178
- - spec/clear_expired_spec.rb
179
208
  - spec/configuration_spec.rb
180
209
  - spec/configure_spec.rb
181
- - spec/ensure_indexes_spec.rb
182
- - spec/expired_spec.rb
183
- - spec/extend_by_spec.rb
210
+ - spec/examples/acquire_example.rb
211
+ - spec/examples/acquired_example.rb
212
+ - spec/examples/available_example.rb
213
+ - spec/examples/clear_expired_example.rb
214
+ - spec/examples/ensure_indexes_example.rb
215
+ - spec/examples/expired_example.rb
216
+ - spec/examples/extend_by_example.rb
217
+ - spec/examples/release_all_example.rb
218
+ - spec/examples/release_example.rb
184
219
  - spec/initialise_spec.rb
220
+ - spec/mongo_driver_spec.rb
221
+ - spec/moped_driver_spec.rb
185
222
  - spec/rake_spec.rb
186
- - spec/release_all_spec.rb
187
- - spec/release_spec.rb
188
223
  - spec/spec_helper.rb
189
224
  - spec/support/mongo_helper.rb