From 3afdfc35e8aec7e6379e093dd1278cb3de54f21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Sun, 16 May 2010 00:34:54 +0200 Subject: Expose remaining hooks to minimize the need for a Railtie based on feedback from plugin developers. --- railties/lib/rails/application.rb | 1 - railties/lib/rails/application/finisher.rb | 1 + railties/lib/rails/railtie/configuration.rb | 12 +++ .../test/application/initializers/hooks_test.rb | 86 ++++++++++++++++++++++ .../application/initializers/initializers_test.rb | 68 ----------------- 5 files changed, 99 insertions(+), 69 deletions(-) create mode 100644 railties/test/application/initializers/hooks_test.rb delete mode 100644 railties/test/application/initializers/initializers_test.rb diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb index 9e18dccf69..a3b3a56bc8 100644 --- a/railties/lib/rails/application.rb +++ b/railties/lib/rails/application.rb @@ -69,7 +69,6 @@ module Rails raise "You cannot have more than one Rails::Application" if Rails.application super Rails.application = base.instance - ActiveSupport.run_load_hooks(:before_configuration, base.instance) end diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb index 9d04f1ce38..fbab4d5515 100644 --- a/railties/lib/rails/application/finisher.rb +++ b/railties/lib/rails/application/finisher.rb @@ -37,6 +37,7 @@ module Rails initializer :eager_load! do if config.cache_classes && !$rails_rake_task + ActiveSupport.run_load_hooks(:before_eager_load, self) railties.all(&:eager_load!) end end diff --git a/railties/lib/rails/railtie/configuration.rb b/railties/lib/rails/railtie/configuration.rb index f57d82a3d8..c4a315708b 100644 --- a/railties/lib/rails/railtie/configuration.rb +++ b/railties/lib/rails/railtie/configuration.rb @@ -68,6 +68,18 @@ module Rails end end + def before_configuration(&block) + ActiveSupport.on_load(:before_configuration, :yield => true, &block) + end + + def before_eager_load(&block) + ActiveSupport.on_load(:before_eager_load, :yield => true, &block) + end + + def before_initialize(&block) + ActiveSupport.on_load(:before_initialize, :yield => true, &block) + end + def after_initialize(&block) ActiveSupport.on_load(:after_initialize, :yield => true, &block) end diff --git a/railties/test/application/initializers/hooks_test.rb b/railties/test/application/initializers/hooks_test.rb new file mode 100644 index 0000000000..1316bf6ee2 --- /dev/null +++ b/railties/test/application/initializers/hooks_test.rb @@ -0,0 +1,86 @@ +require "isolation/abstract_unit" + +module ApplicationTests + class InitializersTest < Test::Unit::TestCase + include ActiveSupport::Testing::Isolation + + def setup + build_app + boot_rails + FileUtils.rm_rf "#{app_path}/config/environments" + end + + test "load initializers" do + app_file "config/initializers/foo.rb", "$foo = true" + require "#{app_path}/config/environment" + assert $foo + end + + test "hooks block works correctly without cache classes (before_eager_load is not called)" do + add_to_config <<-RUBY + $initialization_callbacks = [] + config.root = "#{app_path}" + config.cache_classes = false + config.before_configuration { $initialization_callbacks << 1 } + config.before_initialize { $initialization_callbacks << 2 } + config.before_eager_load { Boom } + config.after_initialize { $initialization_callbacks << 3 } + RUBY + + require "#{app_path}/config/environment" + assert_equal [1,2,3], $initialization_callbacks + end + + test "hooks block works correctly with cache classes" do + add_to_config <<-RUBY + $initialization_callbacks = [] + config.root = "#{app_path}" + config.cache_classes = true + config.before_configuration { $initialization_callbacks << 1 } + config.before_initialize { $initialization_callbacks << 2 } + config.before_eager_load { $initialization_callbacks << 3 } + config.after_initialize { $initialization_callbacks << 4 } + RUBY + + require "#{app_path}/config/environment" + assert_equal [1,2,3,4], $initialization_callbacks + end + + test "after_initialize runs after frameworks have been initialized" do + $activerecord_configurations = nil + add_to_config <<-RUBY + config.after_initialize { $activerecord_configurations = ActiveRecord::Base.configurations } + RUBY + + require "#{app_path}/config/environment" + assert $activerecord_configurations + assert $activerecord_configurations['development'] + end + + test "after_initialize happens after to_prepare in development" do + $order = [] + add_to_config <<-RUBY + config.cache_classes = false + config.after_initialize { $order << :after_initialize } + config.to_prepare { $order << :to_prepare } + RUBY + + require "#{app_path}/config/environment" + assert [:to_prepare, :after_initialize], $order + end + + test "after_initialize happens after to_prepare in production" do + $order = [] + add_to_config <<-RUBY + config.cache_classes = true + config.after_initialize { $order << :after_initialize } + config.to_prepare { $order << :to_prepare } + RUBY + + require "#{app_path}/config/application" + Rails.env.replace "production" + require "#{app_path}/config/environment" + assert [:to_prepare, :after_initialize], $order + end + end +end diff --git a/railties/test/application/initializers/initializers_test.rb b/railties/test/application/initializers/initializers_test.rb deleted file mode 100644 index eca42dada6..0000000000 --- a/railties/test/application/initializers/initializers_test.rb +++ /dev/null @@ -1,68 +0,0 @@ -require "isolation/abstract_unit" - -module ApplicationTests - class InitializersTest < Test::Unit::TestCase - include ActiveSupport::Testing::Isolation - - def setup - build_app - boot_rails - FileUtils.rm_rf "#{app_path}/config/environments" - end - - test "load initializers" do - app_file "config/initializers/foo.rb", "$foo = true" - require "#{app_path}/config/environment" - assert $foo - end - - test "after_initialize block works correctly" do - add_to_config <<-RUBY - config.root = "#{app_path}" - config.after_initialize { $test_after_initialize_block1 = "success" } - config.after_initialize { $test_after_initialize_block2 = "congratulations" } - RUBY - require "#{app_path}/config/environment" - - assert_equal "success", $test_after_initialize_block1 - assert_equal "congratulations", $test_after_initialize_block2 - end - - test "after_initialize runs after frameworks have been initialized" do - $activerecord_configurations = nil - add_to_config <<-RUBY - config.after_initialize { $activerecord_configurations = ActiveRecord::Base.configurations } - RUBY - - require "#{app_path}/config/environment" - assert $activerecord_configurations - assert $activerecord_configurations['development'] - end - - test "after_initialize happens after to_prepare in development" do - $order = [] - add_to_config <<-RUBY - config.cache_classes = false - config.after_initialize { $order << :after_initialize } - config.to_prepare { $order << :to_prepare } - RUBY - - require "#{app_path}/config/environment" - assert [:to_prepare, :after_initialize], $order - end - - test "after_initialize happens after to_prepare in production" do - $order = [] - add_to_config <<-RUBY - config.cache_classes = true - config.after_initialize { $order << :after_initialize } - config.to_prepare { $order << :to_prepare } - RUBY - - require "#{app_path}/config/application" - Rails.env.replace "production" - require "#{app_path}/config/environment" - assert [:to_prepare, :after_initialize], $order - end - end -end -- cgit v1.2.3