rekiq 0.7.0 → 0.8.1
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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/example/test_app.rb +1 -1
- data/lib/rekiq/middleware/work_overseer.rb +7 -3
- data/lib/rekiq/scheduler.rb +2 -1
- data/lib/rekiq/version.rb +1 -1
- data/lib/rekiq/worker.rb +16 -17
- data/rekiq.gemspec +4 -2
- data/spec/factories/configuration.rb +4 -4
- data/spec/factories/job.rb +5 -5
- data/spec/rekiq/middleware/work_overseer_spec.rb +18 -10
- data/spec/rekiq/worker_spec.rb +6 -4
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 482599a4667b43c5690d7a4232e0ae3d87f2c4fd
|
4
|
+
data.tar.gz: 9964d52d551ed769dada46c3ab8427f77465c8ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34104c582240196d8effd91b0ea5ae48f9d43beb0e7fba9ba5fe8db2e93b17f4269488a947967f5f0f7ebb8d3bf43801e5239db29d8e1ff2ee8033b73e6b0132
|
7
|
+
data.tar.gz: 71f5c7c77a0934bea52bfba4f0913e3ef86260b1ba657e0cf28cce45d29b9e8933ca1803b29768f36422e497436e5b83bd8bb2525fa85438feea242e15c2b3f2
|
data/README.md
CHANGED
@@ -71,7 +71,7 @@ For our example we'll be using the gem [ice_cube](https://github.com/seejohnrun/
|
|
71
71
|
# now just start your worker
|
72
72
|
ExampleWorker.perform_recurringly(schedule, 'argument_1', 'argument_2')
|
73
73
|
|
74
|
-
|
74
|
+
And that's it! Now the worker will run every friday as 2am.
|
75
75
|
|
76
76
|
You can use your own schedule object, configure worker to schedule before or
|
77
77
|
after work is done, set a margin, and much more! So please feel free to check
|
@@ -79,7 +79,7 @@ after work is done, set a margin, and much more! So please feel free to check
|
|
79
79
|
|
80
80
|
## Contributing
|
81
81
|
|
82
|
-
1. Fork it ( https://github.com/
|
82
|
+
1. Fork it ( https://github.com/junhanamaki/rekiq/fork )
|
83
83
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
84
84
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
85
85
|
4. Push to the branch (`git push origin my-new-feature`)
|
data/example/test_app.rb
CHANGED
@@ -9,7 +9,7 @@ require 'rekiq'
|
|
9
9
|
class TestWorker1
|
10
10
|
include Sidekiq::Worker
|
11
11
|
|
12
|
-
sidekiq_options queue: "rekiq_test_worker", retry:
|
12
|
+
sidekiq_options queue: "rekiq_test_worker", retry: 3
|
13
13
|
|
14
14
|
def perform(arg1, arg2)
|
15
15
|
puts "\n\nhello from TestWorker1, arg1 is #{arg1}, arg2 is #{arg2}" \
|
@@ -9,15 +9,19 @@ module Rekiq
|
|
9
9
|
include ::Sidekiq::Util
|
10
10
|
|
11
11
|
def call(worker, msg, queue)
|
12
|
-
return yield unless msg
|
12
|
+
return yield unless msg.key?('rq:job')
|
13
13
|
|
14
14
|
setup_vars(worker, msg, queue)
|
15
15
|
|
16
16
|
if !@canceller_name.nil? and
|
17
17
|
worker.send(@canceller_name, *@canceller_args)
|
18
|
-
|
18
|
+
return logger.info 'worker canceled by recurrence canceller'
|
19
19
|
end
|
20
20
|
|
21
|
+
return yield unless msg.key?('rq:schdlr')
|
22
|
+
|
23
|
+
msg.delete('rq:schdlr')
|
24
|
+
|
21
25
|
begin
|
22
26
|
reschedule unless @job.schedule_post_work?
|
23
27
|
yield
|
@@ -29,7 +33,7 @@ module Rekiq
|
|
29
33
|
protected
|
30
34
|
|
31
35
|
def setup_vars(worker, msg, queue)
|
32
|
-
@canceller_name = worker.
|
36
|
+
@canceller_name = worker.recurrence_canceller_name
|
33
37
|
@canceller_args = msg['rq:ca']
|
34
38
|
@worker_name = worker.class.name
|
35
39
|
@queue = queue
|
data/lib/rekiq/scheduler.rb
CHANGED
@@ -31,9 +31,10 @@ module Rekiq
|
|
31
31
|
'args' => @args,
|
32
32
|
'rq:job' => @job.to_array,
|
33
33
|
'rq:at' => @work_time.to_f,
|
34
|
+
'rq:schdlr' => nil
|
34
35
|
}.tap do |hash|
|
35
36
|
hash['rq:addon'] = @addon unless @addon.nil?
|
36
|
-
hash['rq:ca']
|
37
|
+
hash['rq:ca'] = @canceller_args unless @canceller_args.nil?
|
37
38
|
end
|
38
39
|
|
39
40
|
Sidekiq::Client.push(client_args)
|
data/lib/rekiq/version.rb
CHANGED
data/lib/rekiq/worker.rb
CHANGED
@@ -6,20 +6,14 @@ module Rekiq
|
|
6
6
|
module Worker
|
7
7
|
class Configuration
|
8
8
|
attr_accessor :shift, :schedule_post_work, :schedule_expired,
|
9
|
-
:expiration_margin, :addon, :
|
9
|
+
:expiration_margin, :addon, :recurrence_canceller_args
|
10
10
|
|
11
|
-
def
|
12
|
-
self.
|
11
|
+
def recurrence_canceller_args(*args)
|
12
|
+
self.recurrence_canceller_args = args
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
module ClassMethods
|
17
|
-
attr_reader :canceller_name
|
18
|
-
|
19
|
-
def rekiq_canceller(method_name)
|
20
|
-
@canceller_name = method_name
|
21
|
-
end
|
22
|
-
|
23
17
|
def perform_recurringly(schedule, *args)
|
24
18
|
@config = Configuration.new
|
25
19
|
yield @config if block_given?
|
@@ -40,7 +34,7 @@ module Rekiq
|
|
40
34
|
|
41
35
|
jid, work_time =
|
42
36
|
Rekiq::Scheduler
|
43
|
-
.new(name, queue, args, job, @config.addon, @config.
|
37
|
+
.new(name, queue, args, job, @config.addon, @config.recurrence_canceller_args)
|
44
38
|
.schedule
|
45
39
|
|
46
40
|
if jid.nil?
|
@@ -52,15 +46,20 @@ module Rekiq
|
|
52
46
|
jid
|
53
47
|
end
|
54
48
|
|
49
|
+
def recurrence_canceller_name
|
50
|
+
get_sidekiq_options['recurrence_canceller_name']
|
51
|
+
end
|
52
|
+
|
55
53
|
protected
|
56
54
|
|
57
55
|
def validate!
|
58
|
-
unless
|
59
|
-
self.method_defined?(
|
56
|
+
unless recurrence_canceller_name.nil? or
|
57
|
+
self.method_defined?(recurrence_canceller_name)
|
60
58
|
raise CancellerMethodMissing,
|
61
|
-
|
62
|
-
|
63
|
-
'remove
|
59
|
+
'recurrence canceller method name defined as ' \
|
60
|
+
"#{recurrence_canceller_name}, but worker does not have " \
|
61
|
+
'a method with that name, either remove definition or define ' \
|
62
|
+
'missing method'
|
64
63
|
end
|
65
64
|
end
|
66
65
|
end
|
@@ -78,8 +77,8 @@ module Sidekiq
|
|
78
77
|
base.extend(Rekiq::Worker::ClassMethods)
|
79
78
|
end
|
80
79
|
|
81
|
-
def
|
82
|
-
self.class.
|
80
|
+
def recurrence_canceller_name
|
81
|
+
self.class.recurrence_canceller_name
|
83
82
|
end
|
84
83
|
end
|
85
84
|
end
|
data/rekiq.gemspec
CHANGED
@@ -8,8 +8,10 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = Rekiq::VERSION
|
9
9
|
spec.authors = ["junhanamaki"]
|
10
10
|
spec.email = ["jun.hanamaki@gmail.com"]
|
11
|
-
spec.summary = %q{
|
12
|
-
spec.description = %q{
|
11
|
+
spec.summary = %q{Recurring worker extension for Sidekiq}
|
12
|
+
spec.description = %q{Rekiq extends Sidekiq so that we can schedule
|
13
|
+
recurring workers, check homepage for
|
14
|
+
more details.}
|
13
15
|
spec.homepage = "https://github.com/junhanamaki/rekiq"
|
14
16
|
spec.license = "MIT"
|
15
17
|
|
@@ -1,8 +1,8 @@
|
|
1
1
|
FactoryGirl.define do
|
2
2
|
factory :configuration, class: Rekiq::Configuration do
|
3
|
-
shift
|
4
|
-
schedule_post_work
|
5
|
-
expiration_margin
|
6
|
-
schedule_expired
|
3
|
+
shift [*-100..100].sample
|
4
|
+
schedule_post_work [true, false].sample
|
5
|
+
expiration_margin [*0..100].sample
|
6
|
+
schedule_expired [true, false].sample
|
7
7
|
end
|
8
8
|
end
|
data/spec/factories/job.rb
CHANGED
@@ -3,13 +3,13 @@ require 'ice_cube'
|
|
3
3
|
FactoryGirl.define do
|
4
4
|
factory :job, class: Rekiq::Job do
|
5
5
|
shift 0
|
6
|
-
schedule
|
6
|
+
schedule IceCube::Schedule.new(Time.now + 3600)
|
7
7
|
|
8
8
|
trait :randomized_attributes do
|
9
|
-
shift
|
10
|
-
schedule_post_work
|
11
|
-
schedule_expired
|
12
|
-
expiration_margin
|
9
|
+
shift [*0..100].sample
|
10
|
+
schedule_post_work [nil, false, true].sample
|
11
|
+
schedule_expired [nil, false, true].sample
|
12
|
+
expiration_margin [*0..100].sample
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -10,8 +10,8 @@ describe Rekiq::Middleware::WorkOverseer do
|
|
10
10
|
class WorkOverseerCancelTestWorker
|
11
11
|
include Sidekiq::Worker
|
12
12
|
|
13
|
-
sidekiq_options queue: 'work_overseer_test_worker'
|
14
|
-
|
13
|
+
sidekiq_options queue: 'work_overseer_test_worker',
|
14
|
+
recurrence_canceller_name: :cancel
|
15
15
|
|
16
16
|
def cancel(bool)
|
17
17
|
bool
|
@@ -24,12 +24,15 @@ describe Rekiq::Middleware::WorkOverseer do
|
|
24
24
|
let(:job) { build(:job, schedule: schedule) }
|
25
25
|
let(:overseer) { Rekiq::Middleware::WorkOverseer.new }
|
26
26
|
|
27
|
-
context 'worker does not have
|
27
|
+
context 'worker does not have recurrence_canceller_name set' do
|
28
28
|
let(:worker) { WorkOverseerTestWorker.new }
|
29
29
|
let(:queue) { WorkOverseerTestWorker.get_sidekiq_options['queue'] }
|
30
30
|
|
31
|
-
context 'msg with rq:job key (existing job)'
|
32
|
-
|
31
|
+
context 'msg with rq:job key (existing job), ' \
|
32
|
+
'with rq:schdlr key (value is irrelevant)' do
|
33
|
+
let(:msg) do
|
34
|
+
{ 'rq:job' => job.to_array, 'args' => args, 'rq:schdlr' => nil }
|
35
|
+
end
|
33
36
|
|
34
37
|
it 'yields once' do
|
35
38
|
expect do |b|
|
@@ -42,6 +45,12 @@ describe Rekiq::Middleware::WorkOverseer do
|
|
42
45
|
|
43
46
|
expect(WorkOverseerTestWorker.jobs.count).to eq(1)
|
44
47
|
end
|
48
|
+
|
49
|
+
it 'removes key rq:schdlr from message after invocation' do
|
50
|
+
overseer.call(worker, msg, queue) {}
|
51
|
+
|
52
|
+
expect(msg.key?('rq:schdlr')).to eq(false)
|
53
|
+
end
|
45
54
|
end
|
46
55
|
|
47
56
|
context 'msg without rq:job key' do
|
@@ -54,9 +63,8 @@ describe Rekiq::Middleware::WorkOverseer do
|
|
54
63
|
end
|
55
64
|
end
|
56
65
|
|
57
|
-
context 'msg
|
58
|
-
let(:msg) { { 'rq:job' => job.to_array, '
|
59
|
-
'args' => args } }
|
66
|
+
context 'msg without rq:schdlr and rq:job (existing job)' do
|
67
|
+
let(:msg) { { 'rq:job' => job.to_array, 'args' => args } }
|
60
68
|
|
61
69
|
it 'yields once' do
|
62
70
|
expect do |b|
|
@@ -64,7 +72,7 @@ describe Rekiq::Middleware::WorkOverseer do
|
|
64
72
|
end.to yield_control.once
|
65
73
|
end
|
66
74
|
|
67
|
-
it 'does not schedule work' do
|
75
|
+
it 'does not schedule next work' do
|
68
76
|
overseer.call(worker, msg, queue) {}
|
69
77
|
|
70
78
|
expect(WorkOverseerTestWorker.jobs.count).to eq(0)
|
@@ -72,7 +80,7 @@ describe Rekiq::Middleware::WorkOverseer do
|
|
72
80
|
end
|
73
81
|
end
|
74
82
|
|
75
|
-
context 'worker has
|
83
|
+
context 'worker has recurrence_canceller_name method set' do
|
76
84
|
let(:worker) { WorkOverseerCancelTestWorker.new }
|
77
85
|
let(:queue) { WorkOverseerCancelTestWorker.get_sidekiq_options['queue'] }
|
78
86
|
|
data/spec/rekiq/worker_spec.rb
CHANGED
@@ -9,12 +9,12 @@ describe Rekiq::Worker do
|
|
9
9
|
|
10
10
|
class CancellerUndefinedExampleWorker
|
11
11
|
include Sidekiq::Worker
|
12
|
-
|
12
|
+
sidekiq_options recurrence_canceller_name: :cancel
|
13
13
|
end
|
14
14
|
|
15
15
|
class CancellerDefinedExampleWorker
|
16
16
|
include Sidekiq::Worker
|
17
|
-
|
17
|
+
sidekiq_options recurrence_canceller_name: :cancel
|
18
18
|
|
19
19
|
def cancel
|
20
20
|
end
|
@@ -45,7 +45,8 @@ describe Rekiq::Worker do
|
|
45
45
|
let(:time) { Time.now + 3600 }
|
46
46
|
let(:schedule) { IceCube::Schedule.new(time) }
|
47
47
|
|
48
|
-
context 'for worker with
|
48
|
+
context 'for worker with recurrence_canceller_name set with ' \
|
49
|
+
'non defined method' do
|
49
50
|
before do
|
50
51
|
begin
|
51
52
|
@jid =
|
@@ -65,7 +66,8 @@ describe Rekiq::Worker do
|
|
65
66
|
end
|
66
67
|
end
|
67
68
|
|
68
|
-
context 'for worker with
|
69
|
+
context 'for worker with recurrence_canceller_name set with ' \
|
70
|
+
'defined method' do
|
69
71
|
before do
|
70
72
|
@jid = CancellerDefinedExampleWorker.perform_recurringly(schedule)
|
71
73
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rekiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- junhanamaki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -122,7 +122,10 @@ dependencies:
|
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: '3.2'
|
125
|
-
description:
|
125
|
+
description: |-
|
126
|
+
Rekiq extends Sidekiq so that we can schedule
|
127
|
+
recurring workers, check homepage for
|
128
|
+
more details.
|
126
129
|
email:
|
127
130
|
- jun.hanamaki@gmail.com
|
128
131
|
executables: []
|
@@ -183,7 +186,7 @@ rubyforge_project:
|
|
183
186
|
rubygems_version: 2.2.2
|
184
187
|
signing_key:
|
185
188
|
specification_version: 4
|
186
|
-
summary:
|
189
|
+
summary: Recurring worker extension for Sidekiq
|
187
190
|
test_files:
|
188
191
|
- spec/factories/configuration.rb
|
189
192
|
- spec/factories/job.rb
|