rcap 2.5.0 → 2.7.4
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 -0
- data/CHANGELOG.md +18 -0
- data/README.md +1 -0
- data/lib/rcap.rb +3 -1
- data/lib/rcap/alert.rb +4 -2
- data/lib/rcap/base/alert.rb +70 -73
- data/lib/rcap/base/area.rb +19 -13
- data/lib/rcap/base/circle.rb +15 -4
- data/lib/rcap/base/event_code.rb +2 -0
- data/lib/rcap/base/geocode.rb +2 -0
- data/lib/rcap/base/info.rb +81 -75
- data/lib/rcap/base/parameter.rb +8 -6
- data/lib/rcap/base/point.rb +4 -2
- data/lib/rcap/base/polygon.rb +16 -8
- data/lib/rcap/base/resource.rb +13 -13
- data/lib/rcap/cap_1_0/alert.rb +36 -39
- 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 -2
- data/lib/rcap/cap_1_0/point.rb +2 -0
- data/lib/rcap/cap_1_0/polygon.rb +3 -1
- 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 +48 -46
- data/lib/rcap/cap_1_1/parameter.rb +2 -1
- data/lib/rcap/cap_1_1/point.rb +2 -0
- data/lib/rcap/cap_1_1/polygon.rb +3 -1
- data/lib/rcap/cap_1_1/resource.rb +12 -11
- 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 +55 -51
- data/lib/rcap/cap_1_2/parameter.rb +2 -1
- data/lib/rcap/cap_1_2/point.rb +2 -0
- data/lib/rcap/cap_1_2/polygon.rb +4 -2
- data/lib/rcap/cap_1_2/resource.rb +14 -12
- data/lib/rcap/config.rb +2 -0
- data/lib/rcap/custom_validators.rb +30 -27
- 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 +7 -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 +5 -0
- data/lib/rcap/info.rb +2 -0
- data/lib/rcap/utilities.rb +8 -10
- data/lib/rcap/validation.rb +19 -14
- data/lib/rcap/version.rb +3 -1
- data/rcap.gemspec +5 -5
- data/spec/alert_spec.rb +8 -9
- data/spec/cap_1_0/alert_spec.rb +4 -5
- data/spec/cap_1_0/area_spec.rb +7 -10
- data/spec/cap_1_0/circle_spec.rb +9 -0
- data/spec/cap_1_0/event_code_spec.rb +1 -1
- data/spec/cap_1_0/geocode_spec.rb +1 -1
- data/spec/cap_1_0/info_spec.rb +38 -38
- data/spec/cap_1_0/polygon_spec.rb +7 -5
- data/spec/cap_1_0/resource_spec.rb +6 -7
- data/spec/cap_1_1/alert_spec.rb +6 -7
- data/spec/cap_1_1/area_spec.rb +6 -8
- data/spec/cap_1_1/circle_spec.rb +9 -0
- data/spec/cap_1_1/info_spec.rb +26 -26
- data/spec/cap_1_1/parameter_spec.rb +1 -2
- data/spec/cap_1_1/polygon_spec.rb +12 -10
- data/spec/cap_1_1/resource_spec.rb +13 -13
- data/spec/cap_1_2/alert_spec.rb +7 -8
- data/spec/cap_1_2/area_spec.rb +6 -6
- data/spec/cap_1_2/circle_spec.rb +9 -0
- data/spec/cap_1_2/info_spec.rb +25 -26
- data/spec/cap_1_2/polygon_spec.rb +8 -0
- data/spec/cap_1_2/resource_spec.rb +13 -13
- data/spec/extensions_spec.rb +2 -2
- data/spec/spec_helper.rb +2 -2
- data/spec/validations_spec.rb +0 -1
- metadata +15 -15
- data/lib/rcap/extensions/fixnum.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 257bbebf78d6bd1acba243fff3c24b7d52504f32acd494e395102c5a25f0108a
|
4
|
+
data.tar.gz: 4aad2a1c2a79a997a46e8a47f7542aa6eae55881302a76be9c8fe9bedf44965a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7274c4ad7f92bc6c9df731880ba73d77b8a11ba39f250ad6844fe8f2a3e044b8fbf35ec819ad64a0cc473c493a0b5f39df07361a52364af38ded56217817ce4d
|
7
|
+
data.tar.gz: a8d8e973dc56197011383b83f7923cb5856cdc5da32152bfd4929ad0e860add185be4389fda09f106482f25a58f00f5aa5e15567e4931a971078a795ddd54018
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.7.1
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,24 @@
|
|
1
1
|
Change Log
|
2
2
|
==========
|
3
3
|
|
4
|
+
## 2.7.3 - 14 July 2020
|
5
|
+
|
6
|
+
* Added `Avoid` and `All Clear` response types for CAP 1.2
|
7
|
+
|
8
|
+
## 2.7.0 - 22 March 2017
|
9
|
+
|
10
|
+
* Coordinates of a polygon should be an array of coordinate arrays rather than a single coordinate array. (Seth Deckard)
|
11
|
+
* Moved Fixnum extenions to Integer
|
12
|
+
* Ruby 2.4.0 tested
|
13
|
+
|
14
|
+
## 2.6.0 - 30 October 2016
|
15
|
+
|
16
|
+
* Adds GeoJSON export to Polygon and Circle
|
17
|
+
|
18
|
+
## 2.5.1 - 3 November 2014
|
19
|
+
|
20
|
+
* Allow the polygons to be empty.
|
21
|
+
|
4
22
|
## 2.5.0 - 3 November 2014
|
5
23
|
|
6
24
|
* Allow the values of parameters, area codes and event codes to be empty.
|
data/README.md
CHANGED
data/lib/rcap.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# System and require libs
|
2
4
|
require 'date'
|
3
5
|
require 'uuidtools'
|
@@ -11,7 +13,7 @@ require 'digest/sha1'
|
|
11
13
|
|
12
14
|
# Extensions
|
13
15
|
require 'rcap/extensions/nil_class'
|
14
|
-
require 'rcap/extensions/
|
16
|
+
require 'rcap/extensions/integer'
|
15
17
|
require 'rcap/extensions/float'
|
16
18
|
require 'rcap/extensions/array'
|
17
19
|
require 'rcap/extensions/string'
|
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)
|
@@ -121,27 +123,21 @@ module RCAP
|
|
121
123
|
def to_xml_element
|
122
124
|
xml_element = REXML::Element.new(XML_ELEMENT_NAME)
|
123
125
|
xml_element.add_namespace(self.class::XMLNS)
|
124
|
-
xml_element.add_element(IDENTIFIER_ELEMENT_NAME).add_text(@identifier) if @identifier
|
125
|
-
xml_element.add_element(SENDER_ELEMENT_NAME).add_text(@sender) if @sender
|
126
|
-
xml_element.add_element(SENT_ELEMENT_NAME).add_text(@sent.to_s_for_cap)
|
127
|
-
xml_element.add_element(STATUS_ELEMENT_NAME).add_text(@status) if @status
|
128
|
-
xml_element.add_element(MSG_TYPE_ELEMENT_NAME).add_text(@msg_type) if @msg_type
|
129
|
-
xml_element.add_element(SOURCE_ELEMENT_NAME).add_text(@source) if @source
|
130
|
-
xml_element.add_element(SCOPE_ELEMENT_NAME).add_text(@scope) if @scope
|
131
|
-
xml_element.add_element(RESTRICTION_ELEMENT_NAME).add_text(@restriction) if @restriction
|
132
|
-
if @addresses.any?
|
133
|
-
xml_element.add_element(ADDRESSES_ELEMENT_NAME).add_text(@addresses.to_s_for_cap)
|
134
|
-
end
|
126
|
+
xml_element.add_element(IDENTIFIER_ELEMENT_NAME).add_text(@identifier.to_s) if @identifier
|
127
|
+
xml_element.add_element(SENDER_ELEMENT_NAME).add_text(@sender.to_s) if @sender
|
128
|
+
xml_element.add_element(SENT_ELEMENT_NAME).add_text(@sent.to_s_for_cap) if @sent
|
129
|
+
xml_element.add_element(STATUS_ELEMENT_NAME).add_text(@status.to_s) if @status
|
130
|
+
xml_element.add_element(MSG_TYPE_ELEMENT_NAME).add_text(@msg_type.to_s) if @msg_type
|
131
|
+
xml_element.add_element(SOURCE_ELEMENT_NAME).add_text(@source.to_s) if @source
|
132
|
+
xml_element.add_element(SCOPE_ELEMENT_NAME).add_text(@scope.to_s) if @scope
|
133
|
+
xml_element.add_element(RESTRICTION_ELEMENT_NAME).add_text(@restriction.to_s) if @restriction
|
134
|
+
xml_element.add_element(ADDRESSES_ELEMENT_NAME).add_text(@addresses.to_s_for_cap) if @addresses.any?
|
135
135
|
@codes.each do |code|
|
136
|
-
xml_element.add_element(CODE_ELEMENT_NAME).add_text(code)
|
137
|
-
end
|
138
|
-
xml_element.add_element(NOTE_ELEMENT_NAME).add_text(@note) if @note
|
139
|
-
if @references.any?
|
140
|
-
xml_element.add_element(REFERENCES_ELEMENT_NAME).add_text(@references.join(' '))
|
141
|
-
end
|
142
|
-
if @incidents.any?
|
143
|
-
xml_element.add_element(INCIDENTS_ELEMENT_NAME).add_text(@incidents.join(' '))
|
136
|
+
xml_element.add_element(CODE_ELEMENT_NAME).add_text(code.to_s)
|
144
137
|
end
|
138
|
+
xml_element.add_element(NOTE_ELEMENT_NAME).add_text(@note.to_s) if @note
|
139
|
+
xml_element.add_element(REFERENCES_ELEMENT_NAME).add_text(@references.join(' ')) if @references.any?
|
140
|
+
xml_element.add_element(INCIDENTS_ELEMENT_NAME).add_text(@incidents.join(' ')) if @incidents.any?
|
145
141
|
@infos.each do |info|
|
146
142
|
xml_element.add_element(info.to_xml_element)
|
147
143
|
end
|
@@ -162,7 +158,7 @@ module RCAP
|
|
162
158
|
# @return [String]
|
163
159
|
def to_xml(pretty_print = false)
|
164
160
|
if pretty_print
|
165
|
-
xml_document = ''
|
161
|
+
xml_document = +''
|
166
162
|
RCAP::XML_PRETTY_PRINTER.write(to_xml_document, xml_document)
|
167
163
|
xml_document
|
168
164
|
else
|
@@ -175,26 +171,27 @@ module RCAP
|
|
175
171
|
#
|
176
172
|
# @return [String]
|
177
173
|
def to_reference
|
178
|
-
"#{
|
174
|
+
"#{@sender},#{@identifier},#{RCAP.to_s_for_cap(@sent)}"
|
179
175
|
end
|
180
176
|
|
181
177
|
# @return [String]
|
182
178
|
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: #{
|
179
|
+
alert_inspect = ["CAP Version: #{self.class::CAP_VERSION}",
|
180
|
+
"Identifier: #{@identifier}",
|
181
|
+
"Sender: #{@sender}",
|
182
|
+
"Sent: #{@sent}",
|
183
|
+
"Status: #{@status}",
|
184
|
+
"Message Type: #{@msg_type}",
|
185
|
+
"Source: #{@source}",
|
186
|
+
"Scope: #{@scope}",
|
187
|
+
"Restriction: #{@restriction}",
|
188
|
+
"Addresses: #{@addresses.to_s_for_cap}",
|
193
189
|
'Codes:',
|
194
190
|
@codes.map { |code| ' ' + code }.join("\n") + '',
|
195
|
-
"Note: #{
|
196
|
-
|
197
|
-
|
191
|
+
"Note: #{@note}",
|
192
|
+
'References:',
|
193
|
+
@references.join("\n "),
|
194
|
+
"Incidents: #{@incidents.join(' ')}",
|
198
195
|
'Information:',
|
199
196
|
@infos.map { |info| ' ' + info.to_s }.join("\n")].join("\n")
|
200
197
|
RCAP.format_lines_for_inspect('ALERT', alert_inspect)
|
@@ -206,23 +203,23 @@ module RCAP
|
|
206
203
|
#
|
207
204
|
# @return [String]
|
208
205
|
def to_s
|
209
|
-
"#{
|
206
|
+
"#{@sender}/#{@identifier}/#{RCAP.to_s_for_cap(@sent)}"
|
210
207
|
end
|
211
208
|
|
212
209
|
XPATH = 'cap:alert'
|
213
|
-
IDENTIFIER_XPATH = "cap:#{
|
214
|
-
SENDER_XPATH = "cap:#{
|
215
|
-
SENT_XPATH = "cap:#{
|
216
|
-
STATUS_XPATH = "cap:#{
|
217
|
-
MSG_TYPE_XPATH = "cap:#{
|
218
|
-
SOURCE_XPATH = "cap:#{
|
219
|
-
SCOPE_XPATH = "cap:#{
|
220
|
-
RESTRICTION_XPATH = "cap:#{
|
221
|
-
ADDRESSES_XPATH = "cap:#{
|
222
|
-
CODE_XPATH = "cap:#{
|
223
|
-
NOTE_XPATH = "cap:#{
|
224
|
-
REFERENCES_XPATH = "cap:#{
|
225
|
-
INCIDENTS_XPATH = "cap:#{
|
210
|
+
IDENTIFIER_XPATH = "cap:#{IDENTIFIER_ELEMENT_NAME}"
|
211
|
+
SENDER_XPATH = "cap:#{SENDER_ELEMENT_NAME}"
|
212
|
+
SENT_XPATH = "cap:#{SENT_ELEMENT_NAME}"
|
213
|
+
STATUS_XPATH = "cap:#{STATUS_ELEMENT_NAME}"
|
214
|
+
MSG_TYPE_XPATH = "cap:#{MSG_TYPE_ELEMENT_NAME}"
|
215
|
+
SOURCE_XPATH = "cap:#{SOURCE_ELEMENT_NAME}"
|
216
|
+
SCOPE_XPATH = "cap:#{SCOPE_ELEMENT_NAME}"
|
217
|
+
RESTRICTION_XPATH = "cap:#{RESTRICTION_ELEMENT_NAME}"
|
218
|
+
ADDRESSES_XPATH = "cap:#{ADDRESSES_ELEMENT_NAME}"
|
219
|
+
CODE_XPATH = "cap:#{CODE_ELEMENT_NAME}"
|
220
|
+
NOTE_XPATH = "cap:#{NOTE_ELEMENT_NAME}"
|
221
|
+
REFERENCES_XPATH = "cap:#{REFERENCES_ELEMENT_NAME}"
|
222
|
+
INCIDENTS_XPATH = "cap:#{INCIDENTS_ELEMENT_NAME}"
|
226
223
|
|
227
224
|
# @param [REXML::Element] alert_xml_element
|
228
225
|
# @return [RCAP::CAP_1_0::Alert]
|
@@ -317,7 +314,7 @@ module RCAP
|
|
317
314
|
# @param [String] yaml
|
318
315
|
# @return [Alert]
|
319
316
|
def self.from_yaml(yaml)
|
320
|
-
from_yaml_data(YAML.
|
317
|
+
from_yaml_data(YAML.safe_load(yaml, [Time, DateTime]))
|
321
318
|
end
|
322
319
|
|
323
320
|
# Initialise an Alert object from a hash reutrned from YAML.load.
|
@@ -326,28 +323,28 @@ module RCAP
|
|
326
323
|
# @return [Alert]
|
327
324
|
def self.from_yaml_data(alert_yaml_data)
|
328
325
|
new do |alert|
|
329
|
-
alert.identifier = RCAP.strip_if_given(alert_yaml_data[
|
330
|
-
alert.sender = RCAP.strip_if_given(alert_yaml_data[
|
331
|
-
alert.sent = RCAP.parse_datetime(alert_yaml_data[
|
332
|
-
alert.status = RCAP.strip_if_given(alert_yaml_data[
|
333
|
-
alert.msg_type = RCAP.strip_if_given(alert_yaml_data[
|
334
|
-
alert.source = RCAP.strip_if_given(alert_yaml_data[
|
335
|
-
alert.scope = RCAP.strip_if_given(alert_yaml_data[
|
336
|
-
alert.restriction = RCAP.strip_if_given(alert_yaml_data[
|
337
|
-
Array(alert_yaml_data[
|
326
|
+
alert.identifier = RCAP.strip_if_given(alert_yaml_data[IDENTIFIER_YAML])
|
327
|
+
alert.sender = RCAP.strip_if_given(alert_yaml_data[SENDER_YAML])
|
328
|
+
alert.sent = RCAP.parse_datetime(alert_yaml_data[SENT_YAML])
|
329
|
+
alert.status = RCAP.strip_if_given(alert_yaml_data[STATUS_YAML])
|
330
|
+
alert.msg_type = RCAP.strip_if_given(alert_yaml_data[MSG_TYPE_YAML])
|
331
|
+
alert.source = RCAP.strip_if_given(alert_yaml_data[SOURCE_YAML])
|
332
|
+
alert.scope = RCAP.strip_if_given(alert_yaml_data[SCOPE_YAML])
|
333
|
+
alert.restriction = RCAP.strip_if_given(alert_yaml_data[RESTRICTION_YAML])
|
334
|
+
Array(alert_yaml_data[ADDRESSES_YAML]).each do |address|
|
338
335
|
alert.addresses << address.strip
|
339
336
|
end
|
340
|
-
Array(alert_yaml_data[
|
337
|
+
Array(alert_yaml_data[CODES_YAML]).each do |code|
|
341
338
|
alert.codes << code.strip
|
342
339
|
end
|
343
|
-
alert.note
|
344
|
-
Array(alert_yaml_data[
|
340
|
+
alert.note = alert_yaml_data[NOTE_YAML]
|
341
|
+
Array(alert_yaml_data[REFERENCES_YAML]).each do |reference|
|
345
342
|
alert.references << reference.strip
|
346
343
|
end
|
347
|
-
Array(alert_yaml_data[
|
344
|
+
Array(alert_yaml_data[INCIDENTS_YAML]).each do |incident|
|
348
345
|
alert.incidents << incident.strip
|
349
346
|
end
|
350
|
-
Array(alert_yaml_data[
|
347
|
+
Array(alert_yaml_data[INFOS_YAML]).each do |info_yaml_data|
|
351
348
|
alert.infos << alert.info_class.from_yaml_data(info_yaml_data)
|
352
349
|
end
|
353
350
|
end
|
@@ -387,7 +384,7 @@ module RCAP
|
|
387
384
|
[NOTE_KEY, @note],
|
388
385
|
[REFERENCES_KEY, @references],
|
389
386
|
[INCIDENTS_KEY, @incidents],
|
390
|
-
[INFOS_KEY, @infos.map
|
387
|
+
[INFOS_KEY, @infos.map(&:to_h)])
|
391
388
|
end
|
392
389
|
|
393
390
|
# Initialises an Alert object from a Hash produced by Alert#to_h
|
@@ -404,22 +401,22 @@ module RCAP
|
|
404
401
|
alert.source = RCAP.strip_if_given(alert_hash[SOURCE_KEY])
|
405
402
|
alert.scope = RCAP.strip_if_given(alert_hash[SCOPE_KEY])
|
406
403
|
alert.restriction = RCAP.strip_if_given(alert_hash[RESTRICTION_KEY])
|
407
|
-
Array(alert_hash[
|
404
|
+
Array(alert_hash[ADDRESSES_KEY]).each do |address|
|
408
405
|
alert.addresses << address.strip
|
409
406
|
end
|
410
|
-
Array(alert_hash[
|
407
|
+
Array(alert_hash[CODES_KEY]).each do |code|
|
411
408
|
alert.codes << code.strip
|
412
409
|
end
|
413
|
-
alert.note = alert_hash[
|
414
|
-
Array(alert_hash[
|
410
|
+
alert.note = alert_hash[NOTE_KEY]
|
411
|
+
Array(alert_hash[REFERENCES_KEY]).each do |reference|
|
415
412
|
alert.references << reference.strip
|
416
413
|
end
|
417
414
|
|
418
|
-
Array(alert_hash[
|
415
|
+
Array(alert_hash[INCIDENTS_KEY]).each do |incident|
|
419
416
|
alert.incidents << incident.strip
|
420
417
|
end
|
421
418
|
|
422
|
-
Array(alert_hash[
|
419
|
+
Array(alert_hash[INFOS_KEY]).each do |info_hash|
|
423
420
|
alert.infos << alert.info_class.from_h(info_hash)
|
424
421
|
end
|
425
422
|
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
|
@@ -21,17 +23,26 @@ module RCAP
|
|
21
23
|
yield(self) if block_given?
|
22
24
|
end
|
23
25
|
|
26
|
+
# Returns GeoJSON representation of the circle in the form of a Point
|
27
|
+
# with radius property
|
28
|
+
def to_geojson
|
29
|
+
{ 'type' => 'Feature',
|
30
|
+
'geometry' => { 'type' => 'Point',
|
31
|
+
'coordinates' => [@longitude, @lattitude] },
|
32
|
+
'properties' => { 'radius' => @radius } }.to_json
|
33
|
+
end
|
34
|
+
|
24
35
|
# Returns a string representation of the circle of the form
|
25
36
|
# lattitude,longitude radius
|
26
37
|
#
|
27
38
|
# @return [String]
|
28
39
|
def to_s
|
29
|
-
"#{
|
40
|
+
"#{@lattitude},#{@longitude} #{@radius}"
|
30
41
|
end
|
31
42
|
|
32
43
|
# @return [String]
|
33
44
|
def inspect
|
34
|
-
"(#{
|
45
|
+
"(#{self})"
|
35
46
|
end
|
36
47
|
|
37
48
|
# @return [REXML::Element]
|
@@ -54,7 +65,7 @@ module RCAP
|
|
54
65
|
def self.parse_circle_string(circle_string)
|
55
66
|
coordinates, radius = circle_string.split(' ')
|
56
67
|
lattitude, longitude = coordinates.split(',')
|
57
|
-
[lattitude, longitude, radius].map
|
68
|
+
[lattitude, longitude, radius].map(&:to_f)
|
58
69
|
end
|
59
70
|
|
60
71
|
# @param [REXML::Element] circle_xml_element
|
@@ -82,7 +93,7 @@ module RCAP
|
|
82
93
|
end
|
83
94
|
end
|
84
95
|
|
85
|
-
RADIUS_KEY
|
96
|
+
RADIUS_KEY = 'radius'
|
86
97
|
# @return [Hash]
|
87
98
|
def to_h
|
88
99
|
RCAP.attribute_values_to_hash([RADIUS_KEY, @radius],
|