sidekiq-cron 1.9.0 → 1.10.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 +16 -0
- data/Gemfile +3 -0
- data/README.md +23 -9
- data/lib/sidekiq/cron/job.rb +76 -31
- data/lib/sidekiq/cron/launcher.rb +1 -1
- data/lib/sidekiq/cron/schedule_loader.rb +3 -3
- data/lib/sidekiq/cron/support.rb +8 -0
- data/lib/sidekiq/cron/version.rb +1 -1
- data/sidekiq-cron.gemspec +5 -3
- data/test/models/person.rb +21 -0
- data/test/test_helper.rb +6 -0
- data/test/unit/fixtures/schedule_erb.yml +3 -1
- data/test/unit/job_test.rb +160 -2
- data/test/unit/schedule_loader_test.rb +2 -2
- metadata +37 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f484cd18cea7b3b00d83b82c5ae6ca7e2c831b22ed4d00cd77a19cfc9491b49d
|
4
|
+
data.tar.gz: efe62165d5c2b02b4ee2ce7f1ac877cda1bd06d550f4554fbb340b491f8d1319
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a945824e3d39d8f54a33c68eec458f3dee68be2cd43ddf697b7fdd568afff291ff62ee1ec8cf2bbc05e26ddfa6e8230c78a953499b59b6844ca60b37f55ffc99
|
7
|
+
data.tar.gz: 2aa57d5d1e2b4ba98199bf79e13d49b7726478650ef46efa92871e0c13b51608829bc66159d8ed5a2cd58f4b6d5dcb3a6e87329795e604309fc60ba85b583758
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,22 @@
|
|
2
2
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
|
5
|
+
## 1.10.0
|
6
|
+
|
7
|
+
- Remove EOL Ruby 2.6 support (https://github.com/sidekiq-cron/sidekiq-cron/pull/399)
|
8
|
+
- Add a logo for the project! (https://github.com/sidekiq-cron/sidekiq-cron/pull/402)
|
9
|
+
- Added support for ActiveRecord serialize/deserialize using GlobalID (https://github.com/sidekiq-cron/sidekiq-cron/pull/395)
|
10
|
+
- Allow for keyword args (`embedded: true`) in Poller (https://github.com/sidekiq-cron/sidekiq-cron/pull/398)
|
11
|
+
- Make last_enqueue_time be always an instance of Time (https://github.com/sidekiq-cron/sidekiq-cron/pull/354)
|
12
|
+
- Fix argument error problem update from 1.6.0 to newer (https://github.com/sidekiq-cron/sidekiq-cron/pull/392)
|
13
|
+
- Clear old jobs while loading the jobs from schedule via the schedule loader (https://github.com/sidekiq-cron/sidekiq-cron/pull/405)
|
14
|
+
|
15
|
+
## 1.9.1
|
16
|
+
|
17
|
+
- Always enqueue via Active Job interface when defined in cron job config (https://github.com/sidekiq-cron/sidekiq-cron/pull/381)
|
18
|
+
- Fix schedule.yml YAML load errors on Ruby 3.1 (https://github.com/sidekiq-cron/sidekiq-cron/pull/386)
|
19
|
+
- Require Fugit v1.8 to refactor internals (https://github.com/sidekiq-cron/sidekiq-cron/pull/385)
|
20
|
+
|
5
21
|
## 1.9.0
|
6
22
|
|
7
23
|
- Sidekiq v7 support (https://github.com/sidekiq-cron/sidekiq-cron/pull/369)
|
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
|
```
|
@@ -171,6 +165,26 @@ unless job.save
|
|
171
165
|
end
|
172
166
|
```
|
173
167
|
|
168
|
+
Use ActiveRecord models as arguments
|
169
|
+
|
170
|
+
```rb
|
171
|
+
class Person < ApplicationRecord
|
172
|
+
end
|
173
|
+
|
174
|
+
class HardWorker < ActiveJob::Base
|
175
|
+
queue_as :default
|
176
|
+
|
177
|
+
def perform(person)
|
178
|
+
puts "person: #{person}"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
|
183
|
+
person = Person.create(id: 1)
|
184
|
+
Sidekiq::Cron::Job.create(name: 'Hard worker - every 5min', cron: '*/5 * * * *', class: 'HardWorker', args: person)
|
185
|
+
# => true
|
186
|
+
```
|
187
|
+
|
174
188
|
Load more jobs from hash:
|
175
189
|
|
176
190
|
```ruby
|
@@ -316,7 +330,7 @@ add `require 'sidekiq/cron/web'` after `require 'sidekiq/web'`.
|
|
316
330
|
|
317
331
|
With this, you will get:
|
318
332
|
|
319
|
-
![Web UI](
|
333
|
+
![Web UI](docs/images/web-cron-ui.jpeg)
|
320
334
|
|
321
335
|
## Under the hood
|
322
336
|
|
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,6 +16,9 @@ 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
|
20
24
|
enqueue = Sidekiq.redis do |conn|
|
@@ -45,7 +49,7 @@ module Sidekiq
|
|
45
49
|
|
46
50
|
# Enqueue cron job to queue.
|
47
51
|
def enque! time = Time.now.utc
|
48
|
-
@last_enqueue_time = time
|
52
|
+
@last_enqueue_time = time
|
49
53
|
|
50
54
|
klass_const =
|
51
55
|
begin
|
@@ -56,7 +60,7 @@ module Sidekiq
|
|
56
60
|
|
57
61
|
jid =
|
58
62
|
if klass_const
|
59
|
-
if
|
63
|
+
if is_active_job?(klass_const)
|
60
64
|
enqueue_active_job(klass_const).try :provider_job_id
|
61
65
|
else
|
62
66
|
enqueue_sidekiq_worker(klass_const)
|
@@ -74,8 +78,8 @@ module Sidekiq
|
|
74
78
|
Sidekiq.logger.debug { "enqueued #{@name}: #{@message}" }
|
75
79
|
end
|
76
80
|
|
77
|
-
def is_active_job?
|
78
|
-
@active_job || defined?(ActiveJob::Base) && Sidekiq::Cron::Support.constantize(@klass.to_s) < ActiveJob::Base
|
81
|
+
def is_active_job?(klass = nil)
|
82
|
+
@active_job || defined?(ActiveJob::Base) && (klass || Sidekiq::Cron::Support.constantize(@klass.to_s)) < ActiveJob::Base
|
79
83
|
rescue NameError
|
80
84
|
false
|
81
85
|
end
|
@@ -85,7 +89,8 @@ module Sidekiq
|
|
85
89
|
end
|
86
90
|
|
87
91
|
def enqueue_args
|
88
|
-
date_as_argument? ? @args + [Time.now.to_f] : @args
|
92
|
+
args = date_as_argument? ? @args + [Time.now.to_f] : @args
|
93
|
+
deserialize_argument(args)
|
89
94
|
end
|
90
95
|
|
91
96
|
def enqueue_active_job(klass_const)
|
@@ -398,21 +403,26 @@ module Sidekiq
|
|
398
403
|
|
399
404
|
# Export job data to hash.
|
400
405
|
def to_hash
|
401
|
-
{
|
406
|
+
hash = {
|
402
407
|
name: @name,
|
403
408
|
klass: @klass.to_s,
|
404
409
|
cron: @cron,
|
405
410
|
description: @description,
|
406
411
|
args: @args.is_a?(String) ? @args : Sidekiq.dump_json(@args || []),
|
407
|
-
date_as_argument: date_as_argument? ? "1" : "0",
|
408
412
|
message: @message.is_a?(String) ? @message : Sidekiq.dump_json(@message || {}),
|
409
413
|
status: @status,
|
410
414
|
active_job: @active_job ? "1" : "0",
|
411
415
|
queue_name_prefix: @active_job_queue_name_prefix,
|
412
416
|
queue_name_delimiter: @active_job_queue_name_delimiter,
|
413
|
-
last_enqueue_time:
|
417
|
+
last_enqueue_time: serialized_last_enqueue_time,
|
414
418
|
symbolize_args: symbolize_args? ? "1" : "0",
|
415
419
|
}
|
420
|
+
|
421
|
+
if date_as_argument?
|
422
|
+
hash.merge!(date_as_argument: "1")
|
423
|
+
end
|
424
|
+
|
425
|
+
hash
|
416
426
|
end
|
417
427
|
|
418
428
|
def errors
|
@@ -428,15 +438,7 @@ module Sidekiq
|
|
428
438
|
errors << "'cron' must be set"
|
429
439
|
else
|
430
440
|
begin
|
431
|
-
|
432
|
-
|
433
|
-
# Since `Fugit.do_parse` might yield a Fugit::Duration or an EtOrbi::EoTime
|
434
|
-
# https://github.com/floraison/fugit#fugitparses
|
435
|
-
if c.is_a?(Fugit::Cron)
|
436
|
-
@parsed_cron = c
|
437
|
-
else
|
438
|
-
errors << "'cron' -> #{@cron.inspect} -> not a cron but a #{c.class}"
|
439
|
-
end
|
441
|
+
@parsed_cron = Fugit.do_parse_cronish(@cron)
|
440
442
|
rescue => e
|
441
443
|
errors << "'cron' -> #{@cron.inspect} -> #{e.class}: #{e.message}"
|
442
444
|
end
|
@@ -480,7 +482,7 @@ module Sidekiq
|
|
480
482
|
def save_last_enqueue_time
|
481
483
|
Sidekiq.redis do |conn|
|
482
484
|
# Update last enqueue time.
|
483
|
-
conn.hset redis_key, 'last_enqueue_time',
|
485
|
+
conn.hset redis_key, 'last_enqueue_time', serialized_last_enqueue_time
|
484
486
|
end
|
485
487
|
end
|
486
488
|
|
@@ -565,19 +567,7 @@ module Sidekiq
|
|
565
567
|
private
|
566
568
|
|
567
569
|
def parsed_cron
|
568
|
-
@parsed_cron ||=
|
569
|
-
c = Fugit.parse(@cron)
|
570
|
-
|
571
|
-
# Since `Fugit.parse` might yield a Fugit::Duration or an EtOrbi::EoTime
|
572
|
-
# https://github.com/floraison/fugit#fugitparses
|
573
|
-
if c.is_a?(Fugit::Cron)
|
574
|
-
c
|
575
|
-
else
|
576
|
-
errors << "'cron' -> #{@cron.inspect} -> not a cron but a #{c.class}"
|
577
|
-
end
|
578
|
-
rescue => e
|
579
|
-
errors << "'cron' -> #{@cron.inspect} -> #{e.class}: #{e.message}"
|
580
|
-
end
|
570
|
+
@parsed_cron ||= Fugit.parse_cronish(@cron)
|
581
571
|
end
|
582
572
|
|
583
573
|
def not_enqueued_after?(time)
|
@@ -589,6 +579,8 @@ module Sidekiq
|
|
589
579
|
# try to load JSON, then failover to string array.
|
590
580
|
def parse_args(args)
|
591
581
|
case args
|
582
|
+
when GlobalID::Identification
|
583
|
+
[convert_to_global_id_hash(args)]
|
592
584
|
when String
|
593
585
|
begin
|
594
586
|
parsed_args = Sidekiq.load_json(args)
|
@@ -597,8 +589,10 @@ module Sidekiq
|
|
597
589
|
[*args]
|
598
590
|
end
|
599
591
|
when Hash
|
592
|
+
args = serialize_argument(args)
|
600
593
|
symbolize_args? ? [symbolize_args(args)] : [args]
|
601
594
|
when Array
|
595
|
+
args = serialize_argument(args)
|
602
596
|
symbolize_args? ? symbolize_args(args) : args
|
603
597
|
else
|
604
598
|
[*args]
|
@@ -673,6 +667,57 @@ module Sidekiq
|
|
673
667
|
def hash_to_redis hash
|
674
668
|
hash.flat_map{ |key, value| [key, value || ""] }
|
675
669
|
end
|
670
|
+
|
671
|
+
def serialized_last_enqueue_time
|
672
|
+
@last_enqueue_time&.strftime(LAST_ENQUEUE_TIME_FORMAT)
|
673
|
+
end
|
674
|
+
|
675
|
+
def convert_to_global_id_hash(argument)
|
676
|
+
{ GLOBALID_KEY => argument.to_global_id.to_s }
|
677
|
+
rescue URI::GID::MissingModelIdError
|
678
|
+
raise "Unable to serialize #{argument.class} " \
|
679
|
+
"without an id. (Maybe you forgot to call save?)"
|
680
|
+
end
|
681
|
+
|
682
|
+
def deserialize_argument(argument)
|
683
|
+
case argument
|
684
|
+
when String
|
685
|
+
argument
|
686
|
+
when Array
|
687
|
+
argument.map { |arg| deserialize_argument(arg) }
|
688
|
+
when Hash
|
689
|
+
if serialized_global_id?(argument)
|
690
|
+
deserialize_global_id argument
|
691
|
+
else
|
692
|
+
argument.transform_values { |v| deserialize_argument(v) }
|
693
|
+
end
|
694
|
+
else
|
695
|
+
argument
|
696
|
+
end
|
697
|
+
end
|
698
|
+
|
699
|
+
def serialized_global_id?(hash)
|
700
|
+
hash.size == 1 && hash.include?(GLOBALID_KEY)
|
701
|
+
end
|
702
|
+
|
703
|
+
def deserialize_global_id(hash)
|
704
|
+
GlobalID::Locator.locate hash[GLOBALID_KEY]
|
705
|
+
end
|
706
|
+
|
707
|
+
def serialize_argument(argument)
|
708
|
+
case argument
|
709
|
+
when GlobalID::Identification
|
710
|
+
convert_to_global_id_hash(argument)
|
711
|
+
when Array
|
712
|
+
argument.map { |arg| serialize_argument(arg) }
|
713
|
+
when Hash
|
714
|
+
argument.each_with_object({}) do |(key, value), hash|
|
715
|
+
hash[key] = serialize_argument(value)
|
716
|
+
end
|
717
|
+
else
|
718
|
+
argument
|
719
|
+
end
|
720
|
+
end
|
676
721
|
end
|
677
722
|
end
|
678
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
|
@@ -8,11 +8,11 @@ if Sidekiq.server?
|
|
8
8
|
|
9
9
|
if File.exist?(schedule_file)
|
10
10
|
config.on(:startup) do
|
11
|
-
schedule =
|
11
|
+
schedule = Sidekiq::Cron::Support.load_yaml(ERB.new(IO.read(schedule_file)).result)
|
12
12
|
if schedule.kind_of?(Hash)
|
13
|
-
Sidekiq::Cron::Job.load_from_hash schedule
|
13
|
+
Sidekiq::Cron::Job.load_from_hash! schedule
|
14
14
|
elsif schedule.kind_of?(Array)
|
15
|
-
Sidekiq::Cron::Job.load_from_array schedule
|
15
|
+
Sidekiq::Cron::Job.load_from_array! schedule
|
16
16
|
else
|
17
17
|
raise "Not supported schedule format. Confirm your #{schedule_file}"
|
18
18
|
end
|
data/lib/sidekiq/cron/support.rb
CHANGED
data/lib/sidekiq/cron/version.rb
CHANGED
data/sidekiq-cron.gemspec
CHANGED
@@ -24,10 +24,11 @@ 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
|
-
s.add_dependency("fugit", "~> 1")
|
30
|
-
s.add_dependency("sidekiq", ">=
|
29
|
+
s.add_dependency("fugit", "~> 1.8")
|
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
34
|
s.add_development_dependency("mocha", "~> 1.14")
|
@@ -35,4 +36,5 @@ Gem::Specification.new do |s|
|
|
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
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Person
|
2
|
+
include GlobalID::Identification
|
3
|
+
|
4
|
+
attr_reader :id
|
5
|
+
|
6
|
+
def self.find(id)
|
7
|
+
new(id)
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize(id)
|
11
|
+
@id = id
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_global_id(options = {})
|
15
|
+
super app: "app"
|
16
|
+
end
|
17
|
+
|
18
|
+
def ==(other_person)
|
19
|
+
other_person.is_a?(Person) && id.to_s == other_person.id.to_s
|
20
|
+
end
|
21
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -2,6 +2,12 @@ $TESTING = true
|
|
2
2
|
ENV['RACK_ENV'] = 'test'
|
3
3
|
|
4
4
|
require 'simplecov'
|
5
|
+
|
6
|
+
if ENV['CI']
|
7
|
+
require 'simplecov-cobertura'
|
8
|
+
SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
|
9
|
+
end
|
10
|
+
|
5
11
|
SimpleCov.start do
|
6
12
|
add_filter "test/"
|
7
13
|
add_group 'Sidekiq-Cron', 'lib/'
|
data/test/unit/job_test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require './test/test_helper'
|
2
|
+
require "./test/models/person"
|
2
3
|
|
3
4
|
describe "Cron Job" do
|
4
5
|
before do
|
@@ -338,6 +339,45 @@ describe "Cron Job" do
|
|
338
339
|
assert args[-1].between?(Time.now.to_f - 1, Time.now.to_f)
|
339
340
|
end
|
340
341
|
end
|
342
|
+
|
343
|
+
describe 'with GlobalID::Identification args' do
|
344
|
+
before do
|
345
|
+
@args.merge!(args: Person.new(1))
|
346
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
347
|
+
end
|
348
|
+
|
349
|
+
let(:args) { @job.sidekiq_worker_message['args'] }
|
350
|
+
|
351
|
+
it 'should add timestamp to args' do
|
352
|
+
assert_equal args[0], Person.new(1)
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
describe 'with GlobalID::Identification args in Array' do
|
357
|
+
before do
|
358
|
+
@args.merge!(args: [Person.new(1)])
|
359
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
360
|
+
end
|
361
|
+
|
362
|
+
let(:args) { @job.sidekiq_worker_message['args'] }
|
363
|
+
|
364
|
+
it 'should add timestamp to args' do
|
365
|
+
assert_equal args[0], Person.new(1)
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
describe 'with GlobalID::Identification args in Hash' do
|
370
|
+
before do
|
371
|
+
@args.merge!(args: {person: Person.new(1)})
|
372
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
373
|
+
end
|
374
|
+
|
375
|
+
let(:args) { @job.sidekiq_worker_message['args'] }
|
376
|
+
|
377
|
+
it 'should add timestamp to args' do
|
378
|
+
assert_equal args[0], {person: Person.new(1)}
|
379
|
+
end
|
380
|
+
end
|
341
381
|
end
|
342
382
|
|
343
383
|
describe '#sidekiq_worker_message settings overwrite queue name' do
|
@@ -581,6 +621,36 @@ describe "Cron Job" do
|
|
581
621
|
@job.enque!
|
582
622
|
end
|
583
623
|
end
|
624
|
+
|
625
|
+
describe 'with active_job == true' do
|
626
|
+
before do
|
627
|
+
@args.merge!(active_job: true)
|
628
|
+
end
|
629
|
+
|
630
|
+
describe 'with active_job job class' do
|
631
|
+
before do
|
632
|
+
@job = Sidekiq::Cron::Job.new(@args.merge(klass: 'ActiveJobCronTestClass'))
|
633
|
+
end
|
634
|
+
|
635
|
+
it 'enques via active_job interface' do
|
636
|
+
@job.expects(:enqueue_active_job)
|
637
|
+
.returns(ActiveJobCronTestClass.new)
|
638
|
+
@job.enque!
|
639
|
+
end
|
640
|
+
end
|
641
|
+
|
642
|
+
describe 'with non sidekiq job class' do
|
643
|
+
before do
|
644
|
+
@job = Sidekiq::Cron::Job.new(@args.merge(klass: 'CronTestClass'))
|
645
|
+
end
|
646
|
+
|
647
|
+
it 'enques via active_job interface' do
|
648
|
+
@job.expects(:enqueue_active_job)
|
649
|
+
.returns(ActiveJobCronTestClass.new)
|
650
|
+
@job.enque!
|
651
|
+
end
|
652
|
+
end
|
653
|
+
end
|
584
654
|
end
|
585
655
|
|
586
656
|
describe 'active job with queue_name_prefix' do
|
@@ -747,6 +817,58 @@ describe "Cron Job" do
|
|
747
817
|
end
|
748
818
|
end
|
749
819
|
|
820
|
+
# @note sidekiq-cron 1.6.0 cannot process options correctly if any date_as_argument evaluates to true.
|
821
|
+
# This has been tested to resolve issues in environments where multiple sidekiq-cron versions are running when updating from 1.6.0
|
822
|
+
# See https://github.com/sidekiq-cron/sidekiq-cron/issues/350#issuecomment-1409798837 for more information.
|
823
|
+
describe "compat with sidekiq cron 1.6.0" do
|
824
|
+
describe "#to_hash with date_as_argument false" do
|
825
|
+
before do
|
826
|
+
@args = {
|
827
|
+
name: "Test",
|
828
|
+
cron: "* * * * *",
|
829
|
+
klass: "CronTestClass",
|
830
|
+
date_as_argument: false,
|
831
|
+
}
|
832
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
833
|
+
end
|
834
|
+
|
835
|
+
it "should not have date_as_argument property" do
|
836
|
+
assert !@job.to_hash.key?(:date_as_argument)
|
837
|
+
end
|
838
|
+
end
|
839
|
+
|
840
|
+
describe "#to_hash with no date_as_argument option" do
|
841
|
+
before do
|
842
|
+
@args = {
|
843
|
+
name: "Test",
|
844
|
+
cron: "* * * * *",
|
845
|
+
klass: "CronTestClass",
|
846
|
+
}
|
847
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
848
|
+
end
|
849
|
+
|
850
|
+
it "should not have date_as_argument property" do
|
851
|
+
assert !@job.to_hash.key?(:date_as_argument)
|
852
|
+
end
|
853
|
+
end
|
854
|
+
|
855
|
+
describe "#to_hash with date_as_argument" do
|
856
|
+
before do
|
857
|
+
@args = {
|
858
|
+
name: "Test",
|
859
|
+
cron: "* * * * *",
|
860
|
+
klass: "CronTestClass",
|
861
|
+
date_as_argument: true,
|
862
|
+
}
|
863
|
+
@job = Sidekiq::Cron::Job.new(@args)
|
864
|
+
end
|
865
|
+
|
866
|
+
it "should have date_as_argument property with value '1'" do
|
867
|
+
assert_equal @job.to_hash[:date_as_argument], '1'
|
868
|
+
end
|
869
|
+
end
|
870
|
+
end
|
871
|
+
|
750
872
|
describe "save" do
|
751
873
|
before do
|
752
874
|
@args = {
|
@@ -888,6 +1010,42 @@ describe "Cron Job" do
|
|
888
1010
|
assert_equal job.name, "Test"
|
889
1011
|
end
|
890
1012
|
end
|
1013
|
+
|
1014
|
+
it "from GlobalID::Identification" do
|
1015
|
+
args = {
|
1016
|
+
name: "Test",
|
1017
|
+
cron: "* * * * *",
|
1018
|
+
klass: "CronTestClass",
|
1019
|
+
args: Person.new(1)
|
1020
|
+
}
|
1021
|
+
Sidekiq::Cron::Job.new(args).tap do |job|
|
1022
|
+
assert_equal job.args, [{"_sc_globalid"=>"gid://app/Person/1"}]
|
1023
|
+
end
|
1024
|
+
end
|
1025
|
+
|
1026
|
+
it "from GlobalID::Identification in Array" do
|
1027
|
+
args = {
|
1028
|
+
name: "Test",
|
1029
|
+
cron: "* * * * *",
|
1030
|
+
klass: "CronTestClass",
|
1031
|
+
args: [Person.new(1)]
|
1032
|
+
}
|
1033
|
+
Sidekiq::Cron::Job.new(args).tap do |job|
|
1034
|
+
assert_equal job.args, [{"_sc_globalid"=>"gid://app/Person/1"}]
|
1035
|
+
end
|
1036
|
+
end
|
1037
|
+
|
1038
|
+
it "from GlobalID::Identification in Hash" do
|
1039
|
+
args = {
|
1040
|
+
name: "Test",
|
1041
|
+
cron: "* * * * *",
|
1042
|
+
klass: "CronTestClass",
|
1043
|
+
args: {person: Person.new(1)}
|
1044
|
+
}
|
1045
|
+
Sidekiq::Cron::Job.new(args).tap do |job|
|
1046
|
+
assert_equal job.args, [{person: {"_sc_globalid"=>"gid://app/Person/1"}}]
|
1047
|
+
end
|
1048
|
+
end
|
891
1049
|
end
|
892
1050
|
|
893
1051
|
describe "create & find methods" do
|
@@ -1115,11 +1273,11 @@ describe "Cron Job" do
|
|
1115
1273
|
end
|
1116
1274
|
|
1117
1275
|
it "duplicate jobs are not loaded" do
|
1118
|
-
out = Sidekiq::Cron::Job.load_from_hash @jobs_hash
|
1276
|
+
out = Sidekiq::Cron::Job.load_from_hash! @jobs_hash
|
1119
1277
|
assert_equal out.size, 0, "should have no errors"
|
1120
1278
|
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after load"
|
1121
1279
|
|
1122
|
-
out_2 = Sidekiq::Cron::Job.load_from_hash @jobs_hash
|
1280
|
+
out_2 = Sidekiq::Cron::Job.load_from_hash! @jobs_hash
|
1123
1281
|
assert_equal out_2.size, 0, "should have no errors"
|
1124
1282
|
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 jobs after loading again"
|
1125
1283
|
end
|
@@ -12,7 +12,7 @@ describe 'ScheduleLoader' do
|
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'calls Sidekiq::Cron::Job.load_from_hash' do
|
15
|
-
Sidekiq::Cron::Job.expects(:load_from_hash)
|
15
|
+
Sidekiq::Cron::Job.expects(:load_from_hash!)
|
16
16
|
Sidekiq::Options[:lifecycle_events][:startup].first.call
|
17
17
|
end
|
18
18
|
end
|
@@ -24,7 +24,7 @@ describe 'ScheduleLoader' do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'calls Sidekiq::Cron::Job.load_from_array' do
|
27
|
-
Sidekiq::Cron::Job.expects(:load_from_array)
|
27
|
+
Sidekiq::Cron::Job.expects(:load_from_array!)
|
28
28
|
Sidekiq::Options[:lifecycle_events][:startup].first.call
|
29
29
|
end
|
30
30
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-cron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ondrej Bartas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-03-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fugit
|
@@ -16,28 +16,42 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1'
|
19
|
+
version: '1.8'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1'
|
26
|
+
version: '1.8'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: sidekiq
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: '6'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
40
|
+
version: '6'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: globalid
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.0.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.1
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: minitest
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,6 +136,20 @@ dependencies:
|
|
122
136
|
- - "~>"
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0.21'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: simplecov-cobertura
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '2.1'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '2.1'
|
125
153
|
description: Enables to set jobs to be run in specified time (using CRON notation
|
126
154
|
or natural language)
|
127
155
|
email: ondrej@bartas.cz
|
@@ -158,6 +186,7 @@ files:
|
|
158
186
|
- lib/sidekiq/options.rb
|
159
187
|
- sidekiq-cron.gemspec
|
160
188
|
- test/integration/performance_test.rb
|
189
|
+
- test/models/person.rb
|
161
190
|
- test/test_helper.rb
|
162
191
|
- test/unit/fixtures/schedule_array.yml
|
163
192
|
- test/unit/fixtures/schedule_erb.yml
|
@@ -180,14 +209,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
180
209
|
requirements:
|
181
210
|
- - ">="
|
182
211
|
- !ruby/object:Gem::Version
|
183
|
-
version: '2.
|
212
|
+
version: '2.7'
|
184
213
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
214
|
requirements:
|
186
215
|
- - ">="
|
187
216
|
- !ruby/object:Gem::Version
|
188
217
|
version: '0'
|
189
218
|
requirements: []
|
190
|
-
rubygems_version: 3.
|
219
|
+
rubygems_version: 3.4.6
|
191
220
|
signing_key:
|
192
221
|
specification_version: 4
|
193
222
|
summary: Scheduler/Cron for Sidekiq jobs
|