Skip to content

Commit 3f2b7d6

Browse files
committed
Remove deprecated callbacks from ActionDispatch middlewares
1 parent 4f4906b commit 3f2b7d6

File tree

7 files changed

+70
-163
lines changed

7 files changed

+70
-163
lines changed

actionpack/CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
* Remove deprecated `.to_prepare`, `.to_cleanup`, `.prepare!` and `.cleanup!` from `ActionDispatch::Reloader`.
2+
3+
*Rafael Mendonça França*
4+
5+
* Remove deprecated `ActionDispatch::Callbacks.to_prepare` and `ActionDispatch::Callbacks.to_cleanup`.
6+
7+
*Rafael Mendonça França*
8+
19
* Remove deprecated `ActionController::Metal.call`.
210

311
*Rafael Mendonça França*

actionpack/lib/action_dispatch/middleware/callbacks.rb

-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
module ActionDispatch
32
# Provides callbacks to be executed before and after dispatching the request.
43
class Callbacks
@@ -7,17 +6,6 @@ class Callbacks
76
define_callbacks :call
87

98
class << self
10-
def to_prepare(*args, &block)
11-
ActiveSupport::Reloader.to_prepare(*args, &block)
12-
end
13-
14-
def to_cleanup(*args, &block)
15-
ActiveSupport::Reloader.to_complete(*args, &block)
16-
end
17-
18-
deprecate to_prepare: "use ActiveSupport::Reloader.to_prepare instead",
19-
to_cleanup: "use ActiveSupport::Reloader.to_complete instead"
20-
219
def before(*args, &block)
2210
set_callback(:call, :before, *args, &block)
2311
end
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,10 @@
11
module ActionDispatch
2-
# ActionDispatch::Reloader provides prepare and cleanup callbacks,
3-
# intended to assist with code reloading during development.
4-
#
5-
# Prepare callbacks are run before each request, and cleanup callbacks
6-
# after each request. In this respect they are analogs of ActionDispatch::Callback's
7-
# before and after callbacks. However, cleanup callbacks are not called until the
8-
# request is fully complete -- that is, after #close has been called on
9-
# the response body. This is important for streaming responses such as the
10-
# following:
11-
#
12-
# self.response_body = -> (response, output) do
13-
# # code here which refers to application models
14-
# end
15-
#
16-
# Cleanup callbacks will not be called until after the response_body lambda
17-
# is evaluated, ensuring that it can refer to application models and other
18-
# classes before they are unloaded.
2+
# ActionDispatch::Reloader wraps the request with callbacks provided by ActiveSupport::Reloader
3+
# callbacks, intended to assist with code reloading during development.
194
#
205
# By default, ActionDispatch::Reloader is included in the middleware stack
216
# only in the development environment; specifically, when +config.cache_classes+
22-
# is false. Callbacks may be registered even when it is not included in the
23-
# middleware stack, but are executed only when <tt>ActionDispatch::Reloader.prepare!</tt>
24-
# or <tt>ActionDispatch::Reloader.cleanup!</tt> are called manually.
25-
#
7+
# is false.
268
class Reloader < Executor
27-
def self.to_prepare(*args, &block)
28-
ActiveSupport::Reloader.to_prepare(*args, &block)
29-
end
30-
31-
def self.to_cleanup(*args, &block)
32-
ActiveSupport::Reloader.to_complete(*args, &block)
33-
end
34-
35-
def self.prepare!
36-
default_reloader.prepare!
37-
end
38-
39-
def self.cleanup!
40-
default_reloader.reload!
41-
end
42-
43-
class << self
44-
attr_accessor :default_reloader # :nodoc:
45-
46-
deprecate to_prepare: "use ActiveSupport::Reloader.to_prepare instead",
47-
to_cleanup: "use ActiveSupport::Reloader.to_complete instead",
48-
prepare!: "use Rails.application.reloader.prepare! instead",
49-
cleanup!: "use Rails.application.reloader.reload! instead of cleanup + prepare"
50-
end
51-
52-
self.default_reloader = ActiveSupport::Reloader
539
end
5410
end

actionpack/lib/action_dispatch/railtie.rb

-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ class Railtie < Rails::Railtie # :nodoc:
3939
config.action_dispatch.always_write_cookie = Rails.env.development? if config.action_dispatch.always_write_cookie.nil?
4040
ActionDispatch::Cookies::CookieJar.always_write_cookie = config.action_dispatch.always_write_cookie
4141

42-
ActionDispatch::Reloader.default_reloader = app.reloader
43-
4442
ActionDispatch.test_app = app
4543
end
4644
end

actionpack/test/dispatch/callbacks_test.rb

-18
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,6 @@ def test_before_and_after_callbacks
3535
assert_equal 6, Foo.b
3636
end
3737

38-
def test_to_prepare_and_cleanup_delegation
39-
prepared = cleaned = false
40-
assert_deprecated do
41-
ActionDispatch::Callbacks.to_prepare { prepared = true }
42-
ActionDispatch::Callbacks.to_prepare { cleaned = true }
43-
end
44-
45-
assert_deprecated do
46-
ActionDispatch::Reloader.prepare!
47-
end
48-
assert prepared
49-
50-
assert_deprecated do
51-
ActionDispatch::Reloader.cleanup!
52-
end
53-
assert cleaned
54-
end
55-
5638
private
5739

5840
def dispatch(&block)
+46-83
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,11 @@
11
require "abstract_unit"
22

33
class ReloaderTest < ActiveSupport::TestCase
4-
Reloader = ActionDispatch::Reloader
5-
64
teardown do
75
ActiveSupport::Reloader.reset_callbacks :prepare
86
ActiveSupport::Reloader.reset_callbacks :complete
97
end
108

11-
def test_prepare_callbacks
12-
a = b = c = nil
13-
assert_deprecated do
14-
Reloader.to_prepare { |*args| a = b = c = 1 }
15-
Reloader.to_prepare { |*args| b = c = 2 }
16-
Reloader.to_prepare { |*args| c = 3 }
17-
end
18-
19-
# Ensure to_prepare callbacks are not run when defined
20-
assert_nil a || b || c
21-
22-
# Run callbacks
23-
call_and_return_body
24-
25-
assert_equal 1, a
26-
assert_equal 2, b
27-
assert_equal 3, c
28-
end
29-
309
class MyBody < Array
3110
def initialize(&block)
3211
@on_close = block
@@ -45,6 +24,23 @@ def close
4524
end
4625
end
4726

27+
def test_prepare_callbacks
28+
a = b = c = nil
29+
reloader.to_prepare { |*args| a = b = c = 1 }
30+
reloader.to_prepare { |*args| b = c = 2 }
31+
reloader.to_prepare { |*args| c = 3 }
32+
33+
# Ensure to_prepare callbacks are not run when defined
34+
assert_nil a || b || c
35+
36+
# Run callbacks
37+
call_and_return_body
38+
39+
assert_equal 1, a
40+
assert_equal 2, b
41+
assert_equal 3, c
42+
end
43+
4844
def test_returned_body_object_always_responds_to_close
4945
body = call_and_return_body
5046
assert_respond_to body, :close
@@ -62,15 +58,12 @@ def test_returned_body_object_always_responds_to_close_even_if_called_twice
6258

6359
def test_condition_specifies_when_to_reload
6460
i, j = 0, 0, 0, 0
65-
assert_deprecated do
66-
Reloader.to_prepare { |*args| i += 1 }
67-
Reloader.to_cleanup { |*args| j += 1 }
68-
end
6961

70-
x = Class.new(ActiveSupport::Reloader)
71-
x.check = lambda { i < 3 }
62+
reloader = reloader(lambda { i < 3 })
63+
reloader.to_prepare { |*args| i += 1 }
64+
reloader.to_complete { |*args| j += 1 }
7265

73-
app = Reloader.new(lambda { |env| [200, {}, []] }, x)
66+
app = middleware(lambda { |env| [200, {}, []] }, reloader)
7467
5.times do
7568
resp = app.call({})
7669
resp[2].close
@@ -115,24 +108,20 @@ def test_returned_body_object_responds_to_all_methods_supported_by_underlying_ob
115108
assert_respond_to body, :bar
116109
end
117110

118-
def test_cleanup_callbacks_are_called_when_body_is_closed
119-
cleaned = false
120-
assert_deprecated do
121-
Reloader.to_cleanup { cleaned = true }
122-
end
111+
def test_complete_callbacks_are_called_when_body_is_closed
112+
completed = false
113+
reloader.to_complete { completed = true }
123114

124115
body = call_and_return_body
125-
assert !cleaned
116+
assert !completed
126117

127118
body.close
128-
assert cleaned
119+
assert completed
129120
end
130121

131122
def test_prepare_callbacks_arent_called_when_body_is_closed
132123
prepared = false
133-
assert_deprecated do
134-
Reloader.to_prepare { prepared = true }
135-
end
124+
reloader.to_prepare { prepared = true }
136125

137126
body = call_and_return_body
138127
prepared = false
@@ -141,45 +130,9 @@ def test_prepare_callbacks_arent_called_when_body_is_closed
141130
assert !prepared
142131
end
143132

144-
def test_manual_reloading
145-
prepared = cleaned = false
146-
assert_deprecated do
147-
Reloader.to_prepare { prepared = true }
148-
Reloader.to_cleanup { cleaned = true }
149-
end
150-
151-
assert_deprecated do
152-
Reloader.prepare!
153-
end
154-
assert prepared
155-
assert !cleaned
156-
157-
prepared = cleaned = false
158-
assert_deprecated do
159-
Reloader.cleanup!
160-
end
161-
assert prepared
162-
assert cleaned
163-
end
164-
165-
def test_prepend_prepare_callback
166-
i = 10
167-
assert_deprecated do
168-
Reloader.to_prepare { i += 1 }
169-
Reloader.to_prepare(prepend: true) { i = 0 }
170-
end
171-
172-
assert_deprecated do
173-
Reloader.prepare!
174-
end
175-
assert_equal 1, i
176-
end
177-
178-
def test_cleanup_callbacks_are_called_on_exceptions
179-
cleaned = false
180-
assert_deprecated do
181-
Reloader.to_cleanup { cleaned = true }
182-
end
133+
def test_complete_callbacks_are_called_on_exceptions
134+
completed = false
135+
reloader.to_complete { completed = true }
183136

184137
begin
185138
call_and_return_body do
@@ -188,16 +141,26 @@ def test_cleanup_callbacks_are_called_on_exceptions
188141
rescue
189142
end
190143

191-
assert cleaned
144+
assert completed
192145
end
193146

194147
private
195148
def call_and_return_body(&block)
196-
x = Class.new(ActiveSupport::Reloader)
197-
x.check = lambda { true }
149+
app = middleware(block || proc { [200, {}, "response"] })
150+
_, _, body = app.call("rack.input" => StringIO.new(""))
151+
body
152+
end
153+
154+
def middleware(inner_app, reloader = reloader())
155+
ActionDispatch::Reloader.new(inner_app, reloader)
156+
end
157+
158+
def reloader(check = lambda { true })
159+
@reloader ||= begin
160+
reloader = Class.new(ActiveSupport::Reloader)
161+
reloader.check = check
162+
reloader
163+
end
198164

199-
@response ||= "response"
200-
@reloader ||= Reloader.new(block || proc { [200, {}, @response] }, x)
201-
@reloader.call("rack.input" => StringIO.new(""))[2]
202165
end
203166
end

activesupport/test/reloader_test.rb

+13-1
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22

33
class ReloaderTest < ActiveSupport::TestCase
44
def test_prepare_callback
5-
prepared = false
5+
prepared = completed = false
66
reloader.to_prepare { prepared = true }
7+
reloader.to_complete { completed = true }
78

89
assert !prepared
10+
assert !completed
911
reloader.prepare!
1012
assert prepared
13+
assert !completed
1114

1215
prepared = false
1316
reloader.wrap do
@@ -17,6 +20,15 @@ def test_prepare_callback
1720
assert !prepared
1821
end
1922

23+
def test_prepend_prepare_callback
24+
i = 10
25+
reloader.to_prepare { i += 1 }
26+
reloader.to_prepare(prepend: true) { i = 0 }
27+
28+
reloader.prepare!
29+
assert_equal 1, i
30+
end
31+
2032
def test_only_run_when_check_passes
2133
r = new_reloader { true }
2234
invoked = false

0 commit comments

Comments
 (0)