rekiq 0.5.0 → 0.6.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.
- checksums.yaml +4 -4
- data/README.md +9 -5
- data/lib/rekiq.rb +4 -4
- data/lib/rekiq/exceptions.rb +1 -0
- data/lib/rekiq/job.rb +2 -0
- data/lib/rekiq/middleware/work_overseer.rb +24 -15
- data/lib/rekiq/scheduler.rb +19 -19
- data/lib/rekiq/validator.rb +2 -0
- data/lib/rekiq/version.rb +1 -1
- data/lib/rekiq/worker.rb +41 -12
- data/spec/rekiq/middleware/work_overseer_spec.rb +77 -35
- data/spec/rekiq/scheduler_spec.rb +43 -27
- data/spec/rekiq/worker_spec.rb +94 -37
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c02fc37de00489fe1195f4cb22ed4bf1700ab13
|
4
|
+
data.tar.gz: 073c844c1ee5f5c671ce71b15d6ef9fe8fd5aa3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e7aa8af8e713b349c90d0f1519c8532e5fd22cb7d6ec6eb16ec844e912af72d698a735ae0e07739191de5864486f0aaa313e392e51b0444286fbdcda2331ed3
|
7
|
+
data.tar.gz: 19fb11a43f48c45e730b361c439d0a5df6f0bf281c61906051c72f01168110886740f99bfdf17f894e5dc80a5f1664efdebdb0dfa26332369655723f0e2b5d6c
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# Rekiq
|
2
2
|
|
3
|
+
[](http://badge.fury.io/rb/rekiq)
|
3
4
|
[](https://travis-ci.org/junhanamaki/rekiq)
|
4
5
|
[](https://codeclimate.com/github/junhanamaki/rekiq)
|
5
6
|
[](https://codeclimate.com/github/junhanamaki/rekiq)
|
@@ -10,9 +11,9 @@
|
|
10
11
|
|
11
12
|
Rekiq extends Sidekiq and adds functionality to schedule recurring workers.
|
12
13
|
|
13
|
-
Sidekiq is an amazing gem that allows us
|
14
|
-
|
15
|
-
nice if it also allowed us to schedule a worker to do work
|
14
|
+
Sidekiq is an amazing gem that allows us to execute work asynchronous, or
|
15
|
+
even schedule that work to be run at a given time. Now, wouldn't it be
|
16
|
+
nice if it also allowed us to schedule a worker to do recurring work? That's
|
16
17
|
what rekiq purposes to do.
|
17
18
|
|
18
19
|
For example, rekiq allows you to schedule a worker to repeat the same
|
@@ -23,6 +24,7 @@ work every friday at 23:00.
|
|
23
24
|
Tested with:
|
24
25
|
|
25
26
|
* ruby 2.1.1, 2.0.0 and 1.9.3
|
27
|
+
|
26
28
|
* sidekiq 3.2.1
|
27
29
|
|
28
30
|
## Installation
|
@@ -69,8 +71,10 @@ For our example we'll be using the gem [ice_cube](https://github.com/seejohnrun/
|
|
69
71
|
# now just start your worker
|
70
72
|
ExampleWorker.perform_recurringly(schedule, 'argument_1', 'argument_2')
|
71
73
|
|
72
|
-
|
73
|
-
|
74
|
+
And that's it! Now the worker will run every friday as 2am.
|
75
|
+
|
76
|
+
You can use your own schedule object, configure worker to schedule before or
|
77
|
+
after work is done, set a margin, and much more! So please feel free to check
|
74
78
|
[wiki](https://github.com/junhanamaki/rekiq/wiki) for more details.
|
75
79
|
|
76
80
|
## Contributing
|
data/lib/rekiq.rb
CHANGED
@@ -6,14 +6,14 @@ unless defined?(Sidekiq)
|
|
6
6
|
'sidekiq must be required before requiring rekiq'
|
7
7
|
end
|
8
8
|
|
9
|
-
require 'rekiq/middleware/work_overseer'
|
10
|
-
require 'rekiq/middleware/utils'
|
11
|
-
require 'rekiq/worker'
|
12
|
-
|
13
9
|
module Rekiq
|
14
10
|
|
15
11
|
end
|
16
12
|
|
13
|
+
require 'rekiq/worker'
|
14
|
+
require 'rekiq/middleware/work_overseer'
|
15
|
+
require 'rekiq/middleware/utils'
|
16
|
+
|
17
17
|
Sidekiq.configure_server do |config|
|
18
18
|
config.server_middleware do |chain|
|
19
19
|
chain.add Rekiq::Middleware::Utils
|
data/lib/rekiq/exceptions.rb
CHANGED
data/lib/rekiq/job.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'sidekiq'
|
2
2
|
require 'sidekiq/util'
|
3
|
-
require 'rekiq/configuration'
|
4
3
|
require 'rekiq/job'
|
5
4
|
require 'rekiq/scheduler'
|
6
5
|
|
@@ -9,35 +8,45 @@ module Rekiq
|
|
9
8
|
class WorkOverseer
|
10
9
|
include ::Sidekiq::Util
|
11
10
|
|
12
|
-
attr_accessor :worker_name, :queue, :args, :job, :addon,
|
13
|
-
:scheduled_work_time
|
14
|
-
|
15
11
|
def call(worker, msg, queue)
|
16
12
|
return yield unless msg['rq:job'] and msg['retry_count'].nil?
|
17
13
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
14
|
+
setup_vars(worker, msg, queue)
|
15
|
+
|
16
|
+
if !@canceller_name.nil? and
|
17
|
+
worker.send(@canceller_name, *@canceller_args)
|
18
|
+
return logger.info 'worker canceled by rekiq_canceller'
|
19
|
+
end
|
24
20
|
|
25
21
|
begin
|
26
|
-
reschedule unless job.schedule_post_work?
|
22
|
+
reschedule unless @job.schedule_post_work?
|
27
23
|
yield
|
28
24
|
ensure
|
29
|
-
reschedule if job.schedule_post_work?
|
25
|
+
reschedule if @job.schedule_post_work?
|
30
26
|
end
|
31
27
|
end
|
32
28
|
|
29
|
+
protected
|
30
|
+
|
31
|
+
def setup_vars(worker, msg, queue)
|
32
|
+
@canceller_name = worker.rekiq_canceller_name
|
33
|
+
@canceller_args = msg['rq:ca']
|
34
|
+
@worker_name = worker.class.name
|
35
|
+
@queue = queue
|
36
|
+
@args = msg['args']
|
37
|
+
@job = Job.from_array(msg['rq:job'])
|
38
|
+
@addon = msg['rq:addon']
|
39
|
+
@scheduled_work_time = Time.at(msg['rq:at'].to_f)
|
40
|
+
end
|
41
|
+
|
33
42
|
def reschedule
|
34
43
|
jid, work_time =
|
35
44
|
Rekiq::Scheduler
|
36
|
-
.new(worker_name, queue, args, job, addon)
|
37
|
-
.schedule_from_work_time(scheduled_work_time)
|
45
|
+
.new(@worker_name, @queue, @args, @job, @addon, @canceller_args)
|
46
|
+
.schedule_from_work_time(@scheduled_work_time)
|
38
47
|
|
39
48
|
unless jid.nil?
|
40
|
-
logger.info "recurring work for #{worker_name} scheduled for " \
|
49
|
+
logger.info "recurring work for #{@worker_name} scheduled for " \
|
41
50
|
"#{work_time} with jid #{jid}"
|
42
51
|
else
|
43
52
|
logger.info 'recurrence terminated, job terminated'
|
data/lib/rekiq/scheduler.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
1
|
module Rekiq
|
2
2
|
class Scheduler
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
self.addon = addon
|
3
|
+
def initialize(worker_name, queue, args, job, addon, canceller_args)
|
4
|
+
@worker_name = worker_name
|
5
|
+
@queue = queue
|
6
|
+
@args = args
|
7
|
+
@job = job
|
8
|
+
@addon = addon
|
9
|
+
@canceller_args = canceller_args
|
11
10
|
end
|
12
11
|
|
13
12
|
def schedule(from = Time.now)
|
14
|
-
|
13
|
+
@work_time = @job.next_work_time(from)
|
15
14
|
|
16
|
-
work_time.nil? ? nil : [schedule_work, work_time]
|
15
|
+
@work_time.nil? ? nil : [schedule_work, @work_time]
|
17
16
|
end
|
18
17
|
|
19
18
|
def schedule_from_work_time(from)
|
20
|
-
|
19
|
+
@work_time = @job.next_work_time_from_work_time(from)
|
21
20
|
|
22
|
-
work_time.nil? ? nil : [schedule_work, work_time]
|
21
|
+
@work_time.nil? ? nil : [schedule_work, @work_time]
|
23
22
|
end
|
24
23
|
|
25
24
|
private
|
26
25
|
|
27
26
|
def schedule_work
|
28
27
|
client_args = {
|
29
|
-
'at' => work_time.to_f,
|
30
|
-
'queue' => queue,
|
31
|
-
'class' => worker_name,
|
32
|
-
'args' => args,
|
33
|
-
'rq:job' => job.to_array,
|
34
|
-
'rq:at' => work_time.to_f
|
28
|
+
'at' => @work_time.to_f,
|
29
|
+
'queue' => @queue,
|
30
|
+
'class' => @worker_name,
|
31
|
+
'args' => @args,
|
32
|
+
'rq:job' => @job.to_array,
|
33
|
+
'rq:at' => @work_time.to_f,
|
35
34
|
}.tap do |hash|
|
36
|
-
hash['rq:addon'] = addon unless addon.nil?
|
35
|
+
hash['rq:addon'] = @addon unless @addon.nil?
|
36
|
+
hash['rq:ca'] = @canceller_args unless @canceller_args.nil?
|
37
37
|
end
|
38
38
|
|
39
39
|
Sidekiq::Client.push(client_args)
|
data/lib/rekiq/validator.rb
CHANGED
data/lib/rekiq/version.rb
CHANGED
data/lib/rekiq/worker.rb
CHANGED
@@ -6,21 +6,33 @@ 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, :canceller_args
|
10
|
+
|
11
|
+
def rekiq_canceller_args(*args)
|
12
|
+
self.canceller_args = args
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
16
|
module ClassMethods
|
17
|
+
attr_reader :canceller_name
|
18
|
+
|
19
|
+
def rekiq_canceller(method_name)
|
20
|
+
@canceller_name = method_name
|
21
|
+
end
|
22
|
+
|
13
23
|
def perform_recurringly(schedule, *args)
|
14
|
-
config = Configuration.new
|
15
|
-
yield config if block_given?
|
24
|
+
@config = Configuration.new
|
25
|
+
yield @config if block_given?
|
26
|
+
|
27
|
+
validate!
|
16
28
|
|
17
29
|
job =
|
18
30
|
Rekiq::Job
|
19
31
|
.new 'schedule' => schedule,
|
20
|
-
'shift' => config.shift,
|
21
|
-
'schedule_post_work' => config.schedule_post_work,
|
22
|
-
'schedule_expired' => config.schedule_expired,
|
23
|
-
'expiration_margin' => config.expiration_margin
|
32
|
+
'shift' => @config.shift,
|
33
|
+
'schedule_post_work' => @config.schedule_post_work,
|
34
|
+
'schedule_expired' => @config.schedule_expired,
|
35
|
+
'expiration_margin' => @config.expiration_margin
|
24
36
|
|
25
37
|
job.validate!
|
26
38
|
|
@@ -28,16 +40,29 @@ module Rekiq
|
|
28
40
|
|
29
41
|
jid, work_time =
|
30
42
|
Rekiq::Scheduler
|
31
|
-
.new(name, queue, args, job, config.addon)
|
43
|
+
.new(name, queue, args, job, @config.addon, @config.canceller_args)
|
32
44
|
.schedule
|
33
45
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
46
|
+
if jid.nil?
|
47
|
+
return ::Sidekiq.logger.info \
|
48
|
+
"recurring work for #{name} scheduled for " \
|
49
|
+
"#{work_time} with jid #{jid}"
|
50
|
+
end
|
38
51
|
|
39
52
|
jid
|
40
53
|
end
|
54
|
+
|
55
|
+
protected
|
56
|
+
|
57
|
+
def validate!
|
58
|
+
unless canceller_name.nil? or
|
59
|
+
self.method_defined?(canceller_name)
|
60
|
+
raise CancellerMethodMissing,
|
61
|
+
"rekiq_canceller method defined as #{canceller_name} " \
|
62
|
+
'but worker does not have a method with that name, either ' \
|
63
|
+
'remove rekiq_canceller or define missing method'
|
64
|
+
end
|
65
|
+
end
|
41
66
|
end
|
42
67
|
end
|
43
68
|
end
|
@@ -52,5 +77,9 @@ module Sidekiq
|
|
52
77
|
original_included_method.call(base)
|
53
78
|
base.extend(Rekiq::Worker::ClassMethods)
|
54
79
|
end
|
80
|
+
|
81
|
+
def rekiq_canceller_name
|
82
|
+
self.class.canceller_name
|
83
|
+
end
|
55
84
|
end
|
56
85
|
end
|
@@ -7,59 +7,101 @@ describe Rekiq::Middleware::WorkOverseer do
|
|
7
7
|
sidekiq_options queue: 'work_overseer_test_worker'
|
8
8
|
end
|
9
9
|
|
10
|
+
class WorkOverseerCancelTestWorker
|
11
|
+
include Sidekiq::Worker
|
12
|
+
|
13
|
+
sidekiq_options queue: 'work_overseer_test_worker'
|
14
|
+
rekiq_canceller :cancel
|
15
|
+
|
16
|
+
def cancel(bool)
|
17
|
+
bool
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
10
21
|
describe '#call' do
|
11
|
-
let(:worker) { WorkOverseerTestWorker.new }
|
12
|
-
let(:queue) { WorkOverseerTestWorker.get_sidekiq_options['queue'] }
|
13
22
|
let(:args) { [] }
|
14
23
|
let(:schedule) { IceCube::Schedule.new(Time.new + 3600) }
|
24
|
+
let(:job) { build(:job, schedule: schedule) }
|
25
|
+
let(:overseer) { Rekiq::Middleware::WorkOverseer.new }
|
26
|
+
|
27
|
+
context 'worker does not have rekiq_canceller set' do
|
28
|
+
let(:worker) { WorkOverseerTestWorker.new }
|
29
|
+
let(:queue) { WorkOverseerTestWorker.get_sidekiq_options['queue'] }
|
15
30
|
|
16
|
-
|
17
|
-
|
18
|
-
let(:msg) { { 'rq:job' => job.to_array, 'args' => args } }
|
31
|
+
context 'msg with rq:job key (existing job)' do
|
32
|
+
let(:msg) { { 'rq:job' => job.to_array, 'args' => args } }
|
19
33
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
34
|
+
it 'yields once' do
|
35
|
+
expect do |b|
|
36
|
+
overseer.call(worker, msg, queue, &b)
|
37
|
+
end.to yield_control.once
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'schedules job' do
|
41
|
+
overseer.call(worker, msg, queue) {}
|
42
|
+
|
43
|
+
expect(WorkOverseerTestWorker.jobs.count).to eq(1)
|
44
|
+
end
|
25
45
|
end
|
26
46
|
|
27
|
-
|
28
|
-
|
29
|
-
.call(worker, msg, queue) {}
|
47
|
+
context 'msg without rq:job key' do
|
48
|
+
let(:msg) { {} }
|
30
49
|
|
31
|
-
|
50
|
+
it 'yields once' do
|
51
|
+
expect do |b|
|
52
|
+
overseer.call(worker, msg, queue, &b)
|
53
|
+
end.to yield_control.once
|
54
|
+
end
|
32
55
|
end
|
33
|
-
end
|
34
56
|
|
35
|
-
|
36
|
-
|
57
|
+
context 'msg with job retry info and rq:job (existing job)' do
|
58
|
+
let(:msg) { { 'rq:job' => job.to_array, 'retry_count' => 0,
|
59
|
+
'args' => args } }
|
60
|
+
|
61
|
+
it 'yields once' do
|
62
|
+
expect do |b|
|
63
|
+
overseer.call(worker, msg, queue, &b)
|
64
|
+
end.to yield_control.once
|
65
|
+
end
|
37
66
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
67
|
+
it 'does not schedule work' do
|
68
|
+
overseer.call(worker, msg, queue) {}
|
69
|
+
|
70
|
+
expect(WorkOverseerTestWorker.jobs.count).to eq(0)
|
71
|
+
end
|
43
72
|
end
|
44
73
|
end
|
45
74
|
|
46
|
-
context '
|
47
|
-
let(:
|
48
|
-
let(:
|
49
|
-
|
75
|
+
context 'worker has rekiq_canceller method set' do
|
76
|
+
let(:worker) { WorkOverseerCancelTestWorker.new }
|
77
|
+
let(:queue) { WorkOverseerCancelTestWorker.get_sidekiq_options['queue'] }
|
78
|
+
|
79
|
+
context 'msg with rq:ca key with value to cancel worker' do
|
80
|
+
let(:msg) do
|
81
|
+
{ 'rq:job' => job.to_array, 'args' => args, 'rq:ca' => true }
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'does not yield' do
|
85
|
+
expect do |b|
|
86
|
+
overseer.call(worker, msg, queue, &b)
|
87
|
+
end.not_to yield_control
|
88
|
+
end
|
50
89
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
.call(worker, msg, queue, &b)
|
55
|
-
end.to yield_control.once
|
90
|
+
it 'does not scheduler worker' do
|
91
|
+
expect(WorkOverseerCancelTestWorker.jobs.count).to eq(0)
|
92
|
+
end
|
56
93
|
end
|
57
94
|
|
58
|
-
|
59
|
-
|
60
|
-
.
|
95
|
+
context 'msg with rq:ca key with value that does not cancel worker' do
|
96
|
+
let(:msg) do
|
97
|
+
{ 'rq:job' => job.to_array, 'args' => args, 'rq:ca' => false }
|
98
|
+
end
|
61
99
|
|
62
|
-
|
100
|
+
it 'does yield' do
|
101
|
+
expect do |b|
|
102
|
+
overseer.call(worker, msg, queue, &b)
|
103
|
+
end.to yield_control.once
|
104
|
+
end
|
63
105
|
end
|
64
106
|
end
|
65
107
|
end
|
@@ -10,49 +10,65 @@ describe Rekiq::Scheduler do
|
|
10
10
|
let(:worker) { SchedulerTestWorker.name }
|
11
11
|
let(:queue) { 'test_queue' }
|
12
12
|
let(:args) { [] }
|
13
|
+
let(:addon) { nil }
|
14
|
+
let(:c_args) { nil }
|
15
|
+
let(:scheduler) do
|
16
|
+
Rekiq::Scheduler.new(worker, queue, args, job, addon, c_args)
|
17
|
+
end
|
18
|
+
before { @jid, @work_time = scheduler.schedule }
|
13
19
|
|
14
20
|
context 'given valid job' do
|
15
21
|
let(:job) { build(:job) }
|
16
22
|
|
23
|
+
context 'give nil as addon argument' do
|
24
|
+
it 'creates sidekiq job' do
|
25
|
+
expect(SchedulerTestWorker.jobs.count).to eq(1)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'does not set key rq:addon in msg' do
|
29
|
+
expect(SchedulerTestWorker.jobs[0].key?('rq:addon')).to eq(false)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
17
33
|
context 'given not nil string as addon argument' do
|
18
34
|
let(:addon) { { 'random_key' => Time.now.to_f } }
|
19
35
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
36
|
+
it 'creates sidekiq job' do
|
37
|
+
expect(SchedulerTestWorker.jobs.count).to eq(1)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'add key rq:addon in msg' do
|
41
|
+
expect(SchedulerTestWorker.jobs[0].key?('rq:addon')).to eq(true)
|
42
|
+
end
|
25
43
|
|
26
|
-
|
27
|
-
|
28
|
-
|
44
|
+
it 'sets addon value in key rq:addon' do
|
45
|
+
expect(SchedulerTestWorker.jobs[0]['rq:addon']).to eq(addon)
|
46
|
+
end
|
47
|
+
end
|
29
48
|
|
30
|
-
|
31
|
-
|
32
|
-
|
49
|
+
context 'given nil as canceller_args' do
|
50
|
+
it 'creates sidekiq job' do
|
51
|
+
expect(SchedulerTestWorker.jobs.count).to eq(1)
|
52
|
+
end
|
33
53
|
|
34
|
-
|
35
|
-
|
36
|
-
end
|
54
|
+
it 'does not set key rq:ca in msg' do
|
55
|
+
expect(SchedulerTestWorker.jobs[0].key?('rq:ca')).to eq(false)
|
37
56
|
end
|
38
57
|
end
|
39
58
|
|
40
|
-
context '
|
41
|
-
let(:
|
59
|
+
context 'given non empty array as canceller_args' do
|
60
|
+
let(:c_args) { [1, 2, 3] }
|
42
61
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
47
|
-
before { @jid, @work_time = scheduler.schedule }
|
62
|
+
it 'creates sidekiq job' do
|
63
|
+
expect(SchedulerTestWorker.jobs.count).to eq(1)
|
64
|
+
end
|
48
65
|
|
49
|
-
|
50
|
-
|
51
|
-
|
66
|
+
it 'sets key rq:ca in msg' do
|
67
|
+
expect(SchedulerTestWorker.jobs[0].key?('rq:ca')).to eq(true)
|
68
|
+
end
|
52
69
|
|
53
|
-
|
54
|
-
|
55
|
-
end
|
70
|
+
it 'sets key rq:ca in msg with passed value' do
|
71
|
+
expect(SchedulerTestWorker.jobs[0]['rq:ca']).to eq(c_args)
|
56
72
|
end
|
57
73
|
end
|
58
74
|
end
|
data/spec/rekiq/worker_spec.rb
CHANGED
@@ -7,6 +7,19 @@ describe Rekiq::Worker do
|
|
7
7
|
include Sidekiq::Worker
|
8
8
|
end
|
9
9
|
|
10
|
+
class CancellerUndefinedExampleWorker
|
11
|
+
include Sidekiq::Worker
|
12
|
+
rekiq_canceller :cancel
|
13
|
+
end
|
14
|
+
|
15
|
+
class CancellerDefinedExampleWorker
|
16
|
+
include Sidekiq::Worker
|
17
|
+
rekiq_canceller :cancel
|
18
|
+
|
19
|
+
def cancel
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
10
23
|
context 'Class includes Sidekiq::Worker module' do
|
11
24
|
it 'responds to perform_recurringly' do
|
12
25
|
ExampleWorker.respond_to? :perform_recurringly
|
@@ -16,56 +29,100 @@ describe Rekiq::Worker do
|
|
16
29
|
context 'scheduled one hour from now' do
|
17
30
|
let(:time) { Time.now + 3600 }
|
18
31
|
let(:schedule) { IceCube::Schedule.new(time) }
|
19
|
-
before do
|
20
|
-
@jid = ExampleWorker.perform_recurringly(schedule)
|
21
|
-
end
|
22
32
|
|
23
|
-
|
24
|
-
|
25
|
-
|
33
|
+
context 'for worker with rekiq_canceller set with non defined method' do
|
34
|
+
before do
|
35
|
+
begin
|
36
|
+
@jid =
|
37
|
+
CancellerUndefinedExampleWorker.perform_recurringly(schedule)
|
38
|
+
rescue
|
39
|
+
end
|
40
|
+
end
|
26
41
|
|
27
|
-
|
28
|
-
|
29
|
-
|
42
|
+
it 'raises error' do
|
43
|
+
expect do
|
44
|
+
CancellerUndefinedExampleWorker.perform_recurringly(schedule)
|
45
|
+
end.to raise_error
|
46
|
+
end
|
30
47
|
|
31
|
-
|
32
|
-
|
48
|
+
it 'does not schedule worker' do
|
49
|
+
expect(CancellerUndefinedExampleWorker.jobs.count).to eq(0)
|
50
|
+
end
|
33
51
|
end
|
34
|
-
end
|
35
52
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
let(:shift) { -5 * 60 }
|
41
|
-
before do
|
42
|
-
@jid = ExampleWorker.perform_recurringly(schedule) do |options|
|
43
|
-
options.shift = shift
|
44
|
-
end
|
45
|
-
end
|
53
|
+
context 'for worker with rekiq_canceller set with defined method' do
|
54
|
+
before do
|
55
|
+
@jid = CancellerDefinedExampleWorker.perform_recurringly(schedule)
|
56
|
+
end
|
46
57
|
|
47
|
-
|
48
|
-
|
49
|
-
|
58
|
+
it 'does not raise error' do
|
59
|
+
expect do
|
60
|
+
CancellerDefinedExampleWorker.perform_recurringly(schedule)
|
61
|
+
end.not_to raise_error
|
62
|
+
end
|
50
63
|
|
51
|
-
|
52
|
-
|
53
|
-
|
64
|
+
it 'returns created jid' do
|
65
|
+
expect(@jid).not_to be_nil
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'schedules worker' do
|
69
|
+
expect(CancellerDefinedExampleWorker.jobs.count).to eq(1)
|
70
|
+
end
|
54
71
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end.to yield_control.once
|
72
|
+
it 'schedules worker for one hour from now' do
|
73
|
+
expect(CancellerDefinedExampleWorker.jobs[0]['at']).to eq(time.to_f)
|
74
|
+
end
|
59
75
|
end
|
60
76
|
|
61
|
-
|
62
|
-
|
77
|
+
context 'invoked without config' do
|
78
|
+
before do
|
79
|
+
@jid = ExampleWorker.perform_recurringly(schedule)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'returns created jid' do
|
83
|
+
expect(@jid).not_to be_nil
|
84
|
+
end
|
63
85
|
|
64
|
-
|
86
|
+
it 'schedules worker' do
|
87
|
+
expect(ExampleWorker.jobs.count).to eq(1)
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'schedules worker for one hour from now' do
|
91
|
+
expect(ExampleWorker.jobs[0]['at']).to eq(time.to_f)
|
92
|
+
end
|
65
93
|
end
|
66
94
|
|
67
|
-
|
68
|
-
|
95
|
+
context 'shift set to minus 5 minutes' do
|
96
|
+
let(:shift) { -5 * 60 }
|
97
|
+
before do
|
98
|
+
@jid = ExampleWorker.perform_recurringly(schedule) do |config|
|
99
|
+
config.shift = shift
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
it 'returns created job id' do
|
104
|
+
expect(@jid).not_to be_nil
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'schedules worker' do
|
108
|
+
expect(ExampleWorker.jobs.count).to eq(1)
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'yields once' do
|
112
|
+
expect do |b|
|
113
|
+
ExampleWorker.perform_recurringly(schedule, &b)
|
114
|
+
end.to yield_control.once
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'sets shift in rq:job' do
|
118
|
+
array = ExampleWorker.jobs[0]['rq:job']
|
119
|
+
|
120
|
+
expect(array[1]).to eq(shift)
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'schedules worker for one hour minus 5 minutes from now' do
|
124
|
+
expect(ExampleWorker.jobs[0]['at']).to eq(time.to_f + shift)
|
125
|
+
end
|
69
126
|
end
|
70
127
|
end
|
71
128
|
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.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- junhanamaki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|