Class: Grape::Middleware::Stack

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Enumerable
Defined in:
lib/grape/middleware/stack.rb

Overview

Class to handle the stack of middlewares based on ActionDispatch::MiddlewareStack It allows to insert and insert after

Defined Under Namespace

Classes: Middleware

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeStack

Returns a new instance of Stack.



61
62
63
64
# File 'lib/grape/middleware/stack.rb', line 61

def initialize
  @middlewares = []
  @others = []
end

Instance Attribute Details

#middlewaresObject

Returns the value of attribute middlewares.



57
58
59
# File 'lib/grape/middleware/stack.rb', line 57

def middlewares
  @middlewares
end

#othersObject

Returns the value of attribute others.



57
58
59
# File 'lib/grape/middleware/stack.rb', line 57

def others
  @others
end

Instance Method Details

#buildRack::Builder

Returns the builder object with our middlewares applied.

Returns:

  • (Rack::Builder)

    the builder object with our middlewares applied



95
96
97
98
99
100
# File 'lib/grape/middleware/stack.rb', line 95

def build
  builder = Rack::Builder.new
  others.shift(others.size).each { |m| merge_with(m) }
  middlewares.each { |m| m.build(builder) }
  builder
end

#concat(other_specs) ⇒ Object

Parameters:

  • other_specs (Array)

    An array of middleware specifications (e.g. [[:use, klass], [:insert_before, *args]])



104
105
106
107
108
# File 'lib/grape/middleware/stack.rb', line 104

def concat(other_specs)
  use, not_use = other_specs.partition { |o| o.first == :use }
  others << not_use
  merge_with(use)
end

#insert(index, klass, *args, &block) ⇒ Object Also known as: insert_before



66
67
68
69
# File 'lib/grape/middleware/stack.rb', line 66

def insert(index, klass, *args, &block)
  at = assert_index(index, :before)
  middlewares.insert(at, self.class::Middleware.new(klass, args, block))
end

#insert_after(index) ⇒ Object



73
74
75
76
# File 'lib/grape/middleware/stack.rb', line 73

def insert_after(index, ...)
  at = assert_index(index, :after)
  insert(at + 1, ...)
end

#merge_with(middleware_specs) ⇒ Object



83
84
85
86
87
88
89
90
91
92
# File 'lib/grape/middleware/stack.rb', line 83

def merge_with(middleware_specs)
  middleware_specs.each do |operation, klass, *args|
    if args.last.is_a?(Proc)
      last_proc = args.pop
      public_send(operation, klass, *args, &last_proc)
    else
      public_send(operation, klass, *args)
    end
  end
end

#use(klass, *args, &block) ⇒ Object



78
79
80
81
# File 'lib/grape/middleware/stack.rb', line 78

def use(klass, *args, &block)
  middleware = self.class::Middleware.new(klass, args, block)
  middlewares.push(middleware)
end