sidekiq-cron 1.10.0 → 2.3.1

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +81 -3
  3. data/Gemfile +3 -0
  4. data/README.md +283 -38
  5. data/lib/sidekiq/cron/job.rb +277 -182
  6. data/lib/sidekiq/cron/launcher.rb +2 -5
  7. data/lib/sidekiq/cron/locales/de.yml +15 -6
  8. data/lib/sidekiq/cron/locales/en.yml +14 -14
  9. data/lib/sidekiq/cron/locales/es.yml +22 -0
  10. data/lib/sidekiq/cron/locales/id.yml +22 -0
  11. data/lib/sidekiq/cron/locales/it.yml +15 -16
  12. data/lib/sidekiq/cron/locales/ja.yml +14 -10
  13. data/lib/sidekiq/cron/locales/pt.yml +14 -14
  14. data/lib/sidekiq/cron/locales/ru.yml +15 -7
  15. data/lib/sidekiq/cron/locales/zh-CN.yml +14 -11
  16. data/lib/sidekiq/cron/namespace.rb +43 -0
  17. data/lib/sidekiq/cron/poller.rb +12 -13
  18. data/lib/sidekiq/cron/schedule_loader.rb +51 -16
  19. data/lib/sidekiq/cron/support.rb +4 -30
  20. data/lib/sidekiq/cron/version.rb +1 -1
  21. data/lib/sidekiq/cron/views/cron.erb +97 -92
  22. data/lib/sidekiq/cron/views/cron_show.erb +87 -82
  23. data/lib/sidekiq/cron/views/legacy/cron.erb +113 -0
  24. data/lib/sidekiq/cron/views/legacy/cron_show.erb +92 -0
  25. data/lib/sidekiq/cron/web.rb +21 -2
  26. data/lib/sidekiq/cron/web_extension.rb +99 -31
  27. data/lib/sidekiq/cron.rb +73 -5
  28. data/lib/sidekiq/options.rb +9 -7
  29. data/lib/sidekiq-cron.rb +6 -0
  30. data/sidekiq-cron.gemspec +7 -6
  31. metadata +40 -27
  32. data/test/integration/performance_test.rb +0 -46
  33. data/test/models/person.rb +0 -21
  34. data/test/test_helper.rb +0 -93
  35. data/test/unit/fixtures/schedule_array.yml +0 -13
  36. data/test/unit/fixtures/schedule_erb.yml +0 -6
  37. data/test/unit/fixtures/schedule_hash.yml +0 -12
  38. data/test/unit/fixtures/schedule_string.yml +0 -1
  39. data/test/unit/job_test.rb +0 -1386
  40. data/test/unit/launcher_test.rb +0 -33
  41. data/test/unit/poller_test.rb +0 -144
  42. data/test/unit/schedule_loader_test.rb +0 -58
  43. data/test/unit/web_extension_test.rb +0 -155
@@ -1,68 +1,136 @@
1
1
  module Sidekiq
2
2
  module Cron
3
3
  module WebExtension
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]
10
+ end
11
+ end
12
+
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
17
+
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
23
+ end
24
+ end
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
+
4
33
  def self.registered(app)
5
- app.settings.locales << File.join(File.expand_path("..", __FILE__), "locales")
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
6
39
 
7
- # Index page of cron jobs.
40
+ locales << File.join(File.expand_path("..", __FILE__), "locales")
41
+
42
+ app.helpers(Helpers)
43
+
44
+ # Index page.
8
45
  app.get '/cron' do
9
- view_path = File.join(File.expand_path("..", __FILE__), "views")
46
+ @current_namespace = 'default'
47
+ @cron_jobs = Sidekiq::Cron::Job.all(@current_namespace)
48
+
49
+ render_erb(:cron)
50
+ end
10
51
 
11
- @cron_jobs = Sidekiq::Cron::Job.all
52
+ # Detail page for a specific namespace.
53
+ app.get '/cron/namespaces/:name' do
54
+ @current_namespace = cron_route_params(:name)
55
+ @cron_jobs = Sidekiq::Cron::Job.all(@current_namespace)
12
56
 
13
- render(:erb, File.read(File.join(view_path, "cron.erb")))
57
+ render_erb(:cron)
14
58
  end
15
59
 
16
60
  # Display job detail + jid history.
17
- app.get '/cron/:name' do
18
- view_path = File.join(File.expand_path("..", __FILE__), "views")
61
+ app.get '/cron/namespaces/:namespace/jobs/:name' do
62
+ @current_namespace = cron_route_params(:namespace)
63
+ @job = Sidekiq::Cron::Job.find(cron_route_params(:name), @current_namespace)
19
64
 
20
- @job = Sidekiq::Cron::Job.find(route_params[:name])
21
65
  if @job
22
- render(:erb, File.read(File.join(view_path, "cron_show.erb")))
66
+ render_erb(:cron_show)
23
67
  else
24
- redirect "#{root_path}cron"
68
+ redirect namespace_redirect_path
25
69
  end
26
70
  end
27
71
 
72
+ # Enqueue all cron jobs.
73
+ app.post '/cron/namespaces/:namespace/all/enqueue' do
74
+ Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:enqueue!)
75
+
76
+ redirect_to_previous_or_default
77
+ end
78
+
28
79
  # Enqueue cron job.
29
- app.post '/cron/:name/enque' do
30
- if route_params[:name] === '__all__'
31
- Sidekiq::Cron::Job.all.each(&:enque!)
32
- elsif job = Sidekiq::Cron::Job.find(route_params[:name])
33
- job.enque!
80
+ app.post '/cron/namespaces/:namespace/jobs/:name/enqueue' do
81
+ if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
82
+ job.enqueue!
34
83
  end
35
- redirect params['redirect'] || "#{root_path}cron"
84
+
85
+ redirect_to_previous_or_default
86
+ end
87
+
88
+ # Delete all schedules.
89
+ app.post '/cron/namespaces/:namespace/all/delete' do
90
+ Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:destroy)
91
+
92
+ redirect_to_previous_or_default
36
93
  end
37
94
 
38
95
  # Delete schedule.
39
- app.post '/cron/:name/delete' do
40
- if route_params[:name] === '__all__'
41
- Sidekiq::Cron::Job.all.each(&:destroy)
42
- elsif job = Sidekiq::Cron::Job.find(route_params[:name])
96
+ app.post '/cron/namespaces/:namespace/jobs/:name/delete' do
97
+ if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
43
98
  job.destroy
44
99
  end
45
- redirect "#{root_path}cron"
100
+
101
+ redirect_to_previous_or_default
102
+ end
103
+
104
+ # Enable all jobs.
105
+ app.post '/cron/namespaces/:namespace/all/enable' do
106
+ Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:enable!)
107
+
108
+ redirect_to_previous_or_default
46
109
  end
47
110
 
48
111
  # Enable job.
49
- app.post '/cron/:name/enable' do
50
- if route_params[:name] === '__all__'
51
- Sidekiq::Cron::Job.all.each(&:enable!)
52
- elsif job = Sidekiq::Cron::Job.find(route_params[:name])
112
+ app.post '/cron/namespaces/:namespace/jobs/:name/enable' do
113
+ if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
53
114
  job.enable!
54
115
  end
55
- redirect params['redirect'] || "#{root_path}cron"
116
+
117
+ redirect_to_previous_or_default
118
+ end
119
+
120
+ # Disable all jobs.
121
+ app.post '/cron/namespaces/:namespace/all/disable' do
122
+ Sidekiq::Cron::Job.all(cron_route_params(:namespace)).each(&:disable!)
123
+
124
+ redirect_to_previous_or_default
56
125
  end
57
126
 
58
127
  # Disable job.
59
- app.post '/cron/:name/disable' do
60
- if route_params[:name] === '__all__'
61
- Sidekiq::Cron::Job.all.each(&:disable!)
62
- elsif job = Sidekiq::Cron::Job.find(route_params[:name])
128
+ app.post '/cron/namespaces/:namespace/jobs/:name/disable' do
129
+ if job = Sidekiq::Cron::Job.find(cron_route_params(:name), cron_route_params(:namespace))
63
130
  job.disable!
64
131
  end
65
- redirect params['redirect'] || "#{root_path}cron"
132
+
133
+ redirect_to_previous_or_default
66
134
  end
67
135
  end
68
136
  end
data/lib/sidekiq/cron.rb CHANGED
@@ -1,9 +1,77 @@
1
- require "sidekiq/cron/job"
2
- require "sidekiq/cron/poller"
3
- require "sidekiq/cron/launcher"
4
- require "sidekiq/cron/schedule_loader"
5
-
6
1
  module Sidekiq
7
2
  module Cron
3
+ class << self
4
+ attr_accessor :configuration
5
+ end
6
+
7
+ def self.configure
8
+ self.configuration ||= Configuration.new
9
+ yield(configuration) if block_given?
10
+ end
11
+
12
+ def self.reset!
13
+ self.configuration = Configuration.new
14
+ end
15
+
16
+ class Configuration
17
+ # The interval, in seconds, at which to poll for scheduled cron jobs.
18
+ # This determines how frequently the scheduler checks for jobs to enqueue.
19
+ attr_accessor :cron_poll_interval
20
+
21
+ # The path to a YAML file containing multiple cron job schedules.
22
+ attr_accessor :cron_schedule_file
23
+
24
+ # The maximum number of recent cron job execution histories to retain.
25
+ # This value controls how many past job executions are stored.
26
+ attr_accessor :cron_history_size
27
+
28
+ # The default namespace is used when no namespace is specified.
29
+ attr_accessor :default_namespace
30
+
31
+ # List of available namespaces
32
+ #
33
+ # If not set, Sidekiq Cron will dynamically fetch available namespaces
34
+ # by retrieving existing jobs from Redis.
35
+ #
36
+ # This dynamic fetching can negatively impact performance in certain cases.
37
+ # To mitigate this, you can provide the list of namespaces explicitly.
38
+ # If a job specifies a namespace that is not included in the provided list,
39
+ # a warning will be logged, and the job will be assigned to the default namespace.
40
+ attr_accessor :available_namespaces
41
+
42
+ # The parsing mode when using the natural language cron syntax from the `fugit` gem.
43
+ #
44
+ # :single -- use the first parsed cron line and ignore the rest (default)
45
+ # :strict -- raise an error if multiple cron lines are parsed from one string
46
+ attr_reader :natural_cron_parsing_mode
47
+
48
+ # The poller will not enqueue jobs that are late by more than this amount of seconds.
49
+ # Defaults to 60 seconds.
50
+ #
51
+ # This is useful when Sidekiq (and Sidekiq-Cron) is not used in zero downtime deployments and
52
+ # when the deployment is done and Sidekiq-Cron starts to catch up, it will consider older
53
+ # jobs that missed their schedules during the deployment. E.g., jobs that run once a day.
54
+ attr_accessor :reschedule_grace_period
55
+
56
+ def initialize
57
+ @cron_poll_interval = 30
58
+ @cron_schedule_file = 'config/schedule.yml'
59
+ @cron_history_size = 10
60
+ @default_namespace = 'default'
61
+ @available_namespaces = [@default_namespace]
62
+ @natural_cron_parsing_mode = :single
63
+ @reschedule_grace_period = 60
64
+ end
65
+
66
+ def natural_cron_parsing_mode=(mode)
67
+ unless %i[single strict].include?(mode)
68
+ raise ArgumentError, "Unknown natural cron parsing mode: #{mode.inspect}"
69
+ end
70
+
71
+ @natural_cron_parsing_mode = mode
72
+ end
73
+ end
8
74
  end
9
75
  end
76
+
77
+ Sidekiq::Cron.configure
@@ -1,24 +1,26 @@
1
- require 'sidekiq'
2
-
1
+ # Module to access Sidekiq config
3
2
  module Sidekiq
4
3
  module Options
5
4
  def self.[](key)
6
- options_field ? Sidekiq.public_send(options_field)[key] : Sidekiq[key]
5
+ self.config[key]
7
6
  end
8
7
 
9
8
  def self.[]=(key, value)
10
- options_field ? Sidekiq.public_send(options_field)[key] = value : Sidekiq[key] = value
9
+ self.config[key] = value
10
+ end
11
+
12
+ def self.config
13
+ options_field ? Sidekiq.public_send(options_field) : Sidekiq
11
14
  end
12
15
 
13
16
  def self.options_field
14
17
  return @options_field unless @options_field.nil?
18
+
15
19
  sidekiq_version = Gem::Version.new(Sidekiq::VERSION)
16
20
  @options_field = if sidekiq_version >= Gem::Version.new('7.0')
17
21
  :default_configuration
18
- elsif sidekiq_version >= Gem::Version.new('6.5')
19
- false
20
22
  else
21
- :options
23
+ false
22
24
  end
23
25
  end
24
26
  end
data/lib/sidekiq-cron.rb CHANGED
@@ -1,2 +1,8 @@
1
1
  require "sidekiq"
2
2
  require "sidekiq/cron"
3
+ require "sidekiq/options"
4
+ require "sidekiq/cron/job"
5
+ require "sidekiq/cron/namespace"
6
+ require "sidekiq/cron/poller"
7
+ require "sidekiq/cron/launcher"
8
+ require "sidekiq/cron/schedule_loader"
data/sidekiq-cron.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  "LICENSE.txt",
16
16
  "README.md"
17
17
  ]
18
- s.files = Dir.glob('lib/**/*') + Dir.glob('test/**/*') + [
18
+ s.files = Dir.glob('lib/**/*') + [
19
19
  "CHANGELOG.md",
20
20
  "Gemfile",
21
21
  "LICENSE.txt",
@@ -26,14 +26,15 @@ Gem::Specification.new do |s|
26
26
 
27
27
  s.required_ruby_version = ">= 2.7"
28
28
 
29
- s.add_dependency("fugit", "~> 1.8")
30
- s.add_dependency("sidekiq", ">= 6")
29
+ s.add_dependency("cronex", ">= 0.13.0")
30
+ s.add_dependency("fugit", "~> 1.8", ">= 1.11.1")
31
31
  s.add_dependency("globalid", ">= 1.0.1")
32
+ s.add_dependency("sidekiq", ">= 6.5.0")
32
33
 
33
34
  s.add_development_dependency("minitest", "~> 5.15")
34
- s.add_development_dependency("mocha", "~> 1.14")
35
- s.add_development_dependency("rack", "~> 2.2")
36
- s.add_development_dependency("rack-test", "~> 1.1")
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")
37
38
  s.add_development_dependency("rake", "~> 13.0")
38
39
  s.add_development_dependency("simplecov", "~> 0.21")
39
40
  s.add_development_dependency("simplecov-cobertura", "~> 2.1")
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-cron
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.0
4
+ version: 2.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ondrej Bartas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-03-13 00:00:00.000000000 Z
11
+ date: 2025-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: cronex
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.13.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.13.0
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: fugit
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -17,6 +31,9 @@ dependencies:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
33
  version: '1.8'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 1.11.1
20
37
  type: :runtime
21
38
  prerelease: false
22
39
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,34 +41,37 @@ dependencies:
24
41
  - - "~>"
25
42
  - !ruby/object:Gem::Version
26
43
  version: '1.8'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 1.11.1
27
47
  - !ruby/object:Gem::Dependency
28
- name: sidekiq
48
+ name: globalid
29
49
  requirement: !ruby/object:Gem::Requirement
30
50
  requirements:
31
51
  - - ">="
32
52
  - !ruby/object:Gem::Version
33
- version: '6'
53
+ version: 1.0.1
34
54
  type: :runtime
35
55
  prerelease: false
36
56
  version_requirements: !ruby/object:Gem::Requirement
37
57
  requirements:
38
58
  - - ">="
39
59
  - !ruby/object:Gem::Version
40
- version: '6'
60
+ version: 1.0.1
41
61
  - !ruby/object:Gem::Dependency
42
- name: globalid
62
+ name: sidekiq
43
63
  requirement: !ruby/object:Gem::Requirement
44
64
  requirements:
45
65
  - - ">="
46
66
  - !ruby/object:Gem::Version
47
- version: 1.0.1
67
+ version: 6.5.0
48
68
  type: :runtime
49
69
  prerelease: false
50
70
  version_requirements: !ruby/object:Gem::Requirement
51
71
  requirements:
52
72
  - - ">="
53
73
  - !ruby/object:Gem::Version
54
- version: 1.0.1
74
+ version: 6.5.0
55
75
  - !ruby/object:Gem::Dependency
56
76
  name: minitest
57
77
  requirement: !ruby/object:Gem::Requirement
@@ -72,40 +92,40 @@ dependencies:
72
92
  requirements:
73
93
  - - "~>"
74
94
  - !ruby/object:Gem::Version
75
- version: '1.14'
95
+ version: '2.1'
76
96
  type: :development
77
97
  prerelease: false
78
98
  version_requirements: !ruby/object:Gem::Requirement
79
99
  requirements:
80
100
  - - "~>"
81
101
  - !ruby/object:Gem::Version
82
- version: '1.14'
102
+ version: '2.1'
83
103
  - !ruby/object:Gem::Dependency
84
104
  name: rack
85
105
  requirement: !ruby/object:Gem::Requirement
86
106
  requirements:
87
- - - "~>"
107
+ - - ">="
88
108
  - !ruby/object:Gem::Version
89
109
  version: '2.2'
90
110
  type: :development
91
111
  prerelease: false
92
112
  version_requirements: !ruby/object:Gem::Requirement
93
113
  requirements:
94
- - - "~>"
114
+ - - ">="
95
115
  - !ruby/object:Gem::Version
96
116
  version: '2.2'
97
117
  - !ruby/object:Gem::Dependency
98
118
  name: rack-test
99
119
  requirement: !ruby/object:Gem::Requirement
100
120
  requirements:
101
- - - "~>"
121
+ - - ">="
102
122
  - !ruby/object:Gem::Version
103
123
  version: '1.1'
104
124
  type: :development
105
125
  prerelease: false
106
126
  version_requirements: !ruby/object:Gem::Requirement
107
127
  requirements:
108
- - - "~>"
128
+ - - ">="
109
129
  - !ruby/object:Gem::Version
110
130
  version: '1.1'
111
131
  - !ruby/object:Gem::Dependency
@@ -170,33 +190,26 @@ files:
170
190
  - lib/sidekiq/cron/launcher.rb
171
191
  - lib/sidekiq/cron/locales/de.yml
172
192
  - lib/sidekiq/cron/locales/en.yml
193
+ - lib/sidekiq/cron/locales/es.yml
194
+ - lib/sidekiq/cron/locales/id.yml
173
195
  - lib/sidekiq/cron/locales/it.yml
174
196
  - lib/sidekiq/cron/locales/ja.yml
175
197
  - lib/sidekiq/cron/locales/pt.yml
176
198
  - lib/sidekiq/cron/locales/ru.yml
177
199
  - lib/sidekiq/cron/locales/zh-CN.yml
200
+ - lib/sidekiq/cron/namespace.rb
178
201
  - lib/sidekiq/cron/poller.rb
179
202
  - lib/sidekiq/cron/schedule_loader.rb
180
203
  - lib/sidekiq/cron/support.rb
181
204
  - lib/sidekiq/cron/version.rb
182
205
  - lib/sidekiq/cron/views/cron.erb
183
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
184
209
  - lib/sidekiq/cron/web.rb
185
210
  - lib/sidekiq/cron/web_extension.rb
186
211
  - lib/sidekiq/options.rb
187
212
  - sidekiq-cron.gemspec
188
- - test/integration/performance_test.rb
189
- - test/models/person.rb
190
- - test/test_helper.rb
191
- - test/unit/fixtures/schedule_array.yml
192
- - test/unit/fixtures/schedule_erb.yml
193
- - test/unit/fixtures/schedule_hash.yml
194
- - test/unit/fixtures/schedule_string.yml
195
- - test/unit/job_test.rb
196
- - test/unit/launcher_test.rb
197
- - test/unit/poller_test.rb
198
- - test/unit/schedule_loader_test.rb
199
- - test/unit/web_extension_test.rb
200
213
  homepage: https://github.com/sidekiq-cron/sidekiq-cron
201
214
  licenses:
202
215
  - MIT
@@ -216,7 +229,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
216
229
  - !ruby/object:Gem::Version
217
230
  version: '0'
218
231
  requirements: []
219
- rubygems_version: 3.4.6
232
+ rubygems_version: 3.4.10
220
233
  signing_key:
221
234
  specification_version: 4
222
235
  summary: Scheduler/Cron for Sidekiq jobs
@@ -1,46 +0,0 @@
1
- require './test/test_helper'
2
- require 'benchmark'
3
-
4
- describe 'Performance Poller' do
5
- JOBS_NUMBER = 10_000
6
- MAX_SECONDS = 60
7
-
8
- before do
9
- # Clear all previous saved data from Redis.
10
- Sidekiq.redis do |conn|
11
- conn.flushdb
12
- end
13
-
14
- args = {
15
- queue: "default",
16
- cron: "*/2 * * * *",
17
- klass: "CronTestClass"
18
- }
19
-
20
- JOBS_NUMBER.times do |i|
21
- Sidekiq::Cron::Job.create(args.merge(name: "Test#{i}"))
22
- end
23
-
24
- @poller = Sidekiq::Cron::Poller.new(Sidekiq.const_defined?(:Config) ? Sidekiq::Config.new : {})
25
- now = Time.now.utc + 3600
26
- enqueued_time = Time.new(now.year, now.month, now.day, now.hour, 10, 5)
27
- Time.stubs(:now).returns(enqueued_time)
28
- end
29
-
30
- it "should enqueue #{JOBS_NUMBER} jobs in less than #{MAX_SECONDS}s" do
31
- Sidekiq.redis do |conn|
32
- assert_equal 0, conn.llen("queue:default"), 'Queue should be empty'
33
- end
34
-
35
- bench = Benchmark.measure {
36
- @poller.enqueue
37
- }
38
-
39
- Sidekiq.redis do |conn|
40
- assert_equal JOBS_NUMBER, conn.llen("queue:default"), 'Queue should be full'
41
- end
42
-
43
- puts "Performance test finished in #{bench.real}"
44
- assert_operator bench.real, :<, MAX_SECONDS
45
- end
46
- end
@@ -1,21 +0,0 @@
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 DELETED
@@ -1,93 +0,0 @@
1
- $TESTING = true
2
- ENV['RACK_ENV'] = 'test'
3
-
4
- require 'simplecov'
5
-
6
- if ENV['CI']
7
- require 'simplecov-cobertura'
8
- SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
9
- end
10
-
11
- SimpleCov.start do
12
- add_filter "test/"
13
- add_group 'Sidekiq-Cron', 'lib/'
14
- end
15
-
16
- require "minitest/autorun"
17
- require "rack/test"
18
- require 'mocha/minitest'
19
- require 'sidekiq'
20
- require 'sidekiq/web'
21
- require "sidekiq/cli"
22
- require 'sidekiq-cron'
23
- require 'sidekiq/cron/web'
24
-
25
- Sidekiq.logger.level = Logger::ERROR
26
- Sidekiq.configure_client do |config|
27
- config.redis = { url: ENV['REDIS_URL'] || 'redis://0.0.0.0:6379' }
28
- end
29
-
30
- # For testing symbolize args
31
- class Hash
32
- def symbolize_keys
33
- transform_keys { |key| key.to_sym rescue key }
34
- end
35
- end
36
-
37
- class CronTestClass
38
- include Sidekiq::Worker
39
- sidekiq_options retry: true
40
-
41
- def perform args = {}
42
- puts "super croned job #{args}"
43
- end
44
- end
45
-
46
- class CronTestClassWithQueue
47
- include Sidekiq::Worker
48
- sidekiq_options queue: :super, retry: false, backtrace: true
49
-
50
- def perform args = {}
51
- puts "super croned job #{args}"
52
- end
53
- end
54
-
55
- module ActiveJob
56
- class Base
57
- attr_accessor *%i[job_class provider_job_id queue_name arguments]
58
-
59
- def initialize
60
- yield self if block_given?
61
- self.provider_job_id ||= SecureRandom.hex(12)
62
- end
63
-
64
- def self.queue_name_prefix
65
- @queue_name_prefix
66
- end
67
-
68
- def self.queue_name_prefix=(queue_name_prefix)
69
- @queue_name_prefix = queue_name_prefix
70
- end
71
-
72
- def self.set(options)
73
- @queue = options['queue']
74
-
75
- self
76
- end
77
-
78
- def try(method, *args, &block)
79
- send method, *args, &block if respond_to? method
80
- end
81
-
82
- def self.perform_later(*args)
83
- new do |instance|
84
- instance.job_class = self.class.name
85
- instance.queue_name = @queue
86
- instance.arguments = [*args]
87
- end
88
- end
89
- end
90
- end
91
-
92
- class ActiveJobCronTestClass < ActiveJob::Base
93
- end
@@ -1,13 +0,0 @@
1
- ---
2
- -
3
- name: "my_first_job"
4
- cron: "*/5 * * * *"
5
- class: "HardWorker"
6
- queue: "hard_worker"
7
- -
8
- name: "second_job"
9
- cron: "*/30 * * * *"
10
- class: "HardWorker"
11
- queue: "hard_worker_long"
12
- args:
13
- hard: "stuff"
@@ -1,6 +0,0 @@
1
- ---
2
- default: &default
3
- cron: <%= "every day at 5 pm" %>
4
- class: <%= "DailyJob" %>
5
-
6
- daily_job: *default