Allow reloader to be configured.

This commit is contained in:
José Valim
2011-12-12 19:23:13 +01:00
parent 9a51053c1d
commit ede647a505
2 changed files with 51 additions and 14 deletions

View File

@@ -43,34 +43,58 @@ module ActionDispatch
# Execute all prepare callbacks.
def self.prepare!
new(nil).run_callbacks :prepare
new(nil).prepare!
end
# Execute all cleanup callbacks.
def self.cleanup!
new(nil).run_callbacks :cleanup
new(nil).cleanup!
end
def initialize(app)
def initialize(app, condition=nil)
@app = app
end
module CleanupOnClose
def close
super if defined?(super)
ensure
ActionDispatch::Reloader.cleanup!
end
@condition = condition || lambda { true }
@validated = true
end
def call(env)
run_callbacks :prepare
@validated = @condition.call
prepare!
response = @app.call(env)
response[2].extend(CleanupOnClose)
response[2].extend(module_hook)
response
rescue Exception
run_callbacks :cleanup
cleanup!
raise
end
def prepare! #:nodoc:
run_callbacks :prepare if validated?
end
def cleanup! #:nodoc:
run_callbacks :cleanup if validated?
ensure
@validated = true
end
private
def validated? #:nodoc:
@validated
end
def module_hook #:nodoc:
middleware = self
Module.new do
define_method :close do
begin
super() if defined?(super)
ensure
middleware.cleanup!
end
end
end
end
end
end

View File

@@ -43,6 +43,19 @@ class ReloaderTest < Test::Unit::TestCase
assert_respond_to body, :close
end
def test_condition_specifies_when_to_reload
i, j = 0, 0, 0, 0
Reloader.to_prepare { |*args| i += 1 }
Reloader.to_cleanup { |*args| j += 1 }
app = Reloader.new(lambda { |env| [200, {}, []] }, lambda { i < 3 })
5.times do
resp = app.call({})
resp[2].close
end
assert_equal 3, i
assert_equal 3, j
end
def test_returned_body_object_behaves_like_underlying_object
body = call_and_return_body do
b = MyBody.new