geo_combine 0.5.1 → 0.6.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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +53 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +20 -0
  5. data/.rubocop_todo.yml +165 -0
  6. data/Gemfile +3 -1
  7. data/README.md +15 -1
  8. data/Rakefile +4 -2
  9. data/bin/geocombine +1 -0
  10. data/geo_combine.gemspec +5 -0
  11. data/lib/geo_combine/bounding_box.rb +7 -1
  12. data/lib/geo_combine/ckan_metadata.rb +10 -8
  13. data/lib/geo_combine/cli.rb +3 -1
  14. data/lib/geo_combine/esri_open_data.rb +2 -0
  15. data/lib/geo_combine/exceptions.rb +3 -0
  16. data/lib/geo_combine/fgdc.rb +2 -2
  17. data/lib/geo_combine/formats.rb +2 -0
  18. data/lib/geo_combine/formatting.rb +3 -1
  19. data/lib/geo_combine/geo_blacklight_harvester.rb +20 -13
  20. data/lib/geo_combine/geoblacklight.rb +20 -6
  21. data/lib/geo_combine/geometry_types.rb +2 -0
  22. data/lib/geo_combine/iso19139.rb +2 -1
  23. data/lib/geo_combine/ogp.rb +13 -11
  24. data/lib/geo_combine/railtie.rb +2 -0
  25. data/lib/geo_combine/subjects.rb +2 -0
  26. data/lib/geo_combine/version.rb +3 -1
  27. data/lib/geo_combine.rb +4 -3
  28. data/lib/tasks/geo_combine.rake +47 -26
  29. data/lib/xslt/fgdc2html.xsl +38 -9
  30. data/spec/features/fgdc2html_spec.rb +53 -1
  31. data/spec/features/iso2html_spec.rb +10 -1
  32. data/spec/fixtures/docs/princeton_fgdc.xml +374 -0
  33. data/spec/fixtures/docs/repos.json +3224 -0
  34. data/spec/fixtures/docs/simple_xml.xml +10 -0
  35. data/spec/fixtures/docs/simple_xslt.xsl +11 -0
  36. data/spec/fixtures/docs/stanford_iso.xml +652 -0
  37. data/spec/fixtures/docs/tufts_fgdc.xml +977 -0
  38. data/spec/fixtures/indexing/basic_geoblacklight.json +27 -0
  39. data/spec/fixtures/indexing/geoblacklight.json +33 -0
  40. data/spec/fixtures/indexing/layers.json +16119 -0
  41. data/spec/fixtures/indexing/test.txt +1 -0
  42. data/spec/fixtures/json_docs.rb +2 -0
  43. data/spec/fixtures/xml_docs.rb +9 -1659
  44. data/spec/helpers.rb +7 -7
  45. data/spec/lib/geo_combine/bounding_box_spec.rb +18 -0
  46. data/spec/lib/geo_combine/ckan_metadata_spec.rb +34 -11
  47. data/spec/lib/geo_combine/esri_open_data_spec.rb +23 -2
  48. data/spec/lib/geo_combine/fgdc_spec.rb +41 -10
  49. data/spec/lib/geo_combine/formatting_spec.rb +13 -5
  50. data/spec/lib/geo_combine/geo_blacklight_harvester_spec.rb +32 -28
  51. data/spec/lib/geo_combine/geoblacklight_spec.rb +41 -11
  52. data/spec/lib/geo_combine/iso19139_spec.rb +26 -14
  53. data/spec/lib/geo_combine/ogp_spec.rb +28 -8
  54. data/spec/lib/geo_combine_spec.rb +7 -4
  55. data/spec/lib/tasks/geo_combine_spec.rb +45 -0
  56. data/spec/spec_helper.rb +19 -84
  57. data/spec/support/fixtures.rb +9 -0
  58. metadata +102 -7
  59. data/.coveralls.yml +0 -1
  60. data/.travis.yml +0 -8
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/core_ext/object/blank'
2
4
  require 'active_support/core_ext/hash/except'
3
5
  require 'open-uri'
@@ -10,8 +12,8 @@ module GeoCombine
10
12
 
11
13
  attr_reader :metadata
12
14
 
13
- GEOBLACKLIGHT_VERSION = 'v1.1.0'
14
- SCHEMA_JSON_URL = "https://raw.githubusercontent.com/geoblacklight/geoblacklight/#{GEOBLACKLIGHT_VERSION}/schema/geoblacklight-schema.json".freeze
15
+ GEOBLACKLIGHT_VERSION = '1.0'
16
+ SCHEMA_JSON_URL = "https://raw.githubusercontent.com/geoblacklight/geoblacklight/main/schema/geoblacklight-schema-#{GEOBLACKLIGHT_VERSION}.json"
15
17
  DEPRECATED_KEYS_V1 = %w[
16
18
  uuid
17
19
  georss_polygon_s
@@ -29,7 +31,6 @@ module GeoCombine
29
31
  # @param [Hash] fields enhancements to metadata that are merged with @metadata
30
32
  def initialize(metadata, fields = {})
31
33
  @metadata = JSON.parse(metadata).merge(fields)
32
- @schema = nil
33
34
  end
34
35
 
35
36
  ##
@@ -58,8 +59,7 @@ module GeoCombine
58
59
  # Validates a GeoBlacklight-Schema json document
59
60
  # @return [Boolean]
60
61
  def valid?
61
- @schema ||= JSON.parse(open(SCHEMA_JSON_URL).read)
62
- JSON::Validator.validate!(@schema, to_json, fragment: '#/properties/layer') &&
62
+ JSON::Validator.validate!(schema, to_json, fragment: '#/definitions/layer') &&
63
63
  dct_references_validate! &&
64
64
  spatial_validate!
65
65
  end
@@ -69,9 +69,14 @@ module GeoCombine
69
69
  # @return [Boolean]
70
70
  def dct_references_validate!
71
71
  return true unless metadata.key?('dct_references_s') # TODO: shouldn't we require this field?
72
+
72
73
  begin
73
74
  ref = JSON.parse(metadata['dct_references_s'])
74
- raise GeoCombine::Exceptions::InvalidDCTReferences, 'dct_references must be parsed to a Hash' unless ref.is_a?(Hash)
75
+ unless ref.is_a?(Hash)
76
+ raise GeoCombine::Exceptions::InvalidDCTReferences,
77
+ 'dct_references must be parsed to a Hash'
78
+ end
79
+
75
80
  true
76
81
  rescue JSON::ParserError => e
77
82
  raise e, "Invalid JSON in dct_references_s: #{e.message}"
@@ -89,6 +94,7 @@ module GeoCombine
89
94
  # GeoBlacklight-Schema format
90
95
  def translate_formats(key, value)
91
96
  return unless key == 'dc_format_s' && formats.include?(value)
97
+
92
98
  metadata[key] = formats[value]
93
99
  end
94
100
 
@@ -96,6 +102,7 @@ module GeoCombine
96
102
  # Enhances the 'layer_geom_type_s' field by translating from known types
97
103
  def translate_geometry_type(key, value)
98
104
  return unless key == 'layer_geom_type_s' && geometry_types.include?(value)
105
+
99
106
  metadata[key] = geometry_types[value]
100
107
  end
101
108
 
@@ -104,6 +111,7 @@ module GeoCombine
104
111
  # categories
105
112
  def enhance_subjects(key, value)
106
113
  return unless key == 'dc_subject_sm'
114
+
107
115
  metadata[key] = value.map do |val|
108
116
  if subjects.include?(val)
109
117
  subjects[val]
@@ -118,11 +126,13 @@ module GeoCombine
118
126
  # and ISO8601 (for indexing into Solr)
119
127
  def format_proper_date(key, value)
120
128
  return unless key == 'layer_modified_dt'
129
+
121
130
  metadata[key] = Time.parse(value).utc.iso8601
122
131
  end
123
132
 
124
133
  def fields_should_be_array(key, value)
125
134
  return unless should_be_array.include?(key) && !value.is_a?(Array)
135
+
126
136
  metadata[key] = [value]
127
137
  end
128
138
 
@@ -155,5 +165,9 @@ module GeoCombine
155
165
  # ensure we have a proper v1 record
156
166
  valid?
157
167
  end
168
+
169
+ def schema
170
+ @schema ||= JSON.parse(URI.open(SCHEMA_JSON_URL).read)
171
+ end
158
172
  end
159
173
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoCombine
2
4
  module GeometryTypes
3
5
  def geometry_types
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoCombine
2
4
  class Iso19139 < Metadata
3
-
4
5
  ##
5
6
  # Returns a Nokogiri::XSLT object containing the ISO19139 to GeoBlacklight
6
7
  # XSL
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'active_support/core_ext/object/blank'
2
4
  require 'cgi'
3
5
 
@@ -77,15 +79,13 @@ module GeoCombine
77
79
  end
78
80
 
79
81
  def date
80
- begin
81
- DateTime.rfc3339(metadata['ContentDate'])
82
- rescue
83
- nil
84
- end
82
+ DateTime.rfc3339(metadata['ContentDate'])
83
+ rescue StandardError
84
+ nil
85
85
  end
86
86
 
87
87
  def year
88
- date.year unless date.nil?
88
+ date&.year
89
89
  end
90
90
 
91
91
  ##
@@ -104,9 +104,9 @@ module GeoCombine
104
104
  def ogp_formats
105
105
  case metadata['DataType']
106
106
  when 'Paper Map', 'Raster'
107
- return 'GeoTIFF'
107
+ 'GeoTIFF'
108
108
  when 'Polygon', 'Point', 'Line'
109
- return 'Shapefile'
109
+ 'Shapefile'
110
110
  else
111
111
  raise ArgumentError, metadata['DataType']
112
112
  end
@@ -128,6 +128,7 @@ module GeoCombine
128
128
  north >= -90 && north <= 90 &&
129
129
  south >= -90 && south <= 90 &&
130
130
  west <= east && south <= north
131
+
131
132
  "ENVELOPE(#{west}, #{east}, #{north}, #{south})"
132
133
  end
133
134
 
@@ -165,6 +166,7 @@ module GeoCombine
165
166
 
166
167
  def download_uri
167
168
  return 'http://schema.org/DownloadAction' if institution == 'Harvard'
169
+
168
170
  'http://schema.org/downloadUrl'
169
171
  end
170
172
 
@@ -205,7 +207,7 @@ module GeoCombine
205
207
  sluggify(filter_name(name))
206
208
  end
207
209
 
208
- SLUG_BLACKLIST = %w[
210
+ SLUG_STRIP_VALUES = %w[
209
211
  SDE_DATA.
210
212
  SDE.
211
213
  SDE2.
@@ -216,8 +218,8 @@ module GeoCombine
216
218
 
217
219
  def filter_name(name)
218
220
  # strip out schema and usernames
219
- SLUG_BLACKLIST.each do |blacklisted|
220
- name.sub!(blacklisted, '')
221
+ SLUG_STRIP_VALUES.each do |strip_val|
222
+ name.sub!(strip_val, '')
221
223
  end
222
224
  unless name.size > 1
223
225
  # use first word of title is empty name
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoCombine
2
4
  class Railtie < Rails::Railtie
3
5
  rake_tasks do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoCombine
2
4
  ##
3
5
  # Translation dictionary to ISO topics
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module GeoCombine
2
- VERSION = '0.5.1'
4
+ VERSION = '0.6.0'
3
5
  end
data/lib/geo_combine.rb CHANGED
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'nokogiri'
2
4
  require 'json'
3
5
  require 'json-schema'
4
6
  require 'sanitize'
5
7
 
6
8
  module GeoCombine
7
-
8
9
  ##
9
10
  # TODO: Create a parse method that can interpret the type of metadata being
10
11
  # passed in.
@@ -23,7 +24,7 @@ module GeoCombine
23
24
  # @param [String] metadata can be a File path
24
25
  # "./tmp/edu.stanford.purl/bb/338/jh/0716/iso19139.xml" or a String of XML
25
26
  # metadata
26
- def initialize metadata
27
+ def initialize(metadata)
27
28
  metadata = File.read metadata if File.readable? metadata
28
29
  metadata = Nokogiri::XML(metadata) if metadata.instance_of? String
29
30
  @metadata = metadata
@@ -35,7 +36,7 @@ module GeoCombine
35
36
  # GeoCombine::Geoblacklight on its instantiation
36
37
  # @return [GeoCombine::Geoblacklight] the data transformed into
37
38
  # geoblacklight schema, returned as a GeoCombine::Geoblacklight
38
- def to_geoblacklight fields = {}
39
+ def to_geoblacklight(fields = {})
39
40
  GeoCombine::Geoblacklight.new(xsl_geoblacklight.apply_to(@metadata), fields)
40
41
  end
41
42
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'json'
3
5
  require 'rsolr'
@@ -5,13 +7,6 @@ require 'find'
5
7
  require 'geo_combine/geo_blacklight_harvester'
6
8
 
7
9
  namespace :geocombine do
8
- commit_within = (ENV['SOLR_COMMIT_WITHIN'] || 5000).to_i
9
- ogm_path = ENV['OGM_PATH'] || 'tmp/opengeometadata'
10
- solr_url = ENV['SOLR_URL'] || 'http://127.0.0.1:8983/solr/blacklight-core'
11
- whitelist = %w[
12
- https://github.com/OpenGeoMetadata/big-ten.git
13
- ]
14
-
15
10
  desc 'Clone OpenGeoMetadata repositories'
16
11
  task :clone, [:repo] do |_t, args|
17
12
  if args.repo
@@ -19,44 +14,44 @@ namespace :geocombine do
19
14
  else
20
15
  ogm_api_uri = URI('https://api.github.com/orgs/opengeometadata/repos')
21
16
  ogm_repos = JSON.parse(Net::HTTP.get(ogm_api_uri)).map do |repo|
22
- repo['clone_url'] if repo['size'] > 0
17
+ repo['clone_url'] if (repo['size']).positive?
23
18
  end.compact
24
- ogm_repos.select! { |repo| whitelist.include?(repo) || repo =~ /(edu|org|uk)\..*\.git$/ }
19
+ ogm_repos.reject! { |repo| GeoCombineRake.denylist.include?(repo) }
25
20
  end
26
21
  ogm_repos.each do |repo|
27
- system "echo #{repo} && mkdir -p #{ogm_path} && cd #{ogm_path} && git clone --depth 1 #{repo}"
22
+ Kernel.system "echo #{repo} && mkdir -p #{GeoCombineRake.ogm_path} && cd #{GeoCombineRake.ogm_path} && git clone --depth 1 #{repo}"
28
23
  end
29
24
  end
30
25
 
31
26
  desc '"git pull" OpenGeoMetadata repositories'
32
27
  task :pull, [:repo] do |_t, args|
33
28
  paths = if args.repo
34
- [File.join(ogm_path, args.repo)]
29
+ [File.join(GeoCombineRake.ogm_path, args.repo)]
35
30
  else
36
- Dir.glob("#{ogm_path}/*")
31
+ Dir.glob("#{GeoCombineRake.ogm_path}/*")
37
32
  end
38
33
  paths.each do |path|
39
34
  next unless File.directory?(path)
40
- system "echo #{path} && cd #{path} && git pull origin"
35
+
36
+ Kernel.system "echo #{path} && cd #{path} && git pull origin"
41
37
  end
42
38
  end
43
39
 
44
- desc 'Index all of the GeoBlacklight JSON documents'
40
+ desc 'Index all JSON documents except Layers.json'
45
41
  task :index do
46
- puts "Indexing #{ogm_path} into #{solr_url}"
47
- solr = RSolr.connect url: solr_url, adapter: :net_http_persistent
48
- Find.find(ogm_path) do |path|
49
- next unless File.basename(path) == 'geoblacklight.json'
42
+ puts "Indexing #{GeoCombineRake.ogm_path} into #{GeoCombineRake.solr_url}"
43
+ solr = RSolr.connect url: GeoCombineRake.solr_url, adapter: :net_http_persistent
44
+ Find.find(GeoCombineRake.ogm_path) do |path|
45
+ next unless File.basename(path).include?('.json') && File.basename(path) != 'layers.json'
46
+
50
47
  doc = JSON.parse(File.read(path))
51
48
  [doc].flatten.each do |record|
52
- begin
53
- puts "Indexing #{record['layer_slug_s']}: #{path}" if $DEBUG
54
- solr.update params: { commitWithin: commit_within, overwrite: true },
55
- data: [record].to_json,
56
- headers: { 'Content-Type' => 'application/json' }
57
- rescue RSolr::Error::Http => error
58
- puts error
59
- end
49
+ puts "Indexing #{record['layer_slug_s']}: #{path}" if $DEBUG
50
+ solr.update params: { commitWithin: GeoCombineRake.commit_within, overwrite: true },
51
+ data: [record].to_json,
52
+ headers: { 'Content-Type' => 'application/json' }
53
+ rescue RSolr::Error::Http => e
54
+ puts e
60
55
  end
61
56
  end
62
57
  solr.commit
@@ -71,3 +66,29 @@ namespace :geocombine do
71
66
  end
72
67
  end
73
68
  end
69
+
70
+ # Class to hold helper methods for use in GeoCombine rake tasks
71
+ class GeoCombineRake
72
+ def self.commit_within
73
+ (ENV['SOLR_COMMIT_WITHIN'] || 5000).to_i
74
+ end
75
+
76
+ def self.denylist
77
+ [
78
+ 'https://github.com/OpenGeoMetadata/GeoCombine.git',
79
+ 'https://github.com/OpenGeoMetadata/aardvark.git',
80
+ 'https://github.com/OpenGeoMetadata/metadata-issues.git',
81
+ 'https://github.com/OpenGeoMetadata/ogm_utils-python.git',
82
+ 'https://github.com/OpenGeoMetadata/opengeometadata.github.io.git',
83
+ 'https://github.com/OpenGeoMetadata/opengeometadata-rails.git'
84
+ ]
85
+ end
86
+
87
+ def self.ogm_path
88
+ ENV['OGM_PATH'] || 'tmp/opengeometadata'
89
+ end
90
+
91
+ def self.solr_url
92
+ ENV['SOLR_URL'] || 'http://127.0.0.1:8983/solr/blacklight-core'
93
+ end
94
+ end
@@ -93,7 +93,7 @@
93
93
  <xsl:value-of select="." />
94
94
  </dd>
95
95
  </xsl:for-each>
96
- <xsl:for-each select="descrip/supplinf">
96
+ <xsl:for-each select="descript/supplinf">
97
97
  <dt>Supplemental Information</dt>
98
98
  <dd>
99
99
  <xsl:value-of select="." />
@@ -204,6 +204,22 @@
204
204
  </dd>
205
205
  </xsl:if>
206
206
  </xsl:for-each>
207
+ <dt>Temporal Keyword</dt>
208
+ <xsl:for-each select="keywords/temporal/tempkey">
209
+ <dd>
210
+ <xsl:value-of select="." />
211
+ </dd>
212
+ <xsl:if test="position()=last()">
213
+ <dd>
214
+ <dl>
215
+ <dt>Temporal Keyword Thesaurus</dt>
216
+ <dd>
217
+ <xsl:value-of select="ancestor-or-self::*/tempkt" />
218
+ </dd>
219
+ </dl>
220
+ </dd>
221
+ </xsl:if>
222
+ </xsl:for-each>
207
223
  <xsl:for-each select="accconst">
208
224
  <dt>Access Restrictions</dt>
209
225
  <dd>
@@ -234,6 +250,9 @@
234
250
  <dl>
235
251
  <xsl:for-each select="cntinfo/cntperp/cntper">
236
252
  <dt>Contact Person</dt>
253
+ <dd>
254
+ <xsl:value-of select="." />
255
+ </dd>
237
256
  </xsl:for-each>
238
257
  <xsl:for-each select="cntinfo/cntorgp/cntorg">
239
258
  <dt>Contact Organization</dt>
@@ -277,31 +296,31 @@
277
296
  <xsl:value-of select="." />
278
297
  </dd>
279
298
  </xsl:for-each>
280
- <xsl:for-each select="cntvoice">
299
+ <xsl:for-each select="cntinfo/cntvoice">
281
300
  <dt>Contact Telephone</dt>
282
301
  <dd>
283
302
  <xsl:value-of select="." />
284
303
  </dd>
285
304
  </xsl:for-each>
286
- <xsl:for-each select="cntfax">
305
+ <xsl:for-each select="cntinfo/cntfax">
287
306
  <dt>Contact Facsimile Telephone</dt>
288
307
  <dd>
289
308
  <xsl:value-of select="." />
290
309
  </dd>
291
310
  </xsl:for-each>
292
- <xsl:for-each select="cntemail">
311
+ <xsl:for-each select="cntinfo/cntemail">
293
312
  <dt>Contact Electronic Mail Address</dt>
294
313
  <dd>
295
314
  <xsl:value-of select="." />
296
315
  </dd>
297
316
  </xsl:for-each>
298
- <xsl:for-each select="hours">
317
+ <xsl:for-each select="cntinfo/hours">
299
318
  <dt>Hours of Service</dt>
300
319
  <dd>
301
320
  <xsl:value-of select="." />
302
321
  </dd>
303
322
  </xsl:for-each>
304
- <xsl:for-each select="cntinst">
323
+ <xsl:for-each select="cntfo/cntinst">
305
324
  <dt>Contact Instructions</dt>
306
325
  <dd>
307
326
  <xsl:value-of select="." />
@@ -475,6 +494,12 @@
475
494
  </dl>
476
495
  </dd>
477
496
  </xsl:for-each>
497
+ <xsl:for-each select="srccontr">
498
+ <dt>Contribution</dt>
499
+ <dd>
500
+ <xsl:value-of select="." />
501
+ </dd>
502
+ </xsl:for-each>
478
503
  </dl>
479
504
  <xsl:for-each select="procstep">
480
505
  <dt>Process Step</dt>
@@ -1186,6 +1211,12 @@
1186
1211
  <xsl:value-of select="attrdef" />
1187
1212
  <xsl:apply-templates select="attrdomv" />
1188
1213
  <dl>
1214
+ <xsl:for-each select="attrdefs">
1215
+ <dt>Definition Source</dt>
1216
+ <dd>
1217
+ <xsl:value-of select="." />
1218
+ </dd>
1219
+ </xsl:for-each>
1189
1220
  <xsl:for-each select="begdatea">
1190
1221
  <dt>Beginning Date of Attribute Values</dt>
1191
1222
  <dd>
@@ -1234,9 +1265,7 @@
1234
1265
  </xsl:template>
1235
1266
 
1236
1267
  <xsl:template match="attrdomv[edom]">
1237
- <br />
1238
- <button onclick="this.nextElementSibling.style.display = (this.nextElementSibling.style.display==='none') ? '' : 'none';">show/hide coded values</button>
1239
- <dl style="display:none">
1268
+ <dl>
1240
1269
  <xsl:for-each select="edom">
1241
1270
  <dt><xsl:value-of select="edomv" /></dt>
1242
1271
  <dd><xsl:value-of select="edomvd" /></dd>
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- #TODO Provide additional expectations on html structure
5
+ # TODO: Provide additional expectations on html structure
4
6
  describe 'FGDC to html' do
5
7
  include XmlDocs
6
8
  let(:page) { GeoCombine::Fgdc.new(tufts_fgdc).to_html }
9
+
7
10
  describe 'Identification Information' do
8
11
  it 'has sections' do
9
12
  expect(page).to have_tag '#fgdc-identification-info' do
@@ -14,29 +17,78 @@ describe 'FGDC to html' do
14
17
  end
15
18
  end
16
19
  end
20
+
17
21
  describe 'Data Quality Information' do
18
22
  it 'has sections' do
19
23
  expect(page).to have_tag '#fgdc-data-quality-info'
20
24
  end
21
25
  end
26
+
22
27
  describe 'Spatial Data Organization Information' do
23
28
  it 'has sections' do
24
29
  expect(page).to have_tag '#fgdc-spatialdataorganization-info'
25
30
  end
26
31
  end
32
+
27
33
  describe 'Entity and Attribute Information' do
28
34
  it 'has sections' do
29
35
  expect(page).to have_tag '#fgdc-spatialreference-info'
30
36
  end
31
37
  end
38
+
32
39
  describe 'Distribution Information' do
33
40
  it 'has sections' do
34
41
  expect(page).to have_tag '#fgdc-distribution-info'
35
42
  end
36
43
  end
44
+
37
45
  describe 'Metadata Reference Information' do
38
46
  it 'has sections' do
39
47
  expect(page).to have_tag '#fgdc-metadata-reference-info'
40
48
  end
41
49
  end
50
+
51
+ describe 'Point of Contact' do
52
+ it 'has contact info' do
53
+ expect(page).to have_tag '#fgdc-identification-info'
54
+ end
55
+ end
56
+
57
+ context 'with fgdc metadata from another institution' do
58
+ let(:page) { GeoCombine::Fgdc.new(princeton_fgdc).to_html }
59
+
60
+ it 'has temporal keywords' do
61
+ expect(page).to have_tag 'dt', text: 'Temporal Keyword'
62
+ expect(page).to have_tag 'dd', text: '2030'
63
+ end
64
+
65
+ it 'has supplemental information' do
66
+ expect(page).to have_tag 'dt', text: 'Supplemental Information'
67
+ expect(page).to have_tag 'dd', text: /The E\+ scenario/
68
+ end
69
+
70
+ it 'has a contact person' do
71
+ expect(page).to have_tag 'dt', text: 'Contact Person'
72
+ expect(page).to have_tag 'dd', text: 'Andrew Pascale'
73
+ end
74
+
75
+ it 'has a contact telephone' do
76
+ expect(page).to have_tag 'dt', text: 'Contact Telephone'
77
+ expect(page).to have_tag 'dd', text: '609-258-1097'
78
+ end
79
+
80
+ it 'has an attribute description source and a list of values' do
81
+ expect(page).to have_tag 'dt', text: 'Definition Source'
82
+ expect(page).to have_tag 'dd', text: 'Andlinger Center/HMEI'
83
+
84
+ # Attribute elements are show by default
85
+ expect(page).not_to have_tag 'button'
86
+ expect(page).to have_tag 'dd', text: 'Desert Southwest'
87
+ end
88
+
89
+ it 'has a attribute source contribution' do
90
+ expect(page).to have_tag 'dt', text: 'Contribution'
91
+ expect(page).to have_tag 'dd', text: 'Net-Zero America report, 2020'
92
+ end
93
+ end
42
94
  end
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
- #TODO Provide additional expectations on html structure
5
+ # TODO: Provide additional expectations on html structure
4
6
  describe 'ISO 19139 to html' do
5
7
  include XmlDocs
6
8
  let(:page) { GeoCombine::Iso19139.new(stanford_iso).to_html }
9
+
7
10
  describe 'Identification Information' do
8
11
  it 'has sections' do
9
12
  expect(page).to have_tag '#iso-identification-info' do
@@ -17,36 +20,42 @@ describe 'ISO 19139 to html' do
17
20
  end
18
21
  end
19
22
  end
23
+
20
24
  describe 'Spatial Reference Information' do
21
25
  it 'has sections' do
22
26
  expect(page).to have_tag '#iso-spatial-reference-info'
23
27
  expect(page).to have_tag 'h2', text: 'Identification Information'
24
28
  end
25
29
  end
30
+
26
31
  describe 'Data Quality Information' do
27
32
  it 'has sections' do
28
33
  expect(page).to have_tag '#iso-data-quality-info'
29
34
  expect(page).to have_tag 'h2', text: 'Data Quality Information'
30
35
  end
31
36
  end
37
+
32
38
  describe 'Distribution Information' do
33
39
  it 'has sections' do
34
40
  expect(page).to have_tag '#iso-distribution-info'
35
41
  expect(page).to have_tag 'h2', text: 'Distribution Information'
36
42
  end
37
43
  end
44
+
38
45
  describe 'Content Information' do
39
46
  it 'has sections' do
40
47
  expect(page).to have_tag '#iso-content-info'
41
48
  expect(page).to have_tag 'h2', text: 'Content Information'
42
49
  end
43
50
  end
51
+
44
52
  describe 'Spatial Representation Information' do
45
53
  it 'has sections' do
46
54
  expect(page).to have_tag '#iso-spatial-representation-info'
47
55
  expect(page).to have_tag 'h2', text: 'Spatial Representation Information'
48
56
  end
49
57
  end
58
+
50
59
  describe 'Metadata Reference Information' do
51
60
  it 'has sections' do
52
61
  expect(page).to have_tag '#iso-metadata-reference-info'