提交 f1966337 编写于 作者: A Andrew White 提交者: Xavier Noria

Add before_remove_const callback to ActiveSupport::Dependencies.remove_unloadable_constants!

Signed-off-by: NXavier Noria <fxn@hashref.com>
上级 2ce57fd0
*Rails 3.1.0 (unreleased)*
* No changes
* Added before_remove_const callback to ActiveSupport::Dependencies.remove_unloadable_constants! [Andrew White]
*Rails 3.0.0 (August 29, 2010)*
......
......@@ -511,7 +511,12 @@ def load_missing_constant(from_mod, const_name)
end
# Remove the constants that have been autoloaded, and those that have been
# marked for unloading.
# marked for unloading. Before each constant is removed a callback is sent
# to its class/module if it implements +before_remove_const+.
#
# The callback implementation should be restricted to cleaning up caches, etc.
# as the enviroment will be in an inconsistent state, e.g. other constants
# may have already been unloaded and not accessible.
def remove_unloadable_constants!
autoloaded_constants.each { |const| remove_constant const }
autoloaded_constants.clear
......@@ -636,6 +641,7 @@ def remove_constant(const) #:nodoc:
parent = Inflector.constantize(names * '::')
log "removing constant #{const}"
constantize(const).before_remove_const if constantize(const).respond_to?(:before_remove_const)
parent.instance_eval { remove_const to_remove }
return true
......
......@@ -574,6 +574,17 @@ def test_unloadable_should_return_change_flag
end
end
def test_unloadable_constants_should_receive_callback
Object.const_set :C, Class.new
C.unloadable
C.expects(:before_remove_const).once
assert C.respond_to?(:before_remove_const)
ActiveSupport::Dependencies.clear
assert !defined?(C)
ensure
Object.class_eval { remove_const :C } if defined?(C)
end
def test_new_contants_in_without_constants
assert_equal [], (ActiveSupport::Dependencies.new_constants_in(Object) { })
assert ActiveSupport::Dependencies.constant_watch_stack.all? {|k,v| v.empty? }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册