libis-tools 0.9.14 → 0.9.15

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 512c7276e67c6ac0bd94efa21580539c5a64aa28
4
- data.tar.gz: c9b2f0513b64dc7108d39734774e222da6abf0da
3
+ metadata.gz: 7ad80b0200a021e9181c164d32163ef90c03ec40
4
+ data.tar.gz: ff6cba705fa063e1a98c83f80c79e20516da2eaf
5
5
  SHA512:
6
- metadata.gz: 757f0538365ddff2a5d0e76d13ba68d306fcf99f52c1322069cc2dc8d60b3a3943ef11866823dc3a2ed299023b0e95012b059d06c05993362ebead8355f1501c
7
- data.tar.gz: 445171e74e24c53351d31ac4a590d2c709b9a0f4eee6a6e5884294ae6e41a7de89162c5751ed9eeae4a466c39258e200153d31e5e4570f3354342ecf9045f29e
6
+ metadata.gz: b09c20e3962dc4b8aeb1555212a51992a5102a07f3b6b27b65af97075bd06de12fcf8fea24a6d762aa8d34554a0ab43cfe13110e4072dcbfb99c0dbd4af58e82
7
+ data.tar.gz: 597b7334148abc3ba78f675b8914cbaf05647a7b57a5d9d66e61717c1cb083588d0e8d7a69a6d949320528b52f4c7dec9b3bcaf8036663551f4a4fbca98bed96
data/.travis.yml CHANGED
@@ -24,6 +24,8 @@ matrix:
24
24
  jdk: oraclejdk7
25
25
  - rvm: ruby-head
26
26
  jdk: oraclejdk8
27
+ allow_failures:
28
+ - rvm: ruby-head
27
29
  branches:
28
30
  only:
29
31
  - master
@@ -31,7 +31,7 @@ module Libis
31
31
  end
32
32
 
33
33
  rescue StandardError => e
34
- result[err] = [e.class.name, e.message]
34
+ result[:err] = [e.class.name, e.message]
35
35
 
36
36
  end
37
37
 
@@ -32,10 +32,10 @@ module Libis
32
32
  Libis::Tools::XmlDocument.from_hash(doc)
33
33
  when NilClass
34
34
  Libis::Tools::XmlDocument.new.build do |xml|
35
- xml.record('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
35
+ xml[:dc].record('xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
36
36
  'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
37
37
  'xmlns:dcterms' => 'http://purl.org/dc/terms/') {
38
- yield xml
38
+ yield xml if block_given?
39
39
  }
40
40
  end
41
41
  else
@@ -41,7 +41,12 @@ module Libis
41
41
  class Representation
42
42
  include IdContainer
43
43
 
44
- attr_accessor :label, :preservation_type, :usage_type, :dc_record
44
+ attr_accessor :label, :preservation_type, :usage_type, :representation_code, :entity_type, :priority, :order,
45
+ :digital_original, :content, :context, :hardware, :carrier, :original_name,
46
+ :user_a, :user_b, :user_c, :group_id,
47
+ :preservation_levels, :env_dependencies, :hardware_ids, :software_ids,
48
+ :hardware_infos, :software_infos, :relationship_infos, :environments,
49
+ :dc_record, :source_metadata
45
50
 
46
51
  def xml_id
47
52
  "rep#{id}"
@@ -50,14 +55,161 @@ module Libis
50
55
  def amd
51
56
  dnx = {}
52
57
  tech_data = []
58
+ # General characteristics
53
59
  data = {
54
60
  preservationType: preservation_type,
55
61
  usageType: usage_type,
56
- # RevisionNumber: 1,
57
- # DigitalOriginal: true,
62
+ DigitalOriginal: digital_original,
63
+ label: label,
64
+ representationEntityType: entity_type,
65
+ contentType: content,
66
+ contextType: context,
67
+ hardwareUsed: hardware,
68
+ physicalCarrierMedia: carrier,
69
+ deliveryPriority: priority,
70
+ orderingSequence: order,
71
+ RepresentationCode: representation_code,
72
+ RepresentationOriginalName: original_name,
73
+ UserDefinedA: user_a,
74
+ UserDefinedB: user_b,
75
+ UserDefinedC: user_c,
58
76
  }.cleanup
59
77
  tech_data << TechGeneralRep.new(data) unless data.empty?
78
+ # Object characteristics
79
+ data = {
80
+ groupID: group_id
81
+ }.cleanup
82
+ tech_data << TechObjectChars.new(data) unless data.empty?
83
+ # Preservation level
84
+ if preservation_levels
85
+ data_list = []
86
+ preservation_levels.each do |preservation_level|
87
+ data = {
88
+ preservationLevelValue: preservation_level[:value],
89
+ preservationLevelRole: preservation_level[:role],
90
+ preservationLevelRationale: preservation_level[:rationale],
91
+ preservationLevelDateAssigned: preservation_level[:date],
92
+ }.cleanup
93
+ data_list << OpenStruct.new(data) unless data.empty?
94
+ end
95
+ tech_data << PreservationLevel.new(array: data_list) unless data_list.empty?
96
+ end
97
+ # Dependencies
98
+ if env_dependencies
99
+ data_list = []
100
+ env_dependencies.each do |dependency|
101
+ data = {
102
+ dependencyName: dependency[:name],
103
+ dependencyIdentifierType1: dependency[:type1],
104
+ dependencyIdentifierValue1: dependency[:value1],
105
+ dependencyIdentifierType2: dependency[:type2],
106
+ dependencyIdentifierValue2: dependency[:value2],
107
+ dependencyIdentifierType3: dependency[:type3],
108
+ dependencyIdentifierValue3: dependency[:value3],
109
+ }.cleanup
110
+ data_list << OpenStruct.new(data) unless data.empty?
111
+ end
112
+ tech_data << EnvDeps.new(array: data_list) unless data_list.empty?
113
+ end
114
+ # Hardware registry id
115
+ if hardware_ids
116
+ data_list = []
117
+ hardware_ids.each do |id|
118
+ data = {
119
+ registryId: id
120
+ }.cleanup
121
+ data_list << OpenStruct.new(data) unless data.empty?
122
+ end
123
+ tech_data << HardwareId.new(array: data_list) unless data_list.empty?
124
+ end
125
+ # Software registry id
126
+ if software_ids
127
+ data_list = []
128
+ software_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 << SoftwareId.new(array: data_list) unless data_list.empty?
135
+ end
136
+ # Hardware
137
+ if hardware_infos
138
+ data_list = []
139
+ hardware_infos.each do |hardware|
140
+ data = {
141
+ hardwareName: hardware[:name],
142
+ hardwareType: hardware[:type],
143
+ hardwareOtherInformation: hardware[:info],
144
+ }.cleanup
145
+ data_list << OpenStruct.new(data) unless data.empty?
146
+ end
147
+ tech_data << HardwareInfo.new(array: data_list) unless data_list.empty?
148
+ end
149
+ # Software
150
+ if software_infos
151
+ data_list = []
152
+ software_infos.each do |software|
153
+ data = {
154
+ softwareName: software[:name],
155
+ softwareVersion: software[:version],
156
+ softwareType: software[:type],
157
+ softwareOtherInformation: software[:info],
158
+ softwareDependancy: software[:dependency],
159
+ }.cleanup
160
+ data_list << OpenStruct.new(data) unless data.empty?
161
+ end
162
+ tech_data << SoftwareInfo.new(array: data_list) unless data_list.empty?
163
+ end
164
+ # Relationship
165
+ if relationship_infos
166
+ data_list = []
167
+ relationship_infos.each do |relationship|
168
+ data = {
169
+ relationshipType: relationship[:type],
170
+ relationshipSubType: relationship[:subtype],
171
+ relatedObjectIdentifierType1: relationship[:type1],
172
+ relatedObjectIdentifierValue1: relationship[:id1],
173
+ relatedObjectSequence1: relationship[:seq1],
174
+ relatedObjectIdentifierType2: relationship[:type2],
175
+ relatedObjectIdentifierValue2: relationship[:id2],
176
+ relatedObjectSequence2: relationship[:seq2],
177
+ relatedObjectIdentifierType3: relationship[:type3],
178
+ relatedObjectIdentifierValue3: relationship[:id3],
179
+ relatedObjectSequence3: relationship[:seq3],
180
+ }.cleanup
181
+ data_list << OpenStruct.new(data) unless data.empty?
182
+ end
183
+ tech_data << RelationShip.new(array: data_list) unless data_list.empty?
184
+ end
185
+ # Environment
186
+ if environments
187
+ data_list = []
188
+ environments.each do |environment|
189
+ data = {
190
+ environmentCharacteristic: environment[:characteristic],
191
+ environmentPurpose: environment[:purpose],
192
+ environmentNote: environment[:note],
193
+ }.cleanup
194
+ data_list << OpenStruct.new(data) unless data.empty?
195
+ end
196
+ tech_data << Environment.new(array: data_list) unless data_list.empty?
197
+ end
198
+ # Finally assemble technical section
60
199
  dnx[:tech] = tech_data unless tech_data.empty?
200
+ # Rights section
201
+ rights_data = []
202
+ data = {
203
+ policyId: hash[:access_right]
204
+ }.cleanup
205
+ rights_data << Rights.new(data) unless data.empty?
206
+ dnx[:rights] = rights_data unless rights_data.empty?
207
+ # Source metadata
208
+ if source_metadata
209
+ source_metadata.each_with_index do |metadata, i|
210
+ dnx["source-#{metadata[:type].to_s.upcase}-#{i}"] = metadata[:data]
211
+ end
212
+ end
61
213
  dnx
62
214
  end
63
215
 
@@ -66,7 +218,13 @@ module Libis
66
218
  class File
67
219
  include IdContainer
68
220
 
69
- attr_accessor :label, :location, :target_location, :mimetype, :entity_type, :representation, :dc_record
221
+ attr_accessor :label, :note, :location, :target_location, :mimetype, :entity_type,
222
+ :creation_date, :modification_date, :composition_level, :group_id,
223
+ :fixity_type, :fixity_value,
224
+ :preservation_levels, :inhibitors, :env_dependencies, :hardware_ids, :software_ids,
225
+ :signatures, :hardware_infos, :software_infos, :relationship_infos, :environments, :applications,
226
+ :dc_record, :source_metadata
227
+ :representation
70
228
 
71
229
  def xml_id
72
230
  "fid#{id}"
@@ -111,20 +269,194 @@ module Libis
111
269
  def amd
112
270
  dnx = {}
113
271
  tech_data = []
272
+ # General File charateristics
114
273
  data = {
115
274
  label: label,
116
- fileMIMEType: mimetype,
275
+ note: note,
276
+ fileCreationDate: creation_date,
277
+ fileModificationDate: modification_date,
278
+ FileEntityType: entity_type,
279
+ compositionLevel: composition_level,
280
+ # fileLocationType: 'FILE',
281
+ # fileLocation: '',
117
282
  fileOriginalName: orig_name,
118
283
  fileOriginalPath: orig_path,
119
- FileEntityType: entity_type,
120
- # fileSizeBytes: size,
284
+ fileOriginalID: location,
285
+ fileExtension: ::File.extname(orig_name),
286
+ fileMIMEType: mimetype,
287
+ fileSizeBytes: size,
288
+
121
289
  }.cleanup
122
290
  tech_data << TechGeneralFile.new(data) unless data.empty?
123
- # data = {
124
- # fixityType: fixity_type,
125
- # fixityValue: fixity_value,
126
- # }.cleanup
127
- # tech_data << TechFixity.new(data) unless data.empty?
291
+ # Fixity
292
+ data = {
293
+ fixityType: fixity_type,
294
+ fixityValue: fixity_value,
295
+ }.cleanup
296
+ tech_data << TechFixity.new(data) unless data.empty?
297
+ # Object characteristics
298
+ data = {
299
+ groupID: group_id
300
+ }.cleanup
301
+ tech_data << TechObjectChars.new(data) unless data.empty?
302
+ # Preservation level
303
+ if preservation_levels
304
+ data_list = []
305
+ preservation_levels.each do |preservation_level|
306
+ data = {
307
+ preservationLevelValue: preservation_level[:value],
308
+ preservationLevelRole: preservation_level[:role],
309
+ preservationLevelRationale: preservation_level[:rationale],
310
+ preservationLevelDateAssigned: preservation_level[:date],
311
+ }.cleanup
312
+ data_list << OpenStruct.new(data) unless data.empty?
313
+ end
314
+ tech_data << PreservationLevel.new(array: data_list) unless data_list.empty?
315
+ end
316
+ # Inhibitor
317
+ if inhibitors
318
+ data_list = []
319
+ inhibitors.each do |inhibitor|
320
+ data = {
321
+ inhibitorType: inhibitor[:type],
322
+ inhibitorTarget: inhibitor[:target],
323
+ inhibitorKey: inhibitor[:key],
324
+ }.cleanup
325
+ data_list << OpenStruct.new(data) unless data.empty?
326
+ end
327
+ tech_data << Inhibitor.new(array: data_list) unless data_list.empty?
328
+ end
329
+ # Dependencies
330
+ if env_dependencies
331
+ data_list = []
332
+ env_dependencies.each do |dependency|
333
+ data = {
334
+ dependencyName: dependency[:name],
335
+ dependencyIdentifierType1: dependency[:type1],
336
+ dependencyIdentifierValue1: dependency[:value1],
337
+ dependencyIdentifierType2: dependency[:type2],
338
+ dependencyIdentifierValue2: dependency[:value2],
339
+ dependencyIdentifierType3: dependency[:type3],
340
+ dependencyIdentifierValue3: dependency[:value3],
341
+ }.cleanup
342
+ data_list << OpenStruct.new(data) unless data.empty?
343
+ end
344
+ tech_data << EnvDeps.new(array: data_list) unless data_list.empty?
345
+ end
346
+ # Hardware registry id
347
+ if hardware_ids
348
+ data_list = []
349
+ hardware_ids.each do |id|
350
+ data = {
351
+ registryId: id
352
+ }.cleanup
353
+ data_list << OpenStruct.new(data) unless data.empty?
354
+ end
355
+ tech_data << HardwareId.new(array: data_list) unless data_list.empty?
356
+ end
357
+ # Software registry id
358
+ if software_ids
359
+ data_list = []
360
+ software_ids.each do |id|
361
+ data = {
362
+ registryId: id
363
+ }.cleanup
364
+ data_list << OpenStruct.new(data) unless data.empty?
365
+ end
366
+ tech_data << SoftwareId.new(array: data_list) unless data_list.empty?
367
+ end
368
+ # Singatures
369
+ if signatures
370
+ data_list = []
371
+ signatures.each do |signature|
372
+ data = {
373
+ signatureInformationEncoding: signature[:encoding],
374
+ signer: signature[:signer],
375
+ signatureMethod: signature[:method],
376
+ signatureValue: signature[:value],
377
+ signatureValidationRules: signature[:rules],
378
+ signatureProperties: signature[:properties],
379
+ }.cleanup
380
+ data_list << OpenStruct.new(data) unless data.empty?
381
+ end
382
+ tech_data << Signature.new(array: data_list) unless data_list.empty?
383
+ end
384
+ # Hardware
385
+ if hardware_infos
386
+ data_list = []
387
+ hardware_infos.each do |hardware|
388
+ data = {
389
+ hardwareName: hardware[:name],
390
+ hardwareType: hardware[:type],
391
+ hardwareOtherInformation: hardware[:info],
392
+ }.cleanup
393
+ data_list << OpenStruct.new(data) unless data.empty?
394
+ end
395
+ tech_data << HardwareInfo.new(array: data_list) unless data_list.empty?
396
+ end
397
+ # Software
398
+ if software_infos
399
+ data_list = []
400
+ software_infos.each do |software|
401
+ data = {
402
+ softwareName: software[:name],
403
+ softwareVersion: software[:version],
404
+ softwareType: software[:type],
405
+ softwareOtherInformation: software[:info],
406
+ softwareDependancy: software[:dependency],
407
+ }.cleanup
408
+ data_list << OpenStruct.new(data) unless data.empty?
409
+ end
410
+ tech_data << SoftwareInfo.new(array: data_list) unless data_list.empty?
411
+ end
412
+ # Relationship
413
+ if relationship_infos
414
+ data_list = []
415
+ relationship_infos.each do |relationship|
416
+ data = {
417
+ relationshipType: relationship[:type],
418
+ relationshipSubType: relationship[:subtype],
419
+ relatedObjectIdentifierType1: relationship[:type1],
420
+ relatedObjectIdentifierValue1: relationship[:id1],
421
+ relatedObjectSequence1: relationship[:seq1],
422
+ relatedObjectIdentifierType2: relationship[:type2],
423
+ relatedObjectIdentifierValue2: relationship[:id2],
424
+ relatedObjectSequence2: relationship[:seq2],
425
+ relatedObjectIdentifierType3: relationship[:type3],
426
+ relatedObjectIdentifierValue3: relationship[:id3],
427
+ relatedObjectSequence3: relationship[:seq3],
428
+ }.cleanup
429
+ data_list << OpenStruct.new(data) unless data.empty?
430
+ end
431
+ tech_data << RelationShip.new(array: data_list) unless data_list.empty?
432
+ end
433
+ # Environment
434
+ if environments
435
+ data_list = []
436
+ environments.each do |environment|
437
+ data = {
438
+ environmentCharacteristic: environment[:characteristic],
439
+ environmentPurpose: environment[:purpose],
440
+ environmentNote: environment[:note],
441
+ }.cleanup
442
+ data_list << OpenStruct.new(data) unless data.empty?
443
+ end
444
+ tech_data << Environment.new(array: data_list) unless data_list.empty?
445
+ end
446
+ # Application
447
+ if applications
448
+ data_list = []
449
+ applications.each do |application|
450
+ data = {
451
+ creatingApplicationName: application[:name],
452
+ creatingApplicationVersion: application[:version],
453
+ dateCreatedByApplication: application[:date],
454
+ }.cleanup
455
+ data_list << OpenStruct.new(data) unless data.empty?
456
+ end
457
+ tech_data << Application.new(array: data_list) unless data_list.empty?
458
+ end
459
+ # Finally assemble technical section
128
460
  dnx[:tech] = tech_data unless tech_data.empty?
129
461
  dnx
130
462
  end
@@ -190,6 +522,10 @@ module Libis
190
522
  end
191
523
  end
192
524
 
525
+ class TechObjectChars < DnxSection
526
+ tag 'objectCharacteristics'
527
+ end
528
+
193
529
  class TechGeneralIE < DnxSection
194
530
  tag 'generalIECharacteristics'
195
531
  end
@@ -214,6 +550,54 @@ module Libis
214
550
  tag 'accessRightsPolicy'
215
551
  end
216
552
 
553
+ class WebHarvesting < DnxSection
554
+ tag 'webHarvesting'
555
+ end
556
+
557
+ class PreservationLevel < DnxSection
558
+ tag 'preservationLevel'
559
+ end
560
+
561
+ class EnvDeps < DnxSection
562
+ tag 'environmentDependencies'
563
+ end
564
+
565
+ class HardwareId < DnxSection
566
+ tag 'envHardwareRegistry'
567
+ end
568
+
569
+ class SoftwareId < DnxSection
570
+ tag 'envSoftwareRegistry'
571
+ end
572
+
573
+ class HardwareInfo < DnxSection
574
+ tag 'environmentHardware'
575
+ end
576
+
577
+ class SoftwareInfo < DnxSection
578
+ tag 'environmentSoftware'
579
+ end
580
+
581
+ class Relationship < DnxSection
582
+ tag 'relationship'
583
+ end
584
+
585
+ class Environment < DnxSection
586
+ tag 'environment'
587
+ end
588
+
589
+ class Inhibitor < DnxSection
590
+ tag 'inhibitors'
591
+ end
592
+
593
+ class Signature < DnxSection
594
+ tag 'signatureInformation'
595
+ end
596
+
597
+ class Application < DnxSection
598
+ tag 'creatingApplication'
599
+ end
600
+
217
601
  attr_reader :representations, :files, :divs, :maps
218
602
 
219
603
  # noinspection RubyConstantNamingConvention
@@ -229,6 +613,8 @@ module Libis
229
613
  @files = {}
230
614
  @divs = {}
231
615
  @maps = {}
616
+ @dnx = {}
617
+ @dc_record = nil
232
618
  end
233
619
 
234
620
  def self.parse(xml)
@@ -287,8 +673,8 @@ module Libis
287
673
  )
288
674
  hash_rep
289
675
  end
290
- { amd: amd_sec['ie-amd'],
291
- dmd: dmd_sec['ie-dmd'],
676
+ {amd: amd_sec['ie-amd'],
677
+ dmd: dmd_sec['ie-dmd'],
292
678
  }.cleanup.merge(
293
679
  xml_doc.root.xpath('.//mets:structMap[@TYPE="PHYSICAL"]', NS).inject({}) do |hash_map, map|
294
680
  rep_id = map[:ID].gsub(/-\d+$/, '')
@@ -329,17 +715,31 @@ module Libis
329
715
  @dnx = {}
330
716
  tech_data = []
331
717
  data = {
718
+ groupID: hash[:group_id]
719
+ }.cleanup
720
+ tech_data << TechObjectChars.new(data) unless data.empty?
721
+ data = {
722
+ status: hash[:status],
332
723
  IEEntityType: hash[:entity_type],
333
724
  UserDefinedA: hash[:user_a],
334
725
  UserDefinedB: hash[:user_b],
335
726
  UserDefinedC: hash[:user_c],
336
- status: hash[:status],
727
+ submissionReason: hash[:submission_reason],
337
728
  }.cleanup
338
729
  tech_data << TechGeneralIE.new(data) unless data.empty?
339
730
  data = {
340
731
  policyId: hash[:retention_id],
341
732
  }.cleanup
342
733
  tech_data << RetentionPeriod.new(data) unless data.empty?
734
+ data = {
735
+ primarySeedURL: hash[:harvest_url],
736
+ WCTIdentifier: hash[:harvest_id],
737
+ targetName: hash[:harvest_target],
738
+ group: hash[:harvest_group],
739
+ harvestDate: hash[:harvest_date],
740
+ harvestTime: hash[:harvest_time],
741
+ }.cleanup
742
+ tech_data << WebHarvesting.new(data) unless data.empty?
343
743
  @dnx[:tech] = tech_data unless tech_data.empty?
344
744
  data = {
345
745
  policyId: hash[:access_right]
@@ -347,6 +747,9 @@ module Libis
347
747
  rights_data = []
348
748
  rights_data << Rights.new(data) unless data.empty?
349
749
  @dnx[:rights] = rights_data unless rights_data.empty?
750
+ (hash[:source_metadata] || []).each_with_index do |metadata, i|
751
+ @dnx["source-#{metadata[:type].to_s.upcase}-#{i+1}"] = metadata[:data]
752
+ end
350
753
  end
351
754
 
352
755
  # @param [Hash] hash
@@ -488,7 +891,7 @@ module Libis
488
891
  TYPE: 'PHYSICAL',
489
892
  ) {
490
893
  xml[:mets].div(LABEL: map.representation.label) {
491
- add_struct_map(xml, map.div) if map.div
894
+ add_struct_map(xml, map.diqv) if map.div
492
895
  }
493
896
  }
494
897
  end
@@ -519,7 +922,7 @@ module Libis
519
922
  xml[:mets].dmdSec(ID: dmd_id(id)) {
520
923
  xml[:mets].mdWrap(MDTYPE: 'DC') {
521
924
  xml[:mets].xmlData {
522
- xml << dc_record
925
+ xml[:dc] << dc_record
523
926
  }
524
927
  }
525
928
  }
@@ -527,29 +930,42 @@ module Libis
527
930
 
528
931
  def add_amd_section(xml, id, dnx_sections = {})
529
932
  xml[:mets].amdSec(ID: amd_id(id)) {
530
- [:tech, :rights, :source, :digiprov].each do |section_type|
531
- xml.send("#{section_type}MD", ID: "#{amd_id(id)}-#{section_type.to_s}") {
532
- xml[:mets].mdWrap(MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx') {
533
- xml[:mets].xmlData {
534
- add_dnx_sections(xml, dnx_sections[section_type])
933
+ dnx_sections.each do |section_type, data|
934
+ if section_type.to_s =~ /^source-(.*)-\d+$/
935
+ xml[:mets].send('sourceMD', ID: "#{amd_id(id)}-#{section_type.to_s}") {
936
+ xml[:mets].mdWrap(MDTYPE: $1) {
937
+ xml[:mets].xmlData {
938
+ xml << data
939
+ }
535
940
  }
536
941
  }
537
- }
942
+ else
943
+ xml[:mets].send("#{section_type}MD", ID: "#{amd_id(id)}-#{section_type.to_s}") {
944
+ xml[:mets].mdWrap(MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx') {
945
+ xml[:mets].xmlData {
946
+ add_dnx_sections(xml, data)
947
+ }
948
+ }
949
+ }
950
+ end
538
951
  end
539
952
  }
540
953
  end
541
954
 
542
955
  def add_dnx_sections(xml, section_data)
543
956
  section_data ||= []
544
- xml[:mets].dnx(xmlns: NS[:dnx]) {
957
+ xml.dnx(xmlns: NS[:dnx]) {
545
958
  (section_data).each do |section|
546
959
  xml.section(id: section.tag) {
547
- xml.record {
548
- section.each_pair do |key, value|
549
- next if value.nil?
550
- xml.key(value, id: key)
551
- end
552
- }
960
+ records = section[:array] || [section]
961
+ records.each do |data|
962
+ xml.record {
963
+ data.each_pair do |key, value|
964
+ next if value.nil?
965
+ xml.key(value, id: key)
966
+ end
967
+ }
968
+ end
553
969
  }
554
970
  end
555
971
  }
@@ -1,5 +1,5 @@
1
1
  module Libis
2
2
  module Tools
3
- VERSION = '0.9.14'
3
+ VERSION = '0.9.15'
4
4
  end
5
5
  end
@@ -215,7 +215,7 @@ module Libis
215
215
  def build(at_node = nil, options = {}, &block)
216
216
  options = {encoding: 'utf-8' }.merge options
217
217
  if at_node
218
- Nokogiri::XML::Builder.new(options,at_node, &block)
218
+ Nokogiri::XML::Builder.new(options,at_node, &block)
219
219
  else
220
220
  xml = Nokogiri::XML::Builder.new(options, &block)
221
221
  @document = xml.doc
@@ -29,13 +29,13 @@ describe 'DublinCoreRecord' do
29
29
  context 'Empty record' do
30
30
  let(:data) { nil }
31
31
  let(:root) { <<STR.chomp
32
- <record \
32
+ <dc:record \
33
33
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" \
34
34
  xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"
35
35
  STR
36
36
  }
37
37
  let(:record_start) { root + '>' }
38
- let(:record_end) { '</record>' }
38
+ let(:record_end) { '</dc:record>' }
39
39
  let(:empty_record) { header + root + '/>' }
40
40
 
41
41
 
@@ -93,7 +93,7 @@ describe 'Marc21Record' do
93
93
  record.extend Libis::Tools::Metadata::Mappers::Kuleuven
94
94
  xml_doc = Libis::Tools::XmlDocument.parse <<STR
95
95
  <?xml version="1.0" encoding="utf-8"?>
96
- <record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/">
96
+ <dc:record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/">
97
97
  <dc:identifier>urn:ControlNumber:9921543960101471</dc:identifier>
98
98
  <dc:identifier>(BeLVLBS)002154396LBS01-Aleph</dc:identifier>
99
99
  <dc:identifier>8389207</dc:identifier>
@@ -103,7 +103,7 @@ describe 'Marc21Record' do
103
103
  <dc:date>1722 - 1724</dc:date>
104
104
  <dcterms:extent>8o: 4 v.; [22], 298, [8]; [16], 354, [1]; [16], 299, [7]; [16], 271, [5] p.</dcterms:extent>
105
105
  <dc:language/>
106
- </record>
106
+ </dc:record>
107
107
  STR
108
108
  expect(record.to_dc.root).to be_equivalent_to(xml_doc.root).respecting_element_order
109
109
  record.to_dc.elements.each_with_index do |element, i|
@@ -0,0 +1,218 @@
1
+ # encoding: utf-8
2
+ require_relative 'spec_helper'
3
+ require 'rspec/matchers'
4
+ require 'equivalent-xml'
5
+ require 'libis/tools/mets_file'
6
+ require 'libis/tools/xml_document'
7
+
8
+ describe 'METS File' do
9
+
10
+ before(:all) do
11
+ ::Libis::Tools::Config << {appname: 'LIBIS Default'}
12
+ end
13
+
14
+ subject(:mets_file) { ::Libis::Tools::MetsFile.new }
15
+
16
+ context 'without data' do
17
+
18
+ let(:skeleton) {
19
+ ::Libis::Tools::XmlDocument.build do |xml|
20
+ # noinspection RubyResolve
21
+ xml[:mets].mets 'xmlns:mets' => 'http://www.loc.gov/METS/' do
22
+ xml[:mets].amdSec 'ID' => 'ie-amd'
23
+ xml[:mets].fileSec
24
+ end
25
+ end.document
26
+ }
27
+
28
+ it 'generates skeleton XML' do
29
+ expect(mets_file.xml_doc.root).to be_equivalent_to skeleton.root
30
+ end
31
+
32
+ end
33
+
34
+ context 'with IE AMD' do
35
+
36
+ let(:dc_record) {
37
+ record = Libis::Tools::Metadata::DublinCoreRecord.new
38
+ record.title = 'Title'
39
+ record.author = 'Author'
40
+ record.subject = 'Subject'
41
+ record
42
+ }
43
+
44
+ let(:marc_record) {
45
+ Libis::Tools::XmlDocument.parse <<-STR
46
+ <?xml version="1.0" encoding="UTF-8"?>
47
+ <record xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd"
48
+ xmlns="http://www.loc.gov/MARC21/slim" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
49
+ <leader>abcdefghiljklmnopqrstuvwxyz</leader>
50
+ <controlfield tag="001">1234567890</controlfield>
51
+ <datafield tag="010" ind1="a" ind2="b">
52
+ <subfield code="a">abc</subfield>
53
+ <subfield code="b">xyz</subfield>
54
+ </datafield>
55
+ </record>
56
+ STR
57
+ }
58
+
59
+ let(:src_record) {
60
+ Libis::Tools::XmlDocument.parse <<-STR
61
+ <my_description xmlns="http://www.libis.be/description/">
62
+ <title>Title</title>
63
+ <importance>high</importance>
64
+ <location>here</location>
65
+ </my_description>
66
+ STR
67
+ }
68
+
69
+ let(:target) {
70
+ # noinspection RubyResolve
71
+ ::Libis::Tools::XmlDocument.build do |xml|
72
+ # noinspection RubyResolve
73
+ xml[:mets].mets 'xmlns:mets' => 'http://www.loc.gov/METS/' do
74
+ # noinspection RubyResolve
75
+ xml[:mets].amdSec ID: 'ie-amd' do
76
+ # noinspection RubyResolve
77
+ xml[:mets].techMD ID: 'ie-amd-tech' do
78
+ # noinspection RubyResolve
79
+ xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
80
+ # noinspection RubyResolve
81
+ xml[:mets].xmlData do
82
+ xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
83
+ # noinspection RubyResolve
84
+ xml.section.objectCharacteristics! do
85
+ xml.record do
86
+ # noinspection RubyResolve
87
+ xml.key.groupID! 'group_id'
88
+ end
89
+ end
90
+ # noinspection RubyResolve
91
+ xml.section.generalIECharacteristics! do
92
+ # noinspection RubyResolve
93
+ xml.record do
94
+ xml.key.status! 'status'
95
+ xml.key.IEEntityType! 'entity_type'
96
+ xml.key.UserDefinedA! 'user_a'
97
+ xml.key.UserDefinedB! 'user_b'
98
+ xml.key.UserDefinedC! 'user_c'
99
+ xml.key.submissionReason! 'submission_reason'
100
+ end
101
+ end
102
+ # noinspection RubyResolve
103
+ xml.section.retentionPolicy! do
104
+ # noinspection RubyResolve
105
+ xml.record do
106
+ xml.key.policyId! 'retention_id'
107
+ end
108
+ end
109
+ # noinspection RubyResolve
110
+ xml.section.webHarvesting! do
111
+ # noinspection RubyResolve
112
+ xml.record do
113
+ xml.key.primarySeedURL! 'harvest_url'
114
+ xml.key.WCTIdentifier! 'harvest_id'
115
+ xml.key.targetName! 'harvest_target'
116
+ xml.key.group! 'harvest_group'
117
+ xml.key.harvestDate! 'harvest_date'
118
+ xml.key.harvestTime! 'harvest_time'
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
125
+ # noinspection RubyResolve
126
+ xml[:mets].rightsMD ID: 'ie-amd-rights' do
127
+ # noinspection RubyResolve
128
+ xml[:mets].mdWrap MDTYPE: 'OTHER', OTHERMDTYPE: 'dnx' do
129
+ # noinspection RubyResolve
130
+ xml[:mets].xmlData do
131
+ xml.dnx xmlns: 'http://www.exlibrisgroup.com/dps/dnx' do
132
+ # noinspection RubyResolve
133
+ xml.section.accessRightsPolicy! do
134
+ # noinspection RubyResolve
135
+ xml.record do
136
+ xml.key.policyId! 'access_right'
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ # noinspection RubyResolve
144
+ xml[:mets].sourceMD ID: 'ie-amd-source-DC-1' do
145
+ # noinspection RubyResolve
146
+ xml[:mets].mdWrap MDTYPE: 'DC' do
147
+ # noinspection RubyResolve
148
+ xml[:mets].xmlData do
149
+ # xml.parent.namespace = xml.parent.namespace_definitions.first
150
+ xml.parent << dc_record.root.to_xml
151
+ end
152
+ end
153
+ end
154
+ # noinspection RubyResolve
155
+ xml[:mets].sourceMD ID: 'ie-amd-source-MARC-2' do
156
+ # noinspection RubyResolve
157
+ xml[:mets].mdWrap MDTYPE: 'MARC' do
158
+ # noinspection RubyResolve
159
+ xml[:mets].xmlData do
160
+ # xml.parent.namespace = xml.parent.namespace_definitions.first
161
+ xml.parent << marc_record.root.to_xml
162
+ end
163
+ end
164
+ end
165
+ # noinspection RubyResolve
166
+ xml[:mets].sourceMD ID: 'ie-amd-source-OTHER-3' do
167
+ # noinspection RubyResolve
168
+ xml[:mets].mdWrap MDTYPE: 'OTHER' do
169
+ # noinspection RubyResolve
170
+ xml[:mets].xmlData do
171
+ # xml.namespace = xml.parent.namespace_definitions.first
172
+ xml.parent << src_record.root.to_xml
173
+ end
174
+ end
175
+ end
176
+ end
177
+ xml[:mets].fileSec
178
+ end
179
+ end.document
180
+ }
181
+
182
+ it 'fills in IE-AMD section' do
183
+ mets_file.amd_info = {
184
+ group_id: 'group_id',
185
+ status: 'status',
186
+ entity_type: 'entity_type',
187
+ user_a: 'user_a',
188
+ user_b: 'user_b',
189
+ user_c: 'user_c',
190
+ submission_reason: 'submission_reason',
191
+ retention_id: 'retention_id',
192
+ harvest_url: 'harvest_url',
193
+ harvest_id: 'harvest_id',
194
+ harvest_target: 'harvest_target',
195
+ harvest_group: 'harvest_group',
196
+ harvest_date: 'harvest_date',
197
+ harvest_time: 'harvest_time',
198
+ access_right: 'access_right',
199
+ source_metadata: [
200
+ {
201
+ type: 'DC',
202
+ data: dc_record.root.to_xml
203
+ }, {
204
+ type: 'Marc',
205
+ data: marc_record.root.to_xml
206
+ }, {
207
+ type: 'other',
208
+ data: src_record.root.to_xml
209
+ }
210
+ ]
211
+ }
212
+
213
+ expect(mets_file.xml_doc.root).to be_equivalent_to target.root
214
+
215
+ end
216
+ end
217
+
218
+ 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: 0.9.14
4
+ version: 0.9.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kris Dekeyser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-08 00:00:00.000000000 Z
11
+ date: 2015-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -267,6 +267,7 @@ files:
267
267
  - spec/metadata/marc21_parser_spec.rb
268
268
  - spec/metadata/marc21_spec.rb
269
269
  - spec/metadata/metadata_mapper_spec.rb
270
+ - spec/mets_file_spec.rb
270
271
  - spec/parameter_container_spec.rb
271
272
  - spec/parameter_spec.rb
272
273
  - spec/spec_helper.rb
@@ -320,6 +321,7 @@ test_files:
320
321
  - spec/metadata/marc21_parser_spec.rb
321
322
  - spec/metadata/marc21_spec.rb
322
323
  - spec/metadata/metadata_mapper_spec.rb
324
+ - spec/mets_file_spec.rb
323
325
  - spec/parameter_container_spec.rb
324
326
  - spec/parameter_spec.rb
325
327
  - spec/spec_helper.rb