sidekiq-unique-jobs 4.0.9 → 4.0.10
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sidekiq-unique-jobs might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/Appraisals +4 -0
- data/README.md +2 -3
- data/gemfiles/sidekiq_4.0.gemfile +19 -0
- data/lib/sidekiq-unique-jobs.rb +1 -5
- data/lib/sidekiq_unique_jobs/cli.rb +19 -16
- data/lib/sidekiq_unique_jobs/client/middleware.rb +7 -13
- data/lib/sidekiq_unique_jobs/lock/until_executed.rb +4 -1
- data/lib/sidekiq_unique_jobs/sidekiq_unique_ext.rb +6 -12
- data/lib/sidekiq_unique_jobs/testing/sidekiq_overrides.rb +12 -10
- data/lib/sidekiq_unique_jobs/unlockable.rb +31 -10
- data/lib/sidekiq_unique_jobs/util.rb +24 -10
- data/lib/sidekiq_unique_jobs/version.rb +1 -1
- data/sidekiq-unique-jobs.gemspec +0 -1
- data/spec/jobs/another_unique_job.rb +1 -1
- data/spec/jobs/until_executed_job.rb +1 -1
- data/spec/jobs/while_executing_job.rb +1 -1
- data/spec/lib/sidekiq_unique_jobs/client/middleware_spec.rb +1 -1
- data/spec/lib/sidekiq_unique_jobs/sidekiq_testing_enabled_spec.rb +18 -3
- data/spec/lib/sidekiq_unique_jobs/util_spec.rb +3 -3
- data/spec/spec_helper.rb +11 -14
- metadata +4 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b162c2c7699b7d27a7a0a438cac56a19bce354dd
|
4
|
+
data.tar.gz: ecc6bfc490c57b890d08f63bf9a1ea7f7b337def
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7b76bf584d09f6a1027a8496ded7fca389eb12ae96062b436236a4c309b6b8ad71e8bb82c0728ce27e1547de7f7230124467603d1486fdc11aac649f20ccd66f
|
7
|
+
data.tar.gz: c8dcbc4616bbfd5faed3a7968e27bfe0ba113a46fb7b76e9319ab80d46d864d8d5d2fc983e7e30799b2ccffc200f4f10010d2087b5030d69535aff71c70c7803
|
data/.travis.yml
CHANGED
data/Appraisals
CHANGED
data/README.md
CHANGED
@@ -194,16 +194,15 @@ There are two ways to display and remove keys regarding uniqueness. The console
|
|
194
194
|
Start the console with the following command `bundle exec jobs console`.
|
195
195
|
|
196
196
|
#### List Unique Keys
|
197
|
-
`keys '*',
|
197
|
+
`keys '*', 100`
|
198
198
|
|
199
199
|
#### Remove Unique Keys
|
200
|
-
`
|
200
|
+
`del '*', 100, false` the dry_run and count parameters are both required. This is to have some type of protection against clearing out all uniqueness.
|
201
201
|
|
202
202
|
### Command Line
|
203
203
|
|
204
204
|
`bundle exec jobs` displays help on how to use the unique jobs command line.
|
205
205
|
|
206
|
-
|
207
206
|
## Testing
|
208
207
|
|
209
208
|
To enable the testing for `sidekiq-unique-jobs`, add `require 'sidekiq_unique_jobs/testing'` to your testing helper.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# This file was generated by Appraisal
|
2
|
+
|
3
|
+
source "http://rubygems.org"
|
4
|
+
|
5
|
+
gem "appraisal", "~> 2.0.0"
|
6
|
+
gem "rspec-its", :require => false
|
7
|
+
gem "rspec-wait", :require => false
|
8
|
+
gem "sidekiq", "~> 4.0.0"
|
9
|
+
|
10
|
+
platforms :mri_22 do
|
11
|
+
gem "fasterer", :require => false
|
12
|
+
gem "benchmark-ips", :require => false
|
13
|
+
gem "pry-byebug", :require => false
|
14
|
+
gem "simplecov-json", :require => false
|
15
|
+
gem "memory_profiler", :require => false
|
16
|
+
gem "codeclimate-test-reporter", :require => false
|
17
|
+
end
|
18
|
+
|
19
|
+
gemspec :path => "../"
|
data/lib/sidekiq-unique-jobs.rb
CHANGED
@@ -56,7 +56,7 @@ module SidekiqUniqueJobs
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def redis_version
|
59
|
-
@redis_version ||= connection { |c| c.info('server')['redis_version'] }
|
59
|
+
@redis_version ||= connection { |c| c.info('server'.freeze)['redis_version'.freeze] }
|
60
60
|
end
|
61
61
|
|
62
62
|
def connection(redis_pool = nil)
|
@@ -67,10 +67,6 @@ module SidekiqUniqueJobs
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
-
def mock_redis
|
71
|
-
@redis_mock ||= MockRedis.new if defined?(MockRedis)
|
72
|
-
end
|
73
|
-
|
74
70
|
def synchronize(item, redis_pool)
|
75
71
|
Lock::WhileExecuting.synchronize(item, redis_pool) { yield }
|
76
72
|
end
|
@@ -5,30 +5,33 @@ module SidekiqUniqueJobs
|
|
5
5
|
desc 'keys PATTERN', 'list all unique keys and their expiry time'
|
6
6
|
option :count, aliases: :c, type: :numeric, default: 1000, desc: 'The max number of keys to return'
|
7
7
|
def keys(pattern)
|
8
|
-
Util.keys(pattern,
|
8
|
+
Util.keys(pattern, options[:count])
|
9
9
|
end
|
10
10
|
|
11
|
-
desc '
|
11
|
+
desc 'del PATTERN', 'deletes unique keys from redis by pattern'
|
12
12
|
option :dry_run, aliases: :d, type: :boolean, desc: 'set to false to perform deletion'
|
13
13
|
option :count, aliases: :c, type: :numeric, default: 1000, desc: 'The max number of keys to return'
|
14
|
-
def
|
15
|
-
Util.
|
14
|
+
def del(pattern)
|
15
|
+
Util.del(pattern, count, dry_run)
|
16
16
|
end
|
17
17
|
|
18
18
|
desc 'drop into a console', 'easy access to helper methods'
|
19
19
|
def console
|
20
|
-
puts "Use `keys '*',
|
21
|
-
puts "Use `del '*',
|
22
|
-
puts "Use `del '*',
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
20
|
+
puts "Use `keys '*', 1000 to display the first 1000 unique keys matching '*'"
|
21
|
+
puts "Use `del '*', 1000, true (default) to see how many keys would be deleted for the pattern '*'"
|
22
|
+
puts "Use `del '*', 1000, false to delete the first 1000 keys matching '*'"
|
23
|
+
Object.include SidekiqUniqueJobs::Util
|
24
|
+
console_class.start
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def console_class
|
30
|
+
require 'pry'
|
31
|
+
Pry
|
32
|
+
rescue LoadError
|
33
|
+
require 'irb'
|
34
|
+
IRB
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
@@ -4,36 +4,30 @@ module SidekiqUniqueJobs
|
|
4
4
|
module Client
|
5
5
|
class Middleware
|
6
6
|
extend Forwardable
|
7
|
-
def_delegators :SidekiqUniqueJobs, :connection, :config
|
7
|
+
def_delegators :SidekiqUniqueJobs, :connection, :config, :worker_class_constantize
|
8
8
|
def_delegators :Sidekiq, :logger
|
9
9
|
|
10
10
|
include OptionsWithFallback
|
11
11
|
|
12
12
|
def call(worker_class, item, queue, redis_pool = nil)
|
13
|
-
@worker_class =
|
13
|
+
@worker_class = worker_class_constantize(worker_class)
|
14
14
|
@item = item
|
15
15
|
@queue = queue
|
16
16
|
@redis_pool = redis_pool
|
17
|
-
|
17
|
+
|
18
|
+
yield if disabled_or_successfully_locked?
|
18
19
|
end
|
19
20
|
|
20
21
|
private
|
21
22
|
|
22
23
|
attr_reader :item, :worker_class, :redis_pool, :queue
|
23
24
|
|
24
|
-
def
|
25
|
-
unique_disabled? ||
|
26
|
-
end
|
27
|
-
|
28
|
-
def unlockable?
|
29
|
-
!lockable?
|
30
|
-
end
|
31
|
-
|
32
|
-
def lockable?
|
33
|
-
lock.respond_to?(:lock)
|
25
|
+
def disabled_or_successfully_locked?
|
26
|
+
unique_disabled? || aquire_lock
|
34
27
|
end
|
35
28
|
|
36
29
|
def aquire_lock
|
30
|
+
return true unless lock.respond_to?(:lock)
|
37
31
|
locked = lock.lock(:client)
|
38
32
|
warn_about_duplicate(item) unless locked
|
39
33
|
locked
|
@@ -3,6 +3,8 @@ module SidekiqUniqueJobs
|
|
3
3
|
class UntilExecuted
|
4
4
|
OK ||= 'OK'.freeze
|
5
5
|
|
6
|
+
include SidekiqUniqueJobs::Unlockable
|
7
|
+
|
6
8
|
extend Forwardable
|
7
9
|
def_delegators :Sidekiq, :logger
|
8
10
|
|
@@ -25,7 +27,8 @@ module SidekiqUniqueJobs
|
|
25
27
|
unless [:server, :api, :test].include?(scope)
|
26
28
|
fail ArgumentError, "#{scope} middleware can't #{__method__} #{unique_key}"
|
27
29
|
end
|
28
|
-
|
30
|
+
|
31
|
+
unlock_by_key(unique_key, item[JID_KEY], redis_pool)
|
29
32
|
end
|
30
33
|
|
31
34
|
# rubocop:disable MethodLength
|
@@ -1,17 +1,11 @@
|
|
1
1
|
require 'sidekiq/api'
|
2
2
|
|
3
3
|
module Sidekiq
|
4
|
-
module UnlockMethod
|
5
|
-
def unlock(item)
|
6
|
-
SidekiqUniqueJobs::Unlockable.unlock(item['unique_digest'.freeze], item['jid'.freeze])
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
4
|
class SortedEntry
|
11
5
|
module UniqueExtension
|
12
6
|
def self.included(base)
|
13
7
|
base.class_eval do
|
14
|
-
include
|
8
|
+
include SidekiqUniqueJobs::Unlockable
|
15
9
|
alias_method :delete_orig, :delete
|
16
10
|
alias_method :delete, :delete_ext
|
17
11
|
alias_method :remove_job_orig, :remove_job
|
@@ -41,7 +35,7 @@ module Sidekiq
|
|
41
35
|
module UniqueExtension3_0
|
42
36
|
def self.included(base)
|
43
37
|
base.class_eval do
|
44
|
-
include
|
38
|
+
include SidekiqUniqueJobs::Unlockable
|
45
39
|
alias_method :delete_orig, :delete
|
46
40
|
alias_method :delete, :delete_ext
|
47
41
|
end
|
@@ -63,7 +57,7 @@ module Sidekiq
|
|
63
57
|
module UniqueExtension3_4
|
64
58
|
def self.included(base)
|
65
59
|
base.class_eval do
|
66
|
-
include
|
60
|
+
include SidekiqUniqueJobs::Unlockable
|
67
61
|
alias_method :delete_orig, :delete
|
68
62
|
alias_method :delete, :delete_ext
|
69
63
|
end
|
@@ -91,7 +85,7 @@ module Sidekiq
|
|
91
85
|
module UniqueExtension
|
92
86
|
def self.included(base)
|
93
87
|
base.class_eval do
|
94
|
-
include
|
88
|
+
include SidekiqUniqueJobs::Unlockable
|
95
89
|
alias_method :delete_orig, :delete
|
96
90
|
alias_method :delete, :delete_ext
|
97
91
|
end
|
@@ -110,7 +104,7 @@ module Sidekiq
|
|
110
104
|
module UniqueExtension
|
111
105
|
def self.included(base)
|
112
106
|
base.class_eval do
|
113
|
-
include
|
107
|
+
include SidekiqUniqueJobs::Unlockable
|
114
108
|
alias_method :clear_orig, :clear
|
115
109
|
alias_method :clear, :clear_ext
|
116
110
|
end
|
@@ -129,7 +123,7 @@ module Sidekiq
|
|
129
123
|
module UniqueExtension
|
130
124
|
def self.included(base)
|
131
125
|
base.class_eval do
|
132
|
-
include
|
126
|
+
include SidekiqUniqueJobs::Unlockable
|
133
127
|
if base.method_defined?(:clear)
|
134
128
|
alias_method :clear_orig, :clear
|
135
129
|
alias_method :clear, :clear_ext
|
@@ -12,9 +12,9 @@ module Sidekiq
|
|
12
12
|
worker.jid = job['jid']
|
13
13
|
worker.bid = job['bid'] if worker.respond_to?(:bid=)
|
14
14
|
execute_job(worker, job['args'])
|
15
|
-
unlock(job
|
15
|
+
unlock(job) if Sidekiq::Testing.fake?
|
16
16
|
end
|
17
|
-
end
|
17
|
+
end unless Sidekiq::Testing.respond_to?(:server_middleware)
|
18
18
|
|
19
19
|
# Pop out a single job and perform it
|
20
20
|
def perform_one
|
@@ -24,15 +24,19 @@ module Sidekiq
|
|
24
24
|
worker.jid = job['jid']
|
25
25
|
worker.bid = job['bid'] if worker.respond_to?(:bid=)
|
26
26
|
execute_job(worker, job['args'])
|
27
|
-
unlock(job
|
28
|
-
end
|
27
|
+
unlock(job) if Sidekiq::Testing.fake?
|
28
|
+
end unless Sidekiq::Testing.respond_to?(:server_middleware)
|
29
29
|
|
30
30
|
# Clear all jobs for this worker
|
31
31
|
def clear
|
32
32
|
jobs.each do |job|
|
33
|
-
unlock(job
|
33
|
+
unlock(job) if Sidekiq::Testing.fake?
|
34
34
|
end
|
35
|
-
|
35
|
+
# if Sidekiq::VERSION >= '4'
|
36
|
+
# Queues.jobs[queue].clear
|
37
|
+
# else
|
38
|
+
jobs.clear
|
39
|
+
# end
|
36
40
|
end
|
37
41
|
|
38
42
|
def execute_job(worker, args)
|
@@ -53,10 +57,7 @@ module Sidekiq
|
|
53
57
|
|
54
58
|
module Testing
|
55
59
|
def clear_all_ext
|
56
|
-
|
57
|
-
unique_keys = c.keys("#{SidekiqUniqueJobs.config.unique_prefix}:*")
|
58
|
-
c.del(*unique_keys) unless unique_keys.empty?
|
59
|
-
end
|
60
|
+
SidekiqUniqueJobs::Util.del('*', 1000, false)
|
60
61
|
clear_all_orig
|
61
62
|
end
|
62
63
|
end
|
@@ -65,3 +66,4 @@ module Sidekiq
|
|
65
66
|
include Overrides
|
66
67
|
end
|
67
68
|
end
|
69
|
+
|
@@ -2,25 +2,46 @@ module SidekiqUniqueJobs
|
|
2
2
|
module Unlockable
|
3
3
|
module_function
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
def unlock(item)
|
6
|
+
unlock_by_key(item[UNIQUE_DIGEST_KEY], item[JID_KEY])
|
7
|
+
end
|
8
|
+
|
9
|
+
def unlock_by_key(unique_key, jid, redis_pool = nil)
|
10
|
+
Scripts.call(:release_lock, redis_pool, keys: [unique_key], argv: [jid]) do |result|
|
11
|
+
after_unlock(result, __method__)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def unlock_by_jid(jid, redis_pool = nil)
|
16
|
+
Scripts.call(:release_lock, redis_pool, keys: [unique_key], argv: [jid]) do |result|
|
17
|
+
after_unlock(result, __method__)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def unlock_by_arguments(worker_class, unique_arguments = {})
|
22
|
+
Scripts.call(:release_lock, redis_pool, keys: [unique_key], argv: [jid]) do |result|
|
23
|
+
after_unlock(result, __method__)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def after_unlock(result, calling_method)
|
10
28
|
case result
|
11
29
|
when 1
|
12
|
-
|
30
|
+
logger.debug { "successfully unlocked #{unique_key}" }
|
13
31
|
true
|
14
32
|
when 0
|
15
|
-
|
33
|
+
logger.debug { "expiring lock #{unique_key} is not owned by #{jid}" }
|
16
34
|
false
|
17
35
|
when -1
|
18
|
-
|
36
|
+
logger.debug { "#{unique_key} is not a known key" }
|
19
37
|
false
|
20
38
|
else
|
21
|
-
fail "#{
|
39
|
+
fail "#{calling_method} returned an unexpected value (#{result})"
|
22
40
|
end
|
23
41
|
end
|
24
|
-
|
42
|
+
|
43
|
+
def logger
|
44
|
+
Sidekiq.logger
|
45
|
+
end
|
25
46
|
end
|
26
47
|
end
|
@@ -2,28 +2,38 @@ module SidekiqUniqueJobs
|
|
2
2
|
module Util
|
3
3
|
SCAN_PATTERN ||= '*'.freeze
|
4
4
|
DEFAULT_COUNT ||= 1_000
|
5
|
+
KEYS_METHOD ||= 'keys'.freeze
|
6
|
+
SCAN_METHOD ||= 'scan'.freeze
|
5
7
|
|
6
8
|
module_function
|
7
9
|
|
8
|
-
def keys(pattern = SCAN_PATTERN, count
|
9
|
-
|
10
|
+
def keys(pattern = SCAN_PATTERN, count = DEFAULT_COUNT)
|
11
|
+
send("keys_by_#{redis_keys_method}", pattern, count)
|
10
12
|
end
|
11
13
|
|
12
|
-
def
|
14
|
+
def del(pattern = SCAN_PATTERN, count = 0, dry_run = true)
|
13
15
|
logger.debug { "Deleting keys by: #{pattern}" }
|
14
|
-
keys, time = timed {
|
16
|
+
keys, time = timed { keys(pattern, count) }
|
15
17
|
logger.debug { "#{keys.size} matching keys found in #{time} sec." }
|
16
18
|
keys = dry_run(keys)
|
17
19
|
logger.debug { "#{keys.size} matching keys after postprocessing" }
|
18
20
|
unless dry_run
|
19
21
|
logger.debug { "deleting #{keys}..." }
|
20
|
-
_, time = timed {
|
22
|
+
_, time = timed { batch_delete(keys) }
|
21
23
|
logger.debug { "Deleted in #{time} sec." }
|
22
24
|
end
|
23
25
|
keys.size
|
24
26
|
end
|
25
27
|
|
26
|
-
def
|
28
|
+
def keys_by_scan(pattern, count)
|
29
|
+
connection { |conn| conn.scan_each(match: prefix(pattern), count: count).to_a }
|
30
|
+
end
|
31
|
+
|
32
|
+
def keys_by_keys(pattern, count)
|
33
|
+
connection { |conn| conn.keys(prefix(pattern)).to_a }
|
34
|
+
end
|
35
|
+
|
36
|
+
def batch_delete(keys)
|
27
37
|
connection do |conn|
|
28
38
|
keys.each_slice(500) do |chunk|
|
29
39
|
conn.pipelined do
|
@@ -48,10 +58,6 @@ module SidekiqUniqueJobs
|
|
48
58
|
[result, elapsed]
|
49
59
|
end
|
50
60
|
|
51
|
-
def scan(pattern, count: 1000)
|
52
|
-
connection { |conn| conn.scan_each(match: prefix(pattern), count: count).to_a }
|
53
|
-
end
|
54
|
-
|
55
61
|
def prefix_keys(keys)
|
56
62
|
keys = Array(keys).flatten.compact
|
57
63
|
keys.map { |key| prefix(key) }
|
@@ -70,6 +76,14 @@ module SidekiqUniqueJobs
|
|
70
76
|
SidekiqUniqueJobs.connection(&block)
|
71
77
|
end
|
72
78
|
|
79
|
+
def redis_version
|
80
|
+
SidekiqUniqueJobs.redis_version
|
81
|
+
end
|
82
|
+
|
83
|
+
def redis_keys_method
|
84
|
+
redis_version >= '2.8' ? SCAN_METHOD : KEYS_METHOD
|
85
|
+
end
|
86
|
+
|
73
87
|
def logger
|
74
88
|
Sidekiq.logger
|
75
89
|
end
|
data/sidekiq-unique-jobs.gemspec
CHANGED
@@ -19,7 +19,6 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.add_dependency 'thor', '>= 0'
|
20
20
|
gem.add_development_dependency 'rspec', '~> 3.1'
|
21
21
|
gem.add_development_dependency 'rake'
|
22
|
-
gem.add_development_dependency 'rspec-sidekiq'
|
23
22
|
gem.add_development_dependency 'rubocop'
|
24
23
|
gem.add_development_dependency 'timecop'
|
25
24
|
gem.add_development_dependency 'yard'
|
@@ -251,7 +251,7 @@ RSpec.describe SidekiqUniqueJobs::Client::Middleware do
|
|
251
251
|
let(:queue) { 'default' }
|
252
252
|
context 'when ordinary_or_locked?' do
|
253
253
|
before do
|
254
|
-
allow(subject).to receive(:
|
254
|
+
allow(subject).to receive(:disabled_or_successfully_locked?).and_return(false)
|
255
255
|
end
|
256
256
|
|
257
257
|
it 'returns nil' do
|
@@ -8,6 +8,13 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
|
|
8
8
|
before do
|
9
9
|
Sidekiq.redis = REDIS
|
10
10
|
Sidekiq.redis(&:flushdb)
|
11
|
+
Sidekiq::Testing.server_middleware do |chain|
|
12
|
+
chain.add SidekiqUniqueJobs::Server::Middleware
|
13
|
+
end if Sidekiq::Testing.respond_to?(:server_middleware)
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
Sidekiq::Testing.server_middleware(&:clear) if Sidekiq::Testing.respond_to?(:server_middleware)
|
11
18
|
end
|
12
19
|
|
13
20
|
context 'with unique worker' do
|
@@ -16,11 +23,19 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
|
|
16
23
|
expect(UntilExecutedJob.jobs.size).to eq(0)
|
17
24
|
expect(UntilExecutedJob.perform_async(param)).to_not be_nil
|
18
25
|
expect(UntilExecutedJob.jobs.size).to eq(1)
|
19
|
-
expect(UntilExecutedJob).to have_enqueued_job(param)
|
20
26
|
expect(UntilExecutedJob.perform_async(param)).to be_nil
|
21
27
|
expect(UntilExecutedJob.jobs.size).to eq(1)
|
22
28
|
end
|
23
29
|
|
30
|
+
# it 'does not push duplicate messages', sidekiq_ver: '>= 4' do
|
31
|
+
# param = 'work'
|
32
|
+
# expect(UntilExecutedJob.jobs.size).to eq(0)
|
33
|
+
# expect(UntilExecutedJob.perform_async(param)).to_not be_nil
|
34
|
+
# expect(Sidekiq::Queues['working'].size).to eq(1)
|
35
|
+
# expect(UntilExecutedJob.perform_async(param)).to be_nil
|
36
|
+
# expect(Sidekiq::Queues['working'].size).to eq(1)
|
37
|
+
# end
|
38
|
+
|
24
39
|
it 'unlocks jobs after draining a worker' do
|
25
40
|
param = 'work'
|
26
41
|
param2 = 'more work'
|
@@ -78,6 +93,7 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
|
|
78
93
|
expect { UntilExecutedJob.clear }.not_to raise_error
|
79
94
|
end
|
80
95
|
|
96
|
+
# it 'unlocks jobs when all workers are cleared', :focus do
|
81
97
|
it 'unlocks jobs when all workers are cleared' do
|
82
98
|
param = 'work'
|
83
99
|
expect(UntilExecutedJob.jobs.size).to eq(0)
|
@@ -90,8 +106,8 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
|
|
90
106
|
expect(UntilExecutedJob.jobs.size).to eq(0)
|
91
107
|
expect(AnotherUniqueJob.jobs.size).to eq(0)
|
92
108
|
UntilExecutedJob.perform_async(param)
|
93
|
-
AnotherUniqueJob.perform_async(param)
|
94
109
|
expect(UntilExecutedJob.jobs.size).to eq(1)
|
110
|
+
AnotherUniqueJob.perform_async(param)
|
95
111
|
expect(AnotherUniqueJob.jobs.size).to eq(1)
|
96
112
|
end
|
97
113
|
|
@@ -121,7 +137,6 @@ RSpec.describe 'When Sidekiq::Testing is enabled' do
|
|
121
137
|
expect(MyJob.jobs.size).to eq(0)
|
122
138
|
MyJob.perform_async(param)
|
123
139
|
expect(MyJob.jobs.size).to eq(1)
|
124
|
-
expect(MyJob).to have_enqueued_job(param)
|
125
140
|
MyJob.perform_async(param)
|
126
141
|
expect(MyJob.jobs.size).to eq(2)
|
127
142
|
end
|
@@ -18,18 +18,18 @@ RSpec.describe SidekiqUniqueJobs::Util do
|
|
18
18
|
describe '.keys' do
|
19
19
|
end
|
20
20
|
|
21
|
-
describe '.
|
21
|
+
describe '.del' do
|
22
22
|
context 'given a key named "keyz" with value "valz"' do
|
23
23
|
before do
|
24
24
|
set('uniquejobs:keyz', 'valz')
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'deletes the keys by pattern' do
|
28
|
-
expect(described_class.
|
28
|
+
expect(described_class.del('*', 100, false)).to eq(1)
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'deletes the keys by pattern' do
|
32
|
-
expect(described_class.
|
32
|
+
expect(described_class.del('keyz', 100, false)).to eq(1)
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -23,19 +23,27 @@ require 'sidekiq-unique-jobs'
|
|
23
23
|
require 'sidekiq_unique_jobs/testing'
|
24
24
|
require 'timecop'
|
25
25
|
|
26
|
-
require 'rspec-sidekiq'
|
27
26
|
require 'sidekiq/simulator'
|
28
27
|
|
29
28
|
Sidekiq::Testing.disable!
|
30
29
|
Sidekiq.logger.level = "Logger::#{ENV.fetch('LOGLEVEL') { 'error' }.upcase}".constantize
|
31
30
|
|
32
31
|
require 'sidekiq/redis_connection'
|
32
|
+
|
33
|
+
begin
|
34
|
+
require 'redis-namespace'
|
35
|
+
rescue LoadError
|
36
|
+
puts 'Redis Namespace unavailable'
|
37
|
+
end
|
38
|
+
|
33
39
|
REDIS_URL ||= ENV['REDIS_URL'] || 'redis://localhost/15'.freeze
|
34
40
|
REDIS_NAMESPACE ||= 'unique-test'.freeze
|
35
|
-
|
41
|
+
REDIS_OPTIONS ||= { url: REDIS_URL }
|
42
|
+
REDIS_OPTIONS.merge!(namespace: REDIS_NAMESPACE) if defined?(Redis::Namespace)
|
43
|
+
REDIS ||= Sidekiq::RedisConnection.create(REDIS_OPTIONS)
|
36
44
|
|
37
45
|
Sidekiq.configure_client do |config|
|
38
|
-
config.redis =
|
46
|
+
config.redis = REDIS_OPTIONS
|
39
47
|
end
|
40
48
|
|
41
49
|
Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].each { |f| require f }
|
@@ -55,15 +63,4 @@ RSpec.configure do |config|
|
|
55
63
|
Kernel.srand config.seed
|
56
64
|
end
|
57
65
|
|
58
|
-
RSpec::Sidekiq.configure do |config|
|
59
|
-
# Clears all job queues before each example
|
60
|
-
config.clear_all_enqueued_jobs = true
|
61
|
-
|
62
|
-
# Whether to use terminal colours when outputting messages
|
63
|
-
config.enable_terminal_colours = true
|
64
|
-
|
65
|
-
# Warn when jobs are not enqueued to Redis but to a job array
|
66
|
-
config.warn_when_jobs_not_processed_by_sidekiq = false
|
67
|
-
end
|
68
|
-
|
69
66
|
Dir[File.join(File.dirname(__FILE__), 'jobs', '**', '*.rb')].each { |f| require f }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-unique-jobs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.0.
|
4
|
+
version: 4.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mikael Henriksson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -66,20 +66,6 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rspec-sidekiq
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
69
|
- !ruby/object:Gem::Dependency
|
84
70
|
name: rubocop
|
85
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -152,6 +138,7 @@ files:
|
|
152
138
|
- gemfiles/sidekiq_3.1.gemfile
|
153
139
|
- gemfiles/sidekiq_3.2.gemfile
|
154
140
|
- gemfiles/sidekiq_3.3.gemfile
|
141
|
+
- gemfiles/sidekiq_4.0.gemfile
|
155
142
|
- gemfiles/sidekiq_develop.gemfile
|
156
143
|
- lib/sidekiq-unique-jobs.rb
|
157
144
|
- lib/sidekiq/simulator.rb
|
@@ -309,7 +296,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
309
296
|
version: '0'
|
310
297
|
requirements: []
|
311
298
|
rubyforge_project:
|
312
|
-
rubygems_version: 2.
|
299
|
+
rubygems_version: 2.5.0
|
313
300
|
signing_key:
|
314
301
|
specification_version: 4
|
315
302
|
summary: The unique jobs that were removed from sidekiq
|