sidekiq-scheduler 5.0.5 → 6.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +15 -6
- data/README.md +16 -14
- data/lib/sidekiq-scheduler/config.rb +1 -1
- data/lib/sidekiq-scheduler/extensions/web.rb +3 -17
- data/lib/sidekiq-scheduler/redis_manager.rb +1 -1
- data/lib/sidekiq-scheduler/schedule.rb +1 -1
- data/lib/sidekiq-scheduler/scheduler.rb +6 -6
- data/lib/sidekiq-scheduler/sidekiq_adapter.rb +12 -50
- data/lib/sidekiq-scheduler/utils.rb +6 -4
- data/lib/sidekiq-scheduler/version.rb +1 -1
- data/lib/sidekiq-scheduler/web.rb +24 -4
- data/lib/sidekiq-scheduler.rb +0 -1
- data/web/assets/recurring_jobs/stylesheets-scheduler/recurring_jobs.css +67 -28
- data/web/assets/recurring_jobs/stylesheets-scheduler/recurring_jobs_73.css +45 -0
- data/web/views/recurring_jobs.erb +43 -46
- data/web/views/sidekiq73/recurring_jobs.erb +61 -0
- metadata +13 -47
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 912d4874af78cd3092ce7807235712fb38455291243e86b3fab871445a29fbd8
|
4
|
+
data.tar.gz: 0a65678172f220908cae365d54ed8f9912cf65fd47583a37d5ff61752dce3bd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a231389e5e216ed5679440f4f1264b32afb8fab63fd78432c0e66f35b94d32f8255d44806762fbba3e4d189588715d5b28cf8655d940de4cd342b8d9be53b16
|
7
|
+
data.tar.gz: fde5cec33e44141229eeded5d5a3d9185310511e8be2f8e80b026483a58beff0f1ed7f4b934f55338a6439a831ae526227548305c4322aba62170ec34e616859
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# 6.0.0.beta1
|
2
|
+
- [**ENHANCEMENT**] Adds compatibility with Sidekiq 8 [#497](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/497)
|
3
|
+
- [**BREAKING CHANGE**] Drop support for Sidekiq 7.2 and earlier [#497](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/498)
|
4
|
+
|
5
|
+
# 5.0.6
|
6
|
+
- [**FIX**] Fix typo in `config#to_hash` method [#479](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/479)
|
7
|
+
- [**FIX**] Correctly clear scheduled jobs with Scheduler#clear_schedule! [#485](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/485)
|
8
|
+
- [**FIX**] Fix scheduling of aperiodic cron jobs [#487](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/487) (see [#484](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/484) for more details as well)
|
9
|
+
|
1
10
|
# 5.0.5
|
2
11
|
- [**FIX**] Use correct folder structure for assets [#476](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/476)
|
3
12
|
|
@@ -13,7 +22,7 @@
|
|
13
22
|
- [**FIX**] Prevent stack level too deep error by implementing `to_hash` method [#470](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/470)
|
14
23
|
- [**ENHANCEMENT**] Support new Sidekiq model for registering UI plugins [#472](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/472)
|
15
24
|
- [**ENHANCEMENT**] Stop testing against Ruby 2.7 and 3.0 [#472](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/472#discussion_r1663197863)
|
16
|
-
- [**ENHANCEMENT**] Display `at` and `in` in the dashboard [#291](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/291)
|
25
|
+
- [**ENHANCEMENT**] Display `at` and `in` in the dashboard [#291](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/291)
|
17
26
|
- [**ENHANCEMENT**] Docs enhancements [#442](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/442), [#449](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/449), [#457](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/457), [#465](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/465), [58e1835](https://github.com/sidekiq-scheduler/sidekiq-scheduler/commit/58e18351054fc3c264b2b5a684173316f674c386)
|
18
27
|
|
19
28
|
|
@@ -35,10 +44,10 @@
|
|
35
44
|
- [**ENHANCEMENT**] Adds Ruby 3.2 to the CI matrix. [#420](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/420)
|
36
45
|
- [**DOCS**] README: refer to v5 as released. [#421](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/421)
|
37
46
|
- [**FIX**] Fix dependency on Rails `.present?` method. [#425](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/425)
|
38
|
-
|
47
|
+
|
39
48
|
# 5.0.0
|
40
49
|
|
41
|
-
- [**FIX**] Ensure generated scheduled time has a precision of 3
|
50
|
+
- [**FIX**] Ensure generated scheduled time has a precision of 3 milliseconds. [#418](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/418)
|
42
51
|
|
43
52
|
*Note 1:* Check [# 5.0.0.beta1](#500beta1) & [# 5.0.0.beta2](#500beta2) releases for breaking changes.
|
44
53
|
|
@@ -54,7 +63,7 @@
|
|
54
63
|
- [**BREAKING CHANGE**] Moves all sidekiq-scheduler config options under the `scheduler` key in the `sidekiq.yml` file [#412](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/412)
|
55
64
|
- If you're migrating from v4 to v5, any `sidekiq-scheduler` config you may have in your `sidekiq.yml` should be moved under the `scheduler` key.
|
56
65
|
- See [#412](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/412) to see which are the config options that you need to move under the `scheduler` key.
|
57
|
-
|
66
|
+
|
58
67
|
- [**BREAKING CHANGE**] Drop support for EOL Ruby & Sidekiq versions (Ruby: `2.5.x` & `2.6.x`; Sidekiq: `4.x` & `5.x`) [#411](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/411)
|
59
68
|
|
60
69
|
- [**FIX**] Add support for Sidekiq 7 [#410](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/410)
|
@@ -91,6 +100,6 @@
|
|
91
100
|
- [**ENHANCEMENT**] Highlight disabled jobs [#369](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/369)
|
92
101
|
- [**BREAKING CHANGE**] Require redis 4.2.0 [#370](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/370)
|
93
102
|
- [**FIX**] Fixes redis deprecation warning regarding `exists` [#370](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/370)
|
94
|
-
- [**BREAKING CHANGE**] Remove
|
103
|
+
- [**BREAKING CHANGE**] Remove dependency on thwait and e2mmap [#371](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/371)
|
95
104
|
- Support Ruby 3.1 [#373](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/373)
|
96
|
-
- [**BREAKING CHANGE**] Set rufus_scheduler_options via sidekiq.yml file as configuration option [#375](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/375)
|
105
|
+
- [**BREAKING CHANGE**] Set rufus_scheduler_options via sidekiq.yml file as configuration option [#375](https://github.com/sidekiq-scheduler/sidekiq-scheduler/pull/375)
|
data/README.md
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
`sidekiq-scheduler` is an extension to [Sidekiq](http://github.com/mperham/sidekiq) that
|
19
19
|
pushes jobs in a scheduled way, mimicking cron utility.
|
20
20
|
|
21
|
-
__Note:__ Current branch contains work of the
|
21
|
+
__Note:__ Current branch contains work of the v6 release, if you are looking for version 2.2.\*, 3.\*, 4.\*, or 5.\*, go to [2.2-stable branch](https://github.com/sidekiq-scheduler/sidekiq-scheduler/tree/2.2-stable) / [v3-stable](https://github.com/sidekiq-scheduler/sidekiq-scheduler/tree/v3-stable) / [v4-stable](https://github.com/sidekiq-scheduler/sidekiq-scheduler/tree/v4-stable) / [v5-stable](https://github.com/sidekiq-scheduler/sidekiq-scheduler/tree/v5-stable).
|
22
22
|
|
23
23
|
## Installation
|
24
24
|
|
@@ -37,7 +37,7 @@ gem install sidekiq-scheduler
|
|
37
37
|
require 'sidekiq-scheduler'
|
38
38
|
|
39
39
|
class HelloWorld
|
40
|
-
include Sidekiq::
|
40
|
+
include Sidekiq::Job
|
41
41
|
|
42
42
|
def perform
|
43
43
|
puts 'Hello world'
|
@@ -58,7 +58,7 @@ __Note:__ In Sidekiq v6.3 `Sidekiq::Job` was introduced as an alias for `Sidekiq
|
|
58
58
|
```
|
59
59
|
|
60
60
|
> [!NOTE]
|
61
|
-
> sidekiq-scheduler uses [fugit](https://github.com/floraison/fugit) under the hood, which supports up to six arguments as the cron string, [see](https://github.com/floraison/fugit?tab=readme-ov-file#the-second-extension).
|
61
|
+
> sidekiq-scheduler uses [fugit](https://github.com/floraison/fugit) under the hood, which supports up to six arguments as the cron string, [see](https://github.com/floraison/fugit?tab=readme-ov-file#the-second-extension).
|
62
62
|
|
63
63
|
Run sidekiq:
|
64
64
|
|
@@ -125,16 +125,16 @@ The schedule is configured through the `:scheduler:` -> `:schedule` config entry
|
|
125
125
|
# Enable / disable a job. All jobs are enabled by default.
|
126
126
|
enabled: true
|
127
127
|
|
128
|
-
# Deconstructs a hash defined as the `args` to keyword arguments.
|
128
|
+
# Deconstructs a hash defined as the `args` to keyword arguments.
|
129
129
|
#
|
130
130
|
# `false` by default.
|
131
|
-
#
|
131
|
+
#
|
132
132
|
# Example
|
133
|
-
#
|
133
|
+
#
|
134
134
|
# my_job:
|
135
135
|
# cron: '0 0 * * * *'
|
136
136
|
# class: MyJob
|
137
|
-
# args: { foo: 'bar', hello: 'world' }
|
137
|
+
# args: { foo: 'bar', hello: 'world' }
|
138
138
|
# keyword_argument: true
|
139
139
|
#
|
140
140
|
# class MyJob < ActiveJob::Base
|
@@ -142,7 +142,7 @@ The schedule is configured through the `:scheduler:` -> `:schedule` config entry
|
|
142
142
|
# # ...
|
143
143
|
# end
|
144
144
|
# end
|
145
|
-
keyword_argument: true
|
145
|
+
keyword_argument: true
|
146
146
|
```
|
147
147
|
|
148
148
|
### Schedule metadata
|
@@ -337,7 +337,7 @@ You can also override the thread pool size in Rufus Scheduler by setting the fol
|
|
337
337
|
## Notes about running on Multiple Hosts
|
338
338
|
|
339
339
|
Under normal conditions, `cron` and `at` jobs are pushed once regardless of the number of `sidekiq-scheduler` running instances,
|
340
|
-
|
340
|
+
assuming that time deltas between hosts is less than 24 hours.
|
341
341
|
|
342
342
|
Non-normal conditions that could push a specific job multiple times are:
|
343
343
|
- high cpu load + a high number of jobs scheduled at the same time, like 100 jobs
|
@@ -347,7 +347,7 @@ Non-normal conditions that could push a specific job multiple times are:
|
|
347
347
|
|
348
348
|
### Suggested setup for Multiple Hosts using Heroku and Rails
|
349
349
|
|
350
|
-
Configuration options `every`, `interval` and `in` will push once per host. This may be undesirable. One way to achieve single jobs per the schedule would be to manually designate a host as the scheduler. The goal is to have a single scheduler process running across all your hosts.
|
350
|
+
Configuration options `every`, `interval` and `in` will push once per host. This may be undesirable. One way to achieve single jobs per the schedule would be to manually designate a host as the scheduler. The goal is to have a single scheduler process running across all your hosts.
|
351
351
|
|
352
352
|
This can be achieved by using an environment variable and controlling the number of dynos. In Rails, you can read this variable during initialization and then conditionally load your config file.
|
353
353
|
|
@@ -384,7 +384,7 @@ worker: bundle exec sidekiq -q default
|
|
384
384
|
scheduler: IS_SCHEDULER=true bundle exec sidekiq -q default
|
385
385
|
```
|
386
386
|
|
387
|
-
When running via Heroku, you set your `scheduler` process to have 1 dyno. This will ensure you have at most 1 worker loading the schedule.
|
387
|
+
When running via Heroku, you set your `scheduler` process to have 1 dyno. This will ensure you have at most 1 worker loading the schedule.
|
388
388
|
|
389
389
|
## Notes on when Sidekiq worker is down
|
390
390
|
|
@@ -397,7 +397,7 @@ Possible solutions include:
|
|
397
397
|
- Zero downtime deploy for sidekiq workers: keep at least one worker up during whole deploy and only restart/shut it down after when new one has started
|
398
398
|
- Running scheduler inside your unicorn/rails processes (if you already have zero downtime deploy set up for these)
|
399
399
|
|
400
|
-
Each option has it's own pros and cons.
|
400
|
+
Each option has it's own pros and cons.
|
401
401
|
|
402
402
|
## Notes when running multiple Sidekiq processors on the same Redis
|
403
403
|
|
@@ -480,6 +480,8 @@ run Sidekiq::Web
|
|
480
480
|
|
481
481
|

|
482
482
|
|
483
|
+

|
484
|
+
|
483
485
|
## ActiveJob integration
|
484
486
|
|
485
487
|
When using sidekiq-scheduler with ActiveJob your jobs can just extend `ApplicationJob` as usual, without the `require` and `include` boilerplate. Under the hood Rails will load up the scheduler and include the worker module for you.
|
@@ -494,7 +496,7 @@ end
|
|
494
496
|
|
495
497
|
## The Spring preloader and Testing your initializer via Rails console
|
496
498
|
|
497
|
-
If you're pulling in your schedule from a YML file via an initializer as shown, be aware that the Spring application preloader included with Rails will
|
499
|
+
If you're pulling in your schedule from a YML file via an initializer as shown, be aware that the Spring application preloader included with Rails will interfere with testing via the Rails console.
|
498
500
|
|
499
501
|
**Spring will not reload initializers** unless the initializer is changed. Therefore, if you're making a change to your YML schedule file and reloading Rails console to see the change, Spring will make it seem like your modified schedule is not being reloaded.
|
500
502
|
|
@@ -539,7 +541,7 @@ MIT License
|
|
539
541
|
|
540
542
|
## Copyright
|
541
543
|
|
542
|
-
- Copyright 2021 -
|
544
|
+
- Copyright 2021 - 2024 Marcelo Lauxen.
|
543
545
|
- Copyright 2013 - 2022 Moove-IT.
|
544
546
|
- Copyright 2012 Morton Jonuschat.
|
545
547
|
- Some parts copyright 2010 Ben VandenBos.
|
@@ -1,9 +1,8 @@
|
|
1
1
|
require 'sidekiq/web' unless defined?(Sidekiq::Web)
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
Sidekiq::Web.register(SidekiqScheduler::Web,
|
3
|
+
# Locale and asset cache is configured in `cfg.register`
|
4
|
+
Sidekiq::Web.configure do |cfg|
|
5
|
+
cfg.register(SidekiqScheduler::Web,
|
7
6
|
name: "recurring_jobs",
|
8
7
|
tab: ["Recurring Jobs"],
|
9
8
|
index: ["recurring-jobs"],
|
@@ -11,17 +10,4 @@ if SidekiqScheduler::SidekiqAdapter::SIDEKIQ_GTE_7_3_0
|
|
11
10
|
asset_paths: ["stylesheets-scheduler"]) do |app|
|
12
11
|
# add middleware or additional settings here
|
13
12
|
end
|
14
|
-
|
15
|
-
else
|
16
|
-
|
17
|
-
ASSETS_PATH = File.expand_path('../../../web/assets', __dir__)
|
18
|
-
|
19
|
-
Sidekiq::Web.register(SidekiqScheduler::Web)
|
20
|
-
Sidekiq::Web.tabs['recurring_jobs'] = 'recurring-jobs'
|
21
|
-
Sidekiq::Web.locales << File.expand_path("#{File.dirname(__FILE__)}/../../../web/locales")
|
22
|
-
|
23
|
-
Sidekiq::Web.use Rack::Static, urls: ['/recurring_jobs/stylesheets-scheduler'],
|
24
|
-
root: ASSETS_PATH,
|
25
|
-
cascade: true,
|
26
|
-
header_rules: [[:all, { 'cache-control' => 'private, max-age=86400' }]]
|
27
13
|
end
|
@@ -121,7 +121,7 @@ module SidekiqScheduler
|
|
121
121
|
Sidekiq.redis { |r| r.del(schedules_changed_key) unless r.type(schedules_changed_key) == 'zset' }
|
122
122
|
end
|
123
123
|
|
124
|
-
#
|
124
|
+
# Registers a queued job instance
|
125
125
|
#
|
126
126
|
# @param [String] job_name The name of the job
|
127
127
|
# @param [Time] time The time at which the job was cleared by the scheduler
|
@@ -65,7 +65,7 @@ module SidekiqScheduler
|
|
65
65
|
end
|
66
66
|
alias_method :schedule!, :reload_schedule!
|
67
67
|
|
68
|
-
#
|
68
|
+
# Retrieve the schedule configuration for the given name
|
69
69
|
# if the name is nil it returns a hash with all the
|
70
70
|
# names end their schedules.
|
71
71
|
def get_schedule(name = nil)
|
@@ -17,7 +17,7 @@ module SidekiqScheduler
|
|
17
17
|
# saying we will have to do it somehow still)
|
18
18
|
#
|
19
19
|
# NOTE: ^ Keeping this TODO here for now, in a future version of this project
|
20
|
-
# we will remove those attr
|
20
|
+
# we will remove those attr accessors and use only our config object. For now,
|
21
21
|
# let's keep as it is.
|
22
22
|
|
23
23
|
# Set to enable or disable the scheduler.
|
@@ -196,7 +196,7 @@ module SidekiqScheduler
|
|
196
196
|
@rufus_scheduler = nil
|
197
197
|
end
|
198
198
|
|
199
|
-
|
199
|
+
@scheduled_jobs = {}
|
200
200
|
|
201
201
|
rufus_scheduler
|
202
202
|
end
|
@@ -268,9 +268,9 @@ module SidekiqScheduler
|
|
268
268
|
conf = SidekiqScheduler::Utils.sanitize_job_config(config)
|
269
269
|
|
270
270
|
if job.is_a?(Rufus::Scheduler::CronJob)
|
271
|
-
idempotent_job_enqueue(name, SidekiqScheduler::Utils.calc_cron_run_time(job.cron_line, time.
|
271
|
+
idempotent_job_enqueue(name, SidekiqScheduler::Utils.calc_cron_run_time(job.cron_line, time.to_t), conf)
|
272
272
|
else
|
273
|
-
idempotent_job_enqueue(name, time, conf)
|
273
|
+
idempotent_job_enqueue(name, time.to_t, conf)
|
274
274
|
end
|
275
275
|
end
|
276
276
|
end
|
@@ -303,12 +303,12 @@ module SidekiqScheduler
|
|
303
303
|
end
|
304
304
|
|
305
305
|
# Adds a Hash with schedule metadata as the last argument to call the worker.
|
306
|
-
# It currently returns the schedule time as a Float number representing the
|
306
|
+
# It currently returns the schedule time as a Float number representing the milliseconds
|
307
307
|
# since epoch.
|
308
308
|
#
|
309
309
|
# @example with hash argument
|
310
310
|
# arguments_with_metadata({value: 1}, scheduled_at: Time.now.round(3))
|
311
|
-
# #=> [{value: 1}, {scheduled_at: <
|
311
|
+
# #=> [{value: 1}, {scheduled_at: <milliseconds since epoch>}]
|
312
312
|
#
|
313
313
|
# @param args [Array|Hash]
|
314
314
|
# @param metadata [Hash]
|
@@ -2,89 +2,51 @@ module SidekiqScheduler
|
|
2
2
|
class OptionNotSupportedAnymore < StandardError; end
|
3
3
|
|
4
4
|
class SidekiqAdapter
|
5
|
-
SIDEKIQ_GTE_6_5_0 = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('6.5.0')
|
6
|
-
SIDEKIQ_GTE_7_0_0 = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('7.0.0')
|
7
5
|
SIDEKIQ_GTE_7_3_0 = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('7.3.0')
|
6
|
+
SIDEKIQ_GTE_8_0_0 = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('8.0.0')
|
8
7
|
|
9
8
|
def self.fetch_scheduler_config_from_sidekiq(sidekiq_config)
|
10
9
|
return {} if sidekiq_config.nil?
|
11
10
|
|
12
11
|
check_using_old_sidekiq_scheduler_config!(sidekiq_config)
|
13
12
|
|
14
|
-
|
15
|
-
sidekiq_config.fetch(:scheduler, {})
|
16
|
-
else
|
17
|
-
sidekiq_config.options.fetch(:scheduler, {})
|
18
|
-
end
|
13
|
+
sidekiq_config.fetch(:scheduler, {})
|
19
14
|
end
|
20
15
|
|
21
16
|
def self.check_using_old_sidekiq_scheduler_config!(sidekiq_config)
|
22
17
|
%i[enabled dynamic dynamic_every schedule listened_queues_only rufus_scheduler_options].each do |option|
|
23
|
-
if
|
24
|
-
|
25
|
-
raise OptionNotSupportedAnymore, ":#{option} option should be under the :scheduler: key"
|
26
|
-
end
|
27
|
-
elsif SIDEKIQ_GTE_6_5_0
|
28
|
-
unless sidekiq_config[option].nil?
|
29
|
-
raise OptionNotSupportedAnymore, ":#{option} option should be under the :scheduler: key"
|
30
|
-
end
|
31
|
-
else
|
32
|
-
if sidekiq_config.options.key?(option)
|
33
|
-
raise OptionNotSupportedAnymore, ":#{option} option should be under the :scheduler: key"
|
34
|
-
end
|
18
|
+
if sidekiq_config.key?(option)
|
19
|
+
raise OptionNotSupportedAnymore, ":#{option} option should be under the :scheduler: key"
|
35
20
|
end
|
36
21
|
end
|
37
22
|
end
|
38
23
|
|
39
24
|
def self.start_schedule_manager(sidekiq_config:, schedule_manager:)
|
40
|
-
|
41
|
-
|
42
|
-
sidekiq_config[:schedule_manager].start
|
43
|
-
else
|
44
|
-
sidekiq_config.options[:schedule_manager] = schedule_manager
|
45
|
-
sidekiq_config.options[:schedule_manager].start
|
46
|
-
end
|
25
|
+
sidekiq_config[:schedule_manager] = schedule_manager
|
26
|
+
sidekiq_config[:schedule_manager].start
|
47
27
|
end
|
48
28
|
|
49
29
|
def self.stop_schedule_manager(sidekiq_config:)
|
50
|
-
|
51
|
-
sidekiq_config[:schedule_manager].stop
|
52
|
-
else
|
53
|
-
sidekiq_config.options[:schedule_manager].stop
|
54
|
-
end
|
30
|
+
sidekiq_config[:schedule_manager].stop
|
55
31
|
end
|
56
32
|
|
57
33
|
def self.sidekiq_queues(sidekiq_config)
|
58
|
-
if
|
59
|
-
|
60
|
-
Sidekiq.instance_variable_get(:@config).queues.map(&:to_s)
|
61
|
-
else
|
62
|
-
sidekiq_config.queues.map(&:to_s)
|
63
|
-
end
|
64
|
-
elsif SIDEKIQ_GTE_6_5_0
|
65
|
-
Sidekiq[:queues].map(&:to_s)
|
34
|
+
if sidekiq_config.nil? || (sidekiq_config.respond_to?(:empty?) && sidekiq_config.empty?)
|
35
|
+
Sidekiq.instance_variable_get(:@config).queues.map(&:to_s)
|
66
36
|
else
|
67
|
-
|
37
|
+
sidekiq_config.queues.map(&:to_s)
|
68
38
|
end
|
69
39
|
end
|
70
40
|
|
71
41
|
def self.redis_key_exists?(key_name)
|
72
42
|
Sidekiq.redis do |r|
|
73
|
-
|
74
|
-
r.exists(key_name) > 0
|
75
|
-
else
|
76
|
-
r.exists?(key_name)
|
77
|
-
end
|
43
|
+
r.exists(key_name) > 0
|
78
44
|
end
|
79
45
|
end
|
80
46
|
|
81
47
|
def self.redis_zrangebyscore(key, from, to)
|
82
48
|
Sidekiq.redis do |r|
|
83
|
-
|
84
|
-
r.zrange(key, from, to, "BYSCORE")
|
85
|
-
else
|
86
|
-
r.zrangebyscore(key, from, to)
|
87
|
-
end
|
49
|
+
r.zrange(key, from, to, "BYSCORE")
|
88
50
|
end
|
89
51
|
end
|
90
52
|
end
|
@@ -73,7 +73,7 @@ module SidekiqScheduler
|
|
73
73
|
# Returns true if the enqueuing needs to be done for an ActiveJob
|
74
74
|
# class false otherwise.
|
75
75
|
#
|
76
|
-
# @param [Class] klass the class to check is
|
76
|
+
# @param [Class] klass the class to check is descendant from ActiveJob
|
77
77
|
#
|
78
78
|
# @return [Boolean]
|
79
79
|
def self.active_job_enqueue?(klass)
|
@@ -155,9 +155,11 @@ module SidekiqScheduler
|
|
155
155
|
#
|
156
156
|
# @return [Time]
|
157
157
|
def self.calc_cron_run_time(cron, time)
|
158
|
-
time = time.
|
159
|
-
|
160
|
-
|
158
|
+
time = time.floor # remove sub seconds to prevent rounding errors.
|
159
|
+
return time if cron.match?(time) # If the time is a perfect match then return it.
|
160
|
+
|
161
|
+
next_t = cron.next_time(time).to_t
|
162
|
+
previous_t = cron.previous_time(time).to_t
|
161
163
|
# The `time` var is some point between `previous_t` and `next_t`.
|
162
164
|
# Figure out how far off we are from each side in seconds.
|
163
165
|
next_diff = next_t - time
|
@@ -6,9 +6,29 @@ module SidekiqScheduler
|
|
6
6
|
# Hook into *Sidekiq::Web* app which adds a new '/recurring-jobs' page
|
7
7
|
|
8
8
|
module Web
|
9
|
-
VIEW_PATH = File.expand_path('../../../web/views', __FILE__)
|
9
|
+
VIEW_PATH = File.expand_path(SidekiqAdapter::SIDEKIQ_GTE_8_0_0 ? '../../../web/views' : '../../../web/views/sidekiq73', __FILE__)
|
10
|
+
|
11
|
+
module Helpers
|
12
|
+
def sidekiq_scheduler_fetch_route_param(key)
|
13
|
+
if SidekiqAdapter::SIDEKIQ_GTE_8_0_0
|
14
|
+
route_params(key)
|
15
|
+
else
|
16
|
+
route_params[key]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def sidekiq_scheduler_fetch_url_param(key)
|
21
|
+
if SidekiqAdapter::SIDEKIQ_GTE_8_0_0
|
22
|
+
url_params(key)
|
23
|
+
else
|
24
|
+
params[key]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
10
28
|
|
11
29
|
def self.registered(app)
|
30
|
+
app.helpers(Helpers)
|
31
|
+
|
12
32
|
app.get '/recurring-jobs' do
|
13
33
|
@presented_jobs = JobPresenter.build_collection(Sidekiq.schedule!)
|
14
34
|
|
@@ -16,7 +36,7 @@ module SidekiqScheduler
|
|
16
36
|
end
|
17
37
|
|
18
38
|
app.post '/recurring-jobs/:name/enqueue' do
|
19
|
-
schedule = Sidekiq.get_schedule(
|
39
|
+
schedule = Sidekiq.get_schedule(sidekiq_scheduler_fetch_route_param(:name))
|
20
40
|
SidekiqScheduler::Scheduler.instance.enqueue_job(schedule)
|
21
41
|
redirect "#{root_path}recurring-jobs"
|
22
42
|
end
|
@@ -24,12 +44,12 @@ module SidekiqScheduler
|
|
24
44
|
app.post '/recurring-jobs/:name/toggle' do
|
25
45
|
Sidekiq.reload_schedule!
|
26
46
|
|
27
|
-
SidekiqScheduler::Scheduler.instance.toggle_job_enabled(
|
47
|
+
SidekiqScheduler::Scheduler.instance.toggle_job_enabled(sidekiq_scheduler_fetch_route_param(:name))
|
28
48
|
redirect "#{root_path}recurring-jobs"
|
29
49
|
end
|
30
50
|
|
31
51
|
app.post '/recurring-jobs/toggle-all' do
|
32
|
-
SidekiqScheduler::Scheduler.instance.toggle_all_jobs(
|
52
|
+
SidekiqScheduler::Scheduler.instance.toggle_all_jobs(sidekiq_scheduler_fetch_url_param(:action) == 'enable')
|
33
53
|
redirect "#{root_path}recurring-jobs"
|
34
54
|
end
|
35
55
|
end
|
data/lib/sidekiq-scheduler.rb
CHANGED
@@ -1,42 +1,81 @@
|
|
1
|
-
.
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
.
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
1
|
+
.sidekiq-scheduler .job-name {
|
2
|
+
color: var(--color-primary);
|
3
|
+
display: block;
|
4
|
+
font-size: var(--font-size);
|
5
|
+
font-weight: 700;
|
6
|
+
}
|
7
|
+
|
8
|
+
.sidekiq-scheduler .queue {
|
9
|
+
text-align: right;
|
10
|
+
}
|
11
|
+
|
12
|
+
.sidekiq-scheduler .btn-xs {
|
13
|
+
padding: 1px 5px;
|
14
|
+
font-size: var(--font-size-small);
|
15
|
+
line-height: 1.5;
|
16
|
+
}
|
17
|
+
|
18
|
+
.sidekiq-scheduler .description,
|
19
|
+
.sidekiq-scheduler .last-time,
|
20
|
+
.sidekiq-scheduler .next-time {
|
21
|
+
font-size: var(--font-size-small);
|
22
|
+
}
|
23
|
+
|
24
|
+
.sidekiq-scheduler .description {
|
25
|
+
padding-top: 10px;
|
26
|
+
}
|
27
|
+
|
28
|
+
.sidekiq-scheduler .inline {
|
29
|
+
display: inline;
|
15
30
|
}
|
16
31
|
|
17
|
-
.
|
32
|
+
.sidekiq-scheduler .job-list .job {
|
33
|
+
background-color: var(--color-elevated);
|
34
|
+
border: 1px solid var(--color-border);
|
35
|
+
box-shadow: 0 2px 4px 0 var(--color-shadow);
|
36
|
+
padding: 10px;
|
37
|
+
}
|
38
|
+
|
39
|
+
.sidekiq-scheduler .column-2 {
|
40
|
+
float: left;
|
41
|
+
width: 50%;
|
42
|
+
}
|
43
|
+
|
44
|
+
.sidekiq-scheduler .column-3 {
|
45
|
+
float: left;
|
46
|
+
width: 33.33%;
|
47
|
+
}
|
48
|
+
|
49
|
+
.sidekiq-scheduler .row:after {
|
50
|
+
content: "";
|
51
|
+
display: table;
|
52
|
+
clear: both;
|
53
|
+
}
|
54
|
+
|
55
|
+
.sidekiq-scheduler .job.disabled-job {
|
18
56
|
background-color: #f3d3d3;
|
57
|
+
color: #585454;
|
19
58
|
}
|
20
59
|
|
21
60
|
@media (prefers-color-scheme: dark) {
|
22
|
-
.
|
23
|
-
background-color: #
|
24
|
-
color: white;
|
25
|
-
border: 1px solid #555;
|
61
|
+
.sidekiq-scheduler .job.disabled-job {
|
62
|
+
background-color: #4f0b0b;
|
26
63
|
}
|
27
64
|
}
|
28
65
|
|
29
|
-
.
|
30
|
-
|
31
|
-
margin-bottom: 10px;
|
32
|
-
line-height: 45px;
|
33
|
-
text-align: right;
|
66
|
+
.sidekiq-scheduler .disabled-job .next-time {
|
67
|
+
text-decoration: line-through;
|
34
68
|
}
|
35
69
|
|
36
|
-
@media (max-width:
|
37
|
-
.
|
38
|
-
|
70
|
+
@media screen and (max-width: 1000px) {
|
71
|
+
.sidekiq-scheduler .column-2,
|
72
|
+
.sidekiq-scheduler .column-3,
|
73
|
+
.sidekiq-scheduler .description {
|
74
|
+
width: 100%;
|
75
|
+
padding: 5px 10px;
|
76
|
+
}
|
77
|
+
|
78
|
+
.sidekiq-scheduler .queue {
|
39
79
|
text-align: left;
|
40
|
-
line-height: inherit;
|
41
80
|
}
|
42
81
|
}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
.recurring-jobs { border-top-left-radius: 4px; border-top-right-radius: 4px; }
|
2
|
+
.recurring-jobs .title { margin-bottom: 5px; }
|
3
|
+
.recurring-jobs .title .name { font-weight: bold;}
|
4
|
+
.recurring-jobs .info,
|
5
|
+
.recurring-jobs .description { margin-bottom: 5px; }
|
6
|
+
.recurring-jobs .actions { margin-bottom: 5px; }
|
7
|
+
.recurring-jobs .status,
|
8
|
+
.recurring-jobs .description { font-size: 12px; }
|
9
|
+
.recurring-jobs .enqueue { margin-bottom: 0.5rem }
|
10
|
+
|
11
|
+
.list-group-item {
|
12
|
+
background-color: #f3f3f3;
|
13
|
+
color: #585454;
|
14
|
+
border: 1px solid rgba(0, 0, 0, 0.1);
|
15
|
+
}
|
16
|
+
|
17
|
+
.list-group-item-disabled {
|
18
|
+
background-color: #f3d3d3;
|
19
|
+
}
|
20
|
+
|
21
|
+
@media (prefers-color-scheme: dark) {
|
22
|
+
.list-group-item {
|
23
|
+
background-color: #222;
|
24
|
+
color: white;
|
25
|
+
border: 1px solid #555;
|
26
|
+
}
|
27
|
+
.list-group-item-disabled {
|
28
|
+
color: #585454;
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
.toggle-all-buttons {
|
33
|
+
margin-top: 20px;
|
34
|
+
margin-bottom: 10px;
|
35
|
+
line-height: 45px;
|
36
|
+
text-align: right;
|
37
|
+
}
|
38
|
+
|
39
|
+
@media (max-width: 768px) {
|
40
|
+
.toggle-all-buttons {
|
41
|
+
margin-top: 0;
|
42
|
+
text-align: left;
|
43
|
+
line-height: inherit;
|
44
|
+
}
|
45
|
+
}
|
@@ -1,65 +1,62 @@
|
|
1
|
-
<%
|
2
|
-
<%= style_tag "recurring_jobs/stylesheets-scheduler/recurring_jobs.css" %>
|
3
|
-
<% else %>
|
4
|
-
<link href="<%= root_path %>recurring_jobs/stylesheets-scheduler/recurring_jobs.css" media="screen" rel="stylesheet" type="text/css" />
|
5
|
-
<% end %>
|
1
|
+
<% style_tag "recurring_jobs/stylesheets-scheduler/recurring_jobs.css" %>
|
6
2
|
|
7
|
-
<
|
8
|
-
<
|
9
|
-
<
|
10
|
-
|
11
|
-
<div class="col-sm-6 toggle-all-buttons">
|
12
|
-
<form action="<%= root_path %>recurring-jobs/toggle-all" method="post">
|
3
|
+
<section class="sidekiq-scheduler">
|
4
|
+
<header>
|
5
|
+
<h2><%= t('recurring_jobs') %></h2>
|
6
|
+
<form action="<%= root_path %>recurring-jobs/toggle-all" method="POST" class="filter">
|
13
7
|
<%= csrf_tag %>
|
14
|
-
<
|
15
|
-
|
8
|
+
<div class="btn-group pull-right flip">
|
9
|
+
<button type="submit" class="btn btn-xs btn-warn" name="action" value="enable"><%= t('enable_all') %></button>
|
10
|
+
<button type="submit" class="btn btn-xs btn-warn" name="action" value="disable"><%= t('disable_all') %></button>
|
11
|
+
</div>
|
16
12
|
</form>
|
17
|
-
</
|
18
|
-
</div>
|
13
|
+
</header>
|
19
14
|
|
20
|
-
<
|
21
|
-
<ul class="list-group">
|
15
|
+
<section class="job-list">
|
22
16
|
<% @presented_jobs.each do |job| %>
|
23
|
-
<
|
24
|
-
<div class="
|
25
|
-
<div class="
|
26
|
-
<div class="
|
27
|
-
|
28
|
-
|
29
|
-
<
|
30
|
-
<a href="<%= root_path %>queues/<%= job.queue %>"><%= job.queue %></a>
|
31
|
-
</div>
|
17
|
+
<section class="job <%= job.enabled? ? "" : "disabled-job" %>">
|
18
|
+
<div class="row">
|
19
|
+
<div class="column-2">
|
20
|
+
<div class="job-name"><%= job.name %></div>
|
21
|
+
</div>
|
22
|
+
<div class="column-2 queue">
|
23
|
+
<a href="<%= root_path %>queues/<%= job.queue %>"><%= job.queue %></a>
|
32
24
|
</div>
|
33
25
|
</div>
|
34
|
-
|
35
|
-
<div class="
|
36
|
-
<div class="
|
37
|
-
<div class="
|
38
|
-
|
39
|
-
|
26
|
+
|
27
|
+
<div class="row">
|
28
|
+
<div class="column-3">
|
29
|
+
<div class="class-name"><%= job['class'] %></div>
|
30
|
+
</div>
|
31
|
+
<div class="column-3">
|
32
|
+
<div><%= t('interval') %>: <%= job.interval %></div>
|
33
|
+
</div>
|
34
|
+
<div class="column-3">
|
35
|
+
<div><%= t('arguments') %>: <%= job['args'] %></div>
|
40
36
|
</div>
|
41
37
|
</div>
|
42
|
-
<div class="
|
43
|
-
<div class="
|
44
|
-
<form action="<%= root_path %>recurring-jobs/<%= ERB::Util.url_encode(job.name) %>/enqueue" method="
|
38
|
+
<div class="row">
|
39
|
+
<div class="column-3">
|
40
|
+
<form class="inline" action="<%= root_path %>recurring-jobs/<%= ERB::Util.url_encode(job.name) %>/enqueue" method="POST">
|
45
41
|
<%= csrf_tag %>
|
46
42
|
<input type="submit" class="btn btn-warn btn-xs" value="<%= t('enqueue_now') %>" />
|
47
43
|
</form>
|
48
|
-
<form action="<%= root_path %>recurring-jobs/<%= ERB::Util.url_encode(job.name) %>/toggle" method="
|
44
|
+
<form class="inline" action="<%= root_path %>recurring-jobs/<%= ERB::Util.url_encode(job.name) %>/toggle" method="POST">
|
49
45
|
<%= csrf_tag %>
|
50
|
-
<input type="submit" class="btn <%= job.enabled? ? "btn-
|
46
|
+
<input type="submit" class="btn btn-xs <%= job.enabled? ? "btn-inverse" : "btn-warn"%>" value="<%= job.enabled? ? t('disable') : t('enable') %>" />
|
51
47
|
</form>
|
52
48
|
</div>
|
53
|
-
<div class="
|
54
|
-
<
|
49
|
+
<div class="column-3">
|
50
|
+
<div class="last-time"><%= t('last_time') %>: <%= job.last_time %></div>
|
55
51
|
</div>
|
56
|
-
<div class="
|
57
|
-
<
|
58
|
-
<%= t('next_time') %>: <%= job.next_time || t('no_next_time') %>
|
59
|
-
</span>
|
52
|
+
<div class="column-3">
|
53
|
+
<div class="next-time"><%= t('next_time') %>: <%= job.next_time || t('no_next_time') %></div>
|
60
54
|
</div>
|
55
|
+
|
61
56
|
</div>
|
62
|
-
|
57
|
+
<div class="description"><%= job['description'] %></div>
|
58
|
+
|
59
|
+
</section>
|
63
60
|
<% end %>
|
64
|
-
</
|
65
|
-
</
|
61
|
+
</section>
|
62
|
+
</section>
|
@@ -0,0 +1,61 @@
|
|
1
|
+
<%= style_tag "recurring_jobs/stylesheets-scheduler/recurring_jobs_73.css" %>
|
2
|
+
|
3
|
+
<div class="row">
|
4
|
+
<div class="col-sm-6">
|
5
|
+
<h3><%= t('recurring_jobs') %></h3>
|
6
|
+
</div>
|
7
|
+
<div class="col-sm-6 toggle-all-buttons">
|
8
|
+
<form action="<%= root_path %>recurring-jobs/toggle-all" method="post">
|
9
|
+
<%= csrf_tag %>
|
10
|
+
<button type="submit" class="btn btn-warn btn-xs" name="action" value="enable"><%= t('enable_all') %></button>
|
11
|
+
<button type="submit" class="btn btn-warn btn-xs" name="action" value="disable"><%= t('disable_all') %></button>
|
12
|
+
</form>
|
13
|
+
</div>
|
14
|
+
</div>
|
15
|
+
|
16
|
+
<div class="recurring-jobs">
|
17
|
+
<ul class="list-group">
|
18
|
+
<% @presented_jobs.each do |job| %>
|
19
|
+
<li class="list-group-item <%= !job.enabled? && "list-group-item-disabled" %>">
|
20
|
+
<div class="title">
|
21
|
+
<div class="row">
|
22
|
+
<div class="col-xs-6">
|
23
|
+
<span class="name"><%= job.name %></span>
|
24
|
+
</div>
|
25
|
+
<div class="col-xs-6 text-right">
|
26
|
+
<a href="<%= root_path %>queues/<%= job.queue %>"><%= job.queue %></a>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
</div>
|
30
|
+
<div class="description"><%= job['description'] %></div>
|
31
|
+
<div class="info">
|
32
|
+
<div class="row">
|
33
|
+
<div class="col-md-4 class"><%= job['class'] %></div>
|
34
|
+
<div class="col-md-4 interval text-left"><%= t('interval') %>: <%= job.interval %></div>
|
35
|
+
<div class="col-md-4 args"><%= t('arguments') %>: <%= job['args'] %></div>
|
36
|
+
</div>
|
37
|
+
</div>
|
38
|
+
<div class="status row">
|
39
|
+
<div class="col-md-4 actions">
|
40
|
+
<form action="<%= root_path %>recurring-jobs/<%= ERB::Util.url_encode(job.name) %>/enqueue" method="post" class="enqueue">
|
41
|
+
<%= csrf_tag %>
|
42
|
+
<input type="submit" class="btn btn-warn btn-xs" value="<%= t('enqueue_now') %>" />
|
43
|
+
</form>
|
44
|
+
<form action="<%= root_path %>recurring-jobs/<%= ERB::Util.url_encode(job.name) %>/toggle" method="post">
|
45
|
+
<%= csrf_tag %>
|
46
|
+
<input type="submit" class="btn <%= job.enabled? ? "btn-primary" : "btn-warn"%> btn-xs" value="<%= job.enabled? ? t('disable') : t('enable') %>" />
|
47
|
+
</form>
|
48
|
+
</div>
|
49
|
+
<div class="col-md-4">
|
50
|
+
<span class="last_time"><%= t('last_time') %>: <%= job.last_time %></span>
|
51
|
+
</div>
|
52
|
+
<div class="col-md-4">
|
53
|
+
<span class="next_time text-right" style="<%= 'text-decoration:line-through' unless job.enabled? %>">
|
54
|
+
<%= t('next_time') %>: <%= job.next_time || t('no_next_time') %>
|
55
|
+
</span>
|
56
|
+
</div>
|
57
|
+
</div>
|
58
|
+
</li>
|
59
|
+
<% end %>
|
60
|
+
</ul>
|
61
|
+
</div>
|
metadata
CHANGED
@@ -1,16 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-scheduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 6.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Morton Jonuschat
|
8
8
|
- Moove-it
|
9
9
|
- Marcelo Lauxen
|
10
|
-
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date:
|
12
|
+
date: 2025-04-08 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: sidekiq
|
@@ -18,20 +17,20 @@ dependencies:
|
|
18
17
|
requirements:
|
19
18
|
- - ">="
|
20
19
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
20
|
+
version: '7.3'
|
22
21
|
- - "<"
|
23
22
|
- !ruby/object:Gem::Version
|
24
|
-
version: '
|
23
|
+
version: '9'
|
25
24
|
type: :runtime
|
26
25
|
prerelease: false
|
27
26
|
version_requirements: !ruby/object:Gem::Requirement
|
28
27
|
requirements:
|
29
28
|
- - ">="
|
30
29
|
- !ruby/object:Gem::Version
|
31
|
-
version: '
|
30
|
+
version: '7.3'
|
32
31
|
- - "<"
|
33
32
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
33
|
+
version: '9'
|
35
34
|
- !ruby/object:Gem::Dependency
|
36
35
|
name: rufus-scheduler
|
37
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -46,26 +45,6 @@ dependencies:
|
|
46
45
|
- - "~>"
|
47
46
|
- !ruby/object:Gem::Version
|
48
47
|
version: '3.2'
|
49
|
-
- !ruby/object:Gem::Dependency
|
50
|
-
name: tilt
|
51
|
-
requirement: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - ">="
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 1.4.0
|
56
|
-
- - "<"
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
version: '3'
|
59
|
-
type: :runtime
|
60
|
-
prerelease: false
|
61
|
-
version_requirements: !ruby/object:Gem::Requirement
|
62
|
-
requirements:
|
63
|
-
- - ">="
|
64
|
-
- !ruby/object:Gem::Version
|
65
|
-
version: 1.4.0
|
66
|
-
- - "<"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3'
|
69
48
|
- !ruby/object:Gem::Dependency
|
70
49
|
name: rake
|
71
50
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,28 +149,14 @@ dependencies:
|
|
170
149
|
requirements:
|
171
150
|
- - ">="
|
172
151
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
152
|
+
version: '1.1'
|
174
153
|
type: :development
|
175
154
|
prerelease: false
|
176
155
|
version_requirements: !ruby/object:Gem::Requirement
|
177
156
|
requirements:
|
178
157
|
- - ">="
|
179
158
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
181
|
-
- !ruby/object:Gem::Dependency
|
182
|
-
name: rack
|
183
|
-
requirement: !ruby/object:Gem::Requirement
|
184
|
-
requirements:
|
185
|
-
- - "<"
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
version: '3'
|
188
|
-
type: :development
|
189
|
-
prerelease: false
|
190
|
-
version_requirements: !ruby/object:Gem::Requirement
|
191
|
-
requirements:
|
192
|
-
- - "<"
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version: '3'
|
159
|
+
version: '1.1'
|
195
160
|
description: Light weight job scheduling extension for Sidekiq that adds support for
|
196
161
|
queueing jobs in a recurring way.
|
197
162
|
email:
|
@@ -221,6 +186,7 @@ files:
|
|
221
186
|
- lib/sidekiq-scheduler/web.rb
|
222
187
|
- lib/sidekiq/scheduler.rb
|
223
188
|
- web/assets/recurring_jobs/stylesheets-scheduler/recurring_jobs.css
|
189
|
+
- web/assets/recurring_jobs/stylesheets-scheduler/recurring_jobs_73.css
|
224
190
|
- web/locales/cs.yml
|
225
191
|
- web/locales/de.yml
|
226
192
|
- web/locales/en.yml
|
@@ -236,11 +202,12 @@ files:
|
|
236
202
|
- web/locales/sv.yml
|
237
203
|
- web/locales/zh-cn.yml
|
238
204
|
- web/views/recurring_jobs.erb
|
205
|
+
- web/views/sidekiq73/recurring_jobs.erb
|
239
206
|
homepage: https://sidekiq-scheduler.github.io/sidekiq-scheduler/
|
240
207
|
licenses:
|
241
208
|
- MIT
|
242
|
-
metadata:
|
243
|
-
|
209
|
+
metadata:
|
210
|
+
rubygems_mfa_required: 'true'
|
244
211
|
rdoc_options: []
|
245
212
|
require_paths:
|
246
213
|
- lib
|
@@ -255,8 +222,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
255
222
|
- !ruby/object:Gem::Version
|
256
223
|
version: '0'
|
257
224
|
requirements: []
|
258
|
-
rubygems_version: 3.
|
259
|
-
signing_key:
|
225
|
+
rubygems_version: 3.6.2
|
260
226
|
specification_version: 4
|
261
227
|
summary: Light weight job scheduling extension for Sidekiq
|
262
228
|
test_files: []
|