sidekiq-lock 0.0.1 → 0.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.
@@ -1,7 +1,12 @@
1
1
  language: ruby
2
2
 
3
+ services:
4
+ - redis-server
5
+
3
6
  rvm:
4
7
  - 1.9.3
8
+ - jruby-19mode
9
+ - rbx
5
10
  - 2.0.0
6
11
 
7
12
  notifications:
@@ -1,3 +1,23 @@
1
+ ## 0.2.0
2
+
3
+ - ability to globally configure `lock` method name
4
+
5
+ ``` ruby
6
+ Sidekiq.configure_server do |config|
7
+ config.lock_method = :redis_lock
8
+ end
9
+ ```
10
+
11
+ - added inline test helper, by requiring `sidekiq/lock/testing/inline`
12
+ you will have access to two methods:
13
+
14
+ - `set_sidekiq_lock(worker_class, payload)`
15
+
16
+ - `clear_sidekiq_lock`
17
+
18
+ That will setup `RedisLock` under proper thread variable.
19
+ This can be handy if you test your workers inline (without full stack middleware)
20
+
1
21
  ## 0.0.1
2
22
 
3
23
  - Initial release
data/Gemfile CHANGED
@@ -1,4 +1,8 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in sidekiq-lock.gemspec
1
+ source "https://rubygems.org"
4
2
  gemspec
3
+
4
+ platforms :rbx do
5
+ gem "rubysl", "~> 2.0" # if using anything in the ruby standard library
6
+ gem "rubinius-developer_tools", "~> 2.0.0" # if using any of coverage, debugger, profiler
7
+ gem "minitest" # if using minitest
8
+ end
data/README.md CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  [![Code Climate](https://codeclimate.com/github/emq/sidekiq-lock.png)](https://codeclimate.com/github/emq/sidekiq-lock)
4
4
  [![Build Status](https://travis-ci.org/emq/sidekiq-lock.png?branch=master)](https://travis-ci.org/emq/sidekiq-lock)
5
+ [![Coverage Status](https://coveralls.io/repos/emq/sidekiq-lock/badge.png)](https://coveralls.io/r/emq/sidekiq-lock)
6
+ [![Dependency Status](https://gemnasium.com/emq/sidekiq-lock.png)](https://gemnasium.com/emq/sidekiq-lock)
7
+ [![Gem Version](https://badge.fury.io/rb/sidekiq-lock.png)](http://badge.fury.io/rb/sidekiq-lock)
5
8
 
6
9
  Redis-based simple locking mechanism for [sidekiq][2]. Uses [SET command][1] introduced in Redis 2.6.16.
7
10
 
@@ -90,6 +93,23 @@ end
90
93
 
91
94
  Just be sure to provide valid redis key as a lock name.
92
95
 
96
+ ### Customizing lock method name
97
+
98
+ You can change `lock` to something else (globally) in sidekiq server configuration:
99
+
100
+ ``` ruby
101
+ Sidekiq.configure_server do |config|
102
+ config.lock_method = :redis_lock
103
+ end
104
+ ```
105
+
106
+ ### Inline testing
107
+
108
+ As you know middleware is not invoked when testing jobs inline, you can require in your test/spec helper file `sidekiq/lock/testing/inline` to include two methods that will help you setting / clearing up lock manually:
109
+
110
+ - `set_sidekiq_lock(worker_class, payload)` - note: payload should be an array of worker arguments
111
+ - `clear_sidekiq_lock`
112
+
93
113
  ## Contributing
94
114
 
95
115
  1. Fork it
@@ -1,9 +1,18 @@
1
- require "sidekiq/lock/version"
2
- require "sidekiq/lock/worker"
3
1
  require "sidekiq/lock/middleware"
4
2
  require "sidekiq/lock/redis_lock"
3
+ require "sidekiq/lock/version"
4
+ require "sidekiq/lock/worker"
5
5
 
6
6
  module Sidekiq
7
+
8
+ def self.lock_method
9
+ @lock_method || :lock
10
+ end
11
+
12
+ def self.lock_method=(method)
13
+ @lock_method = method
14
+ end
15
+
7
16
  module Lock
8
17
  THREAD_KEY = :sidekiq_lock
9
18
  end
@@ -14,3 +23,4 @@ Sidekiq.configure_server do |config|
14
23
  chain.add Sidekiq::Lock::Middleware
15
24
  end
16
25
  end
26
+
@@ -0,0 +1,8 @@
1
+ def set_sidekiq_lock(worker_class, payload)
2
+ options = worker_class.get_sidekiq_options['lock']
3
+ Thread.current[Sidekiq::Lock::THREAD_KEY] = Sidekiq::Lock::RedisLock.new(options, payload)
4
+ end
5
+
6
+ def clear_sidekiq_lock
7
+ Thread.current[Sidekiq::Lock::THREAD_KEY] = nil
8
+ end
@@ -1,5 +1,5 @@
1
1
  module Sidekiq
2
2
  module Lock
3
- VERSION = "0.0.1"
3
+ VERSION = "0.2.0"
4
4
  end
5
5
  end
@@ -2,8 +2,10 @@ module Sidekiq
2
2
  module Lock
3
3
  module Worker
4
4
 
5
- def lock
6
- Thread.current[Sidekiq::Lock::THREAD_KEY]
5
+ def self.included(base)
6
+ base.send(:define_method, Sidekiq.lock_method) do
7
+ Thread.current[Sidekiq::Lock::THREAD_KEY]
8
+ end
7
9
  end
8
10
 
9
11
  end
@@ -23,4 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "bundler", "~> 1.3"
24
24
  spec.add_development_dependency "rake"
25
25
  spec.add_development_dependency "rack-test"
26
+ spec.add_development_dependency "coveralls", "~> 0.7.0"
27
+ spec.add_development_dependency "mocha", "~> 0.14.0"
26
28
  end
@@ -1,38 +1,13 @@
1
1
  require "test_helper"
2
2
 
3
- class LockWorker
4
- include Sidekiq::Worker
5
- include Sidekiq::Lock::Worker
6
- sidekiq_options lock: { timeout: 1, name: 'lock-worker' }
7
- end
8
-
9
- class DynamicLockWorker
10
- include Sidekiq::Worker
11
- include Sidekiq::Lock::Worker
12
- sidekiq_options lock: {
13
- timeout: proc { |user_id, timeout| timeout*2 },
14
- name: proc { |user_id, timeout| "lock:#{user_id}" }
15
- }
16
- end
17
-
18
- class RegularWorker
19
- include Sidekiq::Worker
20
- include Sidekiq::Lock::Worker
21
- end
22
-
23
-
24
3
  module Sidekiq
25
4
  module Lock
26
5
  describe Middleware do
27
6
 
28
- def thread_variable
29
- Thread.current[Sidekiq::Lock::THREAD_KEY]
30
- end
31
-
32
7
  before do
33
8
  Sidekiq.redis = REDIS
34
9
  Sidekiq.redis { |c| c.flushdb }
35
- Thread.current[Sidekiq::Lock::THREAD_KEY] = nil
10
+ set_lock_variable!
36
11
  end
37
12
 
38
13
  let(:handler){ Sidekiq::Lock::Middleware.new }
@@ -42,7 +17,7 @@ module Sidekiq
42
17
  true
43
18
  end
44
19
 
45
- assert_kind_of RedisLock, thread_variable
20
+ assert_kind_of RedisLock, lock_thread_variable
46
21
  end
47
22
 
48
23
  it 'sets lock variable with provided dynamic options' do
@@ -50,8 +25,8 @@ module Sidekiq
50
25
  true
51
26
  end
52
27
 
53
- assert_equal "lock:1234", thread_variable.name
54
- assert_equal 2000, thread_variable.timeout
28
+ assert_equal "lock:1234", lock_thread_variable.name
29
+ assert_equal 2000, lock_thread_variable.timeout
55
30
  end
56
31
 
57
32
  it 'sets nothing for workers without lock options' do
@@ -59,7 +34,7 @@ module Sidekiq
59
34
  true
60
35
  end
61
36
 
62
- assert_nil thread_variable
37
+ assert_nil lock_thread_variable
63
38
  end
64
39
 
65
40
  end
@@ -32,6 +32,11 @@ module Sidekiq
32
32
  assert RedisLock.new({ 'timeout' => 500, 'name' => 'lock-name' }, [])
33
33
  end
34
34
 
35
+ it "is released by default" do
36
+ lock = RedisLock.new({ 'timeout' => 500, 'name' => 'lock-name' }, [])
37
+ refute lock.acquired?
38
+ end
39
+
35
40
  it "can accept block as arguments" do
36
41
  lock = RedisLock.new({
37
42
  'timeout' => proc { |options| options['timeout'] * 2 },
@@ -0,0 +1,22 @@
1
+ require "test_helper"
2
+ require "sidekiq/lock/testing/inline"
3
+
4
+ describe "inline test helper" do
5
+
6
+ after { set_lock_variable! }
7
+
8
+ it "has helper fuction for setting lock" do
9
+ Sidekiq::Lock::RedisLock.expects(:new).with({ timeout: 1, name: 'lock-worker' }, 'worker argument').returns('lock set')
10
+ set_sidekiq_lock(LockWorker, 'worker argument')
11
+ assert_equal 'lock set', lock_thread_variable
12
+ end
13
+
14
+ it "has helper fuction for clearing lock" do
15
+ set_lock_variable! "test"
16
+ assert_equal "test", lock_thread_variable
17
+
18
+ clear_sidekiq_lock
19
+ assert_nil lock_thread_variable
20
+ end
21
+
22
+ end
@@ -4,11 +4,26 @@ module Sidekiq
4
4
  module Lock
5
5
  describe Worker do
6
6
 
7
+ after { set_lock_variable! }
8
+
7
9
  it 'sets lock method that points to thread variable' do
8
- Thread.current[Sidekiq::Lock::THREAD_KEY] = "test"
10
+ set_lock_variable! "test"
9
11
  assert_equal "test", LockWorker.new.lock
10
12
  end
11
13
 
14
+ it 'allows method name configuration' do
15
+ Sidekiq.lock_method = :custom_lock_name
16
+
17
+ class WorkerWithCustomLockName
18
+ include Sidekiq::Worker
19
+ include Sidekiq::Lock::Worker
20
+ end
21
+
22
+ set_lock_variable! "custom_name"
23
+
24
+ assert_equal "custom_name", WorkerWithCustomLockName.new.custom_lock_name
25
+ end
26
+
12
27
  end
13
28
  end
14
29
  end
@@ -1,11 +1,16 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
1
4
  Encoding.default_external = Encoding::UTF_8
2
5
  Encoding.default_internal = Encoding::UTF_8
3
6
 
4
7
  require "minitest/autorun"
5
8
  require "minitest/pride"
9
+ require "mocha/setup"
6
10
 
7
11
  require "sidekiq"
8
12
  require "sidekiq-lock"
13
+ require "test_workers"
9
14
 
10
15
  Sidekiq.logger.level = Logger::ERROR
11
16
 
@@ -16,3 +21,11 @@ def redis(command, *args)
16
21
  c.send(command, *args)
17
22
  end
18
23
  end
24
+
25
+ def set_lock_variable!(value = nil)
26
+ Thread.current[Sidekiq::Lock::THREAD_KEY] = value
27
+ end
28
+
29
+ def lock_thread_variable
30
+ Thread.current[Sidekiq::Lock::THREAD_KEY]
31
+ end
@@ -0,0 +1,19 @@
1
+ class LockWorker
2
+ include Sidekiq::Worker
3
+ include Sidekiq::Lock::Worker
4
+ sidekiq_options lock: { timeout: 1, name: 'lock-worker' }
5
+ end
6
+
7
+ class DynamicLockWorker
8
+ include Sidekiq::Worker
9
+ include Sidekiq::Lock::Worker
10
+ sidekiq_options lock: {
11
+ timeout: proc { |user_id, timeout| timeout*2 },
12
+ name: proc { |user_id, timeout| "lock:#{user_id}" }
13
+ }
14
+ end
15
+
16
+ class RegularWorker
17
+ include Sidekiq::Worker
18
+ include Sidekiq::Lock::Worker
19
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-lock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-14 00:00:00.000000000 Z
12
+ date: 2013-12-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sidekiq
@@ -91,6 +91,38 @@ dependencies:
91
91
  - - ! '>='
92
92
  - !ruby/object:Gem::Version
93
93
  version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: coveralls
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ~>
100
+ - !ruby/object:Gem::Version
101
+ version: 0.7.0
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 0.7.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: mocha
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: 0.14.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.14.0
94
126
  description: Simple redis-based lock mechanism for your sidekiq workers
95
127
  email:
96
128
  - rafal.wojsznis@gmail.com
@@ -109,13 +141,16 @@ files:
109
141
  - lib/sidekiq/lock.rb
110
142
  - lib/sidekiq/lock/middleware.rb
111
143
  - lib/sidekiq/lock/redis_lock.rb
144
+ - lib/sidekiq/lock/testing/inline.rb
112
145
  - lib/sidekiq/lock/version.rb
113
146
  - lib/sidekiq/lock/worker.rb
114
147
  - sidekiq-lock.gemspec
115
148
  - test/lib/middleware_test.rb
116
149
  - test/lib/redis_lock_test.rb
150
+ - test/lib/testing/inline_test.rb
117
151
  - test/lib/worker_test.rb
118
152
  - test/test_helper.rb
153
+ - test/test_workers.rb
119
154
  homepage: https://github.com/emq/sidekiq-lock
120
155
  licenses:
121
156
  - MIT
@@ -131,7 +166,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
166
  version: '0'
132
167
  segments:
133
168
  - 0
134
- hash: 153540864602808106
169
+ hash: -2239756141932312381
135
170
  required_rubygems_version: !ruby/object:Gem::Requirement
136
171
  none: false
137
172
  requirements:
@@ -140,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
175
  version: '0'
141
176
  segments:
142
177
  - 0
143
- hash: 153540864602808106
178
+ hash: -2239756141932312381
144
179
  requirements: []
145
180
  rubyforge_project:
146
181
  rubygems_version: 1.8.25
@@ -150,5 +185,7 @@ summary: Simple redis-based lock mechanism for your sidekiq workers
150
185
  test_files:
151
186
  - test/lib/middleware_test.rb
152
187
  - test/lib/redis_lock_test.rb
188
+ - test/lib/testing/inline_test.rb
153
189
  - test/lib/worker_test.rb
154
190
  - test/test_helper.rb
191
+ - test/test_workers.rb