From a5684dfa3c16472bfa5d5d861ba78cb6dbadcb59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 18 Feb 2010 18:39:39 +0100 Subject: Ensure config.after_initializer is executed before building the middleware stack. --- railties/lib/rails/application/finisher.rb | 10 ++++++---- railties/lib/rails/engine.rb | 1 + .../test/application/initializers/initializers_test.rb | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb index b722679ec2..afa79cad1c 100644 --- a/railties/lib/rails/application/finisher.rb +++ b/railties/lib/rails/application/finisher.rb @@ -27,17 +27,19 @@ module Rails end end - initializer :build_middleware_stack do - app - end - # Fires the user-supplied after_initialize block (config.after_initialize) + # Should run before the middleware stack is built, because building the + # middleware already fires to_prepare callbacks in test and production. initializer :after_initialize do config.after_initialize_blocks.each do |block| block.call(self) end end + initializer :build_middleware_stack do + app + end + # Disable dependency loading during request cycle initializer :disable_dependency_loading do if config.cache_classes && !config.dependency_loading diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index a158bb7b70..efa11b466a 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -15,6 +15,7 @@ module Rails def inherited(base) unless abstract_railtie?(base) base.called_from = begin + # Remove the line number from backtraces making sure we don't leave anything behind call_stack = caller.map { |p| p.split(':')[0..-2].join(':') } File.dirname(call_stack.detect { |p| p !~ %r[railties[\w\-]*/lib/rails|rack[\w\-]*/lib/rack] }) end diff --git a/railties/test/application/initializers/initializers_test.rb b/railties/test/application/initializers/initializers_test.rb index 0c3de7ce33..a6d37b15f1 100644 --- a/railties/test/application/initializers/initializers_test.rb +++ b/railties/test/application/initializers/initializers_test.rb @@ -51,5 +51,19 @@ module ApplicationTests assert $activerecord_configurations assert $activerecord_configurations['development'] end + + test "after_initialize happens before to_prepare (i.e. before the middleware stack is built) on production" do + $order = [] + add_to_config <<-RUBY + 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 [:after_initialize, :to_prepare], $order + end + end end -- cgit v1.2.3