Extract private methods out of merge_metadata

This commit is contained in:
Jared Beck 2016-12-13 22:23:30 -05:00
parent 3aafeba1c8
commit 42de9e73e4
2 changed files with 42 additions and 25 deletions

View File

@ -8,7 +8,7 @@ Metrics/CyclomaticComplexity:
Max: 8 # Goal: 6
Metrics/PerceivedComplexity:
Max: 10 # Goal: 7
Max: 9 # Goal: 7
Style/FrozenStringLiteralComment:
Enabled: false

View File

@ -118,32 +118,49 @@ module PaperTrail
source_version.nil?
end
# Updates `data` from the model's `meta` option and from `controller_info`.
# @api private
def merge_metadata(data)
# First we merge the model-level metadata in `meta`.
@record.paper_trail_options[:meta].each do |k, v|
data[k] =
if v.respond_to?(:call)
v.call(@record)
elsif v.is_a?(Symbol) && @record.respond_to?(v, true)
# If it is an attribute that is changing in an existing object,
# be sure to grab the current version.
if @record.has_attribute?(v) &&
attribute_changed_in_latest_version?(v) &&
data[:event] != "create"
attribute_in_previous_version(v)
else
@record.send(v)
end
else
v
end
end
def merge_metadata_into(data)
merge_metadata_from_model_into(data)
merge_metadata_from_controller_into(data)
end
# Second we merge any extra data from the controller (if available).
# Updates `data` from `controller_info`.
# @api private
def merge_metadata_from_controller_into(data)
data.merge(PaperTrail.controller_info || {})
end
# Updates `data` from the model's `meta` option.
# @api private
def merge_metadata_from_model_into(data)
@record.paper_trail_options[:meta].each do |k, v|
data[k] = model_metadatum(v, data[:event])
end
end
# Given a `value` from the model's `meta` option, returns an object to be
# persisted. The `value` can be a simple scalar value, but it can also
# be a symbol that names a model method, or even a Proc.
# @api private
def model_metadatum(value, event)
if value.respond_to?(:call)
value.call(@record)
elsif value.is_a?(Symbol) && @record.respond_to?(value, true)
# If it is an attribute that is changing in an existing object,
# be sure to grab the current version.
if event != "create" &&
@record.has_attribute?(value) &&
attribute_changed_in_latest_version?(value)
attribute_in_previous_version(value)
else
@record.send(value)
end
else
value
end
end
# Returns the object (not a Version) as it became next.
# NOTE: if self (the item) was not reified from a version, i.e. it is the
# "live" item, we return nil. Perhaps we should return self instead?
@ -210,7 +227,7 @@ module PaperTrail
data[:object_changes] = recordable_object_changes
end
add_transaction_id_to(data)
merge_metadata(data)
merge_metadata_into(data)
end
def record_destroy
@ -238,7 +255,7 @@ module PaperTrail
whodunnit: PaperTrail.whodunnit
}
add_transaction_id_to(data)
merge_metadata(data)
merge_metadata_into(data)
end
# Returns a boolean indicating whether to store serialized version diffs
@ -280,7 +297,7 @@ module PaperTrail
data[:object_changes] = recordable_object_changes
end
add_transaction_id_to(data)
merge_metadata(data)
merge_metadata_into(data)
end
# Returns an object which can be assigned to the `object` attribute of a