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.



52
53
54
55
# File 'lib/grape/middleware/stack.rb', line 52

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

Instance Attribute Details

#middlewaresObject

Returns the value of attribute middlewares.



48
49
50
# File 'lib/grape/middleware/stack.rb', line 48

def middlewares
  @middlewares
end

#othersObject

Returns the value of attribute others.



48
49
50
# File 'lib/grape/middleware/stack.rb', line 48

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



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

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]])



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

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



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

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

#insert_after(index) ⇒ Object



64
65
66
67
# File 'lib/grape/middleware/stack.rb', line 64

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

#merge_with(middleware_specs) ⇒ Object



74
75
76
77
78
79
80
81
82
83
# File 'lib/grape/middleware/stack.rb', line 74

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



69
70
71
72
# File 'lib/grape/middleware/stack.rb', line 69

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