rcap 2.5.0 → 2.7.4
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 -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],
|