moab-versioning 4.4.1 → 4.4.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/deposit_bag_validator.rb +2 -2
- data/lib/moab/exceptions.rb +4 -0
- data/lib/moab/file_group.rb +6 -6
- data/lib/moab/file_group_difference.rb +23 -23
- data/lib/moab/file_group_difference_subset.rb +3 -3
- data/lib/moab/file_instance.rb +1 -1
- data/lib/moab/file_instance_difference.rb +3 -3
- data/lib/moab/file_inventory.rb +9 -9
- data/lib/moab/file_inventory_difference.rb +6 -6
- data/lib/moab/file_manifestation.rb +2 -2
- data/lib/moab/file_signature.rb +5 -5
- data/lib/moab/signature_catalog.rb +10 -10
- data/lib/moab/signature_catalog_entry.rb +4 -4
- data/lib/moab/storage_object.rb +5 -5
- data/lib/moab/storage_object_validator.rb +2 -2
- data/lib/moab/storage_object_version.rb +12 -12
- data/lib/moab/storage_repository.rb +1 -1
- data/lib/moab/storage_services.rb +3 -3
- data/lib/moab/version_metadata.rb +2 -2
- data/lib/moab/version_metadata_entry.rb +4 -4
- data/lib/serializer/manifest.rb +2 -2
- data/lib/serializer/serializable.rb +1 -1
- data/lib/stanford/content_inventory.rb +19 -19
- data/lib/stanford/dor_metadata.rb +3 -2
- data/lib/stanford/storage_repository.rb +2 -2
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4b576c73187205ae4548c6460bac2b68cedab5dc7c3b94a66a5d8ec13729c6ae
|
4
|
+
data.tar.gz: e714a158d2e1388dec94482c1fa858a2ee29a6eca6e0f9004658446801088476
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 251925f9e4c45f20f6ae4270fc73adfe9f4645689bda08ebd42c2b707909177ab575e0427c83e321c2ebc039c735f9bc141b29037f28cb65249c25bd9e76d520
|
7
|
+
data.tar.gz: '053391d53a3a3a46bbfedce8e7a04ea0f28a7f5c43689c2bde3c1901f9303eae7356d507904ec1892d9da61f2d4c9c6e58ed3fec894985e19b9ab85dd5fa65fd'
|
@@ -191,7 +191,7 @@ module Moab
|
|
191
191
|
home_dir_pathnames = deposit_bag_pathname.children.reject { |file| file.basename.to_s.start_with?(TAGMANIFEST) }
|
192
192
|
hash_with_full_pathnames = generate_checksums_hash(home_dir_pathnames, types_to_generate)
|
193
193
|
# return hash keys as basenames only
|
194
|
-
hash_with_full_pathnames.
|
194
|
+
hash_with_full_pathnames.transform_keys { |k| Pathname.new(k).basename.to_s }
|
195
195
|
end
|
196
196
|
|
197
197
|
# generate hash of checksums by file name for bag data dir files
|
@@ -199,7 +199,7 @@ module Moab
|
|
199
199
|
data_pathnames = deposit_bag_pathname.join(DATA_DIR_BASENAME).find
|
200
200
|
hash_with_full_pathnames = generate_checksums_hash(data_pathnames, types_to_generate)
|
201
201
|
# return hash keys beginning with 'data/'
|
202
|
-
hash_with_full_pathnames.
|
202
|
+
hash_with_full_pathnames.transform_keys { |k| Pathname.new(k).relative_path_from(deposit_bag_pathname).to_s }
|
203
203
|
end
|
204
204
|
|
205
205
|
def generate_checksums_hash(pathnames, types_to_generate)
|
data/lib/moab/exceptions.rb
CHANGED
@@ -2,10 +2,14 @@
|
|
2
2
|
|
3
3
|
module Moab
|
4
4
|
class MoabRuntimeError < RuntimeError; end
|
5
|
+
|
5
6
|
class MoabStandardError < StandardError; end
|
6
7
|
|
7
8
|
class FileNotFoundException < MoabRuntimeError; end
|
9
|
+
|
8
10
|
class InvalidMetadataException < MoabRuntimeError; end
|
11
|
+
|
9
12
|
class InvalidSuriSyntaxError < MoabRuntimeError; end
|
13
|
+
|
10
14
|
class ObjectNotFoundException < MoabRuntimeError; end
|
11
15
|
end
|
data/lib/moab/file_group.rb
CHANGED
@@ -30,15 +30,15 @@ module Moab
|
|
30
30
|
|
31
31
|
# @attribute
|
32
32
|
# @return [String] The name of the file group
|
33
|
-
attribute :group_id, String, :
|
33
|
+
attribute :group_id, String, tag: 'groupId', key: true
|
34
34
|
|
35
35
|
# @attribute
|
36
36
|
# @return [String] The directory location or other source of this groups file data
|
37
|
-
attribute :data_source, String, :
|
37
|
+
attribute :data_source, String, tag: 'dataSource'
|
38
38
|
|
39
39
|
# @attribute
|
40
40
|
# @return [Integer] The total number of data files (dynamically calculated)
|
41
|
-
attribute :file_count, Integer, :
|
41
|
+
attribute :file_count, Integer, tag: 'fileCount', on_save: proc { |i| i.to_s }
|
42
42
|
|
43
43
|
def file_count
|
44
44
|
files.inject(0) { |sum, manifestation| sum + manifestation.file_count }
|
@@ -46,7 +46,7 @@ module Moab
|
|
46
46
|
|
47
47
|
# @attribute
|
48
48
|
# @return [Integer] The total size (in bytes) of all data files (dynamically calculated)
|
49
|
-
attribute :byte_count, Integer, :
|
49
|
+
attribute :byte_count, Integer, tag: 'byteCount', on_save: proc { |i| i.to_s }
|
50
50
|
|
51
51
|
def byte_count
|
52
52
|
files.inject(0) { |sum, manifestation| sum + manifestation.byte_count }
|
@@ -54,7 +54,7 @@ module Moab
|
|
54
54
|
|
55
55
|
# @attribute
|
56
56
|
# @return [Integer] The total disk usage (in 1 kB blocks) of all data files (estimating du -k result) (dynamically calculated)
|
57
|
-
attribute :block_count, Integer, :
|
57
|
+
attribute :block_count, Integer, tag: 'blockCount', on_save: proc { |i| i.to_s }
|
58
58
|
|
59
59
|
def block_count
|
60
60
|
files.inject(0) { |sum, manifestation| sum + manifestation.block_count }
|
@@ -67,7 +67,7 @@ module Moab
|
|
67
67
|
|
68
68
|
# @attribute
|
69
69
|
# @return [Array<FileManifestation>] The set of files comprising the group
|
70
|
-
has_many :files, FileManifestation, :
|
70
|
+
has_many :files, FileManifestation, tag: 'file'
|
71
71
|
|
72
72
|
def files
|
73
73
|
signature_hash.values
|
@@ -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,7 +126,7 @@ 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
|
@@ -147,14 +147,14 @@ module Moab
|
|
147
147
|
# @return [FileGroupDifference] Clone just this element for inclusion in a versionMetadata structure
|
148
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
|
@@ -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]
|
@@ -26,11 +26,11 @@ module Moab
|
|
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
@@ -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/,' ')
|
@@ -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
@@ -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,7 +95,7 @@ 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
|
@@ -194,7 +194,7 @@ module Moab
|
|
194
194
|
signatures_from_bag = signatures_from_bagit_manifests(bag_pathname)
|
195
195
|
bag_data_subdirs = bag_pathname.join('data').children
|
196
196
|
bag_data_subdirs.each do |subdir|
|
197
|
-
groups << FileGroup.new(:
|
197
|
+
groups << FileGroup.new(group_id: subdir.basename.to_s).group_from_bagit_subdir(subdir, signatures_from_bag)
|
198
198
|
end
|
199
199
|
self
|
200
200
|
end
|
@@ -30,11 +30,11 @@ module Moab
|
|
30
30
|
|
31
31
|
# @attribute
|
32
32
|
# @return [String] The digital object ID (druid)
|
33
|
-
attribute :digital_object_id, String, :
|
33
|
+
attribute :digital_object_id, String, tag: 'objectId'
|
34
34
|
|
35
35
|
# @attribute
|
36
36
|
# @return [Integer] the number of differences found between the two inventories that were compared (dynamically calculated)
|
37
|
-
attribute :difference_count, Integer, :
|
37
|
+
attribute :difference_count, Integer, tag: 'differenceCount', on_save: proc { |i| i.to_s }
|
38
38
|
|
39
39
|
def difference_count
|
40
40
|
@group_differences.inject(0) { |sum, group| sum + group.difference_count }
|
@@ -50,7 +50,7 @@ module Moab
|
|
50
50
|
|
51
51
|
# @attribute
|
52
52
|
# @return [String] The datetime at which the report was run
|
53
|
-
attribute :report_datetime, String, :
|
53
|
+
attribute :report_datetime, String, tag: 'reportDatetime'
|
54
54
|
|
55
55
|
def report_datetime=(datetime)
|
56
56
|
@report_datetime = Moab::UtcTime.input(datetime)
|
@@ -62,7 +62,7 @@ module Moab
|
|
62
62
|
|
63
63
|
# @attribute
|
64
64
|
# @return [Array<FileGroupDifference>] The set of data groups comprising the version
|
65
|
-
has_many :group_differences, FileGroupDifference, :
|
65
|
+
has_many :group_differences, FileGroupDifference, tag: 'fileGroupDifference'
|
66
66
|
|
67
67
|
# @return [Array<String>] The data fields to include in summary reports
|
68
68
|
def summary_fields
|
@@ -89,8 +89,8 @@ module Moab
|
|
89
89
|
group_ids = basis_inventory.group_ids | other_inventory.group_ids
|
90
90
|
group_ids.each do |group_id|
|
91
91
|
# get a pair of groups to compare, creating a empty group if not present in the inventory
|
92
|
-
basis_group = basis_inventory.group(group_id) || FileGroup.new(:
|
93
|
-
other_group = other_inventory.group(group_id) || FileGroup.new(:
|
92
|
+
basis_group = basis_inventory.group(group_id) || FileGroup.new(group_id: group_id)
|
93
|
+
other_group = other_inventory.group(group_id) || FileGroup.new(group_id: group_id)
|
94
94
|
@group_differences << FileGroupDifference.new.compare_file_groups(basis_group, other_group)
|
95
95
|
end
|
96
96
|
self
|
@@ -30,7 +30,7 @@ module Moab
|
|
30
30
|
|
31
31
|
# @attribute
|
32
32
|
# @return [FileSignature] The fixity data of the file instance
|
33
|
-
element :signature, FileSignature, :
|
33
|
+
element :signature, FileSignature, tag: 'fileSignature'
|
34
34
|
|
35
35
|
def signature
|
36
36
|
@signature.is_a?(Array) ? @signature[0] : @signature
|
@@ -42,7 +42,7 @@ module Moab
|
|
42
42
|
|
43
43
|
# @attribute
|
44
44
|
# @return [Array<FileInstance>] The location(s) of the file manifestation's file instances
|
45
|
-
has_many :instances, FileInstance, :
|
45
|
+
has_many :instances, FileInstance, tag: 'fileInstance'
|
46
46
|
|
47
47
|
# @api internal
|
48
48
|
# @return [Array<String>] Create an array from all the file paths of the child {FileInstance} objects
|
data/lib/moab/file_signature.rb
CHANGED
@@ -46,19 +46,19 @@ module Moab
|
|
46
46
|
|
47
47
|
# @attribute
|
48
48
|
# @return [Integer] The size of the file in bytes
|
49
|
-
attribute :size, Integer, :
|
49
|
+
attribute :size, Integer, on_save: proc { |n| n.to_s }
|
50
50
|
|
51
51
|
# @attribute
|
52
52
|
# @return [String] The MD5 checksum value of the file
|
53
|
-
attribute :md5, String, :
|
53
|
+
attribute :md5, String, on_save: proc { |n| n.nil? ? "" : n.to_s }
|
54
54
|
|
55
55
|
# @attribute
|
56
56
|
# @return [String] The SHA1 checksum value of the file
|
57
|
-
attribute :sha1, String, :
|
57
|
+
attribute :sha1, String, on_save: proc { |n| n.nil? ? "" : n.to_s }
|
58
58
|
|
59
59
|
# @attribute
|
60
60
|
# @return [String] The SHA256 checksum value of the file
|
61
|
-
attribute :sha256, String, :
|
61
|
+
attribute :sha256, String, on_save: proc { |n| n.nil? ? "" : n.to_s }
|
62
62
|
|
63
63
|
KNOWN_ALGOS = {
|
64
64
|
md5: proc { Digest::MD5.new },
|
@@ -85,7 +85,7 @@ module Moab
|
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
88
|
-
new(signatures.
|
88
|
+
new(signatures.transform_values(&:hexdigest).merge(size: pathname.size))
|
89
89
|
end
|
90
90
|
|
91
91
|
# @param type [Symbol,String] The type of checksum
|
@@ -39,20 +39,20 @@ module Moab
|
|
39
39
|
|
40
40
|
# @attribute
|
41
41
|
# @return [String] The object ID (druid)
|
42
|
-
attribute :digital_object_id, String, :
|
42
|
+
attribute :digital_object_id, String, tag: 'objectId'
|
43
43
|
|
44
44
|
# @attribute
|
45
45
|
# @return [Integer] The ordinal version number
|
46
|
-
attribute :version_id, Integer, :
|
46
|
+
attribute :version_id, Integer, tag: 'versionId', key: true, on_save: proc { |n| n.to_s }
|
47
47
|
|
48
48
|
# @return [String] The unique identifier concatenating digital object id with version id
|
49
49
|
def composite_key
|
50
|
-
@digital_object_id
|
50
|
+
"#{@digital_object_id}-#{StorageObject.version_dirname(@version_id)}"
|
51
51
|
end
|
52
52
|
|
53
53
|
# @attribute
|
54
54
|
# @return [String] The datetime at which the catalog was updated
|
55
|
-
attribute :catalog_datetime, Time, :
|
55
|
+
attribute :catalog_datetime, Time, tag: 'catalogDatetime'
|
56
56
|
|
57
57
|
def catalog_datetime=(datetime)
|
58
58
|
@catalog_datetime = Moab::UtcTime.input(datetime)
|
@@ -64,7 +64,7 @@ module Moab
|
|
64
64
|
|
65
65
|
# @attribute
|
66
66
|
# @return [Integer] The total number of data files (dynamically calculated)
|
67
|
-
attribute :file_count, Integer, :
|
67
|
+
attribute :file_count, Integer, tag: 'fileCount', on_save: proc { |t| t.to_s }
|
68
68
|
|
69
69
|
def file_count
|
70
70
|
entries.size
|
@@ -72,7 +72,7 @@ module Moab
|
|
72
72
|
|
73
73
|
# @attribute
|
74
74
|
# @return [Integer] The total size (in bytes) of all data files (dynamically calculated)
|
75
|
-
attribute :byte_count, Integer, :
|
75
|
+
attribute :byte_count, Integer, tag: 'byteCount', on_save: proc { |t| t.to_s }
|
76
76
|
|
77
77
|
def byte_count
|
78
78
|
entries.inject(0) { |sum, entry| sum + entry.signature.size.to_i }
|
@@ -80,7 +80,7 @@ module Moab
|
|
80
80
|
|
81
81
|
# @attribute
|
82
82
|
# @return [Integer] The total disk usage (in 1 kB blocks) of all data files (estimating du -k result) (dynamically calculated)
|
83
|
-
attribute :block_count, Integer, :
|
83
|
+
attribute :block_count, Integer, tag: 'blockCount', on_save: proc { |t| t.to_s }
|
84
84
|
|
85
85
|
def block_count
|
86
86
|
block_size = 1024
|
@@ -94,7 +94,7 @@ module Moab
|
|
94
94
|
|
95
95
|
# @attribute
|
96
96
|
# @return [Array<SignatureCatalogEntry>] The set of data groups comprising the version
|
97
|
-
has_many :entries, SignatureCatalogEntry, :
|
97
|
+
has_many :entries, SignatureCatalogEntry, tag: 'entry'
|
98
98
|
|
99
99
|
def entries=(entry_array)
|
100
100
|
entry_array.each do |entry|
|
@@ -178,10 +178,10 @@ module Moab
|
|
178
178
|
# containing only those files that were added in this version
|
179
179
|
# @example {include:file:spec/features/catalog/version_additions_spec.rb}
|
180
180
|
def version_additions(version_inventory)
|
181
|
-
version_additions = FileInventory.new(:
|
181
|
+
version_additions = FileInventory.new(type: 'additions')
|
182
182
|
version_additions.copy_ids(version_inventory)
|
183
183
|
version_inventory.groups.each do |group|
|
184
|
-
group_addtions = FileGroup.new(:
|
184
|
+
group_addtions = FileGroup.new(group_id: group.group_id)
|
185
185
|
group.files.each do |file|
|
186
186
|
group_addtions.add_file_instance(file.signature, file.instances[0]) unless @signature_hash.key?(file.signature)
|
187
187
|
end
|
@@ -25,19 +25,19 @@ module Moab
|
|
25
25
|
|
26
26
|
# @attribute
|
27
27
|
# @return [Integer] The ordinal version number
|
28
|
-
attribute :version_id, Integer, :
|
28
|
+
attribute :version_id, Integer, tag: 'originalVersion', key: true, on_save: proc { |n| n.to_s }
|
29
29
|
|
30
30
|
# @attribute
|
31
31
|
# @return [String] The name of the file group
|
32
|
-
attribute :group_id, String, :
|
32
|
+
attribute :group_id, String, tag: 'groupId', key: true
|
33
33
|
|
34
34
|
# @attribute
|
35
35
|
# @return [String] The id is the filename path, relative to the file group's base directory
|
36
|
-
attribute :path, String, :
|
36
|
+
attribute :path, String, key: true, tag: 'storagePath'
|
37
37
|
|
38
38
|
# @attribute
|
39
39
|
# @return [FileSignature] The fixity data of the file instance
|
40
|
-
element :signature, FileSignature, :
|
40
|
+
element :signature, FileSignature, tag: 'fileSignature'
|
41
41
|
|
42
42
|
def signature
|
43
43
|
# HappyMapper's parser tries to put an array of signatures in the signature field
|
data/lib/moab/storage_object.rb
CHANGED
@@ -84,10 +84,10 @@ module Moab
|
|
84
84
|
# @return [FileInventory] The file inventory of the specified type for this version
|
85
85
|
def versionize_bag(bag_dir, current_version, new_version)
|
86
86
|
new_inventory = FileInventory.new(
|
87
|
-
:
|
88
|
-
:
|
89
|
-
:
|
90
|
-
:
|
87
|
+
type: 'version',
|
88
|
+
digital_object_id: @digital_object_id,
|
89
|
+
version_id: new_version.version_id,
|
90
|
+
inventory_datetime: Time.now
|
91
91
|
)
|
92
92
|
new_inventory.inventory_from_bagit_bag(bag_dir)
|
93
93
|
new_inventory.write_xml_file(bag_dir)
|
@@ -133,7 +133,7 @@ module Moab
|
|
133
133
|
|
134
134
|
@object_pathname.children.each do |dirname|
|
135
135
|
vnum = dirname.basename.to_s
|
136
|
-
list << vnum[1
|
136
|
+
list << vnum[1..].to_i if vnum =~ /^v(\d+)$/
|
137
137
|
end
|
138
138
|
list.sort
|
139
139
|
end
|
@@ -85,13 +85,13 @@ module Moab
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def version_dir_format?(dirname)
|
88
|
-
dirname =~ /^
|
88
|
+
dirname =~ /^v\d{4}$/
|
89
89
|
end
|
90
90
|
|
91
91
|
# call only if the version directories are "correctly named" vdddd
|
92
92
|
def check_sequential_version_dirs
|
93
93
|
version_directories.each_with_index do |dir_name, index|
|
94
|
-
next if dir_name[1
|
94
|
+
next if dir_name[1..].to_i == index + 1 # version numbering starts at 1, array indexing at 0
|
95
95
|
|
96
96
|
return [result_hash(VERSIONS_NOT_IN_ORDER, version_directories)]
|
97
97
|
end
|
@@ -45,7 +45,7 @@ module Moab
|
|
45
45
|
|
46
46
|
# @return [String] The unique identifier concatenating digital object id with version id
|
47
47
|
def composite_key
|
48
|
-
@storage_object.digital_object_id
|
48
|
+
"#{@storage_object.digital_object_id}-#{StorageObject.version_dirname(@version_id)}"
|
49
49
|
end
|
50
50
|
|
51
51
|
# @return [Boolean] true if the object version directory exists
|
@@ -115,12 +115,12 @@ module Moab
|
|
115
115
|
|
116
116
|
@inventory_cache[type] = FileInventory.read_xml_file(@version_pathname.join('manifests'), type)
|
117
117
|
else
|
118
|
-
groups = %w[content metadata].collect { |id| FileGroup.new(:
|
118
|
+
groups = %w[content metadata].collect { |id| FileGroup.new(group_id: id) }
|
119
119
|
FileInventory.new(
|
120
|
-
:
|
121
|
-
:
|
122
|
-
:
|
123
|
-
:
|
120
|
+
type: 'version',
|
121
|
+
digital_object_id: @storage_object.digital_object_id,
|
122
|
+
version_id: @version_id,
|
123
|
+
groups: groups
|
124
124
|
)
|
125
125
|
end
|
126
126
|
end
|
@@ -131,7 +131,7 @@ module Moab
|
|
131
131
|
if version_id > 0
|
132
132
|
SignatureCatalog.read_xml_file(@version_pathname.join('manifests'))
|
133
133
|
else
|
134
|
-
SignatureCatalog.new(:
|
134
|
+
SignatureCatalog.new(digital_object_id: @storage_object.digital_object_id)
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -202,12 +202,12 @@ module Moab
|
|
202
202
|
# @return [void] examine the version's directory and create/serialize a {FileInventory} containing the manifest files
|
203
203
|
def generate_manifest_inventory
|
204
204
|
manifest_inventory = FileInventory.new(
|
205
|
-
:
|
206
|
-
:
|
207
|
-
:
|
205
|
+
type: 'manifests',
|
206
|
+
digital_object_id: @storage_object.digital_object_id,
|
207
|
+
version_id: @version_id
|
208
208
|
)
|
209
209
|
pathname = @version_pathname.join('manifests')
|
210
|
-
manifest_inventory.groups << FileGroup.new(:
|
210
|
+
manifest_inventory.groups << FileGroup.new(group_id: 'manifests').group_from_directory(pathname, false)
|
211
211
|
manifest_inventory.write_xml_file(pathname)
|
212
212
|
end
|
213
213
|
|
@@ -312,7 +312,7 @@ module Moab
|
|
312
312
|
version_additions = file_inventory('additions')
|
313
313
|
result.subentities << VerificationResult.verify_value('composite_key', composite_key, version_additions.composite_key)
|
314
314
|
data_directory = @version_pathname.join('data')
|
315
|
-
directory_inventory = FileInventory.new(:
|
315
|
+
directory_inventory = FileInventory.new(type: 'directory').inventory_from_directory(data_directory)
|
316
316
|
diff = FileInventoryDifference.new
|
317
317
|
diff.compare(version_additions, directory_inventory)
|
318
318
|
compare_result = VerificationResult.new('file_differences')
|
@@ -160,7 +160,7 @@ module Moab
|
|
160
160
|
# @param druid [String] The object identifier
|
161
161
|
# @return [void] transfer the object to the preservation repository
|
162
162
|
def store_new_object_version(druid, bag_pathname)
|
163
|
-
storage_object(druid,
|
163
|
+
storage_object(druid, true).ingest_bag(bag_pathname)
|
164
164
|
end
|
165
165
|
|
166
166
|
private
|
@@ -110,7 +110,7 @@ module Moab
|
|
110
110
|
# @return [Pathname] Pathname object containing the full path for the specified file
|
111
111
|
def self.retrieve_file(file_category, file_id, object_id, version_id = nil)
|
112
112
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
113
|
-
|
113
|
+
storage_object_version.find_filepath(file_category, file_id)
|
114
114
|
end
|
115
115
|
|
116
116
|
# @param [String] file_category The category of file ('content', 'metdata', or 'manifest')
|
@@ -120,7 +120,7 @@ module Moab
|
|
120
120
|
# @return [Pathname] Pathname object containing the full path for the specified file
|
121
121
|
def self.retrieve_file_using_signature(file_category, file_signature, object_id, version_id = nil)
|
122
122
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
123
|
-
|
123
|
+
storage_object_version.find_filepath_using_signature(file_category, file_signature)
|
124
124
|
end
|
125
125
|
|
126
126
|
# @param [String] file_category The category of file ('content', 'metdata', or 'manifest')
|
@@ -130,7 +130,7 @@ module Moab
|
|
130
130
|
# @return [FileSignature] The signature of the file
|
131
131
|
def self.retrieve_file_signature(file_category, file_id, object_id, version_id = nil)
|
132
132
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
133
|
-
|
133
|
+
storage_object_version.find_signature(file_category, file_id)
|
134
134
|
end
|
135
135
|
|
136
136
|
# @param [String] object_id The digital object identifier of the object
|
@@ -25,10 +25,10 @@ module Moab
|
|
25
25
|
|
26
26
|
# @attribute
|
27
27
|
# @return [String] The digital object identifier
|
28
|
-
attribute :digital_object_id, String, :
|
28
|
+
attribute :digital_object_id, String, tag: 'objectId'
|
29
29
|
|
30
30
|
# @attribute
|
31
31
|
# @return [Array<VersionMetadataEntry>] An array of version metadata entries, one per version
|
32
|
-
has_many :versions, VersionMetadataEntry, :
|
32
|
+
has_many :versions, VersionMetadataEntry, tag: 'version'
|
33
33
|
end
|
34
34
|
end
|
@@ -24,7 +24,7 @@ module Moab
|
|
24
24
|
|
25
25
|
# @attribute
|
26
26
|
# @return [Integer] The object version number (A sequential integer)
|
27
|
-
attribute :version_id, Integer, :
|
27
|
+
attribute :version_id, Integer, tag: 'versionId', key: true, on_save: proc { |n| n.to_s }
|
28
28
|
|
29
29
|
# @attribute
|
30
30
|
# @return [String] "an external version label that increments the most significant digit for major revisions,
|
@@ -46,14 +46,14 @@ module Moab
|
|
46
46
|
|
47
47
|
# @attribute
|
48
48
|
# @return [FileGroupDifference] Summary of content file differences since previous version
|
49
|
-
element :content_changes, FileGroupDifference, :
|
49
|
+
element :content_changes, FileGroupDifference, tag: 'fileGroupDifference'
|
50
50
|
|
51
51
|
# @attribute
|
52
52
|
# @return [FileGroupDifference] Summary of metadata file differences since previous version
|
53
|
-
element :metadata_changes, FileGroupDifference, :
|
53
|
+
element :metadata_changes, FileGroupDifference, tag: 'fileGroupDifference'
|
54
54
|
|
55
55
|
# @attribute
|
56
56
|
# @return [Array<VersionMetadataEvent>] Array of events with timestamps that track lifecycle stages
|
57
|
-
has_many :events, VersionMetadataEvent, :
|
57
|
+
has_many :events, VersionMetadataEvent, tag: 'event'
|
58
58
|
end
|
59
59
|
end
|
data/lib/serializer/manifest.rb
CHANGED
@@ -22,7 +22,7 @@ module Serializer
|
|
22
22
|
filename
|
23
23
|
else
|
24
24
|
cname = name.split(/::/).last
|
25
|
-
cname[0, 1].downcase
|
25
|
+
"#{cname[0, 1].downcase}#{cname[1..]}.xml"
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -59,7 +59,7 @@ module Serializer
|
|
59
59
|
def self.write_xml_file(xml_object, parent_dir, filename = nil)
|
60
60
|
parent_dir.mkpath
|
61
61
|
xml_pathname(parent_dir, filename).open('w') do |f|
|
62
|
-
xmlBuilder = Nokogiri::XML::Builder.new(:
|
62
|
+
xmlBuilder = Nokogiri::XML::Builder.new(encoding: 'UTF-8')
|
63
63
|
xmlBuilder = xml_object.to_xml(xmlBuilder)
|
64
64
|
f << xmlBuilder.to_xml
|
65
65
|
end
|
@@ -23,7 +23,7 @@ module Stanford
|
|
23
23
|
# Many of these objects have contentMetadata with no child elements, such as this:
|
24
24
|
# <contentMetadata objectId="bd608mj3166" type="file"/>
|
25
25
|
# but there are also objects that have no datasteam of this name at all
|
26
|
-
cm_inventory = Moab::FileInventory.new(:
|
26
|
+
cm_inventory = Moab::FileInventory.new(type: "version", digital_object_id: object_id, version_id: version_id)
|
27
27
|
content_group = group_from_cm(content_metadata, subset)
|
28
28
|
cm_inventory.groups << content_group
|
29
29
|
cm_inventory
|
@@ -49,7 +49,7 @@ module Stanford
|
|
49
49
|
else
|
50
50
|
raise(Moab::MoabRuntimeError, "Unknown disposition subset (#{subset})")
|
51
51
|
end
|
52
|
-
content_group = Moab::FileGroup.new(:
|
52
|
+
content_group = Moab::FileGroup.new(group_id: 'content', data_source: "contentMetadata-#{subset}")
|
53
53
|
nodeset.each do |file_node|
|
54
54
|
signature = generate_signature(file_node)
|
55
55
|
instance = generate_instance(file_node)
|
@@ -85,10 +85,10 @@ module Stanford
|
|
85
85
|
instance = Moab::FileInstance.new
|
86
86
|
instance.path = node.attributes['id'].content
|
87
87
|
instance.datetime = begin
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
node.attributes['datetime'].content
|
89
|
+
rescue
|
90
|
+
nil
|
91
|
+
end
|
92
92
|
instance
|
93
93
|
end
|
94
94
|
|
@@ -98,23 +98,23 @@ module Stanford
|
|
98
98
|
# @example {include:file:spec/features/stanford/content_metadata_write_spec.rb}
|
99
99
|
def generate_content_metadata(file_group, object_id, version_id)
|
100
100
|
cm = Nokogiri::XML::Builder.new do |xml|
|
101
|
-
xml.contentMetadata(:
|
102
|
-
xml.resource(:
|
101
|
+
xml.contentMetadata(type: "sample", objectId: object_id) do
|
102
|
+
xml.resource(type: "version", sequence: "1", id: "version-#{version_id}") do
|
103
103
|
file_group.files.each do |file_manifestation|
|
104
104
|
signature = file_manifestation.signature
|
105
105
|
file_manifestation.instances.each do |instance|
|
106
106
|
xml.file(
|
107
|
-
:
|
108
|
-
:
|
109
|
-
:
|
110
|
-
:
|
111
|
-
:
|
112
|
-
:
|
107
|
+
id: instance.path,
|
108
|
+
size: signature.size,
|
109
|
+
datetime: instance.datetime,
|
110
|
+
shelve: 'yes',
|
111
|
+
publish: 'yes',
|
112
|
+
preserve: 'yes'
|
113
113
|
) do
|
114
114
|
fixity = signature.fixity
|
115
|
-
xml.checksum(:
|
116
|
-
xml.checksum(:
|
117
|
-
xml.checksum(:
|
115
|
+
xml.checksum(type: "MD5") { xml.text signature.md5 } if fixity[:md5]
|
116
|
+
xml.checksum(type: "SHA-1") { xml.text signature.sha1 } if fixity[:sha1]
|
117
|
+
xml.checksum(type: "SHA-256") { xml.text signature.sha256 } if fixity[:sha256]
|
118
118
|
end
|
119
119
|
end
|
120
120
|
end
|
@@ -128,7 +128,7 @@ module Stanford
|
|
128
128
|
# @return [Boolean] True if contentMetadata has essential file attributes, else raise exception
|
129
129
|
def validate_content_metadata(content_metadata)
|
130
130
|
result = validate_content_metadata_details(content_metadata)
|
131
|
-
raise Moab::InvalidMetadataException, result[0]
|
131
|
+
raise Moab::InvalidMetadataException, "#{result[0]} ..." unless result.empty?
|
132
132
|
|
133
133
|
true
|
134
134
|
end
|
@@ -191,7 +191,7 @@ module Stanford
|
|
191
191
|
remediate_file_size(file_node, signature)
|
192
192
|
remediate_checksum_nodes(file_node, signature)
|
193
193
|
end
|
194
|
-
ng_doc.to_xml(:
|
194
|
+
ng_doc.to_xml(indent: 2)
|
195
195
|
end
|
196
196
|
|
197
197
|
# @param [Nokogiri::XML::Element] file_node the File stanza being remediated
|
@@ -31,11 +31,12 @@ module Stanford
|
|
31
31
|
# @return [FileInventory] Inventory of the files under the specified directory
|
32
32
|
def inventory_from_directory(directory, version_id = nil)
|
33
33
|
version_id ||= @version_id
|
34
|
-
version_inventory = Moab::FileInventory.new(type: 'version', digital_object_id: @digital_object_id,
|
34
|
+
version_inventory = Moab::FileInventory.new(type: 'version', digital_object_id: @digital_object_id,
|
35
|
+
version_id: version_id)
|
35
36
|
content_metadata = IO.read(File.join(directory, 'contentMetadata.xml'))
|
36
37
|
content_group = Stanford::ContentInventory.new.group_from_cm(content_metadata, 'preserve')
|
37
38
|
version_inventory.groups << content_group
|
38
|
-
metadata_group = Moab::FileGroup.new(:
|
39
|
+
metadata_group = Moab::FileGroup.new(group_id: 'metadata').group_from_directory(directory)
|
39
40
|
version_inventory.groups << metadata_group
|
40
41
|
version_inventory
|
41
42
|
end
|
@@ -31,9 +31,9 @@ module Stanford
|
|
31
31
|
# @param object_id [String] The identifier of the digital object whose path is requested
|
32
32
|
# @return [String] the druid tree directory path based on the given object identifier.
|
33
33
|
def druid_tree(object_id)
|
34
|
-
#
|
34
|
+
# NOTE: this seems an odd place to do druid validation, but leaving it here for now
|
35
35
|
syntax_msg = "Identifier has invalid suri syntax: #{object_id}"
|
36
|
-
raise(Moab::InvalidSuriSyntaxError, syntax_msg
|
36
|
+
raise(Moab::InvalidSuriSyntaxError, "#{syntax_msg} nil or empty") if object_id.to_s.empty?
|
37
37
|
|
38
38
|
identifier = object_id.split(':')[-1]
|
39
39
|
raise(Moab::InvalidSuriSyntaxError, syntax_msg) if identifier.to_s.empty?
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moab-versioning
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.4.
|
4
|
+
version: 4.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darren Weber
|
8
8
|
- Richard Anderson
|
9
9
|
- Lynn McRae
|
10
10
|
- Hannah Frost
|
11
|
-
autorequire:
|
11
|
+
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2021-06-01 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: druid-tools
|
@@ -145,28 +145,28 @@ dependencies:
|
|
145
145
|
requirements:
|
146
146
|
- - "~>"
|
147
147
|
- !ruby/object:Gem::Version
|
148
|
-
version:
|
148
|
+
version: '1.7'
|
149
149
|
type: :development
|
150
150
|
prerelease: false
|
151
151
|
version_requirements: !ruby/object:Gem::Requirement
|
152
152
|
requirements:
|
153
153
|
- - "~>"
|
154
154
|
- !ruby/object:Gem::Version
|
155
|
-
version:
|
155
|
+
version: '1.7'
|
156
156
|
- !ruby/object:Gem::Dependency
|
157
157
|
name: rubocop-rspec
|
158
158
|
requirement: !ruby/object:Gem::Requirement
|
159
159
|
requirements:
|
160
160
|
- - "~>"
|
161
161
|
- !ruby/object:Gem::Version
|
162
|
-
version:
|
162
|
+
version: '2.1'
|
163
163
|
type: :development
|
164
164
|
prerelease: false
|
165
165
|
version_requirements: !ruby/object:Gem::Requirement
|
166
166
|
requirements:
|
167
167
|
- - "~>"
|
168
168
|
- !ruby/object:Gem::Version
|
169
|
-
version:
|
169
|
+
version: '2.1'
|
170
170
|
description: Contains classes to process digital object version content and metadata
|
171
171
|
email:
|
172
172
|
- darren.weber@stanford.edu
|
@@ -215,23 +215,23 @@ homepage: https://github.com/sul-dlss/moab-versioning
|
|
215
215
|
licenses:
|
216
216
|
- Apache-2.0
|
217
217
|
metadata: {}
|
218
|
-
post_install_message:
|
218
|
+
post_install_message:
|
219
219
|
rdoc_options: []
|
220
220
|
require_paths:
|
221
221
|
- lib
|
222
222
|
required_ruby_version: !ruby/object:Gem::Requirement
|
223
223
|
requirements:
|
224
|
-
- - "
|
224
|
+
- - ">="
|
225
225
|
- !ruby/object:Gem::Version
|
226
|
-
version: '2.
|
226
|
+
version: '2.6'
|
227
227
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
228
228
|
requirements:
|
229
229
|
- - ">="
|
230
230
|
- !ruby/object:Gem::Version
|
231
231
|
version: '0'
|
232
232
|
requirements: []
|
233
|
-
rubygems_version: 3.
|
234
|
-
signing_key:
|
233
|
+
rubygems_version: 3.1.4
|
234
|
+
signing_key:
|
235
235
|
specification_version: 4
|
236
236
|
summary: Ruby implementation of digital object versioning toolkit used by the SULAIR
|
237
237
|
Digital Library
|