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
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