rcap 2.7.0 → 2.7.3

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 +5 -5
  2. data/.ruby-version +1 -1
  3. data/lib/rcap.rb +2 -0
  4. data/lib/rcap/alert.rb +4 -2
  5. data/lib/rcap/base/alert.rb +57 -55
  6. data/lib/rcap/base/area.rb +19 -13
  7. data/lib/rcap/base/circle.rb +6 -4
  8. data/lib/rcap/base/event_code.rb +2 -0
  9. data/lib/rcap/base/geocode.rb +2 -0
  10. data/lib/rcap/base/info.rb +65 -59
  11. data/lib/rcap/base/parameter.rb +6 -4
  12. data/lib/rcap/base/point.rb +4 -2
  13. data/lib/rcap/base/polygon.rb +8 -6
  14. data/lib/rcap/base/resource.rb +9 -9
  15. data/lib/rcap/cap_1_0/alert.rb +22 -20
  16. data/lib/rcap/cap_1_0/area.rb +2 -0
  17. data/lib/rcap/cap_1_0/circle.rb +2 -0
  18. data/lib/rcap/cap_1_0/event_code.rb +3 -1
  19. data/lib/rcap/cap_1_0/geocode.rb +3 -1
  20. data/lib/rcap/cap_1_0/info.rb +3 -1
  21. data/lib/rcap/cap_1_0/parameter.rb +3 -1
  22. data/lib/rcap/cap_1_0/point.rb +2 -0
  23. data/lib/rcap/cap_1_0/polygon.rb +2 -0
  24. data/lib/rcap/cap_1_0/resource.rb +2 -0
  25. data/lib/rcap/cap_1_1/alert.rb +4 -2
  26. data/lib/rcap/cap_1_1/area.rb +2 -0
  27. data/lib/rcap/cap_1_1/circle.rb +2 -0
  28. data/lib/rcap/cap_1_1/event_code.rb +3 -1
  29. data/lib/rcap/cap_1_1/geocode.rb +3 -1
  30. data/lib/rcap/cap_1_1/info.rb +34 -32
  31. data/lib/rcap/cap_1_1/parameter.rb +2 -0
  32. data/lib/rcap/cap_1_1/point.rb +2 -0
  33. data/lib/rcap/cap_1_1/polygon.rb +2 -0
  34. data/lib/rcap/cap_1_1/resource.rb +6 -4
  35. data/lib/rcap/cap_1_2/alert.rb +4 -2
  36. data/lib/rcap/cap_1_2/area.rb +2 -0
  37. data/lib/rcap/cap_1_2/circle.rb +2 -0
  38. data/lib/rcap/cap_1_2/event_code.rb +3 -1
  39. data/lib/rcap/cap_1_2/geocode.rb +3 -1
  40. data/lib/rcap/cap_1_2/info.rb +42 -38
  41. data/lib/rcap/cap_1_2/parameter.rb +2 -0
  42. data/lib/rcap/cap_1_2/point.rb +2 -0
  43. data/lib/rcap/cap_1_2/polygon.rb +2 -0
  44. data/lib/rcap/cap_1_2/resource.rb +8 -5
  45. data/lib/rcap/config.rb +2 -0
  46. data/lib/rcap/custom_validators.rb +11 -11
  47. data/lib/rcap/extensions/array.rb +2 -0
  48. data/lib/rcap/extensions/date.rb +3 -1
  49. data/lib/rcap/extensions/date_time.rb +4 -1
  50. data/lib/rcap/extensions/float.rb +2 -0
  51. data/lib/rcap/extensions/integer.rb +2 -0
  52. data/lib/rcap/extensions/nil_class.rb +2 -0
  53. data/lib/rcap/extensions/string.rb +3 -1
  54. data/lib/rcap/extensions/time.rb +3 -0
  55. data/lib/rcap/formatters/yaml.rb +3 -2
  56. data/lib/rcap/info.rb +2 -0
  57. data/lib/rcap/utilities.rb +7 -9
  58. data/lib/rcap/validation.rb +11 -9
  59. data/lib/rcap/version.rb +3 -1
  60. metadata +3 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3989e1ef1431735820a46c8295073aa0d75f77c8
4
- data.tar.gz: 0502cea583eb69357a53af06f6c7041dd51c3f43
2
+ SHA256:
3
+ metadata.gz: f9d35572f21978f5fff7370828a4c146daf2c2abe960e1c508bcbee6f5713319
4
+ data.tar.gz: b998e0210707386d1d0de2d1157e7296900be5b79c1191e02741524f3ac3fe20
5
5
  SHA512:
6
- metadata.gz: 8be3379ad98b95acf9d98693af1557318b90ec6d7a225b97c22e37d8b392c52c741b4bf4043db2ff4048fa9d137cf8a6d75a72b8e315a41951e7fd5a6ba32311
7
- data.tar.gz: 2ee22fe04a3efd413473ceaa667d2f9b8aba3931bbb25a4f9c0e52e2398651ffa75b2e7660c7847b2645defe296c1e60acd236fecc4bce1a241a51bbc6c7b3b2
6
+ metadata.gz: 33705a6c22c94be4b61d469f1f5a7c727cd92e968ef639dd947d51a65ba012d70eda684af771960c10816dace76804fb341696709fb039a1b16c1b71be98c09c
7
+ data.tar.gz: a332b8e3b2f155545afbd53bf319d862f1b2e51c692bebf728646b759d5fc97ef2f0b293df81e65987ae0a999662a436a4298172b4a368d743aab0ca7a956911
@@ -1 +1 @@
1
- 2.4.0
1
+ 2.5.0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # System and require libs
2
4
  require 'date'
3
5
  require 'uuidtools'
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Alert
3
5
  XMLNS_KEY = 'xmlns'
4
6
  YAML_CAP_VERSION_KEY = 'CAP Version'
5
7
  JSON_CAP_VERSION_KEY = 'cap_version'
6
8
 
7
- CAP_NAMESPACES = [RCAP::CAP_1_0::Alert::XMLNS, RCAP::CAP_1_1::Alert::XMLNS, RCAP::CAP_1_2::Alert::XMLNS]
9
+ CAP_NAMESPACES = [RCAP::CAP_1_0::Alert::XMLNS, RCAP::CAP_1_1::Alert::XMLNS, RCAP::CAP_1_2::Alert::XMLNS].freeze
8
10
 
9
11
  # Initialise a RCAP Alert from a XML document.
10
12
  #
@@ -36,7 +38,7 @@ module RCAP
36
38
  # @param [IO, String] yaml CAP Alert in YAML format. Can be a String or any IO object.
37
39
  # @return [RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
38
40
  def self.from_yaml(yaml)
39
- yaml_data = YAML.load(yaml)
41
+ yaml_data = YAML.safe_load(yaml, [Time, DateTime])
40
42
 
41
43
  case yaml_data[YAML_CAP_VERSION_KEY]
42
44
  when CAP_1_0::Alert::CAP_VERSION
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Alert
@@ -8,7 +10,7 @@ module RCAP
8
10
  STATUS_SYSTEM = 'System'
9
11
  STATUS_TEST = 'Test'
10
12
  # Valid values for status
11
- VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST]
13
+ VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST].freeze
12
14
 
13
15
  MSG_TYPE_ALERT = 'Alert'
14
16
  MSG_TYPE_UPDATE = 'Update'
@@ -16,13 +18,13 @@ module RCAP
16
18
  MSG_TYPE_ACK = 'Ack'
17
19
  MSG_TYPE_ERROR = 'Error'
18
20
  # Valid values for msg_type
19
- VALID_MSG_TYPES = [MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR]
21
+ VALID_MSG_TYPES = [MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR].freeze
20
22
 
21
23
  SCOPE_PUBLIC = 'Public'
22
24
  SCOPE_RESTRICTED = 'Restricted'
23
25
  SCOPE_PRIVATE = 'Private'
24
26
  # Valid values for scope
25
- VALID_SCOPES = [SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED]
27
+ VALID_SCOPES = [SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED].freeze
26
28
 
27
29
  # @return [String] If not set a UUID will be set by default on object initialisation
28
30
  attr_accessor(:identifier)
@@ -162,7 +164,7 @@ module RCAP
162
164
  # @return [String]
163
165
  def to_xml(pretty_print = false)
164
166
  if pretty_print
165
- xml_document = ''
167
+ xml_document = +''
166
168
  RCAP::XML_PRETTY_PRINTER.write(to_xml_document, xml_document)
167
169
  xml_document
168
170
  else
@@ -175,27 +177,27 @@ module RCAP
175
177
  #
176
178
  # @return [String]
177
179
  def to_reference
178
- "#{ @sender },#{ @identifier },#{ RCAP.to_s_for_cap(@sent)}"
180
+ "#{@sender},#{@identifier},#{RCAP.to_s_for_cap(@sent)}"
179
181
  end
180
182
 
181
183
  # @return [String]
182
184
  def inspect
183
- alert_inspect = ["CAP Version: #{ self.class::CAP_VERSION }",
184
- "Identifier: #{ @identifier }",
185
- "Sender: #{ @sender }",
186
- "Sent: #{ @sent }",
187
- "Status: #{ @status }",
188
- "Message Type: #{ @msg_type }",
189
- "Source: #{ @source }",
190
- "Scope: #{ @scope }",
191
- "Restriction: #{ @restriction }",
192
- "Addresses: #{ @addresses.to_s_for_cap }",
185
+ alert_inspect = ["CAP Version: #{self.class::CAP_VERSION}",
186
+ "Identifier: #{@identifier}",
187
+ "Sender: #{@sender}",
188
+ "Sent: #{@sent}",
189
+ "Status: #{@status}",
190
+ "Message Type: #{@msg_type}",
191
+ "Source: #{@source}",
192
+ "Scope: #{@scope}",
193
+ "Restriction: #{@restriction}",
194
+ "Addresses: #{@addresses.to_s_for_cap}",
193
195
  'Codes:',
194
196
  @codes.map { |code| ' ' + code }.join("\n") + '',
195
- "Note: #{ @note }",
196
- "References:",
197
- @references.join("\n "),
198
- "Incidents: #{ @incidents.join(' ')}",
197
+ "Note: #{@note}",
198
+ 'References:',
199
+ @references.join("\n "),
200
+ "Incidents: #{@incidents.join(' ')}",
199
201
  'Information:',
200
202
  @infos.map { |info| ' ' + info.to_s }.join("\n")].join("\n")
201
203
  RCAP.format_lines_for_inspect('ALERT', alert_inspect)
@@ -207,23 +209,23 @@ module RCAP
207
209
  #
208
210
  # @return [String]
209
211
  def to_s
210
- "#{ @sender }/#{ @identifier }/#{ RCAP.to_s_for_cap(@sent)}"
212
+ "#{@sender}/#{@identifier}/#{RCAP.to_s_for_cap(@sent)}"
211
213
  end
212
214
 
213
215
  XPATH = 'cap:alert'
214
- IDENTIFIER_XPATH = "cap:#{ IDENTIFIER_ELEMENT_NAME }"
215
- SENDER_XPATH = "cap:#{ SENDER_ELEMENT_NAME }"
216
- SENT_XPATH = "cap:#{ SENT_ELEMENT_NAME }"
217
- STATUS_XPATH = "cap:#{ STATUS_ELEMENT_NAME }"
218
- MSG_TYPE_XPATH = "cap:#{ MSG_TYPE_ELEMENT_NAME }"
219
- SOURCE_XPATH = "cap:#{ SOURCE_ELEMENT_NAME }"
220
- SCOPE_XPATH = "cap:#{ SCOPE_ELEMENT_NAME }"
221
- RESTRICTION_XPATH = "cap:#{ RESTRICTION_ELEMENT_NAME }"
222
- ADDRESSES_XPATH = "cap:#{ ADDRESSES_ELEMENT_NAME }"
223
- CODE_XPATH = "cap:#{ CODE_ELEMENT_NAME }"
224
- NOTE_XPATH = "cap:#{ NOTE_ELEMENT_NAME }"
225
- REFERENCES_XPATH = "cap:#{ REFERENCES_ELEMENT_NAME }"
226
- INCIDENTS_XPATH = "cap:#{ INCIDENTS_ELEMENT_NAME }"
216
+ IDENTIFIER_XPATH = "cap:#{IDENTIFIER_ELEMENT_NAME}"
217
+ SENDER_XPATH = "cap:#{SENDER_ELEMENT_NAME}"
218
+ SENT_XPATH = "cap:#{SENT_ELEMENT_NAME}"
219
+ STATUS_XPATH = "cap:#{STATUS_ELEMENT_NAME}"
220
+ MSG_TYPE_XPATH = "cap:#{MSG_TYPE_ELEMENT_NAME}"
221
+ SOURCE_XPATH = "cap:#{SOURCE_ELEMENT_NAME}"
222
+ SCOPE_XPATH = "cap:#{SCOPE_ELEMENT_NAME}"
223
+ RESTRICTION_XPATH = "cap:#{RESTRICTION_ELEMENT_NAME}"
224
+ ADDRESSES_XPATH = "cap:#{ADDRESSES_ELEMENT_NAME}"
225
+ CODE_XPATH = "cap:#{CODE_ELEMENT_NAME}"
226
+ NOTE_XPATH = "cap:#{NOTE_ELEMENT_NAME}"
227
+ REFERENCES_XPATH = "cap:#{REFERENCES_ELEMENT_NAME}"
228
+ INCIDENTS_XPATH = "cap:#{INCIDENTS_ELEMENT_NAME}"
227
229
 
228
230
  # @param [REXML::Element] alert_xml_element
229
231
  # @return [RCAP::CAP_1_0::Alert]
@@ -318,7 +320,7 @@ module RCAP
318
320
  # @param [String] yaml
319
321
  # @return [Alert]
320
322
  def self.from_yaml(yaml)
321
- from_yaml_data(YAML.load(yaml))
323
+ from_yaml_data(YAML.safe_load(yaml, [Time, DateTime]))
322
324
  end
323
325
 
324
326
  # Initialise an Alert object from a hash reutrned from YAML.load.
@@ -327,28 +329,28 @@ module RCAP
327
329
  # @return [Alert]
328
330
  def self.from_yaml_data(alert_yaml_data)
329
331
  new do |alert|
330
- alert.identifier = RCAP.strip_if_given(alert_yaml_data[ IDENTIFIER_YAML])
331
- alert.sender = RCAP.strip_if_given(alert_yaml_data[ SENDER_YAML])
332
- alert.sent = RCAP.parse_datetime(alert_yaml_data[ SENT_YAML])
333
- alert.status = RCAP.strip_if_given(alert_yaml_data[ STATUS_YAML])
334
- alert.msg_type = RCAP.strip_if_given(alert_yaml_data[ MSG_TYPE_YAML])
335
- alert.source = RCAP.strip_if_given(alert_yaml_data[ SOURCE_YAML])
336
- alert.scope = RCAP.strip_if_given(alert_yaml_data[ SCOPE_YAML])
337
- alert.restriction = RCAP.strip_if_given(alert_yaml_data[ RESTRICTION_YAML])
338
- Array(alert_yaml_data[ ADDRESSES_YAML]).each do |address|
332
+ alert.identifier = RCAP.strip_if_given(alert_yaml_data[IDENTIFIER_YAML])
333
+ alert.sender = RCAP.strip_if_given(alert_yaml_data[SENDER_YAML])
334
+ alert.sent = RCAP.parse_datetime(alert_yaml_data[SENT_YAML])
335
+ alert.status = RCAP.strip_if_given(alert_yaml_data[STATUS_YAML])
336
+ alert.msg_type = RCAP.strip_if_given(alert_yaml_data[MSG_TYPE_YAML])
337
+ alert.source = RCAP.strip_if_given(alert_yaml_data[SOURCE_YAML])
338
+ alert.scope = RCAP.strip_if_given(alert_yaml_data[SCOPE_YAML])
339
+ alert.restriction = RCAP.strip_if_given(alert_yaml_data[RESTRICTION_YAML])
340
+ Array(alert_yaml_data[ADDRESSES_YAML]).each do |address|
339
341
  alert.addresses << address.strip
340
342
  end
341
- Array(alert_yaml_data[ CODES_YAML]).each do |code|
343
+ Array(alert_yaml_data[CODES_YAML]).each do |code|
342
344
  alert.codes << code.strip
343
345
  end
344
- alert.note = alert_yaml_data[ NOTE_YAML]
345
- Array(alert_yaml_data[ REFERENCES_YAML]).each do |reference|
346
+ alert.note = alert_yaml_data[NOTE_YAML]
347
+ Array(alert_yaml_data[REFERENCES_YAML]).each do |reference|
346
348
  alert.references << reference.strip
347
349
  end
348
- Array(alert_yaml_data[ INCIDENTS_YAML]).each do |incident|
350
+ Array(alert_yaml_data[INCIDENTS_YAML]).each do |incident|
349
351
  alert.incidents << incident.strip
350
352
  end
351
- Array(alert_yaml_data[ INFOS_YAML]).each do |info_yaml_data|
353
+ Array(alert_yaml_data[INFOS_YAML]).each do |info_yaml_data|
352
354
  alert.infos << alert.info_class.from_yaml_data(info_yaml_data)
353
355
  end
354
356
  end
@@ -388,7 +390,7 @@ module RCAP
388
390
  [NOTE_KEY, @note],
389
391
  [REFERENCES_KEY, @references],
390
392
  [INCIDENTS_KEY, @incidents],
391
- [INFOS_KEY, @infos.map { |info| info.to_h }])
393
+ [INFOS_KEY, @infos.map(&:to_h)])
392
394
  end
393
395
 
394
396
  # Initialises an Alert object from a Hash produced by Alert#to_h
@@ -405,22 +407,22 @@ module RCAP
405
407
  alert.source = RCAP.strip_if_given(alert_hash[SOURCE_KEY])
406
408
  alert.scope = RCAP.strip_if_given(alert_hash[SCOPE_KEY])
407
409
  alert.restriction = RCAP.strip_if_given(alert_hash[RESTRICTION_KEY])
408
- Array(alert_hash[ ADDRESSES_KEY]).each do |address|
410
+ Array(alert_hash[ADDRESSES_KEY]).each do |address|
409
411
  alert.addresses << address.strip
410
412
  end
411
- Array(alert_hash[ CODES_KEY]).each do |code|
413
+ Array(alert_hash[CODES_KEY]).each do |code|
412
414
  alert.codes << code.strip
413
415
  end
414
- alert.note = alert_hash[ NOTE_KEY]
415
- Array(alert_hash[ REFERENCES_KEY]).each do |reference|
416
+ alert.note = alert_hash[NOTE_KEY]
417
+ Array(alert_hash[REFERENCES_KEY]).each do |reference|
416
418
  alert.references << reference.strip
417
419
  end
418
420
 
419
- Array(alert_hash[ INCIDENTS_KEY]).each do |incident|
421
+ Array(alert_hash[INCIDENTS_KEY]).each do |incident|
420
422
  alert.incidents << incident.strip
421
423
  end
422
424
 
423
- Array(alert_hash[ INFOS_KEY]).each do |info_hash|
425
+ Array(alert_hash[INFOS_KEY]).each do |info_hash|
424
426
  alert.infos << alert.info_class.from_h(info_hash)
425
427
  end
426
428
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Area
@@ -25,10 +27,10 @@ module RCAP
25
27
  ALTITUDE_ELEMENT_NAME = 'altitude'
26
28
  CEILING_ELEMENT_NAME = 'ceiling'
27
29
 
28
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
29
- AREA_DESC_XPATH = "cap:#{ AREA_DESC_ELEMENT_NAME }"
30
- ALTITUDE_XPATH = "cap:#{ ALTITUDE_ELEMENT_NAME }"
31
- CEILING_XPATH = "cap:#{ CEILING_ELEMENT_NAME }"
30
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
31
+ AREA_DESC_XPATH = "cap:#{AREA_DESC_ELEMENT_NAME}"
32
+ ALTITUDE_XPATH = "cap:#{ALTITUDE_ELEMENT_NAME}"
33
+ CEILING_XPATH = "cap:#{CEILING_ELEMENT_NAME}"
32
34
 
33
35
  # @example
34
36
  # Area.new do |area|
@@ -121,16 +123,16 @@ module RCAP
121
123
  # @param [Area] other Area object to compare
122
124
  # @return [true,false]
123
125
  def ==(other)
124
- comparison_attributes = lambda { |area| [area.area_desc, area.altitude, area.ceiling, area.circles, area.geocodes, area.polygons] }
126
+ comparison_attributes = ->(area) { [area.area_desc, area.altitude, area.ceiling, area.circles, area.geocodes, area.polygons] }
125
127
  comparison_attributes.call(self) == comparison_attributes.call(other)
126
128
  end
127
129
 
128
130
  # @return [String]
129
131
  def inspect
130
- area_inspect = "Area Description: #{ @area_desc }\n"\
131
- "Polygons:\n" + @polygons.map { |polygon| ' ' + polygon.inspect }.join("\n") + "\n"\
132
- "Circles: #{ @circles.inspect }\n"\
133
- "Geocodes: #{ @geocodes.inspect }\n"
132
+ area_inspect = "Area Description: #{@area_desc}\n"\
133
+ "Polygons:\n" + @polygons.map { |polygon| ' ' + polygon.inspect }.join("\n") + "\n"\
134
+ "Circles: #{@circles.inspect}\n"\
135
+ "Geocodes: #{@geocodes.inspect}\n"
134
136
  RCAP.format_lines_for_inspect('AREA', area_inspect)
135
137
  end
136
138
 
@@ -153,7 +155,7 @@ module RCAP
153
155
  RCAP.attribute_values_to_hash([AREA_DESC_YAML, @area_desc],
154
156
  [ALTITUDE_YAML, @altitude],
155
157
  [CEILING_YAML, @ceiling],
156
- [CIRCLES_YAML, @circles.map { |circle| circle.to_a }],
158
+ [CIRCLES_YAML, @circles.map(&:to_a)],
157
159
  [GEOCODES_YAML, @geocodes.reduce({}) { |h, geocode| h.merge(geocode.name => geocode.value) }],
158
160
  [POLYGONS_YAML, @polygons.map(&:to_yaml_data)])
159
161
  end
@@ -222,9 +224,13 @@ module RCAP
222
224
  RCAP.attribute_values_to_hash([AREA_DESC_KEY, @area_desc],
223
225
  [ALTITUDE_KEY, @altitude],
224
226
  [CEILING_KEY, @ceiling],
225
- [CIRCLES_KEY, @circles.map { |circle| circle.to_a }],
226
- [GEOCODES_KEY, @geocodes.map { |geocode| geocode.to_h }],
227
- [POLYGONS_KEY, @polygons.map { |polygon| polygon.to_h }])
227
+ [CIRCLES_KEY, @circles.map(&:to_a)],
228
+ [GEOCODES_KEY, @geocodes.map(&:to_h)],
229
+ [POLYGONS_KEY, @polygons.map(&:to_h)])
230
+ end
231
+
232
+ def map_data?
233
+ @circles.any? || @polygons.any?
228
234
  end
229
235
  end
230
236
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Circle < Point
@@ -35,12 +37,12 @@ module RCAP
35
37
  #
36
38
  # @return [String]
37
39
  def to_s
38
- "#{ @lattitude },#{ @longitude } #{ @radius }"
40
+ "#{@lattitude},#{@longitude} #{@radius}"
39
41
  end
40
42
 
41
43
  # @return [String]
42
44
  def inspect
43
- "(#{ self })"
45
+ "(#{self})"
44
46
  end
45
47
 
46
48
  # @return [REXML::Element]
@@ -63,7 +65,7 @@ module RCAP
63
65
  def self.parse_circle_string(circle_string)
64
66
  coordinates, radius = circle_string.split(' ')
65
67
  lattitude, longitude = coordinates.split(',')
66
- [lattitude, longitude, radius].map { |e| e.to_f }
68
+ [lattitude, longitude, radius].map(&:to_f)
67
69
  end
68
70
 
69
71
  # @param [REXML::Element] circle_xml_element
@@ -91,7 +93,7 @@ module RCAP
91
93
  end
92
94
  end
93
95
 
94
- RADIUS_KEY = 'radius'
96
+ RADIUS_KEY = 'radius'
95
97
  # @return [Hash]
96
98
  def to_h
97
99
  RCAP.attribute_values_to_hash([RADIUS_KEY, @radius],
@@ -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
 
@@ -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