moab-versioning 4.2.1 → 4.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/moab.rb +1 -1
- data/lib/moab/bagger.rb +15 -15
- data/lib/moab/config.rb +0 -2
- data/lib/moab/deposit_bag_validator.rb +1 -1
- data/lib/moab/file_group.rb +13 -15
- data/lib/moab/file_group_difference.rb +18 -21
- data/lib/moab/file_group_difference_subset.rb +2 -4
- data/lib/moab/file_instance.rb +1 -3
- data/lib/moab/file_instance_difference.rb +3 -5
- data/lib/moab/file_inventory.rb +17 -27
- data/lib/moab/file_inventory_difference.rb +5 -7
- data/lib/moab/file_manifestation.rb +4 -6
- data/lib/moab/file_signature.rb +29 -40
- data/lib/moab/signature_catalog.rb +11 -13
- data/lib/moab/signature_catalog_entry.rb +1 -3
- data/lib/moab/storage_object.rb +12 -19
- data/lib/moab/storage_object_validator.rb +22 -8
- data/lib/moab/storage_object_version.rb +25 -27
- data/lib/moab/storage_repository.rb +6 -13
- data/lib/moab/storage_services.rb +6 -8
- data/lib/moab/utc_time.rb +0 -2
- data/lib/moab/verification_result.rb +0 -2
- data/lib/moab/version_metadata.rb +1 -3
- data/lib/moab/version_metadata_entry.rb +2 -4
- data/lib/moab/version_metadata_event.rb +0 -2
- data/lib/serializer/manifest.rb +5 -5
- data/lib/serializer/serializable.rb +34 -34
- data/lib/stanford/active_fedora_object.rb +0 -2
- data/lib/stanford/content_inventory.rb +22 -20
- data/lib/stanford/dor_metadata.rb +0 -2
- data/lib/stanford/storage_object_validator.rb +0 -2
- data/lib/stanford/storage_repository.rb +1 -2
- data/lib/stanford/storage_services.rb +5 -7
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26d64bba0aa593e619713fb761078c032df8e1cc
|
4
|
+
data.tar.gz: 91b9bbd3842691aabbc4a9f003347fceeea949f4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 94c2ec711d1135684611e517f994658c1358ea01b0687e46c454772476c72b9090250045a79adfb0bc5a8fe0e02988951fbce939eb9891d77956a46c67562cfc
|
7
|
+
data.tar.gz: e69e5ee8da7091da76bf6dba56856411da26b683ec5ae897f7c6a6811f5af9e8700a9306e4cd5f75bf20de5e92f0b35b7f87a47753d03fdedaad947f85619e70
|
data/lib/moab.rb
CHANGED
@@ -29,7 +29,7 @@
|
|
29
29
|
# @note Copyright (c) 2012 by The Board of Trustees of the Leland Stanford Junior University.
|
30
30
|
# All rights reserved. See {file:LICENSE.rdoc} for details.
|
31
31
|
module Moab
|
32
|
-
DEFAULT_CHECKSUM_TYPES = [
|
32
|
+
DEFAULT_CHECKSUM_TYPES = %i[md5 sha1 sha256].freeze
|
33
33
|
end
|
34
34
|
|
35
35
|
require 'serializer'
|
data/lib/moab/bagger.rb
CHANGED
@@ -25,7 +25,7 @@ module Moab
|
|
25
25
|
@version_inventory = version_inventory
|
26
26
|
@signature_catalog = signature_catalog
|
27
27
|
@bag_pathname = Pathname.new(bag_pathname)
|
28
|
-
create_bagit_txt
|
28
|
+
create_bagit_txt
|
29
29
|
end
|
30
30
|
|
31
31
|
# @return [FileInventory] The complete inventory of the files comprising a digital object version
|
@@ -54,7 +54,7 @@ module Moab
|
|
54
54
|
|
55
55
|
# @api internal
|
56
56
|
# @return [void] Generate the bagit.txt tag file
|
57
|
-
def create_bagit_txt
|
57
|
+
def create_bagit_txt
|
58
58
|
bag_pathname.mkpath
|
59
59
|
bag_pathname.join("bagit.txt").open('w') do |f|
|
60
60
|
f.puts "Tag-File-Character-Encoding: UTF-8"
|
@@ -63,13 +63,13 @@ module Moab
|
|
63
63
|
end
|
64
64
|
|
65
65
|
# @return [NilClass] Delete the bagit files
|
66
|
-
def delete_bag
|
66
|
+
def delete_bag
|
67
67
|
# make sure this looks like a bag before deleting
|
68
68
|
if bag_pathname.join('bagit.txt').exist?
|
69
69
|
if bag_pathname.join('data').exist?
|
70
70
|
bag_pathname.rmtree
|
71
71
|
else
|
72
|
-
bag_pathname.children.each
|
72
|
+
bag_pathname.children.each(&:delete)
|
73
73
|
bag_pathname.rmdir
|
74
74
|
end
|
75
75
|
end
|
@@ -77,7 +77,7 @@ module Moab
|
|
77
77
|
end
|
78
78
|
|
79
79
|
# @param tar_pathname [Pathname] The location of the tar file (default is based on bag location)
|
80
|
-
def delete_tarfile
|
80
|
+
def delete_tarfile
|
81
81
|
bag_name = bag_pathname.basename
|
82
82
|
bag_parent = bag_pathname.parent
|
83
83
|
tar_pathname = bag_parent.join("#{bag_name}.tar")
|
@@ -140,7 +140,7 @@ module Moab
|
|
140
140
|
# Return true if successful or nil if the group was not found in the inventory
|
141
141
|
def deposit_group(group_id, source_dir)
|
142
142
|
group = bag_inventory.group(group_id)
|
143
|
-
return nil? if group.nil?
|
143
|
+
return nil? if group.nil? || group.files.empty?
|
144
144
|
target_dir = bag_pathname.join('data', group_id)
|
145
145
|
group.path_list.each do |relative_path|
|
146
146
|
source = source_dir.join(relative_path)
|
@@ -157,7 +157,7 @@ module Moab
|
|
157
157
|
# Return true if successful or nil if the group was not found in the inventory
|
158
158
|
def reconstuct_group(group_id, storage_object_dir)
|
159
159
|
group = bag_inventory.group(group_id)
|
160
|
-
return nil? if group.nil?
|
160
|
+
return nil? if group.nil? || group.files.empty?
|
161
161
|
target_dir = bag_pathname.join('data', group_id)
|
162
162
|
group.files.each do |file|
|
163
163
|
catalog_entry = signature_catalog.signature_hash[file.signature]
|
@@ -183,8 +183,8 @@ module Moab
|
|
183
183
|
# @api internal
|
184
184
|
# @return [void] Using the checksum information from the inventory, create BagIt manifest files for the payload
|
185
185
|
def create_payload_manifests
|
186
|
-
manifest_pathname =
|
187
|
-
manifest_file =
|
186
|
+
manifest_pathname = {}
|
187
|
+
manifest_file = {}
|
188
188
|
DEFAULT_CHECKSUM_TYPES.each do |type|
|
189
189
|
manifest_pathname[type] = bag_pathname.join("manifest-#{type}.txt")
|
190
190
|
manifest_file[type] = manifest_pathname[type].open('w')
|
@@ -205,7 +205,7 @@ module Moab
|
|
205
205
|
if manifest_file[type]
|
206
206
|
manifest_file[type].close
|
207
207
|
manifest_pathname[type].delete if
|
208
|
-
manifest_pathname[type].exist?
|
208
|
+
manifest_pathname[type].exist? && manifest_pathname[type].size == 0
|
209
209
|
end
|
210
210
|
end
|
211
211
|
end
|
@@ -222,9 +222,9 @@ module Moab
|
|
222
222
|
|
223
223
|
# @api internal
|
224
224
|
# @return [void] create BagIt tag manifest files containing checksums for all files in the bag's root directory
|
225
|
-
def create_tagfile_manifests
|
226
|
-
manifest_pathname =
|
227
|
-
manifest_file =
|
225
|
+
def create_tagfile_manifests
|
226
|
+
manifest_pathname = {}
|
227
|
+
manifest_file = {}
|
228
228
|
DEFAULT_CHECKSUM_TYPES.each do |type|
|
229
229
|
manifest_pathname[type] = bag_pathname.join("tagmanifest-#{type}.txt")
|
230
230
|
manifest_file[type] = manifest_pathname[type].open('w')
|
@@ -243,7 +243,7 @@ module Moab
|
|
243
243
|
if manifest_file[type]
|
244
244
|
manifest_file[type].close
|
245
245
|
manifest_pathname[type].delete if
|
246
|
-
manifest_pathname[type].exist?
|
246
|
+
manifest_pathname[type].exist? && manifest_pathname[type].size == 0
|
247
247
|
end
|
248
248
|
end
|
249
249
|
end
|
@@ -260,7 +260,7 @@ module Moab
|
|
260
260
|
shell_execute(tar_cmd.sub('--force-local', ''))
|
261
261
|
end
|
262
262
|
raise "Unable to create tarfile #{tar_pathname}" unless tar_pathname.exist?
|
263
|
-
|
263
|
+
true
|
264
264
|
end
|
265
265
|
|
266
266
|
# Executes a system command in a subprocess
|
data/lib/moab/config.rb
CHANGED
@@ -31,7 +31,7 @@ module Moab
|
|
31
31
|
}.freeze
|
32
32
|
|
33
33
|
REQUIRED_MANIFEST_CHECKSUM_TYPE = 'sha256'.freeze
|
34
|
-
RECOGNIZED_CHECKSUM_ALGORITHMS = [
|
34
|
+
RECOGNIZED_CHECKSUM_ALGORITHMS = %i[md5 sha1 sha256 sha384 sha512].freeze
|
35
35
|
|
36
36
|
TAGMANIFEST = 'tagmanifest'.freeze
|
37
37
|
MANIFEST = 'manifest'.freeze
|
data/lib/moab/file_group.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab'
|
2
|
-
|
3
1
|
module Moab
|
4
2
|
# A container for a standard subset of a digital objects {FileManifestation} objects
|
5
3
|
# Used to segregate depositor content from repository metadata files
|
@@ -22,8 +20,9 @@ module Moab
|
|
22
20
|
|
23
21
|
# (see Serializable#initialize)
|
24
22
|
def initialize(opts = {})
|
25
|
-
@signature_hash =
|
23
|
+
@signature_hash = {}
|
26
24
|
@data_source = ""
|
25
|
+
@signatures_from_bag = nil # prevents later warning: instance variable @signatures_from_bag not initialized
|
27
26
|
super(opts)
|
28
27
|
end
|
29
28
|
|
@@ -37,7 +36,7 @@ module Moab
|
|
37
36
|
|
38
37
|
# @attribute
|
39
38
|
# @return [Integer] The total number of data files (dynamically calculated)
|
40
|
-
attribute :file_count, Integer, :tag => 'fileCount', :on_save =>
|
39
|
+
attribute :file_count, Integer, :tag => 'fileCount', :on_save => proc { |i| i.to_s }
|
41
40
|
|
42
41
|
def file_count
|
43
42
|
files.inject(0) { |sum, manifestation| sum + manifestation.file_count }
|
@@ -45,7 +44,7 @@ module Moab
|
|
45
44
|
|
46
45
|
# @attribute
|
47
46
|
# @return [Integer] The total size (in bytes) of all data files (dynamically calculated)
|
48
|
-
attribute :byte_count, Integer, :tag => 'byteCount', :on_save =>
|
47
|
+
attribute :byte_count, Integer, :tag => 'byteCount', :on_save => proc { |i| i.to_s }
|
49
48
|
|
50
49
|
def byte_count
|
51
50
|
files.inject(0) { |sum, manifestation| sum + manifestation.byte_count }
|
@@ -53,7 +52,7 @@ module Moab
|
|
53
52
|
|
54
53
|
# @attribute
|
55
54
|
# @return [Integer] The total disk usage (in 1 kB blocks) of all data files (estimating du -k result) (dynamically calculated)
|
56
|
-
attribute :block_count, Integer, :tag => 'blockCount', :on_save =>
|
55
|
+
attribute :block_count, Integer, :tag => 'blockCount', :on_save => proc { |i| i.to_s }
|
57
56
|
|
58
57
|
def block_count
|
59
58
|
files.inject(0) { |sum, manifestation| sum + manifestation.block_count }
|
@@ -61,7 +60,7 @@ module Moab
|
|
61
60
|
|
62
61
|
# @return [Array<String>] The data fields to include in summary reports
|
63
62
|
def summary_fields
|
64
|
-
%w
|
63
|
+
%w[group_id file_count byte_count block_count]
|
65
64
|
end
|
66
65
|
|
67
66
|
# @attribute
|
@@ -80,7 +79,7 @@ module Moab
|
|
80
79
|
# @return [Hash<String,FileSignature>] An index of file paths,
|
81
80
|
# used to test for existence of a filename in this file group
|
82
81
|
def path_hash
|
83
|
-
path_hash =
|
82
|
+
path_hash = {}
|
84
83
|
signature_hash.each do |signature, manifestation|
|
85
84
|
manifestation.instances.each do |instance|
|
86
85
|
path_hash[instance.path] = signature
|
@@ -91,14 +90,14 @@ module Moab
|
|
91
90
|
|
92
91
|
# @return [Array<String>] The list of file paths in this group
|
93
92
|
def path_list
|
94
|
-
files.collect { |file| file.instances.collect
|
93
|
+
files.collect { |file| file.instances.collect(&:path) }.flatten
|
95
94
|
end
|
96
95
|
|
97
96
|
# @api internal
|
98
97
|
# @param signature_subset [Array<FileSignature>] The signatures used to select the entries to return
|
99
98
|
# @return [Hash<String,FileSignature>] A pathname,signature hash containing a subset of the filenames in this file group
|
100
99
|
def path_hash_subset(signature_subset)
|
101
|
-
path_hash =
|
100
|
+
path_hash = {}
|
102
101
|
signature_subset.each do |signature|
|
103
102
|
manifestation = signature_hash[signature]
|
104
103
|
manifestation.instances.each do |instance|
|
@@ -132,7 +131,7 @@ module Moab
|
|
132
131
|
# @return [void] Add a single {FileSignature},{FileInstance} key/value pair to this group.
|
133
132
|
# Data is actually stored in the {#signature_hash}
|
134
133
|
def add_file_instance(signature, instance)
|
135
|
-
if signature_hash.
|
134
|
+
if signature_hash.key?(signature)
|
136
135
|
manifestation = signature_hash[signature]
|
137
136
|
else
|
138
137
|
manifestation = FileManifestation.new
|
@@ -146,7 +145,7 @@ module Moab
|
|
146
145
|
# @return [void] Remove a file from the inventory
|
147
146
|
# for example, the manifest inventory does not contain a file entry for itself
|
148
147
|
def remove_file_having_path(path)
|
149
|
-
signature =
|
148
|
+
signature = path_hash[path]
|
150
149
|
signature_hash.delete(signature)
|
151
150
|
end
|
152
151
|
|
@@ -203,9 +202,8 @@ module Moab
|
|
203
202
|
pathname = Pathname.new(path).expand_path
|
204
203
|
validated ||= is_descendent_of_base?(pathname)
|
205
204
|
pathname.children.sort.each do |child|
|
206
|
-
if child.basename.to_s ==
|
207
|
-
|
208
|
-
elsif child.directory?
|
205
|
+
next if child.basename.to_s == '.DS_Store'
|
206
|
+
if child.directory?
|
209
207
|
harvest_directory(child, recursive, validated) if recursive
|
210
208
|
else
|
211
209
|
add_physical_file(child, validated)
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab'
|
2
|
-
|
3
1
|
module Moab
|
4
2
|
# Performs analysis and reports the differences between two matching {FileGroup} objects.
|
5
3
|
# The descending elements of the report hold a detailed breakdown of file-level differences, organized by change type.
|
@@ -64,7 +62,7 @@ module Moab
|
|
64
62
|
# @attribute
|
65
63
|
# @return [Integer] the total number of differences found between the two inventories that were
|
66
64
|
# compared (dynamically calculated)
|
67
|
-
attribute :difference_count, Integer, :tag => 'differenceCount', :on_save =>
|
65
|
+
attribute :difference_count, Integer, :tag => 'differenceCount', :on_save => proc { |i| i.to_s }
|
68
66
|
|
69
67
|
def difference_count
|
70
68
|
count = 0
|
@@ -76,49 +74,49 @@ module Moab
|
|
76
74
|
|
77
75
|
# @attribute
|
78
76
|
# @return [Integer] How many files were unchanged
|
79
|
-
attribute :identical, Integer, :on_save =>
|
77
|
+
attribute :identical, Integer, :on_save => proc { |n| n.to_s }
|
80
78
|
def identical
|
81
79
|
subset_hash[:identical].count
|
82
80
|
end
|
83
81
|
|
84
82
|
# @attribute
|
85
83
|
# @return [Integer] How many duplicate copies of files were added
|
86
|
-
attribute :copyadded, Integer, :on_save =>
|
84
|
+
attribute :copyadded, Integer, :on_save => proc { |n| n.to_s }
|
87
85
|
def copyadded
|
88
86
|
subset_hash[:copyadded].count
|
89
87
|
end
|
90
88
|
|
91
89
|
# @attribute
|
92
90
|
# @return [Integer] How many duplicate copies of files were deleted
|
93
|
-
attribute :copydeleted, Integer, :on_save =>
|
91
|
+
attribute :copydeleted, Integer, :on_save => proc { |n| n.to_s }
|
94
92
|
def copydeleted
|
95
93
|
subset_hash[:copydeleted].count
|
96
94
|
end
|
97
95
|
|
98
96
|
# @attribute
|
99
97
|
# @return [Integer] How many files were renamed
|
100
|
-
attribute :renamed, Integer, :on_save =>
|
98
|
+
attribute :renamed, Integer, :on_save => proc { |n| n.to_s }
|
101
99
|
def renamed
|
102
100
|
subset_hash[:renamed].count
|
103
101
|
end
|
104
102
|
|
105
103
|
# @attribute
|
106
104
|
# @return [Integer] How many files were modified
|
107
|
-
attribute :modified, Integer, :on_save =>
|
105
|
+
attribute :modified, Integer, :on_save => proc { |n| n.to_s }
|
108
106
|
def modified
|
109
107
|
subset_hash[:modified].count
|
110
108
|
end
|
111
109
|
|
112
110
|
# @attribute
|
113
111
|
# @return [Integer] How many files were added
|
114
|
-
attribute :added, Integer, :on_save =>
|
112
|
+
attribute :added, Integer, :on_save => proc { |n| n.to_s }
|
115
113
|
def added
|
116
114
|
subset_hash[:added].count
|
117
115
|
end
|
118
116
|
|
119
117
|
# @attribute
|
120
118
|
# @return [Integer] How many files were deleted
|
121
|
-
attribute :deleted, Integer, :on_save =>
|
119
|
+
attribute :deleted, Integer, :on_save => proc { |n| n.to_s }
|
122
120
|
def deleted
|
123
121
|
subset_hash[:deleted].count
|
124
122
|
end
|
@@ -133,19 +131,18 @@ module Moab
|
|
133
131
|
end
|
134
132
|
|
135
133
|
def subsets=(array)
|
136
|
-
|
137
|
-
|
138
|
-
end
|
134
|
+
return unless array
|
135
|
+
array.each { |subset| subset_hash[subset.change.to_sym] = subset }
|
139
136
|
end
|
140
137
|
|
141
138
|
# @return [Array<String>] The data fields to include in summary reports
|
142
139
|
def summary_fields
|
143
|
-
%w
|
140
|
+
%w[group_id difference_count identical copyadded copydeleted renamed modified deleted added]
|
144
141
|
end
|
145
142
|
|
146
143
|
# @api internal
|
147
144
|
# @return [FileGroupDifference] Clone just this element for inclusion in a versionMetadata structure
|
148
|
-
def summary
|
145
|
+
def summary
|
149
146
|
FileGroupDifference.new(
|
150
147
|
:group_id => group_id,
|
151
148
|
:identical => identical,
|
@@ -257,7 +254,7 @@ module Moab
|
|
257
254
|
other_only_paths = other_paths - basis_paths
|
258
255
|
maxsize = [basis_only_paths.size, other_only_paths.size].max
|
259
256
|
(0..maxsize - 1).each do |n|
|
260
|
-
fid = FileInstanceDifference.new
|
257
|
+
fid = FileInstanceDifference.new
|
261
258
|
fid.basis_path = basis_only_paths[n]
|
262
259
|
fid.other_path = other_only_paths[n]
|
263
260
|
fid.signatures << signature
|
@@ -331,20 +328,20 @@ module Moab
|
|
331
328
|
end
|
332
329
|
|
333
330
|
# @return [Hash<Symbol,Array>] Sets of filenames grouped by change type for use in performing file or metadata operations
|
334
|
-
def file_deltas
|
331
|
+
def file_deltas
|
335
332
|
# The hash to be returned
|
336
333
|
deltas = Hash.new { |hash, key| hash[key] = [] }
|
337
334
|
# case where other_path is empty or 'same'. (create array of strings)
|
338
|
-
[
|
339
|
-
deltas[change].concat(subset_hash[change].files.collect
|
335
|
+
%i[identical modified deleted copydeleted].each do |change|
|
336
|
+
deltas[change].concat(subset_hash[change].files.collect(&:basis_path))
|
340
337
|
end
|
341
338
|
# case where basis_path and other_path are both present. (create array of arrays)
|
342
|
-
[
|
339
|
+
%i[copyadded renamed].each do |change|
|
343
340
|
deltas[change].concat(subset_hash[change].files.collect { |file| [file.basis_path, file.other_path] })
|
344
341
|
end
|
345
342
|
# case where basis_path is empty. (create array of strings)
|
346
343
|
[:added].each do |change|
|
347
|
-
deltas[change].concat(subset_hash[change].files.collect
|
344
|
+
deltas[change].concat(subset_hash[change].files.collect(&:other_path))
|
348
345
|
end
|
349
346
|
deltas
|
350
347
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab'
|
2
|
-
|
3
1
|
module Moab
|
4
2
|
# A container for reporting a set of file-level differences of the type specified by the change attribute
|
5
3
|
#
|
@@ -20,7 +18,7 @@ module Moab
|
|
20
18
|
|
21
19
|
# (see Serializable#initialize)
|
22
20
|
def initialize(opts = {})
|
23
|
-
@files =
|
21
|
+
@files = []
|
24
22
|
super(opts)
|
25
23
|
end
|
26
24
|
|
@@ -30,7 +28,7 @@ module Moab
|
|
30
28
|
|
31
29
|
# @attribute
|
32
30
|
# @return [Integer] How many files were changed
|
33
|
-
attribute :count, Integer, :on_save =>
|
31
|
+
attribute :count, Integer, :on_save => proc { |n| n.to_s }
|
34
32
|
|
35
33
|
def count
|
36
34
|
files.size
|
data/lib/moab/file_instance.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab'
|
2
|
-
|
3
1
|
module Moab
|
4
2
|
# The file path and last modification date properties of a file
|
5
3
|
#
|
@@ -54,7 +52,7 @@ module Moab
|
|
54
52
|
# @return [Boolean] Returns true if self and other have the same path.
|
55
53
|
def eql?(other)
|
56
54
|
return false unless other.respond_to?(:path) # Cannot equal an incomparable type!
|
57
|
-
|
55
|
+
path == other.path
|
58
56
|
end
|
59
57
|
|
60
58
|
# @api internal
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab'
|
2
|
-
|
3
1
|
module Moab
|
4
2
|
# A container for recording difference information at the file level
|
5
3
|
# * If there was no change, the change type is set to <i>identical</i>
|
@@ -28,7 +26,7 @@ module Moab
|
|
28
26
|
|
29
27
|
# (see Serializable#initialize)
|
30
28
|
def initialize(opts = {})
|
31
|
-
@signatures =
|
29
|
+
@signatures = []
|
32
30
|
super(opts)
|
33
31
|
end
|
34
32
|
|
@@ -38,11 +36,11 @@ module Moab
|
|
38
36
|
|
39
37
|
# @attribute
|
40
38
|
# @return [String] The file's path in the basis inventory (usually for an old version)
|
41
|
-
attribute :basis_path, String, :tag => 'basisPath', :on_save =>
|
39
|
+
attribute :basis_path, String, :tag => 'basisPath', :on_save => proc { |s| s.to_s }
|
42
40
|
|
43
41
|
# @attribute
|
44
42
|
# @return [String] The file's path in the other inventory (usually for an new version) compared against the basis
|
45
|
-
attribute :other_path, String, :tag => 'otherPath', :on_save =>
|
43
|
+
attribute :other_path, String, :tag => 'otherPath', :on_save => proc { |s| s.to_s }
|
46
44
|
|
47
45
|
# @attribute
|
48
46
|
# @return [Array<FileSignature>] The fixity data of the file manifestation(s) (plural if change was a content modification)
|
data/lib/moab/file_inventory.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab'
|
2
|
-
|
3
1
|
module Moab
|
4
2
|
# A structured container for recording information about a collection of related files.
|
5
3
|
#
|
@@ -35,7 +33,7 @@ module Moab
|
|
35
33
|
|
36
34
|
# (see Serializable#initialize)
|
37
35
|
def initialize(opts = {})
|
38
|
-
@groups =
|
36
|
+
@groups = []
|
39
37
|
@inventory_datetime = Time.now
|
40
38
|
super(opts)
|
41
39
|
end
|
@@ -50,7 +48,7 @@ module Moab
|
|
50
48
|
|
51
49
|
# @attribute
|
52
50
|
# @return [Integer] The ordinal version number
|
53
|
-
attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save =>
|
51
|
+
attribute :version_id, Integer, :tag => 'versionId', :key => true, :on_save => proc { |n| n.to_s }
|
54
52
|
|
55
53
|
# @return [String] The unique identifier concatenating digital object id with version id
|
56
54
|
def composite_key
|
@@ -71,7 +69,7 @@ module Moab
|
|
71
69
|
|
72
70
|
# @attribute
|
73
71
|
# @return [Integer] The total number of data files in the inventory (dynamically calculated)
|
74
|
-
attribute :file_count, Integer, :tag => 'fileCount', :on_save =>
|
72
|
+
attribute :file_count, Integer, :tag => 'fileCount', :on_save => proc { |t| t.to_s }
|
75
73
|
|
76
74
|
def file_count
|
77
75
|
groups.inject(0) { |sum, group| sum + group.file_count }
|
@@ -79,7 +77,7 @@ module Moab
|
|
79
77
|
|
80
78
|
# @attribute
|
81
79
|
# @return [Integer] The total size (in bytes) in all files of all files in the inventory (dynamically calculated)
|
82
|
-
attribute :byte_count, Integer, :tag => 'byteCount', :on_save =>
|
80
|
+
attribute :byte_count, Integer, :tag => 'byteCount', :on_save => proc { |t| t.to_s }
|
83
81
|
|
84
82
|
def byte_count
|
85
83
|
groups.inject(0) { |sum, group| sum + group.byte_count }
|
@@ -87,7 +85,7 @@ module Moab
|
|
87
85
|
|
88
86
|
# @attribute
|
89
87
|
# @return [Integer] The total disk usage (in 1 kB blocks) of all data files (estimating du -k result) (dynamically calculated)
|
90
|
-
attribute :block_count, Integer, :tag => 'blockCount', :on_save =>
|
88
|
+
attribute :block_count, Integer, :tag => 'blockCount', :on_save => proc { |t| t.to_s }
|
91
89
|
|
92
90
|
def block_count
|
93
91
|
groups.inject(0) { |sum, group| sum + group.block_count }
|
@@ -99,14 +97,14 @@ module Moab
|
|
99
97
|
|
100
98
|
# @return [Array<FileGroup] The set of data groups that contain files
|
101
99
|
def non_empty_groups
|
102
|
-
groups.
|
100
|
+
groups.reject { |group| group.files.empty? }
|
103
101
|
end
|
104
102
|
|
105
103
|
# @param non_empty [Boolean] if true, return group_id's only for groups having files
|
106
104
|
# @return [Array<String>] group identifiers contained in this file inventory
|
107
105
|
def group_ids(non_empty = nil)
|
108
|
-
my_groups = non_empty ?
|
109
|
-
my_groups.map
|
106
|
+
my_groups = non_empty ? non_empty_groups : groups
|
107
|
+
my_groups.map(&:group_id)
|
110
108
|
end
|
111
109
|
|
112
110
|
# @param [String] group_id The identifer of the group to be selected
|
@@ -119,12 +117,12 @@ module Moab
|
|
119
117
|
# @return [Boolean] true if the group is missing or empty
|
120
118
|
def group_empty?(group_id)
|
121
119
|
group = self.group(group_id)
|
122
|
-
group.nil?
|
120
|
+
group.nil? || group.files.empty?
|
123
121
|
end
|
124
122
|
|
125
123
|
# @return [Array<String>] The data fields to include in summary reports
|
126
124
|
def summary_fields
|
127
|
-
%w
|
125
|
+
%w[type digital_object_id version_id inventory_datetime file_count byte_count block_count groups]
|
128
126
|
end
|
129
127
|
|
130
128
|
# @param [String] group_id The identifer of the group to be selected
|
@@ -161,17 +159,9 @@ module Moab
|
|
161
159
|
def data_source
|
162
160
|
data_source = (groups.collect { |g| g.data_source.to_s }).join('|')
|
163
161
|
if data_source.start_with?('contentMetadata')
|
164
|
-
|
165
|
-
"v#{version_id}-#{data_source}"
|
166
|
-
else
|
167
|
-
"new-#{data_source}"
|
168
|
-
end
|
162
|
+
version_id ? "v#{version_id}-#{data_source}" : "new-#{data_source}"
|
169
163
|
else
|
170
|
-
|
171
|
-
"v#{version_id}"
|
172
|
-
else
|
173
|
-
data_source
|
174
|
-
end
|
164
|
+
version_id ? "v#{version_id}" : data_source
|
175
165
|
end
|
176
166
|
end
|
177
167
|
|
@@ -185,7 +175,7 @@ module Moab
|
|
185
175
|
if group_id
|
186
176
|
groups << FileGroup.new(group_id: group_id).group_from_directory(data_dir)
|
187
177
|
else
|
188
|
-
[
|
178
|
+
%w[content metadata].each do |gid|
|
189
179
|
groups << FileGroup.new(group_id: gid).group_from_directory(Pathname(data_dir).join(gid))
|
190
180
|
end
|
191
181
|
end
|
@@ -208,7 +198,7 @@ module Moab
|
|
208
198
|
# @param bag_pathname [Pathname] The location of the BagIt bag to be inventoried
|
209
199
|
# @return [Hash<Pathname,FileSignature>] The fixity data present in the bag's manifest files
|
210
200
|
def signatures_from_bagit_manifests(bag_pathname)
|
211
|
-
manifest_pathname =
|
201
|
+
manifest_pathname = {}
|
212
202
|
DEFAULT_CHECKSUM_TYPES.each do |type|
|
213
203
|
manifest_pathname[type] = bag_pathname.join("manifest-#{type}.txt")
|
214
204
|
end
|
@@ -235,14 +225,14 @@ module Moab
|
|
235
225
|
def human_size
|
236
226
|
count = 0
|
237
227
|
size = byte_count
|
238
|
-
while size >= 1024
|
228
|
+
while (size >= 1024) && (count < 4)
|
239
229
|
size /= 1024.0
|
240
230
|
count += 1
|
241
231
|
end
|
242
232
|
if count == 0
|
243
|
-
|
233
|
+
format("%d B", size)
|
244
234
|
else
|
245
|
-
|
235
|
+
format("%.2f %s", size, %w[B KB MB GB TB][count])
|
246
236
|
end
|
247
237
|
end
|
248
238
|
|