moab-versioning 4.2.1 → 4.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/moab.rb +3 -2
- data/lib/moab/bagger.rb +25 -20
- data/lib/moab/config.rb +39 -8
- data/lib/moab/deposit_bag_validator.rb +22 -17
- data/lib/moab/exceptions.rb +10 -8
- data/lib/moab/file_group.rb +23 -22
- data/lib/moab/file_group_difference.rb +35 -35
- data/lib/moab/file_group_difference_subset.rb +5 -5
- data/lib/moab/file_instance.rb +4 -3
- data/lib/moab/file_instance_difference.rb +5 -5
- data/lib/moab/file_inventory.rb +25 -31
- data/lib/moab/file_inventory_difference.rb +11 -11
- data/lib/moab/file_manifestation.rb +8 -7
- data/lib/moab/file_signature.rb +35 -41
- data/lib/moab/signature_catalog.rb +19 -21
- data/lib/moab/signature_catalog_entry.rb +5 -5
- data/lib/moab/stanford.rb +2 -0
- data/lib/moab/storage_object.rb +23 -24
- data/lib/moab/storage_object_validator.rb +44 -16
- data/lib/moab/storage_object_version.rb +45 -40
- data/lib/moab/storage_repository.rb +59 -24
- data/lib/moab/storage_services.rb +17 -10
- data/lib/moab/utc_time.rb +3 -3
- data/lib/moab/verification_result.rb +3 -4
- data/lib/moab/version_metadata.rb +4 -4
- data/lib/moab/version_metadata_entry.rb +6 -6
- data/lib/moab/version_metadata_event.rb +1 -1
- data/lib/serializer.rb +2 -0
- data/lib/serializer/manifest.rb +9 -7
- data/lib/serializer/serializable.rb +41 -35
- data/lib/stanford/active_fedora_object.rb +1 -1
- data/lib/stanford/content_inventory.rb +40 -34
- data/lib/stanford/dor_metadata.rb +4 -3
- data/lib/stanford/moab_storage_directory.rb +4 -2
- data/lib/stanford/storage_object_validator.rb +1 -1
- data/lib/stanford/storage_repository.rb +9 -6
- data/lib/stanford/storage_services.rb +6 -6
- metadata +23 -38
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Moab
|
4
4
|
# Performs analysis and reports the differences between two matching {FileGroup} objects.
|
@@ -53,18 +53,18 @@ module Moab
|
|
53
53
|
|
54
54
|
# (see Serializable#initialize)
|
55
55
|
def initialize(opts = {})
|
56
|
-
@subset_hash = Hash.new { |hash, key| hash[key] = FileGroupDifferenceSubset.new(:
|
56
|
+
@subset_hash = Hash.new { |hash, key| hash[key] = FileGroupDifferenceSubset.new(change: key.to_s) }
|
57
57
|
super(opts)
|
58
58
|
end
|
59
59
|
|
60
60
|
# @attribute
|
61
61
|
# @return [String] The name of the file group
|
62
|
-
attribute :group_id, String, :
|
62
|
+
attribute :group_id, String, tag: 'groupId', key: true
|
63
63
|
|
64
64
|
# @attribute
|
65
65
|
# @return [Integer] the total number of differences found between the two inventories that were
|
66
66
|
# compared (dynamically calculated)
|
67
|
-
attribute :difference_count, Integer, :
|
67
|
+
attribute :difference_count, Integer, tag: 'differenceCount', on_save: proc { |i| i.to_s }
|
68
68
|
|
69
69
|
def difference_count
|
70
70
|
count = 0
|
@@ -76,49 +76,49 @@ module Moab
|
|
76
76
|
|
77
77
|
# @attribute
|
78
78
|
# @return [Integer] How many files were unchanged
|
79
|
-
attribute :identical, Integer, :
|
79
|
+
attribute :identical, Integer, on_save: proc { |n| n.to_s }
|
80
80
|
def identical
|
81
81
|
subset_hash[:identical].count
|
82
82
|
end
|
83
83
|
|
84
84
|
# @attribute
|
85
85
|
# @return [Integer] How many duplicate copies of files were added
|
86
|
-
attribute :copyadded, Integer, :
|
86
|
+
attribute :copyadded, Integer, on_save: proc { |n| n.to_s }
|
87
87
|
def copyadded
|
88
88
|
subset_hash[:copyadded].count
|
89
89
|
end
|
90
90
|
|
91
91
|
# @attribute
|
92
92
|
# @return [Integer] How many duplicate copies of files were deleted
|
93
|
-
attribute :copydeleted, Integer, :
|
93
|
+
attribute :copydeleted, Integer, on_save: proc { |n| n.to_s }
|
94
94
|
def copydeleted
|
95
95
|
subset_hash[:copydeleted].count
|
96
96
|
end
|
97
97
|
|
98
98
|
# @attribute
|
99
99
|
# @return [Integer] How many files were renamed
|
100
|
-
attribute :renamed, Integer, :
|
100
|
+
attribute :renamed, Integer, on_save: proc { |n| n.to_s }
|
101
101
|
def renamed
|
102
102
|
subset_hash[:renamed].count
|
103
103
|
end
|
104
104
|
|
105
105
|
# @attribute
|
106
106
|
# @return [Integer] How many files were modified
|
107
|
-
attribute :modified, Integer, :
|
107
|
+
attribute :modified, Integer, on_save: proc { |n| n.to_s }
|
108
108
|
def modified
|
109
109
|
subset_hash[:modified].count
|
110
110
|
end
|
111
111
|
|
112
112
|
# @attribute
|
113
113
|
# @return [Integer] How many files were added
|
114
|
-
attribute :added, Integer, :
|
114
|
+
attribute :added, Integer, on_save: proc { |n| n.to_s }
|
115
115
|
def added
|
116
116
|
subset_hash[:added].count
|
117
117
|
end
|
118
118
|
|
119
119
|
# @attribute
|
120
120
|
# @return [Integer] How many files were deleted
|
121
|
-
attribute :deleted, Integer, :
|
121
|
+
attribute :deleted, Integer, on_save: proc { |n| n.to_s }
|
122
122
|
def deleted
|
123
123
|
subset_hash[:deleted].count
|
124
124
|
end
|
@@ -126,35 +126,35 @@ module Moab
|
|
126
126
|
# @attribute
|
127
127
|
# @return [Array<FileGroupDifferenceSubset>] A set of Arrays (one for each change type),
|
128
128
|
# each of which contains an collection of file-level differences having that change type.
|
129
|
-
has_many :subsets, FileGroupDifferenceSubset, :
|
129
|
+
has_many :subsets, FileGroupDifferenceSubset, tag: 'subset'
|
130
130
|
|
131
131
|
def subsets
|
132
132
|
subset_hash.values
|
133
133
|
end
|
134
134
|
|
135
135
|
def subsets=(array)
|
136
|
-
|
137
|
-
|
138
|
-
|
136
|
+
return unless array
|
137
|
+
|
138
|
+
array.each { |subset| subset_hash[subset.change.to_sym] = subset }
|
139
139
|
end
|
140
140
|
|
141
141
|
# @return [Array<String>] The data fields to include in summary reports
|
142
142
|
def summary_fields
|
143
|
-
%w
|
143
|
+
%w[group_id difference_count identical copyadded copydeleted renamed modified deleted added]
|
144
144
|
end
|
145
145
|
|
146
146
|
# @api internal
|
147
147
|
# @return [FileGroupDifference] Clone just this element for inclusion in a versionMetadata structure
|
148
|
-
def summary
|
148
|
+
def summary
|
149
149
|
FileGroupDifference.new(
|
150
|
-
:
|
151
|
-
:
|
152
|
-
:
|
153
|
-
:
|
154
|
-
:
|
155
|
-
:
|
156
|
-
:
|
157
|
-
:
|
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
|
158
158
|
)
|
159
159
|
end
|
160
160
|
|
@@ -231,7 +231,7 @@ module Moab
|
|
231
231
|
other_paths = other_signature_hash[signature].paths
|
232
232
|
matching_paths = basis_paths & other_paths
|
233
233
|
matching_paths.each do |path|
|
234
|
-
fid = FileInstanceDifference.new(:
|
234
|
+
fid = FileInstanceDifference.new(change: 'identical')
|
235
235
|
fid.basis_path = path
|
236
236
|
fid.other_path = "same"
|
237
237
|
fid.signatures << signature
|
@@ -257,7 +257,7 @@ module Moab
|
|
257
257
|
other_only_paths = other_paths - basis_paths
|
258
258
|
maxsize = [basis_only_paths.size, other_only_paths.size].max
|
259
259
|
(0..maxsize - 1).each do |n|
|
260
|
-
fid = FileInstanceDifference.new
|
260
|
+
fid = FileInstanceDifference.new
|
261
261
|
fid.basis_path = basis_only_paths[n]
|
262
262
|
fid.other_path = other_only_paths[n]
|
263
263
|
fid.signatures << signature
|
@@ -284,7 +284,7 @@ module Moab
|
|
284
284
|
# Container for reporting the set of file-level differences of type 'modified'
|
285
285
|
def tabulate_modified_files(basis_path_hash, other_path_hash)
|
286
286
|
matching_keys(basis_path_hash, other_path_hash).each do |path|
|
287
|
-
fid = FileInstanceDifference.new(:
|
287
|
+
fid = FileInstanceDifference.new(change: 'modified')
|
288
288
|
fid.basis_path = path
|
289
289
|
fid.other_path = "same"
|
290
290
|
fid.signatures << basis_path_hash[path]
|
@@ -303,7 +303,7 @@ module Moab
|
|
303
303
|
# Container for reporting the set of file-level differences of type 'added'
|
304
304
|
def tabulate_added_files(basis_path_hash, other_path_hash)
|
305
305
|
other_only_keys(basis_path_hash, other_path_hash).each do |path|
|
306
|
-
fid = FileInstanceDifference.new(:
|
306
|
+
fid = FileInstanceDifference.new(change: 'added')
|
307
307
|
fid.basis_path = ""
|
308
308
|
fid.other_path = path
|
309
309
|
fid.signatures << other_path_hash[path]
|
@@ -321,7 +321,7 @@ module Moab
|
|
321
321
|
# Container for reporting the set of file-level differences of type 'deleted'
|
322
322
|
def tabulate_deleted_files(basis_path_hash, other_path_hash)
|
323
323
|
basis_only_keys(basis_path_hash, other_path_hash).each do |path|
|
324
|
-
fid = FileInstanceDifference.new(:
|
324
|
+
fid = FileInstanceDifference.new(change: 'deleted')
|
325
325
|
fid.basis_path = path
|
326
326
|
fid.other_path = ""
|
327
327
|
fid.signatures << basis_path_hash[path]
|
@@ -331,20 +331,20 @@ module Moab
|
|
331
331
|
end
|
332
332
|
|
333
333
|
# @return [Hash<Symbol,Array>] Sets of filenames grouped by change type for use in performing file or metadata operations
|
334
|
-
def file_deltas
|
334
|
+
def file_deltas
|
335
335
|
# The hash to be returned
|
336
336
|
deltas = Hash.new { |hash, key| hash[key] = [] }
|
337
337
|
# case where other_path is empty or 'same'. (create array of strings)
|
338
|
-
[
|
339
|
-
deltas[change].concat(subset_hash[change].files.collect
|
338
|
+
%i[identical modified deleted copydeleted].each do |change|
|
339
|
+
deltas[change].concat(subset_hash[change].files.collect(&:basis_path))
|
340
340
|
end
|
341
341
|
# case where basis_path and other_path are both present. (create array of arrays)
|
342
|
-
[
|
342
|
+
%i[copyadded renamed].each do |change|
|
343
343
|
deltas[change].concat(subset_hash[change].files.collect { |file| [file.basis_path, file.other_path] })
|
344
344
|
end
|
345
345
|
# case where basis_path is empty. (create array of strings)
|
346
346
|
[:added].each do |change|
|
347
|
-
deltas[change].concat(subset_hash[change].files.collect
|
347
|
+
deltas[change].concat(subset_hash[change].files.collect(&:other_path))
|
348
348
|
end
|
349
349
|
deltas
|
350
350
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Moab
|
4
4
|
# A container for reporting a set of file-level differences of the type specified by the change attribute
|
@@ -20,17 +20,17 @@ module Moab
|
|
20
20
|
|
21
21
|
# (see Serializable#initialize)
|
22
22
|
def initialize(opts = {})
|
23
|
-
@files =
|
23
|
+
@files = []
|
24
24
|
super(opts)
|
25
25
|
end
|
26
26
|
|
27
27
|
# @attribute
|
28
28
|
# @return [String] The type of change (identical|renamed|modified|deleted|added)
|
29
|
-
attribute :change, String, :
|
29
|
+
attribute :change, String, key: true
|
30
30
|
|
31
31
|
# @attribute
|
32
32
|
# @return [Integer] How many files were changed
|
33
|
-
attribute :count, Integer, :
|
33
|
+
attribute :count, Integer, on_save: proc { |n| n.to_s }
|
34
34
|
|
35
35
|
def count
|
36
36
|
files.size
|
@@ -38,6 +38,6 @@ module Moab
|
|
38
38
|
|
39
39
|
# @attribute
|
40
40
|
# @return [Array<FileInstanceDifference>] The set of file instances having this type of change
|
41
|
-
has_many :files, FileInstanceDifference, :
|
41
|
+
has_many :files, FileInstanceDifference, tag: 'file'
|
42
42
|
end
|
43
43
|
end
|
data/lib/moab/file_instance.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Moab
|
4
4
|
# The file path and last modification date properties of a file
|
@@ -25,7 +25,7 @@ module Moab
|
|
25
25
|
|
26
26
|
# @attribute
|
27
27
|
# @return [String] The id is the filename path, relative to the file group's base directory
|
28
|
-
attribute :path, String, :
|
28
|
+
attribute :path, String, key: true
|
29
29
|
|
30
30
|
# @attribute
|
31
31
|
# @return [String] gsub(/\n/,' ')
|
@@ -54,7 +54,8 @@ module Moab
|
|
54
54
|
# @return [Boolean] Returns true if self and other have the same path.
|
55
55
|
def eql?(other)
|
56
56
|
return false unless other.respond_to?(:path) # Cannot equal an incomparable type!
|
57
|
-
|
57
|
+
|
58
|
+
path == other.path
|
58
59
|
end
|
59
60
|
|
60
61
|
# @api internal
|
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Moab
|
4
4
|
# A container for recording difference information at the file level
|
@@ -28,7 +28,7 @@ module Moab
|
|
28
28
|
|
29
29
|
# (see Serializable#initialize)
|
30
30
|
def initialize(opts = {})
|
31
|
-
@signatures =
|
31
|
+
@signatures = []
|
32
32
|
super(opts)
|
33
33
|
end
|
34
34
|
|
@@ -38,14 +38,14 @@ module Moab
|
|
38
38
|
|
39
39
|
# @attribute
|
40
40
|
# @return [String] The file's path in the basis inventory (usually for an old version)
|
41
|
-
attribute :basis_path, String, :
|
41
|
+
attribute :basis_path, String, tag: 'basisPath', on_save: proc { |s| s.to_s }
|
42
42
|
|
43
43
|
# @attribute
|
44
44
|
# @return [String] The file's path in the other inventory (usually for an new version) compared against the basis
|
45
|
-
attribute :other_path, String, :
|
45
|
+
attribute :other_path, String, tag: 'otherPath', on_save: proc { |s| s.to_s }
|
46
46
|
|
47
47
|
# @attribute
|
48
48
|
# @return [Array<FileSignature>] The fixity data of the file manifestation(s) (plural if change was a content modification)
|
49
|
-
has_many :signatures, FileSignature, :
|
49
|
+
has_many :signatures, FileSignature, tag: 'fileSignature'
|
50
50
|
end
|
51
51
|
end
|
data/lib/moab/file_inventory.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Moab
|
4
4
|
# A structured container for recording information about a collection of related files.
|
@@ -35,7 +35,7 @@ module Moab
|
|
35
35
|
|
36
36
|
# (see Serializable#initialize)
|
37
37
|
def initialize(opts = {})
|
38
|
-
@groups =
|
38
|
+
@groups = []
|
39
39
|
@inventory_datetime = Time.now
|
40
40
|
super(opts)
|
41
41
|
end
|
@@ -46,20 +46,20 @@ module Moab
|
|
46
46
|
|
47
47
|
# @attribute
|
48
48
|
# @return [String] The digital object identifier (druid)
|
49
|
-
attribute :digital_object_id, String, :
|
49
|
+
attribute :digital_object_id, String, tag: 'objectId'
|
50
50
|
|
51
51
|
# @attribute
|
52
52
|
# @return [Integer] The ordinal version number
|
53
|
-
attribute :version_id, Integer, :
|
53
|
+
attribute :version_id, Integer, tag: 'versionId', key: true, on_save: proc { |n| n.to_s }
|
54
54
|
|
55
55
|
# @return [String] The unique identifier concatenating digital object id with version id
|
56
56
|
def composite_key
|
57
|
-
digital_object_id
|
57
|
+
"#{digital_object_id}-#{StorageObject.version_dirname(version_id)}"
|
58
58
|
end
|
59
59
|
|
60
60
|
# @attribute
|
61
61
|
# @return [String] The datetime at which the inventory was created
|
62
|
-
attribute :inventory_datetime, String, :
|
62
|
+
attribute :inventory_datetime, String, tag: 'inventoryDatetime'
|
63
63
|
|
64
64
|
def inventory_datetime=(datetime)
|
65
65
|
@inventory_datetime = Moab::UtcTime.input(datetime)
|
@@ -71,7 +71,7 @@ module Moab
|
|
71
71
|
|
72
72
|
# @attribute
|
73
73
|
# @return [Integer] The total number of data files in the inventory (dynamically calculated)
|
74
|
-
attribute :file_count, Integer, :
|
74
|
+
attribute :file_count, Integer, tag: 'fileCount', on_save: proc { |t| t.to_s }
|
75
75
|
|
76
76
|
def file_count
|
77
77
|
groups.inject(0) { |sum, group| sum + group.file_count }
|
@@ -79,7 +79,7 @@ module Moab
|
|
79
79
|
|
80
80
|
# @attribute
|
81
81
|
# @return [Integer] The total size (in bytes) in all files of all files in the inventory (dynamically calculated)
|
82
|
-
attribute :byte_count, Integer, :
|
82
|
+
attribute :byte_count, Integer, tag: 'byteCount', on_save: proc { |t| t.to_s }
|
83
83
|
|
84
84
|
def byte_count
|
85
85
|
groups.inject(0) { |sum, group| sum + group.byte_count }
|
@@ -87,7 +87,7 @@ module Moab
|
|
87
87
|
|
88
88
|
# @attribute
|
89
89
|
# @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, :
|
90
|
+
attribute :block_count, Integer, tag: 'blockCount', on_save: proc { |t| t.to_s }
|
91
91
|
|
92
92
|
def block_count
|
93
93
|
groups.inject(0) { |sum, group| sum + group.block_count }
|
@@ -95,18 +95,18 @@ module Moab
|
|
95
95
|
|
96
96
|
# @attribute
|
97
97
|
# @return [Array<FileGroup>] The set of data groups comprising the version
|
98
|
-
has_many :groups, FileGroup, :
|
98
|
+
has_many :groups, FileGroup, tag: 'fileGroup'
|
99
99
|
|
100
100
|
# @return [Array<FileGroup] The set of data groups that contain files
|
101
101
|
def non_empty_groups
|
102
|
-
groups.
|
102
|
+
groups.reject { |group| group.files.empty? }
|
103
103
|
end
|
104
104
|
|
105
105
|
# @param non_empty [Boolean] if true, return group_id's only for groups having files
|
106
106
|
# @return [Array<String>] group identifiers contained in this file inventory
|
107
107
|
def group_ids(non_empty = nil)
|
108
|
-
my_groups = non_empty ?
|
109
|
-
my_groups.map
|
108
|
+
my_groups = non_empty ? non_empty_groups : groups
|
109
|
+
my_groups.map(&:group_id)
|
110
110
|
end
|
111
111
|
|
112
112
|
# @param [String] group_id The identifer of the group to be selected
|
@@ -119,12 +119,12 @@ module Moab
|
|
119
119
|
# @return [Boolean] true if the group is missing or empty
|
120
120
|
def group_empty?(group_id)
|
121
121
|
group = self.group(group_id)
|
122
|
-
group.nil?
|
122
|
+
group.nil? || group.files.empty?
|
123
123
|
end
|
124
124
|
|
125
125
|
# @return [Array<String>] The data fields to include in summary reports
|
126
126
|
def summary_fields
|
127
|
-
%w
|
127
|
+
%w[type digital_object_id version_id inventory_datetime file_count byte_count block_count groups]
|
128
128
|
end
|
129
129
|
|
130
130
|
# @param [String] group_id The identifer of the group to be selected
|
@@ -134,9 +134,11 @@ module Moab
|
|
134
134
|
file_group = group(group_id)
|
135
135
|
errmsg = "group #{group_id} not found for #{digital_object_id} - #{version_id}"
|
136
136
|
raise FileNotFoundException, errmsg if file_group.nil?
|
137
|
+
|
137
138
|
file_signature = file_group.path_hash[file_id]
|
138
139
|
errmsg = "#{group_id} file #{file_id} not found for #{digital_object_id} - #{version_id}"
|
139
140
|
raise FileNotFoundException, errmsg if file_signature.nil?
|
141
|
+
|
140
142
|
file_signature
|
141
143
|
end
|
142
144
|
|
@@ -161,17 +163,9 @@ module Moab
|
|
161
163
|
def data_source
|
162
164
|
data_source = (groups.collect { |g| g.data_source.to_s }).join('|')
|
163
165
|
if data_source.start_with?('contentMetadata')
|
164
|
-
|
165
|
-
"v#{version_id}-#{data_source}"
|
166
|
-
else
|
167
|
-
"new-#{data_source}"
|
168
|
-
end
|
166
|
+
version_id ? "v#{version_id}-#{data_source}" : "new-#{data_source}"
|
169
167
|
else
|
170
|
-
|
171
|
-
"v#{version_id}"
|
172
|
-
else
|
173
|
-
data_source
|
174
|
-
end
|
168
|
+
version_id ? "v#{version_id}" : data_source
|
175
169
|
end
|
176
170
|
end
|
177
171
|
|
@@ -185,7 +179,7 @@ module Moab
|
|
185
179
|
if group_id
|
186
180
|
groups << FileGroup.new(group_id: group_id).group_from_directory(data_dir)
|
187
181
|
else
|
188
|
-
[
|
182
|
+
%w[content metadata].each do |gid|
|
189
183
|
groups << FileGroup.new(group_id: gid).group_from_directory(Pathname(data_dir).join(gid))
|
190
184
|
end
|
191
185
|
end
|
@@ -200,7 +194,7 @@ module Moab
|
|
200
194
|
signatures_from_bag = signatures_from_bagit_manifests(bag_pathname)
|
201
195
|
bag_data_subdirs = bag_pathname.join('data').children
|
202
196
|
bag_data_subdirs.each do |subdir|
|
203
|
-
groups << FileGroup.new(:
|
197
|
+
groups << FileGroup.new(group_id: subdir.basename.to_s).group_from_bagit_subdir(subdir, signatures_from_bag)
|
204
198
|
end
|
205
199
|
self
|
206
200
|
end
|
@@ -208,7 +202,7 @@ module Moab
|
|
208
202
|
# @param bag_pathname [Pathname] The location of the BagIt bag to be inventoried
|
209
203
|
# @return [Hash<Pathname,FileSignature>] The fixity data present in the bag's manifest files
|
210
204
|
def signatures_from_bagit_manifests(bag_pathname)
|
211
|
-
manifest_pathname =
|
205
|
+
manifest_pathname = {}
|
212
206
|
DEFAULT_CHECKSUM_TYPES.each do |type|
|
213
207
|
manifest_pathname[type] = bag_pathname.join("manifest-#{type}.txt")
|
214
208
|
end
|
@@ -235,14 +229,14 @@ module Moab
|
|
235
229
|
def human_size
|
236
230
|
count = 0
|
237
231
|
size = byte_count
|
238
|
-
while size >= 1024
|
232
|
+
while (size >= 1024) && (count < 4)
|
239
233
|
size /= 1024.0
|
240
234
|
count += 1
|
241
235
|
end
|
242
236
|
if count == 0
|
243
|
-
|
237
|
+
format("%d B", size)
|
244
238
|
else
|
245
|
-
|
239
|
+
format("%.2f %s", size, %w[B KB MB GB TB][count])
|
246
240
|
end
|
247
241
|
end
|
248
242
|
|