moab-versioning 4.2.0 → 4.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/moab/bagger.rb +17 -19
- data/lib/moab/config.rb +5 -6
- data/lib/moab/deposit_bag_validator.rb +2 -4
- data/lib/moab/exceptions.rb +0 -5
- data/lib/moab/file_group.rb +13 -17
- data/lib/moab/file_group_difference.rb +15 -19
- data/lib/moab/file_group_difference_subset.rb +2 -4
- data/lib/moab/file_instance.rb +3 -8
- data/lib/moab/file_instance_difference.rb +2 -6
- data/lib/moab/file_inventory.rb +18 -22
- data/lib/moab/file_inventory_difference.rb +3 -7
- data/lib/moab/file_manifestation.rb +3 -6
- data/lib/moab/file_signature.rb +45 -33
- data/lib/moab/signature_catalog.rb +13 -16
- data/lib/moab/signature_catalog_entry.rb +3 -7
- data/lib/moab/storage_object.rb +28 -31
- data/lib/moab/storage_object_validator.rb +28 -70
- data/lib/moab/storage_object_version.rb +47 -50
- data/lib/moab/storage_repository.rb +17 -21
- data/lib/moab/storage_services.rb +12 -14
- data/lib/moab/utc_time.rb +18 -19
- data/lib/moab/verification_result.rb +26 -37
- data/lib/moab/version_metadata.rb +1 -5
- data/lib/moab/version_metadata_entry.rb +2 -6
- data/lib/moab/version_metadata_event.rb +2 -7
- data/lib/serializer/manifest.rb +6 -10
- data/lib/serializer/serializable.rb +23 -27
- data/lib/stanford/active_fedora_object.rb +0 -4
- data/lib/stanford/content_inventory.rb +49 -52
- data/lib/stanford/dor_metadata.rb +5 -8
- data/lib/stanford/storage_object_validator.rb +1 -2
- data/lib/stanford/storage_repository.rb +0 -4
- data/lib/stanford/storage_services.rb +6 -10
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8226ecfe5e815a81aa72bc564fc1abc341b4f570
|
4
|
+
data.tar.gz: 9d085cad25bc601caec626edb5cf4f778a979fc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c0072f1cd34f7bd192a4231b6c496e81d4ce380edaf08cd5fb997b240ad64b09c8ce94ed4083a65f812c11971b1e11eadf2d8099edb898226d904a8e58c3d17
|
7
|
+
data.tar.gz: 71aa7a0ff75185089d2a7705a13635b67b0fbaa600b438a35fde7f75a4bd83061f050b1c4eeef98162e38b64a66e6c23e3f45748bde93b5de42acaee32fadf9e
|
data/lib/moab/bagger.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module Moab
|
2
|
-
|
3
2
|
# A class used to create a BagIt package from a version inventory and a set of source files.
|
4
3
|
# The {#fill_bag} method is called with a package_mode parameter that specifies
|
5
4
|
# whether the bag is being created for deposit into the repository or is to contain the output of a version reconstruction.
|
@@ -18,7 +17,6 @@ module Moab
|
|
18
17
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
19
18
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
20
19
|
class Bagger
|
21
|
-
|
22
20
|
# @param version_inventory [FileInventory] The complete inventory of the files comprising a digital object version
|
23
21
|
# @param signature_catalog [SignatureCatalog] The signature catalog, used to specify source paths (in :reconstructor mode),
|
24
22
|
# or to filter the version inventory (in :depositor mode)
|
@@ -71,7 +69,7 @@ module Moab
|
|
71
69
|
if bag_pathname.join('data').exist?
|
72
70
|
bag_pathname.rmtree
|
73
71
|
else
|
74
|
-
bag_pathname.children.each {|file| file.delete}
|
72
|
+
bag_pathname.children.each { |file| file.delete }
|
75
73
|
bag_pathname.rmdir
|
76
74
|
end
|
77
75
|
end
|
@@ -108,13 +106,13 @@ module Moab
|
|
108
106
|
@package_mode = package_mode
|
109
107
|
bag_pathname.mkpath
|
110
108
|
case package_mode
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
109
|
+
when :depositor
|
110
|
+
version_inventory.write_xml_file(bag_pathname, 'version')
|
111
|
+
@bag_inventory = signature_catalog.version_additions(version_inventory)
|
112
|
+
bag_inventory.write_xml_file(bag_pathname, 'additions')
|
113
|
+
when :reconstructor
|
114
|
+
@bag_inventory = version_inventory
|
115
|
+
bag_inventory.write_xml_file(bag_pathname, 'version')
|
118
116
|
end
|
119
117
|
bag_inventory
|
120
118
|
end
|
@@ -128,10 +126,10 @@ module Moab
|
|
128
126
|
bag_inventory.groups.each do |group|
|
129
127
|
group_id = group.group_id
|
130
128
|
case package_mode
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
129
|
+
when :depositor
|
130
|
+
deposit_group(group_id, source_base_pathname.join(group_id))
|
131
|
+
when :reconstructor
|
132
|
+
reconstuct_group(group_id, source_base_pathname)
|
135
133
|
end
|
136
134
|
end
|
137
135
|
end
|
@@ -143,7 +141,7 @@ module Moab
|
|
143
141
|
def deposit_group(group_id, source_dir)
|
144
142
|
group = bag_inventory.group(group_id)
|
145
143
|
return nil? if group.nil? or group.files.empty?
|
146
|
-
target_dir = bag_pathname.join('data',group_id)
|
144
|
+
target_dir = bag_pathname.join('data', group_id)
|
147
145
|
group.path_list.each do |relative_path|
|
148
146
|
source = source_dir.join(relative_path)
|
149
147
|
target = target_dir.join(relative_path)
|
@@ -160,7 +158,7 @@ module Moab
|
|
160
158
|
def reconstuct_group(group_id, storage_object_dir)
|
161
159
|
group = bag_inventory.group(group_id)
|
162
160
|
return nil? if group.nil? or group.files.empty?
|
163
|
-
target_dir = bag_pathname.join('data',group_id)
|
161
|
+
target_dir = bag_pathname.join('data', group_id)
|
164
162
|
group.files.each do |file|
|
165
163
|
catalog_entry = signature_catalog.signature_hash[file.signature]
|
166
164
|
source = storage_object_dir.join(catalog_entry.storage_path)
|
@@ -251,15 +249,15 @@ module Moab
|
|
251
249
|
end
|
252
250
|
|
253
251
|
# @return [Boolean] Create a tar file containing the bag
|
254
|
-
def create_tarfile(tar_pathname=nil)
|
252
|
+
def create_tarfile(tar_pathname = nil)
|
255
253
|
bag_name = bag_pathname.basename
|
256
254
|
bag_parent = bag_pathname.parent
|
257
255
|
tar_pathname ||= bag_parent.join("#{bag_name}.tar")
|
258
|
-
tar_cmd="cd '#{bag_parent}'; tar --dereference --force-local -cf '#{tar_pathname}' '#{bag_name}'"
|
256
|
+
tar_cmd = "cd '#{bag_parent}'; tar --dereference --force-local -cf '#{tar_pathname}' '#{bag_name}'"
|
259
257
|
begin
|
260
258
|
shell_execute(tar_cmd)
|
261
259
|
rescue
|
262
|
-
shell_execute(tar_cmd.sub('--force-local',''))
|
260
|
+
shell_execute(tar_cmd.sub('--force-local', ''))
|
263
261
|
end
|
264
262
|
raise "Unable to create tarfile #{tar_pathname}" unless tar_pathname.exist?
|
265
263
|
return true
|
data/lib/moab/config.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# @return [Confstruct::Configuration] the configuration data
|
6
5
|
Config = Confstruct::Configuration.new do
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
storage_roots nil
|
7
|
+
storage_trunk nil
|
8
|
+
deposit_trunk nil
|
9
|
+
path_method :druid_tree
|
10
|
+
checksum_algos [:md5, :sha1, :sha256]
|
11
11
|
end
|
12
|
-
|
13
12
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Moab
|
2
|
-
|
3
2
|
# Given a deposit bag, ensures the contents valid for becoming a StorageObjectVersion
|
4
3
|
# this is a Shameless Green implementation, combining code from:
|
5
4
|
# - sdr-preservation-core/lib/sdr_ingest/validate_bag <-- old preservation robots
|
@@ -11,7 +10,6 @@ module Moab
|
|
11
10
|
# - deposit_bag_validator
|
12
11
|
# - file_signature
|
13
12
|
class DepositBagValidator
|
14
|
-
|
15
13
|
BAG_DIR_NOT_FOUND = :bag_dir_not_found
|
16
14
|
CHECKSUM_MISMATCH = :checksum_mismatch
|
17
15
|
CHECKSUM_TYPE_UNRECOGNIZED = :checksum_type_unrecognized
|
@@ -85,7 +83,7 @@ module Moab
|
|
85
83
|
pathname = deposit_bag_pathname.join(filename)
|
86
84
|
result_array << single_error_hash(REQUIRED_FILE_NOT_FOUND, file_pathname: pathname) unless pathname.exist?
|
87
85
|
end
|
88
|
-
result_array.empty?
|
86
|
+
result_array.empty?
|
89
87
|
end
|
90
88
|
|
91
89
|
def verify_version
|
@@ -221,7 +219,7 @@ module Moab
|
|
221
219
|
file_checksums
|
222
220
|
end
|
223
221
|
|
224
|
-
def digester_hash(types_to_generate=DEFAULT_CHECKSUM_TYPES)
|
222
|
+
def digester_hash(types_to_generate = DEFAULT_CHECKSUM_TYPES)
|
225
223
|
types_to_generate.each_with_object({}) do |checksum_type, digester_hash|
|
226
224
|
case checksum_type
|
227
225
|
when :md5
|
data/lib/moab/exceptions.rb
CHANGED
@@ -1,18 +1,13 @@
|
|
1
1
|
module Moab
|
2
2
|
class ObjectNotFoundException < RuntimeError
|
3
|
-
|
4
3
|
end
|
5
4
|
|
6
5
|
class FileNotFoundException < RuntimeError
|
7
|
-
|
8
6
|
end
|
9
7
|
|
10
8
|
class InvalidMetadataException < RuntimeError
|
11
|
-
|
12
9
|
end
|
13
10
|
|
14
11
|
class ValidationException < RuntimeError
|
15
|
-
|
16
12
|
end
|
17
|
-
|
18
13
|
end
|
data/lib/moab/file_group.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A container for a standard subset of a digital objects {FileManifestation} objects
|
6
5
|
# Used to segregate depositor content from repository metadata files
|
7
6
|
# This is a child element of {FileInventory}, which contains a full example
|
@@ -16,14 +15,13 @@ module Moab
|
|
16
15
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
17
16
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
18
17
|
class FileGroup < Serializer::Serializable
|
19
|
-
|
20
18
|
include HappyMapper
|
21
19
|
|
22
20
|
# The name of the XML element used to serialize this objects data
|
23
21
|
tag 'fileGroup'
|
24
22
|
|
25
23
|
# (see Serializable#initialize)
|
26
|
-
def initialize(opts={})
|
24
|
+
def initialize(opts = {})
|
27
25
|
@signature_hash = Hash.new
|
28
26
|
@data_source = ""
|
29
27
|
super(opts)
|
@@ -39,7 +37,7 @@ module Moab
|
|
39
37
|
|
40
38
|
# @attribute
|
41
39
|
# @return [Integer] The total number of data files (dynamically calculated)
|
42
|
-
attribute :file_count, Integer, :tag => 'fileCount', :on_save => Proc.new {|i| i.to_s}
|
40
|
+
attribute :file_count, Integer, :tag => 'fileCount', :on_save => Proc.new { |i| i.to_s }
|
43
41
|
|
44
42
|
def file_count
|
45
43
|
files.inject(0) { |sum, manifestation| sum + manifestation.file_count }
|
@@ -47,7 +45,7 @@ module Moab
|
|
47
45
|
|
48
46
|
# @attribute
|
49
47
|
# @return [Integer] The total size (in bytes) of all data files (dynamically calculated)
|
50
|
-
attribute :byte_count, Integer, :tag => 'byteCount', :on_save => Proc.new {|i| i.to_s}
|
48
|
+
attribute :byte_count, Integer, :tag => 'byteCount', :on_save => Proc.new { |i| i.to_s }
|
51
49
|
|
52
50
|
def byte_count
|
53
51
|
files.inject(0) { |sum, manifestation| sum + manifestation.byte_count }
|
@@ -55,7 +53,7 @@ module Moab
|
|
55
53
|
|
56
54
|
# @attribute
|
57
55
|
# @return [Integer] The total disk usage (in 1 kB blocks) of all data files (estimating du -k result) (dynamically calculated)
|
58
|
-
attribute :block_count, Integer, :tag => 'blockCount', :on_save => Proc.new {|i| i.to_s}
|
56
|
+
attribute :block_count, Integer, :tag => 'blockCount', :on_save => Proc.new { |i| i.to_s }
|
59
57
|
|
60
58
|
def block_count
|
61
59
|
files.inject(0) { |sum, manifestation| sum + manifestation.block_count }
|
@@ -83,7 +81,7 @@ module Moab
|
|
83
81
|
# used to test for existence of a filename in this file group
|
84
82
|
def path_hash
|
85
83
|
path_hash = Hash.new
|
86
|
-
signature_hash.each do |signature,manifestation|
|
84
|
+
signature_hash.each do |signature, manifestation|
|
87
85
|
manifestation.instances.each do |instance|
|
88
86
|
path_hash[instance.path] = signature
|
89
87
|
end
|
@@ -93,7 +91,7 @@ module Moab
|
|
93
91
|
|
94
92
|
# @return [Array<String>] The list of file paths in this group
|
95
93
|
def path_list
|
96
|
-
files.collect{|file| file.instances.collect{|instance| instance.path}}.flatten
|
94
|
+
files.collect { |file| file.instances.collect { |instance| instance.path } }.flatten
|
97
95
|
end
|
98
96
|
|
99
97
|
# @api internal
|
@@ -116,7 +114,7 @@ module Moab
|
|
116
114
|
def files=(manifestiation_array)
|
117
115
|
manifestiation_array.each do |manifestiation|
|
118
116
|
add_file(manifestiation)
|
119
|
-
|
117
|
+
end
|
120
118
|
end
|
121
119
|
|
122
120
|
# @api internal
|
@@ -133,7 +131,7 @@ module Moab
|
|
133
131
|
# @param instance [FileInstance] The pathname and datetime of the file instance to be added
|
134
132
|
# @return [void] Add a single {FileSignature},{FileInstance} key/value pair to this group.
|
135
133
|
# Data is actually stored in the {#signature_hash}
|
136
|
-
def add_file_instance(signature,instance)
|
134
|
+
def add_file_instance(signature, instance)
|
137
135
|
if signature_hash.has_key?(signature)
|
138
136
|
manifestation = signature_hash[signature]
|
139
137
|
else
|
@@ -165,7 +163,7 @@ module Moab
|
|
165
163
|
def is_descendent_of_base?(pathname)
|
166
164
|
raise("base_directory has not been set") if @base_directory.nil?
|
167
165
|
is_descendent = false
|
168
|
-
pathname.expand_path.ascend {|ancestor| is_descendent ||= (ancestor == @base_directory)}
|
166
|
+
pathname.expand_path.ascend { |ancestor| is_descendent ||= (ancestor == @base_directory) }
|
169
167
|
raise("#{pathname} is not a descendent of #{@base_directory}") unless is_descendent
|
170
168
|
is_descendent
|
171
169
|
end
|
@@ -174,7 +172,7 @@ module Moab
|
|
174
172
|
# @param signatures_from_bag [Hash<Pathname,Signature>] The fixity data already calculated for the files
|
175
173
|
# @param recursive [Boolean] if true, descend into child directories
|
176
174
|
# @return [FileGroup] Harvest a directory (using digest hash for fixity data) and add all files to the file group
|
177
|
-
def group_from_bagit_subdir(directory, signatures_from_bag, recursive=true)
|
175
|
+
def group_from_bagit_subdir(directory, signatures_from_bag, recursive = true)
|
178
176
|
@signatures_from_bag = signatures_from_bag
|
179
177
|
group_from_directory(directory, recursive)
|
180
178
|
end
|
@@ -183,7 +181,7 @@ module Moab
|
|
183
181
|
# @param directory [Pathname,String] The location of the files to harvest
|
184
182
|
# @param recursive [Boolean] if true, descend into child directories
|
185
183
|
# @return [FileGroup] Harvest a directory and add all files to the file group
|
186
|
-
def group_from_directory(directory, recursive=true)
|
184
|
+
def group_from_directory(directory, recursive = true)
|
187
185
|
self.base_directory = directory
|
188
186
|
@data_source = @base_directory.to_s
|
189
187
|
harvest_directory(directory, recursive)
|
@@ -201,7 +199,7 @@ module Moab
|
|
201
199
|
# Note that unlike Find.find and Dir.glob, Pathname passes through symbolic links
|
202
200
|
# @see http://stackoverflow.com/questions/3974087/how-to-make-rubys-find-find-follow-symlinks
|
203
201
|
# @see http://stackoverflow.com/questions/357754/can-i-traverse-symlinked-directories-in-ruby-with-a-glob
|
204
|
-
def harvest_directory(path, recursive, validated=nil)
|
202
|
+
def harvest_directory(path, recursive, validated = nil)
|
205
203
|
pathname = Pathname.new(path).expand_path
|
206
204
|
validated ||= is_descendent_of_base?(pathname)
|
207
205
|
pathname.children.sort.each do |child|
|
@@ -221,7 +219,7 @@ module Moab
|
|
221
219
|
# @param _validated (unused; kept here for backwards compatibility)
|
222
220
|
# @return [void] Add a single physical file's data to the array of files in this group.
|
223
221
|
# If fixity data was supplied in bag manifests, then utilize that data.
|
224
|
-
def add_physical_file(pathname, _validated=nil)
|
222
|
+
def add_physical_file(pathname, _validated = nil)
|
225
223
|
pathname = Pathname.new(pathname).expand_path
|
226
224
|
instance = FileInstance.new.instance_from_file(pathname, @base_directory)
|
227
225
|
if @signatures_from_bag && @signatures_from_bag[pathname]
|
@@ -234,7 +232,5 @@ module Moab
|
|
234
232
|
end
|
235
233
|
add_file_instance(signature, instance)
|
236
234
|
end
|
237
|
-
|
238
235
|
end
|
239
|
-
|
240
236
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# Performs analysis and reports the differences between two matching {FileGroup} objects.
|
6
5
|
# The descending elements of the report hold a detailed breakdown of file-level differences, organized by change type.
|
7
6
|
# This stanza is a child element of {FileInventoryDifference}, the documentation of which contains a full example.
|
@@ -53,8 +52,8 @@ module Moab
|
|
53
52
|
end
|
54
53
|
|
55
54
|
# (see Serializable#initialize)
|
56
|
-
def initialize(opts={})
|
57
|
-
@subset_hash = Hash.new {|hash, key| hash[key] = FileGroupDifferenceSubset.new(:change => key.to_s)}
|
55
|
+
def initialize(opts = {})
|
56
|
+
@subset_hash = Hash.new { |hash, key| hash[key] = FileGroupDifferenceSubset.new(:change => key.to_s) }
|
58
57
|
super(opts)
|
59
58
|
end
|
60
59
|
|
@@ -135,7 +134,7 @@ module Moab
|
|
135
134
|
|
136
135
|
def subsets=(array)
|
137
136
|
if array
|
138
|
-
array.each{|subset| subset_hash[subset.change.to_sym] = subset}
|
137
|
+
array.each { |subset| subset_hash[subset.change.to_sym] = subset }
|
139
138
|
end
|
140
139
|
end
|
141
140
|
|
@@ -144,19 +143,18 @@ module Moab
|
|
144
143
|
%w{group_id difference_count identical copyadded copydeleted renamed modified deleted added}
|
145
144
|
end
|
146
145
|
|
147
|
-
|
148
146
|
# @api internal
|
149
147
|
# @return [FileGroupDifference] Clone just this element for inclusion in a versionMetadata structure
|
150
148
|
def summary()
|
151
149
|
FileGroupDifference.new(
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
150
|
+
:group_id => group_id,
|
151
|
+
:identical => identical,
|
152
|
+
:copyadded => copyadded,
|
153
|
+
:copydeleted => copydeleted,
|
154
|
+
:renamed => renamed,
|
155
|
+
:modified => modified,
|
156
|
+
:added => added,
|
157
|
+
:deleted => deleted
|
160
158
|
)
|
161
159
|
end
|
162
160
|
|
@@ -258,7 +256,7 @@ module Moab
|
|
258
256
|
basis_only_paths = basis_paths - other_paths
|
259
257
|
other_only_paths = other_paths - basis_paths
|
260
258
|
maxsize = [basis_only_paths.size, other_only_paths.size].max
|
261
|
-
(0..maxsize-1).each do |n|
|
259
|
+
(0..maxsize - 1).each do |n|
|
262
260
|
fid = FileInstanceDifference.new()
|
263
261
|
fid.basis_path = basis_only_paths[n]
|
264
262
|
fid.other_path = other_only_paths[n]
|
@@ -335,10 +333,10 @@ module Moab
|
|
335
333
|
# @return [Hash<Symbol,Array>] Sets of filenames grouped by change type for use in performing file or metadata operations
|
336
334
|
def file_deltas()
|
337
335
|
# The hash to be returned
|
338
|
-
deltas = Hash.new {|hash, key| hash[key] = []}
|
336
|
+
deltas = Hash.new { |hash, key| hash[key] = [] }
|
339
337
|
# case where other_path is empty or 'same'. (create array of strings)
|
340
338
|
[:identical, :modified, :deleted, :copydeleted].each do |change|
|
341
|
-
deltas[change].concat(subset_hash[change].files.collect{ |file| file.basis_path })
|
339
|
+
deltas[change].concat(subset_hash[change].files.collect { |file| file.basis_path })
|
342
340
|
end
|
343
341
|
# case where basis_path and other_path are both present. (create array of arrays)
|
344
342
|
[:copyadded, :renamed].each do |change|
|
@@ -372,9 +370,7 @@ module Moab
|
|
372
370
|
# @param [Array<Array<String>>] filepairs The set of oldname, newname pairs for all files being renamed
|
373
371
|
# @return [Array<Array<String>>] a set of file triples containing oldname, tempname, newname
|
374
372
|
def rename_tempfile_triplets(filepairs)
|
375
|
-
filepairs.collect{ |old, new| [old, new, "#{new}-#{Time.now.strftime('%Y%m%d%H%H%S')}-tmp"] }
|
373
|
+
filepairs.collect { |old, new| [old, new, "#{new}-#{Time.now.strftime('%Y%m%d%H%H%S')}-tmp"] }
|
376
374
|
end
|
377
|
-
|
378
375
|
end
|
379
|
-
|
380
376
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# A container for reporting a set of file-level differences of the type specified by the change attribute
|
6
5
|
#
|
7
6
|
# ====Data Model
|
@@ -20,7 +19,7 @@ module Moab
|
|
20
19
|
tag 'subset'
|
21
20
|
|
22
21
|
# (see Serializable#initialize)
|
23
|
-
def initialize(opts={})
|
22
|
+
def initialize(opts = {})
|
24
23
|
@files = Array.new
|
25
24
|
super(opts)
|
26
25
|
end
|
@@ -39,7 +38,6 @@ module Moab
|
|
39
38
|
|
40
39
|
# @attribute
|
41
40
|
# @return [Array<FileInstanceDifference>] The set of file instances having this type of change
|
42
|
-
has_many :files, FileInstanceDifference, :tag=>'file'
|
43
|
-
|
41
|
+
has_many :files, FileInstanceDifference, :tag => 'file'
|
44
42
|
end
|
45
43
|
end
|
data/lib/moab/file_instance.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'moab'
|
2
2
|
|
3
3
|
module Moab
|
4
|
-
|
5
4
|
# The file path and last modification date properties of a file
|
6
5
|
#
|
7
6
|
# ====Data Model
|
@@ -14,14 +13,13 @@ module Moab
|
|
14
13
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
15
14
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
16
15
|
class FileInstance < Serializer::Serializable
|
17
|
-
|
18
16
|
include HappyMapper
|
19
17
|
|
20
18
|
# The name of the XML element used to serialize this objects data
|
21
19
|
tag 'fileInstance'
|
22
20
|
|
23
21
|
# (see Serializable#initialize)
|
24
|
-
def initialize(opts={})
|
22
|
+
def initialize(opts = {})
|
25
23
|
super(opts)
|
26
24
|
end
|
27
25
|
|
@@ -34,14 +32,13 @@ module Moab
|
|
34
32
|
attribute :datetime, String
|
35
33
|
|
36
34
|
def datetime=(event_datetime)
|
37
|
-
@datetime=Moab::UtcTime.input(event_datetime)
|
35
|
+
@datetime = Moab::UtcTime.input(event_datetime)
|
38
36
|
end
|
39
37
|
|
40
38
|
def datetime
|
41
39
|
Moab::UtcTime.output(@datetime)
|
42
40
|
end
|
43
41
|
|
44
|
-
|
45
42
|
# @api internal
|
46
43
|
# @param pathname [Pathname] The location of the physical file
|
47
44
|
# @param base_directory [Pathname] The full path used as the basis of the relative paths reported
|
@@ -56,7 +53,7 @@ module Moab
|
|
56
53
|
# @param other [FileInstance] The other file instance being compared to this instance
|
57
54
|
# @return [Boolean] Returns true if self and other have the same path.
|
58
55
|
def eql?(other)
|
59
|
-
return false unless other.respond_to?(:path)
|
56
|
+
return false unless other.respond_to?(:path) # Cannot equal an incomparable type!
|
60
57
|
self.path == other.path
|
61
58
|
end
|
62
59
|
|
@@ -77,7 +74,5 @@ module Moab
|
|
77
74
|
def hash
|
78
75
|
path.hash
|
79
76
|
end
|
80
|
-
|
81
77
|
end
|
82
|
-
|
83
78
|
end
|