rcap 2.4.1 → 2.5.0
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/rcap/alert.rb +28 -29
- data/lib/rcap/base/alert.rb +192 -192
- data/lib/rcap/base/area.rb +84 -86
- data/lib/rcap/base/circle.rb +32 -32
- data/lib/rcap/base/info.rb +248 -253
- data/lib/rcap/base/parameter.rb +23 -24
- data/lib/rcap/base/point.rb +23 -23
- data/lib/rcap/base/polygon.rb +32 -32
- data/lib/rcap/base/resource.rb +57 -57
- data/lib/rcap/cap_1_0/alert.rb +79 -83
- data/lib/rcap/cap_1_0/area.rb +0 -2
- data/lib/rcap/cap_1_0/circle.rb +0 -1
- data/lib/rcap/cap_1_0/info.rb +1 -3
- data/lib/rcap/cap_1_0/parameter.rb +11 -12
- data/lib/rcap/cap_1_0/point.rb +0 -1
- data/lib/rcap/cap_1_0/polygon.rb +0 -2
- data/lib/rcap/cap_1_0/resource.rb +0 -3
- data/lib/rcap/cap_1_1/alert.rb +4 -6
- data/lib/rcap/cap_1_1/area.rb +0 -2
- data/lib/rcap/cap_1_1/circle.rb +0 -1
- data/lib/rcap/cap_1_1/info.rb +120 -129
- data/lib/rcap/cap_1_1/parameter.rb +0 -2
- data/lib/rcap/cap_1_1/point.rb +0 -1
- data/lib/rcap/cap_1_1/polygon.rb +0 -2
- data/lib/rcap/cap_1_1/resource.rb +32 -34
- data/lib/rcap/cap_1_2/alert.rb +4 -6
- data/lib/rcap/cap_1_2/area.rb +0 -2
- data/lib/rcap/cap_1_2/circle.rb +0 -1
- data/lib/rcap/cap_1_2/info.rb +114 -121
- data/lib/rcap/cap_1_2/parameter.rb +0 -2
- data/lib/rcap/cap_1_2/point.rb +0 -1
- data/lib/rcap/cap_1_2/polygon.rb +1 -3
- data/lib/rcap/cap_1_2/resource.rb +32 -34
- data/lib/rcap/config.rb +3 -3
- data/lib/rcap/custom_validators.rb +72 -76
- data/lib/rcap/extensions/array.rb +1 -1
- data/lib/rcap/extensions/date.rb +2 -2
- data/lib/rcap/extensions/date_time.rb +3 -3
- data/lib/rcap/extensions/string.rb +3 -3
- data/lib/rcap/extensions/time.rb +2 -3
- data/lib/rcap/info.rb +4 -5
- data/lib/rcap/utilities.rb +24 -25
- data/lib/rcap/validation.rb +19 -20
- data/lib/rcap/version.rb +1 -1
- 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 +39 -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 +38 -38
- 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 +34 -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 +36 -36
- 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 +43 -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 +47 -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 +2 -2
data/lib/rcap/cap_1_0/alert.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module RCAP
|
|
2
2
|
module CAP_1_0
|
|
3
|
-
|
|
4
3
|
# An Alert object is valid if
|
|
5
4
|
# * it has an identifier
|
|
6
5
|
# * it has a sender
|
|
@@ -10,12 +9,11 @@ module RCAP
|
|
|
10
9
|
# * it has a valid scope value
|
|
11
10
|
# * all Info objects contained in infos are valid
|
|
12
11
|
class Alert < RCAP::Base::Alert
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
CAP_VERSION = "1.0"
|
|
12
|
+
XMLNS = 'http://www.incident.com/cap/1.0'
|
|
13
|
+
CAP_VERSION = '1.0'
|
|
16
14
|
|
|
17
15
|
# @return [String]
|
|
18
|
-
attr_accessor(
|
|
16
|
+
attr_accessor(:password)
|
|
19
17
|
|
|
20
18
|
# @return [String]
|
|
21
19
|
def xmlns
|
|
@@ -31,100 +29,98 @@ module RCAP
|
|
|
31
29
|
|
|
32
30
|
# @return [REXML::Element]
|
|
33
31
|
def to_xml_element
|
|
34
|
-
xml_element = REXML::Element.new(
|
|
35
|
-
xml_element.add_namespace(
|
|
36
|
-
xml_element.add_element(
|
|
37
|
-
xml_element.add_element(
|
|
38
|
-
xml_element.add_element(
|
|
39
|
-
xml_element.add_element(
|
|
40
|
-
xml_element.add_element(
|
|
41
|
-
xml_element.add_element(
|
|
42
|
-
xml_element.add_element(
|
|
43
|
-
xml_element.add_element(
|
|
44
|
-
xml_element.add_element(
|
|
32
|
+
xml_element = REXML::Element.new(XML_ELEMENT_NAME)
|
|
33
|
+
xml_element.add_namespace(XMLNS)
|
|
34
|
+
xml_element.add_element(IDENTIFIER_ELEMENT_NAME).add_text(@identifier) if @identifier
|
|
35
|
+
xml_element.add_element(SENDER_ELEMENT_NAME).add_text(@sender) if @sender
|
|
36
|
+
xml_element.add_element(SENT_ELEMENT_NAME).add_text(@sent.to_s_for_cap) if @sent
|
|
37
|
+
xml_element.add_element(STATUS_ELEMENT_NAME).add_text(@status) if @status
|
|
38
|
+
xml_element.add_element(MSG_TYPE_ELEMENT_NAME).add_text(@msg_type) if @msg_type
|
|
39
|
+
xml_element.add_element(PASSWORD_ELEMENT_NAME).add_text(@password) if @password
|
|
40
|
+
xml_element.add_element(SOURCE_ELEMENT_NAME).add_text(@source) if @source
|
|
41
|
+
xml_element.add_element(SCOPE_ELEMENT_NAME).add_text(@scope) if @scope
|
|
42
|
+
xml_element.add_element(RESTRICTION_ELEMENT_NAME).add_text(@restriction) if @restriction
|
|
45
43
|
if @addresses.any?
|
|
46
|
-
xml_element.add_element(
|
|
44
|
+
xml_element.add_element(ADDRESSES_ELEMENT_NAME).add_text(@addresses.to_s_for_cap)
|
|
47
45
|
end
|
|
48
46
|
@codes.each do |code|
|
|
49
|
-
xml_element.add_element(
|
|
47
|
+
xml_element.add_element(CODE_ELEMENT_NAME).add_text(code)
|
|
50
48
|
end
|
|
51
|
-
xml_element.add_element(
|
|
49
|
+
xml_element.add_element(NOTE_ELEMENT_NAME).add_text(@note) if @note
|
|
52
50
|
if @references.any?
|
|
53
|
-
xml_element.add_element(
|
|
51
|
+
xml_element.add_element(REFERENCES_ELEMENT_NAME).add_text(@references.join(' '))
|
|
54
52
|
end
|
|
55
53
|
if @incidents.any?
|
|
56
|
-
xml_element.add_element(
|
|
54
|
+
xml_element.add_element(INCIDENTS_ELEMENT_NAME).add_text(@incidents.join(' '))
|
|
57
55
|
end
|
|
58
56
|
@infos.each do |info|
|
|
59
|
-
xml_element.add_element(
|
|
57
|
+
xml_element.add_element(info.to_xml_element)
|
|
60
58
|
end
|
|
61
59
|
xml_element
|
|
62
60
|
end
|
|
63
61
|
|
|
64
62
|
# @return [String]
|
|
65
63
|
def inspect
|
|
66
|
-
alert_inspect = [
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
RCAP.format_lines_for_inspect(
|
|
64
|
+
alert_inspect = ["CAP Version: #{ CAP_VERSION }",
|
|
65
|
+
"Identifier: #{ @identifier }",
|
|
66
|
+
"Sender: #{ @sender }",
|
|
67
|
+
"Sent: #{ @sent }",
|
|
68
|
+
"Status: #{ @status }",
|
|
69
|
+
"Message Type: #{ @msg_type }",
|
|
70
|
+
"Password: #{ @password }",
|
|
71
|
+
"Source: #{ @source }",
|
|
72
|
+
"Scope: #{ @scope }",
|
|
73
|
+
"Restriction: #{ @restriction }",
|
|
74
|
+
"Addresses: #{ @addresses.to_s_for_cap }",
|
|
75
|
+
'Codes:',
|
|
76
|
+
@codes.map { |code| ' ' + code }.join("\n"),
|
|
77
|
+
"Note: #{ @note }",
|
|
78
|
+
"References: #{ @references.join(' ')}",
|
|
79
|
+
"Incidents: #{ @incidents.join(' ')}",
|
|
80
|
+
'Information:',
|
|
81
|
+
@infos.map { |info| ' ' + info.to_s }.join("\n")].join("\n")
|
|
82
|
+
RCAP.format_lines_for_inspect('ALERT', alert_inspect)
|
|
85
83
|
end
|
|
86
84
|
|
|
87
|
-
|
|
88
85
|
PASSWORD_XPATH = "cap:#{ PASSWORD_ELEMENT_NAME }"
|
|
89
86
|
|
|
90
87
|
# @param [REXML::Element] alert_xml_element
|
|
91
88
|
# @return [RCAP::CAP_1_0::Alert]
|
|
92
|
-
def self.from_xml_element(
|
|
89
|
+
def self.from_xml_element(alert_xml_element)
|
|
93
90
|
super.tap do |alert|
|
|
94
|
-
alert.password = RCAP.xpath_text(
|
|
91
|
+
alert.password = RCAP.xpath_text(alert_xml_element, PASSWORD_XPATH, Alert::XMLNS)
|
|
95
92
|
end
|
|
96
93
|
end
|
|
97
94
|
|
|
98
|
-
|
|
99
|
-
PASSWORD_YAML = "Password"
|
|
95
|
+
PASSWORD_YAML = 'Password'
|
|
100
96
|
|
|
101
97
|
# Returns a string containing the YAML representation of the alert.
|
|
102
98
|
#
|
|
103
99
|
# @return [String]
|
|
104
|
-
def to_yaml(
|
|
105
|
-
RCAP.attribute_values_to_hash(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
100
|
+
def to_yaml(options = {})
|
|
101
|
+
RCAP.attribute_values_to_hash([CAP_VERSION_YAML, CAP_VERSION],
|
|
102
|
+
[IDENTIFIER_YAML, @identifier],
|
|
103
|
+
[SENDER_YAML, @sender],
|
|
104
|
+
[SENT_YAML, @sent],
|
|
105
|
+
[STATUS_YAML, @status],
|
|
106
|
+
[MSG_TYPE_YAML, @msg_type],
|
|
107
|
+
[PASSWORD_YAML, @password],
|
|
108
|
+
[SOURCE_YAML, @source],
|
|
109
|
+
[SCOPE_YAML, @scope],
|
|
110
|
+
[RESTRICTION_YAML, @restriction],
|
|
111
|
+
[ADDRESSES_YAML, @addresses],
|
|
112
|
+
[CODES_YAML, @codes],
|
|
113
|
+
[NOTE_YAML, @note],
|
|
114
|
+
[REFERENCES_YAML, @references],
|
|
115
|
+
[INCIDENTS_YAML, @incidents],
|
|
116
|
+
[INFOS_YAML, @infos.map(&:to_yaml_data)]).to_yaml(options)
|
|
121
117
|
end
|
|
122
118
|
|
|
123
119
|
# @param [Hash] alert_yaml_data
|
|
124
120
|
# @return [RCAP::CAP_1_0::Alert]
|
|
125
|
-
def self.from_yaml_data(
|
|
121
|
+
def self.from_yaml_data(alert_yaml_data)
|
|
126
122
|
super.tap do |alert|
|
|
127
|
-
alert.password = RCAP.strip_if_given(
|
|
123
|
+
alert.password = RCAP.strip_if_given(alert_yaml_data[PASSWORD_YAML])
|
|
128
124
|
end
|
|
129
125
|
end
|
|
130
126
|
|
|
@@ -134,31 +130,31 @@ module RCAP
|
|
|
134
130
|
#
|
|
135
131
|
# @return [Hash]
|
|
136
132
|
def to_h
|
|
137
|
-
RCAP.attribute_values_to_hash(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
133
|
+
RCAP.attribute_values_to_hash([CAP_VERSION_KEY, CAP_VERSION],
|
|
134
|
+
[IDENTIFIER_KEY, @identifier],
|
|
135
|
+
[SENDER_KEY, @sender],
|
|
136
|
+
[SENT_KEY, RCAP.to_s_for_cap(@sent)],
|
|
137
|
+
[STATUS_KEY, @status],
|
|
138
|
+
[MSG_TYPE_KEY, @msg_type],
|
|
139
|
+
[PASSWORD_KEY, @password],
|
|
140
|
+
[SOURCE_KEY, @source],
|
|
141
|
+
[SCOPE_KEY, @scope],
|
|
142
|
+
[RESTRICTION_KEY, @restriction],
|
|
143
|
+
[ADDRESSES_KEY, @addresses],
|
|
144
|
+
[CODES_KEY, @codes],
|
|
145
|
+
[NOTE_KEY, @note],
|
|
146
|
+
[REFERENCES_KEY, @references],
|
|
147
|
+
[INCIDENTS_KEY, @incidents],
|
|
148
|
+
[INFOS_KEY, @infos.map { |info| info.to_h }])
|
|
153
149
|
end
|
|
154
150
|
|
|
155
151
|
# Initialises an Alert object from a Hash produced by Alert#to_h
|
|
156
152
|
#
|
|
157
153
|
# @param [Hash] alert_hash
|
|
158
154
|
# @return [RCAP::CAP_1_0::Alert]
|
|
159
|
-
def self.from_h(
|
|
155
|
+
def self.from_h(alert_hash)
|
|
160
156
|
super.tap do |alert|
|
|
161
|
-
alert.password = RCAP.strip_if_given(
|
|
157
|
+
alert.password = RCAP.strip_if_given(alert_hash[PASSWORD_KEY])
|
|
162
158
|
end
|
|
163
159
|
end
|
|
164
160
|
end
|
data/lib/rcap/cap_1_0/area.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module RCAP
|
|
2
2
|
module CAP_1_0
|
|
3
|
-
|
|
4
3
|
# An Area object is valid if
|
|
5
4
|
# * it has an area description
|
|
6
5
|
# * all Circle objects contained in circles are valid
|
|
@@ -8,7 +7,6 @@ module RCAP
|
|
|
8
7
|
# * all Polygon objects contained in polygons are valid
|
|
9
8
|
# * altitude has a value if ceiling is set
|
|
10
9
|
class Area < RCAP::Base::Area
|
|
11
|
-
|
|
12
10
|
# @return [String]
|
|
13
11
|
def xmlns
|
|
14
12
|
Alert::XMLNS
|
data/lib/rcap/cap_1_0/circle.rb
CHANGED
data/lib/rcap/cap_1_0/info.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module RCAP
|
|
2
2
|
module CAP_1_0
|
|
3
|
-
|
|
4
3
|
# In Info object is valid if
|
|
5
4
|
# * it has an event
|
|
6
5
|
# * it has an urgency with a valid value
|
|
@@ -10,8 +9,7 @@ module RCAP
|
|
|
10
9
|
# * all Resource objects in the resources collection are valid
|
|
11
10
|
# * all Area objects in the areas collection are valid
|
|
12
11
|
class Info < RCAP::Base::Info
|
|
13
|
-
|
|
14
|
-
validates_inclusion_of( :certainty, :allow_nil => true, :in => VALID_CERTAINTIES, :message => "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
|
|
12
|
+
validates_inclusion_of(:certainty, allow_nil: true, in: VALID_CERTAINTIES, message: "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
|
|
15
13
|
|
|
16
14
|
# @return [String]
|
|
17
15
|
def xmlns
|
|
@@ -4,31 +4,30 @@ module RCAP
|
|
|
4
4
|
# * it has a name
|
|
5
5
|
# * it has a value
|
|
6
6
|
class Parameter < RCAP::Base::Parameter
|
|
7
|
-
|
|
8
7
|
# @return [REXML::Element]
|
|
9
8
|
def to_xml_element
|
|
10
|
-
xml_element = REXML::Element.new(
|
|
11
|
-
xml_element.add_text(
|
|
9
|
+
xml_element = REXML::Element.new(self.class::XML_ELEMENT_NAME)
|
|
10
|
+
xml_element.add_text("#{ @name }=#{ @value }")
|
|
12
11
|
xml_element
|
|
13
12
|
end
|
|
14
13
|
|
|
15
14
|
# @param [REXML::Element] parameter_xml_element
|
|
16
15
|
# @return [Parameter]
|
|
17
|
-
def self.from_xml_element(
|
|
18
|
-
parameter_hash =
|
|
19
|
-
|
|
20
|
-
parameter.name = RCAP.strip_if_given(
|
|
21
|
-
parameter.value = RCAP.strip_if_given(
|
|
16
|
+
def self.from_xml_element(parameter_xml_element)
|
|
17
|
+
parameter_hash = parse_parameter(parameter_xml_element.text)
|
|
18
|
+
new do |parameter|
|
|
19
|
+
parameter.name = RCAP.strip_if_given(parameter_hash[:name])
|
|
20
|
+
parameter.value = RCAP.strip_if_given(parameter_hash[:value])
|
|
22
21
|
end
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
# @param [String] parameter_string
|
|
26
25
|
# @return [Hash]
|
|
27
|
-
def self.parse_parameter(
|
|
28
|
-
name, value = parameter_string.split(
|
|
26
|
+
def self.parse_parameter(parameter_string)
|
|
27
|
+
name, value = parameter_string.split('=')
|
|
29
28
|
if name && value
|
|
30
|
-
{ :
|
|
31
|
-
:
|
|
29
|
+
{ name: RCAP.strip_if_given(name),
|
|
30
|
+
value: RCAP.strip_if_given(value) }
|
|
32
31
|
end
|
|
33
32
|
end
|
|
34
33
|
end
|
data/lib/rcap/cap_1_0/point.rb
CHANGED
data/lib/rcap/cap_1_0/polygon.rb
CHANGED
data/lib/rcap/cap_1_1/alert.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module RCAP
|
|
2
2
|
module CAP_1_1
|
|
3
|
-
|
|
4
3
|
# An Alert object is valid if
|
|
5
4
|
# * it has an identifier
|
|
6
5
|
# * it has a sender
|
|
@@ -10,13 +9,12 @@ module RCAP
|
|
|
10
9
|
# * it has a valid scope value
|
|
11
10
|
# * all Info objects contained in infos are valid
|
|
12
11
|
class Alert < RCAP::Base::Alert
|
|
12
|
+
XMLNS = 'urn:oasis:names:tc:emergency:cap:1.1'
|
|
13
|
+
CAP_VERSION = '1.1'
|
|
13
14
|
|
|
14
|
-
|
|
15
|
-
CAP_VERSION = "1.1"
|
|
16
|
-
|
|
17
|
-
STATUS_DRAFT = "Draft"
|
|
15
|
+
STATUS_DRAFT = 'Draft'
|
|
18
16
|
# Valid values for status
|
|
19
|
-
VALID_STATUSES = [
|
|
17
|
+
VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT]
|
|
20
18
|
|
|
21
19
|
# @return [String]
|
|
22
20
|
def xmlns
|
data/lib/rcap/cap_1_1/area.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module RCAP
|
|
2
2
|
module CAP_1_1
|
|
3
|
-
|
|
4
3
|
# An Area object is valid if
|
|
5
4
|
# * it has an area description
|
|
6
5
|
# * all Circle objects contained in circles are valid
|
|
@@ -8,7 +7,6 @@ module RCAP
|
|
|
8
7
|
# * all Polygon objects contained in polygons are valid
|
|
9
8
|
# * altitude has a value if ceiling is set
|
|
10
9
|
class Area < RCAP::Base::Area
|
|
11
|
-
|
|
12
10
|
# @return [String]
|
|
13
11
|
def xmlns
|
|
14
12
|
Alert::XMLNS
|
data/lib/rcap/cap_1_1/circle.rb
CHANGED
data/lib/rcap/cap_1_1/info.rb
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
module RCAP
|
|
2
2
|
module CAP_1_1
|
|
3
|
-
|
|
4
3
|
# In Info object is valid if
|
|
5
4
|
# * it has an event
|
|
6
5
|
# * it has an urgency with a valid value
|
|
@@ -10,40 +9,37 @@ module RCAP
|
|
|
10
9
|
# * all Resource objects in the resources collection are valid
|
|
11
10
|
# * all Area objects in the areas collection are valid
|
|
12
11
|
class Info < RCAP::Base::Info
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
RESPONSE_TYPE_NONE = "None"
|
|
12
|
+
RESPONSE_TYPE_SHELTER = 'Shelter'
|
|
13
|
+
RESPONSE_TYPE_EVACUATE = 'Evacuate'
|
|
14
|
+
RESPONSE_TYPE_PREPARE = 'Prepare'
|
|
15
|
+
RESPONSE_TYPE_EXECUTE = 'Execute'
|
|
16
|
+
RESPONSE_TYPE_MONITOR = 'Monitor'
|
|
17
|
+
RESPONSE_TYPE_ASSESS = 'Assess'
|
|
18
|
+
RESPONSE_TYPE_NONE = 'None'
|
|
21
19
|
# Valid values for response_type
|
|
22
|
-
VALID_RESPONSE_TYPES = [
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
VALID_RESPONSE_TYPES = [RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE,
|
|
21
|
+
RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR,
|
|
22
|
+
RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_NONE]
|
|
26
23
|
|
|
27
|
-
CERTAINTY_OBSERVED =
|
|
24
|
+
CERTAINTY_OBSERVED = 'Observed'
|
|
28
25
|
# Valid valies for certainty
|
|
29
|
-
VALID_CERTAINTIES = [
|
|
30
|
-
|
|
26
|
+
VALID_CERTAINTIES = [CERTAINTY_OBSERVED, CERTAINTY_LIKELY,
|
|
27
|
+
CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN]
|
|
31
28
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
validates_inclusion_of( :certainty, :allow_nil => true, :in => VALID_CERTAINTIES, :message => "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
|
|
29
|
+
validates_length_of(:categories, minimum: 1)
|
|
30
|
+
validates_inclusion_of_members_of(:response_types, in: VALID_RESPONSE_TYPES, allow_blank: true)
|
|
31
|
+
validates_inclusion_of(:certainty, allow_nil: true, in: VALID_CERTAINTIES, message: "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
|
|
36
32
|
|
|
37
33
|
# @return [Array<String>] Collection of textual response types; elements must be from {VALID_RESPONSE_TYPES}
|
|
38
|
-
attr_reader(
|
|
34
|
+
attr_reader(:response_types)
|
|
39
35
|
# @return [Array<EventCode>] Collection of {EventCode} objects
|
|
40
|
-
attr_reader(
|
|
36
|
+
attr_reader(:event_codes)
|
|
41
37
|
# @return [Array<Parameter>] Collection of {Parameter} objects
|
|
42
|
-
attr_reader(
|
|
38
|
+
attr_reader(:parameters)
|
|
43
39
|
# @return [Array<Resource> Collection of {Resource} objects
|
|
44
|
-
attr_reader(
|
|
40
|
+
attr_reader(:resources)
|
|
45
41
|
# @return [Array<Area>] Collection of {Area} objects
|
|
46
|
-
attr_reader(
|
|
42
|
+
attr_reader(:areas)
|
|
47
43
|
|
|
48
44
|
# @param [Hash] attributes
|
|
49
45
|
# @option attributes [String] :language Defaults to {DEFAULT_LANGUAGE}
|
|
@@ -97,86 +93,82 @@ module RCAP
|
|
|
97
93
|
|
|
98
94
|
# @return [REXML::Element]
|
|
99
95
|
def to_xml_element
|
|
100
|
-
xml_element = REXML::Element.new(
|
|
101
|
-
xml_element.add_element(
|
|
96
|
+
xml_element = REXML::Element.new(XML_ELEMENT_NAME)
|
|
97
|
+
xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language) if @language
|
|
102
98
|
@categories.each do |category|
|
|
103
|
-
xml_element.add_element(
|
|
99
|
+
xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category)
|
|
104
100
|
end
|
|
105
|
-
xml_element.add_element(
|
|
101
|
+
xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event)
|
|
106
102
|
@response_types.each do |response_type|
|
|
107
|
-
xml_element.add_element(
|
|
103
|
+
xml_element.add_element(RESPONSE_TYPE_ELEMENT_NAME).add_text(response_type)
|
|
108
104
|
end
|
|
109
|
-
xml_element.add_element(
|
|
110
|
-
xml_element.add_element(
|
|
111
|
-
xml_element.add_element(
|
|
112
|
-
xml_element.add_element(
|
|
105
|
+
xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency)
|
|
106
|
+
xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity)
|
|
107
|
+
xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty)
|
|
108
|
+
xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience) if @audience
|
|
113
109
|
@event_codes.each do |event_code|
|
|
114
|
-
xml_element.add_element(
|
|
110
|
+
xml_element.add_element(event_code.to_xml_element)
|
|
115
111
|
end
|
|
116
|
-
xml_element.add_element(
|
|
117
|
-
xml_element.add_element(
|
|
118
|
-
xml_element.add_element(
|
|
119
|
-
xml_element.add_element(
|
|
120
|
-
xml_element.add_element(
|
|
121
|
-
xml_element.add_element(
|
|
122
|
-
xml_element.add_element(
|
|
123
|
-
xml_element.add_element(
|
|
124
|
-
xml_element.add_element(
|
|
112
|
+
xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
|
|
113
|
+
xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
|
|
114
|
+
xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
|
|
115
|
+
xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name) if @sender_name
|
|
116
|
+
xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline) if @headline
|
|
117
|
+
xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description) if @description
|
|
118
|
+
xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction) if @instruction
|
|
119
|
+
xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web) if @web
|
|
120
|
+
xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact) if @contact
|
|
125
121
|
@parameters.each do |parameter|
|
|
126
|
-
xml_element.add_element(
|
|
122
|
+
xml_element.add_element(parameter.to_xml_element)
|
|
127
123
|
end
|
|
128
124
|
@resources.each do |resource|
|
|
129
|
-
xml_element.add_element(
|
|
125
|
+
xml_element.add_element(resource.to_xml_element)
|
|
130
126
|
end
|
|
131
127
|
@areas.each do |area|
|
|
132
|
-
xml_element.add_element(
|
|
128
|
+
xml_element.add_element(area.to_xml_element)
|
|
133
129
|
end
|
|
134
130
|
xml_element
|
|
135
131
|
end
|
|
136
132
|
|
|
137
133
|
# @return [String]
|
|
138
134
|
def to_xml
|
|
139
|
-
|
|
135
|
+
to_xml_element.to_s
|
|
140
136
|
end
|
|
141
137
|
|
|
142
138
|
# @param [REXML::Element] info_xml_element
|
|
143
139
|
# @return [Info]
|
|
144
|
-
def self.from_xml_element(
|
|
140
|
+
def self.from_xml_element(info_xml_element)
|
|
145
141
|
super.tap do |info|
|
|
146
|
-
RCAP.xpath_match(
|
|
147
|
-
info.response_types << RCAP.strip_if_given(
|
|
142
|
+
RCAP.xpath_match(info_xml_element, RESPONSE_TYPE_XPATH, info.xmlns).each do |element|
|
|
143
|
+
info.response_types << RCAP.strip_if_given(element.text)
|
|
148
144
|
end
|
|
149
145
|
end
|
|
150
146
|
end
|
|
151
147
|
|
|
152
148
|
# @return [String]
|
|
153
149
|
def inspect
|
|
154
|
-
info_inspect = "Language: #{ @language }\n"
|
|
155
|
-
"Categories: #{ @categories.to_s_for_cap }\n"
|
|
156
|
-
"Event: #{ @event }\n"
|
|
157
|
-
"Response Types: #{ @response_types.to_s_for_cap }\n"
|
|
158
|
-
"Urgency: #{ @urgency }\n"
|
|
159
|
-
"Severity: #{ @severity }\n"
|
|
160
|
-
"Certainty: #{ @certainty }\n"
|
|
161
|
-
"Audience: #{ @audience }\n"
|
|
162
|
-
"Event Codes: #{ @event_codes.inspect }\n"
|
|
163
|
-
"Effective: #{ @effective }\n"
|
|
164
|
-
"Onset: #{ @onset }\n"
|
|
165
|
-
"Expires: #{ @expires }\n"
|
|
166
|
-
"Sender Name: #{ @sender_name }\n"
|
|
167
|
-
"Headline: #{ @headline }\n"
|
|
168
|
-
"Description:\n"+
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
"
|
|
172
|
-
"
|
|
173
|
-
|
|
174
|
-
@
|
|
175
|
-
|
|
176
|
-
@resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
|
|
177
|
-
"Area:\n"+
|
|
178
|
-
@areas.map{ |area| " #{ area }" }.join( "\n" )+"\n"
|
|
179
|
-
RCAP.format_lines_for_inspect( 'INFO', info_inspect )
|
|
150
|
+
info_inspect = "Language: #{ @language }\n"\
|
|
151
|
+
"Categories: #{ @categories.to_s_for_cap }\n"\
|
|
152
|
+
"Event: #{ @event }\n"\
|
|
153
|
+
"Response Types: #{ @response_types.to_s_for_cap }\n"\
|
|
154
|
+
"Urgency: #{ @urgency }\n"\
|
|
155
|
+
"Severity: #{ @severity }\n"\
|
|
156
|
+
"Certainty: #{ @certainty }\n"\
|
|
157
|
+
"Audience: #{ @audience }\n"\
|
|
158
|
+
"Event Codes: #{ @event_codes.inspect }\n"\
|
|
159
|
+
"Effective: #{ @effective }\n"\
|
|
160
|
+
"Onset: #{ @onset }\n"\
|
|
161
|
+
"Expires: #{ @expires }\n"\
|
|
162
|
+
"Sender Name: #{ @sender_name }\n"\
|
|
163
|
+
"Headline: #{ @headline }\n"\
|
|
164
|
+
"Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
|
|
165
|
+
"Instruction: #{ @instruction }\n"\
|
|
166
|
+
"Web: #{ @web }\n"\
|
|
167
|
+
"Contact: #{ @contact }\n"\
|
|
168
|
+
"Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
|
|
169
|
+
"Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
|
|
170
|
+
"Area:\n" + @areas.map { |area| " #{ area }" }.join("\n") + "\n"
|
|
171
|
+
RCAP.format_lines_for_inspect('INFO', info_inspect)
|
|
180
172
|
end
|
|
181
173
|
|
|
182
174
|
# Returns a string representation of the event of the form
|
|
@@ -187,47 +179,46 @@ module RCAP
|
|
|
187
179
|
"#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
|
|
188
180
|
end
|
|
189
181
|
|
|
190
|
-
|
|
191
182
|
RESPONSE_TYPES_YAML = 'Response Types'
|
|
192
183
|
|
|
193
184
|
# @return [Hash]
|
|
194
185
|
def to_yaml_data
|
|
195
|
-
|
|
186
|
+
parameter_to_hash = lambda { |hash, parameter| hash.merge(parameter.name => parameter.value) }
|
|
196
187
|
|
|
197
|
-
RCAP.attribute_values_to_hash(
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
188
|
+
RCAP.attribute_values_to_hash([LANGUAGE_YAML, @language],
|
|
189
|
+
[CATEGORIES_YAML, @categories],
|
|
190
|
+
[EVENT_YAML, @event],
|
|
191
|
+
[RESPONSE_TYPES_YAML, @response_types],
|
|
192
|
+
[URGENCY_YAML, @urgency],
|
|
193
|
+
[SEVERITY_YAML, @severity],
|
|
194
|
+
[CERTAINTY_YAML, @certainty],
|
|
195
|
+
[AUDIENCE_YAML, @audience],
|
|
196
|
+
[EFFECTIVE_YAML, @effective],
|
|
197
|
+
[ONSET_YAML, @onset],
|
|
198
|
+
[EXPIRES_YAML, @expires],
|
|
199
|
+
[SENDER_NAME_YAML, @sender_name],
|
|
200
|
+
[HEADLINE_YAML, @headline],
|
|
201
|
+
[DESCRIPTION_YAML, @description],
|
|
202
|
+
[INSTRUCTION_YAML, @instruction],
|
|
203
|
+
[WEB_YAML, @web],
|
|
204
|
+
[CONTACT_YAML, @contact],
|
|
205
|
+
[EVENT_CODES_YAML, @event_codes.inject({}, ¶meter_to_hash)],
|
|
206
|
+
[PARAMETERS_YAML, @parameters.inject({}, ¶meter_to_hash)],
|
|
207
|
+
[RESOURCES_YAML, @resources.map(&:to_yaml_data)],
|
|
208
|
+
[AREAS_YAML, @areas.map(&:to_yaml_data)])
|
|
218
209
|
end
|
|
219
210
|
|
|
220
211
|
# @return [String]
|
|
221
|
-
def to_yaml(
|
|
222
|
-
|
|
212
|
+
def to_yaml(options = {})
|
|
213
|
+
to_yaml_data.to_yaml(options)
|
|
223
214
|
end
|
|
224
215
|
|
|
225
216
|
# @param [Hash] info_yaml_data
|
|
226
217
|
# @return [Info]
|
|
227
|
-
def self.from_yaml_data(
|
|
218
|
+
def self.from_yaml_data(info_yaml_data)
|
|
228
219
|
super.tap do |info|
|
|
229
|
-
Array(
|
|
230
|
-
info.response_types << RCAP.strip_if_given(
|
|
220
|
+
Array(info_yaml_data [RESPONSE_TYPES_YAML]).each do |response_type|
|
|
221
|
+
info.response_types << RCAP.strip_if_given(response_type)
|
|
231
222
|
end
|
|
232
223
|
end
|
|
233
224
|
end
|
|
@@ -236,35 +227,35 @@ module RCAP
|
|
|
236
227
|
|
|
237
228
|
# @return [Hash]
|
|
238
229
|
def to_h
|
|
239
|
-
RCAP.attribute_values_to_hash(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
230
|
+
RCAP.attribute_values_to_hash([LANGUAGE_KEY, @language],
|
|
231
|
+
[CATEGORIES_KEY, @categories],
|
|
232
|
+
[EVENT_KEY, @event],
|
|
233
|
+
[RESPONSE_TYPES_KEY, @response_types],
|
|
234
|
+
[URGENCY_KEY, @urgency],
|
|
235
|
+
[SEVERITY_KEY, @severity],
|
|
236
|
+
[CERTAINTY_KEY, @certainty],
|
|
237
|
+
[AUDIENCE_KEY, @audience],
|
|
238
|
+
[EFFECTIVE_KEY, RCAP.to_s_for_cap(@effective)],
|
|
239
|
+
[ONSET_KEY, RCAP.to_s_for_cap(@onset)],
|
|
240
|
+
[EXPIRES_KEY, RCAP.to_s_for_cap(@expires)],
|
|
241
|
+
[SENDER_NAME_KEY, @sender_name],
|
|
242
|
+
[HEADLINE_KEY, @headline],
|
|
243
|
+
[DESCRIPTION_KEY, @description],
|
|
244
|
+
[INSTRUCTION_KEY, @instruction],
|
|
245
|
+
[WEB_KEY, @web],
|
|
246
|
+
[CONTACT_KEY, @contact],
|
|
247
|
+
[RESOURCES_KEY, @resources.map { |resource| resource.to_h }],
|
|
248
|
+
[EVENT_CODES_KEY, @event_codes.map { |event_code| event_code.to_h }],
|
|
249
|
+
[PARAMETERS_KEY, @parameters.map { |parameter| parameter.to_h }],
|
|
250
|
+
[AREAS_KEY, @areas.map { |area| area.to_h }])
|
|
260
251
|
end
|
|
261
252
|
|
|
262
253
|
# @param [Hash] info_hash
|
|
263
254
|
# @return [Info]
|
|
264
|
-
def self.from_h(
|
|
255
|
+
def self.from_h(info_hash)
|
|
265
256
|
super.tap do |info|
|
|
266
|
-
Array(
|
|
267
|
-
info.response_types << RCAP.strip_if_given(
|
|
257
|
+
Array(info_hash[RESPONSE_TYPES_KEY]).each do |response_type|
|
|
258
|
+
info.response_types << RCAP.strip_if_given(response_type)
|
|
268
259
|
end
|
|
269
260
|
end
|
|
270
261
|
end
|