Sha256: d29027e2b1122f337268f866f8f4d48aa917a9fbb5f0f820845f81b1f31d133a

Contents?: true

Size: 1.64 KB

Versions: 1

Compression:

Stored size: 1.64 KB

Contents

module NYNY
  class App
    HTTP_VERBS = [:delete, :get, :head, :options, :patch, :post, :put, :trace]

    attr_reader :middleware_chain, :router
    def initialize app=nil
      @router = Router.new({
        :routes => self.class.routes,
        :fallback => (app || lambda {|env| Response.new '', 404 }),
        :before_hooks => self.class.before_hooks,
        :after_hooks => self.class.after_hooks
      })
      @middleware_chain = MiddlewareChain.new(self.class.middlewares,
                                              lambda {|env| _call(env)})
    end

    def _call env
      router.call env
    end

    def call env
      middleware_chain.call env
    end

    #class methods
    class << self
      HTTP_VERBS.each do |method|
        define_method method do |str, &blk|
          (routes[method] ||= {})[RouteSignature.new(str)] = Proc.new &blk
        end
      end

      def middlewares;  @middlewares  ||= []  end
      def routes;       @routes       ||= {}  end
      def before_hooks; @before_hooks ||= []  end
      def after_hooks;  @after_hooks  ||= []  end

      # move middleware chain and runner to core-ext
      def register *extensions
        extensions.each do |ext|
          extend ext
          ext.registered(self) if ext.respond_to?(:registered)
        end
      end

      def before &blk
        before_hooks << Proc.new(&blk)
      end

      def after &blk
        after_hooks << Proc.new(&blk)
      end

      def use middleware, *args, &block
        middlewares << [middleware, args, block]
      end

      def helpers *args
        args.each {|m| RequestScope.add_helper_module m }
      end
    end #class methods
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
nyny-2.0.0 lib/nyny/app.rb