adiwg-mdtranslator 2.6.1 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -1
  3. data/adiwg-mdtranslator.gemspec +1 -1
  4. data/lib/adiwg/mdtranslator/internal/internal_metadata_obj.rb +3 -2
  5. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_attribute.rb +4 -4
  6. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_fgdc.rb +1 -1
  7. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_identification.rb +7 -2
  8. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_keyword.rb +35 -1
  9. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_lineage.rb +10 -2
  10. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_methodology.rb +69 -0
  11. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_process.rb +6 -10
  12. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_quality.rb +3 -3
  13. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_range.rb +3 -3
  14. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_raster.rb +1 -1
  15. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_source.rb +5 -5
  16. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_spatialOrganization.rb +6 -4
  17. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_taxonSystem.rb +6 -3
  18. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_taxonomy.rb +6 -4
  19. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entityAttribute.rb +6 -6
  20. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_resourceInfo.rb +2 -2
  21. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_source.rb +101 -94
  22. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_taxonomicSystem.rb +2 -2
  23. data/lib/adiwg/mdtranslator/version.rb +4 -1
  24. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_browse.rb +54 -0
  25. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_citation.rb +35 -15
  26. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_constraint.rb +53 -0
  27. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_description.rb +1 -1
  28. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_fgdc.rb +39 -3
  29. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_geologicAge.rb +1 -1
  30. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_identification.rb +148 -89
  31. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_keyword.rb +6 -6
  32. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_lineage.rb +91 -0
  33. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_method.rb +94 -0
  34. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_methodKeywords.rb +55 -0
  35. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_process.rb +119 -0
  36. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_publisher.rb +1 -1
  37. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_quality.rb +64 -0
  38. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_security.rb +69 -0
  39. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_series.rb +1 -1
  40. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_source.rb +124 -0
  41. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_spatialDomain.rb +2 -2
  42. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_spatialOrganization.rb +177 -0
  43. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_status.rb +1 -1
  44. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomy.rb +70 -0
  45. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomyClassification.rb +65 -0
  46. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomyKeywords.rb +55 -0
  47. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_taxonomySystem.rb +154 -0
  48. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_timePeriod.rb +22 -16
  49. data/lib/adiwg/mdtranslator/writers/fgdc/fgdc_writer.rb +19 -1
  50. data/lib/adiwg/mdtranslator/writers/fgdc/readme.md +2 -2
  51. data/lib/adiwg/mdtranslator/writers/html/html_writer.rb +1 -1
  52. data/lib/adiwg/mdtranslator/writers/html/sections/html_entityAttribute.rb +2 -2
  53. data/lib/adiwg/mdtranslator/writers/html/sections/html_source.rb +7 -0
  54. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_entityAttribute.rb +2 -2
  55. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_source.rb +1 -0
  56. metadata +19 -4
@@ -2,7 +2,7 @@
2
2
  # FGDC CSDGM writer output in XML
3
3
 
4
4
  # History:
5
- # Stan Smith 2017-11-21 original script
5
+ # Stan Smith 2017-11-21 original script
6
6
 
7
7
  module ADIWG
8
8
  module Mdtranslator
@@ -0,0 +1,124 @@
1
+ # FGDC <<Class>> Source
2
+ # FGDC CSDGM writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2017-12-18 original script
6
+
7
+ require_relative 'class_citation'
8
+ require_relative 'class_timePeriod'
9
+
10
+ module ADIWG
11
+ module Mdtranslator
12
+ module Writers
13
+ module Fgdc
14
+
15
+ class Source
16
+
17
+ def initialize(xml, hResponseObj)
18
+ @xml = xml
19
+ @hResponseObj = hResponseObj
20
+ end
21
+
22
+ def writeXML(hSource, aSourceCollection)
23
+
24
+ # skip if this source is already identified
25
+ unless hSource[:sourceId].nil?
26
+ return if aSourceCollection.include?(hSource[:sourceId])
27
+ aSourceCollection << hSource[:sourceId]
28
+ end
29
+ if hSource[:sourceId].nil?
30
+ @hResponseObj[:writerPass] = false
31
+ @hResponseObj[:writerMessages] << 'Source is missing source abbreviation (source id)'
32
+ end
33
+
34
+ @xml.tag!('srcinfo') do
35
+
36
+ # classes used
37
+ citationClass = Citation.new(@xml, @hResponseObj)
38
+ timePeriodClass = TimePeriod.new(@xml, @hResponseObj)
39
+
40
+ # source 2.5.1.1 (srccite) - source citation (required)
41
+ # <- resourceLineage.source.sourceCitation
42
+ unless hSource[:sourceCitation].empty?
43
+ @xml.tag!('srccite') do
44
+ citationClass.writeXML(hSource[:sourceCitation], [])
45
+ end
46
+ end
47
+ if hSource[:sourceCitation].empty?
48
+ @hResponseObj[:writerPass] = false
49
+ @hResponseObj[:writerMessages] << 'Source is missing citation'
50
+ end
51
+
52
+ # source 2.5.1.2 (srcscale) - source scale denominator
53
+ # <- resourceLineage.source.spatialResolution.scaleFactor
54
+ haveResolution = false
55
+ unless hSource[:spatialResolution].empty?
56
+ unless hSource[:spatialResolution].nil?
57
+ haveResolution = true
58
+ @xml.tag!('srcscale', hSource[:spatialResolution][:scaleFactor].to_s)
59
+ end
60
+ end
61
+ if !haveResolution && @hResponseObj[:writerShowTags]
62
+ @xml.tag!('srcscale')
63
+ end
64
+
65
+ # source 2.5.1.3 (typesrc) - type of source media (required)
66
+ # <- resourceLineage.source.description
67
+ unless hSource[:description].nil?
68
+ @xml.tag!('typesrc', hSource[:description])
69
+ end
70
+ if hSource[:description].nil?
71
+ @hResponseObj[:writerPass] = false
72
+ @hResponseObj[:writerMessages] << 'Source is missing media type (description)'
73
+ end
74
+
75
+ # source 2.5.1.4 (srctime) - source time period (required)
76
+ # <- resourceLineage.source.scope.extents[0].temporalExtent[0].timePeriod
77
+ haveTime = false
78
+ unless hSource[:scope].empty?
79
+ unless hSource[:scope][:extents].empty?
80
+ unless hSource[:scope][:extents][0][:temporalExtents].empty?
81
+ unless hSource[:scope][:extents][0][:temporalExtents][0][:timePeriod].empty?
82
+ haveTime = true
83
+ hTimePeriod = hSource[:scope][:extents][0][:temporalExtents][0][:timePeriod]
84
+ @xml.tag!('srctime') do
85
+ timePeriodClass.writeXML(hTimePeriod, 'srccurr')
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
91
+ unless haveTime
92
+ @hResponseObj[:writerPass] = false
93
+ @hResponseObj[:writerMessages] << 'Source is missing time period'
94
+ end
95
+
96
+ # source 2.5.1.5 (srccitea) - source citation abbreviation (required)
97
+ # <- resourceLineage.source.sourceId
98
+ unless hSource[:sourceId].nil?
99
+ @xml.tag!('srccitea', hSource[:sourceId])
100
+ end
101
+ if hSource[:sourceId].nil?
102
+ @hResponseObj[:writerPass] = false
103
+ @hResponseObj[:writerMessages] << 'Source is missing citation abbreviation (id)'
104
+ end
105
+
106
+ # source 2.5.1.6 (srccontr) - source contribution (required)
107
+ # <- resourceLineage.source.description
108
+ unless hSource[:description].nil?
109
+ @xml.tag!('srccontr', hSource[:description])
110
+ end
111
+ if hSource[:sourceId].nil?
112
+ @hResponseObj[:writerPass] = false
113
+ @hResponseObj[:writerMessages] << 'Source is missing contribution (description)'
114
+ end
115
+
116
+ end
117
+
118
+ end # writeXML
119
+ end # Source
120
+
121
+ end
122
+ end
123
+ end
124
+ end
@@ -90,7 +90,7 @@ module ADIWG
90
90
  end
91
91
  if geoDescription.empty?
92
92
  @hResponseObj[:writerPass] = false
93
- @hResponseObj[:writerMessages] << 'Spatial Domain section is missing geographic description'
93
+ @hResponseObj[:writerMessages] << 'Spatial Domain is missing geographic description'
94
94
  end
95
95
 
96
96
  # spatial domain 1.5.1 (bounding) - bounding box (required)
@@ -149,7 +149,7 @@ module ADIWG
149
149
  end
150
150
  if hBBox.empty?
151
151
  @hResponseObj[:writerPass] = false
152
- @hResponseObj[:writerMessages] << 'Spatial Domain section is missing bounding box'
152
+ @hResponseObj[:writerMessages] << 'Spatial Domain is missing bounding box'
153
153
  end
154
154
 
155
155
  # spatial domain 1.5.2 (dsgpoly) - bounding polygon [] (required)
@@ -0,0 +1,177 @@
1
+ # FGDC <<Class>> SpatialOrganization
2
+ # FGDC CSDGM writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2017-12-21 original script
6
+
7
+ module ADIWG
8
+ module Mdtranslator
9
+ module Writers
10
+ module Fgdc
11
+
12
+ class SpatialOrganization
13
+
14
+ def initialize(xml, hResponseObj)
15
+ @xml = xml
16
+ @hResponseObj = hResponseObj
17
+ end
18
+
19
+ def writeXML(hResourceInfo)
20
+
21
+ # spatial organization 3.1 (indspref) - Indirect Spatial Reference
22
+ # <- hResourceInfo.spatialReferenceSystems.systemIdentifier.identifier = 'indirect' (first)
23
+ haveIndirect = false
24
+ hResourceInfo[:spatialReferenceSystems].each do |hSystem|
25
+ unless hSystem[:systemIdentifier].empty?
26
+ if hSystem[:systemIdentifier][:identifier] == 'indirect'
27
+ unless hSystem[:systemIdentifier][:description].empty?
28
+ @xml.tag!('indspref', hSystem[:systemIdentifier][:description])
29
+ haveIndirect = true
30
+ break
31
+ end
32
+ end
33
+ end
34
+ end
35
+ if !haveIndirect && @hResponseObj[:writerShowTags]
36
+ @xml.tag!('indspref')
37
+ end
38
+
39
+ # spatial organization 3.2 (direct) - Direct Spatial Reference Method
40
+ # <- resourceInfo.spatialRepresentationTypes
41
+ # take first that match ['point' | 'vector' | 'grid']
42
+ direct = nil
43
+ hResourceInfo[:spatialRepresentationTypes].each do |type|
44
+ direct = 'Point' if type == 'point'
45
+ direct = 'Vector' if type == 'vector'
46
+ direct = 'Raster' if type == 'grid'
47
+ unless direct.nil?
48
+ @xml.tag!('direct', direct)
49
+ break
50
+ end
51
+ end
52
+ if direct.nil? && @hResponseObj[:writerShowTags]
53
+ @xml.tag!('direct')
54
+ end
55
+
56
+ # spatial organization 3.3 (ptvctinf) - point and vector object information
57
+ # <- resourceInfo.spatialRepresentations.vectorRepresentation (first)
58
+ if direct == 'Point' || direct == 'Vector'
59
+ hResourceInfo[:spatialRepresentations].each do |hSpaceRep|
60
+ unless hSpaceRep[:vectorRepresentation].empty?
61
+ hVectorRep = hSpaceRep[:vectorRepresentation]
62
+ unless hVectorRep.empty?
63
+ @xml.tag!('ptvctinf') do
64
+ if hVectorRep[:topologyLevel].nil?
65
+
66
+ # spatial organization point and vector object 3.3.1 (sdtsterm) - SDTS term []
67
+ hVectorRep[:vectorObject].each do |hVecObj|
68
+ @xml.tag!('sdtsterm') do
69
+
70
+ # spatial organization point and vector object 3.3.1.1 (sdtstype) - SDTS object type (requied)
71
+ @xml.tag!('sdtstype', hVecObj[:objectType])
72
+
73
+ # spatial organization point and vector object 3.3.1.2 (ptvctcnt) - SDTS count
74
+ unless hVecObj[:objectCount].nil?
75
+ @xml.tag!('ptvctcnt', hVecObj[:objectCount])
76
+ end
77
+ if hVecObj[:objectCount].nil?
78
+ @xml.tag!('ptvctcnt')
79
+ end
80
+
81
+ end
82
+ end
83
+
84
+ else
85
+
86
+ # point and vector object 3.3.2 (vpfterm) - VPF terms description
87
+ @xml.tag!('vpfterm') do
88
+
89
+ # VPF term 3.3.2.1 (vpflevel) - VPF topology level
90
+ @xml.tag!('vpflevel', hVectorRep[:topologyLevel])
91
+
92
+ # VPF term 3.3.2.2 (vpfinfo) - VPF point and vector object information []
93
+ hVectorRep[:vectorObject].each do |hVecObj|
94
+ @xml.tag!('vpfinfo') do
95
+
96
+ # spatial organization point and vector object 3.3.2.2.1 (vpftype) - VPF object type (requied)
97
+ @xml.tag!('vpftype', hVecObj[:objectType])
98
+
99
+ # spatial organization point and vector object 3.3.2.2.2 (ptvctcnt) - VPF object type
100
+ unless hVecObj[:objectCount].nil?
101
+ @xml.tag!('ptvctcnt', hVecObj[:objectCount])
102
+ end
103
+ if hVecObj[:objectCount].nil?
104
+ @xml.tag!('ptvctcnt')
105
+ end
106
+
107
+ end
108
+ end
109
+
110
+ end
111
+
112
+ end
113
+ end
114
+ break
115
+ end
116
+
117
+ end
118
+ end
119
+ end
120
+
121
+ # spatial organization 3.4 (rastinfo) - point and vector object information
122
+ # <- resourceInfo.spatialRepresentations.gridRepresentation (first)
123
+ if direct == 'Raster'
124
+ hResourceInfo[:spatialRepresentations].each do |hSpaceRep|
125
+ if hSpaceRep[:gridRepresentation]
126
+ hGridRep = hSpaceRep[:gridRepresentation]
127
+ @xml.tag!('rastinfo') do
128
+
129
+ # spatial organization raster 3.4.1 (rasttype) - raster type (required)
130
+ unless hGridRep[:cellGeometry].empty?
131
+ @xml.tag!('rasttype', hGridRep[:cellGeometry])
132
+ end
133
+ if hGridRep[:cellGeometry].empty?
134
+ @hResponseObj[:writerPass] = false
135
+ @hResponseObj[:writerMessages] << 'Raster Spatial Organization is missing raster type'
136
+ end
137
+
138
+ # spatial organization raster 3.4.2 (rowcount) - row count
139
+ hGridRep[:dimension].each do |hDimension|
140
+ if hDimension[:dimensionType] == 'row'
141
+ unless hDimension[:dimensionSize].nil?
142
+ @xml.tag!('rowcount', hDimension[:dimensionSize])
143
+ end
144
+ end
145
+ end
146
+
147
+ # spatial organization raster 3.4.2 (colcount) - column count
148
+ hGridRep[:dimension].each do |hDimension|
149
+ if hDimension[:dimensionType] == 'column'
150
+ unless hDimension[:dimensionSize].nil?
151
+ @xml.tag!('colcount', hDimension[:dimensionSize])
152
+ end
153
+ end
154
+ end
155
+
156
+ # spatial organization raster 3.4.2 (vrtcount) - depth count
157
+ hGridRep[:dimension].each do |hDimension|
158
+ if hDimension[:dimensionType] == 'vertical'
159
+ unless hDimension[:dimensionSize].nil?
160
+ @xml.tag!('vrtcount', hDimension[:dimensionSize])
161
+ end
162
+ end
163
+ end
164
+
165
+ end
166
+ break
167
+ end
168
+ end
169
+ end
170
+
171
+ end # writeXML
172
+ end # SpatialOrganization
173
+
174
+ end
175
+ end
176
+ end
177
+ end
@@ -2,7 +2,7 @@
2
2
  # FGDC CSDGM writer output in XML
3
3
 
4
4
  # History:
5
- # Stan Smith 2017-11-25 original script
5
+ # Stan Smith 2017-11-25 original script
6
6
 
7
7
  module ADIWG
8
8
  module Mdtranslator
@@ -0,0 +1,70 @@
1
+ # FGDC <<Class>> Taxonomy
2
+ # FGDC CSDGM writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2017-12-12 original script
6
+
7
+ require_relative 'class_taxonomyKeywords'
8
+ require_relative 'class_taxonomySystem'
9
+ require_relative 'class_taxonomyClassification'
10
+
11
+ module ADIWG
12
+ module Mdtranslator
13
+ module Writers
14
+ module Fgdc
15
+
16
+ class Taxonomy
17
+
18
+ def initialize(xml, hResponseObj)
19
+ @xml = xml
20
+ @hResponseObj = hResponseObj
21
+ end
22
+
23
+ def writeXML(hTaxonomy, aKeywords)
24
+
25
+ # classes used
26
+ keywordClass = TaxonomyKeyword.new(@xml, @hResponseObj)
27
+ taxSystemClass = TaxonomySystem.new(@xml, @hResponseObj)
28
+ taxClassClass = TaxonomyClassification.new(@xml, @hResponseObj)
29
+
30
+ # taxonomy bio (keywtax) - taxonomic keywords (required)
31
+ unless aKeywords.empty?
32
+ keywordClass.writeXML(aKeywords)
33
+ end
34
+ if aKeywords.empty? && @hResponseObj[:writerShowTags]
35
+ @xml.tag!('keywtax')
36
+ end
37
+
38
+ # taxonomy bio (taxonsys) - taxonomic system
39
+ # section is not required for fgdc, but is required by mdJson
40
+ # so section will always be present
41
+ @xml.tag!('taxonsys') do
42
+ taxSystemClass.writeXML(hTaxonomy)
43
+ end
44
+
45
+ # taxonomy (taxongen) - general scope
46
+ unless hTaxonomy[:generalScope].nil?
47
+ @xml.tag!('taxongen', hTaxonomy[:generalScope])
48
+ end
49
+ if hTaxonomy[:generalScope].nil? && @hResponseObj[:writerShowTags]
50
+ @xml.tag!('taxongen')
51
+ end
52
+
53
+ # taxonomy bio (taxoncl) - taxonomic classification {required}
54
+ unless hTaxonomy[:taxonClass].empty?
55
+ @xml.tag!('taxoncl') do
56
+ taxClassClass.writeXML(hTaxonomy[:taxonClass])
57
+ end
58
+ end
59
+ if hTaxonomy[:taxonClass].empty?
60
+ @hResponseObj[:writerPass] = false
61
+ @hResponseObj[:writerMessages] << 'Taxonomy is missing taxonomic classification'
62
+ end
63
+
64
+ end # writeXML
65
+ end # Taxonomy
66
+
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,65 @@
1
+ # FGDC <<Class>> TaxonomyClassification
2
+ # FGDC CSDGM writer output in XML
3
+
4
+ # History:
5
+ # Stan Smith 2017-12-13 original script
6
+
7
+ require_relative 'class_taxonomyClassification'
8
+
9
+ module ADIWG
10
+ module Mdtranslator
11
+ module Writers
12
+ module Fgdc
13
+
14
+ class TaxonomyClassification
15
+
16
+ def initialize(xml, hResponseObj)
17
+ @xml = xml
18
+ @hResponseObj = hResponseObj
19
+ end
20
+
21
+ def writeXML(hClass)
22
+
23
+ # classes used
24
+ taxClassClass = TaxonomyClassification.new(@xml, @hResponseObj)
25
+
26
+ # taxonomy bio (taxonrn) - taxon rank (required)
27
+ unless hClass[:taxonRank].nil?
28
+ @xml.tag!('taxonrn', hClass[:taxonRank])
29
+ end
30
+ if hClass[:taxonRank].nil?
31
+ @hResponseObj[:writerPass] = false
32
+ @hResponseObj[:writerMessages] << 'Taxonomic Classification is missing taxon rank'
33
+ end
34
+
35
+ # taxonomy bio (taxonrv) - taxon value (required)
36
+ unless hClass[:taxonValue].nil?
37
+ @xml.tag!('taxonrv', hClass[:taxonValue])
38
+ end
39
+ if hClass[:taxonValue].nil?
40
+ @hResponseObj[:writerPass] = false
41
+ @hResponseObj[:writerMessages] << 'Taxonomic Classification is missing latin name'
42
+ end
43
+
44
+ # taxonomy bio (common) - taxon value common names []
45
+ hClass[:commonNames].each do |hName|
46
+ @xml.tag!('common', hName)
47
+ end
48
+ if hClass[:commonNames].empty? && @hResponseObj[:writerShowTags]
49
+ @xml.tag!('common')
50
+ end
51
+
52
+ # taxonomy bio (taxoncl) - taxonomic sub-classification []
53
+ hClass[:subClasses].each do |hSubClass|
54
+ @xml.tag!('taxoncl') do
55
+ taxClassClass.writeXML(hSubClass)
56
+ end
57
+ end
58
+
59
+ end # writeXML
60
+ end # TaxonomyClassification
61
+
62
+ end
63
+ end
64
+ end
65
+ end