aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-01-24 14:48:00 +0100
committerJosé Valim <jose.valim@gmail.com>2010-01-24 14:48:00 +0100
commit84ebfa4550b2325c6c89bc13aa6f904ff88d0db7 (patch)
tree7328c06394e114903a57aea89b94411986e9eaf1
parentdd05b6c543f48050f494214da7803da6f5655292 (diff)
downloadrails-84ebfa4550b2325c6c89bc13aa6f904ff88d0db7.tar.gz
rails-84ebfa4550b2325c6c89bc13aa6f904ff88d0db7.tar.bz2
rails-84ebfa4550b2325c6c89bc13aa6f904ff88d0db7.zip
Ensure metals and initializers in plugins are loaded.
-rw-r--r--actionpack/lib/action_dispatch/railtie.rb3
-rw-r--r--railties/lib/generators/rails/metal/templates/metal.rb2
-rw-r--r--railties/lib/rails/application/finisher.rb2
-rw-r--r--railties/lib/rails/application/routes_reloader.rb14
-rw-r--r--railties/lib/rails/configuration.rb2
-rw-r--r--railties/lib/rails/engine.rb18
-rw-r--r--railties/lib/rails/engine/configuration.rb2
-rw-r--r--railties/lib/rails/rack/metal.rb29
-rw-r--r--railties/test/initializer/path_test.rb4
-rw-r--r--railties/test/plugins/vendored_test.rb28
10 files changed, 75 insertions, 29 deletions
diff --git a/actionpack/lib/action_dispatch/railtie.rb b/actionpack/lib/action_dispatch/railtie.rb
index 979679712a..335daafc01 100644
--- a/actionpack/lib/action_dispatch/railtie.rb
+++ b/actionpack/lib/action_dispatch/railtie.rb
@@ -5,9 +5,6 @@ module ActionDispatch
class Railtie < Rails::Railtie
railtie_name :action_dispatch
- # Initialize route files to an array
- config.action_dispatch.route_paths = []
-
# Prepare dispatcher callbacks and run 'prepare' callbacks
initializer "action_dispatch.prepare_dispatcher" do |app|
# TODO: This used to say unless defined?(Dispatcher). Find out why and fix.
diff --git a/railties/lib/generators/rails/metal/templates/metal.rb b/railties/lib/generators/rails/metal/templates/metal.rb
index 2f5d4e7593..8cc3f1f258 100644
--- a/railties/lib/generators/rails/metal/templates/metal.rb
+++ b/railties/lib/generators/rails/metal/templates/metal.rb
@@ -1,5 +1,5 @@
# Allow the metal piece to run in isolation
-require File.expand_path('../../../config/environment', __FILE__)
+require File.expand_path('../../../config/environment', __FILE__) unless defined?(Rails)
class <%= class_name %>
def self.call(env)
diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb
index db19011b7f..6461b76d3d 100644
--- a/railties/lib/rails/application/finisher.rb
+++ b/railties/lib/rails/application/finisher.rb
@@ -17,7 +17,7 @@ module Rails
initializer :add_builtin_route do |app|
if Rails.env.development?
- app.config.action_dispatch.route_paths << File.join(RAILTIES_PATH, 'builtin', 'routes.rb')
+ RoutesReloader.paths << File.join(RAILTIES_PATH, 'builtin', 'routes.rb')
end
end
diff --git a/railties/lib/rails/application/routes_reloader.rb b/railties/lib/rails/application/routes_reloader.rb
index d861d27465..fe0cfb7801 100644
--- a/railties/lib/rails/application/routes_reloader.rb
+++ b/railties/lib/rails/application/routes_reloader.rb
@@ -1,7 +1,11 @@
module Rails
class Application
+ # TODO Write tests for this behavior extracted from Application
class RoutesReloader
- # TODO Write tests for this behavior extracted from Application
+ def self.paths
+ @paths ||= []
+ end
+
def initialize(config)
@config, @last_change_at = config, nil
end
@@ -9,7 +13,7 @@ module Rails
def changed_at
routes_changed_at = nil
- paths.each do |path|
+ self.class.paths.each do |path|
config_changed_at = File.stat(path).mtime
if routes_changed_at.nil? || config_changed_at > routes_changed_at
@@ -25,7 +29,7 @@ module Rails
routes.disable_clear_and_finalize = true
routes.clear!
- paths.each { |path| load(path) }
+ self.class.paths.each { |path| load(path) }
routes.finalize!
nil
@@ -40,10 +44,6 @@ module Rails
reload!
end
end
-
- def paths
- @config.action_dispatch.route_paths
- end
end
end
end \ No newline at end of file
diff --git a/railties/lib/rails/configuration.rb b/railties/lib/rails/configuration.rb
index c29cd0ef2c..3c5c1c1e16 100644
--- a/railties/lib/rails/configuration.rb
+++ b/railties/lib/rails/configuration.rb
@@ -16,7 +16,7 @@ module Rails
middleware.use('::ActionDispatch::Cookies')
middleware.use(lambda { ActionController::Base.session_store }, lambda { ActionController::Base.session_options })
middleware.use('::ActionDispatch::Flash', :if => lambda { ActionController::Base.session_store })
- middleware.use(lambda { Rails::Rack::Metal.new(Rails.application.config.paths.app.metals.to_a, Rails.application.config.metals) })
+ middleware.use(lambda { Rails::Rack::Metal.new(Rails.application.config.metals) })
middleware.use('ActionDispatch::ParamsParser')
middleware.use('::Rack::MethodOverride')
middleware.use('::ActionDispatch::Head')
diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb
index 842785875a..e40052e0f1 100644
--- a/railties/lib/rails/engine.rb
+++ b/railties/lib/rails/engine.rb
@@ -71,13 +71,13 @@ module Rails
end
initializer :add_routing_paths do
- config.paths.config.routes.to_a.each do |route|
- config.action_dispatch.route_paths.unshift(route) if File.exists?(route)
+ paths.config.routes.to_a.each do |route|
+ Rails::Application::RoutesReloader.paths.unshift(route) if File.exists?(route)
end
end
initializer :add_routing_namespaces do |app|
- config.paths.app.controllers.to_a.each do |load_path|
+ paths.app.controllers.to_a.each do |load_path|
load_path = File.expand_path(load_path)
Dir["#{load_path}/*/*_controller.rb"].collect do |path|
namespace = File.dirname(path).sub(/#{load_path}\/?/, '')
@@ -87,17 +87,21 @@ module Rails
end
initializer :add_locales do
- config.i18n.load_path.unshift(*config.paths.config.locales.to_a)
+ config.i18n.load_path.unshift(*paths.config.locales.to_a)
end
initializer :add_view_paths do
- views = config.paths.app.views.to_a
+ views = paths.app.views.to_a
ActionController::Base.view_paths.concat(views) if defined?(ActionController)
ActionMailer::Base.view_paths.concat(views) if defined?(ActionMailer)
end
+ initializer :add_metals do
+ Rails::Rack::Metal.paths.concat(paths.app.metals.to_a)
+ end
+
initializer :load_application_initializers do
- config.paths.config.initializers.each do |initializer|
+ paths.config.initializers.to_a.sort.each do |initializer|
load(initializer)
end
end
@@ -107,7 +111,7 @@ module Rails
if app.config.cache_classes
config.eager_load_paths.each do |load_path|
- matcher = /\A#{Regexp.escape(load_path)}(.*)\.rb\Z/
+ matcher = /\A#{Regexp.escape(load_path)}\/(.*)\.rb\Z/
Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
require_dependency file.sub(matcher, '\1')
end
diff --git a/railties/lib/rails/engine/configuration.rb b/railties/lib/rails/engine/configuration.rb
index 93afdcf911..a328e14170 100644
--- a/railties/lib/rails/engine/configuration.rb
+++ b/railties/lib/rails/engine/configuration.rb
@@ -16,7 +16,7 @@ module Rails
paths.app "app", :eager_load => true, :glob => "*"
paths.app.controllers "app/controllers", :eager_load => true
paths.app.helpers "app/helpers", :eager_load => true
- paths.app.metals "app/metal", :eager_load => true
+ paths.app.metals "app/metal"
paths.app.views "app/views"
paths.lib "lib", :load_path => true
paths.lib.tasks "lib/tasks", :glob => "**/*.rake"
diff --git a/railties/lib/rails/rack/metal.rb b/railties/lib/rails/rack/metal.rb
index 565f95d7c4..732936da32 100644
--- a/railties/lib/rails/rack/metal.rb
+++ b/railties/lib/rails/rack/metal.rb
@@ -3,14 +3,29 @@ require 'action_dispatch'
module Rails
module Rack
class Metal
- def initialize(metal_roots, metals=nil)
- load_list = metals || Dir["{#{metal_roots.join(",")}}/**/*.rb"]
+ def self.paths
+ @paths ||= []
+ end
+
+ def initialize(list=nil)
+ metals = []
+ list = Array(list || :all).map(&:to_sym)
+
+ self.class.paths.each do |path|
+ matcher = /\A#{Regexp.escape(path)}\/(.*)\.rb\Z/
+ Dir.glob("#{path}/**/*.rb").sort.each do |metal_path|
+ metal = metal_path.sub(matcher, '\1').to_sym
+ next unless list.include?(metal) || list.include?(:all)
+ require_dependency metal
+ metals << metal
+ end
+ end
+
+ metals = metals.sort_by do |m|
+ [list.index(m) || list.index(:all), m.to_s]
+ end
- @metals = load_list.map { |metal|
- metal = File.basename(metal, '.rb')
- require_dependency metal
- metal.camelize.constantize
- }.compact
+ @metals = metals.map { |m| m.to_s.camelize.constantize }
end
def new(app)
diff --git a/railties/test/initializer/path_test.rb b/railties/test/initializer/path_test.rb
index 54bdddbdf2..7a40d7fa6e 100644
--- a/railties/test/initializer/path_test.rb
+++ b/railties/test/initializer/path_test.rb
@@ -38,6 +38,7 @@ module InitializerTests
test "booting up Rails yields a valid paths object" do
assert_path @paths.app.metals, "app", "metal"
+ assert_path @paths.app.helpers, "app", "helpers"
assert_path @paths.app.views, "app", "views"
assert_path @paths.lib, "lib"
assert_path @paths.vendor, "vendor"
@@ -56,7 +57,7 @@ module InitializerTests
test "booting up Rails yields a list of paths that are eager" do
assert @paths.app.eager_load?
assert @paths.app.controllers.eager_load?
- assert @paths.app.metals.eager_load?
+ assert @paths.app.helpers.eager_load?
end
test "environments has a glob equal to the current environment" do
@@ -70,6 +71,7 @@ module InitializerTests
assert_in_load_path "lib"
assert_in_load_path "vendor"
+ assert_not_in_load_path "app", "metal"
assert_not_in_load_path "config"
assert_not_in_load_path "config", "locales"
assert_not_in_load_path "config", "environments"
diff --git a/railties/test/plugins/vendored_test.rb b/railties/test/plugins/vendored_test.rb
index 86f3ecd1f7..05c01846e1 100644
--- a/railties/test/plugins/vendored_test.rb
+++ b/railties/test/plugins/vendored_test.rb
@@ -221,6 +221,24 @@ YAML
assert_equal "1", I18n.t(:bar)
end
+ test "plugin metals are added to the middleware stack" do
+ @plugin.write 'app/metal/foo_metal.rb', <<-RUBY
+ class FooMetal
+ def self.call(env)
+ [200, { "Content-Type" => "text/html"}, ["FooMetal"]]
+ end
+ end
+ RUBY
+
+ boot_rails
+ require 'rack/test'
+ extend Rack::Test::Methods
+
+ get "/"
+ assert_equal 200, last_response.status
+ assert_equal "FooMetal", last_response.body
+ end
+
test "namespaced controllers with namespaced routes" do
@plugin.write "config/routes.rb", <<-RUBY
ActionController::Routing::Routes.draw do
@@ -248,6 +266,16 @@ YAML
assert_equal "Rendered from namespace", last_response.body
end
+ test "plugin with initializers" do
+ $plugin_initializer = false
+ @plugin.write "config/initializers/foo.rb", <<-RUBY
+ $plugin_initializer = true
+ RUBY
+
+ boot_rails
+ assert $plugin_initializer
+ end
+
test "plugin cannot declare an engine for it" do
@plugin.write "lib/bukkits.rb", <<-RUBY
class Bukkits