Sha256: 3b6230a044768434acacd9ba2847ed047c13e84e723c827f5c98d65396f4989a

Contents?: true

Size: 1.39 KB

Versions: 1

Compression:

Stored size: 1.39 KB

Contents

require 'thread'
require 'rack/builder'
require 'hanami/router'

module Hanami
  class Container
    class Mounting
      def self.load!(&blk)
        new.instance_exec(&blk)
      end

      def mount(app, options)
        app.configuration.path_prefix options.fetch(:at) if hanami_app?(app)
      end

      private

      def hanami_app?(app)
        app.ancestors.include? Hanami::Application
      end

      def method_missing(m, *args)
      end
    end

    LOCK = Mutex.new

    attr_reader :routes

    def self.configure(options = {}, &blk)
      LOCK.synchronize do
        @@options       = options
        @@configuration = blk

        Mounting.load!(&blk)
      end
    end

    def initialize
      LOCK.synchronize do
        assert_configuration_presence!
        prepare_middleware_stack!
      end
    end

    def call(env)
      @builder.call(env)
    end

    private

    def assert_configuration_presence!
      unless self.class.class_variable_defined?(:@@configuration)
        raise ArgumentError.new("#{ self.class } doesn't have any application mounted.")
      end
    end

    def prepare_middleware_stack!
      @builder = ::Rack::Builder.new
      @routes  = Router.new(&@@configuration)

      if middleware = Hanami.environment.static_assets_middleware
        @builder.use middleware
      end

      @builder.use Rack::MethodOverride

      @builder.run @routes
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hanami-0.8.0 lib/hanami/container.rb