[gem]: https://rubygems.org/gems/transproc [travis]: https://travis-ci.org/solnic/transproc [gemnasium]: https://gemnasium.com/solnic/transproc [codeclimate]: https://codeclimate.com/github/solnic/transproc [coveralls]: https://coveralls.io/r/solnic/transproc [inchpages]: http://inch-ci.org/github/solnic/transproc # Transproc [![Join the chat at https://gitter.im/solnic/transproc](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/solnic/transproc) [![Gem Version](https://badge.fury.io/rb/transproc.svg)][gem] [![Build Status](https://travis-ci.org/solnic/transproc.svg?branch=master)][travis] [![Dependency Status](https://gemnasium.com/solnic/transproc.svg)][gemnasium] [![Code Climate](https://codeclimate.com/github/solnic/transproc/badges/gpa.svg)][codeclimate] [![Test Coverage](https://codeclimate.com/github/solnic/transproc/badges/coverage.svg)][codeclimate] [![Inline docs](http://inch-ci.org/github/solnic/transproc.svg?branch=master)][inchpages] Functional transformations for Ruby. It's currently used as one of the data mapping backends in [Ruby Object Mapper](http://rom-rb.org). ## Installation Add this line to your application's Gemfile: ```ruby gem 'transproc' ``` And then execute: $ bundle Or install it yourself as: $ gem install transproc ## Usage ``` ruby require 'json' require 'transproc/all' require 'inflecto' # create your own local registry for transformation functions module Functions extend Transproc::Registry end # import necessary functions from external modules module Functions # ... # all transformations available in the imported module import Transproc::HashTransforations import Transproc::ArrayTransformations # only specific transformation (renamed into the desired local name) import :camelize, from: Inflecto, as: :camel_case end # use imported transformation transformation = Functions[:camel_case] transformation.call 'i_am_a_camel' # => "IAmACamel" transformation = Functions[:map_array, Functions[:symbolize_keys] >> Functions[:rename_keys, user_name: :user]] transformation >>= Functions[: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 = Functions[-> 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 transformation = Functions[:load_json] >> Functions[:map_array, Functions[:symbolize_keys]] transformation.call('[{"name":"Jane"}]') # => [{ :name => "Jane" }] ``` ## Credits This project is inspired by the work of following people: * [Markus Schirp](https://github.com/mbj) and [morpher](https://github.com/mbj/morpher) project * [Josep M. Bach](https://github.com/txus) and [kleisli](https://github.com/txus/kleisli) project ## Contributing 1. Fork it ( https://github.com/solnic/transproc/fork ) 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) 5. Create a new Pull Request