Namespace
Methods
T
Constants
Reloader = ActionDispatch::Reloader
 

ActionDispatch::Reloader provides prepare and cleanup callbacks, intended to assist with code reloading during development.

Prepare callbacks are run before each request, and cleanup callbacks after each request. In this respect they are analogs of ActionDispatch::Callback's before and after callbacks. However, cleanup callbacks are not called until the request is fully complete – that is, after close has been called on the response body. This is important for streaming responses such as the following:

self.response_body = -> (response, output) do
  # code here which refers to application models
end

Cleanup callbacks will not be called until after the response_body lambda is evaluated, ensuring that it can refer to application models and other classes before they are unloaded.

By default, ActionDispatch::Reloader is included in the middleware stack only in the development environment; specifically, when config.cache_classes is false. Callbacks may be registered even when it is not included in the middleware stack, but are executed only when ActionDispatch::Reloader.prepare! or ActionDispatch::Reloader.cleanup! are called manually.

Instance Public methods
test_class_unload_block()
# File activesupport/test/reloader_test.rb, line 60
def test_class_unload_block
  called = []
  reloader.before_class_unload { called << :before_unload }
  reloader.after_class_unload { called << :after_unload }
  reloader.to_run do
    class_unload! do
      called << :unload
    end
  end
  reloader.wrap { called << :body }

  assert_equal [:before_unload, :unload, :after_unload, :body], called
end
test_cleanup_callbacks_are_called_on_exceptions()
# File actionpack/test/dispatch/reloader_test.rb, line 178
def test_cleanup_callbacks_are_called_on_exceptions
  cleaned = false
  assert_deprecated do
    Reloader.to_cleanup { cleaned  = true }
  end

  begin
    call_and_return_body do
      raise "error"
    end
  rescue
  end

  assert cleaned
end
test_cleanup_callbacks_are_called_when_body_is_closed()
# File actionpack/test/dispatch/reloader_test.rb, line 118
def test_cleanup_callbacks_are_called_when_body_is_closed
  cleaned = false
  assert_deprecated do
    Reloader.to_cleanup { cleaned = true }
  end

  body = call_and_return_body
  assert !cleaned

  body.close
  assert cleaned
end
test_condition_specifies_when_to_reload()
# File actionpack/test/dispatch/reloader_test.rb, line 63
def test_condition_specifies_when_to_reload
  i, j = 0, 0, 0, 0
  assert_deprecated do
    Reloader.to_prepare { |*args| i += 1 }
    Reloader.to_cleanup { |*args| j += 1 }
  end

  x = Class.new(ActiveSupport::Reloader)
  x.check = lambda { i < 3 }

  app = Reloader.new(lambda { |env| [200, {}, []] }, x)
  5.times do
    resp = app.call({})
    resp[2].close
  end
  assert_equal 3, i
  assert_equal 3, j
end
test_full_reload_sequence()
# File activesupport/test/reloader_test.rb, line 34
def test_full_reload_sequence
  called = []
  reloader.to_prepare { called << :prepare }
  reloader.to_run { called << :reloader_run }
  reloader.to_complete { called << :reloader_complete }
  reloader.executor.to_run { called << :executor_run }
  reloader.executor.to_complete { called << :executor_complete }

  reloader.wrap { }
  assert_equal [:executor_run, :reloader_run, :prepare, :reloader_complete, :executor_complete], called

  called = []
  reloader.reload!
  assert_equal [:executor_run, :reloader_run, :prepare, :reloader_complete, :executor_complete, :prepare], called

  reloader.check = lambda { false }

  called = []
  reloader.wrap { }
  assert_equal [:executor_run, :executor_complete], called

  called = []
  reloader.reload!
  assert_equal [:executor_run, :reloader_run, :prepare, :reloader_complete, :executor_complete, :prepare], called
end
test_it_calls_close_on_underlying_object_when_close_is_called_on_body()
# File actionpack/test/dispatch/reloader_test.rb, line 96
def test_it_calls_close_on_underlying_object_when_close_is_called_on_body
  close_called = false
  body = call_and_return_body do
    b = MyBody.new do
      close_called = true
    end
    [200, { "Content-Type" => "text/html" }, b]
  end
  body.close
  assert close_called
end
test_manual_reloading()
# File actionpack/test/dispatch/reloader_test.rb, line 144
def test_manual_reloading
  prepared = cleaned = false
  assert_deprecated do
    Reloader.to_prepare { prepared = true }
    Reloader.to_cleanup { cleaned  = true }
  end

  assert_deprecated do
    Reloader.prepare!
  end
  assert prepared
  assert !cleaned

  prepared = cleaned = false
  assert_deprecated do
    Reloader.cleanup!
  end
  assert prepared
  assert cleaned
end
test_only_run_when_check_passes()
# File activesupport/test/reloader_test.rb, line 20
def test_only_run_when_check_passes
  r = new_reloader { true }
  invoked = false
  r.to_run { invoked = true }
  r.wrap { }
  assert invoked

  r = new_reloader { false }
  invoked = false
  r.to_run { invoked = true }
  r.wrap { }
  assert !invoked
end
test_prepare_callback()
# File activesupport/test/reloader_test.rb, line 4
def test_prepare_callback
  prepared = false
  reloader.to_prepare { prepared = true }

  assert !prepared
  reloader.prepare!
  assert prepared

  prepared = false
  reloader.wrap do
    assert prepared
    prepared = false
  end
  assert !prepared
end
test_prepare_callbacks()
# File actionpack/test/dispatch/reloader_test.rb, line 11
def test_prepare_callbacks
  a = b = c = nil
  assert_deprecated do
    Reloader.to_prepare { |*args| a = b = c = 1 }
    Reloader.to_prepare { |*args| b = c = 2 }
    Reloader.to_prepare { |*args| c = 3 }
  end

  # Ensure to_prepare callbacks are not run when defined
  assert_nil a || b || c

  # Run callbacks
  call_and_return_body

  assert_equal 1, a
  assert_equal 2, b
  assert_equal 3, c
end
test_prepare_callbacks_arent_called_when_body_is_closed()
# File actionpack/test/dispatch/reloader_test.rb, line 131
def test_prepare_callbacks_arent_called_when_body_is_closed
  prepared = false
  assert_deprecated do
    Reloader.to_prepare { prepared = true }
  end

  body = call_and_return_body
  prepared = false

  body.close
  assert !prepared
end
test_prepend_prepare_callback()
# File actionpack/test/dispatch/reloader_test.rb, line 165
def test_prepend_prepare_callback
  i = 10
  assert_deprecated do
    Reloader.to_prepare { i += 1 }
    Reloader.to_prepare(:prepend => true) { i = 0 }
  end

  assert_deprecated do
    Reloader.prepare!
  end
  assert_equal 1, i
end
test_returned_body_object_always_responds_to_close()
# File actionpack/test/dispatch/reloader_test.rb, line 48
def test_returned_body_object_always_responds_to_close
  body = call_and_return_body
  assert_respond_to body, :close
end
test_returned_body_object_always_responds_to_close_even_if_called_twice()
# File actionpack/test/dispatch/reloader_test.rb, line 53
def test_returned_body_object_always_responds_to_close_even_if_called_twice
  body = call_and_return_body
  assert_respond_to body, :close
  body.close

  body = call_and_return_body
  assert_respond_to body, :close
  body.close
end
test_returned_body_object_behaves_like_underlying_object()
# File actionpack/test/dispatch/reloader_test.rb, line 82
def test_returned_body_object_behaves_like_underlying_object
  body = call_and_return_body do
    b = MyBody.new
    b << "hello"
    b << "world"
    [200, { "Content-Type" => "text/html" }, b]
  end
  assert_equal 2, body.size
  assert_equal "hello", body[0]
  assert_equal "world", body[1]
  assert_equal "foo", body.foo
  assert_equal "bar", body.bar
end
test_returned_body_object_responds_to_all_methods_supported_by_underlying_object()
# File actionpack/test/dispatch/reloader_test.rb, line 108
def test_returned_body_object_responds_to_all_methods_supported_by_underlying_object
  body = call_and_return_body do
    [200, { "Content-Type" => "text/html" }, MyBody.new]
  end
  assert_respond_to body, :size
  assert_respond_to body, :each
  assert_respond_to body, :foo
  assert_respond_to body, :bar
end