class Rubanok::Processor

Base class for processors (planes)

Define transformation rules via `map` and `match` methods and apply them by calling the processor:

class MyTransformer < Rubanok::Processor
  map :type do
    raw.where(type: type)
  end
end

MyTransformer.call(MyModel.all, {type: "public"})

NOTE: the second argument (`params`) MUST be a Hash. Keys could be either Symbols or Strings (we automatically transform strings to symbols while matching rules).

All transformation methods are called within the context of the instance of a processor class.

You can access the input data via `raw` method.

Constants

UNDEFINED

Attributes

input[RW]
prepared[RW]
prepared?[RW]
raw[RW]

Public Class Methods

add_rule(rule) click to toggle source
# File lib/rubanok/processor.rb, line 47
def add_rule(rule)
  fields_set.merge rule.fields
  rules << rule
end
call(input, params = UNDEFINED) click to toggle source
# File lib/rubanok/processor.rb, line 38
def call(input, params = UNDEFINED)
  input, params = nil, input if params == UNDEFINED

  raise ArgumentError, "Params could not be nil" if params.nil?

  # @type var params: untyped
  new(input).call(params)
end
fields_set() click to toggle source
# File lib/rubanok/processor.rb, line 63
def fields_set
  return @fields_set if instance_variable_defined?(:@fields_set)

  @fields_set =
    if superclass <= Processor
      superclass.fields_set.dup
    else
      Set.new
    end
end
new(input) click to toggle source
# File lib/rubanok/processor.rb, line 87
def initialize(input)
  @input = input
  @prepared = false
end
prepare(&block) click to toggle source

DSL to define the prepare method

# File lib/rubanok/processor.rb, line 82
def prepare(&block)
  define_method(:prepare, &block)
end
project(params) click to toggle source

Generates a `params` projection including only the keys used by the rules

# File lib/rubanok/processor.rb, line 76
def project(params)
  params = params.transform_keys(&:to_sym)
  params.slice(*fields_set.to_a)
end
rules() click to toggle source
# File lib/rubanok/processor.rb, line 52
def rules
  return @rules if instance_variable_defined?(:@rules)

  @rules =
    if superclass <= Processor
      superclass.rules.dup
    else
      []
    end
end

Public Instance Methods

call(params) click to toggle source
# File lib/rubanok/processor.rb, line 92
def call(params)
  params = params.transform_keys(&:to_sym)

  rules.each do |rule|
    next unless rule.applicable?(params)

    prepare! unless prepared?
    apply_rule! rule, params
  end

  input
end

Private Instance Methods

apply_rule!(rule, params) click to toggle source
# File lib/rubanok/processor.rb, line 112
def apply_rule!(rule, params)
  method_name, data = rule.to_method_name, rule.project(params)

  return unless data

  self.input =
    if data.empty?
      send(method_name)
    else
      send(method_name, **data)
    end
end
prepare() click to toggle source
# File lib/rubanok/processor.rb, line 125
def prepare
  # no-op
end
prepare!() click to toggle source
# File lib/rubanok/processor.rb, line 129
def prepare!
  @prepared = true

  prepared_input = prepare
  return unless prepared_input

  self.input = prepared_input
end
rules() click to toggle source
# File lib/rubanok/processor.rb, line 138
def rules
  self.class.rules
end