diff --git a/railties/CHANGELOG b/railties/CHANGELOG index c624a1b41a..39b61a186e 100644 --- a/railties/CHANGELOG +++ b/railties/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Support multiple config.after_initialize blocks so plugins and apps can more easily cooperate. #9582 [zdennis] + * Added db:drop:all to drop all databases declared in config/database.yml [DHH] * Use attribute pairs instead of the migration name to create add and remove column migrations. Closes #9166 [lifofifo] diff --git a/railties/lib/initializer.rb b/railties/lib/initializer.rb index d55352d6a2..4339c4b996 100644 --- a/railties/lib/initializer.rb +++ b/railties/lib/initializer.rb @@ -325,7 +325,9 @@ module Rails # Fires the user-supplied after_initialize block (Configuration#after_initialize) def after_initialize - configuration.after_initialize_block.call if configuration.after_initialize_block + configuration.after_initialize_blocks.each do |block| + block.call + end end def load_application_initializers @@ -515,16 +517,16 @@ module Rails ::RAILS_ENV end - # Sets a block which will be executed after rails has been fully initialized. + # Adds a block which will be executed after rails has been fully initialized. # Useful for per-environment configuration which depends on the framework being # fully initialized. def after_initialize(&after_initialize_block) - @after_initialize_block = after_initialize_block + after_initialize_blocks << after_initialize_block if after_initialize_block end - # Returns the block set in Configuration#after_initialize - def after_initialize_block - @after_initialize_block + # Returns the blocks added with Configuration#after_initialize + def after_initialize_blocks + @after_initialize_blocks ||= [] end # Add a preparation callback that will run before every request in development diff --git a/railties/test/initializer_test.rb b/railties/test/initializer_test.rb index cf333e878e..c474f0bc05 100644 --- a/railties/test/initializer_test.rb +++ b/railties/test/initializer_test.rb @@ -1,15 +1,16 @@ require "#{File.dirname(__FILE__)}/abstract_unit" require 'initializer' -class InitializerTest < Test::Unit::TestCase - class ConfigurationMock < Rails::Configuration - attr_reader :environment_path +class ConfigurationMock < Rails::Configuration + attr_reader :environment_path - def initialize(envpath) - super() - @environment_path = envpath - end + def initialize(envpath) + super() + @environment_path = envpath end +end + +class Initializer_load_environment_Test < Test::Unit::TestCase def test_load_environment_with_constant config = ConfigurationMock.new("#{File.dirname(__FILE__)}/fixtures/environment_with_constant.rb") @@ -19,4 +20,65 @@ class InitializerTest < Test::Unit::TestCase ensure $initialize_test_set_from_env = nil end + +end + +class Initializer_after_initialize_with_blocks_environment_Test < Test::Unit::TestCase + def setup + config = ConfigurationMock.new("") + config.after_initialize do + $test_after_initialize_block1 = "success" + end + config.after_initialize do + $test_after_initialize_block2 = "congratulations" + end + assert_nil $test_after_initialize_block1 + assert_nil $test_after_initialize_block2 + + Rails::Initializer.run(:after_initialize, config) + end + + def teardown + $test_after_initialize_block1 = nil + $test_after_initialize_block2 = nil + end + + def test_should_have_called_the_first_after_initialize_block + assert_equal "success", $test_after_initialize_block1 + end + + def test_should_have_called_the_second_after_initialize_block + assert_equal "congratulations", $test_after_initialize_block2 + end +end + +class Initializer_after_initialize_with_no_block_environment_Test < Test::Unit::TestCase + + def setup + config = ConfigurationMock.new("") + config.after_initialize do + $test_after_initialize_block1 = "success" + end + config.after_initialize # don't pass a block, this is what we're testing! + config.after_initialize do + $test_after_initialize_block2 = "congratulations" + end + assert_nil $test_after_initialize_block1 + + Rails::Initializer.run(:after_initialize, config) + end + + def teardown + $test_after_initialize_block1 = nil + $test_after_initialize_block2 = nil + end + + def test_should_have_called_the_first_after_initialize_block + assert_equal "success", $test_after_initialize_block1, "should still get set" + end + + def test_should_have_called_the_first_after_initialize_block + assert_equal "congratulations", $test_after_initialize_block2 + end + end