lib/vestal_versions/changes.rb in vestal_versions-1.0.2 vs lib/vestal_versions/changes.rb in vestal_versions-2.0.0

- old
+ new

@@ -1,67 +1,63 @@ module VestalVersions # Provides the ability to manipulate hashes in the specific format that ActiveRecord gives to # dirty attribute changes: string keys and unique, two-element array values. module Changes - def self.included(base) # :nodoc: - Hash.send(:include, HashMethods) + extend ActiveSupport::Concern + included do + Hash.class_eval{ include HashMethods } - base.class_eval do - include InstanceMethods - - after_update :merge_version_changes - end + after_update :merge_version_changes end # Methods available to versioned ActiveRecord::Base instances in order to manage changes used # for version creation. - module InstanceMethods - # Collects an array of changes from a record's versions between the given range and compiles - # them into one summary hash of changes. The +from+ and +to+ arguments can each be either a - # version number, a symbol representing an association proxy method, a string representing a - # version tag or a version object itself. - def changes_between(from, to) - from_number, to_number = versions.number_at(from), versions.number_at(to) - return {} if from_number == to_number - chain = versions.between(from_number, to_number).reject(&:initial?) - return {} if chain.empty? - backward = from_number > to_number - backward ? chain.pop : chain.shift unless from_number == 1 || to_number == 1 + # Collects an array of changes from a record's versions between the given range and compiles + # them into one summary hash of changes. The +from+ and +to+ arguments can each be either a + # version number, a symbol representing an association proxy method, a string representing a + # version tag or a version object itself. + def changes_between(from, to) + from_number, to_number = versions.number_at(from), versions.number_at(to) + return {} if from_number == to_number + chain = versions.between(from_number, to_number).reject(&:initial?) + return {} if chain.empty? - chain.inject({}) do |changes, version| - changes.append_changes!(backward ? version.changes.reverse_changes : version.changes) - end - end + backward = from_number > to_number + backward ? chain.pop : chain.shift unless from_number == 1 || to_number == 1 - private - # Before a new version is created, the newly-changed attributes are appended onto a hash - # of previously-changed attributes. Typically the previous changes will be empty, except in - # the case that a control block is used where versions are to be merged. See - # VestalVersions::Control for more information. - def merge_version_changes - version_changes.append_changes!(incremental_version_changes) - end + chain.inject({}) do |changes, version| + changes.append_changes!(backward ? version.changes.reverse_changes : version.changes) + end + end - # Stores the cumulative changes that are eventually used for version creation. - def version_changes - @version_changes ||= {} - end + private + # Before a new version is created, the newly-changed attributes are appended onto a hash + # of previously-changed attributes. Typically the previous changes will be empty, except in + # the case that a control block is used where versions are to be merged. See + # VestalVersions::Control for more information. + def merge_version_changes + version_changes.append_changes!(incremental_version_changes) + end - # Stores the incremental changes that are appended to the cumulative changes before version - # creation. Incremental changes are reset when the record is saved because they represent - # a subset of the dirty attribute changes, which are reset upon save. - def incremental_version_changes - changes.slice(*versioned_columns) - end + # Stores the cumulative changes that are eventually used for version creation. + def version_changes + @version_changes ||= {} + end - # Simply resets the cumulative changes after version creation. - def reset_version_changes - @version_changes = nil - end - end + # Stores the incremental changes that are appended to the cumulative changes before version + # creation. Incremental changes are reset when the record is saved because they represent + # a subset of the dirty attribute changes, which are reset upon save. + def incremental_version_changes + changes.slice(*versioned_columns) + end + # Simply resets the cumulative changes after version creation. + def reset_version_changes + @version_changes = nil + end + # Instance methods included into Hash for dealing with manipulation of hashes in the specific # format of ActiveRecord::Base#changes. module HashMethods # When called on a hash of changes and given a second hash of changes as an argument, # +append_changes+ will run the second hash on top of the first, updating the last element @@ -120,6 +116,6 @@ def reverse_changes! replace(reverse_changes) end end end -end +end \ No newline at end of file