From ad6be0876271f86e76c89645a0106b85c9d77ad7 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 22 Jun 2010 23:51:28 +0200 Subject: Made Engine valid rack app with its own middleware stack --- railties/lib/rails/application/configuration.rb | 2 +- railties/lib/rails/application/railties.rb | 4 ++-- railties/lib/rails/engine.rb | 13 +++++++++++++ railties/lib/rails/engine/configurable.rb | 13 ++++++++++++- railties/lib/rails/engine/configuration.rb | 2 ++ 5 files changed, 30 insertions(+), 4 deletions(-) (limited to 'railties/lib') diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index c3418e0d80..a28fc62ccd 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -9,7 +9,7 @@ module Rails attr_accessor :allow_concurrency, :cache_classes, :cache_store, :encoding, :consider_all_requests_local, :dependency_loading, - :filter_parameters, :log_level, :logger, :middleware, + :filter_parameters, :log_level, :logger, :plugins, :preload_frameworks, :reload_plugins, :secret_token, :serve_static_assets, :session_options, :time_zone, :whiny_nils diff --git a/railties/lib/rails/application/railties.rb b/railties/lib/rails/application/railties.rb index b3e6693f89..14ba0afc7c 100644 --- a/railties/lib/rails/application/railties.rb +++ b/railties/lib/rails/application/railties.rb @@ -17,7 +17,7 @@ module Rails end def engines - @engines ||= ::Rails::Engine.subclasses.map(&:new) + @engines ||= ::Rails::Engine.subclasses.map(&:instance) end def plugins @@ -28,4 +28,4 @@ module Rails end end end -end \ No newline at end of file +end diff --git a/railties/lib/rails/engine.rb b/railties/lib/rails/engine.rb index 555bc9dbc8..f8a33ffe24 100644 --- a/railties/lib/rails/engine.rb +++ b/railties/lib/rails/engine.rb @@ -140,6 +140,19 @@ module Rails end end + def app + raise "You can't use Engine as rack application without providing valid rack endpoint" unless endpoint + @app ||= config.middleware.build(endpoint) + end + + def endpoint + self.class.endpoint + end + + def call(env) + app.call(env) + end + # Add configured load paths to ruby load paths and remove duplicates. initializer :set_load_path, :before => :bootstrap_hook do _all_load_paths.reverse_each do |path| diff --git a/railties/lib/rails/engine/configurable.rb b/railties/lib/rails/engine/configurable.rb index 9a370f0abb..0af01cace2 100644 --- a/railties/lib/rails/engine/configurable.rb +++ b/railties/lib/rails/engine/configurable.rb @@ -3,10 +3,12 @@ module Rails module Configurable def self.included(base) base.extend ClassMethods + base.private_class_method :new end module ClassMethods delegate :middleware, :root, :paths, :to => :config + delegate :call, :to => :instance def config @config ||= Engine::Configuration.new(find_root_with_flag("lib")) @@ -15,6 +17,15 @@ module Rails def inherited(base) raise "You cannot inherit from a Rails::Engine child" end + + def instance + @instance ||= new + end + + def endpoint(endpoint = nil) + @endpoint = endpoint if endpoint + @endpoint + end end def config @@ -22,4 +33,4 @@ module Rails end end end -end \ No newline at end of file +end diff --git a/railties/lib/rails/engine/configuration.rb b/railties/lib/rails/engine/configuration.rb index 521ed95447..9a9ec8b3ad 100644 --- a/railties/lib/rails/engine/configuration.rb +++ b/railties/lib/rails/engine/configuration.rb @@ -5,10 +5,12 @@ module Rails class Configuration < ::Rails::Railtie::Configuration attr_reader :root attr_writer :eager_load_paths, :autoload_once_paths, :autoload_paths + attr_accessor :middleware def initialize(root=nil) super() @root = root + @middleware = ActionDispatch::MiddlewareStack.new end def paths -- cgit v1.2.3