sidekiq-unique-jobs 4.0.9 → 4.0.10
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.
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
|