class Pipes::Pipe
Pipe
is a mix-in which turns a class into a Pipes
building block (Pipe
). A Pipe
can only have class methods since it can't be instantiated.
Attributes
context[R]
Public Class Methods
call(ctx)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 22 def self.call(ctx) return ctx if ctx.error _validate_ctx(_required_context_elements, ctx) new(ctx).call _validate_ctx(_provided_context_elements, ctx) end
new(ctx)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 7 def initialize(ctx) @context = ctx end
provide_context(*args)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 33 def self.provide_context(*args) _provided_context_elements.push(*args) end
require_context(*args)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 29 def self.require_context(*args) _required_context_elements.push(*args) end
|(other)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 15 def self.|(other) this = self Class.new(Pipe) do _combine(this, other) end end
Private Class Methods
_check_interface(klass)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 47 def self._check_interface(klass) fail MissingCallMethod unless klass.instance_methods.include?(:call) end
_combine(first, second)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 37 def self._combine(first, second) _check_interface(first) _check_interface(second) define_singleton_method(:call) do |ctx| first.call(ctx) second.call(ctx) end end
_provided_context_elements()
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 57 def self._provided_context_elements @provided_context_elements ||= [] end
_required_context_elements()
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 52 def self._required_context_elements @required_context_elements ||= [] end
_validate_ctx(collection, ctx)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 62 def self._validate_ctx(collection, ctx) collection.each do |element| next if ctx.respond_to?(element) fail MissingContext, "context does not respond to '#{element}'" end end
Public Instance Methods
call()
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 11 def call fail MissingCallMethod end
Private Instance Methods
method_missing(name, *args, &block)
click to toggle source
# File lib/codequest_pipes/pipe.rb, line 72 def method_missing(name, *args, &block) context.send(name, *args, &block) end