Class: Moab::FileInventoryDifference
- Inherits:
-
Serializer::Manifest
- Object
- Serializer::Serializable
- Serializer::Manifest
- Moab::FileInventoryDifference
- Includes:
- HappyMapper
- Defined in:
- lib/moab/file_inventory_difference.rb
Overview
Copyright © 2012 by The Board of Trustees of the Leland Stanford Junior University. All rights reserved. See LICENSE for details.
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
-
FileInventoryDifference = compares two FileInventory instances based on file signatures and pathnames
-
FileGroupDifference [1..*] = performs analysis and reports differences between two matching FileGroup objects
-
FileGroupDifferenceSubset [1..5] = collects a set of file-level differences of a give change type
-
FileInstanceDifference [1..*] = contains difference information at the file level
-
FileSignature [1..2] = contains the file signature(s) of two file instances being compared
-
-
-
-
Instance Attribute Summary collapse
-
#basis ⇒ String
Id information from the version inventory used as the basis for comparison.
-
#difference_count ⇒ Integer
The number of differences found between the two inventories that were compared (dynamically calculated).
-
#digital_object_id ⇒ String
The digital object ID (druid).
-
#group_differences ⇒ Array<FileGroupDifference>
The set of data groups comprising the version.
-
#other ⇒ String
Id information about the version inventory compared to the basis.
-
#report_datetime ⇒ String
The datetime at which the report was run.
Instance Method Summary collapse
-
#common_object_id(basis_inventory, other_inventory) ⇒ String
Returns either the common digitial object ID, or a concatenation of both inventory’s IDs.
-
#compare(basis_inventory, other_inventory) ⇒ FileInventoryDifference
Returns a report showing the differences, if any, between two inventories.
-
#differences_detail ⇒ Hash
Serializes the data and then filters it to report only the changes.
-
#group_difference(group_id) ⇒ FileGroupDifference
The subset of this report for the specified group_id (or nil if not found).
-
#initialize(opts = {}) ⇒ FileInventoryDifference
constructor
A new instance of FileInventoryDifference.
-
#summary_fields ⇒ Array<String>
The data fields to include in summary reports.
Methods inherited from Serializer::Manifest
read_xml_file, write_xml_file, #write_xml_file, xml_filename, xml_pathname, xml_pathname_exist?
Methods inherited from Serializer::Serializable
#array_to_hash, deep_diff, #diff, #key, #key_name, #summary, #to_hash, #to_json, #to_yaml, #variable_names, #variables
Constructor Details
#initialize(opts = {}) ⇒ FileInventoryDifference
Returns a new instance of FileInventoryDifference.
26 27 28 29 |
# File 'lib/moab/file_inventory_difference.rb', line 26 def initialize(opts = {}) @group_differences = [] super(opts) end |
Instance Attribute Details
#basis ⇒ String
Returns Id information from the version inventory used as the basis for comparison.
45 |
# File 'lib/moab/file_inventory_difference.rb', line 45 attribute :basis, String |
#difference_count ⇒ Integer
Returns the number of differences found between the two inventories that were compared (dynamically calculated).
37 |
# File 'lib/moab/file_inventory_difference.rb', line 37 attribute :difference_count, Integer, :tag => 'differenceCount', :on_save => proc { |i| i.to_s } |
#digital_object_id ⇒ String
Returns The digital object ID (druid).
33 |
# File 'lib/moab/file_inventory_difference.rb', line 33 attribute :digital_object_id, String, :tag => 'objectId' |
#group_differences ⇒ Array<FileGroupDifference>
Returns The set of data groups comprising the version.
65 |
# File 'lib/moab/file_inventory_difference.rb', line 65 has_many :group_differences, FileGroupDifference, :tag => 'fileGroupDifference' |
#other ⇒ String
Returns Id information about the version inventory compared to the basis.
49 |
# File 'lib/moab/file_inventory_difference.rb', line 49 attribute :other, String |
#report_datetime ⇒ String
Returns The datetime at which the report was run.
53 |
# File 'lib/moab/file_inventory_difference.rb', line 53 attribute :report_datetime, String, :tag => 'reportDatetime' |
Instance Method Details
#common_object_id(basis_inventory, other_inventory) ⇒ String
Returns either the common digitial object ID, or a concatenation of both inventory’s IDs
102 103 104 105 106 107 108 |
# 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}|#{other_inventory.digital_object_id}" else basis_inventory.digital_object_id.to_s end end |
#compare(basis_inventory, other_inventory) ⇒ FileInventoryDifference
Returns a report showing the differences, if any, between two inventories
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
# 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_ids.each 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) @group_differences << FileGroupDifference.new.compare_file_groups(basis_group, other_group) end self end |
#differences_detail ⇒ Hash
Returns Serializes the data and then filters it to report only the changes.
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
# 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) ⇒ FileGroupDifference
Returns The subset of this report for the specified group_id (or nil if not found).
74 75 76 |
# 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 |
#summary_fields ⇒ Array<String>
Returns The data fields to include in summary reports.
68 69 70 |
# 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 |