class Moab::FileInventoryDifference

Compares two {FileInventory} instances based primarily on file signatures and secondarily on file pathnames. Although the usual use will be to compare the content of 2 different temporal versions of the same object, it can also be used to verify an inventory document against an inventory harvested from a directory. The report is subdivided into sections for each of the file groups that compose the inventories being compared.

Data Model

@example {include:file:spec/fixtures/derivatives/manifests/all/fileInventoryDifference.xml} @note Copyright © 2012 by The Board of Trustees of the Leland Stanford Junior University.

All rights reserved.  See {file:LICENSE.rdoc} for details.

Public Class Methods

new(opts = {}) click to toggle source

(see Serializable#initialize)

Calls superclass method Serializer::Serializable::new
# File lib/moab/file_inventory_difference.rb, line 26
def initialize(opts = {})
  @group_differences = []
  super(opts)
end

Public Instance Methods

common_object_id(basis_inventory, other_inventory) click to toggle source

@api internal @param (see compare) @return [String] Returns either the common digitial object ID, or a concatenation of both inventory’s IDs

# File lib/moab/file_inventory_difference.rb, line 102
def common_object_id(basis_inventory, other_inventory)
  if basis_inventory.digital_object_id == other_inventory.digital_object_id
    basis_inventory.digital_object_id.to_s
  else
    "#{basis_inventory.digital_object_id}|#{other_inventory.digital_object_id}"
  end
end
compare(basis_inventory, other_inventory) click to toggle source

@api external @param basis_inventory [FileInventory] The inventory that is the basis of the comparison @param other_inventory [FileInventory] The inventory that is compared against the basis inventory @return [FileInventoryDifference] Returns a report showing the differences, if any, between two inventories @example {include:file:spec/features/differences/version_compare_spec.rb}

# File lib/moab/file_inventory_difference.rb, line 83
def compare(basis_inventory, other_inventory)
  @digital_object_id ||= common_object_id(basis_inventory, other_inventory)
  @basis ||= basis_inventory.data_source
  @other ||= other_inventory.data_source
  @report_datetime = Time.now
  # get a union list of all group_ids present in either inventory
  group_ids = basis_inventory.group_ids | other_inventory.group_ids
  @group_differences = group_ids.map do |group_id|
    # get a pair of groups to compare, creating a empty group if not present in the inventory
    basis_group = basis_inventory.group(group_id) || FileGroup.new(group_id: group_id)
    other_group = other_inventory.group(group_id) || FileGroup.new(group_id: group_id)
    FileGroupDifference.new.compare_file_groups(basis_group, other_group)
  end
  self
end
difference_count() click to toggle source
# File lib/moab/file_inventory_difference.rb, line 39
def difference_count
  @group_differences.inject(0) { |sum, group| sum + group.difference_count }
end
differences_detail() click to toggle source

@return [Hash] Serializes the data and then filters it to report only the changes

# File lib/moab/file_inventory_difference.rb, line 111
def differences_detail
  # return self.summary if difference_count == 0
  inv_diff = to_hash
  inv_diff['group_differences'].each_value do |group_diff|
    delete_subsets = []
    group_diff['subsets'].each do |change_type, subset|
      delete_subsets << change_type if (change_type == 'identical') || (subset['count'] == 0)
    end
    delete_subsets.each do |change_type|
      group_diff['subsets'].delete(change_type)
      group_diff.delete(change_type) if change_type != 'identical'
    end
    group_diff.delete('subsets') if group_diff['subsets'].empty?
  end
  inv_diff
end
group_difference(group_id) click to toggle source

@param [String] group_id The identifer of the group to be selected @return [FileGroupDifference] The subset of this report for the specified group_id (or nil if not found)

# File lib/moab/file_inventory_difference.rb, line 74
def group_difference(group_id)
  @group_differences.find { |group_difference| group_difference.group_id == group_id }
end
report_datetime() click to toggle source
# File lib/moab/file_inventory_difference.rb, line 59
def report_datetime
  Moab::UtcTime.output(@report_datetime)
end
report_datetime=(datetime) click to toggle source
# File lib/moab/file_inventory_difference.rb, line 55
def report_datetime=(datetime)
  @report_datetime = Moab::UtcTime.input(datetime)
end
summary_fields() click to toggle source

@return [Array<String>] The data fields to include in summary reports

# File lib/moab/file_inventory_difference.rb, line 68
def summary_fields
  %w[digital_object_id difference_count basis other report_datetime group_differences]
end