aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--actionpack/lib/action_controller/metal.rb25
-rw-r--r--actionpack/lib/action_dispatch/middleware/stack.rb23
-rw-r--r--actionpack/test/dispatch/middleware_stack/middleware_test.rb63
3 files changed, 54 insertions, 57 deletions
diff --git a/actionpack/lib/action_controller/metal.rb b/actionpack/lib/action_controller/metal.rb
index dc88557e3a..817339dadf 100644
--- a/actionpack/lib/action_controller/metal.rb
+++ b/actionpack/lib/action_controller/metal.rb
@@ -11,18 +11,16 @@ module ActionController
#
class MiddlewareStack < ActionDispatch::MiddlewareStack #:nodoc:
class Middleware < ActionDispatch::MiddlewareStack::Middleware #:nodoc:
- def initialize(klass, *args, &block)
- options = args.extract_options!
- @only = Array(options.delete(:only)).map(&:to_s)
- @except = Array(options.delete(:except)).map(&:to_s)
- args << options unless options.empty?
- super
+ def initialize(klass, args, only, except, block)
+ @only = only
+ @except = except
+ super(klass, args, block)
end
def valid?(action)
- if @only.present?
+ if @only.any?
@only.include?(action)
- elsif @except.present?
+ elsif @except.any?
!@except.include?(action)
else
true
@@ -37,6 +35,17 @@ module ActionController
middleware.valid?(action) ? middleware.build(a) : a
end
end
+
+ private
+
+ def build_middleware(klass, args, block)
+ options = args.extract_options!
+ only = Array(options.delete(:only)).map(&:to_s)
+ except = Array(options.delete(:except)).map(&:to_s)
+ args << options unless options.empty?
+
+ Middleware.new(klass, args, only, except, block)
+ end
end
# <tt>ActionController::Metal</tt> is the simplest possible controller, providing a
diff --git a/actionpack/lib/action_dispatch/middleware/stack.rb b/actionpack/lib/action_dispatch/middleware/stack.rb
index 87e627319e..b39a502d77 100644
--- a/actionpack/lib/action_dispatch/middleware/stack.rb
+++ b/actionpack/lib/action_dispatch/middleware/stack.rb
@@ -6,7 +6,7 @@ module ActionDispatch
class Middleware
attr_reader :args, :block, :name, :classcache
- def initialize(klass_or_name, *args, &block)
+ def initialize(klass_or_name, args, block)
@klass = nil
if klass_or_name.respond_to?(:name)
@@ -75,19 +75,17 @@ module ActionDispatch
middlewares[i]
end
- def unshift(*args, &block)
- middleware = self.class::Middleware.new(*args, &block)
- middlewares.unshift(middleware)
+ def unshift(klass, *args, &block)
+ middlewares.unshift(build_middleware(klass, args, block))
end
def initialize_copy(other)
self.middlewares = other.middlewares.dup
end
- def insert(index, *args, &block)
+ def insert(index, klass, *args, &block)
index = assert_index(index, :before)
- middleware = self.class::Middleware.new(*args, &block)
- middlewares.insert(index, middleware)
+ middlewares.insert(index, build_middleware(klass, args, block))
end
alias_method :insert_before, :insert
@@ -107,9 +105,8 @@ module ActionDispatch
middlewares.delete target
end
- def use(*args, &block)
- middleware = self.class::Middleware.new(*args, &block)
- middlewares.push(middleware)
+ def use(klass, *args, &block)
+ middlewares.push(build_middleware(klass, args, block))
end
def build(app = Proc.new)
@@ -123,5 +120,11 @@ module ActionDispatch
raise "No such middleware to insert #{where}: #{index.inspect}" unless i
i
end
+
+ private
+
+ def build_middleware(klass, args, block)
+ Middleware.new(klass, args, block)
+ end
end
end
diff --git a/actionpack/test/dispatch/middleware_stack/middleware_test.rb b/actionpack/test/dispatch/middleware_stack/middleware_test.rb
index 9607f026db..6366d37aa4 100644
--- a/actionpack/test/dispatch/middleware_stack/middleware_test.rb
+++ b/actionpack/test/dispatch/middleware_stack/middleware_test.rb
@@ -12,65 +12,50 @@ module ActionDispatch
}.each do |name, klass|
define_method("test_#{name}_klass") do
- mw = Middleware.new klass
- assert_equal klass, mw.klass
+ stack = ActionDispatch::MiddlewareStack.new
+ stack.use klass
+ assert_equal klass, stack.first.klass
end
define_method("test_#{name}_==") do
- mw1 = Middleware.new klass
- mw2 = Middleware.new klass
- assert_equal mw1, mw2
+ stack = ActionDispatch::MiddlewareStack.new
+ stack.use klass
+ stack.use klass
+ assert_equal 2, stack.size
+ assert_equal stack.first, stack.last
end
end
+ attr_reader :stack
+
+ def setup
+ @stack = ActionDispatch::MiddlewareStack.new
+ end
+
def test_string_class
- mw = Middleware.new Omg.name
- assert_equal Omg, mw.klass
+ stack = ActionDispatch::MiddlewareStack.new
+ stack.use Omg.name
+ assert_equal Omg, stack.first.klass
end
def test_double_equal_works_with_classes
k = Class.new
- mw = Middleware.new k
- assert_operator mw, :==, k
+ stack.use k
+ assert_operator stack.first, :==, k
- result = mw != Class.new
+ result = stack.first != Class.new
assert result, 'middleware should not equal other anon class'
end
def test_double_equal_works_with_strings
- mw = Middleware.new Omg
- assert_operator mw, :==, Omg.name
+ stack.use Omg
+ assert_operator stack.first, :==, Omg.name
end
def test_double_equal_normalizes_strings
- mw = Middleware.new Omg
- assert_operator mw, :==, "::#{Omg.name}"
- end
-
- def test_middleware_loads_classnames_from_cache
- mw = Class.new(Middleware) {
- attr_accessor :classcache
- }.new(Omg.name)
-
- fake_cache = { mw.name => Omg }
- mw.classcache = fake_cache
-
- assert_equal Omg, mw.klass
-
- fake_cache[mw.name] = Middleware
- assert_equal Middleware, mw.klass
- end
-
- def test_middleware_always_returns_class
- mw = Class.new(Middleware) {
- attr_accessor :classcache
- }.new(Omg)
-
- fake_cache = { mw.name => Middleware }
- mw.classcache = fake_cache
-
- assert_equal Omg, mw.klass
+ stack.use Omg
+ assert_operator stack.first, :==, "::#{Omg.name}"
end
end
end