sidekiq-scheduler 2.0.4 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +3 -8
- data/lib/sidekiq/scheduler.rb +52 -9
- data/lib/sidekiq-scheduler/version.rb +1 -1
- data/lib/sidekiq-scheduler/web.rb +2 -1
- data/web/locales/cs.yml +9 -0
- data/web/locales/en.yml +9 -0
- data/web/views/recurring_jobs.erb +8 -8
- metadata +58 -58
- data/test/config.yml +0 -11
- data/test/fake_env.rb +0 -0
- data/test/lib/sidekiq/scheduler_test.rb +0 -326
- data/test/lib/sidekiq/web_test.rb +0 -72
- data/test/schedule_test.rb +0 -97
- data/test/support/direct_worker.rb +0 -6
- data/test/support/my_worker.rb +0 -3
- data/test/test_helper.rb +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c13477c36de16f83f295c07f237a6182a2e8b422
|
4
|
+
data.tar.gz: 00bd5143e5c9a63038f4aa5ec879e9d1cb5d0389
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dab3552b21945d9fca703a2aa97de4ca0750b15236bffb95b80af82f14c9e10a8d1a5e2e0011105cdf6a47f51e63737cbb5293cfb8689faa16fce2fb4ad41a8f
|
7
|
+
data.tar.gz: 9db739424af1df7bef42f4bb418a2282c6962f0f1392da13dbe8e19a57bbd6587cb73888d714e2950669997a09c944cfb552350f8ca255b2af7a09c9b829e806
|
data/Rakefile
CHANGED
@@ -22,13 +22,8 @@ end
|
|
22
22
|
|
23
23
|
Bundler::GemHelper.install_tasks
|
24
24
|
|
25
|
-
require '
|
25
|
+
require 'rspec/core/rake_task'
|
26
26
|
|
27
|
-
|
28
|
-
t.libs << 'lib'
|
29
|
-
t.libs << 'test'
|
30
|
-
t.pattern = 'test/**/*_test.rb'
|
31
|
-
t.verbose = false
|
32
|
-
end
|
27
|
+
RSpec::Core::RakeTask.new('spec')
|
33
28
|
|
34
|
-
task default: :
|
29
|
+
task default: :spec
|
data/lib/sidekiq/scheduler.rb
CHANGED
@@ -91,7 +91,7 @@ module Sidekiq
|
|
91
91
|
# job should be scheduled regardless of what ENV['RAILS_ENV'] is set
|
92
92
|
# to.
|
93
93
|
if config['rails_env'].nil? || self.rails_env_matches?(config)
|
94
|
-
logger.info "Scheduling #{name} "
|
94
|
+
logger.info "Scheduling #{name} #{config}"
|
95
95
|
interval_defined = false
|
96
96
|
interval_types = %w{cron every at in}
|
97
97
|
interval_types.each do |interval_type|
|
@@ -135,15 +135,12 @@ module Sidekiq
|
|
135
135
|
|
136
136
|
# Enqueue a job based on a config hash
|
137
137
|
def self.enqueue_job(job_config)
|
138
|
-
config = job_config.dup
|
138
|
+
config = prepare_arguments(job_config.dup)
|
139
139
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
if defined?(ActiveJob::Enqueuing) && config['class'].included_modules.include?(ActiveJob::Enqueuing)
|
144
|
-
config['class'].new.enqueue(config)
|
140
|
+
if active_job_enqueue?(config['class'])
|
141
|
+
enque_with_active_job(config)
|
145
142
|
else
|
146
|
-
|
143
|
+
enque_with_sidekiq(config)
|
147
144
|
end
|
148
145
|
end
|
149
146
|
|
@@ -156,7 +153,7 @@ module Sidekiq
|
|
156
153
|
end
|
157
154
|
|
158
155
|
def self.rufus_scheduler
|
159
|
-
@rufus_scheduler ||= Rufus::Scheduler.new
|
156
|
+
@rufus_scheduler ||= Rufus::Scheduler.new(rufus_scheduler_options)
|
160
157
|
end
|
161
158
|
|
162
159
|
# Stops old rufus scheduler and creates a new one. Returns the new
|
@@ -202,5 +199,51 @@ module Sidekiq
|
|
202
199
|
end
|
203
200
|
end
|
204
201
|
|
202
|
+
def self.enque_with_active_job(config)
|
203
|
+
initialize_active_job(config['class'], config['args']).enqueue(config)
|
204
|
+
end
|
205
|
+
|
206
|
+
def self.enque_with_sidekiq(config)
|
207
|
+
Sidekiq::Client.push(config)
|
208
|
+
end
|
209
|
+
|
210
|
+
def self.initialize_active_job(klass, args)
|
211
|
+
if args.is_a?(Array)
|
212
|
+
klass.new(*args)
|
213
|
+
else
|
214
|
+
klass.new(args)
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
# Returns true if the enqueuing needs to be done for an ActiveJob
|
219
|
+
# class false otherwise.
|
220
|
+
#
|
221
|
+
# @param [Class] klass the class to check is decendant from ActiveJob
|
222
|
+
#
|
223
|
+
# @return [Boolean]
|
224
|
+
def self.active_job_enqueue?(klass)
|
225
|
+
defined?(ActiveJob::Enqueuing) && klass.included_modules.include?(ActiveJob::Enqueuing)
|
226
|
+
end
|
227
|
+
|
228
|
+
# Convert the given arguments in the format expected to be enqueued.
|
229
|
+
#
|
230
|
+
# @param [Hash] config the options to be converted
|
231
|
+
# @option config [String] class the job class
|
232
|
+
# @option config [Hash/Array] args the arguments to be passed to the job
|
233
|
+
# class
|
234
|
+
#
|
235
|
+
# @return [Hash]
|
236
|
+
def self.prepare_arguments(config)
|
237
|
+
config['class'] = config['class'].constantize if config['class'].is_a?(String)
|
238
|
+
|
239
|
+
if config['args'].is_a?(Hash)
|
240
|
+
config['args'].symbolize_keys! if config['args'].respond_to?(:symbolize_keys!)
|
241
|
+
else
|
242
|
+
config['args'] = Array(config['args'])
|
243
|
+
end
|
244
|
+
|
245
|
+
config
|
246
|
+
end
|
247
|
+
|
205
248
|
end
|
206
249
|
end
|
@@ -22,4 +22,5 @@ end
|
|
22
22
|
|
23
23
|
require 'sidekiq/web' unless defined?(Sidekiq::Web)
|
24
24
|
Sidekiq::Web.register(SidekiqScheduler::Web)
|
25
|
-
Sidekiq::Web.tabs['
|
25
|
+
Sidekiq::Web.tabs['recurring_jobs'] = 'recurring-jobs'
|
26
|
+
Sidekiq::Web.set :locales, Sidekiq::Web.locales << File.expand_path(File.dirname(__FILE__) + "/../../web/locales")
|
data/web/locales/cs.yml
ADDED
data/web/locales/en.yml
ADDED
@@ -1,15 +1,15 @@
|
|
1
|
-
<h3
|
1
|
+
<h3><%= t('recurring_jobs') %></h3>
|
2
2
|
|
3
3
|
<div class="table_container">
|
4
4
|
<table class="table table-hover table-bordered table-striped table-white">
|
5
5
|
<thead>
|
6
6
|
<tr>
|
7
|
-
<th
|
8
|
-
<th
|
9
|
-
<th
|
10
|
-
<th
|
11
|
-
<th
|
12
|
-
<th
|
7
|
+
<th><%= t('name') %></th>
|
8
|
+
<th><%= t('description') %></th>
|
9
|
+
<th><%= t('interval') %></th>
|
10
|
+
<th><%= t('class') %></th>
|
11
|
+
<th><%= t('queue') %></th>
|
12
|
+
<th><%= t('arguments') %></th>
|
13
13
|
<th></th>
|
14
14
|
</tr>
|
15
15
|
</thead>
|
@@ -27,7 +27,7 @@
|
|
27
27
|
<td><%= job_spec['args'] %></td>
|
28
28
|
<td class="text-center">
|
29
29
|
<a class="btn btn-warn btn-xs" href="<%= root_path %>recurring-jobs/<%= URI.escape(name) %>/enqueue">
|
30
|
-
|
30
|
+
<%= t('enqueue_now') %>
|
31
31
|
</a>
|
32
32
|
</td>
|
33
33
|
</tr>
|
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: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Morton Jonuschat
|
@@ -9,202 +9,216 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-
|
12
|
+
date: 2016-03-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sidekiq
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - '>='
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: '3'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: '3'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: redis
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- -
|
32
|
+
- - ~>
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: '3'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- -
|
39
|
+
- - ~>
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: '3'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rufus-scheduler
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ~>
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: 3.1.8
|
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
55
|
version: 3.1.8
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: multi_json
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ~>
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: '1'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ~>
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: '1'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: tilt
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ~>
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: '2.0'
|
77
77
|
type: :runtime
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- -
|
81
|
+
- - ~>
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '2.0'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: rake
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- -
|
88
|
+
- - ~>
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: '10.0'
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- -
|
95
|
+
- - ~>
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: '10.0'
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: timecop
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - ~>
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- -
|
109
|
+
- - ~>
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: mocha
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
|
-
- -
|
116
|
+
- - ~>
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: '0'
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
|
-
- -
|
123
|
+
- - ~>
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
|
-
name:
|
127
|
+
name: rspec
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
|
-
- -
|
130
|
+
- - '>='
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version: '
|
132
|
+
version: '0'
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
|
-
- -
|
137
|
+
- - '>='
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version: '
|
139
|
+
version: '0'
|
140
140
|
- !ruby/object:Gem::Dependency
|
141
141
|
name: mock_redis
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
143
143
|
requirements:
|
144
|
-
- -
|
144
|
+
- - ~>
|
145
145
|
- !ruby/object:Gem::Version
|
146
146
|
version: '0'
|
147
147
|
type: :development
|
148
148
|
prerelease: false
|
149
149
|
version_requirements: !ruby/object:Gem::Requirement
|
150
150
|
requirements:
|
151
|
-
- -
|
151
|
+
- - ~>
|
152
152
|
- !ruby/object:Gem::Version
|
153
153
|
version: '0'
|
154
154
|
- !ruby/object:Gem::Dependency
|
155
155
|
name: simplecov
|
156
156
|
requirement: !ruby/object:Gem::Requirement
|
157
157
|
requirements:
|
158
|
-
- -
|
158
|
+
- - ~>
|
159
159
|
- !ruby/object:Gem::Version
|
160
160
|
version: '0'
|
161
161
|
type: :development
|
162
162
|
prerelease: false
|
163
163
|
version_requirements: !ruby/object:Gem::Requirement
|
164
164
|
requirements:
|
165
|
-
- -
|
165
|
+
- - ~>
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
- !ruby/object:Gem::Dependency
|
169
|
+
name: activejob
|
170
|
+
requirement: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
type: :development
|
176
|
+
prerelease: false
|
177
|
+
version_requirements: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - '>='
|
166
180
|
- !ruby/object:Gem::Version
|
167
181
|
version: '0'
|
168
182
|
- !ruby/object:Gem::Dependency
|
169
183
|
name: coveralls
|
170
184
|
requirement: !ruby/object:Gem::Requirement
|
171
185
|
requirements:
|
172
|
-
- -
|
186
|
+
- - '>='
|
173
187
|
- !ruby/object:Gem::Version
|
174
188
|
version: '0'
|
175
189
|
type: :development
|
176
190
|
prerelease: false
|
177
191
|
version_requirements: !ruby/object:Gem::Requirement
|
178
192
|
requirements:
|
179
|
-
- -
|
193
|
+
- - '>='
|
180
194
|
- !ruby/object:Gem::Version
|
181
195
|
version: '0'
|
182
196
|
- !ruby/object:Gem::Dependency
|
183
197
|
name: rack-test
|
184
198
|
requirement: !ruby/object:Gem::Requirement
|
185
199
|
requirements:
|
186
|
-
- -
|
200
|
+
- - '>='
|
187
201
|
- !ruby/object:Gem::Version
|
188
202
|
version: '0'
|
189
203
|
type: :development
|
190
204
|
prerelease: false
|
191
205
|
version_requirements: !ruby/object:Gem::Requirement
|
192
206
|
requirements:
|
193
|
-
- -
|
207
|
+
- - '>='
|
194
208
|
- !ruby/object:Gem::Version
|
195
209
|
version: '0'
|
196
210
|
- !ruby/object:Gem::Dependency
|
197
211
|
name: sinatra
|
198
212
|
requirement: !ruby/object:Gem::Requirement
|
199
213
|
requirements:
|
200
|
-
- -
|
214
|
+
- - '>='
|
201
215
|
- !ruby/object:Gem::Version
|
202
216
|
version: '0'
|
203
217
|
type: :development
|
204
218
|
prerelease: false
|
205
219
|
version_requirements: !ruby/object:Gem::Requirement
|
206
220
|
requirements:
|
207
|
-
- -
|
221
|
+
- - '>='
|
208
222
|
- !ruby/object:Gem::Version
|
209
223
|
version: '0'
|
210
224
|
description: Light weight job scheduling extension for Sidekiq that adds support for
|
@@ -215,24 +229,18 @@ executables: []
|
|
215
229
|
extensions: []
|
216
230
|
extra_rdoc_files: []
|
217
231
|
files:
|
218
|
-
-
|
219
|
-
- README.md
|
220
|
-
- Rakefile
|
221
|
-
- lib/sidekiq-scheduler.rb
|
232
|
+
- lib/sidekiq/scheduler.rb
|
222
233
|
- lib/sidekiq-scheduler/manager.rb
|
223
234
|
- lib/sidekiq-scheduler/schedule.rb
|
224
235
|
- lib/sidekiq-scheduler/version.rb
|
225
236
|
- lib/sidekiq-scheduler/web.rb
|
226
|
-
- lib/sidekiq
|
227
|
-
-
|
228
|
-
-
|
229
|
-
- test/lib/sidekiq/scheduler_test.rb
|
230
|
-
- test/lib/sidekiq/web_test.rb
|
231
|
-
- test/schedule_test.rb
|
232
|
-
- test/support/direct_worker.rb
|
233
|
-
- test/support/my_worker.rb
|
234
|
-
- test/test_helper.rb
|
237
|
+
- lib/sidekiq-scheduler.rb
|
238
|
+
- web/locales/cs.yml
|
239
|
+
- web/locales/en.yml
|
235
240
|
- web/views/recurring_jobs.erb
|
241
|
+
- MIT-LICENSE
|
242
|
+
- Rakefile
|
243
|
+
- README.md
|
236
244
|
homepage: https://github.com/moove-it/sidekiq-scheduler
|
237
245
|
licenses:
|
238
246
|
- MIT
|
@@ -243,26 +251,18 @@ require_paths:
|
|
243
251
|
- lib
|
244
252
|
required_ruby_version: !ruby/object:Gem::Requirement
|
245
253
|
requirements:
|
246
|
-
- -
|
254
|
+
- - '>='
|
247
255
|
- !ruby/object:Gem::Version
|
248
256
|
version: '0'
|
249
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
250
258
|
requirements:
|
251
|
-
- -
|
259
|
+
- - '>='
|
252
260
|
- !ruby/object:Gem::Version
|
253
261
|
version: '0'
|
254
262
|
requirements: []
|
255
263
|
rubyforge_project:
|
256
|
-
rubygems_version: 2.
|
264
|
+
rubygems_version: 2.0.14
|
257
265
|
signing_key:
|
258
266
|
specification_version: 4
|
259
267
|
summary: Light weight job scheduling extension for Sidekiq
|
260
|
-
test_files:
|
261
|
-
- test/config.yml
|
262
|
-
- test/fake_env.rb
|
263
|
-
- test/lib/sidekiq/scheduler_test.rb
|
264
|
-
- test/lib/sidekiq/web_test.rb
|
265
|
-
- test/schedule_test.rb
|
266
|
-
- test/support/direct_worker.rb
|
267
|
-
- test/support/my_worker.rb
|
268
|
-
- test/test_helper.rb
|
268
|
+
test_files: []
|
data/test/config.yml
DELETED
data/test/fake_env.rb
DELETED
File without changes
|
@@ -1,326 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ManagerTest < Minitest::Test
|
4
|
-
describe 'Sidekiq::Scheduler' do
|
5
|
-
|
6
|
-
before do
|
7
|
-
Sidekiq::Scheduler.enabled = true
|
8
|
-
Sidekiq::Scheduler.dynamic = false
|
9
|
-
Sidekiq.redis { |r| r.del(:schedules) }
|
10
|
-
Sidekiq.redis { |r| r.del(:schedules_changed) }
|
11
|
-
Sidekiq::Scheduler.clear_schedule!
|
12
|
-
Sidekiq::Scheduler.send(:class_variable_set, :@@scheduled_jobs, {})
|
13
|
-
end
|
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
|
-
|
32
|
-
it 'enqueue constantizes' do
|
33
|
-
# The job should be loaded, since a missing rails_env means ALL envs.
|
34
|
-
ENV['RAILS_ENV'] = 'production'
|
35
|
-
config = {
|
36
|
-
'cron' => '* * * * *',
|
37
|
-
'class' => 'SomeRealClass',
|
38
|
-
'queue' => 'high',
|
39
|
-
'args' => '/tmp'
|
40
|
-
}
|
41
|
-
|
42
|
-
Sidekiq::Client.expects(:push).with(
|
43
|
-
{
|
44
|
-
'cron' => '* * * * *',
|
45
|
-
'class' => SomeRealClass,
|
46
|
-
'queue' => 'high',
|
47
|
-
'args' => ['/tmp']
|
48
|
-
}
|
49
|
-
)
|
50
|
-
Sidekiq::Scheduler.enqueue_job(config)
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'enqueue_job respects queue params' do
|
54
|
-
config = {
|
55
|
-
'cron' => '* * * * *',
|
56
|
-
'class' => 'SomeIvarJob',
|
57
|
-
'queue' => 'high'
|
58
|
-
}
|
59
|
-
|
60
|
-
Sidekiq::Client.expects(:push).with(
|
61
|
-
{
|
62
|
-
'cron' => '* * * * *',
|
63
|
-
'class' => SomeIvarJob,
|
64
|
-
'args' => [],
|
65
|
-
'queue' => 'high'
|
66
|
-
}
|
67
|
-
)
|
68
|
-
|
69
|
-
Sidekiq::Scheduler.enqueue_job(config)
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'config makes it into the rufus_scheduler' do
|
73
|
-
assert_equal(0, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
74
|
-
Sidekiq.schedule = {
|
75
|
-
:some_ivar_job => {
|
76
|
-
'cron' => '* * * * *',
|
77
|
-
'class' => 'SomeIvarJob',
|
78
|
-
'args' => '/tmp'
|
79
|
-
}
|
80
|
-
}
|
81
|
-
|
82
|
-
Sidekiq::Scheduler.load_schedule!
|
83
|
-
|
84
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
85
|
-
assert Sidekiq::Scheduler.scheduled_jobs.include?(:some_ivar_job)
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'can pass options to the Rufus scheduler instance' do
|
89
|
-
options = { :lockfile => '/tmp/rufus_lock' }
|
90
|
-
|
91
|
-
Sidekiq::Scheduler.rufus_scheduler_options = options
|
92
|
-
Rufus::Scheduler.expects(:new).with(options)
|
93
|
-
|
94
|
-
Sidekiq::Scheduler.clear_schedule!
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'can reload schedule' do
|
98
|
-
Sidekiq::Scheduler.dynamic = true
|
99
|
-
Sidekiq.schedule = {
|
100
|
-
:some_ivar_job => {
|
101
|
-
'cron' => '* * * * *',
|
102
|
-
'class' => 'SomeIvarJob',
|
103
|
-
'args' => '/tmp'
|
104
|
-
}
|
105
|
-
}
|
106
|
-
|
107
|
-
Sidekiq::Scheduler.load_schedule!
|
108
|
-
|
109
|
-
assert Sidekiq::Scheduler.scheduled_jobs.include?('some_ivar_job')
|
110
|
-
|
111
|
-
Sidekiq.redis { |r| r.del(:schedules) }
|
112
|
-
Sidekiq.redis do |r|
|
113
|
-
r.hset(
|
114
|
-
:schedules,
|
115
|
-
'some_ivar_job2',
|
116
|
-
MultiJson.encode(
|
117
|
-
{
|
118
|
-
'cron' => '* * * * *',
|
119
|
-
'class' => 'SomeIvarJob',
|
120
|
-
'args' => '/tmp/2'
|
121
|
-
}
|
122
|
-
)
|
123
|
-
)
|
124
|
-
end
|
125
|
-
|
126
|
-
Sidekiq::Scheduler.reload_schedule!
|
127
|
-
|
128
|
-
refute Sidekiq::Scheduler.scheduled_jobs.include?('some_ivar_job')
|
129
|
-
assert Sidekiq::Scheduler.scheduled_jobs.include?('some_ivar_job2')
|
130
|
-
|
131
|
-
assert_equal '/tmp/2', Sidekiq.schedule['some_ivar_job2']['args']
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'reloads the schedule from redis after 5 seconds when dynamic' do
|
135
|
-
Sidekiq.redis { |r| r.flushdb }
|
136
|
-
Sidekiq::Scheduler.clear_schedule!
|
137
|
-
|
138
|
-
Sidekiq::Scheduler.dynamic = true
|
139
|
-
Sidekiq.schedule = {
|
140
|
-
:some_ivar_job => {
|
141
|
-
'cron' => '* * * * *',
|
142
|
-
'class' => 'SomeIvarJob',
|
143
|
-
'args' => '/tmp'
|
144
|
-
}
|
145
|
-
}
|
146
|
-
|
147
|
-
Sidekiq::Scheduler.load_schedule!
|
148
|
-
|
149
|
-
assert Sidekiq::Scheduler.scheduled_jobs.include?('some_ivar_job')
|
150
|
-
assert !Sidekiq::Scheduler.scheduled_jobs.include?('some_ivar_job2')
|
151
|
-
|
152
|
-
Sidekiq.set_schedule(
|
153
|
-
'some_ivar_job2',
|
154
|
-
{
|
155
|
-
'cron' => '* * * * *',
|
156
|
-
'class' => 'SomeIvarJob',
|
157
|
-
'args' => '/tmp/2'
|
158
|
-
}
|
159
|
-
)
|
160
|
-
|
161
|
-
Timecop.travel(7 * 60)
|
162
|
-
sleep 0.1
|
163
|
-
|
164
|
-
assert Sidekiq::Scheduler.scheduled_jobs.include?('some_ivar_job')
|
165
|
-
assert Sidekiq::Scheduler.scheduled_jobs.include?('some_ivar_job2')
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
it 'load_schedule_job loads a schedule' do
|
170
|
-
Sidekiq::Scheduler.load_schedule_job(
|
171
|
-
'some_ivar_job',
|
172
|
-
{
|
173
|
-
'cron' => '* * * * *',
|
174
|
-
'class' => 'SomeIvarJob',
|
175
|
-
'args' => '/tmp'
|
176
|
-
}
|
177
|
-
)
|
178
|
-
|
179
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
180
|
-
assert_equal(1, Sidekiq::Scheduler.scheduled_jobs.size)
|
181
|
-
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
182
|
-
end
|
183
|
-
|
184
|
-
it 'load_schedule_job with every with options' do
|
185
|
-
Sidekiq::Scheduler.load_schedule_job(
|
186
|
-
'some_ivar_job',
|
187
|
-
{
|
188
|
-
'every' => ['30s', {'first_in' => '60s'}],
|
189
|
-
'class' => 'SomeIvarJob',
|
190
|
-
'args' => '/tmp'
|
191
|
-
}
|
192
|
-
)
|
193
|
-
|
194
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
195
|
-
assert_equal(1, Sidekiq::Scheduler.scheduled_jobs.size)
|
196
|
-
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
197
|
-
assert Sidekiq::Scheduler.scheduled_jobs['some_ivar_job'].params.keys.include?(:first_in)
|
198
|
-
end
|
199
|
-
|
200
|
-
it 'load_schedule_job with cron with options' do
|
201
|
-
Sidekiq::Scheduler.load_schedule_job(
|
202
|
-
'some_ivar_job',
|
203
|
-
{
|
204
|
-
'cron' => ['* * * * *', {'allow_overlapping' => 'true'}],
|
205
|
-
'class' => 'SomeIvarJob',
|
206
|
-
'args' => '/tmp'
|
207
|
-
}
|
208
|
-
)
|
209
|
-
|
210
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
211
|
-
assert_equal(1, Sidekiq::Scheduler.scheduled_jobs.size)
|
212
|
-
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
213
|
-
assert Sidekiq::Scheduler.scheduled_jobs['some_ivar_job'].params.keys.include?(:allow_overlapping)
|
214
|
-
end
|
215
|
-
|
216
|
-
it 'load_schedule_job with at' do
|
217
|
-
Sidekiq::Scheduler.load_schedule_job(
|
218
|
-
'some_ivar_job',
|
219
|
-
{
|
220
|
-
'at' => "2013/12/12 12:30",
|
221
|
-
'class' => 'SomeIvarJob',
|
222
|
-
'args' => '/tmp'
|
223
|
-
}
|
224
|
-
)
|
225
|
-
|
226
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
227
|
-
assert_equal(1, Sidekiq::Scheduler.scheduled_jobs.size)
|
228
|
-
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
229
|
-
end
|
230
|
-
|
231
|
-
it 'load_schedule_job with in' do
|
232
|
-
Sidekiq::Scheduler.load_schedule_job(
|
233
|
-
'some_ivar_job',
|
234
|
-
{
|
235
|
-
'in' => "10d",
|
236
|
-
'class' => 'SomeIvarJob',
|
237
|
-
'args' => '/tmp'
|
238
|
-
}
|
239
|
-
)
|
240
|
-
|
241
|
-
assert_equal(1, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
242
|
-
assert_equal(1, Sidekiq::Scheduler.scheduled_jobs.size)
|
243
|
-
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
244
|
-
end
|
245
|
-
|
246
|
-
it 'does not load the schedule without cron' do
|
247
|
-
Sidekiq::Scheduler.load_schedule_job(
|
248
|
-
'some_ivar_job',
|
249
|
-
{
|
250
|
-
'class' => 'SomeIvarJob',
|
251
|
-
'args' => '/tmp'
|
252
|
-
}
|
253
|
-
)
|
254
|
-
|
255
|
-
assert_equal(0, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
256
|
-
assert_equal(0, Sidekiq::Scheduler.scheduled_jobs.size)
|
257
|
-
assert !Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
258
|
-
end
|
259
|
-
|
260
|
-
it 'does not load the schedule with an empty cron' do
|
261
|
-
Sidekiq::Scheduler.load_schedule_job(
|
262
|
-
'some_ivar_job',
|
263
|
-
{
|
264
|
-
'cron' => '',
|
265
|
-
'class' => 'SomeIvarJob',
|
266
|
-
'args' => '/tmp'
|
267
|
-
}
|
268
|
-
)
|
269
|
-
|
270
|
-
assert_equal(0, Sidekiq::Scheduler.rufus_scheduler.jobs.size)
|
271
|
-
assert_equal(0, Sidekiq::Scheduler.scheduled_jobs.size)
|
272
|
-
assert !Sidekiq::Scheduler.scheduled_jobs.keys.include?('some_ivar_job')
|
273
|
-
end
|
274
|
-
|
275
|
-
it 'update_schedule' do
|
276
|
-
Sidekiq::Scheduler.dynamic = true
|
277
|
-
Sidekiq.schedule = {
|
278
|
-
'some_ivar_job' => {'cron' => '* * * * *', 'class' => 'SomeIvarJob', 'args' => '/tmp'},
|
279
|
-
'another_ivar_job' => {'cron' => '* * * * *', 'class' => 'SomeIvarJob', 'args' => '/tmp/5'},
|
280
|
-
'stay_put_job' => {'cron' => '* * * * *', 'class' => 'SomeJob', 'args' => '/tmp'}
|
281
|
-
}
|
282
|
-
|
283
|
-
Sidekiq::Scheduler.load_schedule!
|
284
|
-
|
285
|
-
Sidekiq::Scheduler.scheduled_jobs['some_ivar_job'].expects(:unschedule)
|
286
|
-
Sidekiq::Scheduler.scheduled_jobs['another_ivar_job'].expects(:unschedule)
|
287
|
-
|
288
|
-
Sidekiq.set_schedule(
|
289
|
-
'some_ivar_job',
|
290
|
-
{
|
291
|
-
'cron' => '* * * * *',
|
292
|
-
'class' => 'SomeIvarJob',
|
293
|
-
'args' => '/tmp/2'
|
294
|
-
}
|
295
|
-
)
|
296
|
-
Sidekiq.set_schedule(
|
297
|
-
'new_ivar_job',
|
298
|
-
{
|
299
|
-
'cron' => '* * * * *',
|
300
|
-
'class' => 'SomeJob',
|
301
|
-
'args' => '/tmp/3'
|
302
|
-
}
|
303
|
-
)
|
304
|
-
Sidekiq.set_schedule(
|
305
|
-
'stay_put_job',
|
306
|
-
{
|
307
|
-
'cron' => '* * * * *',
|
308
|
-
'class' => 'SomeJob',
|
309
|
-
'args' => '/tmp'
|
310
|
-
}
|
311
|
-
)
|
312
|
-
Sidekiq.remove_schedule('another_ivar_job')
|
313
|
-
|
314
|
-
Sidekiq::Scheduler.update_schedule
|
315
|
-
|
316
|
-
%w(some_ivar_job new_ivar_job stay_put_job).each do |job_name|
|
317
|
-
assert Sidekiq::Scheduler.scheduled_jobs.keys.include?(job_name)
|
318
|
-
assert Sidekiq.schedule.keys.include?(job_name)
|
319
|
-
end
|
320
|
-
assert !Sidekiq::Scheduler.scheduled_jobs.keys.include?('another_ivar_job')
|
321
|
-
assert !Sidekiq.schedule.keys.include?('another_ivar_job')
|
322
|
-
assert_equal 0, Sidekiq.redis { |r| r.scard(:schedules_changed) }
|
323
|
-
end
|
324
|
-
|
325
|
-
end
|
326
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
require 'sidekiq-scheduler/web'
|
3
|
-
require 'rack/test'
|
4
|
-
|
5
|
-
class WebTest < MiniTest::Test
|
6
|
-
describe 'sidekiq-scheduler web' do
|
7
|
-
include Rack::Test::Methods
|
8
|
-
|
9
|
-
def app
|
10
|
-
Sidekiq::Web
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:jobs) do
|
14
|
-
{
|
15
|
-
'Foo Job' => {
|
16
|
-
'class' => 'FooClass',
|
17
|
-
'cron' => '0 * * * * US/Eastern',
|
18
|
-
'args' => [42],
|
19
|
-
'description' => 'Does foo things.'
|
20
|
-
},
|
21
|
-
|
22
|
-
'Bar Job' => {
|
23
|
-
'class' => 'BarClass',
|
24
|
-
'every' => '1h',
|
25
|
-
'args' => ['foo', 'bar'],
|
26
|
-
'queue' => 'special'
|
27
|
-
}
|
28
|
-
}
|
29
|
-
end
|
30
|
-
|
31
|
-
before do
|
32
|
-
# Sidekiq::WebHelpers expects the Redis client to return an id
|
33
|
-
Sidekiq.redis { |conn| conn.client.stubs(:id).returns('redis://127.0.0.1:1234/0') }
|
34
|
-
|
35
|
-
Sidekiq.schedule = jobs
|
36
|
-
end
|
37
|
-
|
38
|
-
it 'shows schedule' do
|
39
|
-
get '/recurring-jobs'
|
40
|
-
|
41
|
-
assert(last_response.ok?)
|
42
|
-
|
43
|
-
assert_match(/Foo Job/, last_response.body)
|
44
|
-
assert_match(/FooClass/, last_response.body)
|
45
|
-
assert_match(/0 \* \* \* \* US\/Eastern/, last_response.body)
|
46
|
-
assert_match(/default/, last_response.body)
|
47
|
-
assert_match(/\[42\]/, last_response.body)
|
48
|
-
assert_match(/Does foo things\./, last_response.body)
|
49
|
-
|
50
|
-
assert_match(/Bar Job/, last_response.body)
|
51
|
-
assert_match(/BarClass/, last_response.body)
|
52
|
-
assert_match(/1h/, last_response.body)
|
53
|
-
assert_match(/special/, last_response.body)
|
54
|
-
assert_match(/\[\"foo\", \"bar\"\]/, last_response.body)
|
55
|
-
|
56
|
-
assert_match(/Enqueue now/, last_response.body)
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'enqueues particular job' do
|
60
|
-
job_name = jobs.keys.first
|
61
|
-
job = jobs[job_name]
|
62
|
-
|
63
|
-
Sidekiq::Scheduler.expects(:enqueue_job).with(job)
|
64
|
-
|
65
|
-
get "/recurring-jobs/#{URI.escape(job_name)}/enqueue"
|
66
|
-
|
67
|
-
assert(last_response.redirect?)
|
68
|
-
follow_redirect!
|
69
|
-
assert_equal(last_request.path, '/recurring-jobs')
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
data/test/schedule_test.rb
DELETED
@@ -1,97 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ScheduleTest < Minitest::Test
|
4
|
-
|
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
|
-
|
33
|
-
it 'schedule= sets the schedule' do
|
34
|
-
Sidekiq::Scheduler.dynamic = true
|
35
|
-
|
36
|
-
Sidekiq.schedule = {job_id => cron_hash}
|
37
|
-
|
38
|
-
assert_equal(cron_hash, job_from_redis(job_id))
|
39
|
-
end
|
40
|
-
|
41
|
-
it "schedule= uses job name as 'class' argument if it's missing" do
|
42
|
-
Sidekiq::Scheduler.dynamic = true
|
43
|
-
|
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'])
|
48
|
-
end
|
49
|
-
|
50
|
-
it 'schedule= does not mutate argument' do
|
51
|
-
schedule = {job_class_id => cron_hash.select(&only_cron_and_args)}
|
52
|
-
|
53
|
-
Sidekiq.schedule = schedule
|
54
|
-
|
55
|
-
assert !schedule[job_class_id].key?('class')
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'set_schedule can set an individual schedule' do
|
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) }
|
63
|
-
end
|
64
|
-
|
65
|
-
it 'get_schedule returns a schedule' do
|
66
|
-
Sidekiq.redis { |r| r.hset(:schedules, job_id, MultiJson.encode(cron_hash)) }
|
67
|
-
|
68
|
-
assert_equal(cron_hash, Sidekiq.get_schedule(job_id))
|
69
|
-
end
|
70
|
-
|
71
|
-
it 'remove_schedule removes a schedule' do
|
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) }
|
78
|
-
end
|
79
|
-
|
80
|
-
describe 'schedule update' do
|
81
|
-
let(:new_job_id) { 'my_ivar_job_2' }
|
82
|
-
let(:new_job_class_id) { 'SomeIvarJob2' }
|
83
|
-
|
84
|
-
before do
|
85
|
-
Sidekiq::Scheduler.dynamic = true
|
86
|
-
Sidekiq.schedule = {job_id => cron_hash}
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'schedule= adds new jobs to schedule and remove old ones' do
|
90
|
-
Sidekiq.schedule = {new_job_id => cron_hash}
|
91
|
-
|
92
|
-
assert_equal(cron_hash, job_from_redis(new_job_id))
|
93
|
-
assert_equal(nil, job_from_redis_without_decoding(job_id))
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
data/test/support/my_worker.rb
DELETED
data/test/test_helper.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
require 'simplecov'
|
2
|
-
SimpleCov.start
|
3
|
-
|
4
|
-
require 'coveralls'
|
5
|
-
Coveralls.wear!
|
6
|
-
|
7
|
-
require 'minitest/autorun'
|
8
|
-
require 'minitest/pride'
|
9
|
-
require 'minitest/autorun'
|
10
|
-
require 'sidekiq-scheduler'
|
11
|
-
require 'mocha/setup'
|
12
|
-
require 'multi_json'
|
13
|
-
require 'mock_redis'
|
14
|
-
require 'timecop'
|
15
|
-
|
16
|
-
require 'sidekiq'
|
17
|
-
require 'sidekiq/util'
|
18
|
-
if Sidekiq.respond_to?(:logger)
|
19
|
-
Sidekiq.logger.level = Logger::ERROR
|
20
|
-
else
|
21
|
-
Sidekiq::Util.logger.level = Logger::ERROR
|
22
|
-
end
|
23
|
-
|
24
|
-
# Load support files
|
25
|
-
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
26
|
-
|
27
|
-
require 'sidekiq/redis_connection'
|
28
|
-
|
29
|
-
class MiniTest::Spec
|
30
|
-
before :each do
|
31
|
-
redis = MockRedis.new
|
32
|
-
client = Object.new
|
33
|
-
|
34
|
-
redis.stubs(:client).returns(client)
|
35
|
-
client.stubs(:location).returns('MockRedis')
|
36
|
-
|
37
|
-
Sidekiq::RedisConnection.stubs(:create).returns(ConnectionPool.new({}) { redis })
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
class SomeJob
|
42
|
-
include Sidekiq::Worker
|
43
|
-
def self.perform(_, _)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
class SomeIvarJob < SomeJob
|
48
|
-
sidekiq_options queue: :ivar
|
49
|
-
end
|
50
|
-
|
51
|
-
class SomeRealClass
|
52
|
-
include Sidekiq::Worker
|
53
|
-
sidekiq_options queue: :some_real_queue
|
54
|
-
end
|