sidekiq-cron 1.9.1 → 1.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +27 -1
- data/Gemfile +3 -0
- data/README.md +42 -13
- data/lib/sidekiq/cron/job.rb +94 -28
- data/lib/sidekiq/cron/launcher.rb +1 -1
- data/lib/sidekiq/cron/schedule_loader.rb +11 -13
- data/lib/sidekiq/cron/version.rb +1 -1
- data/lib/sidekiq/options.rb +6 -2
- data/sidekiq-cron.gemspec +6 -4
- metadata +36 -19
- data/test/integration/performance_test.rb +0 -46
- data/test/test_helper.rb +0 -87
- data/test/unit/fixtures/schedule_array.yml +0 -13
- data/test/unit/fixtures/schedule_erb.yml +0 -6
- data/test/unit/fixtures/schedule_hash.yml +0 -12
- data/test/unit/fixtures/schedule_string.yml +0 -1
- data/test/unit/job_test.rb +0 -1258
- data/test/unit/launcher_test.rb +0 -33
- data/test/unit/poller_test.rb +0 -144
- data/test/unit/schedule_loader_test.rb +0 -58
- data/test/unit/web_extension_test.rb +0 -155
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aaa6af217265c4e60b29018b984b43a4316b2618e52ce874db670e41ecadf85b
|
4
|
+
data.tar.gz: f70a50a90508ceb32bad90b8b2b6a880fb460f308dfa81f7380152742bb939cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef95b33d15c1867a3dc6cc096080af6f2fab50c4460d8be24948bcd887c6c278dc3ca1a8c92db8d1ce386d24e0ceb95f53f6add336c3315fec04f808b7451475
|
7
|
+
data.tar.gz: e30e02e3bcc13f8604426d5d9e5f30e24c46a85bfd7679544975a3bdfcc0510631d363ef041f948c8a51e289a02a222fd27bba572cf57ac1697aabb917673a01
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,32 @@
|
|
2
2
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
|
5
|
+
## 1.12.0
|
6
|
+
|
7
|
+
- Remove Sidekiq.server? check from schedule loader (https://github.com/sidekiq-cron/sidekiq-cron/pull/436)
|
8
|
+
- Parse arguments on `args=` method (https://github.com/sidekiq-cron/sidekiq-cron/pull/442)
|
9
|
+
- Only check out a Redis connection if necessary (https://github.com/sidekiq-cron/sidekiq-cron/pull/438)
|
10
|
+
|
11
|
+
## 1.11.0
|
12
|
+
|
13
|
+
- Differentiates b/w "schedule" vs "dynamic" jobs (https://github.com/sidekiq-cron/sidekiq-cron/pull/431)
|
14
|
+
- Clears scheduled jobs upon schedule load (https://github.com/sidekiq-cron/sidekiq-cron/pull/431)
|
15
|
+
- Reduce gem size by excluding test files (https://github.com/sidekiq-cron/sidekiq-cron/pull/414)
|
16
|
+
|
17
|
+
## 1.10.1
|
18
|
+
|
19
|
+
- Use `hset` instead of deprecated `hmset` (https://github.com/sidekiq-cron/sidekiq-cron/pull/410)
|
20
|
+
|
21
|
+
## 1.10.0
|
22
|
+
|
23
|
+
- Remove EOL Ruby 2.6 support (https://github.com/sidekiq-cron/sidekiq-cron/pull/399)
|
24
|
+
- Add a logo for the project! (https://github.com/sidekiq-cron/sidekiq-cron/pull/402)
|
25
|
+
- Added support for ActiveRecord serialize/deserialize using GlobalID (https://github.com/sidekiq-cron/sidekiq-cron/pull/395)
|
26
|
+
- Allow for keyword args (`embedded: true`) in Poller (https://github.com/sidekiq-cron/sidekiq-cron/pull/398)
|
27
|
+
- Make last_enqueue_time be always an instance of Time (https://github.com/sidekiq-cron/sidekiq-cron/pull/354)
|
28
|
+
- Fix argument error problem update from 1.6.0 to newer (https://github.com/sidekiq-cron/sidekiq-cron/pull/392)
|
29
|
+
- Clear old jobs while loading the jobs from schedule via the schedule loader (https://github.com/sidekiq-cron/sidekiq-cron/pull/405)
|
30
|
+
|
5
31
|
## 1.9.1
|
6
32
|
|
7
33
|
- Always enqueue via Active Job interface when defined in cron job config (https://github.com/sidekiq-cron/sidekiq-cron/pull/381)
|
@@ -45,7 +71,7 @@ All notable changes to this project will be documented in this file.
|
|
45
71
|
## 1.4.0
|
46
72
|
|
47
73
|
- Fix buttons order in job show view (https://github.com/sidekiq-cron/sidekiq-cron/pull/302)
|
48
|
-
- Dark Mode support in UI (https://github.com/sidekiq-cron/sidekiq-cron/pull/
|
74
|
+
- Dark Mode support in UI (https://github.com/sidekiq-cron/sidekiq-cron/pull/282)
|
49
75
|
- Remove invocation of deprecated Redis functionality (https://github.com/sidekiq-cron/sidekiq-cron/pull/318)
|
50
76
|
- Internal code cleanup (https://github.com/sidekiq-cron/sidekiq-cron/pull/317)
|
51
77
|
- Optimize gem size (https://github.com/sidekiq-cron/sidekiq-cron/pull/322)
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
|
1
|
+
![Sidekiq-Cron](logos/cover.png)
|
2
2
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/sidekiq-cron.svg)](https://badge.fury.io/rb/sidekiq-cron)
|
4
4
|
[![Build Status](https://github.com/sidekiq-cron/sidekiq-cron/workflows/CI/badge.svg?branch=master)](https://github.com/sidekiq-cron/sidekiq-cron/actions)
|
5
|
-
[![
|
5
|
+
[![codecov](https://codecov.io/gh/sidekiq-cron/sidekiq-cron/branch/master/graph/badge.svg?token=VK9IVLIaY8)](https://codecov.io/gh/sidekiq-cron/sidekiq-cron)
|
6
6
|
|
7
7
|
> A scheduling add-on for [Sidekiq](https://sidekiq.org/)
|
8
8
|
|
@@ -26,12 +26,6 @@ Before upgrading to a new version, please read our [Changelog](CHANGELOG.md).
|
|
26
26
|
|
27
27
|
## Installation
|
28
28
|
|
29
|
-
### Requirements
|
30
|
-
|
31
|
-
- Redis 2.8 or greater is required (Redis 3.0.3 or greater is recommended for large scale use)
|
32
|
-
- Sidekiq 4.2 or greater is required (for Sidekiq < 4 use version sidekiq-cron 0.3.1)
|
33
|
-
- Sidekiq 6.5 requires Sidekiq-Cron 1.5+
|
34
|
-
|
35
29
|
Install the gem:
|
36
30
|
|
37
31
|
```
|
@@ -48,7 +42,7 @@ gem "sidekiq-cron"
|
|
48
42
|
|
49
43
|
## Getting Started
|
50
44
|
|
51
|
-
|
45
|
+
### Job properties
|
52
46
|
|
53
47
|
```ruby
|
54
48
|
{
|
@@ -57,12 +51,13 @@ gem "sidekiq-cron"
|
|
57
51
|
'cron' => '1 * * * *', # execute at 1 minute of every hour, ex: 12:01, 13:01, 14:01, ...
|
58
52
|
'class' => 'MyClass',
|
59
53
|
# OPTIONAL
|
54
|
+
'source' => 'dynamic', # source of the job, `schedule`/`dynamic` (default: `dynamic`)
|
60
55
|
'queue' => 'name of queue',
|
61
56
|
'args' => '[Array or Hash] of arguments which will be passed to perform method',
|
62
57
|
'date_as_argument' => true, # add the time of execution as last argument of the perform method
|
63
58
|
'active_job' => true, # enqueue job through Rails 4.2+ Active Job interface
|
64
59
|
'queue_name_prefix' => 'prefix', # Rails 4.2+ Active Job queue with prefix
|
65
|
-
'queue_name_delimiter' => '.', # Rails 4.2+ Active Job queue with custom delimiter
|
60
|
+
'queue_name_delimiter' => '.', # Rails 4.2+ Active Job queue with custom delimiter (default: '_')
|
66
61
|
'description' => 'A sentence describing what work this job performs'
|
67
62
|
'status' => 'disabled' # default: enabled
|
68
63
|
}
|
@@ -141,6 +136,8 @@ which will ensure that arguments you are passing to it will be symbolized when p
|
|
141
136
|
|
142
137
|
#### Adding Cron job
|
143
138
|
|
139
|
+
Refer to [Schedule vs Dynamic jobs](#schedule-vs-dynamic-jobs) to understand the difference.
|
140
|
+
|
144
141
|
```ruby
|
145
142
|
class HardWorker
|
146
143
|
include Sidekiq::Worker
|
@@ -171,6 +168,26 @@ unless job.save
|
|
171
168
|
end
|
172
169
|
```
|
173
170
|
|
171
|
+
Use ActiveRecord models as arguments
|
172
|
+
|
173
|
+
```rb
|
174
|
+
class Person < ApplicationRecord
|
175
|
+
end
|
176
|
+
|
177
|
+
class HardWorker < ActiveJob::Base
|
178
|
+
queue_as :default
|
179
|
+
|
180
|
+
def perform(person)
|
181
|
+
puts "person: #{person}"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
|
186
|
+
person = Person.create(id: 1)
|
187
|
+
Sidekiq::Cron::Job.create(name: 'Hard worker - every 5min', cron: '*/5 * * * *', class: 'HardWorker', args: person)
|
188
|
+
# => true
|
189
|
+
```
|
190
|
+
|
174
191
|
Load more jobs from hash:
|
175
192
|
|
176
193
|
```ruby
|
@@ -209,7 +226,7 @@ array = [
|
|
209
226
|
Sidekiq::Cron::Job.load_from_array array
|
210
227
|
```
|
211
228
|
|
212
|
-
Bang-suffixed methods will remove jobs
|
229
|
+
Bang-suffixed methods will remove jobs where source is `schedule` and are not present in the given hash/array, update jobs that have the same names, and create new ones when the names are previously unknown.
|
213
230
|
|
214
231
|
```ruby
|
215
232
|
Sidekiq::Cron::Job.load_from_hash! hash
|
@@ -248,7 +265,9 @@ Sidekiq.configure_server do |config|
|
|
248
265
|
schedule_file = "config/users_schedule.yml"
|
249
266
|
|
250
267
|
if File.exist?(schedule_file)
|
251
|
-
|
268
|
+
schedule = YAML.load_file(schedule_file)
|
269
|
+
|
270
|
+
Sidekiq::Cron::Job.load_from_hash!(schedule, source: "schedule")
|
252
271
|
end
|
253
272
|
end
|
254
273
|
end
|
@@ -301,6 +320,16 @@ job.status
|
|
301
320
|
job.enque!
|
302
321
|
```
|
303
322
|
|
323
|
+
### Schedule vs Dynamic jobs
|
324
|
+
|
325
|
+
There are two potential job sources: `schedule` and `dynamic`.
|
326
|
+
Jobs associated with schedule files are labeled as `schedule` as their source,
|
327
|
+
whereas jobs created at runtime without the `source=schedule` argument are classified as `dynamic`.
|
328
|
+
|
329
|
+
The key distinction lies in how these jobs are managed.
|
330
|
+
When a schedule is loaded, any stale `schedule` jobs are automatically removed to ensure synchronization within the schedule.
|
331
|
+
The `dynamic` jobs remain unaffected by this process.
|
332
|
+
|
304
333
|
### How to start scheduling?
|
305
334
|
|
306
335
|
Just start Sidekiq workers by running:
|
@@ -316,7 +345,7 @@ add `require 'sidekiq/cron/web'` after `require 'sidekiq/web'`.
|
|
316
345
|
|
317
346
|
With this, you will get:
|
318
347
|
|
319
|
-
![Web UI](
|
348
|
+
![Web UI](docs/images/web-cron-ui.jpeg)
|
320
349
|
|
321
350
|
## Under the hood
|
322
351
|
|
data/lib/sidekiq/cron/job.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fugit'
|
2
|
+
require 'globalid'
|
2
3
|
require 'sidekiq'
|
3
4
|
require 'sidekiq/cron/support'
|
4
5
|
require 'sidekiq/options'
|
@@ -15,13 +16,17 @@ module Sidekiq
|
|
15
16
|
# Use the exists? method if we're on a newer version of Redis.
|
16
17
|
REDIS_EXISTS_METHOD = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("7.0.0") || Gem.loaded_specs['redis'].version < Gem::Version.new('4.2') ? :exists : :exists?
|
17
18
|
|
19
|
+
# Use serialize/deserialize key of GlobalID.
|
20
|
+
GLOBALID_KEY = "_sc_globalid"
|
21
|
+
|
18
22
|
# Crucial part of whole enqueuing job.
|
19
23
|
def should_enque? time
|
24
|
+
return false unless status == "enabled"
|
25
|
+
return false unless not_past_scheduled_time?(time)
|
26
|
+
return false unless not_enqueued_after?(time)
|
27
|
+
|
20
28
|
enqueue = Sidekiq.redis do |conn|
|
21
|
-
|
22
|
-
not_past_scheduled_time?(time) &&
|
23
|
-
not_enqueued_after?(time) &&
|
24
|
-
conn.zadd(job_enqueued_key, formatted_enqueue_time(time), formatted_last_time(time))
|
29
|
+
conn.zadd(job_enqueued_key, formatted_enqueue_time(time), formatted_last_time(time))
|
25
30
|
end
|
26
31
|
enqueue == true || enqueue == 1
|
27
32
|
end
|
@@ -45,7 +50,7 @@ module Sidekiq
|
|
45
50
|
|
46
51
|
# Enqueue cron job to queue.
|
47
52
|
def enque! time = Time.now.utc
|
48
|
-
@last_enqueue_time = time
|
53
|
+
@last_enqueue_time = time
|
49
54
|
|
50
55
|
klass_const =
|
51
56
|
begin
|
@@ -85,7 +90,8 @@ module Sidekiq
|
|
85
90
|
end
|
86
91
|
|
87
92
|
def enqueue_args
|
88
|
-
date_as_argument? ? @args + [Time.now.to_f] : @args
|
93
|
+
args = date_as_argument? ? @args + [Time.now.to_f] : @args
|
94
|
+
deserialize_argument(args)
|
89
95
|
end
|
90
96
|
|
91
97
|
def enqueue_active_job(klass_const)
|
@@ -157,19 +163,19 @@ module Sidekiq
|
|
157
163
|
# }
|
158
164
|
# }
|
159
165
|
#
|
160
|
-
def self.load_from_hash
|
166
|
+
def self.load_from_hash(hash, options = {})
|
161
167
|
array = hash.map do |key, job|
|
162
168
|
job['name'] = key
|
163
169
|
job
|
164
170
|
end
|
165
|
-
load_from_array
|
171
|
+
load_from_array(array, options)
|
166
172
|
end
|
167
173
|
|
168
174
|
# Like #load_from_hash.
|
169
175
|
# If exists old jobs in Redis but removed from args, destroy old jobs.
|
170
|
-
def self.load_from_hash!
|
176
|
+
def self.load_from_hash!(hash, options = {})
|
171
177
|
destroy_removed_jobs(hash.keys)
|
172
|
-
load_from_hash(hash)
|
178
|
+
load_from_hash(hash, options)
|
173
179
|
end
|
174
180
|
|
175
181
|
# Load cron jobs from Array.
|
@@ -189,10 +195,10 @@ module Sidekiq
|
|
189
195
|
# }
|
190
196
|
# ]
|
191
197
|
#
|
192
|
-
def self.load_from_array
|
198
|
+
def self.load_from_array(array, options = {})
|
193
199
|
errors = {}
|
194
200
|
array.each do |job_data|
|
195
|
-
job = new(job_data)
|
201
|
+
job = new(job_data.merge(options))
|
196
202
|
errors[job.name] = job.errors unless job.save
|
197
203
|
end
|
198
204
|
errors
|
@@ -200,10 +206,10 @@ module Sidekiq
|
|
200
206
|
|
201
207
|
# Like #load_from_array.
|
202
208
|
# If exists old jobs in Redis but removed from args, destroy old jobs.
|
203
|
-
def self.load_from_array!
|
209
|
+
def self.load_from_array!(array, options = {})
|
204
210
|
job_names = array.map { |job| job["name"] }
|
205
211
|
destroy_removed_jobs(job_names)
|
206
|
-
load_from_array(array)
|
212
|
+
load_from_array(array, options)
|
207
213
|
end
|
208
214
|
|
209
215
|
# Get all cron jobs.
|
@@ -234,12 +240,11 @@ module Sidekiq
|
|
234
240
|
def self.find name
|
235
241
|
# If name is hash try to get name from it.
|
236
242
|
name = name[:name] || name['name'] if name.is_a?(Hash)
|
243
|
+
return unless exists? name
|
237
244
|
|
238
245
|
output = nil
|
239
246
|
Sidekiq.redis do |conn|
|
240
|
-
|
241
|
-
output = Job.new conn.hgetall( redis_key(name) )
|
242
|
-
end
|
247
|
+
output = Job.new conn.hgetall( redis_key(name) )
|
243
248
|
end
|
244
249
|
output if output && output.valid?
|
245
250
|
end
|
@@ -262,7 +267,7 @@ module Sidekiq
|
|
262
267
|
end
|
263
268
|
|
264
269
|
attr_accessor :name, :cron, :description, :klass, :args, :message
|
265
|
-
attr_reader :last_enqueue_time, :fetch_missing_args
|
270
|
+
attr_reader :last_enqueue_time, :fetch_missing_args, :source
|
266
271
|
|
267
272
|
def initialize input_args = {}
|
268
273
|
args = Hash[input_args.map{ |k, v| [k.to_s, v] }]
|
@@ -272,6 +277,7 @@ module Sidekiq
|
|
272
277
|
@name = args["name"]
|
273
278
|
@cron = args["cron"]
|
274
279
|
@description = args["description"] if args["description"]
|
280
|
+
@source = args["source"] == "schedule" ? "schedule" : "dynamic"
|
275
281
|
|
276
282
|
# Get class from klass or class.
|
277
283
|
@klass = args["klass"] || args["class"]
|
@@ -288,7 +294,7 @@ module Sidekiq
|
|
288
294
|
|
289
295
|
# Get right arguments for job.
|
290
296
|
@symbolize_args = args["symbolize_args"] == true || ("#{args["symbolize_args"]}" =~ (/^(true|t|yes|y|1)$/i)) == 0 || false
|
291
|
-
@args =
|
297
|
+
@args = parse_args(args["args"])
|
292
298
|
|
293
299
|
@date_as_argument = args["date_as_argument"] == true || ("#{args["date_as_argument"]}" =~ (/^(true|t|yes|y|1)$/i)) == 0 || false
|
294
300
|
|
@@ -398,21 +404,27 @@ module Sidekiq
|
|
398
404
|
|
399
405
|
# Export job data to hash.
|
400
406
|
def to_hash
|
401
|
-
{
|
407
|
+
hash = {
|
402
408
|
name: @name,
|
403
409
|
klass: @klass.to_s,
|
404
410
|
cron: @cron,
|
405
411
|
description: @description,
|
412
|
+
source: @source,
|
406
413
|
args: @args.is_a?(String) ? @args : Sidekiq.dump_json(@args || []),
|
407
|
-
date_as_argument: date_as_argument? ? "1" : "0",
|
408
414
|
message: @message.is_a?(String) ? @message : Sidekiq.dump_json(@message || {}),
|
409
415
|
status: @status,
|
410
416
|
active_job: @active_job ? "1" : "0",
|
411
417
|
queue_name_prefix: @active_job_queue_name_prefix,
|
412
418
|
queue_name_delimiter: @active_job_queue_name_delimiter,
|
413
|
-
last_enqueue_time:
|
419
|
+
last_enqueue_time: serialized_last_enqueue_time,
|
414
420
|
symbolize_args: symbolize_args? ? "1" : "0",
|
415
421
|
}
|
422
|
+
|
423
|
+
if date_as_argument?
|
424
|
+
hash.merge!(date_as_argument: "1")
|
425
|
+
end
|
426
|
+
|
427
|
+
hash
|
416
428
|
end
|
417
429
|
|
418
430
|
def errors
|
@@ -459,7 +471,7 @@ module Sidekiq
|
|
459
471
|
conn.sadd self.class.jobs_key, [redis_key]
|
460
472
|
|
461
473
|
# Add informations for this job!
|
462
|
-
conn.
|
474
|
+
conn.hset redis_key, to_hash.transform_values! { |v| v || "" }
|
463
475
|
|
464
476
|
# Add information about last time! - don't enque right after scheduler poller starts!
|
465
477
|
time = Time.now.utc
|
@@ -472,7 +484,7 @@ module Sidekiq
|
|
472
484
|
def save_last_enqueue_time
|
473
485
|
Sidekiq.redis do |conn|
|
474
486
|
# Update last enqueue time.
|
475
|
-
conn.hset redis_key, 'last_enqueue_time',
|
487
|
+
conn.hset redis_key, 'last_enqueue_time', serialized_last_enqueue_time
|
476
488
|
end
|
477
489
|
end
|
478
490
|
|
@@ -519,7 +531,7 @@ module Sidekiq
|
|
519
531
|
|
520
532
|
# Remove "removed jobs" between current jobs and new jobs
|
521
533
|
def self.destroy_removed_jobs new_job_names
|
522
|
-
current_job_names = Sidekiq::Cron::Job.all.
|
534
|
+
current_job_names = Sidekiq::Cron::Job.all.filter_map { |j| j.name if j.source == "schedule" }
|
523
535
|
removed_job_names = current_job_names - new_job_names
|
524
536
|
removed_job_names.each { |j| Sidekiq::Cron::Job.destroy(j) }
|
525
537
|
removed_job_names
|
@@ -554,6 +566,10 @@ module Sidekiq
|
|
554
566
|
"#{status == "enabled" ? 0 : 1}_#{name}".downcase
|
555
567
|
end
|
556
568
|
|
569
|
+
def args=(args)
|
570
|
+
@args = parse_args(args)
|
571
|
+
end
|
572
|
+
|
557
573
|
private
|
558
574
|
|
559
575
|
def parsed_cron
|
@@ -569,6 +585,8 @@ module Sidekiq
|
|
569
585
|
# try to load JSON, then failover to string array.
|
570
586
|
def parse_args(args)
|
571
587
|
case args
|
588
|
+
when GlobalID::Identification
|
589
|
+
[convert_to_global_id_hash(args)]
|
572
590
|
when String
|
573
591
|
begin
|
574
592
|
parsed_args = Sidekiq.load_json(args)
|
@@ -577,8 +595,10 @@ module Sidekiq
|
|
577
595
|
[*args]
|
578
596
|
end
|
579
597
|
when Hash
|
598
|
+
args = serialize_argument(args)
|
580
599
|
symbolize_args? ? [symbolize_args(args)] : [args]
|
581
600
|
when Array
|
601
|
+
args = serialize_argument(args)
|
582
602
|
symbolize_args? ? symbolize_args(args) : args
|
583
603
|
else
|
584
604
|
[*args]
|
@@ -649,9 +669,55 @@ module Sidekiq
|
|
649
669
|
self.class.jid_history_key @name
|
650
670
|
end
|
651
671
|
|
652
|
-
|
653
|
-
|
654
|
-
|
672
|
+
def serialized_last_enqueue_time
|
673
|
+
@last_enqueue_time&.strftime(LAST_ENQUEUE_TIME_FORMAT)
|
674
|
+
end
|
675
|
+
|
676
|
+
def convert_to_global_id_hash(argument)
|
677
|
+
{ GLOBALID_KEY => argument.to_global_id.to_s }
|
678
|
+
rescue URI::GID::MissingModelIdError
|
679
|
+
raise "Unable to serialize #{argument.class} " \
|
680
|
+
"without an id. (Maybe you forgot to call save?)"
|
681
|
+
end
|
682
|
+
|
683
|
+
def deserialize_argument(argument)
|
684
|
+
case argument
|
685
|
+
when String
|
686
|
+
argument
|
687
|
+
when Array
|
688
|
+
argument.map { |arg| deserialize_argument(arg) }
|
689
|
+
when Hash
|
690
|
+
if serialized_global_id?(argument)
|
691
|
+
deserialize_global_id argument
|
692
|
+
else
|
693
|
+
argument.transform_values { |v| deserialize_argument(v) }
|
694
|
+
end
|
695
|
+
else
|
696
|
+
argument
|
697
|
+
end
|
698
|
+
end
|
699
|
+
|
700
|
+
def serialized_global_id?(hash)
|
701
|
+
hash.size == 1 && hash.include?(GLOBALID_KEY)
|
702
|
+
end
|
703
|
+
|
704
|
+
def deserialize_global_id(hash)
|
705
|
+
GlobalID::Locator.locate hash[GLOBALID_KEY]
|
706
|
+
end
|
707
|
+
|
708
|
+
def serialize_argument(argument)
|
709
|
+
case argument
|
710
|
+
when GlobalID::Identification
|
711
|
+
convert_to_global_id_hash(argument)
|
712
|
+
when Array
|
713
|
+
argument.map { |arg| serialize_argument(arg) }
|
714
|
+
when Hash
|
715
|
+
argument.each_with_object({}) do |(key, value), hash|
|
716
|
+
hash[key] = serialize_argument(value)
|
717
|
+
end
|
718
|
+
else
|
719
|
+
argument
|
720
|
+
end
|
655
721
|
end
|
656
722
|
end
|
657
723
|
end
|
@@ -14,7 +14,7 @@ module Sidekiq
|
|
14
14
|
attr_reader :cron_poller
|
15
15
|
|
16
16
|
# Add cron poller and execute normal initialize of Sidekiq launcher.
|
17
|
-
def initialize(config)
|
17
|
+
def initialize(config, **kwargs)
|
18
18
|
config[:cron_poll_interval] = DEFAULT_POLL_INTERVAL if config[:cron_poll_interval].nil?
|
19
19
|
|
20
20
|
@cron_poller = Sidekiq::Cron::Poller.new(config) if config[:cron_poll_interval] > 0
|
@@ -2,20 +2,18 @@ require 'sidekiq'
|
|
2
2
|
require 'sidekiq/cron/job'
|
3
3
|
require 'sidekiq/options'
|
4
4
|
|
5
|
-
|
6
|
-
Sidekiq
|
7
|
-
schedule_file = Sidekiq::Options[:cron_schedule_file] || 'config/schedule.yml'
|
5
|
+
Sidekiq.configure_server do |config|
|
6
|
+
schedule_file = Sidekiq::Options[:cron_schedule_file] || 'config/schedule.yml'
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
8
|
+
if File.exist?(schedule_file)
|
9
|
+
config.on(:startup) do
|
10
|
+
schedule = Sidekiq::Cron::Support.load_yaml(ERB.new(IO.read(schedule_file)).result)
|
11
|
+
if schedule.kind_of?(Hash)
|
12
|
+
Sidekiq::Cron::Job.load_from_hash!(schedule, source: "schedule")
|
13
|
+
elsif schedule.kind_of?(Array)
|
14
|
+
Sidekiq::Cron::Job.load_from_array!(schedule, source: "schedule")
|
15
|
+
else
|
16
|
+
raise "Not supported schedule format. Confirm your #{schedule_file}"
|
19
17
|
end
|
20
18
|
end
|
21
19
|
end
|
data/lib/sidekiq/cron/version.rb
CHANGED
data/lib/sidekiq/options.rb
CHANGED
@@ -3,11 +3,15 @@ require 'sidekiq'
|
|
3
3
|
module Sidekiq
|
4
4
|
module Options
|
5
5
|
def self.[](key)
|
6
|
-
|
6
|
+
self.config[key]
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.[]=(key, value)
|
10
|
-
|
10
|
+
self.config[key] = value
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.config
|
14
|
+
options_field ? Sidekiq.public_send(options_field) : Sidekiq
|
11
15
|
end
|
12
16
|
|
13
17
|
def self.options_field
|
data/sidekiq-cron.gemspec
CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
15
15
|
"LICENSE.txt",
|
16
16
|
"README.md"
|
17
17
|
]
|
18
|
-
s.files = Dir.glob('lib/**/*') +
|
18
|
+
s.files = Dir.glob('lib/**/*') + [
|
19
19
|
"CHANGELOG.md",
|
20
20
|
"Gemfile",
|
21
21
|
"LICENSE.txt",
|
@@ -24,15 +24,17 @@ Gem::Specification.new do |s|
|
|
24
24
|
"sidekiq-cron.gemspec",
|
25
25
|
]
|
26
26
|
|
27
|
-
s.required_ruby_version = ">= 2.
|
27
|
+
s.required_ruby_version = ">= 2.7"
|
28
28
|
|
29
29
|
s.add_dependency("fugit", "~> 1.8")
|
30
|
-
s.add_dependency("sidekiq", ">=
|
30
|
+
s.add_dependency("sidekiq", ">= 6")
|
31
|
+
s.add_dependency("globalid", ">= 1.0.1")
|
31
32
|
|
32
33
|
s.add_development_dependency("minitest", "~> 5.15")
|
33
|
-
s.add_development_dependency("mocha", "~> 1
|
34
|
+
s.add_development_dependency("mocha", "~> 2.1")
|
34
35
|
s.add_development_dependency("rack", "~> 2.2")
|
35
36
|
s.add_development_dependency("rack-test", "~> 1.1")
|
36
37
|
s.add_development_dependency("rake", "~> 13.0")
|
37
38
|
s.add_development_dependency("simplecov", "~> 0.21")
|
39
|
+
s.add_development_dependency("simplecov-cobertura", "~> 2.1")
|
38
40
|
end
|