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