diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2015-08-07 12:03:13 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2015-08-07 15:37:31 -0700 |
commit | 27eddbb332c4adb533e0699e4b1532c3bd4de222 (patch) | |
tree | fc7697591d8d14a3d32f35694f5d96245d3c17ba /actionpack | |
parent | e4f9a0b92531fa68cc2cdbd52b66904515fcd486 (diff) | |
download | rails-27eddbb332c4adb533e0699e4b1532c3bd4de222.tar.gz rails-27eddbb332c4adb533e0699e4b1532c3bd4de222.tar.bz2 rails-27eddbb332c4adb533e0699e4b1532c3bd4de222.zip |
simplify the Middleware constructor
We should do the hard work outside the constructor. Also fix the tests
to not directly construct middleware objects, but to go through the
stack object.
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/lib/action_controller/metal.rb | 25 | ||||
-rw-r--r-- | actionpack/lib/action_dispatch/middleware/stack.rb | 23 | ||||
-rw-r--r-- | actionpack/test/dispatch/middleware_stack/middleware_test.rb | 63 |
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 |