module Fend::Plugins::DataProcessing
By default, Fend
provides methods for input and output processing.
class UserValidation < Fend #... def process_input(input) # symbolize input data keys symbolized_input = input.each_with_object({}) do |(key, value), result| new_key = key.is_a?(String) ? key.to_sym : key result[new_key] = value end # do some additional processing end def process_output(output) # filter output data whitelist = [:username, :email, :address] filtered_output = output.each_with_object({}) do |(key, value), result| result[key] = value if whitelist.include?(key) end # do some additional processing end end
`data_processing` plugin allows you to define processing steps in more
declarative manner: plugin :data_processing process(:input) do |input| # symbolize keys end process(:output) do |output| # filter end
You can define as much processing steps as you need and they will be executed in order in which they are defined.
## Built-in processings
You can activate built-in processings when loading the plugin:
# this will: # symbolize and freeze input data # stringify output data plugin :data_processing, input: [:symbolize, :freeze], output: [:stringify]
:symbolize : Symbolizes keys.
:stringify : Stringifies keys
:dup : Duplicates data
:freeze : Freezes data
All of the above support deeply nested data.
Built-in processings are executed before any user-defined ones.
## Data mutation
Fend
will never mutate the raw input data you provide:
raw_input = { username: "john", email: "john@example.com" } UserValidation.call(raw_input)
However, nothing can stop you from performing destructive operations (`merge!`, `delete`, etc…) in custom processing steps. If you intend to mutate input/output data, make sure to use `:dup` processing, in order to ensure immutability.
Constants
- BUILT_IN_PROCESSINGS
Public Class Methods
# File lib/fend/plugins/data_processing.rb, line 93 def self.configure(validation, options = {}) validation.opts[:data_processing] = {} validation.opts[:data_processing][:input] ||= [] validation.opts[:data_processing][:output] ||= [] return if options.empty? options.each do |data_ref, processings| processings.each_with_object(validation.opts[:data_processing][data_ref]) do |name, result| raise Error, "Built-in processing not found: ':#{name}'" unless BUILT_IN_PROCESSINGS.key?(name) result << BUILT_IN_PROCESSINGS[name] end end end