sidekiq-scheduler 1.2.2 → 1.2.3
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 +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
|