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.
@@ -1,25 +1,46 @@
1
1
  module Sidekiq
2
2
  module Cron
3
3
  module WebExtension
4
- def self.registered(app)
5
- app.settings.locales << File.join(File.expand_path("..", __FILE__), "locales")
6
-
7
- app.helpers do
8
- # This method constructs the URL for the cron jobs page within the specified namespace.
9
- def namespace_redirect_path
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
- def redirect_to_previous_or_default
14
- redirect params['redirect'] || namespace_redirect_path
15
- end
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
- def render_erb(view)
18
- views_path = File.join(File.expand_path("..", __FILE__), "views")
19
- erb(File.read(File.join(views_path, "#{view}.erb")))
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 = route_params[:name]
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 = route_params[:namespace]
42
- @job = Sidekiq::Cron::Job.find(route_params[:name], @current_namespace)
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(route_params[:namespace]).each(&:enqueue!)
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(route_params[:name], route_params[:namespace])
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(route_params[:namespace]).each(&:destroy)
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(route_params[:name], route_params[:namespace])
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(route_params[:namespace]).each(&:enable!)
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(route_params[:name], route_params[:namespace])
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(route_params[:namespace]).each(&:disable!)
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(route_params[:name], route_params[:namespace])
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", "~> 2.2")
37
- s.add_development_dependency("rack-test", "~> 1.1")
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", "~> 2.1")
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.1.0
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: 2025-01-20 00:00:00.000000000 Z
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: '2.1'
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: '2.1'
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.4.10
232
+ rubygems_version: 3.5.16
231
233
  signing_key:
232
234
  specification_version: 4
233
235
  summary: Scheduler/Cron for Sidekiq jobs