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
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
|
|
@@ -195,27 +197,27 @@ module RCAP
|
|
195
197
|
# @return [REXML::Element]
|
196
198
|
def to_xml_element
|
197
199
|
xml_element = REXML::Element.new(XML_ELEMENT_NAME)
|
198
|
-
xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language) if @language
|
200
|
+
xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language.to_s) if @language
|
199
201
|
@categories.each do |category|
|
200
|
-
xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category)
|
202
|
+
xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category.to_s)
|
201
203
|
end
|
202
|
-
xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event)
|
203
|
-
xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency)
|
204
|
-
xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity)
|
205
|
-
xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty)
|
206
|
-
xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience) if @audience
|
204
|
+
xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event.to_s)
|
205
|
+
xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency.to_s)
|
206
|
+
xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity.to_s)
|
207
|
+
xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty.to_s)
|
208
|
+
xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience.to_s) if @audience
|
207
209
|
@event_codes.each do |event_code|
|
208
210
|
xml_element.add_element(event_code.to_xml_element)
|
209
211
|
end
|
210
|
-
xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap)
|
211
|
-
xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap)
|
212
|
-
xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap)
|
213
|
-
xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name) if @sender_name
|
214
|
-
xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline) if @headline
|
215
|
-
xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description) if @description
|
216
|
-
xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction) if @instruction
|
217
|
-
xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web) if @web
|
218
|
-
xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact) if @contact
|
212
|
+
xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
|
213
|
+
xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
|
214
|
+
xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
|
215
|
+
xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name.to_s) if @sender_name
|
216
|
+
xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline.to_s) if @headline
|
217
|
+
xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description.to_s) if @description
|
218
|
+
xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction.to_s) if @instruction
|
219
|
+
xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web.to_s) if @web
|
220
|
+
xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact.to_s) if @contact
|
219
221
|
@parameters.each do |parameter|
|
220
222
|
xml_element.add_element(parameter.to_xml_element)
|
221
223
|
end
|
@@ -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
|
data/lib/rcap/base/parameter.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module Base
|
3
5
|
class Parameter
|
@@ -14,9 +16,9 @@ module RCAP
|
|
14
16
|
NAME_ELEMENT_NAME = 'valueName'
|
15
17
|
VALUE_ELEMENT_NAME = 'value'
|
16
18
|
|
17
|
-
XPATH = "cap:#{
|
18
|
-
NAME_XPATH = "cap:#{
|
19
|
-
VALUE_XPATH = "cap:#{
|
19
|
+
XPATH = "cap:#{XML_ELEMENT_NAME}"
|
20
|
+
NAME_XPATH = "cap:#{NAME_ELEMENT_NAME}"
|
21
|
+
VALUE_XPATH = "cap:#{VALUE_ELEMENT_NAME}"
|
20
22
|
|
21
23
|
# @param [Hash] attributes
|
22
24
|
# @option attributes [Symbol] :name Parameter name
|
@@ -28,8 +30,8 @@ module RCAP
|
|
28
30
|
# @return [REXML::Element]
|
29
31
|
def to_xml_element
|
30
32
|
xml_element = REXML::Element.new(self.class::XML_ELEMENT_NAME)
|
31
|
-
xml_element.add_element(self.class::NAME_ELEMENT_NAME).add_text(@name)
|
32
|
-
xml_element.add_element(self.class::VALUE_ELEMENT_NAME).add_text(@value)
|
33
|
+
xml_element.add_element(self.class::NAME_ELEMENT_NAME).add_text(@name.to_s)
|
34
|
+
xml_element.add_element(self.class::VALUE_ELEMENT_NAME).add_text(@value.to_s)
|
33
35
|
xml_element
|
34
36
|
end
|
35
37
|
|
@@ -40,7 +42,7 @@ module RCAP
|
|
40
42
|
|
41
43
|
# @return [String]
|
42
44
|
def inspect
|
43
|
-
"#{
|
45
|
+
"#{@name}: #{@value}"
|
44
46
|
end
|
45
47
|
|
46
48
|
# Returns a string representation of the parameter of the form
|
data/lib/rcap/base/point.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module Base
|
3
5
|
class Point
|
@@ -29,7 +31,7 @@ module RCAP
|
|
29
31
|
#
|
30
32
|
# @return [String]
|
31
33
|
def to_s
|
32
|
-
"#{
|
34
|
+
"#{lattitude},#{longitude}"
|
33
35
|
end
|
34
36
|
|
35
37
|
# @return [String]
|
@@ -68,7 +70,7 @@ module RCAP
|
|
68
70
|
|
69
71
|
# @return [Array(Numeric, Numeric)]
|
70
72
|
def to_a
|
71
|
-
|
73
|
+
[].tap do |array|
|
72
74
|
array[LATTITUDE_INDEX] = lattitude
|
73
75
|
array[LONGITUDE_INDEX] = longitude
|
74
76
|
end
|
data/lib/rcap/base/polygon.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module Base
|
3
5
|
class Polygon
|
@@ -7,16 +9,16 @@ module RCAP
|
|
7
9
|
attr_reader(:points)
|
8
10
|
|
9
11
|
validates_collection_of(:points)
|
10
|
-
validates_length_of(:points, minimum: 3)
|
11
|
-
validates_equality_of_first_and_last(:points)
|
12
|
+
validates_length_of(:points, minimum: 3, allow_blank: true)
|
13
|
+
validates_equality_of_first_and_last(:points, allow_empty: true)
|
12
14
|
|
13
15
|
XML_ELEMENT_NAME = 'polygon'
|
14
|
-
XPATH = "cap:#{
|
16
|
+
XPATH = "cap:#{XML_ELEMENT_NAME}"
|
15
17
|
|
16
18
|
# @param [Hash] attributes
|
17
19
|
# @option attributes [Array<Point>] :points Collection of {Point} objects
|
18
20
|
def initialize
|
19
|
-
@points =
|
21
|
+
@points = []
|
20
22
|
yield(self) if block_given?
|
21
23
|
end
|
22
24
|
|
@@ -27,6 +29,12 @@ module RCAP
|
|
27
29
|
point
|
28
30
|
end
|
29
31
|
|
32
|
+
# Returns GeoJSON representation of the polygon
|
33
|
+
def to_geojson
|
34
|
+
coordinates = @points.map { |point| [point.longitude, point.lattitude] }
|
35
|
+
{ 'type' => 'Polygon', 'coordinates' => [coordinates] }.to_json
|
36
|
+
end
|
37
|
+
|
30
38
|
# Returns a string representation of the polygon of the form
|
31
39
|
# points[0] points[1] points[2] ...
|
32
40
|
# where each point is formatted with Point#to_s
|
@@ -36,7 +44,7 @@ module RCAP
|
|
36
44
|
|
37
45
|
# @return [String]
|
38
46
|
def inspect
|
39
|
-
"(#{
|
47
|
+
"(#{@points.map(&:inspect).join(', ')})"
|
40
48
|
end
|
41
49
|
|
42
50
|
# @return [REXML::Element]
|
@@ -77,7 +85,7 @@ module RCAP
|
|
77
85
|
|
78
86
|
# @return [Array<Array(Numeric,Numeric)>]
|
79
87
|
def self.parse_polygon_string(polygon_string)
|
80
|
-
polygon_string.split(' ').map { |coordinate_string| coordinate_string.split(',').map
|
88
|
+
polygon_string.split(' ').map { |coordinate_string| coordinate_string.split(',').map(&:to_f) }
|
81
89
|
end
|
82
90
|
|
83
91
|
# @return [Polygon]
|
@@ -102,7 +110,7 @@ module RCAP
|
|
102
110
|
to_yaml_data.to_yaml(options)
|
103
111
|
end
|
104
112
|
|
105
|
-
POINTS_KEY
|
113
|
+
POINTS_KEY = 'points'
|
106
114
|
|
107
115
|
# @return [Polygon]
|
108
116
|
def self.from_h(polygon_hash)
|
@@ -118,7 +126,7 @@ module RCAP
|
|
118
126
|
|
119
127
|
# @return [Hash]
|
120
128
|
def to_h
|
121
|
-
{ POINTS_KEY => @points.map
|
129
|
+
{ POINTS_KEY => @points.map(&:to_a) }
|
122
130
|
end
|
123
131
|
end
|
124
132
|
end
|
data/lib/rcap/base/resource.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module Base
|
3
5
|
class Resource
|
@@ -23,12 +25,12 @@ module RCAP
|
|
23
25
|
DIGEST_ELEMENT_NAME = 'digest'
|
24
26
|
RESOURCE_DESC_ELEMENT_NAME = 'resourceDesc'
|
25
27
|
|
26
|
-
XPATH = "cap:#{
|
27
|
-
MIME_TYPE_XPATH = "cap:#{
|
28
|
-
SIZE_XPATH = "cap:#{
|
29
|
-
URI_XPATH = "cap:#{
|
30
|
-
DIGEST_XPATH = "cap:#{
|
31
|
-
RESOURCE_DESC_XPATH = "cap:#{
|
28
|
+
XPATH = "cap:#{XML_ELEMENT_NAME}"
|
29
|
+
MIME_TYPE_XPATH = "cap:#{MIME_TYPE_ELEMENT_NAME}"
|
30
|
+
SIZE_XPATH = "cap:#{SIZE_ELEMENT_NAME}"
|
31
|
+
URI_XPATH = "cap:#{URI_ELEMENT_NAME}"
|
32
|
+
DIGEST_XPATH = "cap:#{DIGEST_ELEMENT_NAME}"
|
33
|
+
RESOURCE_DESC_XPATH = "cap:#{RESOURCE_DESC_ELEMENT_NAME}"
|
32
34
|
|
33
35
|
# @param [Hash{Symbol => Object}] attributes
|
34
36
|
# @option attributes [String] :mime_type
|
@@ -44,10 +46,10 @@ module RCAP
|
|
44
46
|
def to_xml_element
|
45
47
|
xml_element = REXML::Element.new(XML_ELEMENT_NAME)
|
46
48
|
xml_element.add_element(RESOURCE_DESC_ELEMENT_NAME).add_text(@resource_desc)
|
47
|
-
xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type) if @mime_type
|
48
|
-
xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s)
|
49
|
-
xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri) if @uri
|
50
|
-
xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest) if @digest
|
49
|
+
xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type.to_s) if @mime_type
|
50
|
+
xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s) if @size
|
51
|
+
xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri.to_s) if @uri
|
52
|
+
xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest.to_s) if @digest
|
51
53
|
xml_element
|
52
54
|
end
|
53
55
|
|
@@ -86,9 +88,7 @@ module RCAP
|
|
86
88
|
# If size is defined returns the size in kilobytes
|
87
89
|
# @return [Float]
|
88
90
|
def size_in_kb
|
89
|
-
if @size
|
90
|
-
@size.to_f / 1024
|
91
|
-
end
|
91
|
+
@size.to_f / 1024 if @size
|
92
92
|
end
|
93
93
|
|
94
94
|
# @return [String]
|