sidekiq 5.2.9 → 6.0.0.pre1

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.standard.yml +20 -0
  3. data/.travis.yml +5 -2
  4. data/6.0-Upgrade.md +58 -0
  5. data/Changes.md +21 -9
  6. data/Gemfile +12 -11
  7. data/Rakefile +5 -4
  8. data/bin/sidekiqctl +1 -10
  9. data/lib/generators/sidekiq/worker_generator.rb +12 -14
  10. data/lib/sidekiq.rb +53 -42
  11. data/lib/sidekiq/api.rb +132 -145
  12. data/lib/sidekiq/cli.rb +95 -147
  13. data/lib/sidekiq/client.rb +44 -45
  14. data/lib/sidekiq/ctl.rb +35 -109
  15. data/lib/sidekiq/delay.rb +5 -6
  16. data/lib/sidekiq/exception_handler.rb +10 -12
  17. data/lib/sidekiq/extensions/action_mailer.rb +10 -20
  18. data/lib/sidekiq/extensions/active_record.rb +9 -7
  19. data/lib/sidekiq/extensions/class_methods.rb +9 -7
  20. data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
  21. data/lib/sidekiq/fetch.rb +5 -6
  22. data/lib/sidekiq/job_logger.rb +37 -7
  23. data/lib/sidekiq/job_retry.rb +45 -58
  24. data/lib/sidekiq/launcher.rb +58 -47
  25. data/lib/sidekiq/logger.rb +69 -0
  26. data/lib/sidekiq/manager.rb +6 -8
  27. data/lib/sidekiq/middleware/chain.rb +2 -1
  28. data/lib/sidekiq/middleware/i18n.rb +5 -7
  29. data/lib/sidekiq/paginator.rb +11 -12
  30. data/lib/sidekiq/processor.rb +42 -45
  31. data/lib/sidekiq/rails.rb +2 -26
  32. data/lib/sidekiq/redis_connection.rb +31 -37
  33. data/lib/sidekiq/scheduled.rb +17 -19
  34. data/lib/sidekiq/testing.rb +22 -23
  35. data/lib/sidekiq/testing/inline.rb +2 -1
  36. data/lib/sidekiq/util.rb +18 -15
  37. data/lib/sidekiq/version.rb +2 -1
  38. data/lib/sidekiq/web.rb +36 -44
  39. data/lib/sidekiq/web/action.rb +14 -10
  40. data/lib/sidekiq/web/application.rb +59 -56
  41. data/lib/sidekiq/web/helpers.rb +66 -67
  42. data/lib/sidekiq/web/router.rb +17 -14
  43. data/lib/sidekiq/worker.rb +12 -13
  44. data/sidekiq.gemspec +7 -7
  45. metadata +15 -27
  46. data/lib/sidekiq/core_ext.rb +0 -1
  47. data/lib/sidekiq/logging.rb +0 -122
  48. data/lib/sidekiq/middleware/server/active_record.rb +0 -23
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
- require 'rack'
2
+
3
+ require "rack"
3
4
 
4
5
  module Sidekiq
5
6
  module WebRouter
6
- GET = 'GET'
7
- DELETE = 'DELETE'
8
- POST = 'POST'
9
- PUT = 'PUT'
10
- PATCH = 'PATCH'
11
- HEAD = 'HEAD'
7
+ GET = "GET"
8
+ DELETE = "DELETE"
9
+ POST = "POST"
10
+ PUT = "PUT"
11
+ PATCH = "PATCH"
12
+ HEAD = "HEAD"
12
13
 
13
- ROUTE_PARAMS = 'rack.route_params'
14
- REQUEST_METHOD = 'REQUEST_METHOD'
15
- PATH_INFO = 'PATH_INFO'
14
+ ROUTE_PARAMS = "rack.route_params"
15
+ REQUEST_METHOD = "REQUEST_METHOD"
16
+ PATH_INFO = "PATH_INFO"
16
17
 
17
18
  def get(path, &block)
18
19
  route(GET, path, &block)
@@ -35,7 +36,7 @@ module Sidekiq
35
36
  end
36
37
 
37
38
  def route(method, path, &block)
38
- @routes ||= { GET => [], POST => [], PUT => [], PATCH => [], DELETE => [], HEAD => [] }
39
+ @routes ||= {GET => [], POST => [], PUT => [], PATCH => [], DELETE => [], HEAD => []}
39
40
 
40
41
  @routes[method] << WebRoute.new(method, path, block)
41
42
  @routes[HEAD] << WebRoute.new(method, path, block) if method == GET
@@ -50,7 +51,8 @@ module Sidekiq
50
51
  path_info = "/" if path_info == ""
51
52
 
52
53
  @routes[request_method].each do |route|
53
- if params = route.match(request_method, path_info)
54
+ params = route.match(request_method, path_info)
55
+ if params
54
56
  env[ROUTE_PARAMS] = params
55
57
 
56
58
  return WebAction.new(env, route.block)
@@ -77,7 +79,7 @@ module Sidekiq
77
79
  end
78
80
 
79
81
  def compile
80
- if pattern.match(NAMED_SEGMENTS_PATTERN)
82
+ if pattern.match?(NAMED_SEGMENTS_PATTERN)
81
83
  p = pattern.gsub(NAMED_SEGMENTS_PATTERN, '/\1(?<\2>[^$/]+)')
82
84
 
83
85
  Regexp.new("\\A#{p}\\Z")
@@ -91,7 +93,8 @@ module Sidekiq
91
93
  when String
92
94
  {} if path == matcher
93
95
  else
94
- if path_match = path.match(matcher)
96
+ path_match = path.match(matcher)
97
+ if path_match
95
98
  Hash[path_match.names.map(&:to_sym).zip(path_match.captures)]
96
99
  end
97
100
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
- require 'sidekiq/client'
3
2
 
4
- module Sidekiq
3
+ require "sidekiq/client"
5
4
 
5
+ module Sidekiq
6
6
  ##
7
7
  # Include this module in your worker class and you can easily create
8
8
  # asynchronous jobs:
@@ -24,7 +24,7 @@ module Sidekiq
24
24
  attr_accessor :jid
25
25
 
26
26
  def self.included(base)
27
- raise ArgumentError, "You cannot include Sidekiq::Worker in an ActiveJob: #{base.name}" if base.ancestors.any? {|c| c.name == 'ActiveJob::Base' }
27
+ raise ArgumentError, "You cannot include Sidekiq::Worker in an ActiveJob: #{base.name}" if base.ancestors.any? {|c| c.name == "ActiveJob::Base" }
28
28
 
29
29
  base.extend(ClassMethods)
30
30
  base.sidekiq_class_attribute :sidekiq_options_hash
@@ -52,7 +52,7 @@ module Sidekiq
52
52
  end
53
53
 
54
54
  def perform_async(*args)
55
- @klass.client_push(@opts.merge('args' => args, 'class' => @klass))
55
+ @klass.client_push(@opts.merge("args" => args, "class" => @klass))
56
56
  end
57
57
 
58
58
  # +interval+ must be a timestamp, numeric or something that acts
@@ -62,9 +62,9 @@ module Sidekiq
62
62
  now = Time.now.to_f
63
63
  ts = (int < 1_000_000_000 ? now + int : int)
64
64
 
65
- payload = @opts.merge('class' => @klass, 'args' => args, 'at' => ts)
65
+ payload = @opts.merge("class" => @klass, "args" => args, "at" => ts)
66
66
  # Optimization to enqueue something now that is scheduled to go out now or in the past
67
- payload.delete('at') if ts <= now
67
+ payload.delete("at") if ts <= now
68
68
  @klass.client_push(payload)
69
69
  end
70
70
  alias_method :perform_at, :perform_in
@@ -90,7 +90,7 @@ module Sidekiq
90
90
  end
91
91
 
92
92
  def perform_async(*args)
93
- client_push('class' => self, 'args' => args)
93
+ client_push("class" => self, "args" => args)
94
94
  end
95
95
 
96
96
  # +interval+ must be a timestamp, numeric or something that acts
@@ -100,10 +100,10 @@ module Sidekiq
100
100
  now = Time.now.to_f
101
101
  ts = (int < 1_000_000_000 ? now + int : int)
102
102
 
103
- item = { 'class' => self, 'args' => args, 'at' => ts }
103
+ item = {"class" => self, "args" => args, "at" => ts}
104
104
 
105
105
  # Optimization to enqueue something now that is scheduled to go out now or in the past
106
- item.delete('at') if ts <= now
106
+ item.delete("at") if ts <= now
107
107
 
108
108
  client_push(item)
109
109
  end
@@ -122,9 +122,9 @@ module Sidekiq
122
122
  #
123
123
  # In practice, any option is allowed. This is the main mechanism to configure the
124
124
  # options for a specific job.
125
- def sidekiq_options(opts={})
125
+ def sidekiq_options(opts = {})
126
126
  # stringify
127
- self.sidekiq_options_hash = get_sidekiq_options.merge(Hash[opts.map{|k, v| [k.to_s, v]}])
127
+ self.sidekiq_options_hash = get_sidekiq_options.merge(Hash[opts.map {|k, v| [k.to_s, v]}])
128
128
  end
129
129
 
130
130
  def sidekiq_retry_in(&block)
@@ -140,7 +140,7 @@ module Sidekiq
140
140
  end
141
141
 
142
142
  def client_push(item) # :nodoc:
143
- pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options['pool'] || Sidekiq.redis_pool
143
+ pool = Thread.current[:sidekiq_via_pool] || get_sidekiq_options["pool"] || Sidekiq.redis_pool
144
144
  # stringify
145
145
  item.keys.each do |key|
146
146
  item[key.to_s] = item.delete(key)
@@ -214,7 +214,6 @@ module Sidekiq
214
214
  end
215
215
  end
216
216
  end
217
-
218
217
  end
219
218
  end
220
219
  end
@@ -1,4 +1,4 @@
1
- require_relative 'lib/sidekiq/version'
1
+ require_relative "lib/sidekiq/version"
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.authors = ["Mike Perham"]
@@ -8,14 +8,14 @@ Gem::Specification.new do |gem|
8
8
  gem.homepage = "http://sidekiq.org"
9
9
  gem.license = "LGPL-3.0"
10
10
 
11
- gem.executables = ['sidekiq', 'sidekiqctl']
11
+ gem.executables = ["sidekiq", "sidekiqctl"]
12
12
  gem.files = `git ls-files | grep -Ev '^(test|myapp|examples)'`.split("\n")
13
13
  gem.name = "sidekiq"
14
14
  gem.version = Sidekiq::VERSION
15
- gem.required_ruby_version = ">= 2.2.2"
15
+ gem.required_ruby_version = ">= 2.5.0"
16
16
 
17
- gem.add_dependency 'redis', '>= 3.3.5', '< 4.2'
18
- gem.add_dependency 'connection_pool', '~> 2.2', '>= 2.2.2'
19
- gem.add_dependency 'rack', '~> 2.0'
20
- gem.add_dependency 'rack-protection', '>= 1.5.0'
17
+ gem.add_dependency "redis", ">= 4.0.2"
18
+ gem.add_dependency "connection_pool", ">= 2.2.2"
19
+ gem.add_dependency "rack", ">= 1.5.0"
20
+ gem.add_dependency "rack-protection", ">= 1.5.0"
21
21
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.9
4
+ version: 6.0.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Perham
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-06-16 00:00:00.000000000 Z
11
+ date: 2019-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
@@ -16,27 +16,18 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.3.5
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '4.2'
19
+ version: 4.0.2
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 3.3.5
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '4.2'
26
+ version: 4.0.2
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: connection_pool
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - "~>"
38
- - !ruby/object:Gem::Version
39
- version: '2.2'
40
31
  - - ">="
41
32
  - !ruby/object:Gem::Version
42
33
  version: 2.2.2
@@ -44,9 +35,6 @@ dependencies:
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
46
37
  requirements:
47
- - - "~>"
48
- - !ruby/object:Gem::Version
49
- version: '2.2'
50
38
  - - ">="
51
39
  - !ruby/object:Gem::Version
52
40
  version: 2.2.2
@@ -54,16 +42,16 @@ dependencies:
54
42
  name: rack
55
43
  requirement: !ruby/object:Gem::Requirement
56
44
  requirements:
57
- - - "~>"
45
+ - - ">="
58
46
  - !ruby/object:Gem::Version
59
- version: '2.0'
47
+ version: 1.5.0
60
48
  type: :runtime
61
49
  prerelease: false
62
50
  version_requirements: !ruby/object:Gem::Requirement
63
51
  requirements:
64
- - - "~>"
52
+ - - ">="
65
53
  - !ruby/object:Gem::Version
66
- version: '2.0'
54
+ version: 1.5.0
67
55
  - !ruby/object:Gem::Dependency
68
56
  name: rack-protection
69
57
  requirement: !ruby/object:Gem::Requirement
@@ -91,10 +79,12 @@ files:
91
79
  - ".github/contributing.md"
92
80
  - ".github/issue_template.md"
93
81
  - ".gitignore"
82
+ - ".standard.yml"
94
83
  - ".travis.yml"
95
84
  - 3.0-Upgrade.md
96
85
  - 4.0-Upgrade.md
97
86
  - 5.0-Upgrade.md
87
+ - 6.0-Upgrade.md
98
88
  - COMM-LICENSE
99
89
  - Changes.md
100
90
  - Ent-Changes.md
@@ -118,7 +108,6 @@ files:
118
108
  - lib/sidekiq/api.rb
119
109
  - lib/sidekiq/cli.rb
120
110
  - lib/sidekiq/client.rb
121
- - lib/sidekiq/core_ext.rb
122
111
  - lib/sidekiq/ctl.rb
123
112
  - lib/sidekiq/delay.rb
124
113
  - lib/sidekiq/exception_handler.rb
@@ -130,11 +119,10 @@ files:
130
119
  - lib/sidekiq/job_logger.rb
131
120
  - lib/sidekiq/job_retry.rb
132
121
  - lib/sidekiq/launcher.rb
133
- - lib/sidekiq/logging.rb
122
+ - lib/sidekiq/logger.rb
134
123
  - lib/sidekiq/manager.rb
135
124
  - lib/sidekiq/middleware/chain.rb
136
125
  - lib/sidekiq/middleware/i18n.rb
137
- - lib/sidekiq/middleware/server/active_record.rb
138
126
  - lib/sidekiq/paginator.rb
139
127
  - lib/sidekiq/processor.rb
140
128
  - lib/sidekiq/rails.rb
@@ -216,14 +204,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
216
204
  requirements:
217
205
  - - ">="
218
206
  - !ruby/object:Gem::Version
219
- version: 2.2.2
207
+ version: 2.5.0
220
208
  required_rubygems_version: !ruby/object:Gem::Requirement
221
209
  requirements:
222
- - - ">="
210
+ - - ">"
223
211
  - !ruby/object:Gem::Version
224
- version: '0'
212
+ version: 1.3.1
225
213
  requirements: []
226
- rubygems_version: 3.1.2
214
+ rubygems_version: 3.0.1
227
215
  signing_key:
228
216
  specification_version: 4
229
217
  summary: Simple, efficient background processing for Ruby
@@ -1 +0,0 @@
1
- raise "no longer used, will be removed in 5.1"
@@ -1,122 +0,0 @@
1
- # frozen_string_literal: true
2
- require 'time'
3
- require 'logger'
4
- require 'fcntl'
5
-
6
- module Sidekiq
7
- module Logging
8
-
9
- class Pretty < Logger::Formatter
10
- SPACE = " "
11
-
12
- # Provide a call() method that returns the formatted message.
13
- def call(severity, time, program_name, message)
14
- "#{time.utc.iso8601(3)} #{::Process.pid} TID-#{Sidekiq::Logging.tid}#{context} #{severity}: #{message}\n"
15
- end
16
-
17
- def context
18
- c = Thread.current[:sidekiq_context]
19
- " #{c.join(SPACE)}" if c && c.any?
20
- end
21
- end
22
-
23
- class WithoutTimestamp < Pretty
24
- def call(severity, time, program_name, message)
25
- "#{::Process.pid} TID-#{Sidekiq::Logging.tid}#{context} #{severity}: #{message}\n"
26
- end
27
- end
28
-
29
- def self.tid
30
- Thread.current['sidekiq_tid'] ||= (Thread.current.object_id ^ ::Process.pid).to_s(36)
31
- end
32
-
33
- def self.job_hash_context(job_hash)
34
- # If we're using a wrapper class, like ActiveJob, use the "wrapped"
35
- # attribute to expose the underlying thing.
36
- klass = job_hash['wrapped'] || job_hash["class"]
37
- bid = job_hash['bid']
38
- "#{klass} JID-#{job_hash['jid']}#{" BID-#{bid}" if bid}"
39
- end
40
-
41
- def self.with_job_hash_context(job_hash, &block)
42
- with_context(job_hash_context(job_hash), &block)
43
- end
44
-
45
- def self.with_context(msg)
46
- Thread.current[:sidekiq_context] ||= []
47
- Thread.current[:sidekiq_context] << msg
48
- yield
49
- ensure
50
- Thread.current[:sidekiq_context].pop
51
- end
52
-
53
- def self.initialize_logger(log_target = STDOUT)
54
- oldlogger = defined?(@logger) ? @logger : nil
55
- @logger = Logger.new(log_target)
56
- @logger.level = Logger::INFO
57
- @logger.formatter = ENV['DYNO'] ? WithoutTimestamp.new : Pretty.new
58
- oldlogger.close if oldlogger && !$TESTING # don't want to close testing's STDOUT logging
59
- @logger
60
- end
61
-
62
- def self.logger
63
- defined?(@logger) ? @logger : initialize_logger
64
- end
65
-
66
- def self.logger=(log)
67
- @logger = (log ? log : Logger.new(File::NULL))
68
- end
69
-
70
- # This reopens ALL logfiles in the process that have been rotated
71
- # using logrotate(8) (without copytruncate) or similar tools.
72
- # A +File+ object is considered for reopening if it is:
73
- # 1) opened with the O_APPEND and O_WRONLY flags
74
- # 2) the current open file handle does not match its original open path
75
- # 3) unbuffered (as far as userspace buffering goes, not O_SYNC)
76
- # Returns the number of files reopened
77
- def self.reopen_logs
78
- to_reopen = []
79
- append_flags = File::WRONLY | File::APPEND
80
-
81
- ObjectSpace.each_object(File) do |fp|
82
- begin
83
- if !fp.closed? && fp.stat.file? && fp.sync && (fp.fcntl(Fcntl::F_GETFL) & append_flags) == append_flags
84
- to_reopen << fp
85
- end
86
- rescue IOError, Errno::EBADF
87
- end
88
- end
89
-
90
- nr = 0
91
- to_reopen.each do |fp|
92
- orig_st = begin
93
- fp.stat
94
- rescue IOError, Errno::EBADF
95
- next
96
- end
97
-
98
- begin
99
- b = File.stat(fp.path)
100
- next if orig_st.ino == b.ino && orig_st.dev == b.dev
101
- rescue Errno::ENOENT
102
- end
103
-
104
- begin
105
- File.open(fp.path, 'a') { |tmpfp| fp.reopen(tmpfp) }
106
- fp.sync = true
107
- nr += 1
108
- rescue IOError, Errno::EBADF
109
- # not much we can do...
110
- end
111
- end
112
- nr
113
- rescue RuntimeError => ex
114
- # RuntimeError: ObjectSpace is disabled; each_object will only work with Class, pass -X+O to enable
115
- puts "Unable to reopen logs: #{ex.message}"
116
- end
117
-
118
- def logger
119
- Sidekiq::Logging.logger
120
- end
121
- end
122
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
- module Sidekiq
3
- module Middleware
4
- module Server
5
- class ActiveRecord
6
-
7
- def initialize
8
- # With Rails 5+ we must use the Reloader **always**.
9
- # The reloader handles code loading and db connection management.
10
- if defined?(::Rails) && defined?(::Rails::VERSION) && ::Rails::VERSION::MAJOR >= 5
11
- raise ArgumentError, "Rails 5 no longer needs or uses the ActiveRecord middleware."
12
- end
13
- end
14
-
15
- def call(*args)
16
- yield
17
- ensure
18
- ::ActiveRecord::Base.clear_active_connections!
19
- end
20
- end
21
- end
22
- end
23
- end