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 #