rcap 2.4.1 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|