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