rcap 2.4.1 → 2.7.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.ruby-version +1 -0
- data/CHANGELOG.md +18 -0
- data/README.md +1 -0
- data/lib/rcap.rb +3 -1
- data/lib/rcap/alert.rb +30 -29
- data/lib/rcap/base/alert.rb +208 -205
- data/lib/rcap/base/area.rb +95 -91
- data/lib/rcap/base/circle.rb +45 -34
- data/lib/rcap/base/event_code.rb +2 -0
- data/lib/rcap/base/geocode.rb +2 -0
- data/lib/rcap/base/info.rb +273 -272
- data/lib/rcap/base/parameter.rb +29 -28
- data/lib/rcap/base/point.rb +26 -24
- data/lib/rcap/base/polygon.rb +43 -35
- data/lib/rcap/base/resource.rb +65 -65
- data/lib/rcap/cap_1_0/alert.rb +85 -86
- data/lib/rcap/cap_1_0/area.rb +2 -2
- data/lib/rcap/cap_1_0/circle.rb +2 -1
- 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 -3
- data/lib/rcap/cap_1_0/parameter.rb +13 -13
- data/lib/rcap/cap_1_0/point.rb +2 -1
- data/lib/rcap/cap_1_0/polygon.rb +3 -3
- data/lib/rcap/cap_1_0/resource.rb +2 -3
- data/lib/rcap/cap_1_1/alert.rb +6 -6
- data/lib/rcap/cap_1_1/area.rb +2 -2
- data/lib/rcap/cap_1_1/circle.rb +2 -1
- 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 +125 -132
- data/lib/rcap/cap_1_1/parameter.rb +2 -3
- data/lib/rcap/cap_1_1/point.rb +2 -1
- data/lib/rcap/cap_1_1/polygon.rb +3 -3
- data/lib/rcap/cap_1_1/resource.rb +37 -38
- data/lib/rcap/cap_1_2/alert.rb +6 -6
- data/lib/rcap/cap_1_2/area.rb +2 -2
- data/lib/rcap/cap_1_2/circle.rb +2 -1
- 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 +120 -123
- data/lib/rcap/cap_1_2/parameter.rb +2 -3
- data/lib/rcap/cap_1_2/point.rb +2 -1
- data/lib/rcap/cap_1_2/polygon.rb +4 -4
- data/lib/rcap/cap_1_2/resource.rb +38 -38
- data/lib/rcap/config.rb +5 -3
- data/lib/rcap/custom_validators.rb +75 -78
- data/lib/rcap/extensions/array.rb +3 -1
- data/lib/rcap/extensions/date.rb +3 -1
- data/lib/rcap/extensions/date_time.rb +5 -2
- 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 +6 -4
- data/lib/rcap/extensions/time.rb +5 -3
- data/lib/rcap/formatters/yaml.rb +5 -0
- data/lib/rcap/info.rb +6 -5
- data/lib/rcap/utilities.rb +27 -30
- data/lib/rcap/validation.rb +22 -21
- data/lib/rcap/version.rb +3 -1
- data/rcap.gemspec +5 -5
- data/spec/alert_spec.rb +141 -141
- data/spec/cap_1_0/alert_spec.rb +92 -94
- data/spec/cap_1_0/area_spec.rb +86 -86
- data/spec/cap_1_0/circle_spec.rb +48 -39
- data/spec/cap_1_0/event_code_spec.rb +15 -15
- data/spec/cap_1_0/geocode_spec.rb +16 -16
- data/spec/cap_1_0/info_spec.rb +175 -177
- data/spec/cap_1_0/parameter_spec.rb +27 -27
- data/spec/cap_1_0/point_spec.rb +18 -18
- data/spec/cap_1_0/polygon_spec.rb +43 -41
- data/spec/cap_1_0/resource_spec.rb +63 -64
- data/spec/cap_1_1/alert_spec.rb +107 -109
- data/spec/cap_1_1/area_spec.rb +90 -90
- data/spec/cap_1_1/circle_spec.rb +43 -34
- data/spec/cap_1_1/event_code_spec.rb +15 -16
- data/spec/cap_1_1/geocode_spec.rb +16 -16
- data/spec/cap_1_1/info_spec.rb +194 -196
- data/spec/cap_1_1/parameter_spec.rb +17 -17
- data/spec/cap_1_1/point_spec.rb +18 -18
- data/spec/cap_1_1/polygon_spec.rb +43 -41
- data/spec/cap_1_1/resource_spec.rb +106 -107
- data/spec/cap_1_2/alert_spec.rb +98 -99
- data/spec/cap_1_2/area_spec.rb +90 -90
- data/spec/cap_1_2/circle_spec.rb +52 -43
- data/spec/cap_1_2/event_code_spec.rb +19 -20
- data/spec/cap_1_2/geocode_spec.rb +20 -20
- data/spec/cap_1_2/info_spec.rb +196 -198
- data/spec/cap_1_2/parameter_spec.rb +19 -19
- data/spec/cap_1_2/point_spec.rb +21 -21
- data/spec/cap_1_2/polygon_spec.rb +55 -47
- data/spec/cap_1_2/resource_spec.rb +96 -97
- data/spec/extensions_spec.rb +29 -29
- data/spec/info_spec.rb +15 -15
- data/spec/spec_helper.rb +3 -3
- data/spec/validations_spec.rb +73 -73
- metadata +12 -11
- data/lib/rcap/extensions/fixnum.rb +0 -5
data/lib/rcap/cap_1_2/alert.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module CAP_1_2
|
3
|
-
|
4
5
|
# An Alert object is valid if
|
5
6
|
# * it has an identifier
|
6
7
|
# * it has a sender
|
@@ -10,13 +11,12 @@ module RCAP
|
|
10
11
|
# * it has a valid scope value
|
11
12
|
# * all Info objects contained in infos are valid
|
12
13
|
class Alert < RCAP::Base::Alert
|
14
|
+
XMLNS = 'urn:oasis:names:tc:emergency:cap:1.2'
|
15
|
+
CAP_VERSION = '1.2'
|
13
16
|
|
14
|
-
|
15
|
-
CAP_VERSION = "1.2"
|
16
|
-
|
17
|
-
STATUS_DRAFT = "Draft"
|
17
|
+
STATUS_DRAFT = 'Draft'
|
18
18
|
# Valid values for status
|
19
|
-
VALID_STATUSES = [
|
19
|
+
VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT].freeze
|
20
20
|
|
21
21
|
# @return [String]
|
22
22
|
def xmlns
|
data/lib/rcap/cap_1_2/area.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module CAP_1_2
|
3
|
-
|
4
5
|
# An Area object is valid if
|
5
6
|
# * it has an area description
|
6
7
|
# * all Circle objects contained in circles are valid
|
@@ -8,7 +9,6 @@ module RCAP
|
|
8
9
|
# * all Polygon objects contained in polygons are valid
|
9
10
|
# * altitude has a value if ceiling is set
|
10
11
|
class Area < RCAP::Base::Area
|
11
|
-
|
12
12
|
# @return [String]
|
13
13
|
def xmlns
|
14
14
|
Alert::XMLNS
|
data/lib/rcap/cap_1_2/circle.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module CAP_1_2
|
3
5
|
# Subclass of {Parameter}
|
4
6
|
class EventCode < RCAP::Base::EventCode
|
5
7
|
XML_ELEMENT_NAME = 'eventCode'
|
6
|
-
XPATH = "cap:#{
|
8
|
+
XPATH = "cap:#{XML_ELEMENT_NAME}"
|
7
9
|
|
8
10
|
# @return [String]
|
9
11
|
def xmlns
|
data/lib/rcap/cap_1_2/geocode.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module CAP_1_2
|
3
5
|
# Subclass of {Parameter}
|
4
6
|
class Geocode < RCAP::Base::Geocode
|
5
7
|
XML_ELEMENT_NAME = 'geocode'
|
6
|
-
XPATH = "cap:#{
|
8
|
+
XPATH = "cap:#{XML_ELEMENT_NAME}"
|
7
9
|
|
8
10
|
# @return [String]
|
9
11
|
def xmlns
|
data/lib/rcap/cap_1_2/info.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module CAP_1_2
|
3
|
-
|
4
5
|
# In Info object is valid if
|
5
6
|
# * it has an event
|
6
7
|
# * it has an urgency with a valid value
|
@@ -10,31 +11,31 @@ module RCAP
|
|
10
11
|
# * all Resource objects in the resources collection are valid
|
11
12
|
# * all Area objects in the areas collection are valid
|
12
13
|
class Info < RCAP::Base::Info
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
RESPONSE_TYPE_ASSESS
|
20
|
-
|
14
|
+
RESPONSE_TYPE_SHELTER = 'Shelter'
|
15
|
+
RESPONSE_TYPE_EVACUATE = 'Evacuate'
|
16
|
+
RESPONSE_TYPE_PREPARE = 'Prepare'
|
17
|
+
RESPONSE_TYPE_EXECUTE = 'Execute'
|
18
|
+
RESPONSE_TYPE_MONITOR = 'Monitor'
|
19
|
+
RESPONSE_TYPE_AVOID = 'Avoid'
|
20
|
+
RESPONSE_TYPE_ASSESS = 'Assess'
|
21
|
+
RESPONSE_TYPE_ALL_CLEAR = 'AllClear'
|
22
|
+
RESPONSE_TYPE_NONE = 'None'
|
21
23
|
# Valid values for response_type
|
22
|
-
VALID_RESPONSE_TYPES = [
|
23
|
-
|
24
|
+
VALID_RESPONSE_TYPES = [RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE, RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR, RESPONSE_TYPE_AVOID, RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_ALL_CLEAR, RESPONSE_TYPE_NONE].freeze
|
24
25
|
|
25
|
-
CERTAINTY_OBSERVED =
|
26
|
+
CERTAINTY_OBSERVED = 'Observed'
|
26
27
|
# Valid valies for certainty
|
27
|
-
VALID_CERTAINTIES = [
|
28
|
+
VALID_CERTAINTIES = [CERTAINTY_OBSERVED, CERTAINTY_LIKELY, CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN].freeze
|
28
29
|
|
29
30
|
RESPONSE_TYPE_ELEMENT_NAME = 'responseType'
|
30
|
-
RESPONSE_TYPE_XPATH = "cap:#{
|
31
|
+
RESPONSE_TYPE_XPATH = "cap:#{RESPONSE_TYPE_ELEMENT_NAME}"
|
31
32
|
|
32
|
-
validates_length_of(
|
33
|
-
validates_inclusion_of_members_of(
|
34
|
-
validates_inclusion_of(
|
33
|
+
validates_length_of(:categories, minimum: 1)
|
34
|
+
validates_inclusion_of_members_of(:response_types, in: VALID_RESPONSE_TYPES, allow_blank: true)
|
35
|
+
validates_inclusion_of(:certainty, allow_nil: true, in: VALID_CERTAINTIES, message: "can only be assigned the following values: #{VALID_CERTAINTIES.join(', ')}")
|
35
36
|
|
36
37
|
# @return [Array<String>] Collection of textual response types; elements must be from {VALID_RESPONSE_TYPES}
|
37
|
-
attr_reader(
|
38
|
+
attr_reader(:response_types)
|
38
39
|
|
39
40
|
# Initialises a new Info object which will be yielded to an attached block if given
|
40
41
|
#
|
@@ -72,76 +73,72 @@ module RCAP
|
|
72
73
|
|
73
74
|
# @return [REXML::Element]
|
74
75
|
def to_xml_element
|
75
|
-
xml_element = REXML::Element.new(
|
76
|
-
xml_element.add_element(
|
76
|
+
xml_element = REXML::Element.new(XML_ELEMENT_NAME)
|
77
|
+
xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language) if @language
|
77
78
|
@categories.each do |category|
|
78
|
-
xml_element.add_element(
|
79
|
+
xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category)
|
79
80
|
end
|
80
|
-
xml_element.add_element(
|
81
|
+
xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event)
|
81
82
|
@response_types.each do |response_type|
|
82
|
-
xml_element.add_element(
|
83
|
+
xml_element.add_element(RESPONSE_TYPE_ELEMENT_NAME).add_text(response_type)
|
83
84
|
end
|
84
|
-
xml_element.add_element(
|
85
|
-
xml_element.add_element(
|
86
|
-
xml_element.add_element(
|
87
|
-
xml_element.add_element(
|
85
|
+
xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency)
|
86
|
+
xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity)
|
87
|
+
xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty)
|
88
|
+
xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience) if @audience
|
88
89
|
@event_codes.each do |event_code|
|
89
|
-
xml_element.add_element(
|
90
|
+
xml_element.add_element(event_code.to_xml_element)
|
90
91
|
end
|
91
|
-
xml_element.add_element(
|
92
|
-
xml_element.add_element(
|
93
|
-
xml_element.add_element(
|
94
|
-
xml_element.add_element(
|
95
|
-
xml_element.add_element(
|
96
|
-
xml_element.add_element(
|
97
|
-
xml_element.add_element(
|
98
|
-
xml_element.add_element(
|
99
|
-
xml_element.add_element(
|
92
|
+
xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
|
93
|
+
xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
|
94
|
+
xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
|
95
|
+
xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name) if @sender_name
|
96
|
+
xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline) if @headline
|
97
|
+
xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description) if @description
|
98
|
+
xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction) if @instruction
|
99
|
+
xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web) if @web
|
100
|
+
xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact) if @contact
|
100
101
|
@parameters.each do |parameter|
|
101
|
-
xml_element.add_element(
|
102
|
+
xml_element.add_element(parameter.to_xml_element)
|
102
103
|
end
|
103
104
|
@resources.each do |resource|
|
104
|
-
xml_element.add_element(
|
105
|
+
xml_element.add_element(resource.to_xml_element)
|
105
106
|
end
|
106
107
|
@areas.each do |area|
|
107
|
-
xml_element.add_element(
|
108
|
+
xml_element.add_element(area.to_xml_element)
|
108
109
|
end
|
109
110
|
xml_element
|
110
111
|
end
|
111
112
|
|
112
113
|
# @return [String]
|
113
114
|
def to_xml
|
114
|
-
|
115
|
+
to_xml_element.to_s
|
115
116
|
end
|
116
117
|
|
117
118
|
# @return [String]
|
118
119
|
def inspect
|
119
|
-
info_inspect = "Language: #{
|
120
|
-
"Categories: #{
|
121
|
-
"Event: #{
|
122
|
-
"Response Types: #{
|
123
|
-
"Urgency: #{
|
124
|
-
"Severity: #{
|
125
|
-
"Certainty: #{
|
126
|
-
"Audience: #{
|
127
|
-
"Event Codes: #{
|
128
|
-
"Effective: #{
|
129
|
-
"Onset: #{
|
130
|
-
"Expires: #{
|
131
|
-
"Sender Name: #{
|
132
|
-
"Headline: #{
|
133
|
-
"Description:\n"+
|
134
|
-
@
|
135
|
-
|
136
|
-
"
|
137
|
-
"
|
138
|
-
|
139
|
-
@
|
140
|
-
|
141
|
-
@resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
|
142
|
-
"Area:\n"+
|
143
|
-
@areas.map{ |area| " #{ area }" }.join( "\n" )+"\n"
|
144
|
-
RCAP.format_lines_for_inspect( 'INFO', info_inspect )
|
120
|
+
info_inspect = "Language: #{@language}\n"\
|
121
|
+
"Categories: #{@categories.to_s_for_cap}\n"\
|
122
|
+
"Event: #{@event}\n"\
|
123
|
+
"Response Types: #{@response_types.to_s_for_cap}\n"\
|
124
|
+
"Urgency: #{@urgency}\n"\
|
125
|
+
"Severity: #{@severity}\n"\
|
126
|
+
"Certainty: #{@certainty}\n"\
|
127
|
+
"Audience: #{@audience}\n"\
|
128
|
+
"Event Codes: #{@event_codes.inspect}\n"\
|
129
|
+
"Effective: #{@effective}\n"\
|
130
|
+
"Onset: #{@onset}\n"\
|
131
|
+
"Expires: #{@expires}\n"\
|
132
|
+
"Sender Name: #{@sender_name}\n"\
|
133
|
+
"Headline: #{@headline}\n"\
|
134
|
+
"Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
|
135
|
+
"Instruction: #{@instruction}\n"\
|
136
|
+
"Web: #{@web}\n"\
|
137
|
+
"Contact: #{@contact}\n"\
|
138
|
+
"Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
|
139
|
+
"Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
|
140
|
+
"Area:\n" + @areas.map { |area| " #{area}" }.join("\n") + "\n"
|
141
|
+
RCAP.format_lines_for_inspect('INFO', info_inspect)
|
145
142
|
end
|
146
143
|
|
147
144
|
# Returns a string representation of the event of the form
|
@@ -149,15 +146,15 @@ module RCAP
|
|
149
146
|
#
|
150
147
|
# @return [String]
|
151
148
|
def to_s
|
152
|
-
"#{
|
149
|
+
"#{@event}(#{@urgency}/#{@severity}/#{@certainty})"
|
153
150
|
end
|
154
151
|
|
155
152
|
# @param [REXML::Element] info_xml_element
|
156
153
|
# @return [Info]
|
157
|
-
def self.from_xml_element(
|
154
|
+
def self.from_xml_element(info_xml_element)
|
158
155
|
super.tap do |info|
|
159
|
-
RCAP.xpath_match(
|
160
|
-
info.response_types << RCAP.strip_if_given(
|
156
|
+
RCAP.xpath_match(info_xml_element, RESPONSE_TYPE_XPATH, Alert::XMLNS).each do |element|
|
157
|
+
info.response_types << RCAP.strip_if_given(element.text)
|
161
158
|
end
|
162
159
|
end
|
163
160
|
end
|
@@ -166,42 +163,42 @@ module RCAP
|
|
166
163
|
|
167
164
|
# @return [Hash]
|
168
165
|
def to_yaml_data
|
169
|
-
parameter_to_hash =
|
170
|
-
|
171
|
-
RCAP.attribute_values_to_hash(
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
166
|
+
parameter_to_hash = ->(hash, parameter) { hash.merge(parameter.name => parameter.value) }
|
167
|
+
|
168
|
+
RCAP.attribute_values_to_hash([LANGUAGE_YAML, @language],
|
169
|
+
[CATEGORIES_YAML, @categories],
|
170
|
+
[EVENT_YAML, @event],
|
171
|
+
[RESPONSE_TYPES_YAML, @response_types],
|
172
|
+
[URGENCY_YAML, @urgency],
|
173
|
+
[SEVERITY_YAML, @severity],
|
174
|
+
[CERTAINTY_YAML, @certainty],
|
175
|
+
[AUDIENCE_YAML, @audience],
|
176
|
+
[EFFECTIVE_YAML, RCAP.to_s_for_cap(@effective)],
|
177
|
+
[ONSET_YAML, RCAP.to_s_for_cap(@onset)],
|
178
|
+
[EXPIRES_YAML, RCAP.to_s_for_cap(@expires)],
|
179
|
+
[SENDER_NAME_YAML, @sender_name],
|
180
|
+
[HEADLINE_YAML, @headline],
|
181
|
+
[DESCRIPTION_YAML, @description],
|
182
|
+
[INSTRUCTION_YAML, @instruction],
|
183
|
+
[WEB_YAML, @web],
|
184
|
+
[CONTACT_YAML, @contact],
|
185
|
+
[EVENT_CODES_YAML, @event_codes.inject({}, ¶meter_to_hash)],
|
186
|
+
[PARAMETERS_YAML, @parameters.inject({}, ¶meter_to_hash)],
|
187
|
+
[RESOURCES_YAML, @resources.map(&:to_yaml_data)],
|
188
|
+
[AREAS_YAML, @areas.map(&:to_yaml_data)])
|
192
189
|
end
|
193
190
|
|
194
191
|
# @return [String]
|
195
|
-
def to_yaml(
|
196
|
-
|
192
|
+
def to_yaml(options = {})
|
193
|
+
to_yaml_data.to_yaml(options)
|
197
194
|
end
|
198
195
|
|
199
196
|
# @param [Hash] info_yaml_data
|
200
197
|
# @return [Info]
|
201
|
-
def self.from_yaml_data(
|
198
|
+
def self.from_yaml_data(info_yaml_data)
|
202
199
|
super.tap do |info|
|
203
|
-
Array(
|
204
|
-
info.response_types << RCAP.strip_if_given(
|
200
|
+
Array(info_yaml_data [RESPONSE_TYPES_YAML]).each do |response_type|
|
201
|
+
info.response_types << RCAP.strip_if_given(response_type)
|
205
202
|
end
|
206
203
|
end
|
207
204
|
end
|
@@ -210,35 +207,35 @@ module RCAP
|
|
210
207
|
|
211
208
|
# @return [Hash]
|
212
209
|
def to_h
|
213
|
-
RCAP.attribute_values_to_hash(
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
210
|
+
RCAP.attribute_values_to_hash([LANGUAGE_KEY, @language],
|
211
|
+
[CATEGORIES_KEY, @categories],
|
212
|
+
[EVENT_KEY, @event],
|
213
|
+
[RESPONSE_TYPES_KEY, @response_types],
|
214
|
+
[URGENCY_KEY, @urgency],
|
215
|
+
[SEVERITY_KEY, @severity],
|
216
|
+
[CERTAINTY_KEY, @certainty],
|
217
|
+
[AUDIENCE_KEY, @audience],
|
218
|
+
[EFFECTIVE_KEY, RCAP.to_s_for_cap(@effective)],
|
219
|
+
[ONSET_KEY, RCAP.to_s_for_cap(@onset)],
|
220
|
+
[EXPIRES_KEY, RCAP.to_s_for_cap(@expires)],
|
221
|
+
[SENDER_NAME_KEY, @sender_name],
|
222
|
+
[HEADLINE_KEY, @headline],
|
223
|
+
[DESCRIPTION_KEY, @description],
|
224
|
+
[INSTRUCTION_KEY, @instruction],
|
225
|
+
[WEB_KEY, @web],
|
226
|
+
[CONTACT_KEY, @contact],
|
227
|
+
[RESOURCES_KEY, @resources.map(&:to_h)],
|
228
|
+
[EVENT_CODES_KEY, @event_codes.map(&:to_h)],
|
229
|
+
[PARAMETERS_KEY, @parameters.map(&:to_h)],
|
230
|
+
[AREAS_KEY, @areas.map(&:to_h)])
|
234
231
|
end
|
235
232
|
|
236
233
|
# @param [Hash] info_hash
|
237
234
|
# @return [Info]
|
238
|
-
def self.from_h(
|
235
|
+
def self.from_h(info_hash)
|
239
236
|
super.tap do |info|
|
240
|
-
Array(
|
241
|
-
info.response_types << RCAP.strip_if_given(
|
237
|
+
Array(info_hash[RESPONSE_TYPES_KEY]).each do |response_type|
|
238
|
+
info.response_types << RCAP.strip_if_given(response_type)
|
242
239
|
end
|
243
240
|
end
|
244
241
|
end
|
data/lib/rcap/cap_1_2/point.rb
CHANGED
data/lib/rcap/cap_1_2/polygon.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module RCAP
|
2
4
|
module CAP_1_2
|
3
|
-
|
4
5
|
# A Polygon object is valid if
|
5
|
-
# * it has a minimum of three points
|
6
|
+
# * if points are given it has a minimum of three points
|
6
7
|
# * each Point object in the points collection is valid
|
7
8
|
class Polygon < RCAP::Base::Polygon
|
8
|
-
|
9
|
-
validates_length_of( :points, :minimum => 4 )
|
9
|
+
validates_length_of(:points, minimum: 4, allow_blank: true)
|
10
10
|
|
11
11
|
# @return [Class]
|
12
12
|
def point_class
|