sidekiq-cron 1.10.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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +88 -3
  3. data/Gemfile +3 -0
  4. data/README.md +300 -38
  5. data/lib/sidekiq/cron/job.rb +277 -182
  6. data/lib/sidekiq/cron/launcher.rb +3 -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 +16 -13
  18. data/lib/sidekiq/cron/schedule_loader.rb +56 -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 +98 -92
  22. data/lib/sidekiq/cron/views/cron_show.erb +87 -82
  23. data/lib/sidekiq/cron/views/legacy/cron.erb +114 -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 +95 -5
  28. data/lib/sidekiq/options.rb +9 -7
  29. data/lib/sidekiq-cron.rb +6 -0
  30. data/sidekiq-cron.gemspec +8 -7
  31. metadata +42 -29
  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,99 @@
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
+ # 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
+
21
+ # The interval, in seconds, at which to poll for scheduled cron jobs.
22
+ # This determines how frequently the scheduler checks for jobs to enqueue.
23
+ attr_accessor :cron_poll_interval
24
+
25
+ # The path to a YAML file containing multiple cron job schedules.
26
+ attr_accessor :cron_schedule_file
27
+
28
+ # The maximum number of recent cron job execution histories to retain.
29
+ # This value controls how many past job executions are stored.
30
+ attr_accessor :cron_history_size
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
+
41
+ # The default namespace is used when no namespace is specified.
42
+ attr_accessor :default_namespace
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
+
55
+ # The parsing mode when using the natural language cron syntax from the `fugit` gem.
56
+ #
57
+ # :single -- use the first parsed cron line and ignore the rest (default)
58
+ # :strict -- raise an error if multiple cron lines are parsed from one string
59
+ attr_reader :natural_cron_parsing_mode
60
+
61
+ # The poller will not enqueue jobs that are late by more than this amount of seconds.
62
+ # Defaults to 60 seconds.
63
+ #
64
+ # This is useful when Sidekiq (and Sidekiq-Cron) is not used in zero downtime deployments and
65
+ # when the deployment is done and Sidekiq-Cron starts to catch up, it will consider older
66
+ # jobs that missed their schedules during the deployment. E.g., jobs that run once a day.
67
+ attr_accessor :reschedule_grace_period
68
+
69
+ def initialize
70
+ @enabled = true
71
+ @cron_poll_interval = 30
72
+ @cron_schedule_file = 'config/schedule.yml'
73
+ @cron_history_size = 10
74
+ @default_namespace = 'default'
75
+ @available_namespaces = [@default_namespace]
76
+ @natural_cron_parsing_mode = :single
77
+ @reschedule_grace_period = 60
78
+ end
79
+
80
+ def natural_cron_parsing_mode=(mode)
81
+ unless %i[single strict].include?(mode)
82
+ raise ArgumentError, "Unknown natural cron parsing mode: #{mode.inspect}"
83
+ end
84
+
85
+ @natural_cron_parsing_mode = mode
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
95
+ end
8
96
  end
9
97
  end
98
+
99
+ 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,15 +26,16 @@ 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
- s.add_development_dependency("simplecov-cobertura", "~> 2.1")
40
+ s.add_development_dependency("simplecov-cobertura", "~> 3.1")
40
41
  end
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.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: 2023-03-13 00:00:00.000000000 Z
11
+ date: 2026-05-06 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
@@ -142,14 +162,14 @@ dependencies:
142
162
  requirements:
143
163
  - - "~>"
144
164
  - !ruby/object:Gem::Version
145
- version: '2.1'
165
+ version: '3.1'
146
166
  type: :development
147
167
  prerelease: false
148
168
  version_requirements: !ruby/object:Gem::Requirement
149
169
  requirements:
150
170
  - - "~>"
151
171
  - !ruby/object:Gem::Version
152
- version: '2.1'
172
+ version: '3.1'
153
173
  description: Enables to set jobs to be run in specified time (using CRON notation
154
174
  or natural language)
155
175
  email: ondrej@bartas.cz
@@ -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.5.16
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