Sha256: d2fd6d6871fdd324fc27ea8488590a06854f3b9b46a694faec6dad955577100f

Contents?: true

Size: 1.5 KB

Versions: 3

Compression:

Stored size: 1.5 KB

Contents

require 'rack'
require 'rack/builder'
require 'hanami/router'
require 'hanami/components'

module Hanami
  # Main application that mounts many Rack and/or Hanami applications.
  #
  # @see Hanami.app
  #
  # @since 0.9.0
  # @api private
  class App
    # Initialize a new instance
    #
    # @param configuration [Hanami::Configuration] general configuration
    # @param environment [Hanami::Environment] current environment
    #
    # @since 0.9.0
    # @api private
    def initialize(configuration, environment)
      Components.resolve('apps')

      @builder = Rack::Builder.new
      @routes  = Hanami::Router.new

      mount(configuration)
      middleware(environment)
      builder.run(routes)
    end

    # Implements Rack SPEC
    #
    # @param env [Hash] a Rack env
    #
    # @return [Array] a serialized Rack response
    #
    # @since 0.9.0
    # @api private
    def call(env)
      builder.call(env)
    end

    private

    # @since 0.9.0
    # @api private
    attr_reader :builder

    # @since 0.9.0
    # @api private
    attr_reader :routes

    # @since 0.9.0
    # @api private
    def mount(configuration)
      configuration.mounted.each do |klass, app|
        routes.mount(klass, at: app.path_prefix)
      end
    end

    # @since 0.9.0
    # @api private
    def middleware(environment)
      if middleware = environment.static_assets_middleware # rubocop:disable Lint/AssignmentInCondition
        builder.use middleware
      end

      builder.use Rack::MethodOverride
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
hanami-0.9.2 lib/hanami/app.rb
hanami-0.9.1 lib/hanami/app.rb
hanami-0.9.0 lib/hanami/app.rb