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.
- checksums.yaml +4 -4
- data/.standard.yml +20 -0
- data/.travis.yml +5 -2
- data/6.0-Upgrade.md +58 -0
- data/Changes.md +21 -9
- data/Gemfile +12 -11
- data/Rakefile +5 -4
- data/bin/sidekiqctl +1 -10
- data/lib/generators/sidekiq/worker_generator.rb +12 -14
- data/lib/sidekiq.rb +53 -42
- data/lib/sidekiq/api.rb +132 -145
- data/lib/sidekiq/cli.rb +95 -147
- data/lib/sidekiq/client.rb +44 -45
- data/lib/sidekiq/ctl.rb +35 -109
- data/lib/sidekiq/delay.rb +5 -6
- data/lib/sidekiq/exception_handler.rb +10 -12
- data/lib/sidekiq/extensions/action_mailer.rb +10 -20
- data/lib/sidekiq/extensions/active_record.rb +9 -7
- data/lib/sidekiq/extensions/class_methods.rb +9 -7
- data/lib/sidekiq/extensions/generic_proxy.rb +4 -4
- data/lib/sidekiq/fetch.rb +5 -6
- data/lib/sidekiq/job_logger.rb +37 -7
- data/lib/sidekiq/job_retry.rb +45 -58
- data/lib/sidekiq/launcher.rb +58 -47
- data/lib/sidekiq/logger.rb +69 -0
- data/lib/sidekiq/manager.rb +6 -8
- data/lib/sidekiq/middleware/chain.rb +2 -1
- data/lib/sidekiq/middleware/i18n.rb +5 -7
- data/lib/sidekiq/paginator.rb +11 -12
- data/lib/sidekiq/processor.rb +42 -45
- data/lib/sidekiq/rails.rb +2 -26
- data/lib/sidekiq/redis_connection.rb +31 -37
- data/lib/sidekiq/scheduled.rb +17 -19
- data/lib/sidekiq/testing.rb +22 -23
- data/lib/sidekiq/testing/inline.rb +2 -1
- data/lib/sidekiq/util.rb +18 -15
- data/lib/sidekiq/version.rb +2 -1
- data/lib/sidekiq/web.rb +36 -44
- data/lib/sidekiq/web/action.rb +14 -10
- data/lib/sidekiq/web/application.rb +59 -56
- data/lib/sidekiq/web/helpers.rb +66 -67
- data/lib/sidekiq/web/router.rb +17 -14
- data/lib/sidekiq/worker.rb +12 -13
- data/sidekiq.gemspec +7 -7
- metadata +15 -27
- data/lib/sidekiq/core_ext.rb +0 -1
- data/lib/sidekiq/logging.rb +0 -122
- data/lib/sidekiq/middleware/server/active_record.rb +0 -23
data/lib/sidekiq/web/router.rb
CHANGED
@@ -1,18 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
2
|
+
|
3
|
+
require "rack"
|
3
4
|
|
4
5
|
module Sidekiq
|
5
6
|
module WebRouter
|
6
|
-
GET =
|
7
|
-
DELETE =
|
8
|
-
POST =
|
9
|
-
PUT =
|
10
|
-
PATCH =
|
11
|
-
HEAD =
|
7
|
+
GET = "GET"
|
8
|
+
DELETE = "DELETE"
|
9
|
+
POST = "POST"
|
10
|
+
PUT = "PUT"
|
11
|
+
PATCH = "PATCH"
|
12
|
+
HEAD = "HEAD"
|
12
13
|
|
13
|
-
ROUTE_PARAMS =
|
14
|
-
REQUEST_METHOD =
|
15
|
-
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 ||= {
|
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
|
-
|
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
|
-
|
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
|
data/lib/sidekiq/worker.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'sidekiq/client'
|
3
2
|
|
4
|
-
|
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 ==
|
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(
|
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(
|
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(
|
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(
|
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 = {
|
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(
|
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[
|
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
|
data/sidekiq.gemspec
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require_relative
|
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 = [
|
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.
|
15
|
+
gem.required_ruby_version = ">= 2.5.0"
|
16
16
|
|
17
|
-
gem.add_dependency
|
18
|
-
gem.add_dependency
|
19
|
-
gem.add_dependency
|
20
|
-
gem.add_dependency
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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/
|
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.
|
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:
|
212
|
+
version: 1.3.1
|
225
213
|
requirements: []
|
226
|
-
rubygems_version: 3.1
|
214
|
+
rubygems_version: 3.0.1
|
227
215
|
signing_key:
|
228
216
|
specification_version: 4
|
229
217
|
summary: Simple, efficient background processing for Ruby
|
data/lib/sidekiq/core_ext.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
raise "no longer used, will be removed in 5.1"
|
data/lib/sidekiq/logging.rb
DELETED
@@ -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
|