sidekiq 5.2.7 → 8.0.5

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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/Changes.md +845 -8
  3. data/LICENSE.txt +9 -0
  4. data/README.md +54 -54
  5. data/bin/multi_queue_bench +271 -0
  6. data/bin/sidekiq +22 -3
  7. data/bin/sidekiqload +219 -112
  8. data/bin/sidekiqmon +11 -0
  9. data/bin/webload +69 -0
  10. data/lib/active_job/queue_adapters/sidekiq_adapter.rb +120 -0
  11. data/lib/generators/sidekiq/job_generator.rb +59 -0
  12. data/lib/generators/sidekiq/templates/{worker.rb.erb → job.rb.erb} +2 -2
  13. data/lib/generators/sidekiq/templates/{worker_spec.rb.erb → job_spec.rb.erb} +1 -1
  14. data/lib/generators/sidekiq/templates/{worker_test.rb.erb → job_test.rb.erb} +1 -1
  15. data/lib/sidekiq/api.rb +757 -373
  16. data/lib/sidekiq/capsule.rb +132 -0
  17. data/lib/sidekiq/cli.rb +210 -233
  18. data/lib/sidekiq/client.rb +145 -103
  19. data/lib/sidekiq/component.rb +128 -0
  20. data/lib/sidekiq/config.rb +315 -0
  21. data/lib/sidekiq/deploy.rb +64 -0
  22. data/lib/sidekiq/embedded.rb +64 -0
  23. data/lib/sidekiq/fetch.rb +49 -42
  24. data/lib/sidekiq/iterable_job.rb +56 -0
  25. data/lib/sidekiq/job/interrupt_handler.rb +24 -0
  26. data/lib/sidekiq/job/iterable/active_record_enumerator.rb +53 -0
  27. data/lib/sidekiq/job/iterable/csv_enumerator.rb +47 -0
  28. data/lib/sidekiq/job/iterable/enumerators.rb +135 -0
  29. data/lib/sidekiq/job/iterable.rb +306 -0
  30. data/lib/sidekiq/job.rb +385 -0
  31. data/lib/sidekiq/job_logger.rb +34 -7
  32. data/lib/sidekiq/job_retry.rb +164 -109
  33. data/lib/sidekiq/job_util.rb +113 -0
  34. data/lib/sidekiq/launcher.rb +208 -107
  35. data/lib/sidekiq/logger.rb +80 -0
  36. data/lib/sidekiq/manager.rb +42 -46
  37. data/lib/sidekiq/metrics/query.rb +184 -0
  38. data/lib/sidekiq/metrics/shared.rb +109 -0
  39. data/lib/sidekiq/metrics/tracking.rb +150 -0
  40. data/lib/sidekiq/middleware/chain.rb +113 -56
  41. data/lib/sidekiq/middleware/current_attributes.rb +119 -0
  42. data/lib/sidekiq/middleware/i18n.rb +7 -7
  43. data/lib/sidekiq/middleware/modules.rb +23 -0
  44. data/lib/sidekiq/monitor.rb +147 -0
  45. data/lib/sidekiq/paginator.rb +41 -16
  46. data/lib/sidekiq/processor.rb +146 -127
  47. data/lib/sidekiq/profiler.rb +72 -0
  48. data/lib/sidekiq/rails.rb +46 -43
  49. data/lib/sidekiq/redis_client_adapter.rb +113 -0
  50. data/lib/sidekiq/redis_connection.rb +79 -108
  51. data/lib/sidekiq/ring_buffer.rb +31 -0
  52. data/lib/sidekiq/scheduled.rb +112 -50
  53. data/lib/sidekiq/sd_notify.rb +149 -0
  54. data/lib/sidekiq/systemd.rb +26 -0
  55. data/lib/sidekiq/testing/inline.rb +6 -5
  56. data/lib/sidekiq/testing.rb +91 -90
  57. data/lib/sidekiq/transaction_aware_client.rb +51 -0
  58. data/lib/sidekiq/version.rb +7 -1
  59. data/lib/sidekiq/web/action.rb +125 -60
  60. data/lib/sidekiq/web/application.rb +363 -259
  61. data/lib/sidekiq/web/config.rb +120 -0
  62. data/lib/sidekiq/web/csrf_protection.rb +183 -0
  63. data/lib/sidekiq/web/helpers.rb +241 -120
  64. data/lib/sidekiq/web/router.rb +62 -71
  65. data/lib/sidekiq/web.rb +69 -161
  66. data/lib/sidekiq/worker_compatibility_alias.rb +13 -0
  67. data/lib/sidekiq.rb +94 -182
  68. data/sidekiq.gemspec +26 -16
  69. data/web/assets/images/apple-touch-icon.png +0 -0
  70. data/web/assets/javascripts/application.js +150 -61
  71. data/web/assets/javascripts/base-charts.js +120 -0
  72. data/web/assets/javascripts/chart.min.js +13 -0
  73. data/web/assets/javascripts/chartjs-adapter-date-fns.min.js +7 -0
  74. data/web/assets/javascripts/chartjs-plugin-annotation.min.js +7 -0
  75. data/web/assets/javascripts/dashboard-charts.js +194 -0
  76. data/web/assets/javascripts/dashboard.js +41 -293
  77. data/web/assets/javascripts/metrics.js +280 -0
  78. data/web/assets/stylesheets/style.css +766 -0
  79. data/web/locales/ar.yml +72 -65
  80. data/web/locales/cs.yml +63 -62
  81. data/web/locales/da.yml +61 -53
  82. data/web/locales/de.yml +66 -53
  83. data/web/locales/el.yml +44 -24
  84. data/web/locales/en.yml +94 -66
  85. data/web/locales/es.yml +92 -54
  86. data/web/locales/fa.yml +66 -65
  87. data/web/locales/fr.yml +83 -62
  88. data/web/locales/gd.yml +99 -0
  89. data/web/locales/he.yml +66 -64
  90. data/web/locales/hi.yml +60 -59
  91. data/web/locales/it.yml +93 -54
  92. data/web/locales/ja.yml +75 -64
  93. data/web/locales/ko.yml +53 -52
  94. data/web/locales/lt.yml +84 -0
  95. data/web/locales/nb.yml +62 -61
  96. data/web/locales/nl.yml +53 -52
  97. data/web/locales/pl.yml +46 -45
  98. data/web/locales/{pt-br.yml → pt-BR.yml} +84 -56
  99. data/web/locales/pt.yml +52 -51
  100. data/web/locales/ru.yml +69 -63
  101. data/web/locales/sv.yml +54 -53
  102. data/web/locales/ta.yml +61 -60
  103. data/web/locales/tr.yml +101 -0
  104. data/web/locales/uk.yml +86 -61
  105. data/web/locales/ur.yml +65 -64
  106. data/web/locales/vi.yml +84 -0
  107. data/web/locales/zh-CN.yml +106 -0
  108. data/web/locales/{zh-tw.yml → zh-TW.yml} +43 -9
  109. data/web/views/_footer.erb +31 -19
  110. data/web/views/_job_info.erb +94 -75
  111. data/web/views/_metrics_period_select.erb +15 -0
  112. data/web/views/_nav.erb +14 -21
  113. data/web/views/_paging.erb +23 -19
  114. data/web/views/_poll_link.erb +3 -6
  115. data/web/views/_summary.erb +23 -23
  116. data/web/views/busy.erb +139 -87
  117. data/web/views/dashboard.erb +82 -53
  118. data/web/views/dead.erb +31 -27
  119. data/web/views/filtering.erb +6 -0
  120. data/web/views/layout.erb +15 -29
  121. data/web/views/metrics.erb +84 -0
  122. data/web/views/metrics_for_job.erb +58 -0
  123. data/web/views/morgue.erb +60 -70
  124. data/web/views/profiles.erb +43 -0
  125. data/web/views/queue.erb +50 -39
  126. data/web/views/queues.erb +45 -29
  127. data/web/views/retries.erb +65 -75
  128. data/web/views/retry.erb +32 -27
  129. data/web/views/scheduled.erb +58 -52
  130. data/web/views/scheduled_job_info.erb +1 -1
  131. metadata +96 -76
  132. data/.circleci/config.yml +0 -61
  133. data/.github/contributing.md +0 -32
  134. data/.github/issue_template.md +0 -11
  135. data/.gitignore +0 -15
  136. data/.travis.yml +0 -11
  137. data/3.0-Upgrade.md +0 -70
  138. data/4.0-Upgrade.md +0 -53
  139. data/5.0-Upgrade.md +0 -56
  140. data/COMM-LICENSE +0 -97
  141. data/Ent-Changes.md +0 -238
  142. data/Gemfile +0 -23
  143. data/LICENSE +0 -9
  144. data/Pro-2.0-Upgrade.md +0 -138
  145. data/Pro-3.0-Upgrade.md +0 -44
  146. data/Pro-4.0-Upgrade.md +0 -35
  147. data/Pro-Changes.md +0 -759
  148. data/Rakefile +0 -9
  149. data/bin/sidekiqctl +0 -20
  150. data/code_of_conduct.md +0 -50
  151. data/lib/generators/sidekiq/worker_generator.rb +0 -49
  152. data/lib/sidekiq/core_ext.rb +0 -1
  153. data/lib/sidekiq/ctl.rb +0 -221
  154. data/lib/sidekiq/delay.rb +0 -42
  155. data/lib/sidekiq/exception_handler.rb +0 -29
  156. data/lib/sidekiq/extensions/action_mailer.rb +0 -57
  157. data/lib/sidekiq/extensions/active_record.rb +0 -40
  158. data/lib/sidekiq/extensions/class_methods.rb +0 -40
  159. data/lib/sidekiq/extensions/generic_proxy.rb +0 -31
  160. data/lib/sidekiq/logging.rb +0 -122
  161. data/lib/sidekiq/middleware/server/active_record.rb +0 -23
  162. data/lib/sidekiq/util.rb +0 -66
  163. data/lib/sidekiq/worker.rb +0 -220
  164. data/web/assets/stylesheets/application-rtl.css +0 -246
  165. data/web/assets/stylesheets/application.css +0 -1144
  166. data/web/assets/stylesheets/bootstrap-rtl.min.css +0 -9
  167. data/web/assets/stylesheets/bootstrap.css +0 -5
  168. data/web/locales/zh-cn.yml +0 -68
  169. data/web/views/_status.erb +0 -4
data/lib/sidekiq.rb CHANGED
@@ -1,237 +1,149 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'sidekiq/version'
4
- fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.2.2." if RUBY_PLATFORM != 'java' && Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.2.2')
3
+ require "sidekiq/version"
4
+ fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 3.2.0." if RUBY_PLATFORM != "java" && Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.2.0")
5
5
 
6
- require 'sidekiq/logging'
7
- require 'sidekiq/client'
8
- require 'sidekiq/worker'
9
- require 'sidekiq/redis_connection'
10
- require 'sidekiq/delay'
6
+ begin
7
+ require "sidekiq-ent/version"
8
+ fail <<~EOM if Gem::Version.new(Sidekiq::Enterprise::VERSION).segments[0] != Sidekiq::MAJOR
11
9
 
12
- require 'json'
10
+ Sidekiq Enterprise #{Sidekiq::Enterprise::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
11
+ Starting with Sidekiq 7, major versions are synchronized so Sidekiq Enterprise 7 works with Sidekiq 7.
12
+ Use `bundle up sidekiq-ent` to upgrade.
13
13
 
14
- module Sidekiq
15
- NAME = 'Sidekiq'
16
- LICENSE = 'See LICENSE and the LGPL-3.0 for licensing details.'
17
-
18
- DEFAULTS = {
19
- queues: [],
20
- labels: [],
21
- concurrency: 10,
22
- require: '.',
23
- environment: nil,
24
- timeout: 8,
25
- poll_interval_average: nil,
26
- average_scheduled_poll_interval: 5,
27
- error_handlers: [],
28
- death_handlers: [],
29
- lifecycle_events: {
30
- startup: [],
31
- quiet: [],
32
- shutdown: [],
33
- heartbeat: [],
34
- },
35
- dead_max_jobs: 10_000,
36
- dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
37
- reloader: proc { |&block| block.call },
38
- }
39
-
40
- DEFAULT_WORKER_OPTIONS = {
41
- 'retry' => true,
42
- 'queue' => 'default'
43
- }
44
-
45
- FAKE_INFO = {
46
- "redis_version" => "9.9.9",
47
- "uptime_in_days" => "9999",
48
- "connected_clients" => "9999",
49
- "used_memory_human" => "9P",
50
- "used_memory_peak_human" => "9P"
51
- }
14
+ EOM
15
+ rescue LoadError
16
+ end
52
17
 
53
- def self.❨╯°□°❩╯︵┻━┻
54
- puts "Calm down, yo."
55
- end
18
+ begin
19
+ require "sidekiq/pro/version"
20
+ fail <<~EOM if Gem::Version.new(Sidekiq::Pro::VERSION).segments[0] != Sidekiq::MAJOR
56
21
 
57
- def self.options
58
- @options ||= DEFAULTS.dup
59
- end
22
+ Sidekiq Pro #{Sidekiq::Pro::VERSION} does not work with Sidekiq #{Sidekiq::VERSION}.
23
+ Starting with Sidekiq 7, major versions are synchronized so Sidekiq Pro 7 works with Sidekiq 7.
24
+ Use `bundle up sidekiq-pro` to upgrade.
60
25
 
61
- def self.options=(opts)
62
- @options = opts
63
- end
26
+ EOM
27
+ rescue LoadError
28
+ end
64
29
 
65
- ##
66
- # Configuration for Sidekiq server, use like:
67
- #
68
- # Sidekiq.configure_server do |config|
69
- # config.redis = { :namespace => 'myapp', :size => 25, :url => 'redis://myhost:8877/0' }
70
- # config.server_middleware do |chain|
71
- # chain.add MyServerHook
72
- # end
73
- # end
74
- def self.configure_server
75
- yield self if server?
76
- end
30
+ require "sidekiq/config"
31
+ require "sidekiq/logger"
32
+ require "sidekiq/client"
33
+ require "sidekiq/transaction_aware_client"
34
+ require "sidekiq/job"
35
+ require "sidekiq/iterable_job"
36
+ require "sidekiq/worker_compatibility_alias"
37
+ require "sidekiq/redis_client_adapter"
77
38
 
78
- ##
79
- # Configuration for Sidekiq client, use like:
80
- #
81
- # Sidekiq.configure_client do |config|
82
- # config.redis = { :namespace => 'myapp', :size => 1, :url => 'redis://myhost:8877/0' }
83
- # end
84
- def self.configure_client
85
- yield self unless server?
39
+ require "json"
40
+
41
+ module Sidekiq
42
+ NAME = "Sidekiq"
43
+ LICENSE = "See LICENSE and the LGPL-3.0 for licensing details."
44
+
45
+ def self.❨╯°□°❩╯︵┻━┻
46
+ puts "Take a deep breath and count to ten..."
86
47
  end
87
48
 
88
49
  def self.server?
89
50
  defined?(Sidekiq::CLI)
90
51
  end
91
52
 
92
- def self.redis
93
- raise ArgumentError, "requires a block" unless block_given?
94
- redis_pool.with do |conn|
95
- retryable = true
96
- begin
97
- yield conn
98
- rescue Redis::CommandError => ex
99
- #2550 Failover can cause the server to become a replica, need
100
- # to disconnect and reopen the socket to get back to the primary.
101
- (conn.disconnect!; retryable = false; retry) if retryable && ex.message =~ /READONLY/
102
- raise
103
- end
104
- end
105
- end
106
-
107
- def self.redis_info
108
- redis do |conn|
109
- begin
110
- # admin commands can't go through redis-namespace starting
111
- # in redis-namespace 2.0
112
- if conn.respond_to?(:namespace)
113
- conn.redis.info
114
- else
115
- conn.info
116
- end
117
- rescue Redis::CommandError => ex
118
- #2850 return fake version when INFO command has (probably) been renamed
119
- raise unless ex.message =~ /unknown command/
120
- FAKE_INFO
121
- end
122
- end
53
+ def self.load_json(string)
54
+ JSON.parse(string)
123
55
  end
124
56
 
125
- def self.redis_pool
126
- @redis ||= Sidekiq::RedisConnection.create
57
+ def self.dump_json(object)
58
+ JSON.generate(object)
127
59
  end
128
60
 
129
- def self.redis=(hash)
130
- @redis = if hash.is_a?(ConnectionPool)
131
- hash
132
- else
133
- Sidekiq::RedisConnection.create(hash)
134
- end
61
+ def self.pro?
62
+ defined?(Sidekiq::Pro)
135
63
  end
136
64
 
137
- def self.client_middleware
138
- @client_chain ||= Middleware::Chain.new
139
- yield @client_chain if block_given?
140
- @client_chain
65
+ def self.ent?
66
+ defined?(Sidekiq::Enterprise)
141
67
  end
142
68
 
143
- def self.server_middleware
144
- @server_chain ||= default_server_middleware
145
- yield @server_chain if block_given?
146
- @server_chain
69
+ def self.redis_pool
70
+ (Thread.current[:sidekiq_capsule] || default_configuration).redis_pool
147
71
  end
148
72
 
149
- def self.default_server_middleware
150
- Middleware::Chain.new
73
+ def self.redis(&block)
74
+ (Thread.current[:sidekiq_capsule] || default_configuration).redis(&block)
151
75
  end
152
76
 
153
- def self.default_worker_options=(hash)
154
- # stringify
155
- @default_worker_options = default_worker_options.merge(Hash[hash.map{|k, v| [k.to_s, v]}])
156
- end
157
- def self.default_worker_options
158
- defined?(@default_worker_options) ? @default_worker_options : DEFAULT_WORKER_OPTIONS
77
+ def self.strict_args!(mode = :raise)
78
+ Sidekiq::Config::DEFAULTS[:on_complex_arguments] = mode
159
79
  end
160
80
 
161
- def self.default_retries_exhausted=(prok)
162
- logger.info { "default_retries_exhausted is deprecated, please use `config.death_handlers << -> {|job, ex| }`" }
163
- return nil unless prok
164
- death_handlers << prok
81
+ def self.default_job_options=(hash)
82
+ @default_job_options = default_job_options.merge(hash.transform_keys(&:to_s))
165
83
  end
166
84
 
167
- ##
168
- # Death handlers are called when all retries for a job have been exhausted and
169
- # the job dies. It's the notification to your application
170
- # that this job will not succeed without manual intervention.
171
- #
172
- # Sidekiq.configure_server do |config|
173
- # config.death_handlers << ->(job, ex) do
174
- # end
175
- # end
176
- def self.death_handlers
177
- options[:death_handlers]
85
+ def self.default_job_options
86
+ @default_job_options ||= {"retry" => true, "queue" => "default"}
178
87
  end
179
88
 
180
- def self.load_json(string)
181
- JSON.parse(string)
182
- end
183
- def self.dump_json(object)
184
- JSON.generate(object)
89
+ def self.default_configuration
90
+ @config ||= Sidekiq::Config.new
185
91
  end
186
92
 
187
93
  def self.logger
188
- Sidekiq::Logging.logger
94
+ default_configuration.logger
189
95
  end
190
- def self.logger=(log)
191
- Sidekiq::Logging.logger = log
96
+
97
+ def self.configure_server(&block)
98
+ (@config_blocks ||= []) << block
99
+ yield default_configuration if server?
192
100
  end
193
101
 
194
- # How frequently Redis should be checked by a random Sidekiq process for
195
- # scheduled and retriable jobs. Each individual process will take turns by
196
- # waiting some multiple of this value.
197
- #
198
- # See sidekiq/scheduled.rb for an in-depth explanation of this value
199
- def self.average_scheduled_poll_interval=(interval)
200
- self.options[:average_scheduled_poll_interval] = interval
102
+ def self.freeze!
103
+ @frozen = true
104
+ @config_blocks = nil
105
+ default_configuration.freeze!
201
106
  end
202
107
 
203
- # Register a proc to handle any error which occurs within the Sidekiq process.
108
+ # Creates a Sidekiq::Config instance that is more tuned for embedding
109
+ # within an arbitrary Ruby process. Notably it reduces concurrency by
110
+ # default so there is less contention for CPU time with other threads.
204
111
  #
205
- # Sidekiq.configure_server do |config|
206
- # config.error_handlers << proc {|ex,ctx_hash| MyErrorService.notify(ex, ctx_hash) }
112
+ # instance = Sidekiq.configure_embed do |config|
113
+ # config.queues = %w[critical default low]
207
114
  # end
115
+ # instance.run
116
+ # sleep 10
117
+ # instance.stop
208
118
  #
209
- # The default error handler logs errors to Sidekiq.logger.
210
- def self.error_handlers
211
- self.options[:error_handlers]
119
+ # NB: it is really easy to overload a Ruby process with threads due to the GIL.
120
+ # I do not recommend setting concurrency higher than 2-3.
121
+ #
122
+ # NB: Sidekiq only supports one instance in memory. You will get undefined behavior
123
+ # if you try to embed Sidekiq twice in the same process.
124
+ def self.configure_embed(&block)
125
+ raise "Sidekiq global configuration is frozen, you must create all embedded instances BEFORE calling `run`" if @frozen
126
+
127
+ require "sidekiq/embedded"
128
+ cfg = default_configuration
129
+ cfg.concurrency = 2
130
+ @config_blocks&.each { |block| block.call(cfg) }
131
+ yield cfg
132
+
133
+ Sidekiq::Embedded.new(cfg)
212
134
  end
213
135
 
214
- # Register a block to run at a point in the Sidekiq lifecycle.
215
- # :startup, :quiet or :shutdown are valid events.
216
- #
217
- # Sidekiq.configure_server do |config|
218
- # config.on(:shutdown) do
219
- # puts "Goodbye cruel world!"
220
- # end
221
- # end
222
- def self.on(event, &block)
223
- raise ArgumentError, "Symbols only please: #{event}" unless event.is_a?(Symbol)
224
- raise ArgumentError, "Invalid event name: #{event}" unless options[:lifecycle_events].key?(event)
225
- options[:lifecycle_events][event] << block
136
+ def self.configure_client
137
+ yield default_configuration unless server?
226
138
  end
227
139
 
228
- # We are shutting down Sidekiq but what about workers that
140
+ # We are shutting down Sidekiq but what about threads that
229
141
  # are working on some long job? This error is
230
- # raised in workers that have not finished within the hard
142
+ # raised in jobs that have not finished within the hard
231
143
  # timeout limit. This is needed to rollback db transactions,
232
144
  # otherwise Ruby's Thread#kill will commit. See #377.
233
- # DO NOT RESCUE THIS ERROR IN YOUR WORKERS
145
+ # DO NOT RESCUE THIS ERROR IN YOUR JOBS
234
146
  class Shutdown < Interrupt; end
235
147
  end
236
148
 
237
- require 'sidekiq/rails' if defined?(::Rails::Engine)
149
+ require "sidekiq/rails" if defined?(::Rails::Engine)
data/sidekiq.gemspec CHANGED
@@ -1,21 +1,31 @@
1
- require_relative 'lib/sidekiq/version'
1
+ require_relative "lib/sidekiq/version"
2
2
 
3
3
  Gem::Specification.new do |gem|
4
- gem.authors = ["Mike Perham"]
5
- gem.email = ["mperham@gmail.com"]
6
- gem.summary = "Simple, efficient background processing for Ruby"
7
- gem.description = "Simple, efficient background processing for Ruby."
8
- gem.homepage = "http://sidekiq.org"
9
- gem.license = "LGPL-3.0"
4
+ gem.authors = ["Mike Perham"]
5
+ gem.email = ["info@contribsys.com"]
6
+ gem.summary = "Simple, efficient background processing for Ruby"
7
+ gem.description = "Simple, efficient background processing for Ruby."
8
+ gem.homepage = "https://sidekiq.org"
9
+ gem.license = "LGPL-3.0"
10
10
 
11
- gem.executables = ['sidekiq', 'sidekiqctl']
12
- gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
13
- gem.name = "sidekiq"
14
- gem.version = Sidekiq::VERSION
15
- gem.required_ruby_version = ">= 2.2.2"
11
+ gem.executables = ["sidekiq", "sidekiqmon"]
12
+ gem.files = %w[sidekiq.gemspec README.md Changes.md LICENSE.txt] + `git ls-files | grep -E '^(bin|lib|web)'`.split("\n")
13
+ gem.name = "sidekiq"
14
+ gem.version = Sidekiq::VERSION
15
+ gem.required_ruby_version = ">= 3.2.0"
16
16
 
17
- gem.add_dependency 'redis', '>= 3.3.5', '< 5'
18
- gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.2'
19
- gem.add_dependency 'rack', '>= 1.5.0'
20
- gem.add_dependency 'rack-protection', '>= 1.5.0'
17
+ gem.metadata = {
18
+ "homepage_uri" => "https://sidekiq.org",
19
+ "bug_tracker_uri" => "https://github.com/sidekiq/sidekiq/issues",
20
+ "documentation_uri" => "https://github.com/sidekiq/sidekiq/wiki",
21
+ "changelog_uri" => "https://github.com/sidekiq/sidekiq/blob/main/Changes.md",
22
+ "source_code_uri" => "https://github.com/sidekiq/sidekiq",
23
+ "rubygems_mfa_required" => "true"
24
+ }
25
+
26
+ gem.add_dependency "redis-client", ">= 0.23.2"
27
+ gem.add_dependency "connection_pool", ">= 2.5.0"
28
+ gem.add_dependency "rack", ">= 3.1.0"
29
+ gem.add_dependency "json", ">= 2.9.0"
30
+ gem.add_dependency "logger", ">= 1.6.2"
21
31
  end