sidekiq-scheduler 1.2.2 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +45 -13
- data/Rakefile +1 -5
- data/lib/sidekiq-scheduler.rb +6 -4
- data/lib/sidekiq-scheduler/capistrano.rb +36 -17
- data/lib/sidekiq-scheduler/manager.rb +3 -2
- data/lib/sidekiq-scheduler/version.rb +1 -1
- data/lib/sidekiq/scheduler.rb +28 -17
- data/test/lib/sidekiq/scheduler_test.rb +20 -2
- data/test/lib/sidekiq/web_test.rb +13 -13
- data/test/schedule_test.rb +52 -92
- data/test/test_helper.rb +7 -4
- metadata +18 -5
- data/lib/tasks/sidekiq-scheduler_tasks.rake +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1853ea52af3b5ac315998b85d0e0bdfe7b4a609
|
4
|
+
data.tar.gz: 8d1a8da664bc78daf8c3006e3649ac983ffe5170
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eaf1a2503d7dfad91e180ad3d46124d9b243f0abd16bd5ecdeed1d927a0d1da9069b32387c7a3c86ed3daafe4ddfed637513df34d20aa0ff95e2114bccbbaec8
|
7
|
+
data.tar.gz: 2aeaecd846736d06d6100149b87f57562870f74caec307e7054b2ac9fab3d8de0f9eb0390dba0ef66110a4dedc8dc13f6425804bf4d73342e7614aa62f1dd4d0
|
data/README.md
CHANGED
@@ -4,24 +4,32 @@
|
|
4
4
|
</a>
|
5
5
|
</p>
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
<p align="center">
|
8
|
+
<a href="https://badge.fury.io/rb/sidekiq-scheduler">
|
9
|
+
<img src="https://badge.fury.io/rb/sidekiq-scheduler.png" alt="Gem Version">
|
10
|
+
</a>
|
11
|
+
<a href="https://codeclimate.com/github/moove-it/sidekiq-scheduler">
|
12
|
+
<img src="https://codeclimate.com/github/moove-it/sidekiq-scheduler/badges/gpa.svg" alt="Code Climate">
|
13
|
+
</a>
|
14
|
+
<a href="https://travis-ci.org/moove-it/sidekiq-scheduler">
|
15
|
+
<img src="https://api.travis-ci.org/moove-it/sidekiq-scheduler.svg?branch=master" alt="Build Status">
|
16
|
+
</a>
|
17
|
+
<a href="https://coveralls.io/github/moove-it/sidekiq-scheduler?branch=master">
|
18
|
+
<img src="https://coveralls.io/repos/moove-it/sidekiq-scheduler/badge.svg?branch=master&service=github" alt="Coverage Status">
|
19
|
+
</a>
|
20
|
+
<a href="https://inch-ci.org/github/moove-it/sidekiq-scheduler">
|
21
|
+
<img src="https://inch-ci.org/github/moove-it/sidekiq-scheduler.svg?branch=master" alt="Documentation Coverage">
|
22
|
+
</a>
|
23
|
+
<a href="http://www.rubydoc.info/github/moove-it/sidekiq-scheduler">
|
24
|
+
<img src="https://img.shields.io/badge/yard-docs-blue.svg" alt="Documentation">
|
25
|
+
</a>
|
26
|
+
</p>
|
13
27
|
|
14
28
|
sidekiq-scheduler is an extension to [Sidekiq](http://github.com/mperham/sidekiq)
|
15
29
|
that adds support for running scheduled.
|
16
30
|
|
17
31
|
Scheduled jobs are like cron jobs, recurring on a regular basis.
|
18
32
|
|
19
|
-
### Documentation
|
20
|
-
|
21
|
-
This README covers what most people need to know. If you're looking for
|
22
|
-
details on individual methods, you might want to try the [rdoc](http://rdoc.info/github/moove-it/sidekiq-scheduler/master/frames).
|
23
|
-
|
24
|
-
|
25
33
|
## Installation
|
26
34
|
|
27
35
|
Add this to your Gemfile:
|
@@ -41,7 +49,7 @@ and the execute:
|
|
41
49
|
sidekiq -r created_file_path.rb
|
42
50
|
```
|
43
51
|
|
44
|
-
Look at [Loading the schedule]
|
52
|
+
Look at [Loading the schedule](https://github.com/moove-it/sidekiq-scheduler/#loading-the-schedule)
|
45
53
|
for information on how to load your schedule.
|
46
54
|
|
47
55
|
You can add sidekiq-scheduler configuration options to sidekiq.yml config file.
|
@@ -49,6 +57,30 @@ Available options are:
|
|
49
57
|
|
50
58
|
:schedule: <the schedule to be run>
|
51
59
|
:dynamic: <if true the schedule can be modified in runtime>
|
60
|
+
:enabled: <disables scheduler if true [true by default]>
|
61
|
+
|
62
|
+
## Manage tasks from Unicorn/Rails server
|
63
|
+
|
64
|
+
For example, if you want start sidekiq-scheduler only from Unicorn/Rails, but not from Sidekiq you can write something like this in initializer:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
# config/initializers/sidekiq_scheduler.rb
|
68
|
+
require 'sidekiq/scheduler'
|
69
|
+
|
70
|
+
puts "Sidekiq.server? is #{Sidekiq.server?.inspect}"
|
71
|
+
puts "defined?(Rails::Server) is #{defined?(Rails::Server).inspect}"
|
72
|
+
puts "defined?(Unicorn) is #{defined?(Unicorn).inspect}"
|
73
|
+
|
74
|
+
if Rails.env == 'production' && (defined?(Rails::Server) || defined?(Unicorn))
|
75
|
+
Sidekiq.schedule = YAML
|
76
|
+
.load_file(File.expand_path('../../../config/scheduler.yml', __FILE__))
|
77
|
+
Sidekiq::Scheduler.reload_schedule!
|
78
|
+
else
|
79
|
+
Sidekiq::Scheduler.enabled = false
|
80
|
+
puts "Sidekiq::Scheduler.enabled is #{Sidekiq::Scheduler.enabled.inspect}"
|
81
|
+
end
|
82
|
+
```
|
83
|
+
|
52
84
|
|
53
85
|
## Scheduled Jobs (Recurring Jobs)
|
54
86
|
|
data/Rakefile
CHANGED
@@ -20,9 +20,6 @@ RDoc::Task.new(:rdoc) do |rdoc|
|
|
20
20
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
23
|
Bundler::GemHelper.install_tasks
|
27
24
|
|
28
25
|
require 'rake/testtask'
|
@@ -34,5 +31,4 @@ Rake::TestTask.new(:test) do |t|
|
|
34
31
|
t.verbose = false
|
35
32
|
end
|
36
33
|
|
37
|
-
|
38
|
-
task :default => :test
|
34
|
+
task default: :test
|
data/lib/sidekiq-scheduler.rb
CHANGED
@@ -7,9 +7,10 @@ Sidekiq.configure_server do |config|
|
|
7
7
|
|
8
8
|
config.on(:startup) do
|
9
9
|
scheduler_options = {
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
10
|
+
scheduler: config.options.fetch(:scheduler, true),
|
11
|
+
dynamic: config.options.fetch(:dynamic, false),
|
12
|
+
enabled: config.options.fetch(:enabled, true),
|
13
|
+
schedule: config.options.fetch(:schedule, nil)
|
13
14
|
}
|
14
15
|
|
15
16
|
schedule_manager = SidekiqScheduler::Manager.new(scheduler_options)
|
@@ -21,4 +22,5 @@ Sidekiq.configure_server do |config|
|
|
21
22
|
config.options[:schedule_manager].stop
|
22
23
|
end
|
23
24
|
|
24
|
-
end
|
25
|
+
end
|
26
|
+
|
@@ -1,35 +1,54 @@
|
|
1
1
|
Capistrano::Configuration.instance.load do
|
2
|
-
before
|
3
|
-
after
|
4
|
-
after
|
5
|
-
after
|
2
|
+
before 'deploy', 'sidekiq_scheduler:quiet'
|
3
|
+
after 'deploy:stop', 'sidekiq_scheduler:stop'
|
4
|
+
after 'deploy:start', 'sidekiq_scheduler:start'
|
5
|
+
after 'deploy:restart', 'sidekiq_scheduler:restart'
|
6
6
|
|
7
7
|
_cset(:sidekiq_timeout) { 10 }
|
8
8
|
_cset(:sidekiq_role) { :app }
|
9
9
|
|
10
10
|
namespace :sidekiq_scheduler do
|
11
11
|
|
12
|
-
desc
|
13
|
-
task :quiet, :
|
14
|
-
|
12
|
+
desc 'Quiet sidekiq-scheduler with sidekiq (stop accepting new work)'
|
13
|
+
task :quiet, roles: lambda { fetch(:sidekiq_role) } do
|
14
|
+
bundle_cmd = fetch(:bundle_cmd, 'bundle')
|
15
|
+
pid_file = "#{current_path}/tmp/pids/sidekiq.pid"
|
16
|
+
quiet_cmd = "#{bundle_cmd} exec sidekiqctl quiet #{pid_file}"
|
17
|
+
|
18
|
+
run "cd #{current_path} && if [ -f #{pid_file} ]; then #{quiet_cmd} ; fi"
|
15
19
|
end
|
16
20
|
|
17
|
-
desc
|
18
|
-
task :stop, :
|
19
|
-
|
21
|
+
desc 'Stop sidekiq-scheduler with sidekiq'
|
22
|
+
task :stop, roles: lambda { fetch(:sidekiq_role) } do
|
23
|
+
bundle_cmd = fetch(:bundle_cmd, 'bundle')
|
24
|
+
pid_file = "#{current_path}/tmp/pids/sidekiq.pid"
|
25
|
+
timeout = fetch(:sidekiq_timeout)
|
26
|
+
stop_cmd = "#{bundle_cmd} exec sidekiqctl stop #{pid_file} #{timeout}"
|
27
|
+
|
28
|
+
run "cd #{current_path} && if [ -f #{pid_file} ]; then #{stop_cmd} ; fi"
|
20
29
|
end
|
21
30
|
|
22
|
-
desc
|
23
|
-
task :start, :
|
24
|
-
rails_env = fetch(:rails_env,
|
25
|
-
|
31
|
+
desc 'Start sidekiq-scheduler with sidekiq'
|
32
|
+
task :start, roles: lambda { fetch(:sidekiq_role) } do
|
33
|
+
rails_env = fetch(:rails_env, 'production')
|
34
|
+
bundle_cmd = fetch(:bundle_cmd, 'bundle')
|
35
|
+
log_file = "#{current_path}/log/sidekiq.log 2>&1 &"
|
36
|
+
pid_file = "#{current_path}/tmp/pids/sidekiq.pid"
|
37
|
+
start_cmd = "#{bundle_cmd} exec sidekiq-scheduler start "
|
38
|
+
start_cmd += "-e #{rails_env} "
|
39
|
+
start_cmd += "-C #{current_path}/config/sidekiq.yml "
|
40
|
+
start_cmd += "-P #{pid_file} "
|
41
|
+
exec_cmd = "nohup #{start_cmd}"
|
42
|
+
|
43
|
+
run "cd #{current_path} ; nohup #{exec_cmd} >> #{log_file}", pty: false
|
26
44
|
end
|
27
45
|
|
28
|
-
desc
|
29
|
-
task :restart, :
|
46
|
+
desc 'Restart sidekiq-scheduler with sidekiq'
|
47
|
+
task :restart, roles: lambda { fetch(:sidekiq_role) } do
|
30
48
|
stop
|
31
49
|
start
|
32
50
|
end
|
33
51
|
|
34
52
|
end
|
35
|
-
end
|
53
|
+
end
|
54
|
+
|
@@ -19,6 +19,7 @@ module SidekiqScheduler
|
|
19
19
|
def initialize(options={})
|
20
20
|
@enabled = options[:scheduler]
|
21
21
|
|
22
|
+
Sidekiq::Scheduler.enabled = options[:enabled]
|
22
23
|
Sidekiq::Scheduler.dynamic = options[:dynamic] || false
|
23
24
|
Sidekiq.schedule = options[:schedule] if options[:schedule]
|
24
25
|
end
|
@@ -30,9 +31,9 @@ module SidekiqScheduler
|
|
30
31
|
def start
|
31
32
|
# Load the schedule into rufus
|
32
33
|
# If dynamic is set, load that schedule otherwise use normal load
|
33
|
-
if @enabled && Sidekiq::Scheduler.dynamic
|
34
|
+
if @enabled && Sidekiq::Scheduler.dynamic && Sidekiq::Scheduler.enabled
|
34
35
|
Sidekiq::Scheduler.reload_schedule!
|
35
|
-
elsif @enabled
|
36
|
+
elsif @enabled && Sidekiq::Scheduler.enabled
|
36
37
|
Sidekiq::Scheduler.load_schedule!
|
37
38
|
end
|
38
39
|
end
|
data/lib/sidekiq/scheduler.rb
CHANGED
@@ -16,7 +16,10 @@ module Sidekiq
|
|
16
16
|
|
17
17
|
class << self
|
18
18
|
|
19
|
-
#
|
19
|
+
# Set to enable or disable the scheduler.
|
20
|
+
attr_accessor :enabled
|
21
|
+
|
22
|
+
# Set to update the schedule in runtime in a given time period.
|
20
23
|
attr_accessor :dynamic
|
21
24
|
|
22
25
|
end
|
@@ -30,7 +33,7 @@ module Sidekiq
|
|
30
33
|
if self.rufus_scheduler
|
31
34
|
logger.info "Scheduling Info\tLast Run"
|
32
35
|
scheduler_jobs = self.rufus_scheduler.all_jobs
|
33
|
-
scheduler_jobs.each do |
|
36
|
+
scheduler_jobs.each do |_, v|
|
34
37
|
logger.info "#{v.t}\t#{v.last}\t"
|
35
38
|
end
|
36
39
|
end
|
@@ -39,22 +42,26 @@ module Sidekiq
|
|
39
42
|
# Pulls the schedule from Sidekiq.schedule and loads it into the
|
40
43
|
# rufus scheduler instance
|
41
44
|
def self.load_schedule!
|
42
|
-
|
45
|
+
if enabled
|
46
|
+
logger.info 'Loading Schedule'
|
43
47
|
|
44
|
-
|
45
|
-
|
48
|
+
# Need to load the schedule from redis for the first time if dynamic
|
49
|
+
Sidekiq.reload_schedule! if dynamic
|
46
50
|
|
47
|
-
|
51
|
+
logger.info 'Schedule empty! Set Sidekiq.schedule' if Sidekiq.schedule.empty?
|
48
52
|
|
49
|
-
|
53
|
+
@@scheduled_jobs = {}
|
50
54
|
|
51
|
-
|
52
|
-
|
53
|
-
|
55
|
+
Sidekiq.schedule.each do |name, config|
|
56
|
+
self.load_schedule_job(name, config)
|
57
|
+
end
|
54
58
|
|
55
|
-
|
59
|
+
Sidekiq.redis { |r| r.del(:schedules_changed) }
|
56
60
|
|
57
|
-
|
61
|
+
logger.info 'Schedules Loaded'
|
62
|
+
else
|
63
|
+
logger.info 'SidekiqScheduler is disabled'
|
64
|
+
end
|
58
65
|
end
|
59
66
|
|
60
67
|
# modify interval type value to value with options if options available
|
@@ -110,13 +117,13 @@ module Sidekiq
|
|
110
117
|
# Returns true if the given schedule config hash matches the current
|
111
118
|
# ENV['RAILS_ENV']
|
112
119
|
def self.rails_env_matches?(config)
|
113
|
-
config['rails_env'] && ENV['RAILS_ENV'] && config['rails_env'].gsub(/\s/,'').split(',').include?(ENV['RAILS_ENV'])
|
120
|
+
config['rails_env'] && ENV['RAILS_ENV'] && config['rails_env'].gsub(/\s/, '').split(',').include?(ENV['RAILS_ENV'])
|
114
121
|
end
|
115
122
|
|
116
123
|
def self.handle_errors
|
117
124
|
begin
|
118
125
|
yield
|
119
|
-
rescue
|
126
|
+
rescue StandardError => e
|
120
127
|
logger.info "#{e.class.name}: #{e.message}"
|
121
128
|
end
|
122
129
|
end
|
@@ -157,9 +164,13 @@ module Sidekiq
|
|
157
164
|
end
|
158
165
|
|
159
166
|
def self.reload_schedule!
|
160
|
-
|
161
|
-
|
162
|
-
|
167
|
+
if enabled
|
168
|
+
logger.info 'Reloading Schedule'
|
169
|
+
self.clear_schedule!
|
170
|
+
self.load_schedule!
|
171
|
+
else
|
172
|
+
logger.info 'SidekiqScheduler is disabled'
|
173
|
+
end
|
163
174
|
end
|
164
175
|
|
165
176
|
def self.update_schedule
|
@@ -4,6 +4,7 @@ class ManagerTest < Minitest::Test
|
|
4
4
|
describe 'Sidekiq::Scheduler' do
|
5
5
|
|
6
6
|
before do
|
7
|
+
Sidekiq::Scheduler.enabled = true
|
7
8
|
Sidekiq::Scheduler.dynamic = false
|
8
9
|
Sidekiq.redis { |r| r.del(:schedules) }
|
9
10
|
Sidekiq.redis { |r| r.del(:schedules_changed) }
|
@@ -11,6 +12,23 @@ class ManagerTest < Minitest::Test
|
|
11
12
|
Sidekiq::Scheduler.send(:class_variable_set, :@@scheduled_jobs, {})
|
12
13
|
end
|
13
14
|
|
15
|
+
it 'sidekiq-scheduler enabled option is working' do
|
16
|
+
Sidekiq::Scheduler.enabled = false
|
17
|
+
assert_equal(0, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
18
|
+
Sidekiq.schedule = {
|
19
|
+
:some_ivar_job => {
|
20
|
+
'cron' => '* * * * *',
|
21
|
+
'class' => 'SomeIvarJob',
|
22
|
+
'args' => '/tmp'
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
Sidekiq::Scheduler.load_schedule!
|
27
|
+
|
28
|
+
assert_equal(0, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
29
|
+
refute Sidekiq::Scheduler.scheduled_jobs.include?(:some_ivar_job)
|
30
|
+
end
|
31
|
+
|
14
32
|
it 'enqueue constantizes' do
|
15
33
|
# The job should be loaded, since a missing rails_env means ALL envs.
|
16
34
|
ENV['RAILS_ENV'] = 'production'
|
@@ -170,7 +188,7 @@ class ManagerTest < Minitest::Test
|
|
170
188
|
}
|
171
189
|
)
|
172
190
|
|
173
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.
|
191
|
+
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
174
192
|
assert_equal(1, Sidekiq::Scheduler.scheduled_jobs.size)
|
175
193
|
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
176
194
|
end
|
@@ -185,7 +203,7 @@ class ManagerTest < Minitest::Test
|
|
185
203
|
}
|
186
204
|
)
|
187
205
|
|
188
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.
|
206
|
+
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
189
207
|
assert_equal(1, Sidekiq::Scheduler.scheduled_jobs.size)
|
190
208
|
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
191
209
|
end
|
@@ -34,18 +34,18 @@ class WebTest < MiniTest::Test
|
|
34
34
|
it 'shows schedule' do
|
35
35
|
get '/recurring-jobs'
|
36
36
|
|
37
|
-
assert_match
|
38
|
-
assert_match
|
39
|
-
assert_match
|
40
|
-
assert_match
|
41
|
-
assert_match
|
42
|
-
assert_match
|
43
|
-
|
44
|
-
assert_match
|
45
|
-
assert_match
|
46
|
-
assert_match
|
47
|
-
assert_match
|
48
|
-
assert_match
|
37
|
+
assert_match(/Foo Job/, last_response.body)
|
38
|
+
assert_match(/FooClass/, last_response.body)
|
39
|
+
assert_match(/0 \* \* \* \* US\/Eastern/, last_response.body)
|
40
|
+
assert_match(/default/, last_response.body)
|
41
|
+
assert_match(/\[42\]/, last_response.body)
|
42
|
+
assert_match(/Does foo things\./, last_response.body)
|
43
|
+
|
44
|
+
assert_match(/Bar Job/, last_response.body)
|
45
|
+
assert_match(/BarClass/, last_response.body)
|
46
|
+
assert_match(/1h/, last_response.body)
|
47
|
+
assert_match(/special/, last_response.body)
|
48
|
+
assert_match(/\[\"foo\", \"bar\"\]/, last_response.body)
|
49
49
|
end
|
50
50
|
end
|
51
|
-
end
|
51
|
+
end
|
data/test/schedule_test.rb
CHANGED
@@ -3,118 +3,78 @@ require 'test_helper'
|
|
3
3
|
class ScheduleTest < Minitest::Test
|
4
4
|
|
5
5
|
describe 'SidekiqScheduler::Schedule' do
|
6
|
+
|
7
|
+
def build_cron_hash
|
8
|
+
{
|
9
|
+
'cron' => '* * * * *',
|
10
|
+
'class' => 'SomeIvarJob',
|
11
|
+
'args' => '/tmp/75'
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def only_cron_and_args
|
16
|
+
-> (key, _) { %w(cron args).include?(key) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def job_from_redis(job_id)
|
20
|
+
MultiJson.decode(job_from_redis_without_decoding(job_id))
|
21
|
+
end
|
22
|
+
|
23
|
+
def job_from_redis_without_decoding(job_id)
|
24
|
+
Sidekiq.redis { |redis|
|
25
|
+
redis.hget(:schedules, job_id)
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:cron_hash) { build_cron_hash }
|
30
|
+
let(:job_id) { 'my_ivar_job' }
|
31
|
+
let(:job_class_id) { 'SomeIvarJob' }
|
32
|
+
|
6
33
|
it 'schedule= sets the schedule' do
|
7
34
|
Sidekiq::Scheduler.dynamic = true
|
8
|
-
Sidekiq.schedule = {
|
9
|
-
'my_ivar_job' => {
|
10
|
-
'cron' => '* * * * *',
|
11
|
-
'class' => 'SomeIvarJob',
|
12
|
-
'args' => '/tmp/75'
|
13
|
-
}
|
14
|
-
}
|
15
35
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
'class' => 'SomeIvarJob',
|
20
|
-
'args' => '/tmp/75'
|
21
|
-
},
|
22
|
-
MultiJson.decode(Sidekiq.redis { |r|
|
23
|
-
r.hget(:schedules, 'my_ivar_job')
|
24
|
-
})
|
25
|
-
)
|
36
|
+
Sidekiq.schedule = {job_id => cron_hash}
|
37
|
+
|
38
|
+
assert_equal(cron_hash, job_from_redis(job_id))
|
26
39
|
end
|
27
40
|
|
28
41
|
it "schedule= uses job name as 'class' argument if it's missing" do
|
29
42
|
Sidekiq::Scheduler.dynamic = true
|
30
|
-
Sidekiq.schedule = {
|
31
|
-
'SomeIvarJob' => {
|
32
|
-
'cron' => '* * * * *',
|
33
|
-
'args' => '/tmp/75'
|
34
|
-
}
|
35
|
-
}
|
36
43
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
'args' => '/tmp/75'
|
42
|
-
},
|
43
|
-
MultiJson.decode(Sidekiq.redis { |r| r.hget(:schedules, 'SomeIvarJob') })
|
44
|
-
)
|
45
|
-
assert_equal('SomeIvarJob', Sidekiq.schedule['SomeIvarJob']['class'])
|
44
|
+
Sidekiq.schedule = {job_class_id => cron_hash.select(&only_cron_and_args)}
|
45
|
+
|
46
|
+
assert_equal(cron_hash, job_from_redis(job_class_id))
|
47
|
+
assert_equal(job_class_id, Sidekiq.schedule[job_class_id]['class'])
|
46
48
|
end
|
47
49
|
|
48
50
|
it 'schedule= does not mutate argument' do
|
49
|
-
schedule = {
|
50
|
-
|
51
|
-
'cron' => '* * * * *',
|
52
|
-
'args' => '/tmp/75'
|
53
|
-
}
|
54
|
-
}
|
51
|
+
schedule = {job_class_id => cron_hash.select(&only_cron_and_args)}
|
52
|
+
|
55
53
|
Sidekiq.schedule = schedule
|
56
|
-
|
54
|
+
|
55
|
+
assert !schedule[job_class_id].key?('class')
|
57
56
|
end
|
58
57
|
|
59
58
|
it 'set_schedule can set an individual schedule' do
|
60
|
-
Sidekiq.set_schedule(
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
'class' => 'SomeIvarJob',
|
65
|
-
'args' => '/tmp/22'
|
66
|
-
}
|
67
|
-
)
|
68
|
-
assert_equal(
|
69
|
-
{
|
70
|
-
'cron' => '* * * * *',
|
71
|
-
'class' => 'SomeIvarJob',
|
72
|
-
'args' => '/tmp/22'
|
73
|
-
},
|
74
|
-
MultiJson.decode(Sidekiq.redis { |r| r.hget(:schedules, 'some_ivar_job') })
|
75
|
-
)
|
76
|
-
assert Sidekiq.redis { |r| r.sismember(:schedules_changed, 'some_ivar_job') }
|
59
|
+
Sidekiq.set_schedule(job_id, cron_hash)
|
60
|
+
|
61
|
+
assert_equal(cron_hash, job_from_redis(job_id))
|
62
|
+
assert Sidekiq.redis { |r| r.sismember(:schedules_changed, job_id) }
|
77
63
|
end
|
78
64
|
|
79
65
|
it 'get_schedule returns a schedule' do
|
80
|
-
Sidekiq.redis { |r| r.hset(
|
81
|
-
|
82
|
-
|
83
|
-
MultiJson.encode(
|
84
|
-
{
|
85
|
-
'cron' => '* * * * *',
|
86
|
-
'class' => 'SomeIvarJob',
|
87
|
-
'args' => '/tmp/33'
|
88
|
-
}
|
89
|
-
)
|
90
|
-
) }
|
91
|
-
assert_equal(
|
92
|
-
{
|
93
|
-
'cron' => '* * * * *',
|
94
|
-
'class' => 'SomeIvarJob',
|
95
|
-
'args' => '/tmp/33'
|
96
|
-
},
|
97
|
-
Sidekiq.get_schedule('some_ivar_job2')
|
98
|
-
)
|
66
|
+
Sidekiq.redis { |r| r.hset(:schedules, job_id, MultiJson.encode(cron_hash)) }
|
67
|
+
|
68
|
+
assert_equal(cron_hash, Sidekiq.get_schedule(job_id))
|
99
69
|
end
|
100
70
|
|
101
71
|
it 'remove_schedule removes a schedule' do
|
102
|
-
Sidekiq.redis
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
'cron' => '* * * * *',
|
109
|
-
'class' => 'SomeIvarJob',
|
110
|
-
'args' => '/tmp/44'
|
111
|
-
}
|
112
|
-
)
|
113
|
-
)
|
114
|
-
end
|
115
|
-
Sidekiq.remove_schedule('some_ivar_job3')
|
116
|
-
assert_equal nil, Sidekiq.redis{ |r| r.hget(:schedules, 'some_ivar_job3') }
|
117
|
-
assert Sidekiq.redis{ |r| r.sismember(:schedules_changed, 'some_ivar_job3') }
|
72
|
+
Sidekiq.redis { |r| r.hset(:schedules, job_id, MultiJson.encode(cron_hash)) }
|
73
|
+
|
74
|
+
Sidekiq.remove_schedule(job_id)
|
75
|
+
|
76
|
+
assert_equal nil, job_from_redis_without_decoding(job_id)
|
77
|
+
assert Sidekiq.redis{ |r| r.sismember(:schedules_changed, job_id) }
|
118
78
|
end
|
119
79
|
end
|
120
|
-
end
|
80
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'simplecov'
|
2
2
|
SimpleCov.start
|
3
3
|
|
4
|
+
require 'coveralls'
|
5
|
+
Coveralls.wear!
|
6
|
+
|
4
7
|
require 'minitest/autorun'
|
5
8
|
require 'minitest/pride'
|
6
9
|
require 'minitest/autorun'
|
@@ -36,15 +39,15 @@ end
|
|
36
39
|
|
37
40
|
class SomeJob
|
38
41
|
include Sidekiq::Worker
|
39
|
-
def self.perform(
|
42
|
+
def self.perform(_, _)
|
40
43
|
end
|
41
44
|
end
|
42
45
|
|
43
46
|
class SomeIvarJob < SomeJob
|
44
|
-
sidekiq_options :
|
47
|
+
sidekiq_options queue: :ivar
|
45
48
|
end
|
46
49
|
|
47
50
|
class SomeRealClass
|
48
51
|
include Sidekiq::Worker
|
49
|
-
sidekiq_options :
|
50
|
-
end
|
52
|
+
sidekiq_options queue: :some_real_queue
|
53
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Morton Jonuschat
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-11-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sidekiq
|
@@ -45,14 +45,14 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 3.1.7
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 3.1.7
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: multi_json
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
@@ -151,6 +151,20 @@ dependencies:
|
|
151
151
|
- - "~>"
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: '0'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: coveralls
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - ">="
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - ">="
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
154
168
|
- !ruby/object:Gem::Dependency
|
155
169
|
name: rack-test
|
156
170
|
requirement: !ruby/object:Gem::Requirement
|
@@ -197,7 +211,6 @@ files:
|
|
197
211
|
- lib/sidekiq-scheduler/version.rb
|
198
212
|
- lib/sidekiq-scheduler/web.rb
|
199
213
|
- lib/sidekiq/scheduler.rb
|
200
|
-
- lib/tasks/sidekiq-scheduler_tasks.rake
|
201
214
|
- test/config.yml
|
202
215
|
- test/fake_env.rb
|
203
216
|
- test/lib/sidekiq/scheduler_test.rb
|