sidekiq 4.1.4 → 4.2.10

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of sidekiq might be problematic. Click here for more details.

Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/.github/issue_template.md +6 -1
  3. data/.travis.yml +9 -9
  4. data/Changes.md +100 -0
  5. data/Ent-Changes.md +51 -1
  6. data/Gemfile +6 -6
  7. data/Pro-Changes.md +69 -0
  8. data/README.md +4 -3
  9. data/Rakefile +5 -2
  10. data/bin/sidekiqload +11 -24
  11. data/lib/generators/sidekiq/templates/worker_test.rb.erb +1 -1
  12. data/lib/sidekiq/api.rb +21 -13
  13. data/lib/sidekiq/cli.rb +19 -5
  14. data/lib/sidekiq/core_ext.rb +13 -0
  15. data/lib/sidekiq/launcher.rb +36 -23
  16. data/lib/sidekiq/manager.rb +3 -2
  17. data/lib/sidekiq/middleware/server/logging.rb +8 -17
  18. data/lib/sidekiq/middleware/server/retry_jobs.rb +1 -1
  19. data/lib/sidekiq/processor.rb +31 -16
  20. data/lib/sidekiq/rails.rb +84 -0
  21. data/lib/sidekiq/redis_connection.rb +8 -1
  22. data/lib/sidekiq/scheduled.rb +1 -0
  23. data/lib/sidekiq/testing.rb +10 -2
  24. data/lib/sidekiq/util.rb +2 -1
  25. data/lib/sidekiq/version.rb +1 -1
  26. data/lib/sidekiq/web/action.rb +93 -0
  27. data/lib/sidekiq/web/application.rb +336 -0
  28. data/lib/sidekiq/{web_helpers.rb → web/helpers.rb} +39 -16
  29. data/lib/sidekiq/web/router.rb +100 -0
  30. data/lib/sidekiq/web.rb +119 -184
  31. data/lib/sidekiq/worker.rb +3 -3
  32. data/lib/sidekiq.rb +7 -7
  33. data/sidekiq.gemspec +11 -5
  34. data/web/assets/images/{status-sd8051fd480.png → status.png} +0 -0
  35. data/web/assets/javascripts/application.js +24 -20
  36. data/web/assets/javascripts/dashboard.js +1 -1
  37. data/web/assets/stylesheets/application.css +26 -1
  38. data/web/assets/stylesheets/bootstrap.css +4 -8
  39. data/web/locales/de.yml +1 -1
  40. data/web/locales/fa.yml +79 -0
  41. data/web/views/_footer.erb +1 -1
  42. data/web/views/_job_info.erb +1 -1
  43. data/web/views/busy.erb +2 -2
  44. data/web/views/dashboard.erb +4 -4
  45. data/web/views/dead.erb +1 -1
  46. data/web/views/layout.erb +3 -4
  47. data/web/views/morgue.erb +14 -10
  48. data/web/views/queue.erb +6 -6
  49. data/web/views/queues.erb +3 -3
  50. data/web/views/retries.erb +12 -10
  51. data/web/views/retry.erb +2 -2
  52. data/web/views/scheduled.erb +2 -2
  53. data/web/views/scheduled_job_info.erb +1 -1
  54. metadata +86 -129
  55. data/test/config.yml +0 -9
  56. data/test/env_based_config.yml +0 -11
  57. data/test/fake_env.rb +0 -1
  58. data/test/fixtures/en.yml +0 -2
  59. data/test/helper.rb +0 -75
  60. data/test/test_actors.rb +0 -138
  61. data/test/test_api.rb +0 -528
  62. data/test/test_cli.rb +0 -406
  63. data/test/test_client.rb +0 -266
  64. data/test/test_exception_handler.rb +0 -56
  65. data/test/test_extensions.rb +0 -127
  66. data/test/test_fetch.rb +0 -50
  67. data/test/test_launcher.rb +0 -85
  68. data/test/test_logging.rb +0 -35
  69. data/test/test_manager.rb +0 -50
  70. data/test/test_middleware.rb +0 -158
  71. data/test/test_processor.rb +0 -201
  72. data/test/test_rails.rb +0 -22
  73. data/test/test_redis_connection.rb +0 -132
  74. data/test/test_retry.rb +0 -326
  75. data/test/test_retry_exhausted.rb +0 -149
  76. data/test/test_scheduled.rb +0 -115
  77. data/test/test_scheduling.rb +0 -50
  78. data/test/test_sidekiq.rb +0 -107
  79. data/test/test_testing.rb +0 -143
  80. data/test/test_testing_fake.rb +0 -357
  81. data/test/test_testing_inline.rb +0 -94
  82. data/test/test_util.rb +0 -13
  83. data/test/test_web.rb +0 -614
  84. data/test/test_web_helpers.rb +0 -54
  85. data/web/assets/images/bootstrap/glyphicons-halflings-white.png +0 -0
  86. data/web/assets/images/bootstrap/glyphicons-halflings.png +0 -0
  87. data/web/assets/images/status/active.png +0 -0
  88. data/web/assets/images/status/idle.png +0 -0
  89. data/web/assets/javascripts/locales/README.md +0 -27
  90. data/web/assets/javascripts/locales/jquery.timeago.ar.js +0 -96
  91. data/web/assets/javascripts/locales/jquery.timeago.bg.js +0 -18
  92. data/web/assets/javascripts/locales/jquery.timeago.bs.js +0 -49
  93. data/web/assets/javascripts/locales/jquery.timeago.ca.js +0 -18
  94. data/web/assets/javascripts/locales/jquery.timeago.cs.js +0 -18
  95. data/web/assets/javascripts/locales/jquery.timeago.cy.js +0 -20
  96. data/web/assets/javascripts/locales/jquery.timeago.da.js +0 -18
  97. data/web/assets/javascripts/locales/jquery.timeago.de.js +0 -18
  98. data/web/assets/javascripts/locales/jquery.timeago.el.js +0 -18
  99. data/web/assets/javascripts/locales/jquery.timeago.en-short.js +0 -20
  100. data/web/assets/javascripts/locales/jquery.timeago.en.js +0 -20
  101. data/web/assets/javascripts/locales/jquery.timeago.es.js +0 -18
  102. data/web/assets/javascripts/locales/jquery.timeago.et.js +0 -18
  103. data/web/assets/javascripts/locales/jquery.timeago.fa.js +0 -22
  104. data/web/assets/javascripts/locales/jquery.timeago.fi.js +0 -28
  105. data/web/assets/javascripts/locales/jquery.timeago.fr-short.js +0 -16
  106. data/web/assets/javascripts/locales/jquery.timeago.fr.js +0 -17
  107. data/web/assets/javascripts/locales/jquery.timeago.he.js +0 -18
  108. data/web/assets/javascripts/locales/jquery.timeago.hr.js +0 -49
  109. data/web/assets/javascripts/locales/jquery.timeago.hu.js +0 -18
  110. data/web/assets/javascripts/locales/jquery.timeago.hy.js +0 -18
  111. data/web/assets/javascripts/locales/jquery.timeago.id.js +0 -18
  112. data/web/assets/javascripts/locales/jquery.timeago.it.js +0 -16
  113. data/web/assets/javascripts/locales/jquery.timeago.ja.js +0 -19
  114. data/web/assets/javascripts/locales/jquery.timeago.ko.js +0 -17
  115. data/web/assets/javascripts/locales/jquery.timeago.lt.js +0 -20
  116. data/web/assets/javascripts/locales/jquery.timeago.mk.js +0 -20
  117. data/web/assets/javascripts/locales/jquery.timeago.nb.js +0 -18
  118. data/web/assets/javascripts/locales/jquery.timeago.nl.js +0 -20
  119. data/web/assets/javascripts/locales/jquery.timeago.pl.js +0 -31
  120. data/web/assets/javascripts/locales/jquery.timeago.pt-br.js +0 -16
  121. data/web/assets/javascripts/locales/jquery.timeago.pt.js +0 -16
  122. data/web/assets/javascripts/locales/jquery.timeago.ro.js +0 -18
  123. data/web/assets/javascripts/locales/jquery.timeago.rs.js +0 -49
  124. data/web/assets/javascripts/locales/jquery.timeago.ru.js +0 -34
  125. data/web/assets/javascripts/locales/jquery.timeago.sk.js +0 -18
  126. data/web/assets/javascripts/locales/jquery.timeago.sl.js +0 -44
  127. data/web/assets/javascripts/locales/jquery.timeago.sv.js +0 -18
  128. data/web/assets/javascripts/locales/jquery.timeago.th.js +0 -20
  129. data/web/assets/javascripts/locales/jquery.timeago.tr.js +0 -16
  130. data/web/assets/javascripts/locales/jquery.timeago.uk.js +0 -34
  131. data/web/assets/javascripts/locales/jquery.timeago.uz.js +0 -19
  132. data/web/assets/javascripts/locales/jquery.timeago.zh-cn.js +0 -20
  133. data/web/assets/javascripts/locales/jquery.timeago.zh-tw.js +0 -20
  134. data/web/views/_poll_js.erb +0 -5
data/lib/sidekiq/web.rb CHANGED
@@ -1,26 +1,28 @@
1
1
  # frozen_string_literal: true
2
2
  require 'erb'
3
- require 'yaml'
4
- require 'sinatra/base'
5
3
 
6
4
  require 'sidekiq'
7
5
  require 'sidekiq/api'
8
6
  require 'sidekiq/paginator'
9
- require 'sidekiq/web_helpers'
7
+ require 'sidekiq/web/helpers'
10
8
 
11
- module Sidekiq
12
- class Web < Sinatra::Base
13
- include Sidekiq::Paginator
9
+ require 'sidekiq/web/router'
10
+ require 'sidekiq/web/action'
11
+ require 'sidekiq/web/application'
14
12
 
15
- enable :sessions
16
- use ::Rack::Protection, :use => :authenticity_token unless ENV['RACK_ENV'] == 'test'
13
+ require 'rack/protection'
17
14
 
18
- set :root, File.expand_path(File.dirname(__FILE__) + "/../../web")
19
- set :public_folder, proc { "#{root}/assets" }
20
- set :views, proc { "#{root}/views" }
21
- set :locales, ["#{root}/locales"]
15
+ require 'rack/builder'
16
+ require 'rack/file'
17
+ require 'rack/session/cookie'
22
18
 
23
- helpers WebHelpers
19
+ module Sidekiq
20
+ class Web
21
+ ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../web")
22
+ VIEWS = "#{ROOT}/views".freeze
23
+ LOCALES = ["#{ROOT}/locales".freeze]
24
+ LAYOUT = "#{VIEWS}/layout.erb".freeze
25
+ ASSETS = "#{ROOT}/assets".freeze
24
26
 
25
27
  DEFAULT_TABS = {
26
28
  "Dashboard" => '',
@@ -32,6 +34,18 @@ module Sidekiq
32
34
  }
33
35
 
34
36
  class << self
37
+ def settings
38
+ self
39
+ end
40
+
41
+ def middlewares
42
+ @middlewares ||= []
43
+ end
44
+
45
+ def use(*middleware_args, &block)
46
+ middlewares << [middleware_args, block]
47
+ end
48
+
35
49
  def default_tabs
36
50
  DEFAULT_TABS
37
51
  end
@@ -41,234 +55,155 @@ module Sidekiq
41
55
  end
42
56
  alias_method :tabs, :custom_tabs
43
57
 
44
- attr_accessor :app_url
45
- end
58
+ def locales
59
+ @locales ||= LOCALES
60
+ end
46
61
 
47
- get "/busy" do
48
- erb :busy
49
- end
62
+ def views
63
+ @views ||= VIEWS
64
+ end
50
65
 
51
- post "/busy" do
52
- if params['identity']
53
- p = Sidekiq::Process.new('identity' => params['identity'])
54
- p.quiet! if params[:quiet]
55
- p.stop! if params[:stop]
56
- else
57
- processes.each do |pro|
58
- pro.quiet! if params[:quiet]
59
- pro.stop! if params[:stop]
60
- end
66
+ def enable(*opts)
67
+ opts.each {|key| set(key, true) }
61
68
  end
62
- redirect "#{root_path}busy"
63
- end
64
69
 
65
- get "/queues" do
66
- @queues = Sidekiq::Queue.all
67
- erb :queues
68
- end
70
+ def disable(*opts)
71
+ opts.each {|key| set(key, false) }
72
+ end
69
73
 
70
- get "/queues/:name" do
71
- halt 404 unless params[:name]
72
- @count = (params[:count] || 25).to_i
73
- @name = params[:name]
74
- @queue = Sidekiq::Queue.new(@name)
75
- (@current_page, @total_size, @messages) = page("queue:#{@name}", params[:page], @count)
76
- @messages = @messages.map { |msg| Sidekiq::Job.new(msg, @name) }
77
- erb :queue
78
- end
74
+ # Helper for the Sinatra syntax: Sidekiq::Web.set(:session_secret, Rails.application.secrets...)
75
+ def set(attribute, value)
76
+ send(:"#{attribute}=", value)
77
+ end
79
78
 
80
- post "/queues/:name" do
81
- Sidekiq::Queue.new(params[:name]).clear
82
- redirect "#{root_path}queues"
79
+ attr_accessor :app_url, :session_secret, :redis_pool, :sessions
80
+ attr_writer :locales, :views
83
81
  end
84
82
 
85
- post "/queues/:name/delete" do
86
- Sidekiq::Job.new(params[:key_val], params[:name]).delete
87
- redirect_with_query("#{root_path}queues/#{params[:name]}")
83
+ def self.inherited(child)
84
+ child.app_url = self.app_url
85
+ child.session_secret = self.session_secret
86
+ child.redis_pool = self.redis_pool
87
+ child.sessions = self.sessions
88
88
  end
89
89
 
90
- get '/morgue' do
91
- @count = (params[:count] || 25).to_i
92
- (@current_page, @total_size, @dead) = page("dead", params[:page], @count, reverse: true)
93
- @dead = @dead.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
94
- erb :morgue
90
+ def settings
91
+ self.class.settings
95
92
  end
96
93
 
97
- get "/morgue/:key" do
98
- halt 404 unless params['key']
99
- @dead = Sidekiq::DeadSet.new.fetch(*parse_params(params['key'])).first
100
- redirect "#{root_path}morgue" if @dead.nil?
101
- erb :dead
94
+ def use(*middleware_args, &block)
95
+ middlewares << [middleware_args, block]
102
96
  end
103
97
 
104
- post '/morgue' do
105
- redirect request.path unless params['key']
106
-
107
- params['key'].each do |key|
108
- job = Sidekiq::DeadSet.new.fetch(*parse_params(key)).first
109
- retry_or_delete_or_kill job, params if job
110
- end
111
- redirect_with_query("#{root_path}morgue")
98
+ def middlewares
99
+ @middlewares ||= Web.middlewares.dup
112
100
  end
113
101
 
114
- post "/morgue/all/delete" do
115
- Sidekiq::DeadSet.new.clear
116
- redirect "#{root_path}morgue"
102
+ def call(env)
103
+ app.call(env)
117
104
  end
118
105
 
119
- post "/morgue/all/retry" do
120
- Sidekiq::DeadSet.new.retry_all
121
- redirect "#{root_path}morgue"
106
+ def self.call(env)
107
+ @app ||= new
108
+ @app.call(env)
122
109
  end
123
110
 
124
- post "/morgue/:key" do
125
- halt 404 unless params['key']
126
- job = Sidekiq::DeadSet.new.fetch(*parse_params(params['key'])).first
127
- retry_or_delete_or_kill job, params if job
128
- redirect_with_query("#{root_path}morgue")
111
+ def app
112
+ @app ||= build
129
113
  end
130
114
 
131
-
132
- get '/retries' do
133
- @count = (params[:count] || 25).to_i
134
- (@current_page, @total_size, @retries) = page("retry", params[:page], @count)
135
- @retries = @retries.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
136
- erb :retries
115
+ def enable(*opts)
116
+ opts.each {|key| set(key, true) }
137
117
  end
138
118
 
139
- get "/retries/:key" do
140
- @retry = Sidekiq::RetrySet.new.fetch(*parse_params(params['key'])).first
141
- redirect "#{root_path}retries" if @retry.nil?
142
- erb :retry
119
+ def disable(*opts)
120
+ opts.each {|key| set(key, false) }
143
121
  end
144
122
 
145
- post '/retries' do
146
- redirect request.path unless params['key']
147
-
148
- params['key'].each do |key|
149
- job = Sidekiq::RetrySet.new.fetch(*parse_params(key)).first
150
- retry_or_delete_or_kill job, params if job
151
- end
152
- redirect_with_query("#{root_path}retries")
123
+ def set(attribute, value)
124
+ send(:"#{attribute}=", value)
153
125
  end
154
126
 
155
- post "/retries/all/delete" do
156
- Sidekiq::RetrySet.new.clear
157
- redirect "#{root_path}retries"
158
- end
127
+ # Default values
128
+ set :sessions, true
159
129
 
160
- post "/retries/all/retry" do
161
- Sidekiq::RetrySet.new.retry_all
162
- redirect "#{root_path}retries"
163
- end
130
+ attr_writer :sessions
164
131
 
165
- post "/retries/:key" do
166
- job = Sidekiq::RetrySet.new.fetch(*parse_params(params['key'])).first
167
- retry_or_delete_or_kill job, params if job
168
- redirect_with_query("#{root_path}retries")
169
- end
132
+ def sessions
133
+ unless instance_variable_defined?("@sessions")
134
+ @sessions = self.class.sessions
135
+ @sessions = @sessions.to_hash.dup if @sessions.respond_to?(:to_hash)
136
+ end
170
137
 
171
- get '/scheduled' do
172
- @count = (params[:count] || 25).to_i
173
- (@current_page, @total_size, @scheduled) = page("schedule", params[:page], @count)
174
- @scheduled = @scheduled.map { |msg, score| Sidekiq::SortedEntry.new(nil, score, msg) }
175
- erb :scheduled
138
+ @sessions
176
139
  end
177
140
 
178
- get "/scheduled/:key" do
179
- @job = Sidekiq::ScheduledSet.new.fetch(*parse_params(params['key'])).first
180
- redirect "#{root_path}scheduled" if @job.nil?
181
- erb :scheduled_job_info
141
+ def self.register(extension)
142
+ extension.registered(WebApplication)
182
143
  end
183
144
 
184
- post '/scheduled' do
185
- redirect request.path unless params['key']
145
+ private
186
146
 
187
- params['key'].each do |key|
188
- job = Sidekiq::ScheduledSet.new.fetch(*parse_params(key)).first
189
- delete_or_add_queue job, params if job
147
+ def using?(middleware)
148
+ middlewares.any? do |(m,_)|
149
+ m.kind_of?(Array) && (m[0] == middleware || m[0].kind_of?(middleware))
190
150
  end
191
- redirect_with_query("#{root_path}scheduled")
192
151
  end
193
152
 
194
- post "/scheduled/:key" do
195
- halt 404 unless params['key']
196
- job = Sidekiq::ScheduledSet.new.fetch(*parse_params(params['key'])).first
197
- delete_or_add_queue job, params if job
198
- redirect_with_query("#{root_path}scheduled")
199
- end
153
+ def build_sessions
154
+ middlewares = self.middlewares
200
155
 
201
- get '/' do
202
- @redis_info = redis_info.select{ |k, v| REDIS_KEYS.include? k }
203
- stats_history = Sidekiq::Stats::History.new((params[:days] || 30).to_i)
204
- @processed_history = stats_history.processed
205
- @failed_history = stats_history.failed
206
- erb :dashboard
207
- end
156
+ unless using?(::Rack::Protection) || ENV['RACK_ENV'] == 'test'
157
+ middlewares.unshift [[::Rack::Protection, { use: :authenticity_token }], nil]
158
+ end
208
159
 
209
- REDIS_KEYS = %w(redis_version uptime_in_days connected_clients used_memory_human used_memory_peak_human)
160
+ s = sessions
161
+ return unless s
210
162
 
211
- get '/dashboard/stats' do
212
- redirect "#{root_path}stats"
213
- end
163
+ unless using? ::Rack::Session::Cookie
164
+ unless secret = Web.session_secret
165
+ require 'securerandom'
166
+ secret = SecureRandom.hex(64)
167
+ end
168
+
169
+ options = { secret: secret }
170
+ options = options.merge(s.to_hash) if s.respond_to? :to_hash
214
171
 
215
- get '/stats' do
216
- sidekiq_stats = Sidekiq::Stats.new
217
- redis_stats = redis_info.select { |k, v| REDIS_KEYS.include? k }
218
-
219
- content_type :json
220
- Sidekiq.dump_json(
221
- sidekiq: {
222
- processed: sidekiq_stats.processed,
223
- failed: sidekiq_stats.failed,
224
- busy: sidekiq_stats.workers_size,
225
- processes: sidekiq_stats.processes_size,
226
- enqueued: sidekiq_stats.enqueued,
227
- scheduled: sidekiq_stats.scheduled_size,
228
- retries: sidekiq_stats.retry_size,
229
- dead: sidekiq_stats.dead_size,
230
- default_latency: sidekiq_stats.default_queue_latency
231
- },
232
- redis: redis_stats
233
- )
172
+ middlewares.unshift [[::Rack::Session::Cookie, options], nil]
173
+ end
234
174
  end
235
175
 
236
- get '/stats/queues' do
237
- queue_stats = Sidekiq::Stats::Queues.new
176
+ def build
177
+ build_sessions
238
178
 
239
- content_type :json
240
- Sidekiq.dump_json(
241
- queue_stats.lengths
242
- )
243
- end
179
+ middlewares = self.middlewares
180
+ klass = self.class
244
181
 
245
- private
182
+ ::Rack::Builder.new do
183
+ %w(stylesheets javascripts images).each do |asset_dir|
184
+ map "/#{asset_dir}" do
185
+ run ::Rack::File.new("#{ASSETS}/#{asset_dir}", { 'Cache-Control' => 'public, max-age=86400' })
186
+ end
187
+ end
246
188
 
247
- def retry_or_delete_or_kill job, params
248
- if params['retry']
249
- job.retry
250
- elsif params['delete']
251
- job.delete
252
- elsif params['kill']
253
- job.kill
254
- end
255
- end
189
+ middlewares.each {|middleware, block| use(*middleware, &block) }
256
190
 
257
- def delete_or_add_queue job, params
258
- if params['delete']
259
- job.delete
260
- elsif params['add_to_queue']
261
- job.add_to_queue
191
+ run WebApplication.new(klass)
262
192
  end
263
193
  end
264
194
  end
195
+
196
+ Sidekiq::WebApplication.helpers WebHelpers
197
+ Sidekiq::WebApplication.helpers Sidekiq::Paginator
198
+
199
+ Sidekiq::WebAction.class_eval "def _render\n#{ERB.new(File.read(Web::LAYOUT)).src}\nend"
265
200
  end
266
201
 
267
202
  if defined?(::ActionDispatch::Request::Session) &&
268
- !::ActionDispatch::Request::Session.respond_to?(:each)
203
+ !::ActionDispatch::Request::Session.method_defined?(:each)
269
204
  # mperham/sidekiq#2460
270
205
  # Rack apps can't reuse the Rails session store without
271
- # this monkeypatch
206
+ # this monkeypatch, fixed in Rails 5.
272
207
  class ActionDispatch::Request::Session
273
208
  def each(&block)
274
209
  hash = self.to_hash
@@ -64,13 +64,13 @@ module Sidekiq
64
64
  # numeric (like an activesupport time interval).
65
65
  def perform_in(interval, *args)
66
66
  int = interval.to_f
67
- now = Time.now
68
- ts = (int < 1_000_000_000 ? (now + interval).to_f : int)
67
+ now = Time.now.to_f
68
+ ts = (int < 1_000_000_000 ? now + int : int)
69
69
 
70
70
  item = { 'class' => self, 'args' => args, 'at' => ts }
71
71
 
72
72
  # Optimization to enqueue something now that is scheduled to go out now or in the past
73
- item.delete('at'.freeze) if ts <= now.to_f
73
+ item.delete('at'.freeze) if ts <= now
74
74
 
75
75
  client_push(item)
76
76
  end
data/lib/sidekiq.rb CHANGED
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
1
  # encoding: utf-8
2
+ # frozen_string_literal: true
3
3
  require 'sidekiq/version'
4
4
  fail "Sidekiq #{Sidekiq::VERSION} does not support Ruby versions below 2.0.0." if RUBY_PLATFORM != 'java' && RUBY_VERSION < '2.0.0'
5
5
 
@@ -28,9 +28,12 @@ module Sidekiq
28
28
  startup: [],
29
29
  quiet: [],
30
30
  shutdown: [],
31
+ heartbeat: [],
31
32
  },
32
33
  dead_max_jobs: 10_000,
33
- dead_timeout_in_seconds: 180 * 24 * 60 * 60 # 6 months
34
+ dead_timeout_in_seconds: 180 * 24 * 60 * 60, # 6 months
35
+ reloader: proc { |&block| block.call },
36
+ executor: proc { |&block| block.call },
34
37
  }
35
38
 
36
39
  DEFAULT_WORKER_OPTIONS = {
@@ -146,12 +149,8 @@ module Sidekiq
146
149
  require 'sidekiq/middleware/server/logging'
147
150
 
148
151
  Middleware::Chain.new do |m|
149
- m.add Middleware::Server::Logging
150
152
  m.add Middleware::Server::RetryJobs
151
- if defined?(::ActiveRecord::Base)
152
- require 'sidekiq/middleware/server/active_record'
153
- m.add Sidekiq::Middleware::Server::ActiveRecord
154
- end
153
+ m.add Middleware::Server::Logging
155
154
  end
156
155
  end
157
156
 
@@ -169,6 +168,7 @@ module Sidekiq
169
168
  def self.default_retries_exhausted=(prok)
170
169
  @default_retries_exhausted = prok
171
170
  end
171
+ @default_retries_exhausted = ->(job, ex) { }
172
172
  def self.default_retries_exhausted
173
173
  @default_retries_exhausted
174
174
  end
data/sidekiq.gemspec CHANGED
@@ -10,17 +10,23 @@ Gem::Specification.new do |gem|
10
10
  gem.license = "LGPL-3.0"
11
11
 
12
12
  gem.executables = ['sidekiq', 'sidekiqctl']
13
- gem.files = `git ls-files | grep -Ev '^(myapp|examples)'`.split("\n")
14
- gem.test_files = `git ls-files -- test/*`.split("\n")
13
+ gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
14
+ gem.test_files = []
15
15
  gem.name = "sidekiq"
16
16
  gem.require_paths = ["lib"]
17
17
  gem.version = Sidekiq::VERSION
18
18
  gem.add_dependency 'redis', '~> 3.2', '>= 3.2.1'
19
19
  gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.0'
20
20
  gem.add_dependency 'concurrent-ruby', '~> 1.0'
21
- gem.add_dependency 'sinatra', '>= 1.4.7'
21
+ gem.add_dependency 'rack-protection', '>= 1.5.0'
22
22
  gem.add_development_dependency 'redis-namespace', '~> 1.5', '>= 1.5.2'
23
- gem.add_development_dependency 'minitest', '~> 5.7', '>= 5.7.0'
23
+ gem.add_development_dependency 'minitest', '~> 5.10', '>= 5.10.1'
24
24
  gem.add_development_dependency 'rake', '~> 10.0'
25
- gem.add_development_dependency 'rails', '~> 4', '>= 3.2.0'
25
+ gem.add_development_dependency 'rails', '>= 3.2.0'
26
+
27
+ gem.add_development_dependency 'capybara', '~> 2.11'
28
+ gem.add_development_dependency 'poltergeist', '~> 1.12'
29
+ gem.add_development_dependency 'percy-capybara', '~> 2.3'
30
+ gem.add_development_dependency 'timecop', '~> 0.8'
31
+ gem.add_development_dependency 'mocha', '~> 1.1'
26
32
  end