mongo-lock 1.1.4 → 1.2.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.
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