aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--railties/CHANGELOG2
-rw-r--r--railties/lib/initializer.rb14
-rw-r--r--railties/test/initializer_test.rb76
3 files changed, 79 insertions, 13 deletions
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