Sha256: 111530eeee0f0a21d453d19b2e3b4c0ca5080175e10d5bfd5f85554a3f7dce64

Contents?: true

Size: 1.24 KB

Versions: 2

Compression:

Stored size: 1.24 KB

Contents

require 'thread'
require 'rack/builder'
require 'lotus/router'

module Lotus
  class Container
    class Router < ::Lotus::Router
      def mount(app, options)
        app = app.new(path_prefix: options.fetch(:at)) if lotus_app?(app)
        super(app, options)
      end

      private

      def lotus_app?(app)
        app.ancestors.include? Lotus::Application
      end
    end

    attr_reader :routes

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

    def initialize
      Mutex.new.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 Lotus.environment.serve_static_assets?
        require 'lotus/static'
        @builder.use Lotus::Static
      end

      @builder.run @routes
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
lotusrb-0.6.1 lib/lotus/container.rb
lotusrb-0.6.0 lib/lotus/container.rb