Using standalone functions
You can use dry-transformer
and its function registry feature stand-alone, without the need to define transformation classes. To do so, simply define a module and extend it with the registry API:
require 'json'
require 'dry/transformer/all'
# create your own local registry for transformation functions
module Functions
extend Dry::Transformer::Registry
end
# import necessary functions from other transprocs...
module Functions
# import all singleton methods from a module/class
import Dry::Transformer::HashTransformations
import Dry::Transformer::ArrayTransformations
end
# ...or from any external library
require 'dry-inflector'
Inflector = Dry::Inflector.new
module Functions
# import only necessary singleton methods from a module/class
# and rename them locally
import :camelize, from: Inflector, as: :camel_case
end
def t(*args)
Functions[*args]
end
# use imported transformation
transformation = t(:camel_case)
transformation.call 'i_am_a_camel'
# => "IAmACamel"
transformation = t(:map_array, (
t(:symbolize_keys).>> t(:rename_keys, user_name: :user)
)).>> t(:wrap, :address, [:city, :street, :zipcode])
transformation.call(
[
{ 'user_name' => 'Jane',
'city' => 'NYC',
'street' => 'Street 1',
'zipcode' => '123' }
]
)
# => [{:user=>"Jane", :address=>{:city=>"NYC", :street=>"Street 1", :zipcode=>"123"}}]
# define your own composable transformation easily
transformation = t(-> v { JSON.dump(v) })
transformation.call(name: 'Jane')
# => "{\"name\":\"Jane\"}"
# ...or add it to registered functions via singleton method of the registry
module Functions
# ...
def self.load_json(v)
JSON.load(v)
end
end
# ...or add it to registered functions via .register method
Functions.register(:load_json) { |v| JSON.load(v) }
transformation = t(:load_json) >> t(:map_array, t(:symbolize_keys))
transformation.call('[{"name":"Jane"}]')
# => [{ :name => "Jane" }]