adiwg-mdtranslator 2.2.0 → 2.3.0

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.
Files changed (24) hide show
  1. checksums.yaml +4 -4
  2. data/lib/adiwg/mdtranslator/internal/internal_metadata_obj.rb +23 -23
  3. data/lib/adiwg/mdtranslator/readers/fgdc/fgdc_reader.rb +1 -0
  4. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_attribute.rb +110 -0
  5. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_digitalForm.rb +69 -0
  6. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_distribution.rb +82 -1
  7. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_entity.rb +72 -0
  8. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_entityAttribute.rb +32 -1
  9. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_entityOverview.rb +45 -0
  10. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_enumerated.rb +50 -0
  11. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_fgdc.rb +29 -13
  12. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_identification.rb +1 -1
  13. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_metadataInfo.rb +125 -1
  14. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_offlineOption.rb +98 -0
  15. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_onlineOption.rb +81 -0
  16. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_orderProcess.rb +79 -0
  17. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_pointVector.rb +102 -0
  18. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_range.rb +50 -0
  19. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_raster.rb +84 -0
  20. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_spatialOrganization.rb +48 -2
  21. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_timePeriod.rb +20 -1
  22. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_transferInfo.rb +87 -0
  23. data/lib/adiwg/mdtranslator/version.rb +2 -1
  24. metadata +15 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3e1a7618b0b9a44fbbd8808b27a9111adca45d85
4
- data.tar.gz: 55dca9d676c8c8ed9a95518b0a2ff4cfc0c52ceb
3
+ metadata.gz: 05a5a0a4dc73f22a0ce7486fe6be73754cc93743
4
+ data.tar.gz: 7c4c4d97eb981e0d6612ce4dc439b356eb0fe0cc
5
5
  SHA512:
6
- metadata.gz: 0c59615f5b8ae9addda3b76e957333fca0feea02b12ffced0f26703315a6311b26d95c4c794e5f349eab497f7743c13fa303cdc4122bafa284edbc3e14c54798
7
- data.tar.gz: 151db516221b7d753b01a42e96300e0286769f4688750ba48f2d3514ce02bb4d5d034f72d865beacd70ee47470811bd26912ac7594aaa6c2186df67e2bd49275
6
+ metadata.gz: 5d224f7a98809a3738ca574b64662f466ba023f33a81fced281d72c06c2df0f3059a08daddbf7dfe9352e9ec4c56f89874644419c860a9eaa42fd4c6c6fd2f85
7
+ data.tar.gz: 533e4af92c507a80d47d89669a68d9d7a9ca829c790047b65c66bfbf968e57506889b980932975b277f813d244e3f4e2caf2f6318e8bd43331c75fbb2ae43d26
@@ -436,29 +436,6 @@ class InternalMetadata
436
436
  }
437
437
  end
438
438
 
439
- def newSpatialReferenceSystem
440
- {
441
- systemType: nil,
442
- systemIdentifier: {}
443
- }
444
- end
445
-
446
- def newSpatialResolution
447
- {
448
- scaleFactor: nil,
449
- measure: {},
450
- levelOfDetail: nil
451
- }
452
- end
453
-
454
- def newMeasure
455
- {
456
- type: nil,
457
- value: nil,
458
- unitOfMeasure: nil
459
- }
460
- end
461
-
462
439
  def newExtent
463
440
  {
464
441
  description: nil,
@@ -793,6 +770,29 @@ class InternalMetadata
793
770
  }
794
771
  end
795
772
 
773
+ def newSpatialReferenceSystem
774
+ {
775
+ systemType: nil,
776
+ systemIdentifier: {}
777
+ }
778
+ end
779
+
780
+ def newSpatialResolution
781
+ {
782
+ scaleFactor: nil,
783
+ measure: {},
784
+ levelOfDetail: nil
785
+ }
786
+ end
787
+
788
+ def newMeasure
789
+ {
790
+ type: nil,
791
+ value: nil,
792
+ unitOfMeasure: nil
793
+ }
794
+ end
795
+
796
796
  def newSpatialRepresentation
797
797
  {
798
798
  gridRepresentation: {},
@@ -4,6 +4,7 @@
4
4
  # Stan Smith 2017-08-10 original script
5
5
 
6
6
  require 'nokogiri'
7
+ require_relative 'version'
7
8
  require_relative 'modules/module_fgdc'
8
9
 
9
10
  module ADIWG
@@ -0,0 +1,110 @@
1
+ # Reader - fgdc to internal data structure
2
+ # unpack fgdc entity attribute
3
+
4
+ # History:
5
+ # Stan Smith 2017-09-06 original script
6
+
7
+ require 'uuidtools'
8
+ require 'nokogiri'
9
+ require 'adiwg/mdtranslator/internal/internal_metadata_obj'
10
+ require_relative 'module_enumerated'
11
+ require_relative 'module_range'
12
+
13
+ module ADIWG
14
+ module Mdtranslator
15
+ module Readers
16
+ module Fgdc
17
+
18
+ module Attribute
19
+
20
+ def self.unpack(xAttribute, hDictionary, hResponseObj)
21
+
22
+ # instance classes needed in script
23
+ intMetadataClass = InternalMetadata.new
24
+ hAttribute = intMetadataClass.newEntityAttribute
25
+
26
+ # entity attribute 5.1.2.1 (attrlabl) - attribute name
27
+ # -> dataDictionary.entities.attributes.attributeCode
28
+ code = xAttribute.xpath('./attrlabl').text
29
+ unless code.empty?
30
+ hAttribute[:attributeName] = code
31
+ hAttribute[:attributeCode] = code
32
+ end
33
+
34
+ # entity attribute 5.1.2.2 (attrdef) - attribute definition
35
+ # -> dataDictionary.entities.attributes.attributeDefinition
36
+ definition = xAttribute.xpath('./attrdef').text
37
+ unless definition.empty?
38
+ hAttribute[:attributeDefinition] = definition
39
+ end
40
+
41
+ # entity attribute 5.1.2.3 (attrdefs) - attribute definition source
42
+ # -> not mapped
43
+
44
+ # entity attribute 5.1.2.4 (attrdomv) - attribute domain value
45
+ axDomain = xAttribute.xpath('./attrdomv')
46
+ unless axDomain.empty?
47
+ hDomain = intMetadataClass.newDictionaryDomain
48
+ hDomain[:domainId] = UUIDTools::UUID.random_create.to_s
49
+ hDomain[:domainCode] = code
50
+ hDomain[:domainDescription] = 'FGDC enumerated domain'
51
+
52
+ axDomain.each do |xDomain|
53
+
54
+ # entity attribute 5.1.2.4.1 (edom) - enumerated domain
55
+ xEnumeration = xDomain.xpath('./edom')
56
+ unless xEnumeration.empty?
57
+ hItem = Enumerated.unpack(xEnumeration, hResponseObj)
58
+ hDomain[:domainItems] << hItem
59
+ end
60
+
61
+ # entity attribute 5.1.2.4.2 (rdom) - range domain
62
+ xRange = xDomain.xpath('./rdom')
63
+ unless xRange.empty?
64
+ Range.unpack(xRange, hAttribute, hResponseObj)
65
+ end
66
+
67
+ # entity attribute 5.1.2.4.3 (codesetd) - codeset domain
68
+
69
+ # entity attribute 5.1.2.4.3.1 (codesetn) - codeset name
70
+ # -> not mapped
71
+
72
+ # entity attribute 5.1.2.4.3.2 (codesets) - codeset source
73
+ # -> not mapped
74
+
75
+ # entity attribute 5.1.2.4.4 (udom) - unrepresentable domain
76
+ # -> not mapped
77
+
78
+ end
79
+
80
+ unless hDomain[:domainItems].empty?
81
+ hAttribute[:domainId] = hDomain[:domainId]
82
+ hDictionary[:domains] << hDomain
83
+ end
84
+
85
+ end
86
+
87
+ # entity attribute 5.1.2.5 (begdatea) - beginning date of attribute values
88
+ # -> not mapped
89
+
90
+ # entity attribute 5.1.2.6 (enddatea) - ending date of attribute values
91
+ # -> not mapped
92
+
93
+ # entity attribute 5.1.2.7 (attrvai) - attribute value accuracy information
94
+
95
+ # entity attribute 5.1.2.7.1 (attrva) - attribute value accuracy
96
+ # -> not mapped
97
+
98
+ # entity attribute 5.1.2.7.2 (attrvae) - attribute value accuracy explanation
99
+ # -> not mapped
100
+
101
+ hAttribute
102
+
103
+ end
104
+
105
+ end
106
+
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,69 @@
1
+ # Reader - fgdc to internal data structure
2
+ # unpack fgdc distribution digital form
3
+
4
+ # History:
5
+ # Stan Smith 2017-09-08 original script
6
+
7
+ require 'nokogiri'
8
+ require 'adiwg/mdtranslator/internal/internal_metadata_obj'
9
+ require_relative 'module_date'
10
+ require_relative 'module_transferInfo'
11
+ require_relative 'module_onlineOption'
12
+ require_relative 'module_offlineOption'
13
+
14
+ module ADIWG
15
+ module Mdtranslator
16
+ module Readers
17
+ module Fgdc
18
+
19
+ module DigitalForm
20
+
21
+ def self.unpack(xDigiForm, hResponseObj)
22
+
23
+ # instance classes needed in script
24
+ intMetadataClass = InternalMetadata.new
25
+ hTransfer = intMetadataClass.newTransferOption
26
+
27
+ # distribution 6.4.2.1 (digtinfo) - digital transfer information
28
+ xTranInfo = xDigiForm.xpath('./digtinfo')
29
+ unless xTranInfo.empty?
30
+ TransferInfo.unpack(xTranInfo, hTransfer, hResponseObj)
31
+ end
32
+
33
+ # distribution 6.4.2.2 (digtopt) - digital transfer option
34
+ xDigiOption = xDigiForm.xpath('./digtopt')
35
+ unless xDigiOption.empty?
36
+
37
+ # distribution 6.4.2.2.1 (onlinopt) - online option []
38
+ axOnlines = xDigiOption.xpath('./onlinopt')
39
+ unless axOnlines.empty?
40
+ axOnlines.each do |xOnline|
41
+ aOnlines = OnlineOption.unpack(xOnline, hResponseObj)
42
+ aOnlines.each do |hOnline|
43
+ hTransfer[:onlineOptions] << hOnline
44
+ end
45
+ end
46
+ end
47
+
48
+ # distribution 6.4.2.2.2 (offoptn) - offline option []
49
+ axOfflines = xDigiOption.xpath('./offoptn')
50
+ unless axOfflines.empty?
51
+ axOfflines.each do |xOffline|
52
+ aOffline = OfflineOption.unpack(xOffline, hResponseObj)
53
+ aOffline.each do |hOffline|
54
+ hTransfer[:offlineOptions] << hOffline
55
+ end
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ return hTransfer
62
+
63
+ end
64
+ end
65
+
66
+ end
67
+ end
68
+ end
69
+ end
@@ -6,6 +6,9 @@
6
6
 
7
7
  require 'nokogiri'
8
8
  require 'adiwg/mdtranslator/internal/internal_metadata_obj'
9
+ require_relative 'module_contact'
10
+ require_relative 'module_orderProcess'
11
+ require_relative 'module_timePeriod'
9
12
 
10
13
  module ADIWG
11
14
  module Mdtranslator
@@ -14,9 +17,87 @@ module ADIWG
14
17
 
15
18
  module Distribution
16
19
 
17
- def self.unpack(xDistribution, hResponseObj)
20
+ def self.unpack(xDistribution, hResourceInfo, hResponseObj)
18
21
 
22
+ # instance classes needed in script
23
+ intMetadataClass = InternalMetadata.new
24
+ hDistribution = intMetadataClass.newDistribution
25
+ hDistributor = intMetadataClass.newDistributor
19
26
 
27
+ # distribution 6.1 (distrib) - distributor {contact}
28
+ # -> distribution.distributor.contact.responsibility(distributor)
29
+ xContact = xDistribution.xpath('./distrib')
30
+ unless xContact.empty?
31
+ hResponsibility = Contact.unpack(xContact, hResponseObj)
32
+ unless hResponsibility.nil?
33
+ hResponsibility[:roleName] = 'distributor'
34
+ hDistributor[:contact] = hResponsibility
35
+ end
36
+ end
37
+
38
+ # distribution 6.2 (resdesc) - resource description
39
+ # -> distribution.description
40
+ description = xDistribution.xpath('./resdesc').text
41
+ unless description.empty?
42
+ hDistribution[:description] = description
43
+ end
44
+
45
+ # distribution 6.3 (distliab) - distribution liability
46
+ # -> resourceInfo.constraints.legal.otherConstraint
47
+ constraint = xDistribution.xpath('./distliab').text
48
+ unless constraint.empty?
49
+ hConstraint = intMetadataClass.newConstraint
50
+ hConstraint[:type] = 'legal'
51
+ hLegal = intMetadataClass.newLegalConstraint
52
+ hLegal[:otherCons] << constraint
53
+ hConstraint[:legalConstraint] = hLegal
54
+ hResourceInfo[:constraints] << hConstraint
55
+ end
56
+
57
+ # distribution 6.4 (stdorder) - standard order process []
58
+ axOrders = xDistribution.xpath('./stdorder')
59
+ unless axOrders.empty?
60
+ axOrders.each do |xOrder|
61
+ OrderProcess.unpack(xOrder, hDistributor, hResponseObj)
62
+ end
63
+ end
64
+
65
+ # distribution 6.5 (custom) - custom order process
66
+ # -> distribution.distributor.orderProcess.orderingInstructions
67
+ custom = xDistribution.xpath('./custom').text
68
+ unless custom.empty?
69
+ hOrder = intMetadataClass.newOrderProcess
70
+ hOrder[:orderingInstructions] = custom
71
+ hDistributor[:orderProcess] << hOrder
72
+ end
73
+
74
+ # distribution 6.6 (techpreq) - technical prerequisites
75
+ # -> distribution.description {+=}
76
+ techPre = xDistribution.xpath('./techpreq').text
77
+ unless techPre.empty?
78
+ hDistribution[:description] += '\n\n Technical Prerequisites: ' + techPre
79
+ end
80
+
81
+ # distribution 6.7 (availabl) - available time period {time period}
82
+ # -> distribution.distributor.orderProcess.plannedAvailability
83
+ xTimePeriod = xDistribution.xpath('./availabl')
84
+ unless xTimePeriod.empty?
85
+ hTimePeriod = TimePeriod.unpack(xTimePeriod, hResponseObj)
86
+ unless hTimePeriod.nil?
87
+ if hTimePeriod[:startDateTime].empty?
88
+ hDateTime = hTimePeriod[:endDateTime]
89
+ else
90
+ hDateTime = hTimePeriod[:startDateTime]
91
+ end
92
+ hDistributor[:orderProcess].each do |hOrder|
93
+ hOrder[:plannedAvailability] = hDateTime
94
+ end
95
+ end
96
+ end
97
+
98
+ hDistribution[:distributor] << hDistributor
99
+
100
+ return hDistribution
20
101
 
21
102
  end
22
103
 
@@ -0,0 +1,72 @@
1
+ # Reader - fgdc to internal data structure
2
+ # unpack fgdc entity detail
3
+
4
+ # History:
5
+ # Stan Smith 2017-09-06 original script
6
+
7
+ require 'uuidtools'
8
+ require 'nokogiri'
9
+ require 'adiwg/mdtranslator/internal/internal_metadata_obj'
10
+ require_relative 'module_attribute'
11
+
12
+ module ADIWG
13
+ module Mdtranslator
14
+ module Readers
15
+ module Fgdc
16
+
17
+ module Entity
18
+
19
+ def self.unpack(xDetail, hDictionary, hResponseObj)
20
+
21
+ # instance classes needed in script
22
+ intMetadataClass = InternalMetadata.new
23
+
24
+ # entity attribute 5.1.1 (enttype) - definition and description set
25
+ xEntity = xDetail.xpath('./enttype')
26
+ unless xEntity.empty?
27
+
28
+ hEntity = intMetadataClass.newEntity
29
+ hEntity[:entityId] = UUIDTools::UUID.random_create.to_s
30
+
31
+ # entity attribute 5.1.1.1 (enttypl) - entity name
32
+ # -> dataDictionary.entities.entityCode
33
+ code = xEntity.xpath('./enttypl').text
34
+ unless code.empty?
35
+ hEntity[:entityCode] = code
36
+ end
37
+
38
+ # entity attribute 5.1.1.2 (enttypd) - entity definition
39
+ # -> dataDictionary.entities.entityDefinition
40
+ definition = xEntity.xpath('./enttypd').text
41
+ unless definition.empty?
42
+ hEntity[:entityDefinition] = definition
43
+ end
44
+
45
+ # entity attribute 5.1.1.3 (enttypds) - entity definition source
46
+ # -> not mapped
47
+
48
+ # entity attribute 5.1.2 (attr) - characteristics of an attribute
49
+ axAttribute = xDetail.xpath('./attr')
50
+ unless axAttribute.empty?
51
+ axAttribute.each do |xAttribute|
52
+ hAttribute = Attribute.unpack(xAttribute, hDictionary, hResponseObj)
53
+ unless hAttribute.nil?
54
+ hEntity[:attributes] << hAttribute
55
+ end
56
+ end
57
+ end
58
+
59
+ return hEntity
60
+
61
+ end
62
+
63
+ return nil
64
+
65
+ end
66
+
67
+ end
68
+
69
+ end
70
+ end
71
+ end
72
+ end
@@ -6,6 +6,8 @@
6
6
 
7
7
  require 'nokogiri'
8
8
  require 'adiwg/mdtranslator/internal/internal_metadata_obj'
9
+ require_relative 'module_entity'
10
+ require_relative 'module_entityOverview'
9
11
 
10
12
  module ADIWG
11
13
  module Mdtranslator
@@ -16,7 +18,36 @@ module ADIWG
16
18
 
17
19
  def self.unpack(xEntity, hResponseObj)
18
20
 
19
-
21
+ # instance classes needed in script
22
+ intMetadataClass = InternalMetadata.new
23
+ hDictionary = intMetadataClass.newDataDictionary
24
+ hCitation = intMetadataClass.newCitation
25
+ hCitation[:title] = 'FGDC EntityAttribute Section 5'
26
+ hDictionary[:citation] = hCitation
27
+
28
+ # entity attribute 5.1 (detailed) - entity attribute detailed description
29
+ axDetail = xEntity.xpath('./detailed')
30
+ unless axDetail.empty?
31
+ axDetail.each do |xDetail|
32
+ hEntity = Entity.unpack(xDetail, hDictionary, hResponseObj)
33
+ unless hEntity.nil?
34
+ hDictionary[:entities] << hEntity
35
+ end
36
+ end
37
+ end
38
+
39
+ # entity attribute 5.2 (overview) - entity attribute summary description
40
+ axOverview = xEntity.xpath('./overview')
41
+ unless axOverview.empty?
42
+ axOverview.each do |xOverview|
43
+ hEntity = EntityOverview.unpack(xOverview, hResponseObj)
44
+ unless hEntity.nil?
45
+ hDictionary[:entities] << hEntity
46
+ end
47
+ end
48
+ end
49
+
50
+ return hDictionary
20
51
 
21
52
  end
22
53