moab-versioning 4.3.0 → 5.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|