class AttrMasker::Attribute

Holds the definition of maskable attribute.

Attributes

model[R]
name[R]
options[R]

Public Class Methods

new(name, model, options) click to toggle source
# File lib/attr_masker/attribute.rb, line 9
def initialize(name, model, options)
  @name = name.to_sym
  @model = model
  @options = options
end

Public Instance Methods

column_names() click to toggle source
# File lib/attr_masker/attribute.rb, line 76
def column_names
  options[:column_names] || [name]
end
evaluate_option(option_name, model_instance) click to toggle source

Evaluates option (typically :if or :unless) on given model instance. That option can be either a proc (a model is passed as an only argument), or a symbol (a method of that name is called on model instance).

# File lib/attr_masker/attribute.rb, line 52
def evaluate_option(option_name, model_instance)
  option = options[option_name]

  if option.is_a?(Symbol)
    model_instance.send(option)
  elsif option.respond_to?(:call)
    option.call(model_instance)
  else
    option
  end
end
marshal_data(data) click to toggle source
# File lib/attr_masker/attribute.rb, line 64
def marshal_data(data)
  return data unless options[:marshal]

  options[:marshaler].send(options[:dump_method], data)
end
mask(model_instance) click to toggle source

Mask the attribute on given model. Masking will be performed regardless of :if and :unless options. A should_mask? method should be called separately to ensure that given object is eligible for masking.

The method returns the masked value but does not modify the object's attribute.

If marshal attribute's option is true, the attribute value will be loaded before masking, and dumped to proper storage format prior returning.

# File lib/attr_masker/attribute.rb, line 35
def mask(model_instance)
  value = unmarshal_data(model_instance.send(name))
  masker = options[:masker]
  masker_value = masker.call(value: value, model: model_instance,
                             attribute_name: name, masking_options: options)
  model_instance.send("#{name}=", marshal_data(masker_value))
end
masked_attributes_new_values(model_instance) click to toggle source

Returns a hash of maskable attribute names, and respective attribute values. Unchanged attributes are skipped.

# File lib/attr_masker/attribute.rb, line 45
def masked_attributes_new_values(model_instance)
  model_instance.changes.slice(*column_names).transform_values(&:second)
end
should_mask?(model_instance) click to toggle source

Evaluates the :if and :unless attribute options on given instance. Returns true or false, depending on whether the attribute should be masked for this object or not.

# File lib/attr_masker/attribute.rb, line 18
def should_mask?(model_instance)
  not (
    options.key?(:if) && !evaluate_option(:if, model_instance) ||
    options.key?(:unless) && evaluate_option(:unless, model_instance)
  )
end
unmarshal_data(data) click to toggle source
# File lib/attr_masker/attribute.rb, line 70
def unmarshal_data(data)
  return data unless options[:marshal]

  options[:marshaler].send(options[:load_method], data)
end