Class Rack::Builder
In: lib/rack/builder.rb
Parent: Object

Rack::Builder implements a small DSL to iteratively construct Rack applications.

Example:

 app = Rack::Builder.new {
   use Rack::CommonLogger
   use Rack::ShowExceptions
   map "/lobster" do
     use Rack::Lint
     run Rack::Lobster.new
   end
 }

Or

 app = Rack::Builder.app do
   use Rack::CommonLogger
   lambda { |env| [200, {'Content-Type' => 'text/plain'}, 'OK'] }
 end

use adds a middleware to the stack, run dispatches to an application. You can use map to construct a Rack::URLMap in a convenient way.

Methods

app   call   map   new   run   to_app   use  

Public Class methods

[Source]

    # File lib/rack/builder.rb, line 32
32:     def self.app(&block)
33:       self.new(&block).to_app
34:     end

[Source]

    # File lib/rack/builder.rb, line 27
27:     def initialize(&block)
28:       @ins = []
29:       instance_eval(&block) if block_given?
30:     end

Public Instance methods

[Source]

    # File lib/rack/builder.rb, line 63
63:     def call(env)
64:       to_app.call(env)
65:     end

[Source]

    # File lib/rack/builder.rb, line 48
48:     def map(path, &block)
49:       if @ins.last.kind_of? Hash
50:         @ins.last[path] = self.class.new(&block).to_app
51:       else
52:         @ins << {}
53:         map(path, &block)
54:       end
55:     end

[Source]

    # File lib/rack/builder.rb, line 44
44:     def run(app)
45:       @ins << app #lambda { |nothing| app }
46:     end

[Source]

    # File lib/rack/builder.rb, line 57
57:     def to_app
58:       @ins[-1] = Rack::URLMap.new(@ins.last)  if Hash === @ins.last
59:       inner_app = @ins.last
60:       @ins[0...-1].reverse.inject(inner_app) { |a, e| e.call(a) }
61:     end

[Source]

    # File lib/rack/builder.rb, line 36
36:     def use(middleware, *args, &block)
37:       @ins << if block_given?
38:         lambda { |app| middleware.new(app, *args, &block) }
39:       else
40:         lambda { |app| middleware.new(app, *args) }
41:       end
42:     end

[Validate]