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.
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],