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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb14c4d168f6e6e04f004a797c8a9247323a8a74
4
- data.tar.gz: 230b4f176c716ca9bef539b4dc1d3f428d1ca48d
3
+ metadata.gz: c13477c36de16f83f295c07f237a6182a2e8b422
4
+ data.tar.gz: 00bd5143e5c9a63038f4aa5ec879e9d1cb5d0389
5
5
  SHA512:
6
- metadata.gz: ca5651d5962fbe5981ec4d57c43bb8114bad49d8160603168b2b8fda14a666abfa6b871e401e43b610b87c05ebd1f9652a37353b3110052da4feb97e25df94fd
7
- data.tar.gz: 50563b08976a926199ccc2cc5dea1bd133574e3e5772c821b2be9e7ae3dd15da90cc7d633173717b3f34aa967eff19b4959db1214085bc11d4d9a20f178e13bd
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 'rake/testtask'
25
+ require 'rspec/core/rake_task'
26
26
 
27
- Rake::TestTask.new(:test) do |t|
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: :test
29
+ task default: :spec
@@ -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
- config['class'] = config['class'].constantize if config['class'].is_a?(String)
141
- config['args'] = Array(config['args'])
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
- Sidekiq::Client.push(config)
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 rufus_scheduler_options
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
@@ -1,5 +1,5 @@
1
1
  module SidekiqScheduler
2
2
 
3
- VERSION = '2.0.4'
3
+ VERSION = '2.0.5'
4
4
 
5
5
  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['Recurring Jobs'] = 'recurring-jobs'
25
+ Sidekiq::Web.tabs['recurring_jobs'] = 'recurring-jobs'
26
+ Sidekiq::Web.set :locales, Sidekiq::Web.locales << File.expand_path(File.dirname(__FILE__) + "/../../web/locales")
@@ -0,0 +1,9 @@
1
+ cs:
2
+ recurring_jobs: Pravidelně opakované
3
+ name: Jméno
4
+ description: Popis
5
+ interval: Interval
6
+ class: Třída
7
+ queue: Fronta
8
+ arguments: Argumenty
9
+ enqueue_now: Zařadit nyní
@@ -0,0 +1,9 @@
1
+ en:
2
+ recurring_jobs: Recurring Jobs
3
+ name: Name
4
+ description: Description
5
+ interval: Interval
6
+ class: Class
7
+ queue: Queue
8
+ arguments: Arguments
9
+ enqueue_now: Enqueue now
@@ -1,15 +1,15 @@
1
- <h3>Recurring Jobs</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>Name</th>
8
- <th>Description</th>
9
- <th>Interval</th>
10
- <th>Class</th>
11
- <th>Queue</th>
12
- <th>Arguments</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
- Enqueue now
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
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-02-02 00:00:00.000000000 Z
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: minitest
127
+ name: rspec
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - "~>"
130
+ - - '>='
131
131
  - !ruby/object:Gem::Version
132
- version: '5.0'
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: '5.0'
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
- - MIT-LICENSE
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/scheduler.rb
227
- - test/config.yml
228
- - test/fake_env.rb
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.4.5
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
@@ -1,11 +0,0 @@
1
- ---
2
- :verbose: false
3
- :environment: xzibit
4
- :require: ./test/fake_env.rb
5
- :pidfile: /tmp/sidekiq-config-test.pid
6
- :concurrency: 50
7
- :resolution: 30
8
- :queues:
9
- - [often, 2]
10
- - [seldom, 1]
11
- ---
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
@@ -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
@@ -1,6 +0,0 @@
1
- class DirectWorker
2
- include Sidekiq::Worker
3
- def perform(a, b)
4
- a + b
5
- end
6
- end
@@ -1,3 +0,0 @@
1
- class MyWorker
2
- include Sidekiq::Worker
3
- end
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