moab-versioning 4.3.0 → 5.0.0.beta1
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 +7 -2
- data/lib/moab/config.rb +40 -7
- data/lib/moab/exceptions.rb +6 -0
- data/lib/moab/file_group.rb +12 -9
- data/lib/moab/file_group_difference.rb +26 -23
- data/lib/moab/file_group_difference_subset.rb +5 -3
- data/lib/moab/file_instance.rb +4 -1
- data/lib/moab/file_instance_difference.rb +5 -3
- data/lib/moab/file_inventory.rb +13 -9
- data/lib/moab/file_inventory_difference.rb +8 -6
- data/lib/moab/file_manifestation.rb +5 -2
- data/lib/moab/file_signature.rb +12 -7
- data/lib/moab/signature_catalog.rb +13 -13
- data/lib/moab/signature_catalog_entry.rb +6 -4
- data/lib/moab/stanford.rb +2 -10
- data/lib/moab/storage_object.rb +11 -5
- data/lib/moab/storage_object_validator.rb +24 -10
- data/lib/moab/storage_object_version.rb +19 -12
- data/lib/moab/storage_repository.rb +49 -7
- data/lib/moab/storage_services.rb +12 -9
- data/lib/moab/utc_time.rb +2 -0
- data/lib/moab/verification_result.rb +4 -3
- data/lib/moab/version_metadata_entry.rb +6 -4
- data/lib/moab.rb +2 -9
- data/lib/serializer/manifest.rb +4 -2
- data/lib/serializer/serializable.rb +6 -1
- data/lib/serializer.rb +2 -0
- data/lib/stanford/content_inventory.rb +23 -19
- data/lib/stanford/storage_object_validator.rb +2 -0
- data/lib/stanford/storage_repository.rb +6 -2
- data/lib/stanford/storage_services.rb +2 -0
- metadata +22 -42
- data/lib/moab/deposit_bag_validator.rb +0 -323
- data/lib/moab/version_metadata.rb +0 -32
- data/lib/moab/version_metadata_event.rb +0 -40
- data/lib/stanford/active_fedora_object.rb +0 -28
- data/lib/stanford/dor_metadata.rb +0 -41
- data/lib/stanford/moab_storage_directory.rb +0 -36
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Moab
|
2
4
|
# The descriptive attributes of a digital object version.
|
3
5
|
#
|
@@ -22,7 +24,7 @@ module Moab
|
|
22
24
|
|
23
25
|
# @attribute
|
24
26
|
# @return [Integer] The object version number (A sequential integer)
|
25
|
-
attribute :version_id, Integer, :
|
27
|
+
attribute :version_id, Integer, tag: 'versionId', key: true, on_save: proc { |n| n.to_s }
|
26
28
|
|
27
29
|
# @attribute
|
28
30
|
# @return [String] "an external version label that increments the most significant digit for major revisions,
|
@@ -44,14 +46,14 @@ module Moab
|
|
44
46
|
|
45
47
|
# @attribute
|
46
48
|
# @return [FileGroupDifference] Summary of content file differences since previous version
|
47
|
-
element :content_changes, FileGroupDifference, :
|
49
|
+
element :content_changes, FileGroupDifference, tag: 'fileGroupDifference'
|
48
50
|
|
49
51
|
# @attribute
|
50
52
|
# @return [FileGroupDifference] Summary of metadata file differences since previous version
|
51
|
-
element :metadata_changes, FileGroupDifference, :
|
53
|
+
element :metadata_changes, FileGroupDifference, tag: 'fileGroupDifference'
|
52
54
|
|
53
55
|
# @attribute
|
54
56
|
# @return [Array<VersionMetadataEvent>] Array of events with timestamps that track lifecycle stages
|
55
|
-
has_many :events, VersionMetadataEvent, :
|
57
|
+
has_many :events, VersionMetadataEvent, tag: 'event'
|
56
58
|
end
|
57
59
|
end
|
data/lib/moab.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Moab is a module that provides a distintive namespace for the collection of classes it contains.
|
2
4
|
#
|
3
5
|
# ====Data Model
|
@@ -18,10 +20,6 @@
|
|
18
20
|
# * {FileInstanceDifference} [1..*] = contains difference information at the file level
|
19
21
|
# * {FileSignature} [1..2] = contains the file signature(s) of two file instances being compared
|
20
22
|
#
|
21
|
-
# * <b>{VersionMetadata} = descriptive information about a digital object's versions</b>
|
22
|
-
# * {VersionMetadataEntry} [1..*] = attributes of a digital object version
|
23
|
-
# * {VersionMetadataEvent} [1..*] = object version lifecycle events with timestamps
|
24
|
-
#
|
25
23
|
# * <b>{StorageObject} = represents a digital object's repository storage location and ingest/dissemination methods</b>
|
26
24
|
# * {StorageObjectVersion} [1..*] = represents a version subdirectory within an object's home directory
|
27
25
|
# * {Bagger} [1] = utility for creating bagit packages for ingest or dissemination
|
@@ -33,7 +31,6 @@ module Moab
|
|
33
31
|
end
|
34
32
|
|
35
33
|
require 'serializer'
|
36
|
-
require 'confstruct/configuration'
|
37
34
|
require 'moab/config'
|
38
35
|
require 'moab/utc_time'
|
39
36
|
require 'moab/file_signature'
|
@@ -47,9 +44,6 @@ require 'moab/file_instance_difference'
|
|
47
44
|
require 'moab/file_group_difference_subset'
|
48
45
|
require 'moab/file_group_difference'
|
49
46
|
require 'moab/file_inventory_difference'
|
50
|
-
require 'moab/version_metadata_event'
|
51
|
-
require 'moab/version_metadata_entry'
|
52
|
-
require 'moab/version_metadata'
|
53
47
|
require 'moab/bagger'
|
54
48
|
require 'moab/storage_object'
|
55
49
|
require 'moab/storage_object_version'
|
@@ -58,4 +52,3 @@ require 'moab/storage_services'
|
|
58
52
|
require 'moab/exceptions'
|
59
53
|
require 'moab/verification_result'
|
60
54
|
require 'moab/storage_object_validator'
|
61
|
-
require 'moab/deposit_bag_validator'
|
data/lib/serializer/manifest.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Serializer
|
2
4
|
# Subclass of {Serializable} that adds methods for marshalling/unmarshalling data
|
3
5
|
# to a persistent XML file format.
|
@@ -20,7 +22,7 @@ module Serializer
|
|
20
22
|
filename
|
21
23
|
else
|
22
24
|
cname = name.split(/::/).last
|
23
|
-
cname[0, 1].downcase
|
25
|
+
"#{cname[0, 1].downcase}#{cname[1..]}.xml"
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
@@ -57,7 +59,7 @@ module Serializer
|
|
57
59
|
def self.write_xml_file(xml_object, parent_dir, filename = nil)
|
58
60
|
parent_dir.mkpath
|
59
61
|
xml_pathname(parent_dir, filename).open('w') do |f|
|
60
|
-
xmlBuilder = Nokogiri::XML::Builder.new(:
|
62
|
+
xmlBuilder = Nokogiri::XML::Builder.new(encoding: 'UTF-8')
|
61
63
|
xmlBuilder = xml_object.to_xml(xmlBuilder)
|
62
64
|
f << xmlBuilder.to_xml
|
63
65
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Serializer
|
2
4
|
# Some utility methods to faciliate serialization of data fields to Hash, JSON, or YAML shared by all subclasses.
|
3
5
|
# This class assumes that HappyMapper is used for declaration of fields to be serialized.
|
@@ -21,6 +23,7 @@ module Serializer
|
|
21
23
|
opts.each do |key, value|
|
22
24
|
errmsg = "#{key} is not a variable name in #{self.class.name}"
|
23
25
|
raise(Moab::MoabRuntimeError, errmsg) unless variable_names.include?(key.to_s) || key == :test
|
26
|
+
|
24
27
|
instance_variable_set("@#{key}", value)
|
25
28
|
end
|
26
29
|
end
|
@@ -68,6 +71,7 @@ module Serializer
|
|
68
71
|
# @return [String] For the current object instance, return the string to use as a hash key
|
69
72
|
def key
|
70
73
|
return send(key_name) if key_name
|
74
|
+
|
71
75
|
nil
|
72
76
|
end
|
73
77
|
|
@@ -109,7 +113,7 @@ module Serializer
|
|
109
113
|
|
110
114
|
# @return [Hash] Calls to_hash(summary=true)
|
111
115
|
def summary
|
112
|
-
to_hash(
|
116
|
+
to_hash(true)
|
113
117
|
end
|
114
118
|
|
115
119
|
# @api internal
|
@@ -117,6 +121,7 @@ module Serializer
|
|
117
121
|
# @return [Hash] Generate a hash containing the differences between two objects of the same type
|
118
122
|
def diff(other)
|
119
123
|
raise(Moab::MoabRuntimeError, "Cannot compare different classes") if self.class != other.class
|
124
|
+
|
120
125
|
left = other.to_hash
|
121
126
|
right = to_hash
|
122
127
|
if key.nil? || other.key.nil?
|
data/lib/serializer.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Stanford
|
2
4
|
# Stanford-specific utility methods for transforming contentMetadata to versionInventory and doing comparisons
|
3
5
|
#
|
@@ -21,7 +23,7 @@ module Stanford
|
|
21
23
|
# Many of these objects have contentMetadata with no child elements, such as this:
|
22
24
|
# <contentMetadata objectId="bd608mj3166" type="file"/>
|
23
25
|
# but there are also objects that have no datasteam of this name at all
|
24
|
-
cm_inventory = Moab::FileInventory.new(:
|
26
|
+
cm_inventory = Moab::FileInventory.new(type: "version", digital_object_id: object_id, version_id: version_id)
|
25
27
|
content_group = group_from_cm(content_metadata, subset)
|
26
28
|
cm_inventory.groups << content_group
|
27
29
|
cm_inventory
|
@@ -47,7 +49,7 @@ module Stanford
|
|
47
49
|
else
|
48
50
|
raise(Moab::MoabRuntimeError, "Unknown disposition subset (#{subset})")
|
49
51
|
end
|
50
|
-
content_group = Moab::FileGroup.new(:
|
52
|
+
content_group = Moab::FileGroup.new(group_id: 'content', data_source: "contentMetadata-#{subset}")
|
51
53
|
nodeset.each do |file_node|
|
52
54
|
signature = generate_signature(file_node)
|
53
55
|
instance = generate_instance(file_node)
|
@@ -83,10 +85,10 @@ module Stanford
|
|
83
85
|
instance = Moab::FileInstance.new
|
84
86
|
instance.path = node.attributes['id'].content
|
85
87
|
instance.datetime = begin
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
88
|
+
node.attributes['datetime'].content
|
89
|
+
rescue
|
90
|
+
nil
|
91
|
+
end
|
90
92
|
instance
|
91
93
|
end
|
92
94
|
|
@@ -96,23 +98,23 @@ module Stanford
|
|
96
98
|
# @example {include:file:spec/features/stanford/content_metadata_write_spec.rb}
|
97
99
|
def generate_content_metadata(file_group, object_id, version_id)
|
98
100
|
cm = Nokogiri::XML::Builder.new do |xml|
|
99
|
-
xml.contentMetadata(:
|
100
|
-
xml.resource(:
|
101
|
+
xml.contentMetadata(type: "sample", objectId: object_id) do
|
102
|
+
xml.resource(type: "version", sequence: "1", id: "version-#{version_id}") do
|
101
103
|
file_group.files.each do |file_manifestation|
|
102
104
|
signature = file_manifestation.signature
|
103
105
|
file_manifestation.instances.each do |instance|
|
104
106
|
xml.file(
|
105
|
-
:
|
106
|
-
:
|
107
|
-
:
|
108
|
-
:
|
109
|
-
:
|
110
|
-
:
|
107
|
+
id: instance.path,
|
108
|
+
size: signature.size,
|
109
|
+
datetime: instance.datetime,
|
110
|
+
shelve: 'yes',
|
111
|
+
publish: 'yes',
|
112
|
+
preserve: 'yes'
|
111
113
|
) do
|
112
114
|
fixity = signature.fixity
|
113
|
-
xml.checksum(:
|
114
|
-
xml.checksum(:
|
115
|
-
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]
|
116
118
|
end
|
117
119
|
end
|
118
120
|
end
|
@@ -126,7 +128,8 @@ module Stanford
|
|
126
128
|
# @return [Boolean] True if contentMetadata has essential file attributes, else raise exception
|
127
129
|
def validate_content_metadata(content_metadata)
|
128
130
|
result = validate_content_metadata_details(content_metadata)
|
129
|
-
raise Moab::InvalidMetadataException, result[0]
|
131
|
+
raise Moab::InvalidMetadataException, "#{result[0]} ..." unless result.empty?
|
132
|
+
|
130
133
|
true
|
131
134
|
end
|
132
135
|
|
@@ -176,6 +179,7 @@ module Stanford
|
|
176
179
|
def remediate_content_metadata(content_metadata, content_group)
|
177
180
|
return nil if content_metadata.nil?
|
178
181
|
return content_metadata if content_group.nil? || content_group.files.empty?
|
182
|
+
|
179
183
|
signature_for_path = content_group.path_hash
|
180
184
|
@type_for_name = Moab::FileSignature.checksum_type_for_name
|
181
185
|
@names_for_type = Moab::FileSignature.checksum_names_for_type
|
@@ -187,7 +191,7 @@ module Stanford
|
|
187
191
|
remediate_file_size(file_node, signature)
|
188
192
|
remediate_checksum_nodes(file_node, signature)
|
189
193
|
end
|
190
|
-
ng_doc.to_xml(:
|
194
|
+
ng_doc.to_xml(indent: 2)
|
191
195
|
end
|
192
196
|
|
193
197
|
# @param [Nokogiri::XML::Element] file_node the File stanza being remediated
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'druid-tools'
|
2
4
|
|
3
5
|
module Stanford
|
@@ -29,12 +31,14 @@ module Stanford
|
|
29
31
|
# @param object_id [String] The identifier of the digital object whose path is requested
|
30
32
|
# @return [String] the druid tree directory path based on the given object identifier.
|
31
33
|
def druid_tree(object_id)
|
32
|
-
#
|
34
|
+
# NOTE: this seems an odd place to do druid validation, but leaving it here for now
|
33
35
|
syntax_msg = "Identifier has invalid suri syntax: #{object_id}"
|
34
|
-
raise(Moab::InvalidSuriSyntaxError, syntax_msg
|
36
|
+
raise(Moab::InvalidSuriSyntaxError, "#{syntax_msg} nil or empty") if object_id.to_s.empty?
|
37
|
+
|
35
38
|
identifier = object_id.split(':')[-1]
|
36
39
|
raise(Moab::InvalidSuriSyntaxError, syntax_msg) if identifier.to_s.empty?
|
37
40
|
raise(Moab::InvalidSuriSyntaxError, syntax_msg) unless DruidTools::Druid.valid?(identifier, true)
|
41
|
+
|
38
42
|
DruidTools::Druid.new(identifier, true).tree.join(File::SEPARATOR)
|
39
43
|
end
|
40
44
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: moab-versioning
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 5.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darren Weber
|
@@ -11,24 +11,24 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2021-10-19 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
|
-
name:
|
17
|
+
name: druid-tools
|
18
18
|
requirement: !ruby/object:Gem::Requirement
|
19
19
|
requirements:
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
22
|
+
version: 1.0.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - ">="
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
29
|
+
version: 1.0.0
|
30
30
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
31
|
+
name: json
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
requirements:
|
34
34
|
- - ">="
|
@@ -42,7 +42,7 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: '0'
|
44
44
|
- !ruby/object:Gem::Dependency
|
45
|
-
name: nokogiri
|
45
|
+
name: nokogiri
|
46
46
|
requirement: !ruby/object:Gem::Requirement
|
47
47
|
requirements:
|
48
48
|
- - ">="
|
@@ -56,7 +56,7 @@ dependencies:
|
|
56
56
|
- !ruby/object:Gem::Version
|
57
57
|
version: '0'
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
|
-
name:
|
59
|
+
name: nokogiri-happymapper
|
60
60
|
requirement: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
62
|
- - ">="
|
@@ -70,21 +70,7 @@ dependencies:
|
|
70
70
|
- !ruby/object:Gem::Version
|
71
71
|
version: '0'
|
72
72
|
- !ruby/object:Gem::Dependency
|
73
|
-
name:
|
74
|
-
requirement: !ruby/object:Gem::Requirement
|
75
|
-
requirements:
|
76
|
-
- - ">="
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: 1.0.0
|
79
|
-
type: :runtime
|
80
|
-
prerelease: false
|
81
|
-
version_requirements: !ruby/object:Gem::Requirement
|
82
|
-
requirements:
|
83
|
-
- - ">="
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
version: 1.0.0
|
86
|
-
- !ruby/object:Gem::Dependency
|
87
|
-
name: equivalent-xml
|
73
|
+
name: coveralls
|
88
74
|
requirement: !ruby/object:Gem::Requirement
|
89
75
|
requirements:
|
90
76
|
- - ">="
|
@@ -98,7 +84,7 @@ dependencies:
|
|
98
84
|
- !ruby/object:Gem::Version
|
99
85
|
version: '0'
|
100
86
|
- !ruby/object:Gem::Dependency
|
101
|
-
name:
|
87
|
+
name: equivalent-xml
|
102
88
|
requirement: !ruby/object:Gem::Requirement
|
103
89
|
requirements:
|
104
90
|
- - ">="
|
@@ -112,7 +98,7 @@ dependencies:
|
|
112
98
|
- !ruby/object:Gem::Version
|
113
99
|
version: '0'
|
114
100
|
- !ruby/object:Gem::Dependency
|
115
|
-
name:
|
101
|
+
name: pry-byebug
|
116
102
|
requirement: !ruby/object:Gem::Requirement
|
117
103
|
requirements:
|
118
104
|
- - ">="
|
@@ -126,7 +112,7 @@ dependencies:
|
|
126
112
|
- !ruby/object:Gem::Version
|
127
113
|
version: '0'
|
128
114
|
- !ruby/object:Gem::Dependency
|
129
|
-
name:
|
115
|
+
name: rake
|
130
116
|
requirement: !ruby/object:Gem::Requirement
|
131
117
|
requirements:
|
132
118
|
- - ">="
|
@@ -140,7 +126,7 @@ dependencies:
|
|
140
126
|
- !ruby/object:Gem::Version
|
141
127
|
version: '0'
|
142
128
|
- !ruby/object:Gem::Dependency
|
143
|
-
name:
|
129
|
+
name: rspec
|
144
130
|
requirement: !ruby/object:Gem::Requirement
|
145
131
|
requirements:
|
146
132
|
- - ">="
|
@@ -159,28 +145,28 @@ dependencies:
|
|
159
145
|
requirements:
|
160
146
|
- - "~>"
|
161
147
|
- !ruby/object:Gem::Version
|
162
|
-
version:
|
148
|
+
version: '1.7'
|
163
149
|
type: :development
|
164
150
|
prerelease: false
|
165
151
|
version_requirements: !ruby/object:Gem::Requirement
|
166
152
|
requirements:
|
167
153
|
- - "~>"
|
168
154
|
- !ruby/object:Gem::Version
|
169
|
-
version:
|
155
|
+
version: '1.7'
|
170
156
|
- !ruby/object:Gem::Dependency
|
171
157
|
name: rubocop-rspec
|
172
158
|
requirement: !ruby/object:Gem::Requirement
|
173
159
|
requirements:
|
174
160
|
- - "~>"
|
175
161
|
- !ruby/object:Gem::Version
|
176
|
-
version: 1
|
162
|
+
version: '2.1'
|
177
163
|
type: :development
|
178
164
|
prerelease: false
|
179
165
|
version_requirements: !ruby/object:Gem::Requirement
|
180
166
|
requirements:
|
181
167
|
- - "~>"
|
182
168
|
- !ruby/object:Gem::Version
|
183
|
-
version: 1
|
169
|
+
version: '2.1'
|
184
170
|
description: Contains classes to process digital object version content and metadata
|
185
171
|
email:
|
186
172
|
- darren.weber@stanford.edu
|
@@ -191,7 +177,6 @@ files:
|
|
191
177
|
- lib/moab.rb
|
192
178
|
- lib/moab/bagger.rb
|
193
179
|
- lib/moab/config.rb
|
194
|
-
- lib/moab/deposit_bag_validator.rb
|
195
180
|
- lib/moab/exceptions.rb
|
196
181
|
- lib/moab/file_group.rb
|
197
182
|
- lib/moab/file_group_difference.rb
|
@@ -212,16 +197,11 @@ files:
|
|
212
197
|
- lib/moab/storage_services.rb
|
213
198
|
- lib/moab/utc_time.rb
|
214
199
|
- lib/moab/verification_result.rb
|
215
|
-
- lib/moab/version_metadata.rb
|
216
200
|
- lib/moab/version_metadata_entry.rb
|
217
|
-
- lib/moab/version_metadata_event.rb
|
218
201
|
- lib/serializer.rb
|
219
202
|
- lib/serializer/manifest.rb
|
220
203
|
- lib/serializer/serializable.rb
|
221
|
-
- lib/stanford/active_fedora_object.rb
|
222
204
|
- lib/stanford/content_inventory.rb
|
223
|
-
- lib/stanford/dor_metadata.rb
|
224
|
-
- lib/stanford/moab_storage_directory.rb
|
225
205
|
- lib/stanford/storage_object_validator.rb
|
226
206
|
- lib/stanford/storage_repository.rb
|
227
207
|
- lib/stanford/storage_services.rb
|
@@ -235,16 +215,16 @@ require_paths:
|
|
235
215
|
- lib
|
236
216
|
required_ruby_version: !ruby/object:Gem::Requirement
|
237
217
|
requirements:
|
238
|
-
- - "
|
218
|
+
- - ">="
|
239
219
|
- !ruby/object:Gem::Version
|
240
|
-
version: '2.
|
220
|
+
version: '2.6'
|
241
221
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
242
222
|
requirements:
|
243
|
-
- - "
|
223
|
+
- - ">"
|
244
224
|
- !ruby/object:Gem::Version
|
245
|
-
version:
|
225
|
+
version: 1.3.1
|
246
226
|
requirements: []
|
247
|
-
rubygems_version: 3.
|
227
|
+
rubygems_version: 3.1.4
|
248
228
|
signing_key:
|
249
229
|
specification_version: 4
|
250
230
|
summary: Ruby implementation of digital object versioning toolkit used by the SULAIR
|