lib/stockboy/translations.rb
require 'stockboy/exceptions'
require 'stockboy/registry'
require 'stockboy/translator'
module Stockboy
# Registry of available {Translator} classes for lookup by symbolic name in the
# job template DSL.
#
module Translations
extend Stockboy::Registry
# Register a translator under a convenient symbolic name
#
# @param [Symbol] name
# Symbolic name of the class
# @param [Translator, #call] callable
# Translator class or any callable object
#
def self.register(name, callable)
if callable.respond_to?(:call) or callable < Stockboy::Translator
@registry[name.to_sym] = callable
else
raise ArgumentError, "Registered translators must be callable"
end
end
# Calls a named translator for the raw value
#
# @param [Symbol, Translator, #call] func_name
# Symbol representing a registered translator, or an actual translator
# @param [SourceRecord, MappedRecord, Hash, String] context
# Collection of fields or the raw value to which the translation is applied
#
def self.translate(func_name, context)
translator_for(:value, func_name).call(context)
end
# Prepare a translator for a given attribute
#
# @param [Symbol] attr
# Name of the mapped record attribute to address for translation
# @param [Symbol, #call] lookup
# Symbolic translator name or callable object
# @return [Translator] instance
#
def self.translator_for(attr, lookup)
if lookup.respond_to?(:call)
lookup
elsif tr = self[lookup]
tr.is_a?(Class) && tr < Stockboy::Translator ? tr.new(attr) : tr
else
->(context) { context.public_send attr } # no-op
end
end
end
end