aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--railties/lib/rails/application/configuration.rb2
-rw-r--r--railties/lib/rails/application/railties.rb4
-rw-r--r--railties/lib/rails/engine.rb13
-rw-r--r--railties/lib/rails/engine/configurable.rb13
-rw-r--r--railties/lib/rails/engine/configuration.rb2
-rw-r--r--railties/test/railties/engine_test.rb35
6 files changed, 65 insertions, 4 deletions
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
diff --git a/railties/test/railties/engine_test.rb b/railties/test/railties/engine_test.rb
index 7410a10712..08ba308bc4 100644
--- a/railties/test/railties/engine_test.rb
+++ b/railties/test/railties/engine_test.rb
@@ -50,5 +50,40 @@ module RailtiesTest
assert index < initializers.index { |i| i.name == :build_middleware_stack }
end
+
+ class Upcaser
+ def initialize(app)
+ @app = app
+ end
+
+ def call(env)
+ response = @app.call(env)
+ response[2].upcase!
+ response
+ end
+ end
+
+ test "engine is a rack app and can have his own middleware stack" do
+ @plugin.write "lib/bukkits.rb", <<-RUBY
+ class Bukkits
+ class Engine < ::Rails::Engine
+ endpoint lambda { |env| [200, {'Content-Type' => 'text/html'}, 'Hello World'] }
+
+ config.middleware.use ::RailtiesTest::EngineTest::Upcaser
+ end
+ end
+ RUBY
+
+ boot_rails
+
+ Rails::Application.routes.draw do |map|
+ mount(Bukkits::Engine => "/bukkits")
+ end
+
+ env = Rack::MockRequest.env_for("/bukkits")
+ response = Rails::Application.call(env)
+
+ assert_equal "HELLO WORLD", response[2]
+ end
end
end