class Coach::Middleware

Attributes

config[R]
next_middleware[R]

Public Class Methods

middleware_dependencies() click to toggle source
# File lib/coach/middleware.rb, line 11
def self.middleware_dependencies
  @middleware_dependencies ||= []
end
new(context, next_middleware = nil, config = {}) click to toggle source

Middleware gets access to a shared context, which is populated by other middleware futher up the stack, a reference to the next middleware in the stack, and a config object.

# File lib/coach/middleware.rb, line 54
def initialize(context, next_middleware = nil, config = {})
  @_context = context
  @next_middleware = next_middleware
  @config = config
end
provided() click to toggle source
# File lib/coach/middleware.rb, line 15
def self.provided
  @provided ||= []
end
provides(*new_provided) click to toggle source
# File lib/coach/middleware.rb, line 19
def self.provides(*new_provided)
  if new_provided.include?(:_metadata)
    raise "Cannot provide :_metadata, Coach uses this internally!"
  end

  provided.concat(new_provided)
  provided.uniq!
end
provides?(requirement) click to toggle source
# File lib/coach/middleware.rb, line 28
def self.provides?(requirement)
  provided.include?(requirement)
end
requirements() click to toggle source
# File lib/coach/middleware.rb, line 32
def self.requirements
  @requirements ||= []
end
requires(*new_requirements) click to toggle source
# File lib/coach/middleware.rb, line 36
def self.requires(*new_requirements)
  requirements.concat(new_requirements)
  requirements.uniq!

  new_requirements.each do |requirement|
    define_method(requirement) { @_context[requirement] }
  end
end
requires?(provision) click to toggle source
# File lib/coach/middleware.rb, line 45
def self.requires?(provision)
  requirements.include?(provision)
end
uses(middleware, config = {}) click to toggle source
# File lib/coach/middleware.rb, line 7
def self.uses(middleware, config = {})
  middleware_dependencies << MiddlewareItem.new(middleware, config)
end

Public Instance Methods

instrument() click to toggle source

Use ActiveSupport to instrument the execution of the subsequent chain.

# File lib/coach/middleware.rb, line 80
def instrument
  proc do
    ActiveSupport::Notifications.publish("start_middleware.coach", middleware_event)

    ActiveSupport::Notifications.
      instrument("finish_middleware.coach", middleware_event) { call }
  end
end
log_metadata(**values) click to toggle source

Adds key-values to metadata, to be published with coach events.

# File lib/coach/middleware.rb, line 90
def log_metadata(**values)
  @_context[:_metadata] ||= {}
  @_context[:_metadata].merge!(values)
end
provide(args) click to toggle source

Make values available to middleware further down the stack. Accepts a hash of name => value pairs. Names must have been declared by calling ‘provides` on the class.

# File lib/coach/middleware.rb, line 69
def provide(args)
  args.each do |name, value|
    unless self.class.provides?(name)
      raise NameError, "#{self.class} does not provide #{name}"
    end

    @_context[name] = value
  end
end
request() click to toggle source

‘request` is always present in context, and we want to give every middleware access to it by default as it’s always present and often used!

# File lib/coach/middleware.rb, line 62
def request
  @_context[:request]
end

Private Instance Methods

middleware_event() click to toggle source

Event for ActiveSupport

# File lib/coach/middleware.rb, line 105
def middleware_event
  {
    middleware: self.class.name,
    request: request,
  }
end