rcap 2.5.0 → 2.7.4

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 (89) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +18 -0
  4. data/README.md +1 -0
  5. data/lib/rcap.rb +3 -1
  6. data/lib/rcap/alert.rb +4 -2
  7. data/lib/rcap/base/alert.rb +70 -73
  8. data/lib/rcap/base/area.rb +19 -13
  9. data/lib/rcap/base/circle.rb +15 -4
  10. data/lib/rcap/base/event_code.rb +2 -0
  11. data/lib/rcap/base/geocode.rb +2 -0
  12. data/lib/rcap/base/info.rb +81 -75
  13. data/lib/rcap/base/parameter.rb +8 -6
  14. data/lib/rcap/base/point.rb +4 -2
  15. data/lib/rcap/base/polygon.rb +16 -8
  16. data/lib/rcap/base/resource.rb +13 -13
  17. data/lib/rcap/cap_1_0/alert.rb +36 -39
  18. data/lib/rcap/cap_1_0/area.rb +2 -0
  19. data/lib/rcap/cap_1_0/circle.rb +2 -0
  20. data/lib/rcap/cap_1_0/event_code.rb +3 -1
  21. data/lib/rcap/cap_1_0/geocode.rb +3 -1
  22. data/lib/rcap/cap_1_0/info.rb +3 -1
  23. data/lib/rcap/cap_1_0/parameter.rb +3 -2
  24. data/lib/rcap/cap_1_0/point.rb +2 -0
  25. data/lib/rcap/cap_1_0/polygon.rb +3 -1
  26. data/lib/rcap/cap_1_0/resource.rb +2 -0
  27. data/lib/rcap/cap_1_1/alert.rb +4 -2
  28. data/lib/rcap/cap_1_1/area.rb +2 -0
  29. data/lib/rcap/cap_1_1/circle.rb +2 -0
  30. data/lib/rcap/cap_1_1/event_code.rb +3 -1
  31. data/lib/rcap/cap_1_1/geocode.rb +3 -1
  32. data/lib/rcap/cap_1_1/info.rb +48 -46
  33. data/lib/rcap/cap_1_1/parameter.rb +2 -1
  34. data/lib/rcap/cap_1_1/point.rb +2 -0
  35. data/lib/rcap/cap_1_1/polygon.rb +3 -1
  36. data/lib/rcap/cap_1_1/resource.rb +12 -11
  37. data/lib/rcap/cap_1_2/alert.rb +4 -2
  38. data/lib/rcap/cap_1_2/area.rb +2 -0
  39. data/lib/rcap/cap_1_2/circle.rb +2 -0
  40. data/lib/rcap/cap_1_2/event_code.rb +3 -1
  41. data/lib/rcap/cap_1_2/geocode.rb +3 -1
  42. data/lib/rcap/cap_1_2/info.rb +55 -51
  43. data/lib/rcap/cap_1_2/parameter.rb +2 -1
  44. data/lib/rcap/cap_1_2/point.rb +2 -0
  45. data/lib/rcap/cap_1_2/polygon.rb +4 -2
  46. data/lib/rcap/cap_1_2/resource.rb +14 -12
  47. data/lib/rcap/config.rb +2 -0
  48. data/lib/rcap/custom_validators.rb +30 -27
  49. data/lib/rcap/extensions/array.rb +2 -0
  50. data/lib/rcap/extensions/date.rb +3 -1
  51. data/lib/rcap/extensions/date_time.rb +4 -1
  52. data/lib/rcap/extensions/float.rb +2 -0
  53. data/lib/rcap/extensions/integer.rb +7 -0
  54. data/lib/rcap/extensions/nil_class.rb +2 -0
  55. data/lib/rcap/extensions/string.rb +3 -1
  56. data/lib/rcap/extensions/time.rb +3 -0
  57. data/lib/rcap/formatters/yaml.rb +5 -0
  58. data/lib/rcap/info.rb +2 -0
  59. data/lib/rcap/utilities.rb +8 -10
  60. data/lib/rcap/validation.rb +19 -14
  61. data/lib/rcap/version.rb +3 -1
  62. data/rcap.gemspec +5 -5
  63. data/spec/alert_spec.rb +8 -9
  64. data/spec/cap_1_0/alert_spec.rb +4 -5
  65. data/spec/cap_1_0/area_spec.rb +7 -10
  66. data/spec/cap_1_0/circle_spec.rb +9 -0
  67. data/spec/cap_1_0/event_code_spec.rb +1 -1
  68. data/spec/cap_1_0/geocode_spec.rb +1 -1
  69. data/spec/cap_1_0/info_spec.rb +38 -38
  70. data/spec/cap_1_0/polygon_spec.rb +7 -5
  71. data/spec/cap_1_0/resource_spec.rb +6 -7
  72. data/spec/cap_1_1/alert_spec.rb +6 -7
  73. data/spec/cap_1_1/area_spec.rb +6 -8
  74. data/spec/cap_1_1/circle_spec.rb +9 -0
  75. data/spec/cap_1_1/info_spec.rb +26 -26
  76. data/spec/cap_1_1/parameter_spec.rb +1 -2
  77. data/spec/cap_1_1/polygon_spec.rb +12 -10
  78. data/spec/cap_1_1/resource_spec.rb +13 -13
  79. data/spec/cap_1_2/alert_spec.rb +7 -8
  80. data/spec/cap_1_2/area_spec.rb +6 -6
  81. data/spec/cap_1_2/circle_spec.rb +9 -0
  82. data/spec/cap_1_2/info_spec.rb +25 -26
  83. data/spec/cap_1_2/polygon_spec.rb +8 -0
  84. data/spec/cap_1_2/resource_spec.rb +13 -13
  85. data/spec/extensions_spec.rb +2 -2
  86. data/spec/spec_helper.rb +2 -2
  87. data/spec/validations_spec.rb +0 -1
  88. metadata +15 -15
  89. data/lib/rcap/extensions/fixnum.rb +0 -5
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class EventCode < Parameter
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Geocode < Parameter
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Info
@@ -17,9 +19,9 @@ module RCAP
17
19
  CATEGORY_OTHER = 'Other'
18
20
  # Valid values for categories
19
21
  VALID_CATEGORIES = [CATEGORY_GEO, CATEGORY_MET, CATEGORY_SAFETY,
20
- CATEGORY_SECURITY, CATEGORY_RESCUE, CATEGORY_FIRE, CATEGORY_HEALTH,
22
+ CATEGORY_SECURITY, CATEGORY_RESCUE, CATEGORY_FIRE, CATEGORY_HEALTH,
21
23
  CATEGORY_ENV, CATEGORY_TRANSPORT, CATEGORY_INFRA, CATEGORY_CBRNE,
22
- CATEGORY_OTHER]
24
+ CATEGORY_OTHER].freeze
23
25
 
24
26
  URGENCY_IMMEDIATE = 'Immediate'
25
27
  URGENCY_EXPECTED = 'Expected'
@@ -28,7 +30,7 @@ module RCAP
28
30
  URGENCY_UNKNOWN = 'Unknown'
29
31
  # Valid values for urgency
30
32
  VALID_URGENCIES = [URGENCY_IMMEDIATE, URGENCY_EXPECTED, URGENCY_FUTURE,
31
- URGENCY_PAST, URGENCY_UNKNOWN]
33
+ URGENCY_PAST, URGENCY_UNKNOWN].freeze
32
34
 
33
35
  SEVERITY_EXTREME = 'Extreme'
34
36
  SEVERITY_SEVERE = 'Severe'
@@ -37,7 +39,7 @@ module RCAP
37
39
  SEVERITY_UNKNOWN = 'Unknown'
38
40
  # Valid values for severity
39
41
  VALID_SEVERITIES = [SEVERITY_EXTREME, SEVERITY_SEVERE, SEVERITY_MODERATE,
40
- SEVERITY_MINOR, SEVERITY_UNKNOWN]
42
+ SEVERITY_MINOR, SEVERITY_UNKNOWN].freeze
41
43
 
42
44
  CERTAINTY_VERY_LIKELY = 'Very Likely'
43
45
  CERTAINTY_LIKELY = 'Likely'
@@ -46,7 +48,7 @@ module RCAP
46
48
  CERTAINTY_UNKNOWN = 'Unknown'
47
49
  # Valid valies for certainty
48
50
  VALID_CERTAINTIES = [CERTAINTY_VERY_LIKELY, CERTAINTY_LIKELY,
49
- CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN]
51
+ CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN].freeze
50
52
 
51
53
  XML_ELEMENT_NAME = 'info'
52
54
  LANGUAGE_ELEMENT_NAME = 'language'
@@ -67,24 +69,24 @@ module RCAP
67
69
  WEB_ELEMENT_NAME = 'web'
68
70
  CONTACT_ELEMENT_NAME = 'contact'
69
71
 
70
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
71
- LANGUAGE_XPATH = "cap:#{ LANGUAGE_ELEMENT_NAME }"
72
- EVENT_XPATH = "cap:#{ EVENT_ELEMENT_NAME }"
73
- URGENCY_XPATH = "cap:#{ URGENCY_ELEMENT_NAME }"
74
- CATEGORY_XPATH = "cap:#{ CATEGORY_ELEMENT_NAME }"
75
- SEVERITY_XPATH = "cap:#{ SEVERITY_ELEMENT_NAME }"
76
- CERTAINTY_XPATH = "cap:#{ CERTAINTY_ELEMENT_NAME }"
77
- AUDIENCE_XPATH = "cap:#{ AUDIENCE_ELEMENT_NAME }"
78
- EVENT_CODE_XPATH = "cap:#{ EVENT_CODE_ELEMENT_NAME }"
79
- EFFECTIVE_XPATH = "cap:#{ EFFECTIVE_ELEMENT_NAME }"
80
- ONSET_XPATH = "cap:#{ ONSET_ELEMENT_NAME }"
81
- EXPIRES_XPATH = "cap:#{ EXPIRES_ELEMENT_NAME }"
82
- SENDER_NAME_XPATH = "cap:#{ SENDER_NAME_ELEMENT_NAME }"
83
- HEADLINE_XPATH = "cap:#{ HEADLINE_ELEMENT_NAME }"
84
- DESCRIPTION_XPATH = "cap:#{ DESCRIPTION_ELEMENT_NAME }"
85
- INSTRUCTION_XPATH = "cap:#{ INSTRUCTION_ELEMENT_NAME }"
86
- WEB_XPATH = "cap:#{ WEB_ELEMENT_NAME }"
87
- CONTACT_XPATH = "cap:#{ CONTACT_ELEMENT_NAME }"
72
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
73
+ LANGUAGE_XPATH = "cap:#{LANGUAGE_ELEMENT_NAME}"
74
+ EVENT_XPATH = "cap:#{EVENT_ELEMENT_NAME}"
75
+ URGENCY_XPATH = "cap:#{URGENCY_ELEMENT_NAME}"
76
+ CATEGORY_XPATH = "cap:#{CATEGORY_ELEMENT_NAME}"
77
+ SEVERITY_XPATH = "cap:#{SEVERITY_ELEMENT_NAME}"
78
+ CERTAINTY_XPATH = "cap:#{CERTAINTY_ELEMENT_NAME}"
79
+ AUDIENCE_XPATH = "cap:#{AUDIENCE_ELEMENT_NAME}"
80
+ EVENT_CODE_XPATH = "cap:#{EVENT_CODE_ELEMENT_NAME}"
81
+ EFFECTIVE_XPATH = "cap:#{EFFECTIVE_ELEMENT_NAME}"
82
+ ONSET_XPATH = "cap:#{ONSET_ELEMENT_NAME}"
83
+ EXPIRES_XPATH = "cap:#{EXPIRES_ELEMENT_NAME}"
84
+ SENDER_NAME_XPATH = "cap:#{SENDER_NAME_ELEMENT_NAME}"
85
+ HEADLINE_XPATH = "cap:#{HEADLINE_ELEMENT_NAME}"
86
+ DESCRIPTION_XPATH = "cap:#{DESCRIPTION_ELEMENT_NAME}"
87
+ INSTRUCTION_XPATH = "cap:#{INSTRUCTION_ELEMENT_NAME}"
88
+ WEB_XPATH = "cap:#{WEB_ELEMENT_NAME}"
89
+ CONTACT_XPATH = "cap:#{CONTACT_ELEMENT_NAME}"
88
90
 
89
91
  DEFAULT_LANGUAGE = 'en-US'
90
92
 
@@ -92,8 +94,8 @@ module RCAP
92
94
  validates_presence_of(:urgency)
93
95
  validates_presence_of(:severity)
94
96
  validates_presence_of(:certainty)
95
- validates_inclusion_of(:severity, allow_nil: true, in: VALID_SEVERITIES, message: "can only be assigned the following values: #{ VALID_SEVERITIES.join(', ') }")
96
- validates_inclusion_of(:urgency, allow_nil: true, in: VALID_URGENCIES, message: "can only be assigned the following values: #{ VALID_URGENCIES.join(', ') }")
97
+ validates_inclusion_of(:severity, allow_nil: true, in: VALID_SEVERITIES, message: "can only be assigned the following values: #{VALID_SEVERITIES.join(', ')}")
98
+ validates_inclusion_of(:urgency, allow_nil: true, in: VALID_URGENCIES, message: "can only be assigned the following values: #{VALID_URGENCIES.join(', ')}")
97
99
  validates_inclusion_of_members_of(:categories, in: VALID_CATEGORIES, allow_blank: true)
98
100
  validates_collection_of(:resources, :areas, :event_codes, :parameters)
99
101
 
@@ -195,27 +197,27 @@ module RCAP
195
197
  # @return [REXML::Element]
196
198
  def to_xml_element
197
199
  xml_element = REXML::Element.new(XML_ELEMENT_NAME)
198
- xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language) if @language
200
+ xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language.to_s) if @language
199
201
  @categories.each do |category|
200
- xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category)
202
+ xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category.to_s)
201
203
  end
202
- xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event)
203
- xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency)
204
- xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity)
205
- xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty)
206
- xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience) if @audience
204
+ xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event.to_s)
205
+ xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency.to_s)
206
+ xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity.to_s)
207
+ xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty.to_s)
208
+ xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience.to_s) if @audience
207
209
  @event_codes.each do |event_code|
208
210
  xml_element.add_element(event_code.to_xml_element)
209
211
  end
210
- xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
211
- xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
212
- xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
213
- xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name) if @sender_name
214
- xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline) if @headline
215
- xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description) if @description
216
- xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction) if @instruction
217
- xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web) if @web
218
- xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact) if @contact
212
+ xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
213
+ xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
214
+ xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
215
+ xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name.to_s) if @sender_name
216
+ xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline.to_s) if @headline
217
+ xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description.to_s) if @description
218
+ xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction.to_s) if @instruction
219
+ xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web.to_s) if @web
220
+ xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact.to_s) if @contact
219
221
  @parameters.each do |parameter|
220
222
  xml_element.add_element(parameter.to_xml_element)
221
223
  end
@@ -237,7 +239,7 @@ module RCAP
237
239
  # @return [Info]
238
240
  def self.from_xml_element(info_xml_element)
239
241
  new do |info|
240
- info.language = RCAP.xpath_text(info_xml_element, LANGUAGE_XPATH, info.xmlns) || DEFAULT_LANGUAGE
242
+ info.language = RCAP.xpath_text(info_xml_element, LANGUAGE_XPATH, info.xmlns) || DEFAULT_LANGUAGE
241
243
 
242
244
  RCAP.xpath_match(info_xml_element, CATEGORY_XPATH, info.xmlns).each do |element|
243
245
  info.categories << element.text
@@ -266,8 +268,8 @@ module RCAP
266
268
  info.parameters << info.parameter_class.from_xml_element(element)
267
269
  end
268
270
 
269
- RCAP.xpath_match(info_xml_element, info.resource_class::XPATH, info.xmlns).each do |element|
270
- info.resources << info.resource_class.from_xml_element(element)
271
+ RCAP.xpath_match(info_xml_element, info.resource_class::XPATH, info.xmlns).each do |element|
272
+ info.resources << info.resource_class.from_xml_element(element)
271
273
  end
272
274
 
273
275
  RCAP.xpath_match(info_xml_element, info.area_class::XPATH, info.xmlns).each do |element|
@@ -278,26 +280,26 @@ module RCAP
278
280
 
279
281
  # @return [String]
280
282
  def inspect
281
- info_inspect = "Language: #{ @language }\n"\
282
- "Categories: #{ @categories.to_s_for_cap }\n"\
283
- "Event: #{ @event }\n"\
284
- "Urgency: #{ @urgency }\n"\
285
- "Severity: #{ @severity }\n"\
286
- "Certainty: #{ @certainty }\n"\
287
- "Audience: #{ @audience }\n"\
288
- "Event Codes: #{ @event_codes.inspect }\n"\
289
- "Effective: #{ @effective }\n"\
290
- "Onset: #{ @onset }\n"\
291
- "Expires: #{ @expires }\n"\
292
- "Sender Name: #{ @sender_name }\n"\
293
- "Headline: #{ @headline }\n"\
294
- "Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
295
- "Instruction: #{ @instruction }\n"\
296
- "Web: #{ @web }\n"\
297
- "Contact: #{ @contact }\n"\
298
- "Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
299
- "Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
300
- "Area:\n" + @areas.map { |area| " #{ area }" }.join("\n") + "\n"
283
+ info_inspect = "Language: #{@language}\n"\
284
+ "Categories: #{@categories.to_s_for_cap}\n"\
285
+ "Event: #{@event}\n"\
286
+ "Urgency: #{@urgency}\n"\
287
+ "Severity: #{@severity}\n"\
288
+ "Certainty: #{@certainty}\n"\
289
+ "Audience: #{@audience}\n"\
290
+ "Event Codes: #{@event_codes.inspect}\n"\
291
+ "Effective: #{@effective}\n"\
292
+ "Onset: #{@onset}\n"\
293
+ "Expires: #{@expires}\n"\
294
+ "Sender Name: #{@sender_name}\n"\
295
+ "Headline: #{@headline}\n"\
296
+ "Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
297
+ "Instruction: #{@instruction}\n"\
298
+ "Web: #{@web}\n"\
299
+ "Contact: #{@contact}\n"\
300
+ "Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
301
+ "Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
302
+ "Area:\n" + @areas.map { |area| " #{area}" }.join("\n") + "\n"
301
303
  RCAP.format_lines_for_inspect('INFO', info_inspect)
302
304
  end
303
305
 
@@ -306,7 +308,7 @@ module RCAP
306
308
  #
307
309
  # @return [String]
308
310
  def to_s
309
- "#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
311
+ "#{@event}(#{@urgency}/#{@severity}/#{@certainty})"
310
312
  end
311
313
 
312
314
  LANGUAGE_YAML = 'Language'
@@ -332,7 +334,7 @@ module RCAP
332
334
 
333
335
  # @return [Hash]
334
336
  def to_yaml_data
335
- parameter_to_hash = lambda { |hash, parameter| hash.merge(parameter.name => parameter.value) }
337
+ parameter_to_hash = ->(hash, parameter) { hash.merge(parameter.name => parameter.value) }
336
338
 
337
339
  RCAP.attribute_values_to_hash([LANGUAGE_YAML, @language],
338
340
  [CATEGORIES_YAML, @categories],
@@ -365,7 +367,7 @@ module RCAP
365
367
  # @return [Info]
366
368
  def self.from_yaml_data(info_yaml_data)
367
369
  new do |info|
368
- info.language = info_yaml_data [LANGUAGE_YAML]
370
+ info.language = info_yaml_data [LANGUAGE_YAML]
369
371
  Array(info_yaml_data [CATEGORIES_YAML]).each do |category|
370
372
  info.categories << category
371
373
  end
@@ -384,7 +386,7 @@ module RCAP
384
386
  info.web = RCAP.strip_if_given(info_yaml_data [WEB_YAML])
385
387
  info.contact = RCAP.strip_if_given(info_yaml_data [CONTACT_YAML])
386
388
 
387
- Array(info_yaml_data [EVENT_CODES_YAML]).each do |name, value|
389
+ Array(info_yaml_data [EVENT_CODES_YAML]).each do |name, value|
388
390
  info.add_event_code do |event_code|
389
391
  event_code.name = RCAP.strip_if_given(name)
390
392
  event_code.value = RCAP.strip_if_given(value)
@@ -431,7 +433,7 @@ module RCAP
431
433
 
432
434
  # @return [Hash]
433
435
  def to_h
434
- RCAP.attribute_values_to_hash([LANGUAGE_KEY, @language],
436
+ RCAP.attribute_values_to_hash([LANGUAGE_KEY, @language],
435
437
  [CATEGORIES_KEY, @categories],
436
438
  [EVENT_KEY, @event],
437
439
  [URGENCY_KEY, @urgency],
@@ -447,17 +449,17 @@ module RCAP
447
449
  [INSTRUCTION_KEY, @instruction],
448
450
  [WEB_KEY, @web],
449
451
  [CONTACT_KEY, @contact],
450
- [RESOURCES_KEY, @resources.map { |resource| resource.to_h }],
451
- [EVENT_CODES_KEY, @event_codes.map { |event_code| event_code.to_h }],
452
- [PARAMETERS_KEY, @parameters.map { |parameter| parameter.to_h }],
453
- [AREAS_KEY, @areas.map { |area| area.to_h }])
452
+ [RESOURCES_KEY, @resources.map(&:to_h)],
453
+ [EVENT_CODES_KEY, @event_codes.map(&:to_h)],
454
+ [PARAMETERS_KEY, @parameters.map(&:to_h)],
455
+ [AREAS_KEY, @areas.map(&:to_h)])
454
456
  end
455
457
 
456
458
  # @param [Hash] info_hash
457
459
  # @return [Info]
458
460
  def self.from_h(info_hash)
459
461
  new do |info|
460
- info.language = info_hash[LANGUAGE_KEY]
462
+ info.language = info_hash[LANGUAGE_KEY]
461
463
  Array(info_hash[CATEGORIES_KEY]).each do |category|
462
464
  info.categories << RCAP.strip_if_given(category)
463
465
  end
@@ -489,10 +491,14 @@ module RCAP
489
491
  end
490
492
 
491
493
  Array(info_hash[AREAS_KEY]).each do |area_hash|
492
- info.areas << info.area_class.from_h(area_hash)
494
+ info.areas << info.area_class.from_h(area_hash)
493
495
  end
494
496
  end
495
497
  end
498
+
499
+ def map_data?
500
+ @areas.any?(&:map_data?)
501
+ end
496
502
  end
497
503
  end
498
504
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Parameter
@@ -14,9 +16,9 @@ module RCAP
14
16
  NAME_ELEMENT_NAME = 'valueName'
15
17
  VALUE_ELEMENT_NAME = 'value'
16
18
 
17
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
18
- NAME_XPATH = "cap:#{ NAME_ELEMENT_NAME }"
19
- VALUE_XPATH = "cap:#{ VALUE_ELEMENT_NAME }"
19
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
20
+ NAME_XPATH = "cap:#{NAME_ELEMENT_NAME}"
21
+ VALUE_XPATH = "cap:#{VALUE_ELEMENT_NAME}"
20
22
 
21
23
  # @param [Hash] attributes
22
24
  # @option attributes [Symbol] :name Parameter name
@@ -28,8 +30,8 @@ module RCAP
28
30
  # @return [REXML::Element]
29
31
  def to_xml_element
30
32
  xml_element = REXML::Element.new(self.class::XML_ELEMENT_NAME)
31
- xml_element.add_element(self.class::NAME_ELEMENT_NAME).add_text(@name)
32
- xml_element.add_element(self.class::VALUE_ELEMENT_NAME).add_text(@value)
33
+ xml_element.add_element(self.class::NAME_ELEMENT_NAME).add_text(@name.to_s)
34
+ xml_element.add_element(self.class::VALUE_ELEMENT_NAME).add_text(@value.to_s)
33
35
  xml_element
34
36
  end
35
37
 
@@ -40,7 +42,7 @@ module RCAP
40
42
 
41
43
  # @return [String]
42
44
  def inspect
43
- "#{ @name }: #{ @value }"
45
+ "#{@name}: #{@value}"
44
46
  end
45
47
 
46
48
  # Returns a string representation of the parameter of the form
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Point
@@ -29,7 +31,7 @@ module RCAP
29
31
  #
30
32
  # @return [String]
31
33
  def to_s
32
- "#{ lattitude },#{ longitude }"
34
+ "#{lattitude},#{longitude}"
33
35
  end
34
36
 
35
37
  # @return [String]
@@ -68,7 +70,7 @@ module RCAP
68
70
 
69
71
  # @return [Array(Numeric, Numeric)]
70
72
  def to_a
71
- Array.new.tap do |array|
73
+ [].tap do |array|
72
74
  array[LATTITUDE_INDEX] = lattitude
73
75
  array[LONGITUDE_INDEX] = longitude
74
76
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Polygon
@@ -7,16 +9,16 @@ module RCAP
7
9
  attr_reader(:points)
8
10
 
9
11
  validates_collection_of(:points)
10
- validates_length_of(:points, minimum: 3)
11
- validates_equality_of_first_and_last(:points)
12
+ validates_length_of(:points, minimum: 3, allow_blank: true)
13
+ validates_equality_of_first_and_last(:points, allow_empty: true)
12
14
 
13
15
  XML_ELEMENT_NAME = 'polygon'
14
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
16
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
15
17
 
16
18
  # @param [Hash] attributes
17
19
  # @option attributes [Array<Point>] :points Collection of {Point} objects
18
20
  def initialize
19
- @points = []
21
+ @points = []
20
22
  yield(self) if block_given?
21
23
  end
22
24
 
@@ -27,6 +29,12 @@ module RCAP
27
29
  point
28
30
  end
29
31
 
32
+ # Returns GeoJSON representation of the polygon
33
+ def to_geojson
34
+ coordinates = @points.map { |point| [point.longitude, point.lattitude] }
35
+ { 'type' => 'Polygon', 'coordinates' => [coordinates] }.to_json
36
+ end
37
+
30
38
  # Returns a string representation of the polygon of the form
31
39
  # points[0] points[1] points[2] ...
32
40
  # where each point is formatted with Point#to_s
@@ -36,7 +44,7 @@ module RCAP
36
44
 
37
45
  # @return [String]
38
46
  def inspect
39
- "(#{ @points.map { |point| point.inspect }.join(', ')})"
47
+ "(#{@points.map(&:inspect).join(', ')})"
40
48
  end
41
49
 
42
50
  # @return [REXML::Element]
@@ -77,7 +85,7 @@ module RCAP
77
85
 
78
86
  # @return [Array<Array(Numeric,Numeric)>]
79
87
  def self.parse_polygon_string(polygon_string)
80
- polygon_string.split(' ').map { |coordinate_string| coordinate_string.split(',').map { |coordinate| coordinate.to_f } }
88
+ polygon_string.split(' ').map { |coordinate_string| coordinate_string.split(',').map(&:to_f) }
81
89
  end
82
90
 
83
91
  # @return [Polygon]
@@ -102,7 +110,7 @@ module RCAP
102
110
  to_yaml_data.to_yaml(options)
103
111
  end
104
112
 
105
- POINTS_KEY = 'points'
113
+ POINTS_KEY = 'points'
106
114
 
107
115
  # @return [Polygon]
108
116
  def self.from_h(polygon_hash)
@@ -118,7 +126,7 @@ module RCAP
118
126
 
119
127
  # @return [Hash]
120
128
  def to_h
121
- { POINTS_KEY => @points.map { |point| point.to_a } }
129
+ { POINTS_KEY => @points.map(&:to_a) }
122
130
  end
123
131
  end
124
132
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Resource
@@ -23,12 +25,12 @@ module RCAP
23
25
  DIGEST_ELEMENT_NAME = 'digest'
24
26
  RESOURCE_DESC_ELEMENT_NAME = 'resourceDesc'
25
27
 
26
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
27
- MIME_TYPE_XPATH = "cap:#{ MIME_TYPE_ELEMENT_NAME }"
28
- SIZE_XPATH = "cap:#{ SIZE_ELEMENT_NAME }"
29
- URI_XPATH = "cap:#{ URI_ELEMENT_NAME }"
30
- DIGEST_XPATH = "cap:#{ DIGEST_ELEMENT_NAME }"
31
- RESOURCE_DESC_XPATH = "cap:#{ RESOURCE_DESC_ELEMENT_NAME }"
28
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
29
+ MIME_TYPE_XPATH = "cap:#{MIME_TYPE_ELEMENT_NAME}"
30
+ SIZE_XPATH = "cap:#{SIZE_ELEMENT_NAME}"
31
+ URI_XPATH = "cap:#{URI_ELEMENT_NAME}"
32
+ DIGEST_XPATH = "cap:#{DIGEST_ELEMENT_NAME}"
33
+ RESOURCE_DESC_XPATH = "cap:#{RESOURCE_DESC_ELEMENT_NAME}"
32
34
 
33
35
  # @param [Hash{Symbol => Object}] attributes
34
36
  # @option attributes [String] :mime_type
@@ -44,10 +46,10 @@ module RCAP
44
46
  def to_xml_element
45
47
  xml_element = REXML::Element.new(XML_ELEMENT_NAME)
46
48
  xml_element.add_element(RESOURCE_DESC_ELEMENT_NAME).add_text(@resource_desc)
47
- xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type) if @mime_type
48
- xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s) if @size
49
- xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri) if @uri
50
- xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest) if @digest
49
+ xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type.to_s) if @mime_type
50
+ xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s) if @size
51
+ xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri.to_s) if @uri
52
+ xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest.to_s) if @digest
51
53
  xml_element
52
54
  end
53
55
 
@@ -86,9 +88,7 @@ module RCAP
86
88
  # If size is defined returns the size in kilobytes
87
89
  # @return [Float]
88
90
  def size_in_kb
89
- if @size
90
- @size.to_f / 1024
91
- end
91
+ @size.to_f / 1024 if @size
92
92
  end
93
93
 
94
94
  # @return [String]