diff options
author | José Valim <jose.valim@gmail.com> | 2012-03-06 22:04:53 +0100 |
---|---|---|
committer | Santiago Pastorino <santiago@wyeworks.com> | 2012-03-17 17:21:02 -0300 |
commit | c0a5b8505d0fa9095cbee8b709f9aadf630a3716 (patch) | |
tree | 2ed6114ec71d3abd5fd335850ec099a66383de56 | |
parent | e5b46cfb6d2a4055fa25d3d3188a40cc86988b3e (diff) | |
download | rails-c0a5b8505d0fa9095cbee8b709f9aadf630a3716.tar.gz rails-c0a5b8505d0fa9095cbee8b709f9aadf630a3716.tar.bz2 rails-c0a5b8505d0fa9095cbee8b709f9aadf630a3716.zip |
Ensure load hooks can be called more than once with different contexts.
-rw-r--r-- | activesupport/lib/active_support/lazy_load_hooks.rb | 12 | ||||
-rw-r--r-- | activesupport/test/lazy_load_hooks_test.rb | 29 |
2 files changed, 35 insertions, 6 deletions
diff --git a/activesupport/lib/active_support/lazy_load_hooks.rb b/activesupport/lib/active_support/lazy_load_hooks.rb index 82507c1e03..182d2b793d 100644 --- a/activesupport/lib/active_support/lazy_load_hooks.rb +++ b/activesupport/lib/active_support/lazy_load_hooks.rb @@ -18,15 +18,15 @@ # ActiveSupport.run_load_hooks(:active_record, ActiveRecord::Base) # module ActiveSupport - @load_hooks = Hash.new {|h,k| h[k] = [] } - @loaded = {} + @load_hooks = Hash.new { |h,k| h[k] = [] } + @loaded = Hash.new { |h,k| h[k] = [] } def self.on_load(name, options = {}, &block) - if base = @loaded[name] + @loaded[name].each do |base| execute_hook(base, options, block) - else - @load_hooks[name] << [block, options] end + + @load_hooks[name] << [block, options] end def self.execute_hook(base, options, block) @@ -38,7 +38,7 @@ module ActiveSupport end def self.run_load_hooks(name, base = Object) - @loaded[name] = base + @loaded[name] << base @load_hooks[name].each do |hook, options| execute_hook(base, options, hook) end diff --git a/activesupport/test/lazy_load_hooks_test.rb b/activesupport/test/lazy_load_hooks_test.rb index 58ccc14324..7851634dbf 100644 --- a/activesupport/test/lazy_load_hooks_test.rb +++ b/activesupport/test/lazy_load_hooks_test.rb @@ -8,6 +8,16 @@ class LazyLoadHooksTest < ActiveSupport::TestCase assert_equal 1, i end + def test_basic_hook_with_two_registrations + i = 0 + ActiveSupport.on_load(:basic_hook_with_two) { i += incr } + assert_equal 0, i + ActiveSupport.run_load_hooks(:basic_hook_with_two, FakeContext.new(2)) + assert_equal 2, i + ActiveSupport.run_load_hooks(:basic_hook_with_two, FakeContext.new(5)) + assert_equal 7, i + end + def test_hook_registered_after_run i = 0 ActiveSupport.run_load_hooks(:registered_after) @@ -16,6 +26,25 @@ class LazyLoadHooksTest < ActiveSupport::TestCase assert_equal 1, i end + def test_hook_registered_after_run_with_two_registrations + i = 0 + ActiveSupport.run_load_hooks(:registered_after_with_two, FakeContext.new(2)) + ActiveSupport.run_load_hooks(:registered_after_with_two, FakeContext.new(5)) + assert_equal 0, i + ActiveSupport.on_load(:registered_after_with_two) { i += incr } + assert_equal 7, i + end + + def test_hook_registered_interleaved_run_with_two_registrations + i = 0 + ActiveSupport.run_load_hooks(:registered_interleaved_with_two, FakeContext.new(2)) + assert_equal 0, i + ActiveSupport.on_load(:registered_interleaved_with_two) { i += incr } + assert_equal 2, i + ActiveSupport.run_load_hooks(:registered_interleaved_with_two, FakeContext.new(5)) + assert_equal 7, i + end + def test_hook_receives_a_context i = 0 ActiveSupport.on_load(:contextual) { i += incr } |