rcap 2.7.0 → 2.7.3

Sign up to get free protection for your applications and to get access to all the features.
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