adiwg-mdtranslator 2.13.0 → 2.13.1

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +26 -14
  3. data/lib/adiwg/mdtranslator/internal/internal_metadata_obj.rb +1 -0
  4. data/lib/adiwg/mdtranslator/readers/fgdc/modules/module_dateTime.rb +56 -41
  5. data/lib/adiwg/mdtranslator/readers/fgdc/version.rb +3 -1
  6. data/lib/adiwg/mdtranslator/readers/mdJson/mdJson_reader.rb +1 -0
  7. data/lib/adiwg/mdtranslator/readers/mdJson/mdJson_reader_messages_eng.yml +377 -0
  8. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_additionalDocumentation.rb +6 -8
  9. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_address.rb +6 -6
  10. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_allocation.rb +6 -7
  11. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_associatedResource.rb +7 -11
  12. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_attribute.rb +12 -13
  13. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_attributeGroup.rb +10 -6
  14. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_bearingDistanceResolution.rb +11 -21
  15. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_boundingBox.rb +18 -38
  16. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_citation.rb +10 -8
  17. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_constraint.rb +22 -28
  18. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_contact.rb +17 -18
  19. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_contactPostprocess.rb +5 -3
  20. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_coordinateResolution.rb +9 -15
  21. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_coverageDescription.rb +6 -8
  22. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_dataDictionary.rb +8 -13
  23. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_date.rb +8 -12
  24. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_dateTime.rb +6 -6
  25. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_dimension.rb +7 -11
  26. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_distribution.rb +6 -5
  27. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_distributor.rb +17 -8
  28. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_domain.rb +12 -12
  29. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_domainItem.rb +9 -13
  30. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_duration.rb +6 -6
  31. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entity.rb +14 -12
  32. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entityAttribute.rb +20 -19
  33. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entityForeignKey.rb +8 -15
  34. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_entityIndex.rb +7 -10
  35. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_extent.rb +12 -10
  36. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_featureCollection.rb +8 -13
  37. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_format.rb +10 -7
  38. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_funding.rb +8 -6
  39. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geoJson.rb +8 -3
  40. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geodetic.rb +11 -8
  41. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geographicExtent.rb +12 -10
  42. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geographicResolution.rb +10 -13
  43. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geologicAge.rb +11 -10
  44. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geometryCollection.rb +8 -12
  45. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geometryFeature.rb +8 -12
  46. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geometryObject.rb +7 -12
  47. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_geometryProperties.rb +4 -2
  48. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_georectifiedRepresentation.rb +13 -20
  49. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_georeferenceableRepresentation.rb +12 -14
  50. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_gmlIdentifier.rb +8 -8
  51. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_graphic.rb +6 -6
  52. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_gridRepresentation.rb +12 -13
  53. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_identifier.rb +10 -7
  54. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_imageDescription.rb +9 -3
  55. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_keyword.rb +8 -6
  56. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_keywordObject.rb +6 -5
  57. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_legalConstraint.rb +6 -6
  58. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_lineage.rb +10 -10
  59. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_locale.rb +7 -9
  60. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_maintenance.rb +12 -10
  61. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_mdJson.rb +59 -17
  62. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_measure.rb +9 -16
  63. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_medium.rb +10 -5
  64. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_metadata.rb +6 -9
  65. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_metadataInfo.rb +16 -16
  66. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_metadataRepository.rb +8 -6
  67. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_obliqueLinePoint.rb +7 -12
  68. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_onlineResource.rb +6 -6
  69. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_orderProcess.rb +5 -3
  70. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_party.rb +25 -28
  71. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_phone.rb +7 -7
  72. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_processStep.rb +15 -12
  73. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_projectionParameters.rb +11 -10
  74. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_referenceSystemParameters.rb +12 -11
  75. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_releasability.rb +10 -8
  76. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_resourceInfo.rb +29 -40
  77. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_resourceType.rb +6 -6
  78. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_resourceUsage.rb +5 -5
  79. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_responsibleParty.rb +12 -11
  80. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_schema.rb +6 -9
  81. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_scope.rb +11 -8
  82. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_scopeDescription.rb +6 -7
  83. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_securityConstraint.rb +6 -6
  84. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_series.rb +5 -3
  85. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_source.rb +15 -13
  86. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_spatialReference.rb +10 -9
  87. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_spatialRepresentation.rb +14 -11
  88. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_spatialResolution.rb +14 -10
  89. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_taxonomicClassification.rb +8 -15
  90. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_taxonomicSystem.rb +5 -5
  91. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_taxonomy.rb +7 -11
  92. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_temporalExtent.rb +12 -9
  93. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_timeInstant.rb +12 -9
  94. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_timeInterval.rb +9 -13
  95. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_timePeriod.rb +22 -26
  96. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_transferOption.rb +13 -9
  97. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_valueRange.rb +7 -9
  98. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_vectorObject.rb +6 -6
  99. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_vectorRepresentation.rb +12 -10
  100. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_verticalDatum.rb +10 -8
  101. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_verticalExtent.rb +12 -13
  102. data/lib/adiwg/mdtranslator/readers/mdJson/modules/module_voucher.rb +10 -10
  103. data/lib/adiwg/mdtranslator/version.rb +8 -3
  104. data/lib/adiwg/mdtranslator/writers/fgdc/classes/class_spatialOrganization.rb +78 -84
  105. data/lib/adiwg/mdtranslator/writers/html/sections/html_responsibility.rb +3 -3
  106. data/lib/adiwg/mdtranslator/writers/iso19110/iso19110_writer.rb +23 -14
  107. data/lib/adiwg/mdtranslator/writers/iso19110/iso19110_writer_messages_eng.yml +2 -1
  108. data/lib/adiwg/mdtranslator/writers/iso19115_2/classes/class_dataIdentification.rb +10 -2
  109. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_date.rb +1 -0
  110. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_dictionary.rb +1 -1
  111. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_geographicExtent.rb +1 -1
  112. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_mdJson.rb +5 -5
  113. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_medium.rb +1 -1
  114. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_party.rb +1 -5
  115. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_repository.rb +4 -2
  116. data/lib/adiwg/mdtranslator/writers/mdJson/sections/mdJson_verticalDatumParameters.rb +1 -0
  117. data/lib/adiwg/mdtranslator/writers/sbJson/sections/sbJson_citation.rb +11 -11
  118. metadata +4 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c53862414e84e7d0b81437fcb696fce2a6ecbc3b
4
- data.tar.gz: 5a749d352492b147252d482d0dd71d16c4180e52
3
+ metadata.gz: 79cfaca2da52fe74b86aea2367ececbc1860562c
4
+ data.tar.gz: b37d8e8d9b5bfa47f7e2c556493ffe88794f1e6e
5
5
  SHA512:
6
- metadata.gz: e571c2edbd822f32dea0cd2387517bd6a1746ae253b9581e3fb059b6cac9ab2e5cecc6be96a1bb1fdefb31b109a51815f03f5c08baf931b139a41a190194055d
7
- data.tar.gz: a59a0aedd8178f11d1d8fe7cd006f5d60ea48d494844b041efcbfd2ce2a2a80d8d6d669b465e056bba27c62ac99f55fd1a398feff54c894972b05cf115ba5474
6
+ metadata.gz: 4651683398b739398aa3941766a579834d54f9f0618d8dd855fa60f8174282aa3c31d16ec374316223a5eda870cf92c973f2520f5dac7ebf6f4c3af9e966b9f5
7
+ data.tar.gz: 22222ad09d4b1a0df9b03c2a9884a746b2e5cfe3a60a3f90d67281ca59e818c392919677c9494bd35348e247845b4f62b68cb57e70878b8b2370a951515f36c9
data/Rakefile CHANGED
@@ -1,22 +1,34 @@
1
+
1
2
  require 'bundler/gem_tasks'
2
3
  require 'rake/testtask'
3
4
 
4
5
  Rake::TestTask.new do |t|
5
- t.libs << 'test'
6
- t.test_files = FileList[
7
- 'test/readers/mdJson/tc*.rb',
8
- 'test/readers/sbJson/tc*.rb',
9
- 'test/readers/fgdc/tc*.rb',
10
- 'test/writers/iso19115-2/tc*.rb',
11
- 'test/writers/iso19110/tc*.rb',
12
- 'test/writers/mdJson/tc*.rb',
13
- 'test/writers/sbJson/tc*.rb',
14
- 'test/writers/html/tc*.rb',
15
- 'test/writers/fgdc/tc*.rb',
16
- 'test/translator/tc*.rb'
17
- ]
18
- t.verbose = true
6
+ t.libs << 'test'
7
+ t.test_files = FileList[
8
+ 'test/readers/mdJson/tc*.rb',
9
+ 'test/readers/sbJson/tc*.rb',
10
+ 'test/readers/fgdc/tc*.rb',
11
+ 'test/writers/iso19115-2/tc*.rb',
12
+ 'test/writers/iso19110/tc*.rb',
13
+ 'test/writers/mdJson/tc*.rb',
14
+ 'test/writers/sbJson/tc*.rb',
15
+ 'test/writers/html/tc*.rb',
16
+ 'test/writers/fgdc/tc*.rb',
17
+ 'test/translator/tc*.rb'
18
+ ]
19
+ t.verbose = true
19
20
  end
20
21
 
21
22
  desc 'Run tests'
22
23
  task :default => :test
24
+
25
+ # 'test/readers/mdJson/tc*.rb'
26
+ # 'test/readers/sbJson/tc*.rb',
27
+ # 'test/readers/fgdc/tc*.rb',
28
+ # 'test/writers/iso19115-2/tc*.rb',
29
+ # 'test/writers/iso19110/tc*.rb',
30
+ # 'test/writers/mdJson/tc*.rb',
31
+ # 'test/writers/sbJson/tc*.rb',
32
+ # 'test/writers/html/tc*.rb',
33
+ # 'test/writers/fgdc/tc*.rb',
34
+ # 'test/translator/tc*.rb'
@@ -802,6 +802,7 @@ class InternalMetadata
802
802
  contactId: nil,
803
803
  contactIndex: nil,
804
804
  contactType: nil,
805
+ contactName: nil,
805
806
  organizationMembers: []
806
807
  }
807
808
  end
@@ -2,6 +2,7 @@
2
2
  # unpack fgdc metadata date
3
3
 
4
4
  # History:
5
+ # Stan Smith 2018-06-12 change default time zone to UTC
5
6
  # Stan Smith 2017-08-15 original script
6
7
 
7
8
  require 'date'
@@ -36,52 +37,67 @@ module ADIWG
36
37
  time = ''
37
38
  end
38
39
 
40
+ # determine if date/time is universal (default) or local
41
+ zoneFlag = Fgdc.get_metadata_time_convention
42
+ zoneFlag = 'universal time' if zoneFlag.nil? || zoneFlag == ''
43
+
39
44
  # convert date from fgdc to iso format
40
45
  year = date.byteslice(0,4)
41
46
  month = date.byteslice(4,2)
42
47
  day = date.byteslice(6,2)
43
- month = '01' if month.nil? || month == ''
44
- day = '01' if day.nil? || day == ''
45
- dtIn = year + '-' + month + '-' + day
46
48
 
47
- # add time element to date string
48
- if time.empty?
49
- dtIn = dtIn + 'T' + '00:00:00'
50
- else
51
- aScan = time.scan(/:/)
52
- if aScan.empty?
53
- hour = time.byteslice(0,2)
54
- minute = time.byteslice(2,2)
55
- second = time.byteslice(4,2)
56
- else
57
- aTime = time.split(':')
58
- hour = aTime[0]
59
- minute = aTime[1]
60
- second = aTime[2]
49
+ haveFullDate = false
50
+ dtIn = year
51
+ unless month.nil? || month == ''
52
+ dtIn += '-' + month
53
+ unless day.nil? || day == ''
54
+ dtIn += '-' + day
55
+ haveFullDate = true
61
56
  end
62
- minute = '00' if minute.nil? || minute == ''
63
- second = '00' if second.nil? || second == ''
64
- dtIn = dtIn + 'T' + hour + ':' + minute + ':' + second
65
57
  end
66
58
 
67
- # determine if date/time is 'universal time' or other
68
- timeFlag = Fgdc.get_metadata_time_convention
69
- timeFlag = 'local time' if timeFlag.nil? || timeFlag == ''
59
+ # if have full date and some time expression
60
+ # add time element to date string
61
+ if haveFullDate
62
+ unless time == ''
63
+ aScan = time.scan(/:/)
64
+ if aScan.empty?
65
+ hour = time.byteslice(0,2)
66
+ minute = time.byteslice(2,2)
67
+ second = time.byteslice(4,2)
68
+ else
69
+ aTime = time.split(':')
70
+ hour = aTime[0]
71
+ minute = aTime[1]
72
+ second = aTime[2]
73
+ end
74
+
75
+ # all times must include timezone
76
+ # timezone format requires hours, minutes, and seconds
77
+ hour = '00' if hour.nil? || hour == ''
78
+ minute = '00' if minute.nil? || minute == ''
79
+ second = '00' if second.nil? || second == ''
80
+ tmIn = 'T' + hour + ':' + minute + ':' + second
81
+
82
+ dtIn += tmIn
83
+
84
+ # add offset to date/time string
85
+ if zoneFlag == 'universal time'
86
+ dtIn = dtIn + '+00:00'
87
+ else
88
+ timeOffset = Time.now.gmt_offset
89
+ aOffset = timeOffset.divmod(3600)
90
+ hourOff = aOffset[0]
91
+ minOff = aOffset[1] * 60
92
+ if hourOff >= 0
93
+ zone = '+' + '%02d' % hourOff + ':' + '%02d' % minOff
94
+ else
95
+ zone = '%03d' % hourOff + ':' + '%02d' % minOff
96
+ end
97
+ dtIn = dtIn + zone
98
+ end
70
99
 
71
- # add offset to date/time string
72
- if timeFlag == 'universal time'
73
- dtIn = dtIn + '+00:00'
74
- else
75
- timeOffset = Time.now.gmt_offset
76
- aOffset = timeOffset.divmod(3600)
77
- hourOff = aOffset[0]
78
- minOff = aOffset[1] * 60
79
- if hourOff >= 0
80
- zone = '+' + '%02d' % hourOff + ':' + '%02d' % minOff
81
- else
82
- zone = '%03d' % hourOff + ':' + '%02d' % minOff
83
100
  end
84
- dtIn = dtIn + zone
85
101
  end
86
102
 
87
103
  # if dateTimeFromString fails, [0] = nil; [1] = 'ERROR'
@@ -92,12 +108,11 @@ module ADIWG
92
108
  return nil
93
109
  end
94
110
 
95
- # if not 'universal time' change the offset to utc
96
- dateTimeReturn = aDateTimeReturn[0]
97
- if timeFlag == 'universal time'
98
- utc = dateTimeReturn
111
+ # always output 'universal time'
112
+ if zoneFlag == 'universal time'
113
+ utc = aDateTimeReturn[0]
99
114
  else
100
- utc = dateTimeReturn.new_offset(Rational(0,24))
115
+ utc = aDateTimeReturn[0].new_offset(Rational(0,24))
101
116
  end
102
117
 
103
118
  # build internal dateTime object
@@ -1,6 +1,8 @@
1
1
  # adiwg mdTranslator / readers / fgdc
2
2
 
3
3
  # version 1 history
4
+ # 1.0.2 2018-06-12 change default time stamps from 'local' to UTC
5
+ # 1.0.2 2018-06-11 fix bug #179 remove 0 time value from date string when time not present
4
6
  # 1.0.1 2018-02-15 add messaging
5
7
  # 1.0.0 2017-07-11 version 1 FGDC CSDGM
6
8
 
@@ -8,7 +10,7 @@ module ADIWG
8
10
  module Mdtranslator
9
11
  module Readers
10
12
  module Fgdc
11
- VERSION = "1.0.1"
13
+ VERSION = "1.0.2"
12
14
  end
13
15
  end
14
16
  end
@@ -1,6 +1,7 @@
1
1
  # mdJson reader - process and direct mdJson ingest to internal data structure
2
2
 
3
3
  # History:
4
+ # Stan Smith 2018-06-12 refactor messaging support
4
5
  # Stan Smith 2016-11-12 refactor for mdTranslator 2.0
5
6
  # Stan Smith 2016-10-09 modify 'findContact' to also return contact index and type
6
7
  # Stan Smith 2016-10-07 refactored 'readerModule' to remove mdJson version checking
@@ -0,0 +1,377 @@
1
+ # Writer - messages for mdJson 2.x reader
2
+
3
+ # History:
4
+ # Stan Smith 2018-05-12 original script
5
+
6
+ messageList:
7
+ - {id: 1, message: "additional documentation object is empty"}
8
+ - {id: 2, message: "additional documentation resource type is missing"}
9
+ - {id: 3, message: "additional documentation citation is missing"}
10
+
11
+ - {id: 10, message: "address object is empty"}
12
+ - {id: 11, message: "address type is missing"}
13
+
14
+ - {id: 20, message: "budget allocation object is empty"}
15
+ - {id: 21, message: "budget allocation amount is missing"}
16
+ - {id: 22, message: "budget allocation currency type is missing"}
17
+
18
+ - {id: 30, message: "associated resource object is empty"}
19
+ - {id: 31, message: "associated resource resource type is missing"}
20
+ - {id: 32, message: "associated resource association type is missing"}
21
+ - {id: 33, message: "associated resource citation is missing"}
22
+
23
+ - {id: 40, message: "attribute object is empty"}
24
+ - {id: 41, message: "attribute sequence identifierType is missing"}
25
+ - {id: 42, message: "attribute units are missing"}
26
+ - {id: 43, message: "attribute bounds units are missing"}
27
+
28
+ - {id: 50, message: "attribute group object is empty"}
29
+ - {id: 51, message: "attribute group attribute content type is missing"}
30
+
31
+ - {id: 60, message: "bearing distance resolution object is empty"}
32
+ - {id: 61, message: "bearing distance resolution distance resolution is missing"}
33
+ - {id: 62, message: "bearing distance resolution distance units are missing"}
34
+ - {id: 63, message: "bearing distance resolution bearing resolution is missing"}
35
+ - {id: 64, message: "bearing distance resolution bearing units are missing"}
36
+ - {id: 65, message: "bearing distance resolution bearing direction is missing"}
37
+ - {id: 66, message: "bearing distance resolution bearing meridian is missing"}
38
+
39
+ - {id: 70, message: "bounding box object is empty"}
40
+ - {id: 71, message: "bounding box west boundary is missing"}
41
+ - {id: 72, message: "bounding box longitude must be between -180 and +180"}
42
+ - {id: 73, message: "bounding box east boundary is missing"}
43
+ - {id: 74, message: "bounding box south boundary is missing"}
44
+ - {id: 75, message: "bounding box latitude must be between -90 and +90"}
45
+ - {id: 76, message: "bounding box north boundary is missing"}
46
+ - {id: 77, message: "bounding box altitude units of measure are missing"}
47
+
48
+ - {id: 80, message: "citation object is empty"}
49
+ - {id: 81, message: "citation title is missing"}
50
+
51
+ - {id: 90, message: "constraint object is empty"}
52
+ - {id: 91, message: "constraint type must be use, legal, or security"}
53
+ - {id: 92, message: "constraint type is missing"}
54
+ - {id: 93, message: "legal constraint object is missing"}
55
+ - {id: 94, message: "security constraint object is missing"}
56
+
57
+ - {id: 100, message: "contact object is empty"}
58
+ - {id: 101, message: "contact id is missing"}
59
+ - {id: 102, message: "organization name is missing"}
60
+ - {id: 103, message: "individual name and/or position are missing"}
61
+
62
+ - {id: 110, message: "contact membership organization not found"}
63
+
64
+ - {id: 120, message: "coordinate resolution object is empty"}
65
+ - {id: 121, message: "coordinate resolution abscissa resolution is missing"}
66
+ - {id: 122, message: "coordinate resolution ordinate resolution is missing"}
67
+ - {id: 123, message: "coordinate resolution units are missing"}
68
+
69
+ - {id: 130, message: "coverage description object is empty"}
70
+ - {id: 131, message: "coverage description name is missing"}
71
+ - {id: 132, message: "coverage description description is missing"}
72
+
73
+ - {id: 140, message: "data dictionary object is empty"}
74
+ - {id: 141, message: "data dictionary citation is missing"}
75
+ - {id: 142, message: "data dictionary subject is missing"}
76
+ - {id: 143, message: "data dictionary responsible party is missing"}
77
+ - {id: 144, message: "data dictionary dictionaryFormat is deprecated, use dictionaryFunctionalLanguage"}
78
+
79
+ - {id: 150, message: "date object is empty"}
80
+ - {id: 151, message: "date string is invalid"}
81
+ - {id: 152, message: "date string is missing"}
82
+ - {id: 153, message: "date type is missing"}
83
+
84
+ - {id: 160, message: "dateTime string is empty"}
85
+ - {id: 161, message: "dateTime string is invalid"}
86
+
87
+ - {id: 170, message: "dimension object is empty"}
88
+ - {id: 171, message: "dimension type is missing"}
89
+ - {id: 172, message: "dimension size is missing"}
90
+
91
+ - {id: 180, message: "distribution object is empty"}
92
+ - {id: 181, message: "distribution must have a description or distributor"}
93
+
94
+ - {id: 190, message: "distributor object is empty"}
95
+ - {id: 191, message: "distributor contact is missing"}
96
+
97
+ - {id: 200, message: "data dictionary domain object is empty"}
98
+ - {id: 201, message: "data dictionary domain ID is missing"}
99
+ - {id: 202, message: "data dictionary domain code is missing"}
100
+ - {id: 203, message: "data dictionary domain description is missing"}
101
+
102
+ - {id: 210, message: "domain item object is empty"}
103
+ - {id: 211, message: "domain item name is missing"}
104
+ - {id: 212, message: "domain item value is missing"}
105
+ - {id: 213, message: "domain item definition is missing"}
106
+
107
+ - {id: 220, message: "duration object is empty"}
108
+ - {id: 221, message: "duration was not specified"}
109
+
110
+ - {id: 230, message: "data dictionary entity object is empty"}
111
+ - {id: 231, message: "data dictionary entity code name is missing"}
112
+ - {id: 232, message: "data dictionary entity definition is missing"}
113
+
114
+ - {id: 240, message: "data dictionary entity attribute object is empty"}
115
+ - {id: 241, message: "data dictionary entity attribute code name is missing"}
116
+ - {id: 242, message: "data dictionary entity attribute definition is missing"}
117
+ - {id: 243, message: "data dictionary entity attribute data type is missing"}
118
+ - {id: 244, message: "data dictionary entity attribute 'allowMany' is deprecated, use 'mustBeUnique'"}
119
+
120
+ - {id: 250, message: "data dictionary entity foreign key object is empty"}
121
+ - {id: 251, message: "data dictionary entity foreign key local attribute code name is missing"}
122
+ - {id: 252, message: "data dictionary entity foreign key referenced entity name is missing"}
123
+ - {id: 253, message: "data dictionary entity foreign key referenced attribute name is missing"}
124
+
125
+ - {id: 260, message: "data dictionary entity index object is empty"}
126
+ - {id: 261, message: "data dictionary entity index code name is missing"}
127
+ - {id: 262, message: "data dictionary entity index attribute list is missing"}
128
+
129
+ - {id: 270, message: "extent object is empty"}
130
+ - {id: 271, message: "extent must have description or at least one geographic, temporal, or vertical extent"}
131
+
132
+ - {id: 280, message: "GeoJSON feature collection object is empty"}
133
+ - {id: 281, message: "GeoJSON feature collection type must be FeatureCollection"}
134
+ - {id: 282, message: "GeoJSON feature collection type is missing"}
135
+ - {id: 283, message: "GeoJSON feature collection features are missing"}
136
+
137
+ - {id: 290, message: "distribution format object is empty"}
138
+ - {id: 291, message: "distribution format specification is missing"}
139
+
140
+ - {id: 300, message: "funding object is empty"}
141
+ - {id: 301, message: "funding must have either an allocation or timePeriod"}
142
+
143
+ - {id: 310, message: "geodetic object is empty"}
144
+ - {id: 311, message: "geodetic ellipsoid name is missing"}
145
+
146
+ - {id: 320, message: "geographic extent object is empty"}
147
+ - {id: 321, message: "geographic extent must have at least one description, identifier, bounding box, or geographic element"}
148
+
149
+ - {id: 330, message: "geographic resolution object is empty"}
150
+ - {id: 331, message: "geographic resolution latitude resolution is missing"}
151
+ - {id: 332, message: "geographic resolution longitude resolution is missing"}
152
+ - {id: 333, message: "geographic resolution units are missing"}
153
+
154
+ - {id: 340, message: "GeoJSON object is empty"}
155
+ - {id: 341, message: "GeoJSON object type not recognized"}
156
+
157
+ - {id: 350, message: "geologic age object is empty"}
158
+ - {id: 351, message: "geologic age time scale is missing"}
159
+ - {id: 352, message: "geologic age age-estimate is missing"}
160
+
161
+ - {id: 360, message: "GeoJSON geometry collection object is empty"}
162
+ - {id: 361, message: "GeoJSON geometry collection type must be GeometryCollection"}
163
+ - {id: 362, message: "GeoJSON geometry collection type is missing"}
164
+ - {id: 363, message: "GeoJSON geometry collection geometries are missing"}
165
+
166
+ - {id: 370, message: "GeoJSON feature object is empty"}
167
+ - {id: 371, message: "GeoJSON feature type must be Feature"}
168
+ - {id: 372, message: "GeoJSON feature type is missing"}
169
+ - {id: 373, message: "GeoJSON feature geometry is missing"}
170
+
171
+ - {id: 380, message: "GeoJSON geometry object is empty"}
172
+ - {id: 381, message: "GeoJSON geometry object type must be Point, LineString, Polygon, MultiPoint, MultiLineString, or MultiPolygon"}
173
+ - {id: 382, message: "GeoJSON geometry object type is missing"}
174
+ - {id: 383, message: "GeoJSON geometry object coordinates are missing"}
175
+
176
+ - {id: 390, message: "GeoJSON properties object is empty"}
177
+
178
+ - {id: 400, message: "georectified representation object is empty"}
179
+ - {id: 401, message: "georectified representation grid representation is missing"}
180
+ - {id: 402, message: "georectified representation must have either 2 or 4 corner points"}
181
+ - {id: 403, message: "georectified representation center point must be single 2D coordinate"}
182
+ - {id: 404, message: "georectified representation point-in-pixel is missing"}
183
+
184
+ - {id: 410, message: "georeferenceable representation object is empty"}
185
+ - {id: 411, message: "georeferenceable representation grid representation is missing"}
186
+ - {id: 412, message: "georeferenceable representation georeferenced parameters are missing"}
187
+
188
+ - {id: 420, message: "GML Identifier object is empty"}
189
+ - {id: 421, message: "GML Identifier identifier is missing"}
190
+ - {id: 422, message: "GML Identifier namespace is missing"}
191
+
192
+ - {id: 430, message: "graphic overview object is empty"}
193
+ - {id: 431, message: "graphic overview file name is missing"}
194
+
195
+ - {id: 440, message: "grid representation object is empty"}
196
+ - {id: 441, message: "grid representation number-of-dimensions is missing"}
197
+ - {id: 442, message: "grid representation dimensions are missing"}
198
+ - {id: 443, message: "grid representation cell geometry is missing"}
199
+
200
+ - {id: 450, message: "identifier object is empty"}
201
+ - {id: 451, message: "identifier object identifier is missing"}
202
+
203
+ - {id: 460, message: "image description object is empty"}
204
+
205
+ - {id: 470, message: "keyword object is empty"}
206
+ - {id: 471, message: "keyword list is missing"}
207
+
208
+ - {id: 480, message: "keyword object is empty"}
209
+ - {id: 481, message: "keyword object is missing keyword"}
210
+
211
+ - {id: 490, message: "legal constraint object is empty"}
212
+ - {id: 491, message: "legal constraint was not defined"}
213
+
214
+ - {id: 500, message: "resource lineage object is empty"}
215
+ - {id: 501, message: "resource lineage must have at least one statement, process step, or source"}
216
+
217
+ - {id: 510, message: "locale object is empty"}
218
+ - {id: 511, message: "locale language code is missing"}
219
+ - {id: 512, message: "locale character set code is missing"}
220
+
221
+ - {id: 520, message: "maintenance object is empty"}
222
+ - {id: 521, message: "maintenance frequency is missing"}
223
+
224
+ - {id: 530, message: "mdJSON object is empty"}
225
+ - {id: 531, message: "mdJSON schema object is missing"}
226
+ - {id: 532, message: "mdJSON contact object is missing"}
227
+ - {id: 533, message: "mdJSON metadata object is missing"}
228
+
229
+ - {id: 540, message: "measure object is empty"}
230
+ - {id: 541, message: "measure type must be distance, length, vertical, or angle"}
231
+ - {id: 542, message: "measure type is missing"}
232
+ - {id: 543, message: "measure value is missing"}
233
+ - {id: 544, message: "measure unit-of-measure is missing"}
234
+
235
+ - {id: 550, message: "offline option (medium) is empty"}
236
+
237
+ - {id: 560, message: "metadata object is empty"}
238
+ - {id: 561, message: "metadata-info object is missing"}
239
+ - {id: 562, message: "resource-info object is missing"}
240
+
241
+ - {id: 570, message: "metadata-info object is empty"}
242
+ - {id: 571, message: "metadata contact is missing"}
243
+
244
+ - {id: 580, message: "metadata repository object is empty"}
245
+ - {id: 581, message: "metadata repository name is missing"}
246
+
247
+ - {id: 590, message: "oblique line-point object is empty"}
248
+ - {id: 591, message: "oblique line-point latitude is missing"}
249
+ - {id: 592, message: "oblique line-point longitude is missing"}
250
+
251
+ - {id: 600, message: "online resource object is empty"}
252
+ - {id: 601, message: "online resource URI is missing"}
253
+
254
+ - {id: 610, message: "order process object is empty"}
255
+
256
+ - {id: 620, message: "party object is empty"}
257
+ - {id: 621, message: "party contact ID is missing"}
258
+ - {id: 622, message: "party contact not in contacts list"}
259
+ - {id: 623, message: "party organization member contact not in contacts list"}
260
+
261
+ - {id: 630, message: "phone object is empty"}
262
+ - {id: 631, message: "phone number is missing"}
263
+ - {id: 632, message: "phone service type is missing"}
264
+
265
+ - {id: 640, message: "process step object is empty"}
266
+ - {id: 641, message: "process step description is missing"}
267
+
268
+ - {id: 650, message: "projection parameters object is empty"}
269
+ - {id: 651, message: "projection parameters projection code is missing"}
270
+
271
+ - {id: 660, message: "reference system parameter set is empty"}
272
+ - {id: 661, message: "reference system parameter set must have at least one projection, geodetic, or vertical datum"}
273
+
274
+ - {id: 670, message: "releasability object is empty"}
275
+ - {id: 671, message: "releasability must have at least one addressee or statement"}
276
+
277
+ - {id: 680, message: "resource info object is empty"}
278
+ - {id: 681, message: "resource type is missing"}
279
+ - {id: 682, message: "resource citation is missing"}
280
+ - {id: 683, message: "resource abstract is missing"}
281
+ - {id: 684, message: "resource status is missing"}
282
+ - {id: 685, message: "topicCategory is deprecated, items were moved to keywords, keywordType 'isoTopicCategory'"}
283
+ - {id: 686, message: "resource point-of-contact is missing"}
284
+ - {id: 687, message: "taxonomy is now an array, the single taxonomy object was deprecated"}
285
+ - {id: 688, message: "resource default locale is missing"}
286
+
287
+ - {id: 690, message: "resource type object is empty"}
288
+ - {id: 691, message: "resource type is missing"}
289
+
290
+ - {id: 700, message: "resource usage object is empty"}
291
+ - {id: 701, message: "resource specific usage is missing"}
292
+
293
+ - {id: 710, message: "responsible party object is empty"}
294
+ - {id: 711, message: "responsible party role is missing"}
295
+ - {id: 712, message: "responsible party must have at least one party"}
296
+
297
+ - {id: 720, message: "schema object is empty"}
298
+ - {id: 721, message: "schema name is missing"}
299
+ - {id: 722, message: "schema version is missing"}
300
+
301
+ - {id: 730, message: "scope object is empty"}
302
+ - {id: 731, message: "scope code is missing"}
303
+
304
+ - {id: 740, message: "scope description object is empty"}
305
+ - {id: 741, message: "scope description needs at least one dataset, attribute, feature, or other"}
306
+
307
+ - {id: 750, message: "security constraint object is empty"}
308
+ - {id: 751, message: "security constraint classification is missing"}
309
+
310
+ - {id: 760, message: "series object is empty"}
311
+
312
+ - {id: 770, message: "source object is empty"}
313
+ - {id: 771, message: "source requires a description or scope"}
314
+
315
+ - {id: 780, message: "spatial reference system object is empty"}
316
+ - {id: 781, message: "spatial reference system must provide a reference system type, identifier, WKT, or parameter set"}
317
+
318
+ - {id: 790, message: "spatial representation object is empty"}
319
+ - {id: 791, message: "spatial representation did not have an object of supported type"}
320
+
321
+ - {id: 800, message: "spatial resolution object is empty"}
322
+ - {id: 801, message: "spatial resolution did not have an object of supported type"}
323
+
324
+ - {id: 810, message: "taxonomic classification object is empty"}
325
+ - {id: 811, message: "taxonomic classification taxonomicRank is deprecated, use taxonomicLevel"}
326
+ - {id: 812, message: "taxonomic classification level is missing"}
327
+ - {id: 813, message: "taxonomic classification latinName is deprecated, use taxonomicName"}
328
+ - {id: 814, message: "taxonomic classification name is missing"}
329
+
330
+ - {id: 820, message: "taxonomic system object is empty"}
331
+ - {id: 821, message: "taxonomic system citation is missing"}
332
+
333
+ - {id: 830, message: "taxonomy object is empty"}
334
+ - {id: 831, message: "taxonomic classification system object is missing"}
335
+ - {id: 832, message: "taxonomic identification procedure is missing"}
336
+ - {id: 833, message: "taxonomic classification is missing"}
337
+
338
+ - {id: 840, message: "temporal extent object is empty"}
339
+ - {id: 841, message: "temporal extent must have a time period or time instant"}
340
+
341
+ - {id: 850, message: "time instant object is empty"}
342
+ - {id: 851, message: "time instant must have dateTime or geologic age"}
343
+
344
+ - {id: 860, message: "time interval object is empty"}
345
+ - {id: 861, message: "time interval must be an integer"}
346
+ - {id: 862, message: "time interval is missing"}
347
+ - {id: 863, message: "time interval units are missing or invalid"}
348
+
349
+ - {id: 870, message: "time period object is empty"}
350
+ - {id: 871, message: "time period must have a start and/or end dateTime, or geologic age"}
351
+ - {id: 872, message: "time interval must be accompanied by a start and/or end dateTime"}
352
+ - {id: 873, message: "duration must be accompanied by a start and/or end dateTime"}
353
+
354
+ - {id: 880, message: "transfer option object is empty"}
355
+ - {id: 881, message: "transfer option did not provide an online or offline option"}
356
+
357
+ - {id: 890, message: "value range object is empty"}
358
+ - {id: 891, message: "value range minimum is missing"}
359
+ - {id: 892, message: "value range maximum is missing"}
360
+
361
+ - {id: 900, message: "vector object is empty"}
362
+ - {id: 901, message: "vector object type is missing"}
363
+
364
+ - {id: 910, message: "vector representation object is empty"}
365
+ - {id: 911, message: "vector representation must have a topology level or vector object"}
366
+
367
+ - {id: 920, message: "vertical datum object is empty"}
368
+ - {id: 921, message: "vertical datum must have an identifier or all other elements"}
369
+
370
+ - {id: 930, message: "vertical extent object is empty"}
371
+ - {id: 931, message: "vertical extent minimum value is missing"}
372
+ - {id: 932, message: "vertical extent maximum value is missing"}
373
+ - {id: 933, message: "vertical extent CRS identifier is missing"}
374
+
375
+ - {id: 940, message: "voucher object is empty"}
376
+ - {id: 941, message: "voucher specimen is missing"}
377
+ - {id: 942, message: "voucher repository is missing"}