sidekiq-unique-jobs 3.0.2 → 3.0.5

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.

Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +36 -0
  3. data/.travis.yml +0 -2
  4. data/Appraisals +2 -1
  5. data/CHANGELOG.md +4 -4
  6. data/Gemfile +1 -3
  7. data/README.md +2 -2
  8. data/Rakefile +6 -4
  9. data/gemfiles/sidekiq_2.15.gemfile +1 -3
  10. data/gemfiles/sidekiq_2.16.gemfile +1 -3
  11. data/gemfiles/sidekiq_2.17.gemfile +1 -3
  12. data/gemfiles/sidekiq_3.0.gemfile +1 -3
  13. data/gemfiles/sidekiq_develop.gemfile +2 -4
  14. data/lib/sidekiq_unique_jobs.rb +27 -0
  15. data/lib/sidekiq_unique_jobs/config.rb +47 -0
  16. data/lib/sidekiq_unique_jobs/connectors.rb +16 -0
  17. data/lib/sidekiq_unique_jobs/connectors/redis_pool.rb +10 -0
  18. data/lib/sidekiq_unique_jobs/connectors/sidekiq_redis.rb +9 -0
  19. data/lib/sidekiq_unique_jobs/connectors/testing.rb +10 -0
  20. data/lib/{sidekiq-unique-jobs → sidekiq_unique_jobs}/middleware.rb +3 -3
  21. data/lib/sidekiq_unique_jobs/middleware/client/strategies/testing_inline.rb +25 -0
  22. data/lib/sidekiq_unique_jobs/middleware/client/strategies/unique.rb +72 -0
  23. data/lib/sidekiq_unique_jobs/middleware/client/unique_jobs.rb +48 -0
  24. data/lib/{sidekiq-unique-jobs → sidekiq_unique_jobs}/middleware/server/unique_jobs.rb +14 -13
  25. data/lib/sidekiq_unique_jobs/payload_helper.rb +42 -0
  26. data/lib/{sidekiq-unique-jobs → sidekiq_unique_jobs}/testing.rb +2 -2
  27. data/lib/{sidekiq-unique-jobs → sidekiq_unique_jobs}/version.rb +1 -1
  28. data/sidekiq-unique-jobs.gemspec +12 -11
  29. data/spec/lib/.sidekiq_testing_enabled_spec.rb.swp +0 -0
  30. data/spec/lib/client_spec.rb +56 -44
  31. data/spec/lib/middleware/server/unique_jobs_spec.rb +16 -16
  32. data/spec/lib/sidekiq_testing_enabled_spec.rb +90 -8
  33. data/spec/lib/unlock_order_spec.rb +3 -3
  34. data/spec/spec_helper.rb +5 -6
  35. data/spec/support/my_worker.rb +3 -3
  36. data/spec/support/sidekiq_meta.rb +3 -6
  37. data/spec/support/unique_worker.rb +3 -3
  38. metadata +35 -13
  39. data/lib/sidekiq-unique-jobs.rb +0 -11
  40. data/lib/sidekiq-unique-jobs/config.rb +0 -35
  41. data/lib/sidekiq-unique-jobs/middleware/client/unique_jobs.rb +0 -101
  42. data/lib/sidekiq-unique-jobs/payload_helper.rb +0 -30
@@ -1,14 +1,15 @@
1
1
  require 'spec_helper'
2
2
  require 'sidekiq/worker'
3
- require "sidekiq-unique-jobs"
3
+ require 'sidekiq_unique_jobs'
4
4
  require 'sidekiq/scheduled'
5
- require 'sidekiq-unique-jobs/middleware/server/unique_jobs'
5
+ require 'sidekiq_unique_jobs/middleware/server/unique_jobs'
6
+ require 'active_support/testing/time_helpers'
6
7
  require 'rspec-sidekiq'
7
8
 
8
- describe "When Sidekiq::Testing is enabled" do
9
+ describe 'When Sidekiq::Testing is enabled' do
9
10
  describe 'when set to :fake!', sidekiq: :fake do
10
- context "with unique worker" do
11
- it "does not push duplicate messages" do
11
+ context 'with unique worker' do
12
+ it 'does not push duplicate messages' do
12
13
  param = 'work'
13
14
  expect(UniqueWorker.jobs.size).to eq(0)
14
15
  UniqueWorker.perform_async(param)
@@ -18,7 +19,7 @@ describe "When Sidekiq::Testing is enabled" do
18
19
  expect(UniqueWorker.jobs.size).to eq(1)
19
20
  end
20
21
 
21
- it "adds the unique_hash to the message" do
22
+ it 'adds the unique_hash to the message' do
22
23
  param = 'hash'
23
24
  hash = SidekiqUniqueJobs::PayloadHelper.get_payload(UniqueWorker, :working, [param])
24
25
  UniqueWorker.perform_async(param)
@@ -27,9 +28,9 @@ describe "When Sidekiq::Testing is enabled" do
27
28
  end
28
29
  end
29
30
 
30
- context "with non-unique worker" do
31
+ context 'with non-unique worker' do
31
32
 
32
- it "pushes duplicates messages" do
33
+ it 'pushes duplicates messages' do
33
34
  param = 'work'
34
35
  expect(MyWorker.jobs.size).to eq(0)
35
36
  MyWorker.perform_async(param)
@@ -40,4 +41,85 @@ describe "When Sidekiq::Testing is enabled" do
40
41
  end
41
42
  end
42
43
  end
44
+
45
+ describe 'when set to :inline!', sidekiq: :inline do
46
+ class InlineWorker
47
+ include Sidekiq::Worker
48
+ sidekiq_options unique: true
49
+
50
+ def perform(x)
51
+ TestClass.run(x)
52
+ end
53
+ end
54
+
55
+ class InlineUnlockOrderWorker
56
+ include Sidekiq::Worker
57
+ sidekiq_options unique: true, unique_unlock_order: :never
58
+
59
+ def perform(x)
60
+ TestClass.run(x)
61
+ end
62
+ end
63
+
64
+ class InlineUnlockOrderWorker
65
+ include Sidekiq::Worker
66
+ sidekiq_options unique: true, unique_unlock_order: :never
67
+
68
+ def perform(x)
69
+ TestClass.run(x)
70
+ end
71
+ end
72
+
73
+ class InlineExpirationWorker
74
+ include Sidekiq::Worker
75
+ sidekiq_options unique: true, unique_unlock_order: :never,
76
+ unique_job_expiration: 10 * 60
77
+ def perform(x)
78
+ TestClass.run(x)
79
+ end
80
+ end
81
+
82
+ class TestClass
83
+ def self.run(_x)
84
+ end
85
+ end
86
+
87
+ it 'once the job is completed allows to run another one' do
88
+ expect(TestClass).to receive(:run).exactly(2).times
89
+
90
+ InlineWorker.perform_async('test')
91
+ InlineWorker.perform_async('test')
92
+ end
93
+
94
+ it 'if the unique is kept forever it does not allows to run the job again' do
95
+ expect(TestClass).to receive(:run).once
96
+
97
+ InlineUnlockOrderWorker.perform_async('test')
98
+ InlineUnlockOrderWorker.perform_async('test')
99
+ end
100
+
101
+ describe 'when a job is set to run once in 10 minutes' do
102
+ include ActiveSupport::Testing::TimeHelpers
103
+ it 'only allows 1 call per 10 minutes' do
104
+ allow(TestClass).to receive(:run).with(1).and_return(true)
105
+ allow(TestClass).to receive(:run).with(2).and_return(true)
106
+
107
+ InlineExpirationWorker.perform_async(1)
108
+ expect(TestClass).to have_received(:run).with(1).once
109
+ 100.times do
110
+ InlineExpirationWorker.perform_async(1)
111
+ end
112
+ expect(TestClass).to have_received(:run).with(1).once
113
+ InlineExpirationWorker.perform_async(2)
114
+ expect(TestClass).to have_received(:run).with(1).once
115
+ expect(TestClass).to have_received(:run).with(2).once
116
+ travel_to(11.minutes.from_now) do
117
+ InlineExpirationWorker.perform_async(1)
118
+ end
119
+
120
+ expect(TestClass).to have_received(:run).with(1).twice
121
+ end
122
+ end
123
+
124
+ end
43
125
  end
@@ -1,9 +1,9 @@
1
1
  require 'spec_helper'
2
2
  require 'sidekiq/api'
3
3
  require 'sidekiq/worker'
4
- require 'sidekiq-unique-jobs/middleware/server/unique_jobs'
4
+ require 'sidekiq_unique_jobs/middleware/server/unique_jobs'
5
5
 
6
- describe "Unlock order" do
6
+ describe 'Unlock order' do
7
7
  QUEUE = 'unlock_ordering'
8
8
 
9
9
  class BeforeYieldOrderingWorker
@@ -27,7 +27,7 @@ describe "Unlock order" do
27
27
  describe 'with real redis' do
28
28
  before do
29
29
  Sidekiq.redis = REDIS
30
- Sidekiq.redis { |c| c.flushdb }
30
+ Sidekiq.redis(&:flushdb)
31
31
  @middleware = SidekiqUniqueJobs::Middleware::Server::UniqueJobs.new
32
32
  end
33
33
 
@@ -1,8 +1,7 @@
1
- $TESTING = true
2
-
3
1
  begin
4
2
  require 'pry'
5
3
  rescue LoadError
4
+ puts 'Pry unavailable'
6
5
  end
7
6
 
8
7
  require 'rspec'
@@ -10,7 +9,7 @@ require 'rspec'
10
9
  require 'celluloid/test'
11
10
  require 'sidekiq'
12
11
  require 'sidekiq/util'
13
- require 'sidekiq-unique-jobs'
12
+ require 'sidekiq_unique_jobs'
14
13
  Sidekiq.logger.level = Logger::ERROR
15
14
 
16
15
  require 'rspec-sidekiq'
@@ -19,10 +18,10 @@ Sidekiq::Testing.disable!
19
18
 
20
19
  require 'sidekiq/redis_connection'
21
20
  redis_url = ENV['REDIS_URL'] || 'redis://localhost/15'
22
- REDIS = Sidekiq::RedisConnection.create(:url => redis_url, :namespace => 'testy')
21
+ REDIS = Sidekiq::RedisConnection.create(url: redis_url, namespace: 'testy')
23
22
 
24
23
  Dir[File.join(File.dirname(__FILE__), 'support', '**', '*.rb')].each { |f| require f }
25
- RSpec.configure do |config|
24
+ RSpec.configure do |_config|
26
25
  # config.treat_symbols_as_metadata_keys_with_true_values = true
27
26
  end
28
27
 
@@ -35,4 +34,4 @@ RSpec::Sidekiq.configure do |config|
35
34
 
36
35
  # Warn when jobs are not enqueued to Redis but to a job array
37
36
  config.warn_when_jobs_not_processed_by_sidekiq = true # default => true
38
- end
37
+ end
@@ -1,7 +1,7 @@
1
1
  class MyWorker
2
2
  include Sidekiq::Worker
3
- sidekiq_options :queue => :working, :retry => 1, :backtrace => 10
4
- sidekiq_options :unique => false
3
+ sidekiq_options queue: :working, retry: 1, backtrace: 10
4
+ sidekiq_options unique: false
5
5
 
6
6
  sidekiq_retries_exhausted do |msg|
7
7
  Sidekiq.logger.warn "Failed #{msg['class']} with #{msg['args']}: #{msg['error_message']}"
@@ -10,4 +10,4 @@ class MyWorker
10
10
  def perform(param)
11
11
  puts param
12
12
  end
13
- end
13
+ end
@@ -1,15 +1,12 @@
1
1
  RSpec.configure do |config|
2
2
  config.before(:each) do |example|
3
- sidekiq = example.metadata[:sidekiq]
4
- if sidekiq
3
+ if (sidekiq = example.metadata[:sidekiq])
5
4
  sidekiq = :fake if sidekiq == true
6
5
  Sidekiq::Testing.send("#{sidekiq}!")
7
6
  end
8
7
  end
9
8
 
10
9
  config.after(:each) do |example|
11
- if sidekiq = example.metadata[:sidekiq]
12
- Sidekiq::Testing.disable!
13
- end
10
+ Sidekiq::Testing.disable! unless example.metadata[:sidekiq].nil?
14
11
  end
15
- end
12
+ end
@@ -1,7 +1,7 @@
1
1
  class UniqueWorker
2
2
  include Sidekiq::Worker
3
- sidekiq_options :queue => :working, :retry => 1, :backtrace => 10
4
- sidekiq_options :unique => true
3
+ sidekiq_options queue: :working, retry: 1, backtrace: 10
4
+ sidekiq_options unique: true
5
5
 
6
6
  sidekiq_retries_exhausted do |msg|
7
7
  Sidekiq.logger.warn "Failed #{msg['class']} with #{msg['args']}: #{msg['error_message']}"
@@ -10,4 +10,4 @@ class UniqueWorker
10
10
  def perform(param)
11
11
  puts param
12
12
  end
13
- end
13
+ end
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: 3.0.2
4
+ version: 3.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mikael Henriksson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-08 00:00:00.000000000 Z
11
+ date: 2014-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -31,7 +31,7 @@ dependencies:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
- type: :runtime
34
+ type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 3.0.0.beta
47
+ version: 3.1.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 3.0.0.beta
54
+ version: 3.1.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: simplecov
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -117,6 +131,7 @@ extra_rdoc_files: []
117
131
  files:
118
132
  - ".gitignore"
119
133
  - ".rspec"
134
+ - ".rubocop.yml"
120
135
  - ".travis.yml"
121
136
  - Appraisals
122
137
  - CHANGELOG.md
@@ -129,15 +144,22 @@ files:
129
144
  - gemfiles/sidekiq_2.17.gemfile
130
145
  - gemfiles/sidekiq_3.0.gemfile
131
146
  - gemfiles/sidekiq_develop.gemfile
132
- - lib/sidekiq-unique-jobs.rb
133
- - lib/sidekiq-unique-jobs/config.rb
134
- - lib/sidekiq-unique-jobs/middleware.rb
135
- - lib/sidekiq-unique-jobs/middleware/client/unique_jobs.rb
136
- - lib/sidekiq-unique-jobs/middleware/server/unique_jobs.rb
137
- - lib/sidekiq-unique-jobs/payload_helper.rb
138
- - lib/sidekiq-unique-jobs/testing.rb
139
- - lib/sidekiq-unique-jobs/version.rb
147
+ - lib/sidekiq_unique_jobs.rb
148
+ - lib/sidekiq_unique_jobs/config.rb
149
+ - lib/sidekiq_unique_jobs/connectors.rb
150
+ - lib/sidekiq_unique_jobs/connectors/redis_pool.rb
151
+ - lib/sidekiq_unique_jobs/connectors/sidekiq_redis.rb
152
+ - lib/sidekiq_unique_jobs/connectors/testing.rb
153
+ - lib/sidekiq_unique_jobs/middleware.rb
154
+ - lib/sidekiq_unique_jobs/middleware/client/strategies/testing_inline.rb
155
+ - lib/sidekiq_unique_jobs/middleware/client/strategies/unique.rb
156
+ - lib/sidekiq_unique_jobs/middleware/client/unique_jobs.rb
157
+ - lib/sidekiq_unique_jobs/middleware/server/unique_jobs.rb
158
+ - lib/sidekiq_unique_jobs/payload_helper.rb
159
+ - lib/sidekiq_unique_jobs/testing.rb
160
+ - lib/sidekiq_unique_jobs/version.rb
140
161
  - sidekiq-unique-jobs.gemspec
162
+ - spec/lib/.sidekiq_testing_enabled_spec.rb.swp
141
163
  - spec/lib/client_spec.rb
142
164
  - spec/lib/middleware/server/unique_jobs_spec.rb
143
165
  - spec/lib/sidekiq_testing_enabled_spec.rb
@@ -1,11 +0,0 @@
1
- require 'yaml' if RUBY_VERSION.include?('2.0.0')
2
- require 'sidekiq-unique-jobs/middleware'
3
- require "sidekiq-unique-jobs/version"
4
- require "sidekiq-unique-jobs/config"
5
- require "sidekiq-unique-jobs/payload_helper"
6
-
7
- module SidekiqUniqueJobs
8
- def self.config
9
- SidekiqUniqueJobs::Config
10
- end
11
- end
@@ -1,35 +0,0 @@
1
- module SidekiqUniqueJobs
2
- class Config
3
- def self.unique_prefix=(prefix)
4
- @unique_prefix = prefix
5
- end
6
-
7
- def self.unique_prefix
8
- @unique_prefix || "sidekiq_unique"
9
- end
10
-
11
- def self.unique_args_enabled=(enabled)
12
- @unique_args_enabled = enabled
13
- end
14
-
15
- def self.unique_args_enabled?
16
- @unique_args_enabled || false
17
- end
18
-
19
- def self.default_expiration=(expiration)
20
- @expiration = expiration
21
- end
22
-
23
- def self.default_expiration
24
- @expiration || 30 * 60
25
- end
26
-
27
- def self.default_unlock_order=(order)
28
- @default_unlock_order = order
29
- end
30
-
31
- def self.default_unlock_order
32
- @default_unlock_order || :after_yield
33
- end
34
- end
35
- end
@@ -1,101 +0,0 @@
1
- require 'digest'
2
-
3
- module SidekiqUniqueJobs
4
- module Middleware
5
- module Client
6
- class UniqueJobs
7
- attr_reader :item, :worker_class, :redis_pool
8
-
9
- def call(worker_class, item, queue, redis_pool = nil)
10
- @redis_pool = redis_pool
11
- @worker_class = worker_class_constantize(worker_class)
12
- @item = item
13
-
14
- if unique_enabled?
15
- @item['unique_hash'] = payload_hash
16
- yield if unique?
17
- else
18
- yield
19
- end
20
- end
21
-
22
- def unique?
23
- if testing_enabled?
24
- unique_for_connection?(SidekiqUniqueJobs.redis_mock)
25
- else
26
- if redis_pool
27
- redis_pool.with do |conn|
28
- unique_for_connection?(conn)
29
- end
30
- else
31
- Sidekiq.redis do |conn|
32
- unique_for_connection?(conn)
33
- end
34
- end
35
- end
36
- end
37
-
38
- def unique_for_connection?(conn)
39
- unique = false
40
- conn.watch(payload_hash)
41
-
42
- if conn.get(payload_hash).to_i == 1 ||
43
- (conn.get(payload_hash).to_i == 2 && item['at'])
44
- # if the job is already queued, or is already scheduled and
45
- # we're trying to schedule again, abort
46
- conn.unwatch
47
- else
48
- # if the job was previously scheduled and is now being queued,
49
- # or we've never seen it before
50
- expires_at = unique_job_expiration || SidekiqUniqueJobs::Config.default_expiration
51
- expires_at = ((Time.at(item['at']) - Time.now.utc) + expires_at).to_i if item['at']
52
-
53
- unique = conn.multi do
54
- # set value of 2 for scheduled jobs, 1 for queued jobs.
55
- conn.setex(payload_hash, expires_at, item['at'] ? 2 : 1)
56
- end
57
- end
58
- unique
59
- end
60
-
61
- protected
62
-
63
- # Attempt to constantize a string worker_class argument, always
64
- # failing back to the original argument.
65
- def worker_class_constantize(worker_class)
66
- if worker_class.is_a?(String)
67
- worker_class.constantize rescue worker_class
68
- else
69
- worker_class
70
- end
71
- end
72
-
73
- private
74
-
75
- def payload_hash
76
- SidekiqUniqueJobs::PayloadHelper.get_payload(item['class'], item['queue'], item['args'])
77
- end
78
-
79
- # When sidekiq/testing is loaded, the Sidekiq::Testing constant is
80
- # present and testing is enabled.
81
- def testing_enabled?
82
- if Sidekiq.const_defined?('Testing') && Sidekiq::Testing.enabled?
83
- require 'sidekiq-unique-jobs/testing'
84
- return true
85
- end
86
-
87
- false
88
- end
89
-
90
- def unique_enabled?
91
- worker_class.get_sidekiq_options['unique'] || item['unique']
92
- end
93
-
94
- def unique_job_expiration
95
- worker_class.get_sidekiq_options['unique_job_expiration']
96
- end
97
-
98
- end
99
- end
100
- end
101
- end