libis-tools 1.0.15 → 1.0.17
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/libis/tools/extend/roo.rb +12 -0
- data/lib/libis/tools/mets_dnx.rb +3 -1
- data/lib/libis/tools/mets_objects.rb +183 -184
- data/lib/libis/tools/version.rb +1 -1
- data/lib/libis/tools/xml_document.rb +1 -1
- data/spec/mets_file_spec.rb +422 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '01219a5f1fbace5f69a992675d9e67a049c1924cf7b9d9f24db18be8fdf4dc60'
|
4
|
+
data.tar.gz: 0b1ded7e545eeec542e739bfbf20a2c680a6a3a05561d95087f172932312a53a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6e997f4405fef929aef639c6807b8b3de168777c487efb7f91ffc31eb1f588d03cf9d4210485314b44ccd074a5f7aa5ad02a1fe5e0c245a6a8524955a643e36
|
7
|
+
data.tar.gz: cc69c4dadac622c704539fb1c3357eed4c6fe6784b1870a6a4b46edc927c635c528812e9817f7769b6497ad9eba06d8faa86fce56f166d0ba3ce6cdc92a4dab8
|
@@ -88,4 +88,16 @@ module Roo
|
|
88
88
|
end
|
89
89
|
|
90
90
|
end
|
91
|
+
|
92
|
+
class CSV
|
93
|
+
def each_row(options, &block)
|
94
|
+
if uri?(filename)
|
95
|
+
each_row_using_tempdir(options, &block)
|
96
|
+
elsif is_stream?(filename_or_stream)
|
97
|
+
::CSV.new(filename_or_stream, **options).each(&block)
|
98
|
+
else
|
99
|
+
::CSV.foreach(filename, **options, &block)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
91
103
|
end
|
data/lib/libis/tools/mets_dnx.rb
CHANGED
@@ -31,7 +31,9 @@ module Libis
|
|
31
31
|
# Specialized DNX section.
|
32
32
|
class WebHarvesting < DnxSection; end
|
33
33
|
# Specialized DNX section.
|
34
|
-
class Collection < DnxSection
|
34
|
+
class Collection < DnxSection
|
35
|
+
def tag; 'Collection'; end
|
36
|
+
end
|
35
37
|
# Specialized DNX section.
|
36
38
|
class PreservationLevel < DnxSection; end
|
37
39
|
# Specialized DNX section.
|
@@ -44,188 +44,6 @@ module Libis
|
|
44
44
|
|
45
45
|
end
|
46
46
|
|
47
|
-
# Container class for creating a representation in the METS.
|
48
|
-
class Representation
|
49
|
-
include MetsObject
|
50
|
-
|
51
|
-
# The currently allowed attributes on this class. The attributes will typically be used in {DnxSection}s.
|
52
|
-
attr_accessor :label, :preservation_type, :usage_type, :representation_code, :entity_type, :access_right_id,
|
53
|
-
:user_a, :user_b, :user_c,
|
54
|
-
:group_id, :priority, :order,
|
55
|
-
:digital_original, :content, :context, :hardware, :carrier, :original_name,
|
56
|
-
:preservation_levels, :env_dependencies, :hardware_ids, :software_ids,
|
57
|
-
:hardware_infos, :software_infos, :relationship_infos, :environments,
|
58
|
-
:dc_record, :source_metadata
|
59
|
-
|
60
|
-
# The id that will be used in the XML file to reference this representation.
|
61
|
-
def xml_id
|
62
|
-
"rep#{@id}"
|
63
|
-
end
|
64
|
-
|
65
|
-
# This method creates the appropriate {DnxSection}s based on what attributes are filled in.
|
66
|
-
def amd
|
67
|
-
dnx = {}
|
68
|
-
tech_data = []
|
69
|
-
# General characteristics
|
70
|
-
data = {
|
71
|
-
preservationType: preservation_type,
|
72
|
-
usageType: usage_type,
|
73
|
-
DigitalOriginal: digital_original,
|
74
|
-
label: label,
|
75
|
-
representationEntityType: entity_type,
|
76
|
-
contentType: content,
|
77
|
-
contextType: context,
|
78
|
-
hardwareUsed: hardware,
|
79
|
-
physicalCarrierMedia: carrier,
|
80
|
-
deliveryPriority: priority,
|
81
|
-
orderingSequence: order,
|
82
|
-
RepresentationCode: representation_code,
|
83
|
-
RepresentationOriginalName: original_name,
|
84
|
-
UserDefinedA: user_a,
|
85
|
-
UserDefinedB: user_b,
|
86
|
-
UserDefinedC: user_c,
|
87
|
-
}.cleanup
|
88
|
-
tech_data << GeneralRepCharacteristics.new(data) unless data.empty?
|
89
|
-
# Object characteristics
|
90
|
-
data = {
|
91
|
-
groupID: group_id
|
92
|
-
}.cleanup
|
93
|
-
tech_data << ObjectCharacteristics.new(data) unless data.empty?
|
94
|
-
# Preservation level
|
95
|
-
if preservation_levels
|
96
|
-
data_list = []
|
97
|
-
preservation_levels.each do |preservation_level|
|
98
|
-
data = {
|
99
|
-
preservationLevelValue: preservation_level[:value],
|
100
|
-
preservationLevelRole: preservation_level[:role],
|
101
|
-
preservationLevelRationale: preservation_level[:rationale],
|
102
|
-
preservationLevelDateAssigned: preservation_level[:date],
|
103
|
-
}.cleanup
|
104
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
105
|
-
end
|
106
|
-
tech_data << PreservationLevel.new(array: data_list) unless data_list.empty?
|
107
|
-
end
|
108
|
-
# Dependencies
|
109
|
-
if env_dependencies
|
110
|
-
data_list = []
|
111
|
-
env_dependencies.each do |dependency|
|
112
|
-
data = {
|
113
|
-
dependencyName: dependency[:name],
|
114
|
-
dependencyIdentifierType1: dependency[:type1],
|
115
|
-
dependencyIdentifierValue1: dependency[:value1],
|
116
|
-
dependencyIdentifierType2: dependency[:type2],
|
117
|
-
dependencyIdentifierValue2: dependency[:value2],
|
118
|
-
dependencyIdentifierType3: dependency[:type3],
|
119
|
-
dependencyIdentifierValue3: dependency[:value3],
|
120
|
-
}.cleanup
|
121
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
122
|
-
end
|
123
|
-
tech_data << EnvironmentDependencies.new(array: data_list) unless data_list.empty?
|
124
|
-
end
|
125
|
-
# Hardware registry id
|
126
|
-
if hardware_ids
|
127
|
-
data_list = []
|
128
|
-
hardware_ids.each do |id|
|
129
|
-
data = {
|
130
|
-
registryId: id
|
131
|
-
}.cleanup
|
132
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
133
|
-
end
|
134
|
-
tech_data << EnvHardwareRegistry.new(array: data_list) unless data_list.empty?
|
135
|
-
end
|
136
|
-
# Software registry id
|
137
|
-
if software_ids
|
138
|
-
data_list = []
|
139
|
-
software_ids.each do |id|
|
140
|
-
data = {
|
141
|
-
registryId: id
|
142
|
-
}.cleanup
|
143
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
144
|
-
end
|
145
|
-
tech_data << EnvSoftwareRegistry.new(array: data_list) unless data_list.empty?
|
146
|
-
end
|
147
|
-
# Hardware
|
148
|
-
if hardware_infos
|
149
|
-
data_list = []
|
150
|
-
hardware_infos.each do |hardware|
|
151
|
-
data = {
|
152
|
-
hardwareName: hardware[:name],
|
153
|
-
hardwareType: hardware[:type],
|
154
|
-
hardwareOtherInformation: hardware[:info],
|
155
|
-
}.cleanup
|
156
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
157
|
-
end
|
158
|
-
tech_data << EnvironmentHardware.new(array: data_list) unless data_list.empty?
|
159
|
-
end
|
160
|
-
# Software
|
161
|
-
if software_infos
|
162
|
-
data_list = []
|
163
|
-
software_infos.each do |software|
|
164
|
-
data = {
|
165
|
-
softwareName: software[:name],
|
166
|
-
softwareVersion: software[:version],
|
167
|
-
softwareType: software[:type],
|
168
|
-
softwareOtherInformation: software[:info],
|
169
|
-
softwareDependancy: software[:dependency],
|
170
|
-
}.cleanup
|
171
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
172
|
-
end
|
173
|
-
tech_data << EnvironmentSoftware.new(array: data_list) unless data_list.empty?
|
174
|
-
end
|
175
|
-
# Relationship
|
176
|
-
if relationship_infos
|
177
|
-
data_list = []
|
178
|
-
relationship_infos.each do |relationship|
|
179
|
-
data = {
|
180
|
-
relationshipType: relationship[:type],
|
181
|
-
relationshipSubType: relationship[:subtype],
|
182
|
-
relatedObjectIdentifierType1: relationship[:type1],
|
183
|
-
relatedObjectIdentifierValue1: relationship[:id1],
|
184
|
-
relatedObjectSequence1: relationship[:seq1],
|
185
|
-
relatedObjectIdentifierType2: relationship[:type2],
|
186
|
-
relatedObjectIdentifierValue2: relationship[:id2],
|
187
|
-
relatedObjectSequence2: relationship[:seq2],
|
188
|
-
relatedObjectIdentifierType3: relationship[:type3],
|
189
|
-
relatedObjectIdentifierValue3: relationship[:id3],
|
190
|
-
relatedObjectSequence3: relationship[:seq3],
|
191
|
-
}.cleanup
|
192
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
193
|
-
end
|
194
|
-
tech_data << RelationShip.new(array: data_list) unless data_list.empty?
|
195
|
-
end
|
196
|
-
# Environment
|
197
|
-
if environments
|
198
|
-
data_list = []
|
199
|
-
environments.each do |environment|
|
200
|
-
data = {
|
201
|
-
environmentCharacteristic: environment[:characteristic],
|
202
|
-
environmentPurpose: environment[:purpose],
|
203
|
-
environmentNote: environment[:note],
|
204
|
-
}.cleanup
|
205
|
-
data_list << OpenStruct.new(data) unless data.empty?
|
206
|
-
end
|
207
|
-
tech_data << Environment.new(array: data_list) unless data_list.empty?
|
208
|
-
end
|
209
|
-
# Finally assemble technical section
|
210
|
-
dnx[:tech] = tech_data unless tech_data.empty?
|
211
|
-
# Rights section
|
212
|
-
rights_data = []
|
213
|
-
data = {
|
214
|
-
policyId: access_right_id
|
215
|
-
}.cleanup
|
216
|
-
rights_data << AccessRightsPolicy.new(data) unless data.empty?
|
217
|
-
dnx[:rights] = rights_data unless rights_data.empty?
|
218
|
-
# Source metadata
|
219
|
-
if source_metadata
|
220
|
-
source_metadata.each_with_index do |metadata, i|
|
221
|
-
dnx["source-#{metadata[:type].to_s.upcase}-#{i}"] = metadata[:data]
|
222
|
-
end
|
223
|
-
end
|
224
|
-
dnx
|
225
|
-
end
|
226
|
-
|
227
|
-
end
|
228
|
-
|
229
47
|
# Container class for creating a file in the METS.
|
230
48
|
class File
|
231
49
|
include MetsObject
|
@@ -289,9 +107,9 @@ module Libis
|
|
289
107
|
compositionLevel: composition_level,
|
290
108
|
# fileLocationType: 'FILE',
|
291
109
|
fileLocation: location,
|
292
|
-
fileOriginalName: original ||
|
110
|
+
fileOriginalName: original || target_name,
|
293
111
|
fileOriginalPath: target_path,
|
294
|
-
# fileOriginalID:
|
112
|
+
# fileOriginalID: CGI.escape(location),
|
295
113
|
# fileExtension: ::File.extname(orig_name),
|
296
114
|
fileMIMEType: mimetype,
|
297
115
|
fileSizeBytes: size,
|
@@ -524,6 +342,187 @@ module Libis
|
|
524
342
|
|
525
343
|
end
|
526
344
|
|
345
|
+
# Container class for creating a representation in the METS.
|
346
|
+
class Representation < Div
|
347
|
+
|
348
|
+
# The currently allowed attributes on this class. The attributes will typically be used in {DnxSection}s.
|
349
|
+
attr_accessor :preservation_type, :usage_type, :representation_code, :entity_type, :access_right_id,
|
350
|
+
:user_a, :user_b, :user_c,
|
351
|
+
:group_id, :priority, :order,
|
352
|
+
:digital_original, :content, :context, :hardware, :carrier, :original_name,
|
353
|
+
:preservation_levels, :env_dependencies, :hardware_ids, :software_ids,
|
354
|
+
:hardware_infos, :software_infos, :relationship_infos, :environments,
|
355
|
+
:dc_record, :source_metadata
|
356
|
+
|
357
|
+
# The id that will be used in the XML file to reference this representation.
|
358
|
+
def xml_id
|
359
|
+
"rep#{@id}"
|
360
|
+
end
|
361
|
+
|
362
|
+
# This method creates the appropriate {DnxSection}s based on what attributes are filled in.
|
363
|
+
def amd
|
364
|
+
dnx = {}
|
365
|
+
tech_data = []
|
366
|
+
# General characteristics
|
367
|
+
data = {
|
368
|
+
preservationType: preservation_type,
|
369
|
+
usageType: usage_type,
|
370
|
+
DigitalOriginal: digital_original,
|
371
|
+
label: label,
|
372
|
+
representationEntityType: entity_type,
|
373
|
+
contentType: content,
|
374
|
+
contextType: context,
|
375
|
+
hardwareUsed: hardware,
|
376
|
+
physicalCarrierMedia: carrier,
|
377
|
+
deliveryPriority: priority,
|
378
|
+
orderingSequence: order,
|
379
|
+
RepresentationCode: representation_code,
|
380
|
+
RepresentationOriginalName: original_name,
|
381
|
+
UserDefinedA: user_a,
|
382
|
+
UserDefinedB: user_b,
|
383
|
+
UserDefinedC: user_c,
|
384
|
+
}.cleanup
|
385
|
+
tech_data << GeneralRepCharacteristics.new(data) unless data.empty?
|
386
|
+
# Object characteristics
|
387
|
+
data = {
|
388
|
+
groupID: group_id
|
389
|
+
}.cleanup
|
390
|
+
tech_data << ObjectCharacteristics.new(data) unless data.empty?
|
391
|
+
# Preservation level
|
392
|
+
if preservation_levels
|
393
|
+
data_list = []
|
394
|
+
preservation_levels.each do |preservation_level|
|
395
|
+
data = {
|
396
|
+
preservationLevelValue: preservation_level[:value],
|
397
|
+
preservationLevelRole: preservation_level[:role],
|
398
|
+
preservationLevelRationale: preservation_level[:rationale],
|
399
|
+
preservationLevelDateAssigned: preservation_level[:date],
|
400
|
+
}.cleanup
|
401
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
402
|
+
end
|
403
|
+
tech_data << PreservationLevel.new(array: data_list) unless data_list.empty?
|
404
|
+
end
|
405
|
+
# Dependencies
|
406
|
+
if env_dependencies
|
407
|
+
data_list = []
|
408
|
+
env_dependencies.each do |dependency|
|
409
|
+
data = {
|
410
|
+
dependencyName: dependency[:name],
|
411
|
+
dependencyIdentifierType1: dependency[:type1],
|
412
|
+
dependencyIdentifierValue1: dependency[:value1],
|
413
|
+
dependencyIdentifierType2: dependency[:type2],
|
414
|
+
dependencyIdentifierValue2: dependency[:value2],
|
415
|
+
dependencyIdentifierType3: dependency[:type3],
|
416
|
+
dependencyIdentifierValue3: dependency[:value3],
|
417
|
+
}.cleanup
|
418
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
419
|
+
end
|
420
|
+
tech_data << EnvironmentDependencies.new(array: data_list) unless data_list.empty?
|
421
|
+
end
|
422
|
+
# Hardware registry id
|
423
|
+
if hardware_ids
|
424
|
+
data_list = []
|
425
|
+
hardware_ids.each do |id|
|
426
|
+
data = {
|
427
|
+
registryId: id
|
428
|
+
}.cleanup
|
429
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
430
|
+
end
|
431
|
+
tech_data << EnvHardwareRegistry.new(array: data_list) unless data_list.empty?
|
432
|
+
end
|
433
|
+
# Software registry id
|
434
|
+
if software_ids
|
435
|
+
data_list = []
|
436
|
+
software_ids.each do |id|
|
437
|
+
data = {
|
438
|
+
registryId: id
|
439
|
+
}.cleanup
|
440
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
441
|
+
end
|
442
|
+
tech_data << EnvSoftwareRegistry.new(array: data_list) unless data_list.empty?
|
443
|
+
end
|
444
|
+
# Hardware
|
445
|
+
if hardware_infos
|
446
|
+
data_list = []
|
447
|
+
hardware_infos.each do |hardware|
|
448
|
+
data = {
|
449
|
+
hardwareName: hardware[:name],
|
450
|
+
hardwareType: hardware[:type],
|
451
|
+
hardwareOtherInformation: hardware[:info],
|
452
|
+
}.cleanup
|
453
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
454
|
+
end
|
455
|
+
tech_data << EnvironmentHardware.new(array: data_list) unless data_list.empty?
|
456
|
+
end
|
457
|
+
# Software
|
458
|
+
if software_infos
|
459
|
+
data_list = []
|
460
|
+
software_infos.each do |software|
|
461
|
+
data = {
|
462
|
+
softwareName: software[:name],
|
463
|
+
softwareVersion: software[:version],
|
464
|
+
softwareType: software[:type],
|
465
|
+
softwareOtherInformation: software[:info],
|
466
|
+
softwareDependancy: software[:dependency],
|
467
|
+
}.cleanup
|
468
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
469
|
+
end
|
470
|
+
tech_data << EnvironmentSoftware.new(array: data_list) unless data_list.empty?
|
471
|
+
end
|
472
|
+
# Relationship
|
473
|
+
if relationship_infos
|
474
|
+
data_list = []
|
475
|
+
relationship_infos.each do |relationship|
|
476
|
+
data = {
|
477
|
+
relationshipType: relationship[:type],
|
478
|
+
relationshipSubType: relationship[:subtype],
|
479
|
+
relatedObjectIdentifierType1: relationship[:type1],
|
480
|
+
relatedObjectIdentifierValue1: relationship[:id1],
|
481
|
+
relatedObjectSequence1: relationship[:seq1],
|
482
|
+
relatedObjectIdentifierType2: relationship[:type2],
|
483
|
+
relatedObjectIdentifierValue2: relationship[:id2],
|
484
|
+
relatedObjectSequence2: relationship[:seq2],
|
485
|
+
relatedObjectIdentifierType3: relationship[:type3],
|
486
|
+
relatedObjectIdentifierValue3: relationship[:id3],
|
487
|
+
relatedObjectSequence3: relationship[:seq3],
|
488
|
+
}.cleanup
|
489
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
490
|
+
end
|
491
|
+
tech_data << RelationShip.new(array: data_list) unless data_list.empty?
|
492
|
+
end
|
493
|
+
# Environment
|
494
|
+
if environments
|
495
|
+
data_list = []
|
496
|
+
environments.each do |environment|
|
497
|
+
data = {
|
498
|
+
environmentCharacteristic: environment[:characteristic],
|
499
|
+
environmentPurpose: environment[:purpose],
|
500
|
+
environmentNote: environment[:note],
|
501
|
+
}.cleanup
|
502
|
+
data_list << OpenStruct.new(data) unless data.empty?
|
503
|
+
end
|
504
|
+
tech_data << Environment.new(array: data_list) unless data_list.empty?
|
505
|
+
end
|
506
|
+
# Finally assemble technical section
|
507
|
+
dnx[:tech] = tech_data unless tech_data.empty?
|
508
|
+
# Rights section
|
509
|
+
rights_data = []
|
510
|
+
data = {
|
511
|
+
policyId: access_right_id
|
512
|
+
}.cleanup
|
513
|
+
rights_data << AccessRightsPolicy.new(data) unless data.empty?
|
514
|
+
dnx[:rights] = rights_data unless rights_data.empty?
|
515
|
+
# Source metadata
|
516
|
+
if source_metadata
|
517
|
+
source_metadata.each_with_index do |metadata, i|
|
518
|
+
dnx["source-#{metadata[:type].to_s.upcase}-#{i}"] = metadata[:data]
|
519
|
+
end
|
520
|
+
end
|
521
|
+
dnx
|
522
|
+
end
|
523
|
+
|
524
|
+
end
|
525
|
+
|
527
526
|
# Container class for creating a structmap in the METS.
|
528
527
|
class Map
|
529
528
|
include MetsObject
|
data/lib/libis/tools/version.rb
CHANGED
@@ -88,7 +88,7 @@ module Libis
|
|
88
88
|
|
89
89
|
# Export the XML Document to an XML string.
|
90
90
|
# @param [Hash] options options passed to the underlying Nokogiri::XML::Document#to_xml; default is:
|
91
|
-
#
|
91
|
+
# {indent: 2, encoding: 'utf-8'}
|
92
92
|
# @return [String] a string
|
93
93
|
def to_xml(options = {})
|
94
94
|
options = {indent: 2, encoding: 'utf-8', save_with: Nokogiri::XML::Node::SaveOptions::DEFAULT_XML}.merge(options)
|
data/spec/mets_file_spec.rb
CHANGED
@@ -220,4 +220,426 @@ describe 'METS File' do
|
|
220
220
|
end
|
221
221
|
end
|
222
222
|
|
223
|
+
context 'builder' do
|
224
|
+
|
225
|
+
let(:dc_record) {
|
226
|
+
Libis::Tools::XmlDocument.parse <<-STR
|
227
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
228
|
+
<dc:record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
229
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
230
|
+
xmlns:dcterms="http://purl.org/dc/terms/">
|
231
|
+
<dc:title>âbç d€f</dc:title>
|
232
|
+
</dc:record>
|
233
|
+
STR
|
234
|
+
}
|
235
|
+
|
236
|
+
let(:sample) {
|
237
|
+
{
|
238
|
+
dc_record: dc_record.root.to_xml,
|
239
|
+
amd: {
|
240
|
+
status: "ACTIVE",
|
241
|
+
access_right: "AR_EVERYONE"
|
242
|
+
},
|
243
|
+
representations: [
|
244
|
+
{
|
245
|
+
preservation_type: "PRESERVATION_MASTER",
|
246
|
+
usage_type: "VIEW",
|
247
|
+
label: "Archiefkopie"
|
248
|
+
},
|
249
|
+
],
|
250
|
+
files: [
|
251
|
+
{
|
252
|
+
creation_date: '2021-08-27 14:14:26.367 UTC',
|
253
|
+
modification_date: '2018-04-06 05:12:27.077 UTC',
|
254
|
+
location: "/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/b/abc.doc",
|
255
|
+
target_location: "aaa á aaa/b/abc.doc",
|
256
|
+
mimetype: "application/msword",
|
257
|
+
size: 56320,
|
258
|
+
puid: "fmt/39",
|
259
|
+
checksum_MD5: "16ddbd5ad80411d8ac1b6acf8348adfb",
|
260
|
+
label: "abc.doc",
|
261
|
+
representation: 1,
|
262
|
+
}, {
|
263
|
+
creation_date: '2021-08-27 14:14:26.367 UTC',
|
264
|
+
modification_date: '2018-04-06 05:13:04.635 UTC',
|
265
|
+
location: "/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/b/def.dóc",
|
266
|
+
target_location: "aaa á aaa/b/def.dóc",
|
267
|
+
mimetype: "application/msword",
|
268
|
+
size: 45056,
|
269
|
+
puid: "fmt/39",
|
270
|
+
checksum_MD5: "b2907905a58f8599f07334cdc295c2f1",
|
271
|
+
label: "def.dóc",
|
272
|
+
representation: 1,
|
273
|
+
}, {
|
274
|
+
creation_date: '2021-08-27 14:14:26.366 UTC',
|
275
|
+
modification_date: '2018-04-06 05:12:17.935 UTC',
|
276
|
+
location: "/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/b/ábc.doc",
|
277
|
+
target_location: "aaa á aaa/b/ábc.doc",
|
278
|
+
mimetype: "application/msword",
|
279
|
+
size: 61440,
|
280
|
+
puid: "fmt/39",
|
281
|
+
checksum_MD5: "312bba1438acdb17e3d69d19fe4cac4b",
|
282
|
+
label: "ábc.doc",
|
283
|
+
representation: 1,
|
284
|
+
}, {
|
285
|
+
creation_date: '2021-08-27 14:14:26.346 UTC',
|
286
|
+
modification_date: '2018-04-06 05:06:40.297 UTC',
|
287
|
+
location: "/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/ccçcc/ã b ç d ë ¼.doc",
|
288
|
+
target_location: "aaa á aaa/ccçcc/ã b ç d ë ¼.doc",
|
289
|
+
mimetype: "application/msword",
|
290
|
+
size: 50688,
|
291
|
+
puid: "fmt/39",
|
292
|
+
checksum_MD5: "cd3e8cfa9cf5ada3485e205d706cee09",
|
293
|
+
label: "ã b ç d ë ¼.doc",
|
294
|
+
representation: 1,
|
295
|
+
}, {
|
296
|
+
creation_date: '2021-08-27 14:14:26.356 UTC',
|
297
|
+
modification_date: '2018-04-06 05:11:07.095 UTC',
|
298
|
+
location: "/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/ss$ss/ã b ç d ë ¼.doc",
|
299
|
+
target_location: "aaa á aaa/ss$ss/ã b ç d ë ¼.doc",
|
300
|
+
mimetype: "application/msword",
|
301
|
+
size: 61440,
|
302
|
+
puid: "fmt/39",
|
303
|
+
checksum_MD5: "312bba1438acdb17e3d69d19fe4cac4b",
|
304
|
+
label: "ã b ç d ë ¼.doc",
|
305
|
+
representation: 1,
|
306
|
+
},
|
307
|
+
],
|
308
|
+
divs: [
|
309
|
+
{
|
310
|
+
label: "âbç d€f"
|
311
|
+
}, {
|
312
|
+
parent: 1,
|
313
|
+
label: "aaa á aaa",
|
314
|
+
}, {
|
315
|
+
parent: 2,
|
316
|
+
label: "b",
|
317
|
+
files: [1,2,3]
|
318
|
+
}, {
|
319
|
+
parent: 2,
|
320
|
+
label: "ccçcc",
|
321
|
+
files: [4]
|
322
|
+
}, {
|
323
|
+
parent: 2,
|
324
|
+
label: "ss$ss",
|
325
|
+
files: [5]
|
326
|
+
},
|
327
|
+
],
|
328
|
+
maps: [
|
329
|
+
{
|
330
|
+
representation: 1,
|
331
|
+
div: 1,
|
332
|
+
is_logical: false
|
333
|
+
}
|
334
|
+
]
|
335
|
+
}
|
336
|
+
}
|
337
|
+
|
338
|
+
let(:target) {
|
339
|
+
::Libis::Tools::XmlDocument.build do |xml|
|
340
|
+
xml[:mets].mets 'xmlns:mets' => 'http://www.loc.gov/METS/' do
|
341
|
+
xml[:mets].dmdSec ID: 'ie-dmd' do
|
342
|
+
xml[:mets].mdWrap MDTYPE: 'DC' do
|
343
|
+
xml[:mets].xmlData do
|
344
|
+
xml << dc_record.root.to_xml
|
345
|
+
# xml[:dc].record(
|
346
|
+
# 'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
|
347
|
+
# 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
348
|
+
# 'xmlns:dcterms' => 'http://purl.org/dc/terms/'
|
349
|
+
# ) do
|
350
|
+
# xml[:dc].title 'âbç d€f'
|
351
|
+
# end
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
xml[:mets].amdSec ID: 'ie-amd' do
|
356
|
+
xml[:mets].techMD ID: 'ie-amd-tech' do
|
357
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
358
|
+
xml[:mets].xmlData do
|
359
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
360
|
+
xml.section.generalIECharacteristics! do
|
361
|
+
xml.record do
|
362
|
+
xml.key.status! 'ACTIVE'
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
end
|
367
|
+
end
|
368
|
+
end
|
369
|
+
xml[:mets].rightsMD ID: 'ie-amd-rights' do
|
370
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
371
|
+
xml[:mets].xmlData do
|
372
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
373
|
+
xml.section.accessRightsPolicy! do
|
374
|
+
xml.record do
|
375
|
+
xml.key.policyId! 'AR_EVERYONE'
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
end
|
380
|
+
end
|
381
|
+
end
|
382
|
+
end
|
383
|
+
xml[:mets].amdSec ID: 'rep1-amd' do
|
384
|
+
xml[:mets].techMD ID: 'rep1-amd-tech' do
|
385
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
386
|
+
xml[:mets].xmlData do
|
387
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
388
|
+
xml.section.generalRepCharacteristics! do
|
389
|
+
xml.record do
|
390
|
+
xml.key.preservationType! 'PRESERVATION_MASTER'
|
391
|
+
xml.key.usageType! 'VIEW'
|
392
|
+
xml.key.label! 'Archiefkopie'
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
end
|
398
|
+
end
|
399
|
+
end
|
400
|
+
xml[:mets].amdSec ID: 'fid1-amd' do
|
401
|
+
xml[:mets].techMD ID: 'fid1-amd-tech' do
|
402
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
403
|
+
xml[:mets].xmlData do
|
404
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
405
|
+
xml.section.generalFileCharacteristics! do
|
406
|
+
xml.record do
|
407
|
+
xml.key.label! 'abc.doc'
|
408
|
+
xml.key.fileCreationDate! '2021-08-27 14:14:26.367 UTC'
|
409
|
+
xml.key.fileModificationDate! '2018-04-06 05:12:27.077 UTC'
|
410
|
+
xml.key.fileLocation! '/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/b/abc.doc'
|
411
|
+
xml.key.fileOriginalName! 'abc.doc'
|
412
|
+
xml.key.fileOriginalPath! 'aaa á aaa/b'
|
413
|
+
xml.key.fileMIMEType! 'application/msword'
|
414
|
+
xml.key.fileSizeBytes! '56320'
|
415
|
+
end
|
416
|
+
end
|
417
|
+
xml.section.fileFixity! do
|
418
|
+
xml.record do
|
419
|
+
xml.key.fixityType! 'MD5'
|
420
|
+
xml.key.fixityValue! '16ddbd5ad80411d8ac1b6acf8348adfb'
|
421
|
+
end
|
422
|
+
end
|
423
|
+
xml.section.objectCharacteristics! do
|
424
|
+
xml.record do
|
425
|
+
xml.key.groupID! 'grp'
|
426
|
+
end
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end
|
430
|
+
end
|
431
|
+
end
|
432
|
+
end
|
433
|
+
xml[:mets].amdSec ID: 'fid2-amd' do
|
434
|
+
xml[:mets].techMD ID: 'fid2-amd-tech' do
|
435
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
436
|
+
xml[:mets].xmlData do
|
437
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
438
|
+
xml.section.generalFileCharacteristics! do
|
439
|
+
xml.record do
|
440
|
+
xml.key.label! 'def.dóc'
|
441
|
+
xml.key.fileCreationDate! '2021-08-27 14:14:26.367 UTC'
|
442
|
+
xml.key.fileModificationDate! '2018-04-06 05:13:04.635 UTC'
|
443
|
+
xml.key.fileLocation! '/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/b/def.dóc'
|
444
|
+
xml.key.fileOriginalName! 'def.dóc'
|
445
|
+
xml.key.fileOriginalPath! 'aaa á aaa/b'
|
446
|
+
xml.key.fileMIMEType! 'application/msword'
|
447
|
+
xml.key.fileSizeBytes! '45056'
|
448
|
+
end
|
449
|
+
end
|
450
|
+
xml.section.fileFixity! do
|
451
|
+
xml.record do
|
452
|
+
xml.key.fixityType! 'MD5'
|
453
|
+
xml.key.fixityValue! 'b2907905a58f8599f07334cdc295c2f1'
|
454
|
+
end
|
455
|
+
end
|
456
|
+
xml.section.objectCharacteristics! do
|
457
|
+
xml.record do
|
458
|
+
xml.key.groupID! 'grp'
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
end
|
463
|
+
end
|
464
|
+
end
|
465
|
+
end
|
466
|
+
xml[:mets].amdSec ID: 'fid3-amd' do
|
467
|
+
xml[:mets].techMD ID: 'fid3-amd-tech' do
|
468
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
469
|
+
xml[:mets].xmlData do
|
470
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
471
|
+
xml.section.generalFileCharacteristics! do
|
472
|
+
xml.record do
|
473
|
+
xml.key.label! 'ábc.doc'
|
474
|
+
xml.key.fileCreationDate! '2021-08-27 14:14:26.366 UTC'
|
475
|
+
xml.key.fileModificationDate! '2018-04-06 05:12:17.935 UTC'
|
476
|
+
xml.key.fileLocation! '/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/b/ábc.doc'
|
477
|
+
xml.key.fileOriginalName! 'ábc.doc'
|
478
|
+
xml.key.fileOriginalPath! 'aaa á aaa/b'
|
479
|
+
xml.key.fileMIMEType! 'application/msword'
|
480
|
+
xml.key.fileSizeBytes! '61440'
|
481
|
+
end
|
482
|
+
end
|
483
|
+
xml.section.fileFixity! do
|
484
|
+
xml.record do
|
485
|
+
xml.key.fixityType! 'MD5'
|
486
|
+
xml.key.fixityValue! '312bba1438acdb17e3d69d19fe4cac4b'
|
487
|
+
end
|
488
|
+
end
|
489
|
+
xml.section.objectCharacteristics! do
|
490
|
+
xml.record do
|
491
|
+
xml.key.groupID! 'grp'
|
492
|
+
end
|
493
|
+
end
|
494
|
+
end
|
495
|
+
end
|
496
|
+
end
|
497
|
+
end
|
498
|
+
end
|
499
|
+
xml[:mets].amdSec ID: 'fid4-amd' do
|
500
|
+
xml[:mets].techMD ID: 'fid4-amd-tech' do
|
501
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
502
|
+
xml[:mets].xmlData do
|
503
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
504
|
+
xml.section.generalFileCharacteristics! do
|
505
|
+
xml.record do
|
506
|
+
xml.key.label! 'ã b ç d ë ¼.doc'
|
507
|
+
xml.key.fileCreationDate! '2021-08-27 14:14:26.346 UTC'
|
508
|
+
xml.key.fileModificationDate! '2018-04-06 05:06:40.297 UTC'
|
509
|
+
xml.key.fileLocation! '/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/ccçcc/ã b ç d ë ¼.doc'
|
510
|
+
xml.key.fileOriginalName! 'ã b ç d ë ¼.doc'
|
511
|
+
xml.key.fileOriginalPath! 'aaa á aaa/ccçcc'
|
512
|
+
xml.key.fileMIMEType! 'application/msword'
|
513
|
+
xml.key.fileSizeBytes! '50688'
|
514
|
+
end
|
515
|
+
end
|
516
|
+
xml.section.fileFixity! do
|
517
|
+
xml.record do
|
518
|
+
xml.key.fixityType! 'MD5'
|
519
|
+
xml.key.fixityValue! 'cd3e8cfa9cf5ada3485e205d706cee09'
|
520
|
+
end
|
521
|
+
end
|
522
|
+
xml.section.objectCharacteristics! do
|
523
|
+
xml.record do
|
524
|
+
xml.key.groupID! 'grp'
|
525
|
+
end
|
526
|
+
end
|
527
|
+
end
|
528
|
+
end
|
529
|
+
end
|
530
|
+
end
|
531
|
+
end
|
532
|
+
xml[:mets].amdSec ID: 'fid5-amd' do
|
533
|
+
xml[:mets].techMD ID: 'fid5-amd-tech' do
|
534
|
+
xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
|
535
|
+
xml[:mets].xmlData do
|
536
|
+
xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
|
537
|
+
xml.section.generalFileCharacteristics! do
|
538
|
+
xml.record do
|
539
|
+
xml.key.label! 'ã b ç d ë ¼.doc'
|
540
|
+
xml.key.fileCreationDate! '2021-08-27 14:14:26.356 UTC'
|
541
|
+
xml.key.fileModificationDate! '2018-04-06 05:11:07.095 UTC'
|
542
|
+
xml.key.fileLocation! '/nas/upload/demo/test_diacritics/âbç d€f/aaa á aaa/ss$ss/ã b ç d ë ¼.doc'
|
543
|
+
xml.key.fileOriginalName! 'ã b ç d ë ¼.doc'
|
544
|
+
xml.key.fileOriginalPath! 'aaa á aaa/ss$ss'
|
545
|
+
xml.key.fileMIMEType! 'application/msword'
|
546
|
+
xml.key.fileSizeBytes! '61440'
|
547
|
+
end
|
548
|
+
end
|
549
|
+
xml.section.fileFixity! do
|
550
|
+
xml.record do
|
551
|
+
xml.key.fixityType! 'MD5'
|
552
|
+
xml.key.fixityValue! '312bba1438acdb17e3d69d19fe4cac4b'
|
553
|
+
end
|
554
|
+
end
|
555
|
+
xml.section.objectCharacteristics! do
|
556
|
+
xml.record do
|
557
|
+
xml.key.groupID! 'grp'
|
558
|
+
end
|
559
|
+
end
|
560
|
+
end
|
561
|
+
end
|
562
|
+
end
|
563
|
+
end
|
564
|
+
end
|
565
|
+
xml[:mets].fileSec do
|
566
|
+
xml[:mets].fileGrp ID: 'rep1', USE: 'VIEW', ADMID: 'rep1-amd' do
|
567
|
+
xml[:mets].file ID: 'fid1', MIMETYPE: 'application/msword', ADMID: 'fid1-amd', GROUPID: 'grp' do
|
568
|
+
xml[:mets].FLocat 'xmlns:xlin' => 'http://www.w3.org/1999/xlink', LOCTYPE: 'URL', 'xlin:href' => 'aaa á aaa/b/abc.doc'
|
569
|
+
end
|
570
|
+
xml[:mets].file ID: 'fid2', MIMETYPE: 'application/msword', ADMID: 'fid2-amd', GROUPID: 'grp' do
|
571
|
+
xml[:mets].FLocat 'xmlns:xlin' => 'http://www.w3.org/1999/xlink', LOCTYPE: 'URL', 'xlin:href' => 'aaa á aaa/b/def.dóc'
|
572
|
+
end
|
573
|
+
xml[:mets].file ID: 'fid3', MIMETYPE: 'application/msword', ADMID: 'fid3-amd', GROUPID: 'grp' do
|
574
|
+
xml[:mets].FLocat 'xmlns:xlin' => 'http://www.w3.org/1999/xlink', LOCTYPE: 'URL', 'xlin:href' => 'aaa á aaa/b/ábc.doc'
|
575
|
+
end
|
576
|
+
xml[:mets].file ID: 'fid4', MIMETYPE: 'application/msword', ADMID: 'fid4-amd', GROUPID: 'grp' do
|
577
|
+
xml[:mets].FLocat 'xmlns:xlin' => 'http://www.w3.org/1999/xlink', LOCTYPE: 'URL', 'xlin:href' => 'aaa á aaa/ccçcc/ã b ç d ë ¼.doc'
|
578
|
+
end
|
579
|
+
xml[:mets].file ID: 'fid5', MIMETYPE: 'application/msword', ADMID: 'fid5-amd', GROUPID: 'grp' do
|
580
|
+
xml[:mets].FLocat 'xmlns:xlin' => 'http://www.w3.org/1999/xlink', LOCTYPE: 'URL', 'xlin:href' => 'aaa á aaa/ss$ss/ã b ç d ë ¼.doc'
|
581
|
+
end
|
582
|
+
end
|
583
|
+
end
|
584
|
+
xml[:mets].structMap ID: 'rep1-1', TYPE: 'PHYSICAL' do
|
585
|
+
xml[:mets].div LABEL: 'Archiefkopie' do
|
586
|
+
xml[:mets].div LABEL: 'âbç d€f' do
|
587
|
+
xml[:mets].div LABEL: 'aaa á aaa' do
|
588
|
+
xml[:mets].div LABEL: 'b' do
|
589
|
+
xml[:mets].div LABEL: 'abc.doc', TYPE: 'FILE' do
|
590
|
+
xml[:mets].fptr FILEID: 'fid1'
|
591
|
+
end
|
592
|
+
xml[:mets].div LABEL: 'def.dóc', TYPE: 'FILE' do
|
593
|
+
xml[:mets].fptr FILEID: 'fid2'
|
594
|
+
end
|
595
|
+
xml[:mets].div LABEL: 'ábc.doc', TYPE: 'FILE' do
|
596
|
+
xml[:mets].fptr FILEID: 'fid3'
|
597
|
+
end
|
598
|
+
end
|
599
|
+
xml[:mets].div LABEL: 'ccçcc' do
|
600
|
+
xml[:mets].div LABEL: 'ã b ç d ë ¼.doc', TYPE: 'FILE' do
|
601
|
+
xml[:mets].fptr FILEID: 'fid4'
|
602
|
+
end
|
603
|
+
end
|
604
|
+
xml[:mets].div LABEL: 'ss$ss' do
|
605
|
+
xml[:mets].div LABEL: 'ã b ç d ë ¼.doc', TYPE: 'FILE' do
|
606
|
+
xml[:mets].fptr FILEID: 'fid5'
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
end
|
611
|
+
end
|
612
|
+
end
|
613
|
+
end
|
614
|
+
end.document
|
615
|
+
}
|
616
|
+
|
617
|
+
it 'produces METS XML' do
|
618
|
+
mets_file.dc_record = sample[:dc_record]
|
619
|
+
mets_file.amd_info = sample[:amd]
|
620
|
+
sample[:representations].each do |rep|
|
621
|
+
mets_file.representation(rep)
|
622
|
+
end
|
623
|
+
sample[:files].each do |file|
|
624
|
+
rep_id = file.delete(:representation)
|
625
|
+
rep = mets_file.representations[rep_id]
|
626
|
+
mets_file.file(file).representation = rep
|
627
|
+
end
|
628
|
+
sample[:divs].each do |div|
|
629
|
+
parent = div.delete(:parent)
|
630
|
+
files = div.delete(:files)
|
631
|
+
d = mets_file.div(div)
|
632
|
+
files.each { |f| d << mets_file.files[f] } if files
|
633
|
+
mets_file.divs[parent] << d if parent
|
634
|
+
end
|
635
|
+
sample[:maps].each do |map|
|
636
|
+
rep = mets_file.representations[map[:representation]]
|
637
|
+
div = mets_file.divs[map[:div]]
|
638
|
+
mets_file.map(rep, div)
|
639
|
+
end
|
640
|
+
|
641
|
+
expect(mets_file.xml_doc.root).to be_equivalent_to target.root
|
642
|
+
end
|
643
|
+
end
|
644
|
+
|
223
645
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: libis-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.17
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kris Dekeyser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-08-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -386,7 +386,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
386
386
|
- !ruby/object:Gem::Version
|
387
387
|
version: '0'
|
388
388
|
requirements: []
|
389
|
-
rubygems_version: 3.
|
389
|
+
rubygems_version: 3.1.6
|
390
390
|
signing_key:
|
391
391
|
specification_version: 4
|
392
392
|
summary: LIBIS toolbox.
|