rcap 2.5.0 → 2.7.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +18 -0
  4. data/README.md +1 -0
  5. data/lib/rcap.rb +3 -1
  6. data/lib/rcap/alert.rb +4 -2
  7. data/lib/rcap/base/alert.rb +70 -73
  8. data/lib/rcap/base/area.rb +19 -13
  9. data/lib/rcap/base/circle.rb +15 -4
  10. data/lib/rcap/base/event_code.rb +2 -0
  11. data/lib/rcap/base/geocode.rb +2 -0
  12. data/lib/rcap/base/info.rb +81 -75
  13. data/lib/rcap/base/parameter.rb +8 -6
  14. data/lib/rcap/base/point.rb +4 -2
  15. data/lib/rcap/base/polygon.rb +16 -8
  16. data/lib/rcap/base/resource.rb +13 -13
  17. data/lib/rcap/cap_1_0/alert.rb +36 -39
  18. data/lib/rcap/cap_1_0/area.rb +2 -0
  19. data/lib/rcap/cap_1_0/circle.rb +2 -0
  20. data/lib/rcap/cap_1_0/event_code.rb +3 -1
  21. data/lib/rcap/cap_1_0/geocode.rb +3 -1
  22. data/lib/rcap/cap_1_0/info.rb +3 -1
  23. data/lib/rcap/cap_1_0/parameter.rb +3 -2
  24. data/lib/rcap/cap_1_0/point.rb +2 -0
  25. data/lib/rcap/cap_1_0/polygon.rb +3 -1
  26. data/lib/rcap/cap_1_0/resource.rb +2 -0
  27. data/lib/rcap/cap_1_1/alert.rb +4 -2
  28. data/lib/rcap/cap_1_1/area.rb +2 -0
  29. data/lib/rcap/cap_1_1/circle.rb +2 -0
  30. data/lib/rcap/cap_1_1/event_code.rb +3 -1
  31. data/lib/rcap/cap_1_1/geocode.rb +3 -1
  32. data/lib/rcap/cap_1_1/info.rb +48 -46
  33. data/lib/rcap/cap_1_1/parameter.rb +2 -1
  34. data/lib/rcap/cap_1_1/point.rb +2 -0
  35. data/lib/rcap/cap_1_1/polygon.rb +3 -1
  36. data/lib/rcap/cap_1_1/resource.rb +12 -11
  37. data/lib/rcap/cap_1_2/alert.rb +4 -2
  38. data/lib/rcap/cap_1_2/area.rb +2 -0
  39. data/lib/rcap/cap_1_2/circle.rb +2 -0
  40. data/lib/rcap/cap_1_2/event_code.rb +3 -1
  41. data/lib/rcap/cap_1_2/geocode.rb +3 -1
  42. data/lib/rcap/cap_1_2/info.rb +55 -51
  43. data/lib/rcap/cap_1_2/parameter.rb +2 -1
  44. data/lib/rcap/cap_1_2/point.rb +2 -0
  45. data/lib/rcap/cap_1_2/polygon.rb +4 -2
  46. data/lib/rcap/cap_1_2/resource.rb +14 -12
  47. data/lib/rcap/config.rb +2 -0
  48. data/lib/rcap/custom_validators.rb +30 -27
  49. data/lib/rcap/extensions/array.rb +2 -0
  50. data/lib/rcap/extensions/date.rb +3 -1
  51. data/lib/rcap/extensions/date_time.rb +4 -1
  52. data/lib/rcap/extensions/float.rb +2 -0
  53. data/lib/rcap/extensions/integer.rb +7 -0
  54. data/lib/rcap/extensions/nil_class.rb +2 -0
  55. data/lib/rcap/extensions/string.rb +3 -1
  56. data/lib/rcap/extensions/time.rb +3 -0
  57. data/lib/rcap/formatters/yaml.rb +5 -0
  58. data/lib/rcap/info.rb +2 -0
  59. data/lib/rcap/utilities.rb +8 -10
  60. data/lib/rcap/validation.rb +19 -14
  61. data/lib/rcap/version.rb +3 -1
  62. data/rcap.gemspec +5 -5
  63. data/spec/alert_spec.rb +8 -9
  64. data/spec/cap_1_0/alert_spec.rb +4 -5
  65. data/spec/cap_1_0/area_spec.rb +7 -10
  66. data/spec/cap_1_0/circle_spec.rb +9 -0
  67. data/spec/cap_1_0/event_code_spec.rb +1 -1
  68. data/spec/cap_1_0/geocode_spec.rb +1 -1
  69. data/spec/cap_1_0/info_spec.rb +38 -38
  70. data/spec/cap_1_0/polygon_spec.rb +7 -5
  71. data/spec/cap_1_0/resource_spec.rb +6 -7
  72. data/spec/cap_1_1/alert_spec.rb +6 -7
  73. data/spec/cap_1_1/area_spec.rb +6 -8
  74. data/spec/cap_1_1/circle_spec.rb +9 -0
  75. data/spec/cap_1_1/info_spec.rb +26 -26
  76. data/spec/cap_1_1/parameter_spec.rb +1 -2
  77. data/spec/cap_1_1/polygon_spec.rb +12 -10
  78. data/spec/cap_1_1/resource_spec.rb +13 -13
  79. data/spec/cap_1_2/alert_spec.rb +7 -8
  80. data/spec/cap_1_2/area_spec.rb +6 -6
  81. data/spec/cap_1_2/circle_spec.rb +9 -0
  82. data/spec/cap_1_2/info_spec.rb +25 -26
  83. data/spec/cap_1_2/polygon_spec.rb +8 -0
  84. data/spec/cap_1_2/resource_spec.rb +13 -13
  85. data/spec/extensions_spec.rb +2 -2
  86. data/spec/spec_helper.rb +2 -2
  87. data/spec/validations_spec.rb +0 -1
  88. metadata +15 -15
  89. data/lib/rcap/extensions/fixnum.rb +0 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 2b2493782c58861730c554776d6e5848e9b15728
4
- data.tar.gz: ab89552659a96fc8130ff839734c61a255403030
2
+ SHA256:
3
+ metadata.gz: 257bbebf78d6bd1acba243fff3c24b7d52504f32acd494e395102c5a25f0108a
4
+ data.tar.gz: 4aad2a1c2a79a997a46e8a47f7542aa6eae55881302a76be9c8fe9bedf44965a
5
5
  SHA512:
6
- metadata.gz: c27d24fa3f957feb2f36ef8400d33a741c6e163ab79508a7c614f5dbaf7daf051bc81072132c04f985c31529fef475676165dddd4a386df5dc96b3e249e8cf00
7
- data.tar.gz: d220753d7b59abb718ce149ba7e25fe74e12bd7bf0b73b9b3f8e0170a801d0d476ba596ec66c879eb3d5051268e371c3d8ba6e97fa55b0ab6ce130fa1c9dc15d
6
+ metadata.gz: 7274c4ad7f92bc6c9df731880ba73d77b8a11ba39f250ad6844fe8f2a3e044b8fbf35ec819ad64a0cc473c493a0b5f39df07361a52364af38ded56217817ce4d
7
+ data.tar.gz: a8d8e973dc56197011383b83f7923cb5856cdc5da32152bfd4929ad0e860add185be4389fda09f106482f25a58f00f5aa5e15567e4931a971078a795ddd54018
@@ -0,0 +1 @@
1
+ 2.7.1
@@ -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
@@ -156,6 +156,7 @@ Authors
156
156
 
157
157
  * Earle Clubb - http://github.com/eclubb
158
158
  * David van Geest - https://github.com/DWvanGeest
159
+ * Seth Deckard - https://github.com/sethdeckard
159
160
 
160
161
  Change Log
161
162
  ----------
@@ -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/fixnum'
16
+ require 'rcap/extensions/integer'
15
17
  require 'rcap/extensions/float'
16
18
  require 'rcap/extensions/array'
17
19
  require 'rcap/extensions/string'
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Alert
3
5
  XMLNS_KEY = 'xmlns'
4
6
  YAML_CAP_VERSION_KEY = 'CAP Version'
5
7
  JSON_CAP_VERSION_KEY = 'cap_version'
6
8
 
7
- CAP_NAMESPACES = [RCAP::CAP_1_0::Alert::XMLNS, RCAP::CAP_1_1::Alert::XMLNS, RCAP::CAP_1_2::Alert::XMLNS]
9
+ CAP_NAMESPACES = [RCAP::CAP_1_0::Alert::XMLNS, RCAP::CAP_1_1::Alert::XMLNS, RCAP::CAP_1_2::Alert::XMLNS].freeze
8
10
 
9
11
  # Initialise a RCAP Alert from a XML document.
10
12
  #
@@ -36,7 +38,7 @@ module RCAP
36
38
  # @param [IO, String] yaml CAP Alert in YAML format. Can be a String or any IO object.
37
39
  # @return [RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
38
40
  def self.from_yaml(yaml)
39
- yaml_data = YAML.load(yaml)
41
+ yaml_data = YAML.safe_load(yaml, [Time, DateTime])
40
42
 
41
43
  case yaml_data[YAML_CAP_VERSION_KEY]
42
44
  when CAP_1_0::Alert::CAP_VERSION
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Alert
@@ -8,7 +10,7 @@ module RCAP
8
10
  STATUS_SYSTEM = 'System'
9
11
  STATUS_TEST = 'Test'
10
12
  # Valid values for status
11
- VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST]
13
+ VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST].freeze
12
14
 
13
15
  MSG_TYPE_ALERT = 'Alert'
14
16
  MSG_TYPE_UPDATE = 'Update'
@@ -16,13 +18,13 @@ module RCAP
16
18
  MSG_TYPE_ACK = 'Ack'
17
19
  MSG_TYPE_ERROR = 'Error'
18
20
  # Valid values for msg_type
19
- VALID_MSG_TYPES = [MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR]
21
+ VALID_MSG_TYPES = [MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR].freeze
20
22
 
21
23
  SCOPE_PUBLIC = 'Public'
22
24
  SCOPE_RESTRICTED = 'Restricted'
23
25
  SCOPE_PRIVATE = 'Private'
24
26
  # Valid values for scope
25
- VALID_SCOPES = [SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED]
27
+ VALID_SCOPES = [SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED].freeze
26
28
 
27
29
  # @return [String] If not set a UUID will be set by default on object initialisation
28
30
  attr_accessor(:identifier)
@@ -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) if @sent
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
- "#{ @sender },#{ @identifier },#{ RCAP.to_s_for_cap(@sent)}"
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: #{ self.class::CAP_VERSION }",
184
- "Identifier: #{ @identifier }",
185
- "Sender: #{ @sender }",
186
- "Sent: #{ @sent }",
187
- "Status: #{ @status }",
188
- "Message Type: #{ @msg_type }",
189
- "Source: #{ @source }",
190
- "Scope: #{ @scope }",
191
- "Restriction: #{ @restriction }",
192
- "Addresses: #{ @addresses.to_s_for_cap }",
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: #{ @note }",
196
- "References: #{ @references.join(' ')}",
197
- "Incidents: #{ @incidents.join(' ')}",
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
- "#{ @sender }/#{ @identifier }/#{ RCAP.to_s_for_cap(@sent)}"
206
+ "#{@sender}/#{@identifier}/#{RCAP.to_s_for_cap(@sent)}"
210
207
  end
211
208
 
212
209
  XPATH = 'cap:alert'
213
- IDENTIFIER_XPATH = "cap:#{ IDENTIFIER_ELEMENT_NAME }"
214
- SENDER_XPATH = "cap:#{ SENDER_ELEMENT_NAME }"
215
- SENT_XPATH = "cap:#{ SENT_ELEMENT_NAME }"
216
- STATUS_XPATH = "cap:#{ STATUS_ELEMENT_NAME }"
217
- MSG_TYPE_XPATH = "cap:#{ MSG_TYPE_ELEMENT_NAME }"
218
- SOURCE_XPATH = "cap:#{ SOURCE_ELEMENT_NAME }"
219
- SCOPE_XPATH = "cap:#{ SCOPE_ELEMENT_NAME }"
220
- RESTRICTION_XPATH = "cap:#{ RESTRICTION_ELEMENT_NAME }"
221
- ADDRESSES_XPATH = "cap:#{ ADDRESSES_ELEMENT_NAME }"
222
- CODE_XPATH = "cap:#{ CODE_ELEMENT_NAME }"
223
- NOTE_XPATH = "cap:#{ NOTE_ELEMENT_NAME }"
224
- REFERENCES_XPATH = "cap:#{ REFERENCES_ELEMENT_NAME }"
225
- INCIDENTS_XPATH = "cap:#{ INCIDENTS_ELEMENT_NAME }"
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.load(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[ IDENTIFIER_YAML])
330
- alert.sender = RCAP.strip_if_given(alert_yaml_data[ SENDER_YAML])
331
- alert.sent = RCAP.parse_datetime(alert_yaml_data[ SENT_YAML])
332
- alert.status = RCAP.strip_if_given(alert_yaml_data[ STATUS_YAML])
333
- alert.msg_type = RCAP.strip_if_given(alert_yaml_data[ MSG_TYPE_YAML])
334
- alert.source = RCAP.strip_if_given(alert_yaml_data[ SOURCE_YAML])
335
- alert.scope = RCAP.strip_if_given(alert_yaml_data[ SCOPE_YAML])
336
- alert.restriction = RCAP.strip_if_given(alert_yaml_data[ RESTRICTION_YAML])
337
- Array(alert_yaml_data[ ADDRESSES_YAML]).each do |address|
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[ CODES_YAML]).each do |code|
337
+ Array(alert_yaml_data[CODES_YAML]).each do |code|
341
338
  alert.codes << code.strip
342
339
  end
343
- alert.note = alert_yaml_data[ NOTE_YAML]
344
- Array(alert_yaml_data[ REFERENCES_YAML]).each do |reference|
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[ INCIDENTS_YAML]).each do |incident|
344
+ Array(alert_yaml_data[INCIDENTS_YAML]).each do |incident|
348
345
  alert.incidents << incident.strip
349
346
  end
350
- Array(alert_yaml_data[ INFOS_YAML]).each do |info_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 { |info| info.to_h }])
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[ ADDRESSES_KEY]).each do |address|
404
+ Array(alert_hash[ADDRESSES_KEY]).each do |address|
408
405
  alert.addresses << address.strip
409
406
  end
410
- Array(alert_hash[ CODES_KEY]).each do |code|
407
+ Array(alert_hash[CODES_KEY]).each do |code|
411
408
  alert.codes << code.strip
412
409
  end
413
- alert.note = alert_hash[ NOTE_KEY]
414
- Array(alert_hash[ REFERENCES_KEY]).each do |reference|
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[ INCIDENTS_KEY]).each do |incident|
415
+ Array(alert_hash[INCIDENTS_KEY]).each do |incident|
419
416
  alert.incidents << incident.strip
420
417
  end
421
418
 
422
- Array(alert_hash[ INFOS_KEY]).each do |info_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
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Area
@@ -25,10 +27,10 @@ module RCAP
25
27
  ALTITUDE_ELEMENT_NAME = 'altitude'
26
28
  CEILING_ELEMENT_NAME = 'ceiling'
27
29
 
28
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
29
- AREA_DESC_XPATH = "cap:#{ AREA_DESC_ELEMENT_NAME }"
30
- ALTITUDE_XPATH = "cap:#{ ALTITUDE_ELEMENT_NAME }"
31
- CEILING_XPATH = "cap:#{ CEILING_ELEMENT_NAME }"
30
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
31
+ AREA_DESC_XPATH = "cap:#{AREA_DESC_ELEMENT_NAME}"
32
+ ALTITUDE_XPATH = "cap:#{ALTITUDE_ELEMENT_NAME}"
33
+ CEILING_XPATH = "cap:#{CEILING_ELEMENT_NAME}"
32
34
 
33
35
  # @example
34
36
  # Area.new do |area|
@@ -121,16 +123,16 @@ module RCAP
121
123
  # @param [Area] other Area object to compare
122
124
  # @return [true,false]
123
125
  def ==(other)
124
- comparison_attributes = lambda { |area| [area.area_desc, area.altitude, area.ceiling, area.circles, area.geocodes, area.polygons] }
126
+ comparison_attributes = ->(area) { [area.area_desc, area.altitude, area.ceiling, area.circles, area.geocodes, area.polygons] }
125
127
  comparison_attributes.call(self) == comparison_attributes.call(other)
126
128
  end
127
129
 
128
130
  # @return [String]
129
131
  def inspect
130
- area_inspect = "Area Description: #{ @area_desc }\n"\
131
- "Polygons:\n" + @polygons.map { |polygon| ' ' + polygon.inspect }.join("\n") + "\n"\
132
- "Circles: #{ @circles.inspect }\n"\
133
- "Geocodes: #{ @geocodes.inspect }\n"
132
+ area_inspect = "Area Description: #{@area_desc}\n"\
133
+ "Polygons:\n" + @polygons.map { |polygon| ' ' + polygon.inspect }.join("\n") + "\n"\
134
+ "Circles: #{@circles.inspect}\n"\
135
+ "Geocodes: #{@geocodes.inspect}\n"
134
136
  RCAP.format_lines_for_inspect('AREA', area_inspect)
135
137
  end
136
138
 
@@ -153,7 +155,7 @@ module RCAP
153
155
  RCAP.attribute_values_to_hash([AREA_DESC_YAML, @area_desc],
154
156
  [ALTITUDE_YAML, @altitude],
155
157
  [CEILING_YAML, @ceiling],
156
- [CIRCLES_YAML, @circles.map { |circle| circle.to_a }],
158
+ [CIRCLES_YAML, @circles.map(&:to_a)],
157
159
  [GEOCODES_YAML, @geocodes.reduce({}) { |h, geocode| h.merge(geocode.name => geocode.value) }],
158
160
  [POLYGONS_YAML, @polygons.map(&:to_yaml_data)])
159
161
  end
@@ -222,9 +224,13 @@ module RCAP
222
224
  RCAP.attribute_values_to_hash([AREA_DESC_KEY, @area_desc],
223
225
  [ALTITUDE_KEY, @altitude],
224
226
  [CEILING_KEY, @ceiling],
225
- [CIRCLES_KEY, @circles.map { |circle| circle.to_a }],
226
- [GEOCODES_KEY, @geocodes.map { |geocode| geocode.to_h }],
227
- [POLYGONS_KEY, @polygons.map { |polygon| polygon.to_h }])
227
+ [CIRCLES_KEY, @circles.map(&:to_a)],
228
+ [GEOCODES_KEY, @geocodes.map(&:to_h)],
229
+ [POLYGONS_KEY, @polygons.map(&:to_h)])
230
+ end
231
+
232
+ def map_data?
233
+ @circles.any? || @polygons.any?
228
234
  end
229
235
  end
230
236
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Circle < Point
@@ -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
- "#{ @lattitude },#{ @longitude } #{ @radius }"
40
+ "#{@lattitude},#{@longitude} #{@radius}"
30
41
  end
31
42
 
32
43
  # @return [String]
33
44
  def inspect
34
- "(#{ self })"
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 { |e| e.to_f }
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 = 'radius'
96
+ RADIUS_KEY = 'radius'
86
97
  # @return [Hash]
87
98
  def to_h
88
99
  RCAP.attribute_values_to_hash([RADIUS_KEY, @radius],