moab-versioning 4.2.1 → 4.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/moab.rb +1 -1
- data/lib/moab/bagger.rb +15 -15
- data/lib/moab/config.rb +0 -2
- data/lib/moab/deposit_bag_validator.rb +1 -1
- data/lib/moab/file_group.rb +13 -15
- data/lib/moab/file_group_difference.rb +18 -21
- data/lib/moab/file_group_difference_subset.rb +2 -4
- data/lib/moab/file_instance.rb +1 -3
- data/lib/moab/file_instance_difference.rb +3 -5
- data/lib/moab/file_inventory.rb +17 -27
- data/lib/moab/file_inventory_difference.rb +5 -7
- data/lib/moab/file_manifestation.rb +4 -6
- data/lib/moab/file_signature.rb +29 -40
- data/lib/moab/signature_catalog.rb +11 -13
- data/lib/moab/signature_catalog_entry.rb +1 -3
- data/lib/moab/storage_object.rb +12 -19
- data/lib/moab/storage_object_validator.rb +22 -8
- data/lib/moab/storage_object_version.rb +25 -27
- data/lib/moab/storage_repository.rb +6 -13
- data/lib/moab/storage_services.rb +6 -8
- data/lib/moab/utc_time.rb +0 -2
- data/lib/moab/verification_result.rb +0 -2
- data/lib/moab/version_metadata.rb +1 -3
- data/lib/moab/version_metadata_entry.rb +2 -4
- data/lib/moab/version_metadata_event.rb +0 -2
- data/lib/serializer/manifest.rb +5 -5
- data/lib/serializer/serializable.rb +34 -34
- data/lib/stanford/active_fedora_object.rb +0 -2
- data/lib/stanford/content_inventory.rb +22 -20
- data/lib/stanford/dor_metadata.rb +0 -2
- data/lib/stanford/storage_object_validator.rb +0 -2
- data/lib/stanford/storage_repository.rb +1 -2
- data/lib/stanford/storage_services.rb +5 -7
- metadata +3 -3
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab/stanford'
|
2
|
-
|
3
1
|
module Stanford
|
4
2
|
# Stanford-specific utility methods for transforming contentMetadata to versionInventory and doing comparisons
|
5
3
|
#
|
@@ -62,7 +60,7 @@ module Stanford
|
|
62
60
|
# @param node [Nokogiri::XML::Node] The XML node containing file information
|
63
61
|
# @return [FileSignature] The {FileSignature} object generated from the XML data
|
64
62
|
def generate_signature(node)
|
65
|
-
signature = Moab::FileSignature.new
|
63
|
+
signature = Moab::FileSignature.new
|
66
64
|
signature.size = node.attributes['size'].content
|
67
65
|
checksum_nodes = node.xpath('checksum')
|
68
66
|
checksum_nodes.each do |checksum_node|
|
@@ -82,9 +80,13 @@ module Stanford
|
|
82
80
|
# @param node (see #generate_signature)
|
83
81
|
# @return [FileInstance] The {FileInstance} object generated from the XML data
|
84
82
|
def generate_instance(node)
|
85
|
-
instance = Moab::FileInstance.new
|
83
|
+
instance = Moab::FileInstance.new
|
86
84
|
instance.path = node.attributes['id'].content
|
87
|
-
instance.datetime =
|
85
|
+
instance.datetime = begin
|
86
|
+
node.attributes['datetime'].content
|
87
|
+
rescue
|
88
|
+
nil
|
89
|
+
end
|
88
90
|
instance
|
89
91
|
end
|
90
92
|
|
@@ -94,8 +96,8 @@ module Stanford
|
|
94
96
|
# @example {include:file:spec/features/stanford/content_metadata_write_spec.rb}
|
95
97
|
def generate_content_metadata(file_group, object_id, version_id)
|
96
98
|
cm = Nokogiri::XML::Builder.new do |xml|
|
97
|
-
xml.contentMetadata(:type => "sample", :objectId => object_id)
|
98
|
-
xml.resource(:type => "version", :sequence => "1", :id => "version-#{version_id}")
|
99
|
+
xml.contentMetadata(:type => "sample", :objectId => object_id) do
|
100
|
+
xml.resource(:type => "version", :sequence => "1", :id => "version-#{version_id}") do
|
99
101
|
file_group.files.each do |file_manifestation|
|
100
102
|
signature = file_manifestation.signature
|
101
103
|
file_manifestation.instances.each do |instance|
|
@@ -106,16 +108,16 @@ module Stanford
|
|
106
108
|
:shelve => 'yes',
|
107
109
|
:publish => 'yes',
|
108
110
|
:preserve => 'yes'
|
109
|
-
)
|
111
|
+
) do
|
110
112
|
fixity = signature.fixity
|
111
113
|
xml.checksum(:type => "MD5") { xml.text signature.md5 } if fixity[:md5]
|
112
114
|
xml.checksum(:type => "SHA-1") { xml.text signature.sha1 } if fixity[:sha1]
|
113
115
|
xml.checksum(:type => "SHA-256") { xml.text signature.sha256 } if fixity[:sha256]
|
114
|
-
|
116
|
+
end
|
115
117
|
end
|
116
118
|
end
|
117
|
-
|
118
|
-
|
119
|
+
end
|
120
|
+
end
|
119
121
|
end
|
120
122
|
cm.to_xml
|
121
123
|
end
|
@@ -124,7 +126,7 @@ module Stanford
|
|
124
126
|
# @return [Boolean] True if contentMetadata has essential file attributes, else raise exception
|
125
127
|
def validate_content_metadata(content_metadata)
|
126
128
|
result = validate_content_metadata_details(content_metadata)
|
127
|
-
raise Moab::InvalidMetadataException, result[0] + " ..."
|
129
|
+
raise Moab::InvalidMetadataException, result[0] + " ..." unless result.empty?
|
128
130
|
true
|
129
131
|
end
|
130
132
|
|
@@ -145,7 +147,7 @@ module Stanford
|
|
145
147
|
end
|
146
148
|
nodeset = content_metadata_doc.xpath("//file")
|
147
149
|
nodeset.each do |file_node|
|
148
|
-
missing = [
|
150
|
+
missing = %w[id size md5 sha1]
|
149
151
|
missing.delete('id') if file_node.has_attribute?('id')
|
150
152
|
missing.delete('size') if file_node.has_attribute?('size')
|
151
153
|
checksum_nodes = file_node.xpath('checksum')
|
@@ -159,7 +161,7 @@ module Stanford
|
|
159
161
|
end
|
160
162
|
if missing.include?('id')
|
161
163
|
result << "File node #{nodeset.index(file_node)} is missing #{missing.join(',')}"
|
162
|
-
elsif missing.
|
164
|
+
elsif !missing.empty?
|
163
165
|
id = file_node['id']
|
164
166
|
result << "File node having id='#{id}' is missing #{missing.join(',')}"
|
165
167
|
end
|
@@ -173,11 +175,11 @@ module Stanford
|
|
173
175
|
# @see http://blog.slashpoundbang.com/post/1454850669/how-to-pretty-print-xml-with-nokogiri
|
174
176
|
def remediate_content_metadata(content_metadata, content_group)
|
175
177
|
return nil if content_metadata.nil?
|
176
|
-
return content_metadata if content_group.nil?
|
178
|
+
return content_metadata if content_group.nil? || content_group.files.empty?
|
177
179
|
signature_for_path = content_group.path_hash
|
178
180
|
@type_for_name = Moab::FileSignature.checksum_type_for_name
|
179
181
|
@names_for_type = Moab::FileSignature.checksum_names_for_type
|
180
|
-
ng_doc = Nokogiri::XML(content_metadata
|
182
|
+
ng_doc = Nokogiri::XML(content_metadata, &:noblanks)
|
181
183
|
nodeset = ng_doc.xpath("//file")
|
182
184
|
nodeset.each do |file_node|
|
183
185
|
filepath = file_node['id']
|
@@ -193,7 +195,7 @@ module Stanford
|
|
193
195
|
# @return [void] update the file size attribute if missing, raise exception if inconsistent
|
194
196
|
def remediate_file_size(file_node, signature)
|
195
197
|
file_size = file_node['size']
|
196
|
-
if file_size.nil?
|
198
|
+
if file_size.nil? || file_size.empty?
|
197
199
|
file_node['size'] = signature.size.to_s
|
198
200
|
elsif file_size != signature.size.to_s
|
199
201
|
raise "Inconsistent size for #{file_node['id']}: #{file_size} != #{signature.size}"
|
@@ -205,14 +207,14 @@ module Stanford
|
|
205
207
|
# @return [void] update the file's checksum elements if data missing, raise exception if inconsistent
|
206
208
|
def remediate_checksum_nodes(file_node, signature)
|
207
209
|
# collect <checksum> elements for checksum types that are already present
|
208
|
-
checksum_nodes =
|
210
|
+
checksum_nodes = {}
|
209
211
|
file_node.xpath('checksum').each do |checksum_node|
|
210
212
|
type = @type_for_name[checksum_node['type']]
|
211
213
|
checksum_nodes[type] = checksum_node
|
212
214
|
end
|
213
215
|
# add new <checksum> elements for the other checksum types that were missing
|
214
216
|
@names_for_type.each do |type, names|
|
215
|
-
unless checksum_nodes.
|
217
|
+
unless checksum_nodes.key?(type)
|
216
218
|
checksum_node = Nokogiri::XML::Element.new('checksum', file_node.document)
|
217
219
|
checksum_node['type'] = names[0]
|
218
220
|
file_node << checksum_node
|
@@ -223,7 +225,7 @@ module Stanford
|
|
223
225
|
checksum_nodes.each do |type, checksum_node|
|
224
226
|
cm_checksum = checksum_node.content
|
225
227
|
sig_checksum = signature.checksums[type]
|
226
|
-
if cm_checksum.nil?
|
228
|
+
if cm_checksum.nil? || cm_checksum.empty?
|
227
229
|
checksum_node.content = sig_checksum
|
228
230
|
elsif cm_checksum != sig_checksum
|
229
231
|
raise "Inconsistent #{type} for #{file_node['id']}: #{cm_checksum} != #{sig_checksum}"
|
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'moab/stanford'
|
2
1
|
require 'druid-tools'
|
3
2
|
|
4
3
|
module Stanford
|
@@ -22,7 +21,7 @@ module Stanford
|
|
22
21
|
end
|
23
22
|
|
24
23
|
# @param object_id [String] The identifier of the digital object
|
25
|
-
# @return [
|
24
|
+
# @return [String] The branch segment of the object deposit path
|
26
25
|
def deposit_branch(object_id)
|
27
26
|
object_id.split(/:/)[-1]
|
28
27
|
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'moab/stanford'
|
2
|
-
|
3
1
|
module Stanford
|
4
2
|
# An interface class to support access to SDR storage via a RESTful server
|
5
3
|
class StorageServices < Moab::StorageServices
|
@@ -17,9 +15,9 @@ module Stanford
|
|
17
15
|
new_inventory = Stanford::ContentInventory.new.inventory_from_cm(new_content_metadata, object_id, subset)
|
18
16
|
begin
|
19
17
|
# ObjectNotFoundException is raised if the object does not exist in storage
|
20
|
-
base_version ||=
|
18
|
+
base_version ||= current_version(object_id)
|
21
19
|
# FileNotFoundException is raised if object exists but has no contentMetadata file
|
22
|
-
base_cm_pathname =
|
20
|
+
base_cm_pathname = retrieve_file('metadata', 'contentMetadata.xml', object_id, base_version)
|
23
21
|
base_inventory = Stanford::ContentInventory.new.inventory_from_cm(base_cm_pathname.read, object_id, subset, base_version)
|
24
22
|
rescue Moab::ObjectNotFoundException, Moab::FileNotFoundException
|
25
23
|
# Create a skeletal FileInventory object, containing no file entries
|
@@ -41,7 +39,7 @@ module Stanford
|
|
41
39
|
new_inventory = Stanford::ContentInventory.new.inventory_from_cm(new_content_metadata, object_id, 'preserve')
|
42
40
|
begin
|
43
41
|
# ObjectNotFoundException is raised if the object does not exist in storage
|
44
|
-
version_id ||=
|
42
|
+
version_id ||= current_version(object_id)
|
45
43
|
storage_object_version = @@repository.storage_object(object_id).find_object_version(version_id)
|
46
44
|
signature_catalog = storage_object_version.signature_catalog
|
47
45
|
rescue Moab::ObjectNotFoundException
|
@@ -56,8 +54,8 @@ module Stanford
|
|
56
54
|
# @param version_id [Integer] The ID of the version whose file data is to be used, if nil use latest version
|
57
55
|
# @return [String] Returns a remediated copy of the contentMetadata with fixity data filled in
|
58
56
|
def self.cm_remediate(object_id, version_id = nil)
|
59
|
-
cm =
|
60
|
-
group =
|
57
|
+
cm = retrieve_file('metadata', 'contentMetadata.xml', object_id, version_id)
|
58
|
+
group = retrieve_file_group('content', object_id, version_id)
|
61
59
|
Stanford::ContentInventory.new.remediate_content_metadata(cm, group)
|
62
60
|
end
|
63
61
|
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.2.
|
4
|
+
version: 4.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Darren Weber
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2018-
|
14
|
+
date: 2018-05-30 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: confstruct
|
@@ -245,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
245
|
version: '0'
|
246
246
|
requirements: []
|
247
247
|
rubyforge_project:
|
248
|
-
rubygems_version: 2.6.
|
248
|
+
rubygems_version: 2.6.13
|
249
249
|
signing_key:
|
250
250
|
specification_version: 4
|
251
251
|
summary: Ruby implementation of digital object versioning toolkit used by the SULAIR
|