lib/hanami/middleware.rb in hanami-0.8.0 vs lib/hanami/middleware.rb in hanami-0.9.0
- old
+ new
@@ -1,42 +1,42 @@
+require 'rack/builder'
+require 'hanami/utils/class'
+
module Hanami
# Rack middleware stack for an application
#
# @since 0.1.0
# @api private
class Middleware
# Instantiate a middleware stack
#
- # @param configuration [Hanami::Configuration] the application's configuration
+ # @param configuration [Hanami::ApplicationConfiguration] the application's configuration
#
# @return [Hanami::Middleware] the new stack
#
# @since 0.1.0
# @api private
#
- # @see Hanami::Configuration
+ # @see Hanami::ApplicationConfiguration
def initialize(configuration)
- @stack = []
+ @stack = []
@configuration = configuration
+ @builder = Rack::Builder.new
end
# Load the middleware stack
#
- # @param application [Hanami::Application] the application loading the middleware
- #
# @return [Hanami::Middleware] the loaded middleware stack
#
# @since 0.2.0
# @api private
#
# @see http://rdoc.info/gems/rack/Rack/Builder
- def load!(application, namespace)
- @namespace = namespace
- @builder = ::Rack::Builder.new
- load_default_stack(application)
- @stack.each { |m, args, block| @builder.use load_middleware(m), *args, &block }
- @builder.run application.routes
+ def load!
+ load_default_stack
+ stack.each { |m, args, block| builder.use(load_middleware(m), *args, &block) }
+ builder.run routes
self
end
# Process a request.
@@ -47,11 +47,11 @@
# @return [Array] a serialized Rack response
#
# @since 0.1.0
# @api private
def call(env)
- @builder.call(env)
+ builder.call(env)
end
# Append a middleware to the stack.
#
# @param middleware [Object] a Rack middleware
@@ -62,11 +62,12 @@
#
# @since 0.2.0
#
# @see Hanami::Middleware#prepend
def use(middleware, *args, &blk)
- @stack.push [middleware, args, blk]
+ stack.push [middleware, args, blk]
+ stack.uniq!
end
# Prepend a middleware to the stack.
#
# @param middleware [Object] a Rack middleware
@@ -77,54 +78,73 @@
#
# @since 0.6.0
#
# @see Hanami::Middleware#use
def prepend(middleware, *args, &blk)
- @stack.unshift [middleware, args, blk]
+ stack.unshift [middleware, args, blk]
+ stack.uniq!
end
+ private
+
# @api private
+ # @since 0.9.0
+ attr_reader :stack
+
+ # @api private
+ # @since 0.9.0
+ attr_reader :builder
+
+ # @api private
+ # @since 0.9.0
+ attr_reader :configuration
+
+ # @api private
# @since 0.2.0
def load_middleware(middleware)
case middleware
when String
- @namespace.const_get(middleware)
+ Utils::Class.load!(middleware)
else
middleware
end
end
+ def routes
+ Components["#{configuration.app_name}.routes"]
+ end
+
# @api private
# @since 0.2.0
- def load_default_stack(application)
+ def load_default_stack
@default_stack_loaded ||= begin
_load_assets_middleware
_load_session_middleware
- _load_default_welcome_page_for(application)
+ _load_default_welcome_page
_load_method_override_middleware
true
end
end
# Default welcome page
#
# @api private
# @since 0.2.0
- def _load_default_welcome_page_for(application)
- unless Hanami.env?(:test) || application.routes.defined?
+ def _load_default_welcome_page
+ unless Hanami.env?(:test) || routes.defined?
require 'hanami/welcome'
use Hanami::Welcome
end
end
# Add session middleware
#
# @api private
# @since 0.2.0
def _load_session_middleware
- if @configuration.sessions.enabled?
- prepend(*@configuration.sessions.middleware)
+ if configuration.sessions.enabled?
+ prepend(*configuration.sessions.middleware)
end
end
# Use static assets middleware
#