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