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.
- checksums.yaml +5 -5
- data/.ruby-version +1 -1
- data/lib/rcap.rb +2 -0
- data/lib/rcap/alert.rb +4 -2
- data/lib/rcap/base/alert.rb +57 -55
- data/lib/rcap/base/area.rb +19 -13
- data/lib/rcap/base/circle.rb +6 -4
- data/lib/rcap/base/event_code.rb +2 -0
- data/lib/rcap/base/geocode.rb +2 -0
- data/lib/rcap/base/info.rb +65 -59
- data/lib/rcap/base/parameter.rb +6 -4
- data/lib/rcap/base/point.rb +4 -2
- data/lib/rcap/base/polygon.rb +8 -6
- data/lib/rcap/base/resource.rb +9 -9
- data/lib/rcap/cap_1_0/alert.rb +22 -20
- data/lib/rcap/cap_1_0/area.rb +2 -0
- data/lib/rcap/cap_1_0/circle.rb +2 -0
- data/lib/rcap/cap_1_0/event_code.rb +3 -1
- data/lib/rcap/cap_1_0/geocode.rb +3 -1
- data/lib/rcap/cap_1_0/info.rb +3 -1
- data/lib/rcap/cap_1_0/parameter.rb +3 -1
- data/lib/rcap/cap_1_0/point.rb +2 -0
- data/lib/rcap/cap_1_0/polygon.rb +2 -0
- data/lib/rcap/cap_1_0/resource.rb +2 -0
- data/lib/rcap/cap_1_1/alert.rb +4 -2
- data/lib/rcap/cap_1_1/area.rb +2 -0
- data/lib/rcap/cap_1_1/circle.rb +2 -0
- data/lib/rcap/cap_1_1/event_code.rb +3 -1
- data/lib/rcap/cap_1_1/geocode.rb +3 -1
- data/lib/rcap/cap_1_1/info.rb +34 -32
- data/lib/rcap/cap_1_1/parameter.rb +2 -0
- data/lib/rcap/cap_1_1/point.rb +2 -0
- data/lib/rcap/cap_1_1/polygon.rb +2 -0
- data/lib/rcap/cap_1_1/resource.rb +6 -4
- data/lib/rcap/cap_1_2/alert.rb +4 -2
- data/lib/rcap/cap_1_2/area.rb +2 -0
- data/lib/rcap/cap_1_2/circle.rb +2 -0
- data/lib/rcap/cap_1_2/event_code.rb +3 -1
- data/lib/rcap/cap_1_2/geocode.rb +3 -1
- data/lib/rcap/cap_1_2/info.rb +42 -38
- data/lib/rcap/cap_1_2/parameter.rb +2 -0
- data/lib/rcap/cap_1_2/point.rb +2 -0
- data/lib/rcap/cap_1_2/polygon.rb +2 -0
- data/lib/rcap/cap_1_2/resource.rb +8 -5
- data/lib/rcap/config.rb +2 -0
- data/lib/rcap/custom_validators.rb +11 -11
- data/lib/rcap/extensions/array.rb +2 -0
- data/lib/rcap/extensions/date.rb +3 -1
- data/lib/rcap/extensions/date_time.rb +4 -1
- data/lib/rcap/extensions/float.rb +2 -0
- data/lib/rcap/extensions/integer.rb +2 -0
- data/lib/rcap/extensions/nil_class.rb +2 -0
- data/lib/rcap/extensions/string.rb +3 -1
- data/lib/rcap/extensions/time.rb +3 -0
- data/lib/rcap/formatters/yaml.rb +3 -2
- data/lib/rcap/info.rb +2 -0
- data/lib/rcap/utilities.rb +7 -9
- data/lib/rcap/validation.rb +11 -9
- data/lib/rcap/version.rb +3 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f9d35572f21978f5fff7370828a4c146daf2c2abe960e1c508bcbee6f5713319
|
4
|
+
data.tar.gz: b998e0210707386d1d0de2d1157e7296900be5b79c1191e02741524f3ac3fe20
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33705a6c22c94be4b61d469f1f5a7c727cd92e968ef639dd947d51a65ba012d70eda684af771960c10816dace76804fb341696709fb039a1b16c1b71be98c09c
|
7
|
+
data.tar.gz: a332b8e3b2f155545afbd53bf319d862f1b2e51c692bebf728646b759d5fc97ef2f0b293df81e65987ae0a999662a436a4298172b4a368d743aab0ca7a956911
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.5.0
|
data/lib/rcap.rb
CHANGED
data/lib/rcap/alert.rb
CHANGED
@@ -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.
|
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
|
data/lib/rcap/base/alert.rb
CHANGED
@@ -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
|
-
"#{
|
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: #{
|
184
|
-
"Identifier: #{
|
185
|
-
"Sender: #{
|
186
|
-
"Sent: #{
|
187
|
-
"Status: #{
|
188
|
-
"Message Type: #{
|
189
|
-
"Source: #{
|
190
|
-
"Scope: #{
|
191
|
-
"Restriction: #{
|
192
|
-
"Addresses: #{
|
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: #{
|
196
|
-
|
197
|
-
|
198
|
-
"Incidents: #{
|
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
|
-
"#{
|
212
|
+
"#{@sender}/#{@identifier}/#{RCAP.to_s_for_cap(@sent)}"
|
211
213
|
end
|
212
214
|
|
213
215
|
XPATH = 'cap:alert'
|
214
|
-
IDENTIFIER_XPATH = "cap:#{
|
215
|
-
SENDER_XPATH = "cap:#{
|
216
|
-
SENT_XPATH = "cap:#{
|
217
|
-
STATUS_XPATH = "cap:#{
|
218
|
-
MSG_TYPE_XPATH = "cap:#{
|
219
|
-
SOURCE_XPATH = "cap:#{
|
220
|
-
SCOPE_XPATH = "cap:#{
|
221
|
-
RESTRICTION_XPATH = "cap:#{
|
222
|
-
ADDRESSES_XPATH = "cap:#{
|
223
|
-
CODE_XPATH = "cap:#{
|
224
|
-
NOTE_XPATH = "cap:#{
|
225
|
-
REFERENCES_XPATH = "cap:#{
|
226
|
-
INCIDENTS_XPATH = "cap:#{
|
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.
|
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[
|
331
|
-
alert.sender = RCAP.strip_if_given(alert_yaml_data[
|
332
|
-
alert.sent = RCAP.parse_datetime(alert_yaml_data[
|
333
|
-
alert.status = RCAP.strip_if_given(alert_yaml_data[
|
334
|
-
alert.msg_type = RCAP.strip_if_given(alert_yaml_data[
|
335
|
-
alert.source = RCAP.strip_if_given(alert_yaml_data[
|
336
|
-
alert.scope = RCAP.strip_if_given(alert_yaml_data[
|
337
|
-
alert.restriction = RCAP.strip_if_given(alert_yaml_data[
|
338
|
-
Array(alert_yaml_data[
|
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[
|
343
|
+
Array(alert_yaml_data[CODES_YAML]).each do |code|
|
342
344
|
alert.codes << code.strip
|
343
345
|
end
|
344
|
-
alert.note
|
345
|
-
Array(alert_yaml_data[
|
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[
|
350
|
+
Array(alert_yaml_data[INCIDENTS_YAML]).each do |incident|
|
349
351
|
alert.incidents << incident.strip
|
350
352
|
end
|
351
|
-
Array(alert_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
|
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[
|
410
|
+
Array(alert_hash[ADDRESSES_KEY]).each do |address|
|
409
411
|
alert.addresses << address.strip
|
410
412
|
end
|
411
|
-
Array(alert_hash[
|
413
|
+
Array(alert_hash[CODES_KEY]).each do |code|
|
412
414
|
alert.codes << code.strip
|
413
415
|
end
|
414
|
-
alert.note = alert_hash[
|
415
|
-
Array(alert_hash[
|
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[
|
421
|
+
Array(alert_hash[INCIDENTS_KEY]).each do |incident|
|
420
422
|
alert.incidents << incident.strip
|
421
423
|
end
|
422
424
|
|
423
|
-
Array(alert_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
|
data/lib/rcap/base/area.rb
CHANGED
@@ -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:#{
|
29
|
-
AREA_DESC_XPATH = "cap:#{
|
30
|
-
ALTITUDE_XPATH = "cap:#{
|
31
|
-
CEILING_XPATH = "cap:#{
|
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 =
|
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: #{
|
131
|
-
"Polygons:\n" +
|
132
|
-
"Circles: #{
|
133
|
-
"Geocodes: #{
|
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
|
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
|
226
|
-
[GEOCODES_KEY, @geocodes.map
|
227
|
-
[POLYGONS_KEY, @polygons.map
|
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
|
data/lib/rcap/base/circle.rb
CHANGED
@@ -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
|
-
"#{
|
40
|
+
"#{@lattitude},#{@longitude} #{@radius}"
|
39
41
|
end
|
40
42
|
|
41
43
|
# @return [String]
|
42
44
|
def inspect
|
43
|
-
"(#{
|
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
|
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
|
96
|
+
RADIUS_KEY = 'radius'
|
95
97
|
# @return [Hash]
|
96
98
|
def to_h
|
97
99
|
RCAP.attribute_values_to_hash([RADIUS_KEY, @radius],
|
data/lib/rcap/base/event_code.rb
CHANGED
data/lib/rcap/base/geocode.rb
CHANGED
data/lib/rcap/base/info.rb
CHANGED
@@ -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,
|
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:#{
|
71
|
-
LANGUAGE_XPATH = "cap:#{
|
72
|
-
EVENT_XPATH = "cap:#{
|
73
|
-
URGENCY_XPATH = "cap:#{
|
74
|
-
CATEGORY_XPATH = "cap:#{
|
75
|
-
SEVERITY_XPATH = "cap:#{
|
76
|
-
CERTAINTY_XPATH = "cap:#{
|
77
|
-
AUDIENCE_XPATH = "cap:#{
|
78
|
-
EVENT_CODE_XPATH = "cap:#{
|
79
|
-
EFFECTIVE_XPATH = "cap:#{
|
80
|
-
ONSET_XPATH = "cap:#{
|
81
|
-
EXPIRES_XPATH = "cap:#{
|
82
|
-
SENDER_NAME_XPATH = "cap:#{
|
83
|
-
HEADLINE_XPATH = "cap:#{
|
84
|
-
DESCRIPTION_XPATH = "cap:#{
|
85
|
-
INSTRUCTION_XPATH = "cap:#{
|
86
|
-
WEB_XPATH = "cap:#{
|
87
|
-
CONTACT_XPATH = "cap:#{
|
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,
|
96
|
-
validates_inclusion_of(:urgency, allow_nil: true, in: VALID_URGENCIES,
|
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
|
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
|
270
|
-
info.resources <<
|
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: #{
|
282
|
-
"Categories: #{
|
283
|
-
"Event: #{
|
284
|
-
"Urgency: #{
|
285
|
-
"Severity: #{
|
286
|
-
"Certainty: #{
|
287
|
-
"Audience: #{
|
288
|
-
"Event Codes: #{
|
289
|
-
"Effective: #{
|
290
|
-
"Onset: #{
|
291
|
-
"Expires: #{
|
292
|
-
"Sender Name: #{
|
293
|
-
"Headline: #{
|
294
|
-
"Description:\n" +
|
295
|
-
"Instruction: #{
|
296
|
-
"Web: #{
|
297
|
-
"Contact: #{
|
298
|
-
"Parameters:\n" +
|
299
|
-
"Resources:\n" +
|
300
|
-
"Area:\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
|
-
"#{
|
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 =
|
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
|
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
|
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,
|
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
|
451
|
-
[EVENT_CODES_KEY, @event_codes.map
|
452
|
-
[PARAMETERS_KEY, @parameters.map
|
453
|
-
[AREAS_KEY, @areas.map
|
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
|
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 <<
|
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
|