sidekiq-cron 2.1.0 → 2.4.0
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 +27 -0
- data/Gemfile +2 -2
- data/README.md +72 -6
- data/lib/sidekiq/cron/job.rb +15 -19
- data/lib/sidekiq/cron/launcher.rb +1 -0
- data/lib/sidekiq/cron/locales/es.yml +2 -2
- data/lib/sidekiq/cron/namespace.rb +16 -21
- data/lib/sidekiq/cron/poller.rb +4 -0
- data/lib/sidekiq/cron/schedule_loader.rb +58 -12
- data/lib/sidekiq/cron/support.rb +4 -29
- data/lib/sidekiq/cron/version.rb +1 -1
- data/lib/sidekiq/cron/views/cron.erb +98 -107
- data/lib/sidekiq/cron/views/cron_show.erb +85 -84
- data/lib/sidekiq/cron/views/legacy/cron.erb +114 -0
- data/lib/sidekiq/cron/views/legacy/cron_show.erb +92 -0
- data/lib/sidekiq/cron/web.rb +10 -1
- data/lib/sidekiq/cron/web_extension.rb +45 -24
- data/lib/sidekiq/cron.rb +34 -12
- data/sidekiq-cron.gemspec +3 -3
- metadata +11 -9
|
@@ -1,25 +1,46 @@
|
|
|
1
1
|
module Sidekiq
|
|
2
2
|
module Cron
|
|
3
3
|
module WebExtension
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"#{root_path}cron/namespaces/#{route_params[:namespace]}"
|
|
4
|
+
module Helpers
|
|
5
|
+
def cron_route_params(key)
|
|
6
|
+
if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0")
|
|
7
|
+
route_params(key)
|
|
8
|
+
else
|
|
9
|
+
route_params[key]
|
|
11
10
|
end
|
|
11
|
+
end
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
# This method constructs the URL for the cron jobs page within the specified namespace.
|
|
14
|
+
def namespace_redirect_path
|
|
15
|
+
"#{root_path}cron/namespaces/#{cron_route_params(:namespace)}"
|
|
16
|
+
end
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
def redirect_to_previous_or_default
|
|
19
|
+
if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0")
|
|
20
|
+
redirect url_params('redirect') || namespace_redirect_path
|
|
21
|
+
else
|
|
22
|
+
redirect params["redirect"] || namespace_redirect_path
|
|
20
23
|
end
|
|
21
24
|
end
|
|
22
25
|
|
|
26
|
+
def render_erb(view)
|
|
27
|
+
path = Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0") ? "views" : "views/legacy"
|
|
28
|
+
views_path = File.join(File.expand_path("..", __FILE__), path)
|
|
29
|
+
erb(File.read(File.join(views_path, "#{view}.erb")))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.registered(app)
|
|
34
|
+
locales = if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("8.0.0")
|
|
35
|
+
Sidekiq::Web.configure.locales
|
|
36
|
+
else
|
|
37
|
+
app.settings.locales
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
locales << File.join(File.expand_path("..", __FILE__), "locales")
|
|
41
|
+
|
|
42
|
+
app.helpers(Helpers)
|
|
43
|
+
|
|
23
44
|
# Index page.
|
|
24
45
|
app.get '/cron' do
|
|
25
46
|
@current_namespace = 'default'
|
|
@@ -30,7 +51,7 @@ module Sidekiq
|
|
|
30
51
|
|
|
31
52
|
# Detail page for a specific namespace.
|
|
32
53
|
app.get '/cron/namespaces/:name' do
|
|
33
|
-
@current_namespace =
|
|
54
|
+
@current_namespace = cron_route_params(:name)
|
|
34
55
|
@cron_jobs = Sidekiq::Cron::Job.all(@current_namespace)
|
|
35
56
|
|
|
36
57
|
render_erb(:cron)
|
|
@@ -38,8 +59,8 @@ module Sidekiq
|
|
|
38
59
|
|
|
39
60
|
# Display job detail + jid history.
|
|
40
61
|
app.get '/cron/namespaces/:namespace/jobs/:name' do
|
|
41
|
-
@current_namespace =
|
|
42
|
-
@job = Sidekiq::Cron::Job.find(
|
|
62
|
+
@current_namespace = cron_route_params(:namespace)
|
|
63
|
+
@job = Sidekiq::Cron::Job.find(cron_route_params(:name), @current_namespace)
|
|
43
64
|
|
|
44
65
|
if @job
|
|
45
66
|
render_erb(:cron_show)
|
|
@@ -50,14 +71,14 @@ module Sidekiq
|
|
|
50
71
|
|
|
51
72
|
# Enqueue all cron jobs.
|
|
52
73
|
app.post '/cron/namespaces/:namespace/all/enqueue' do
|
|
53
|
-
Sidekiq::Cron::Job.all(
|
|
74
|
+
Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:enqueue!)
|
|
54
75
|
|
|
55
76
|
redirect_to_previous_or_default
|
|
56
77
|
end
|
|
57
78
|
|
|
58
79
|
# Enqueue cron job.
|
|
59
80
|
app.post '/cron/namespaces/:namespace/jobs/:name/enqueue' do
|
|
60
|
-
if job = Sidekiq::Cron::Job.find(
|
|
81
|
+
if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
|
|
61
82
|
job.enqueue!
|
|
62
83
|
end
|
|
63
84
|
|
|
@@ -66,14 +87,14 @@ module Sidekiq
|
|
|
66
87
|
|
|
67
88
|
# Delete all schedules.
|
|
68
89
|
app.post '/cron/namespaces/:namespace/all/delete' do
|
|
69
|
-
Sidekiq::Cron::Job.all(
|
|
90
|
+
Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:destroy)
|
|
70
91
|
|
|
71
92
|
redirect_to_previous_or_default
|
|
72
93
|
end
|
|
73
94
|
|
|
74
95
|
# Delete schedule.
|
|
75
96
|
app.post '/cron/namespaces/:namespace/jobs/:name/delete' do
|
|
76
|
-
if job = Sidekiq::Cron::Job.find(
|
|
97
|
+
if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
|
|
77
98
|
job.destroy
|
|
78
99
|
end
|
|
79
100
|
|
|
@@ -82,14 +103,14 @@ module Sidekiq
|
|
|
82
103
|
|
|
83
104
|
# Enable all jobs.
|
|
84
105
|
app.post '/cron/namespaces/:namespace/all/enable' do
|
|
85
|
-
Sidekiq::Cron::Job.all(
|
|
106
|
+
Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:enable!)
|
|
86
107
|
|
|
87
108
|
redirect_to_previous_or_default
|
|
88
109
|
end
|
|
89
110
|
|
|
90
111
|
# Enable job.
|
|
91
112
|
app.post '/cron/namespaces/:namespace/jobs/:name/enable' do
|
|
92
|
-
if job = Sidekiq::Cron::Job.find(
|
|
113
|
+
if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
|
|
93
114
|
job.enable!
|
|
94
115
|
end
|
|
95
116
|
|
|
@@ -98,14 +119,14 @@ module Sidekiq
|
|
|
98
119
|
|
|
99
120
|
# Disable all jobs.
|
|
100
121
|
app.post '/cron/namespaces/:namespace/all/disable' do
|
|
101
|
-
Sidekiq::Cron::Job.all(
|
|
122
|
+
Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:disable!)
|
|
102
123
|
|
|
103
124
|
redirect_to_previous_or_default
|
|
104
125
|
end
|
|
105
126
|
|
|
106
127
|
# Disable job.
|
|
107
128
|
app.post '/cron/namespaces/:namespace/jobs/:name/disable' do
|
|
108
|
-
if job = Sidekiq::Cron::Job.find(
|
|
129
|
+
if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
|
|
109
130
|
job.disable!
|
|
110
131
|
end
|
|
111
132
|
|
data/lib/sidekiq/cron.rb
CHANGED
|
@@ -14,6 +14,10 @@ module Sidekiq
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
class Configuration
|
|
17
|
+
# Whether Sidekiq-Cron is enabled. When set to false, the schedule file will not be loaded
|
|
18
|
+
# on startup. Defaults to true.
|
|
19
|
+
attr_accessor :enabled
|
|
20
|
+
|
|
17
21
|
# The interval, in seconds, at which to poll for scheduled cron jobs.
|
|
18
22
|
# This determines how frequently the scheduler checks for jobs to enqueue.
|
|
19
23
|
attr_accessor :cron_poll_interval
|
|
@@ -25,9 +29,29 @@ module Sidekiq
|
|
|
25
29
|
# This value controls how many past job executions are stored.
|
|
26
30
|
attr_accessor :cron_history_size
|
|
27
31
|
|
|
32
|
+
# The number of polling processes for Sidekiq Cron.
|
|
33
|
+
#
|
|
34
|
+
# It is configurable to handle the case where only a subset of Sidekiq process
|
|
35
|
+
# are used for Sidekiq Cron polling where the default would be to poll from all processes.
|
|
36
|
+
#
|
|
37
|
+
# @note The process count is used internally to determine the random poll interval.
|
|
38
|
+
# @see https://github.com/sidekiq/sidekiq/blob/e03b317f2070655c51fad838b0ecfb99c6d6f853/lib/sidekiq/scheduled.rb#L129-L160
|
|
39
|
+
attr_reader :cron_poll_process_count
|
|
40
|
+
|
|
28
41
|
# The default namespace is used when no namespace is specified.
|
|
29
42
|
attr_accessor :default_namespace
|
|
30
43
|
|
|
44
|
+
# List of available namespaces
|
|
45
|
+
#
|
|
46
|
+
# If not set, Sidekiq Cron will dynamically fetch available namespaces
|
|
47
|
+
# by retrieving existing jobs from Redis.
|
|
48
|
+
#
|
|
49
|
+
# This dynamic fetching can negatively impact performance in certain cases.
|
|
50
|
+
# To mitigate this, you can provide the list of namespaces explicitly.
|
|
51
|
+
# If a job specifies a namespace that is not included in the provided list,
|
|
52
|
+
# a warning will be logged, and the job will be assigned to the default namespace.
|
|
53
|
+
attr_accessor :available_namespaces
|
|
54
|
+
|
|
31
55
|
# The parsing mode when using the natural language cron syntax from the `fugit` gem.
|
|
32
56
|
#
|
|
33
57
|
# :single -- use the first parsed cron line and ignore the rest (default)
|
|
@@ -42,25 +66,15 @@ module Sidekiq
|
|
|
42
66
|
# jobs that missed their schedules during the deployment. E.g., jobs that run once a day.
|
|
43
67
|
attr_accessor :reschedule_grace_period
|
|
44
68
|
|
|
45
|
-
# List of available namespaces
|
|
46
|
-
#
|
|
47
|
-
# If not set, Sidekiq Cron will dynamically fetch available namespaces
|
|
48
|
-
# by retrieving existing jobs from Redis.
|
|
49
|
-
#
|
|
50
|
-
# This dynamic fetching can negatively impact performance in certain cases.
|
|
51
|
-
# To mitigate this, you can provide the list of namespaces explicitly.
|
|
52
|
-
# If a job specifies a namespace that is not included in the provided list,
|
|
53
|
-
# a warning will be logged, and the job will be assigned to the default namespace.
|
|
54
|
-
attr_accessor :available_namespaces
|
|
55
|
-
|
|
56
69
|
def initialize
|
|
70
|
+
@enabled = true
|
|
57
71
|
@cron_poll_interval = 30
|
|
58
72
|
@cron_schedule_file = 'config/schedule.yml'
|
|
59
73
|
@cron_history_size = 10
|
|
60
74
|
@default_namespace = 'default'
|
|
75
|
+
@available_namespaces = [@default_namespace]
|
|
61
76
|
@natural_cron_parsing_mode = :single
|
|
62
77
|
@reschedule_grace_period = 60
|
|
63
|
-
@available_namespaces = nil
|
|
64
78
|
end
|
|
65
79
|
|
|
66
80
|
def natural_cron_parsing_mode=(mode)
|
|
@@ -70,6 +84,14 @@ module Sidekiq
|
|
|
70
84
|
|
|
71
85
|
@natural_cron_parsing_mode = mode
|
|
72
86
|
end
|
|
87
|
+
|
|
88
|
+
def cron_poll_process_count=(count)
|
|
89
|
+
unless count.is_a?(Integer) && count.positive?
|
|
90
|
+
raise ArgumentError, "invalid cron process count: #{count.inspect}"
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
@cron_poll_process_count = count
|
|
94
|
+
end
|
|
73
95
|
end
|
|
74
96
|
end
|
|
75
97
|
end
|
data/sidekiq-cron.gemspec
CHANGED
|
@@ -33,9 +33,9 @@ Gem::Specification.new do |s|
|
|
|
33
33
|
|
|
34
34
|
s.add_development_dependency("minitest", "~> 5.15")
|
|
35
35
|
s.add_development_dependency("mocha", "~> 2.1")
|
|
36
|
-
s.add_development_dependency("rack", "
|
|
37
|
-
s.add_development_dependency("rack-test", "
|
|
36
|
+
s.add_development_dependency("rack", ">= 2.2")
|
|
37
|
+
s.add_development_dependency("rack-test", ">= 1.1")
|
|
38
38
|
s.add_development_dependency("rake", "~> 13.0")
|
|
39
39
|
s.add_development_dependency("simplecov", "~> 0.21")
|
|
40
|
-
s.add_development_dependency("simplecov-cobertura", "~>
|
|
40
|
+
s.add_development_dependency("simplecov-cobertura", "~> 3.1")
|
|
41
41
|
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: 2.
|
|
4
|
+
version: 2.4.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: 2026-05-06 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cronex
|
|
@@ -104,28 +104,28 @@ dependencies:
|
|
|
104
104
|
name: rack
|
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
|
106
106
|
requirements:
|
|
107
|
-
- - "
|
|
107
|
+
- - ">="
|
|
108
108
|
- !ruby/object:Gem::Version
|
|
109
109
|
version: '2.2'
|
|
110
110
|
type: :development
|
|
111
111
|
prerelease: false
|
|
112
112
|
version_requirements: !ruby/object:Gem::Requirement
|
|
113
113
|
requirements:
|
|
114
|
-
- - "
|
|
114
|
+
- - ">="
|
|
115
115
|
- !ruby/object:Gem::Version
|
|
116
116
|
version: '2.2'
|
|
117
117
|
- !ruby/object:Gem::Dependency
|
|
118
118
|
name: rack-test
|
|
119
119
|
requirement: !ruby/object:Gem::Requirement
|
|
120
120
|
requirements:
|
|
121
|
-
- - "
|
|
121
|
+
- - ">="
|
|
122
122
|
- !ruby/object:Gem::Version
|
|
123
123
|
version: '1.1'
|
|
124
124
|
type: :development
|
|
125
125
|
prerelease: false
|
|
126
126
|
version_requirements: !ruby/object:Gem::Requirement
|
|
127
127
|
requirements:
|
|
128
|
-
- - "
|
|
128
|
+
- - ">="
|
|
129
129
|
- !ruby/object:Gem::Version
|
|
130
130
|
version: '1.1'
|
|
131
131
|
- !ruby/object:Gem::Dependency
|
|
@@ -162,14 +162,14 @@ dependencies:
|
|
|
162
162
|
requirements:
|
|
163
163
|
- - "~>"
|
|
164
164
|
- !ruby/object:Gem::Version
|
|
165
|
-
version: '
|
|
165
|
+
version: '3.1'
|
|
166
166
|
type: :development
|
|
167
167
|
prerelease: false
|
|
168
168
|
version_requirements: !ruby/object:Gem::Requirement
|
|
169
169
|
requirements:
|
|
170
170
|
- - "~>"
|
|
171
171
|
- !ruby/object:Gem::Version
|
|
172
|
-
version: '
|
|
172
|
+
version: '3.1'
|
|
173
173
|
description: Enables to set jobs to be run in specified time (using CRON notation
|
|
174
174
|
or natural language)
|
|
175
175
|
email: ondrej@bartas.cz
|
|
@@ -204,6 +204,8 @@ files:
|
|
|
204
204
|
- lib/sidekiq/cron/version.rb
|
|
205
205
|
- lib/sidekiq/cron/views/cron.erb
|
|
206
206
|
- lib/sidekiq/cron/views/cron_show.erb
|
|
207
|
+
- lib/sidekiq/cron/views/legacy/cron.erb
|
|
208
|
+
- lib/sidekiq/cron/views/legacy/cron_show.erb
|
|
207
209
|
- lib/sidekiq/cron/web.rb
|
|
208
210
|
- lib/sidekiq/cron/web_extension.rb
|
|
209
211
|
- lib/sidekiq/options.rb
|
|
@@ -227,7 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
227
229
|
- !ruby/object:Gem::Version
|
|
228
230
|
version: '0'
|
|
229
231
|
requirements: []
|
|
230
|
-
rubygems_version: 3.
|
|
232
|
+
rubygems_version: 3.5.16
|
|
231
233
|
signing_key:
|
|
232
234
|
specification_version: 4
|
|
233
235
|
summary: Scheduler/Cron for Sidekiq jobs
|