rcap 1.3.0 → 1.3.1
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.
- data/{CHANGELOG.rdoc → CHANGELOG.md} +26 -20
- data/README.md +259 -0
- data/Rakefile +8 -7
- data/lib/extensions/array.rb +7 -1
- data/lib/extensions/date_time.rb +5 -1
- data/lib/extensions/string.rb +14 -1
- data/lib/extensions/time.rb +5 -1
- data/lib/rcap.rb +1 -1
- data/lib/rcap/alert.rb +24 -10
- data/lib/rcap/cap_1_0/alert.rb +232 -166
- data/lib/rcap/cap_1_0/area.rb +100 -67
- data/lib/rcap/cap_1_0/circle.rb +47 -22
- data/lib/rcap/cap_1_0/event_code.rb +3 -2
- data/lib/rcap/cap_1_0/geocode.rb +3 -2
- data/lib/rcap/cap_1_0/info.rb +265 -202
- data/lib/rcap/cap_1_0/parameter.rb +43 -20
- data/lib/rcap/cap_1_0/point.rb +23 -9
- data/lib/rcap/cap_1_0/polygon.rb +37 -19
- data/lib/rcap/cap_1_0/resource.rb +77 -55
- data/lib/rcap/cap_1_1/alert.rb +222 -156
- data/lib/rcap/cap_1_1/area.rb +100 -67
- data/lib/rcap/cap_1_1/circle.rb +49 -22
- data/lib/rcap/cap_1_1/event_code.rb +3 -2
- data/lib/rcap/cap_1_1/geocode.rb +3 -2
- data/lib/rcap/cap_1_1/info.rb +281 -217
- data/lib/rcap/cap_1_1/parameter.rb +35 -16
- data/lib/rcap/cap_1_1/point.rb +23 -9
- data/lib/rcap/cap_1_1/polygon.rb +38 -20
- data/lib/rcap/cap_1_1/resource.rb +106 -65
- data/lib/rcap/cap_1_2/alert.rb +224 -158
- data/lib/rcap/cap_1_2/area.rb +100 -67
- data/lib/rcap/cap_1_2/circle.rb +49 -24
- data/lib/rcap/cap_1_2/event_code.rb +3 -2
- data/lib/rcap/cap_1_2/geocode.rb +3 -2
- data/lib/rcap/cap_1_2/info.rb +285 -219
- data/lib/rcap/cap_1_2/parameter.rb +39 -19
- data/lib/rcap/cap_1_2/point.rb +23 -9
- data/lib/rcap/cap_1_2/polygon.rb +37 -20
- data/lib/rcap/cap_1_2/resource.rb +107 -67
- data/lib/rcap/config.rb +4 -0
- data/lib/rcap/utilities.rb +55 -2
- data/lib/rcap/validations.rb +2 -2
- data/lib/rcap/version.rb +1 -1
- data/rcap.gemspec +2 -2
- data/spec/cap_1_0/parameter_spec.rb +5 -1
- data/spec/cap_1_1/resource_spec.rb +6 -0
- data/spec/cap_1_2/alert_spec.rb +8 -0
- data/spec/cap_1_2/resource_spec.rb +8 -2
- metadata +11 -10
- data/README.rdoc +0 -247
- data/lib/config.rb +0 -2
data/lib/rcap/cap_1_1/area.rb
CHANGED
@@ -9,33 +9,42 @@ module RCAP
|
|
9
9
|
class Area
|
10
10
|
include Validation
|
11
11
|
|
12
|
-
#
|
12
|
+
# @return [String] Textual description of area.
|
13
13
|
attr_accessor( :area_desc )
|
14
|
-
# Expressed in feet above sea level
|
14
|
+
# @return [Numeric] Expressed in feet above sea level
|
15
15
|
attr_accessor( :altitude )
|
16
|
-
# Expressed in feet above sea level.
|
16
|
+
# @return [Numeric] Expressed in feet above sea level.
|
17
17
|
attr_accessor( :ceiling )
|
18
|
-
#
|
18
|
+
# @return [Array<Circle>]
|
19
19
|
attr_reader( :circles )
|
20
|
-
#
|
20
|
+
# @return [Array<Geocode>]
|
21
21
|
attr_reader( :geocodes )
|
22
|
-
#
|
22
|
+
# @return [Array<Polygon>]
|
23
23
|
attr_reader( :polygons )
|
24
24
|
|
25
25
|
validates_presence_of( :area_desc )
|
26
26
|
validates_collection_of( :circles, :geocodes, :polygons, allow_empty: true )
|
27
27
|
validates_dependency_of( :ceiling, on: :altitude )
|
28
28
|
|
29
|
-
XML_ELEMENT_NAME = 'area'
|
30
|
-
AREA_DESC_ELEMENT_NAME = 'areaDesc'
|
31
|
-
ALTITUDE_ELEMENT_NAME = 'altitude'
|
32
|
-
CEILING_ELEMENT_NAME = 'ceiling'
|
33
|
-
|
34
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
35
|
-
AREA_DESC_XPATH = "cap:#{ AREA_DESC_ELEMENT_NAME }"
|
36
|
-
ALTITUDE_XPATH = "cap:#{ ALTITUDE_ELEMENT_NAME }"
|
37
|
-
CEILING_XPATH = "cap:#{ CEILING_ELEMENT_NAME }"
|
38
|
-
|
29
|
+
XML_ELEMENT_NAME = 'area'
|
30
|
+
AREA_DESC_ELEMENT_NAME = 'areaDesc'
|
31
|
+
ALTITUDE_ELEMENT_NAME = 'altitude'
|
32
|
+
CEILING_ELEMENT_NAME = 'ceiling'
|
33
|
+
|
34
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
35
|
+
AREA_DESC_XPATH = "cap:#{ AREA_DESC_ELEMENT_NAME }"
|
36
|
+
ALTITUDE_XPATH = "cap:#{ ALTITUDE_ELEMENT_NAME }"
|
37
|
+
CEILING_XPATH = "cap:#{ CEILING_ELEMENT_NAME }"
|
38
|
+
|
39
|
+
# @example
|
40
|
+
# Area.new( area_desc: 'Cape Town CBD' )
|
41
|
+
# @param [Hash] attributes Area attributes
|
42
|
+
# @option attributes [String] :area_desc Area description
|
43
|
+
# @option attributes [Numeric] :altitude Altitude above sea level (in feet)
|
44
|
+
# @option attributes [Numeric] :ceiling Ceiling above sea level (in feet)
|
45
|
+
# @option attributes [Array<Circle>] :circles Collection of {Circle}
|
46
|
+
# @option attributes [Array<Geocode>] :geocodes Collection of {Geocode}
|
47
|
+
# @option attributes [Array<Polygon>] :polygons Collection of {Polygon}
|
39
48
|
def initialize( attributes = {})
|
40
49
|
@area_desc = attributes[ :area_desc ]
|
41
50
|
@altitude = attributes[ :altitude ]
|
@@ -45,31 +54,41 @@ module RCAP
|
|
45
54
|
@polygons = Array( attributes[ :polygons ])
|
46
55
|
end
|
47
56
|
|
48
|
-
# Creates a new Polygon object and adds it to the polygons array.
|
49
|
-
#
|
57
|
+
# Creates a new {Polygon} object and adds it to the {#polygons} array.
|
58
|
+
#
|
59
|
+
# @see Polygon#initialize
|
60
|
+
# @param [Hash] polygon_attributes see {Polygon#initialize}
|
61
|
+
# @return [Polygon]
|
50
62
|
def add_polygon( polygon_attributes = {})
|
51
63
|
polygon = Polygon.new( polygon_attributes )
|
52
|
-
|
64
|
+
@polygons << polygon
|
53
65
|
polygon
|
54
66
|
end
|
55
67
|
|
56
|
-
# Creates a new Circle object and adds it to the circles array.
|
57
|
-
#
|
68
|
+
# Creates a new {Circle} object and adds it to the {#circles} array.
|
69
|
+
#
|
70
|
+
# @see Circle#initialize
|
71
|
+
# @param [Hash] circle_attributes see {Circle#initialize}
|
72
|
+
# @return [Circle]
|
58
73
|
def add_circle( circle_attributes = {})
|
59
74
|
circle = Circle.new( circle_attributes )
|
60
|
-
|
75
|
+
@circles << circle
|
61
76
|
circle
|
62
77
|
end
|
63
78
|
|
64
|
-
# Creates a new Geocode object and adds it to the geocodes array.
|
65
|
-
#
|
79
|
+
# Creates a new {Geocode} object and adds it to the {#geocodes} array.
|
80
|
+
#
|
81
|
+
# @see Geocode#initialize
|
82
|
+
# @param [Hash] geocode_attributes see {Geocode#initialize}
|
83
|
+
# @return [Geocode]
|
66
84
|
def add_geocode( geocode_attributes = {})
|
67
85
|
geocode = Geocode.new( geocode_attributes )
|
68
|
-
|
86
|
+
@geocodes << geocode
|
69
87
|
geocode
|
70
88
|
end
|
71
89
|
|
72
|
-
|
90
|
+
# @return [REXML::Element]
|
91
|
+
def to_xml_element
|
73
92
|
xml_element = REXML::Element.new( XML_ELEMENT_NAME )
|
74
93
|
xml_element.add_element( AREA_DESC_ELEMENT_NAME ).add_text( @area_desc.to_s )
|
75
94
|
add_to_xml_element = lambda do |element, object|
|
@@ -79,37 +98,45 @@ module RCAP
|
|
79
98
|
@polygons.inject( xml_element, &add_to_xml_element )
|
80
99
|
@circles.inject( xml_element, &add_to_xml_element )
|
81
100
|
@geocodes.inject( xml_element, &add_to_xml_element )
|
82
|
-
xml_element.add_element( ALTITUDE_ELEMENT_NAME ).add_text( @altitude.to_s ) unless
|
83
|
-
xml_element.add_element( CEILING_ELEMENT_NAME ).add_text( @ceiling.to_s ) unless
|
101
|
+
xml_element.add_element( ALTITUDE_ELEMENT_NAME ).add_text( @altitude.to_s ) unless @altitude.blank?
|
102
|
+
xml_element.add_element( CEILING_ELEMENT_NAME ).add_text( @ceiling.to_s ) unless @altitude.blank?
|
84
103
|
xml_element
|
85
104
|
end
|
86
105
|
|
87
|
-
|
106
|
+
# @return [String] XML representation of the Area
|
107
|
+
def to_xml
|
88
108
|
self.to_xml_element.to_s
|
89
109
|
end
|
90
110
|
|
91
111
|
# Implements an equality operator for the Area object. Two Area objects are equal if all their attributes are equal.
|
112
|
+
#
|
113
|
+
# @param [Area] other Area object to compare
|
114
|
+
# @return [true,false]
|
92
115
|
def ==( other )
|
93
116
|
comparison_attributes = lambda{ |area| [ area.area_desc, area.altitude, area.ceiling, area.circles, area.geocodes, area.polygons ]}
|
94
117
|
comparison_attributes.call( self ) == comparison_attributes.call( other )
|
95
118
|
end
|
96
119
|
|
97
|
-
|
98
|
-
|
120
|
+
# @return [String]
|
121
|
+
def inspect
|
122
|
+
area_inspect = "Area Description: #{ @area_desc }\n"+
|
99
123
|
"Polygons:\n"+
|
100
|
-
|
101
|
-
"Circles: #{
|
102
|
-
"Geocodes: #{
|
124
|
+
@polygons.map{ |polygon| " " + polygon.inspect }.join("\n" )+"\n"+
|
125
|
+
"Circles: #{ @circles.inspect }\n"+
|
126
|
+
"Geocodes: #{ @geocodes.inspect }\n"
|
103
127
|
RCAP.format_lines_for_inspect( 'AREA', area_inspect )
|
104
128
|
end
|
105
129
|
|
106
|
-
# Returns
|
107
|
-
#
|
130
|
+
# Returns the area description
|
131
|
+
#
|
132
|
+
# @return [String]
|
108
133
|
def to_s
|
109
|
-
|
134
|
+
@area_desc
|
110
135
|
end
|
111
136
|
|
112
|
-
|
137
|
+
# @param [REXML::Element] area_xml_element
|
138
|
+
# @return [Area]
|
139
|
+
def self.from_xml_element( area_xml_element )
|
113
140
|
self.new( :area_desc => RCAP.xpath_text( area_xml_element, AREA_DESC_XPATH, Alert::XMLNS ),
|
114
141
|
:altitude => (( alt = RCAP.xpath_text( area_xml_element, ALTITUDE_XPATH, Alert::XMLNS )) ? alt.to_f : nil ),
|
115
142
|
:ceiling => (( ceil = RCAP.xpath_text( area_xml_element, CEILING_XPATH, Alert::XMLNS )) ? ceil.to_f : nil ),
|
@@ -118,25 +145,28 @@ module RCAP
|
|
118
145
|
:polygons => RCAP.xpath_match( area_xml_element, Polygon::XPATH, Alert::XMLNS ).map{ |polygon_element| Polygon.from_xml_element( polygon_element )})
|
119
146
|
end
|
120
147
|
|
121
|
-
AREA_DESC_YAML = 'Area Description'
|
122
|
-
ALTITUDE_YAML = 'Altitude'
|
123
|
-
CEILING_YAML = 'Ceiling'
|
124
|
-
CIRCLES_YAML = 'Circles'
|
125
|
-
GEOCODES_YAML = 'Geocodes'
|
126
|
-
POLYGONS_YAML = 'Polygons'
|
148
|
+
AREA_DESC_YAML = 'Area Description'
|
149
|
+
ALTITUDE_YAML = 'Altitude'
|
150
|
+
CEILING_YAML = 'Ceiling'
|
151
|
+
CIRCLES_YAML = 'Circles'
|
152
|
+
GEOCODES_YAML = 'Geocodes'
|
153
|
+
POLYGONS_YAML = 'Polygons'
|
127
154
|
|
128
|
-
|
155
|
+
# @return [String] YAML representation of object
|
156
|
+
def to_yaml( options = {} )
|
129
157
|
RCAP.attribute_values_to_hash(
|
130
|
-
[ AREA_DESC_YAML,
|
131
|
-
[ ALTITUDE_YAML,
|
132
|
-
[ CEILING_YAML,
|
133
|
-
[ CIRCLES_YAML,
|
134
|
-
[ GEOCODES_YAML,
|
135
|
-
[ POLYGONS_YAML,
|
158
|
+
[ AREA_DESC_YAML, @area_desc ],
|
159
|
+
[ ALTITUDE_YAML, @altitude ],
|
160
|
+
[ CEILING_YAML, @ceiling ],
|
161
|
+
[ CIRCLES_YAML, @circles.map{ |circle| [ circle.lattitude, circle.longitude, circle.radius ]}],
|
162
|
+
[ GEOCODES_YAML, @geocodes.inject({}){|h,geocode| h.merge( geocode.name => geocode.value )}],
|
163
|
+
[ POLYGONS_YAML, @polygons ]
|
136
164
|
).to_yaml( options )
|
137
165
|
end
|
138
166
|
|
139
|
-
|
167
|
+
# @param [Hash] area_yaml_data
|
168
|
+
# @return [Area]
|
169
|
+
def self.from_yaml_data( area_yaml_data )
|
140
170
|
self.new( :area_desc => area_yaml_data[ AREA_DESC_YAML ],
|
141
171
|
:altitude => area_yaml_data[ ALTITUDE_YAML ],
|
142
172
|
:ceiling => area_yaml_data[ CEILING_YAML ],
|
@@ -145,23 +175,26 @@ module RCAP
|
|
145
175
|
:polygons => Array( area_yaml_data[ POLYGONS_YAML ]).map{ |polyon_yaml_data| Polygon.from_yaml_data( polyon_yaml_data )})
|
146
176
|
end
|
147
177
|
|
148
|
-
AREA_DESC_KEY = 'area_desc'
|
149
|
-
ALTITUDE_KEY = 'altitude'
|
150
|
-
CEILING_KEY = 'ceiling'
|
151
|
-
CIRCLES_KEY = 'circles'
|
152
|
-
GEOCODES_KEY = 'geocodes'
|
153
|
-
POLYGONS_KEY = 'polygons'
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
[
|
159
|
-
[
|
160
|
-
[
|
161
|
-
[
|
178
|
+
AREA_DESC_KEY = 'area_desc'
|
179
|
+
ALTITUDE_KEY = 'altitude'
|
180
|
+
CEILING_KEY = 'ceiling'
|
181
|
+
CIRCLES_KEY = 'circles'
|
182
|
+
GEOCODES_KEY = 'geocodes'
|
183
|
+
POLYGONS_KEY = 'polygons'
|
184
|
+
|
185
|
+
# @return [Hash]
|
186
|
+
def to_h
|
187
|
+
RCAP.attribute_values_to_hash( [ AREA_DESC_KEY, @area_desc ],
|
188
|
+
[ ALTITUDE_KEY, @altitude ],
|
189
|
+
[ CEILING_KEY, @ceiling ],
|
190
|
+
[ CIRCLES_KEY, @circles.map{ |circle| circle.to_h } ],
|
191
|
+
[ GEOCODES_KEY, @geocodes.map{ |geocode| geocode.to_h } ],
|
192
|
+
[ POLYGONS_KEY, @polygons.map{ |polygon| polygon.to_h } ])
|
162
193
|
end
|
163
194
|
|
164
|
-
|
195
|
+
# @param [Hash] area_hash
|
196
|
+
# @return [Area]
|
197
|
+
def self.from_h( area_hash )
|
165
198
|
self.new(
|
166
199
|
:area_desc => area_hash[ AREA_DESC_KEY ],
|
167
200
|
:altitude => area_hash[ ALTITUDE_KEY ],
|
data/lib/rcap/cap_1_1/circle.rb
CHANGED
@@ -6,48 +6,64 @@ module RCAP
|
|
6
6
|
class Circle < Point
|
7
7
|
include Validation
|
8
8
|
|
9
|
-
# Expresed in kilometers
|
9
|
+
# @return [Numeric] Expresed in kilometers
|
10
10
|
attr_accessor( :radius )
|
11
11
|
|
12
12
|
validates_presence_of( :radius )
|
13
13
|
validates_numericality_of( :radius , greater_than_or_equal: 0 )
|
14
14
|
|
15
|
-
XML_ELEMENT_NAME = 'circle'
|
15
|
+
XML_ELEMENT_NAME = 'circle'
|
16
16
|
|
17
|
-
XPATH = 'cap:circle'
|
17
|
+
XPATH = 'cap:circle'
|
18
18
|
|
19
|
+
# @param [Hash] attributes
|
20
|
+
# @option attributes [Numeric] :lattitude
|
21
|
+
# @option attributes [Numeric] :longitude
|
22
|
+
# @option attributes [Numeric] :radius
|
19
23
|
def initialize( attributes = {} )
|
20
24
|
super( attributes )
|
21
25
|
@radius = attributes[ :radius ]
|
22
26
|
end
|
23
27
|
|
24
28
|
# Returns a string representation of the circle of the form
|
25
|
-
# lattitude,longitude
|
26
|
-
|
27
|
-
|
29
|
+
# lattitude,longitude radius
|
30
|
+
#
|
31
|
+
# @return [String]
|
32
|
+
def to_s
|
33
|
+
"#{ @lattitude },#{ @longitude } #{ @radius }"
|
28
34
|
end
|
29
35
|
|
30
|
-
|
36
|
+
# @return [String]
|
37
|
+
def inspect
|
31
38
|
"(#{ self.to_s })"
|
32
39
|
end
|
33
40
|
|
34
|
-
|
41
|
+
# @return [REXML::Element]
|
42
|
+
def to_xml_element
|
35
43
|
xml_element = REXML::Element.new( XML_ELEMENT_NAME )
|
36
44
|
xml_element.add_text( self.to_s )
|
37
45
|
xml_element
|
38
46
|
end
|
39
47
|
|
40
|
-
|
48
|
+
# @return [String]
|
49
|
+
def to_xml
|
41
50
|
self.to_xml_element.to_s
|
42
51
|
end
|
43
52
|
|
44
|
-
|
53
|
+
# Parses a circle string of the form
|
54
|
+
# lattitude,longitude radius
|
55
|
+
#
|
56
|
+
# @param [String] circle_string
|
57
|
+
# @return [Array(Float,Float,Float)]
|
58
|
+
def self.parse_circle_string( circle_string )
|
45
59
|
coordinates, radius = circle_string.split( ' ' )
|
46
60
|
lattitude, longitude = coordinates.split( ',' )
|
47
61
|
[ lattitude, longitude, radius ].map{ |e| e.to_f }
|
48
62
|
end
|
49
63
|
|
50
|
-
|
64
|
+
# @param [REXML::Element] circle_xml_element
|
65
|
+
# @return [Circle]
|
66
|
+
def self.from_xml_element( circle_xml_element )
|
51
67
|
lattitude, longitude, radius = self.parse_circle_string( circle_xml_element.text )
|
52
68
|
circle = self.new( :lattitude => lattitude,
|
53
69
|
:longitude => longitude,
|
@@ -55,26 +71,37 @@ module RCAP
|
|
55
71
|
end
|
56
72
|
|
57
73
|
# Two circles are equivalent if their lattitude, longitude and radius are equal.
|
74
|
+
#
|
75
|
+
# @param [Circle] other
|
76
|
+
# @return [true,false]
|
58
77
|
def ==( other )
|
59
|
-
[
|
78
|
+
[ @lattitude, @longitude, @radius ] == [ other.lattitude, other.longitude, other.radius ]
|
60
79
|
end
|
61
80
|
|
62
|
-
|
81
|
+
# @param [Array(Numeric, Numeric, Numeric)] circle_yaml_data lattitude, longitude, radius
|
82
|
+
# @return [Circle]
|
83
|
+
def self.from_yaml_data( circle_yaml_data )
|
63
84
|
lattitude, longitude,radius = circle_yaml_data
|
64
85
|
self.new( :lattitude => lattitude, :longitude => longitude, :radius => radius )
|
65
86
|
end
|
66
87
|
|
67
|
-
RADIUS_KEY = 'radius'
|
68
|
-
LATTITUDE_KEY = 'lattitude'
|
69
|
-
LONGITUDE_KEY = 'longitude'
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
88
|
+
RADIUS_KEY = 'radius'
|
89
|
+
LATTITUDE_KEY = 'lattitude'
|
90
|
+
LONGITUDE_KEY = 'longitude'
|
91
|
+
|
92
|
+
# @return [Hash]
|
93
|
+
def to_h
|
94
|
+
RCAP.attribute_values_to_hash( [ RADIUS_KEY, @radius ],
|
95
|
+
[ LATTITUDE_KEY, @lattitude ],
|
96
|
+
[ LONGITUDE_KEY, @longitude ])
|
74
97
|
end
|
75
98
|
|
76
|
-
|
77
|
-
|
99
|
+
# @param [Hash]
|
100
|
+
# @return [Circle]
|
101
|
+
def self.from_h( circle_hash )
|
102
|
+
self.new( :radius => circle_hash[ RADIUS_KEY ],
|
103
|
+
:lattitude => circle_hash[ LATTITUDE_KEY ],
|
104
|
+
:longitude => circle_hash[ LONGITUDE_KEY ])
|
78
105
|
end
|
79
106
|
end
|
80
107
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
module RCAP
|
2
2
|
module CAP_1_1
|
3
|
+
# Subclass of {Parameter}
|
3
4
|
class EventCode < Parameter
|
4
|
-
XML_ELEMENT_NAME = 'eventCode'
|
5
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
5
|
+
XML_ELEMENT_NAME = 'eventCode'
|
6
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
6
7
|
end
|
7
8
|
end
|
8
9
|
end
|
data/lib/rcap/cap_1_1/geocode.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module RCAP
|
2
2
|
module CAP_1_1
|
3
|
+
# Subclass of {Parameter}
|
3
4
|
class Geocode < Parameter
|
4
|
-
XML_ELEMENT_NAME = 'geocode'
|
5
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
5
|
+
XML_ELEMENT_NAME = 'geocode'
|
6
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
6
7
|
end
|
7
8
|
end
|
8
9
|
end
|
data/lib/rcap/cap_1_1/info.rb
CHANGED
@@ -11,102 +11,102 @@ module RCAP
|
|
11
11
|
class Info
|
12
12
|
include Validation
|
13
13
|
|
14
|
-
CATEGORY_GEO = "Geo"
|
15
|
-
CATEGORY_MET = "Met"
|
16
|
-
CATEGORY_SAFETY = "Safety"
|
17
|
-
CATEGORY_SECURITY = "Security"
|
18
|
-
CATEGORY_RESCUE = "Rescue"
|
19
|
-
CATEGORY_FIRE = "Fire"
|
20
|
-
CATEGORY_HEALTH = "Health"
|
21
|
-
CATEGORY_ENV = "Env"
|
22
|
-
CATEGORY_TRANSPORT = "Transport"
|
23
|
-
CATEGORY_INFRA = "Infra"
|
24
|
-
CATEGORY_CBRNE = "CBRNE"
|
25
|
-
CATEGORY_OTHER = "Other"
|
14
|
+
CATEGORY_GEO = "Geo"
|
15
|
+
CATEGORY_MET = "Met"
|
16
|
+
CATEGORY_SAFETY = "Safety"
|
17
|
+
CATEGORY_SECURITY = "Security"
|
18
|
+
CATEGORY_RESCUE = "Rescue"
|
19
|
+
CATEGORY_FIRE = "Fire"
|
20
|
+
CATEGORY_HEALTH = "Health"
|
21
|
+
CATEGORY_ENV = "Env"
|
22
|
+
CATEGORY_TRANSPORT = "Transport"
|
23
|
+
CATEGORY_INFRA = "Infra"
|
24
|
+
CATEGORY_CBRNE = "CBRNE"
|
25
|
+
CATEGORY_OTHER = "Other"
|
26
26
|
# Valid values for categories
|
27
27
|
VALID_CATEGORIES = [ CATEGORY_GEO, CATEGORY_MET, CATEGORY_SAFETY,
|
28
28
|
CATEGORY_SECURITY, CATEGORY_RESCUE, CATEGORY_FIRE, CATEGORY_HEALTH,
|
29
29
|
CATEGORY_ENV, CATEGORY_TRANSPORT, CATEGORY_INFRA, CATEGORY_CBRNE,
|
30
30
|
CATEGORY_OTHER ]
|
31
31
|
|
32
|
-
RESPONSE_TYPE_SHELTER = "Shelter"
|
33
|
-
RESPONSE_TYPE_EVACUATE = "Evacuate"
|
34
|
-
RESPONSE_TYPE_PREPARE = "Prepare"
|
35
|
-
RESPONSE_TYPE_EXECUTE = "Execute"
|
36
|
-
RESPONSE_TYPE_MONITOR = "Monitor"
|
37
|
-
RESPONSE_TYPE_ASSESS = "Assess"
|
38
|
-
RESPONSE_TYPE_NONE = "None"
|
32
|
+
RESPONSE_TYPE_SHELTER = "Shelter"
|
33
|
+
RESPONSE_TYPE_EVACUATE = "Evacuate"
|
34
|
+
RESPONSE_TYPE_PREPARE = "Prepare"
|
35
|
+
RESPONSE_TYPE_EXECUTE = "Execute"
|
36
|
+
RESPONSE_TYPE_MONITOR = "Monitor"
|
37
|
+
RESPONSE_TYPE_ASSESS = "Assess"
|
38
|
+
RESPONSE_TYPE_NONE = "None"
|
39
39
|
# Valid values for response_type
|
40
40
|
VALID_RESPONSE_TYPES = [ RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE,
|
41
41
|
RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR,
|
42
42
|
RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_NONE ]
|
43
43
|
|
44
|
-
URGENCY_IMMEDIATE = "Immediate"
|
45
|
-
URGENCY_EXPECTED = "Expected"
|
46
|
-
URGENCY_FUTURE = "Future"
|
47
|
-
URGENCY_PAST = "Past"
|
48
|
-
URGENCY_UNKNOWN = "Unknown"
|
44
|
+
URGENCY_IMMEDIATE = "Immediate"
|
45
|
+
URGENCY_EXPECTED = "Expected"
|
46
|
+
URGENCY_FUTURE = "Future"
|
47
|
+
URGENCY_PAST = "Past"
|
48
|
+
URGENCY_UNKNOWN = "Unknown"
|
49
49
|
# Valid values for urgency
|
50
50
|
VALID_URGENCIES = [ URGENCY_IMMEDIATE, URGENCY_EXPECTED, URGENCY_FUTURE,
|
51
51
|
URGENCY_PAST, URGENCY_UNKNOWN ]
|
52
52
|
|
53
|
-
SEVERITY_EXTREME = "Extreme"
|
54
|
-
SEVERITY_SEVERE = "Severe"
|
55
|
-
SEVERITY_MODERATE = "Moderate"
|
56
|
-
SEVERITY_MINOR = "Minor"
|
57
|
-
SEVERITY_UNKNOWN = "Unknown"
|
53
|
+
SEVERITY_EXTREME = "Extreme"
|
54
|
+
SEVERITY_SEVERE = "Severe"
|
55
|
+
SEVERITY_MODERATE = "Moderate"
|
56
|
+
SEVERITY_MINOR = "Minor"
|
57
|
+
SEVERITY_UNKNOWN = "Unknown"
|
58
58
|
# Valid values for severity
|
59
59
|
VALID_SEVERITIES = [ SEVERITY_EXTREME, SEVERITY_SEVERE, SEVERITY_MODERATE,
|
60
60
|
SEVERITY_MINOR, SEVERITY_UNKNOWN ]
|
61
61
|
|
62
|
-
CERTAINTY_OBSERVED = "Observed"
|
63
|
-
CERTAINTY_LIKELY = "Likely"
|
64
|
-
CERTAINTY_POSSIBLE = "Possible"
|
65
|
-
CERTAINTY_UNLIKELY = "Unlikely"
|
66
|
-
CERTAINTY_UNKNOWN = "Unknown"
|
62
|
+
CERTAINTY_OBSERVED = "Observed"
|
63
|
+
CERTAINTY_LIKELY = "Likely"
|
64
|
+
CERTAINTY_POSSIBLE = "Possible"
|
65
|
+
CERTAINTY_UNLIKELY = "Unlikely"
|
66
|
+
CERTAINTY_UNKNOWN = "Unknown"
|
67
67
|
# Valid valies for certainty
|
68
68
|
VALID_CERTAINTIES = [ CERTAINTY_OBSERVED, CERTAINTY_LIKELY,
|
69
69
|
CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN ]
|
70
70
|
|
71
|
-
XML_ELEMENT_NAME = 'info'
|
72
|
-
LANGUAGE_ELEMENT_NAME = 'language'
|
73
|
-
CATEGORY_ELEMENT_NAME = 'category'
|
74
|
-
EVENT_ELEMENT_NAME = 'event'
|
75
|
-
RESPONSE_TYPE_ELEMENT_NAME = 'responseType'
|
76
|
-
URGENCY_ELEMENT_NAME = 'urgency'
|
77
|
-
SEVERITY_ELEMENT_NAME = 'severity'
|
78
|
-
CERTAINTY_ELEMENT_NAME = 'certainty'
|
79
|
-
AUDIENCE_ELEMENT_NAME = 'audience'
|
80
|
-
EVENT_CODE_ELEMENT_NAME = 'eventCode'
|
81
|
-
EFFECTIVE_ELEMENT_NAME = 'effective'
|
82
|
-
ONSET_ELEMENT_NAME = 'onset'
|
83
|
-
EXPIRES_ELEMENT_NAME = 'expires'
|
84
|
-
SENDER_NAME_ELEMENT_NAME = 'senderName'
|
85
|
-
HEADLINE_ELEMENT_NAME = 'headline'
|
86
|
-
DESCRIPTION_ELEMENT_NAME = 'description'
|
87
|
-
INSTRUCTION_ELEMENT_NAME = 'instruction'
|
88
|
-
WEB_ELEMENT_NAME = 'web'
|
89
|
-
CONTACT_ELEMENT_NAME = 'contact'
|
71
|
+
XML_ELEMENT_NAME = 'info'
|
72
|
+
LANGUAGE_ELEMENT_NAME = 'language'
|
73
|
+
CATEGORY_ELEMENT_NAME = 'category'
|
74
|
+
EVENT_ELEMENT_NAME = 'event'
|
75
|
+
RESPONSE_TYPE_ELEMENT_NAME = 'responseType'
|
76
|
+
URGENCY_ELEMENT_NAME = 'urgency'
|
77
|
+
SEVERITY_ELEMENT_NAME = 'severity'
|
78
|
+
CERTAINTY_ELEMENT_NAME = 'certainty'
|
79
|
+
AUDIENCE_ELEMENT_NAME = 'audience'
|
80
|
+
EVENT_CODE_ELEMENT_NAME = 'eventCode'
|
81
|
+
EFFECTIVE_ELEMENT_NAME = 'effective'
|
82
|
+
ONSET_ELEMENT_NAME = 'onset'
|
83
|
+
EXPIRES_ELEMENT_NAME = 'expires'
|
84
|
+
SENDER_NAME_ELEMENT_NAME = 'senderName'
|
85
|
+
HEADLINE_ELEMENT_NAME = 'headline'
|
86
|
+
DESCRIPTION_ELEMENT_NAME = 'description'
|
87
|
+
INSTRUCTION_ELEMENT_NAME = 'instruction'
|
88
|
+
WEB_ELEMENT_NAME = 'web'
|
89
|
+
CONTACT_ELEMENT_NAME = 'contact'
|
90
90
|
|
91
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
92
|
-
LANGUAGE_XPATH = "cap:#{ LANGUAGE_ELEMENT_NAME }"
|
93
|
-
EVENT_XPATH = "cap:#{ EVENT_ELEMENT_NAME }"
|
94
|
-
URGENCY_XPATH = "cap:#{ URGENCY_ELEMENT_NAME }"
|
95
|
-
RESPONSE_TYPE_XPATH = "cap:#{ RESPONSE_TYPE_ELEMENT_NAME }"
|
96
|
-
CATEGORY_XPATH = "cap:#{ CATEGORY_ELEMENT_NAME }"
|
97
|
-
SEVERITY_XPATH = "cap:#{ SEVERITY_ELEMENT_NAME }"
|
98
|
-
CERTAINTY_XPATH = "cap:#{ CERTAINTY_ELEMENT_NAME }"
|
99
|
-
AUDIENCE_XPATH = "cap:#{ AUDIENCE_ELEMENT_NAME }"
|
100
|
-
EVENT_CODE_XPATH = "cap:#{ EVENT_CODE_ELEMENT_NAME }"
|
101
|
-
EFFECTIVE_XPATH = "cap:#{ EFFECTIVE_ELEMENT_NAME }"
|
102
|
-
ONSET_XPATH = "cap:#{ ONSET_ELEMENT_NAME }"
|
103
|
-
EXPIRES_XPATH = "cap:#{ EXPIRES_ELEMENT_NAME }"
|
104
|
-
SENDER_NAME_XPATH = "cap:#{ SENDER_NAME_ELEMENT_NAME }"
|
105
|
-
HEADLINE_XPATH = "cap:#{ HEADLINE_ELEMENT_NAME }"
|
106
|
-
DESCRIPTION_XPATH = "cap:#{ DESCRIPTION_ELEMENT_NAME }"
|
107
|
-
INSTRUCTION_XPATH = "cap:#{ INSTRUCTION_ELEMENT_NAME }"
|
108
|
-
WEB_XPATH = "cap:#{ WEB_ELEMENT_NAME }"
|
109
|
-
CONTACT_XPATH = "cap:#{ CONTACT_ELEMENT_NAME }"
|
91
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
92
|
+
LANGUAGE_XPATH = "cap:#{ LANGUAGE_ELEMENT_NAME }"
|
93
|
+
EVENT_XPATH = "cap:#{ EVENT_ELEMENT_NAME }"
|
94
|
+
URGENCY_XPATH = "cap:#{ URGENCY_ELEMENT_NAME }"
|
95
|
+
RESPONSE_TYPE_XPATH = "cap:#{ RESPONSE_TYPE_ELEMENT_NAME }"
|
96
|
+
CATEGORY_XPATH = "cap:#{ CATEGORY_ELEMENT_NAME }"
|
97
|
+
SEVERITY_XPATH = "cap:#{ SEVERITY_ELEMENT_NAME }"
|
98
|
+
CERTAINTY_XPATH = "cap:#{ CERTAINTY_ELEMENT_NAME }"
|
99
|
+
AUDIENCE_XPATH = "cap:#{ AUDIENCE_ELEMENT_NAME }"
|
100
|
+
EVENT_CODE_XPATH = "cap:#{ EVENT_CODE_ELEMENT_NAME }"
|
101
|
+
EFFECTIVE_XPATH = "cap:#{ EFFECTIVE_ELEMENT_NAME }"
|
102
|
+
ONSET_XPATH = "cap:#{ ONSET_ELEMENT_NAME }"
|
103
|
+
EXPIRES_XPATH = "cap:#{ EXPIRES_ELEMENT_NAME }"
|
104
|
+
SENDER_NAME_XPATH = "cap:#{ SENDER_NAME_ELEMENT_NAME }"
|
105
|
+
HEADLINE_XPATH = "cap:#{ HEADLINE_ELEMENT_NAME }"
|
106
|
+
DESCRIPTION_XPATH = "cap:#{ DESCRIPTION_ELEMENT_NAME }"
|
107
|
+
INSTRUCTION_XPATH = "cap:#{ INSTRUCTION_ELEMENT_NAME }"
|
108
|
+
WEB_XPATH = "cap:#{ WEB_ELEMENT_NAME }"
|
109
|
+
CONTACT_XPATH = "cap:#{ CONTACT_ELEMENT_NAME }"
|
110
110
|
|
111
111
|
DEFAULT_LANGUAGE = 'en-US'
|
112
112
|
|
@@ -119,41 +119,72 @@ module RCAP
|
|
119
119
|
validates_inclusion_of_members_of( :categories, :in => VALID_CATEGORIES, :allow_blank => true )
|
120
120
|
validates_collection_of( :resources, :areas, :event_codes, :parameters )
|
121
121
|
|
122
|
+
# @return [String]
|
122
123
|
attr_accessor( :event )
|
123
|
-
# Value can only be one of VALID_URGENCIES
|
124
|
+
# @return [String] Value can only be one of {VALID_URGENCIES}
|
124
125
|
attr_accessor( :urgency )
|
125
|
-
# Value can only be one of VALID_SEVERITIES
|
126
|
+
# @return [String] Value can only be one of {VALID_SEVERITIES}
|
126
127
|
attr_accessor( :severity )
|
127
|
-
# Value can only be one of VALID_CERTAINTIES
|
128
|
+
# @return [String] Value can only be one of {VALID_CERTAINTIES}
|
128
129
|
attr_accessor( :certainty )
|
130
|
+
# @return [String]
|
129
131
|
attr_accessor( :language )
|
132
|
+
# @return [String]
|
130
133
|
attr_accessor( :audience )
|
131
|
-
# Effective start time of information
|
134
|
+
# @return [DateTime] Effective start time of information
|
132
135
|
attr_accessor( :effective )
|
133
|
-
# Expected start of event
|
136
|
+
# @return [DateTime] Expected start of event
|
134
137
|
attr_accessor( :onset )
|
135
|
-
# Effective expiry time of information
|
138
|
+
# @return [DateTime] Effective expiry time of information
|
136
139
|
attr_accessor( :expires )
|
140
|
+
# @return [String]
|
137
141
|
attr_accessor( :sender_name )
|
142
|
+
# @return [String]
|
138
143
|
attr_accessor( :headline )
|
144
|
+
# @return [String]
|
139
145
|
attr_accessor( :description )
|
146
|
+
# @return [String]
|
140
147
|
attr_accessor( :instruction )
|
148
|
+
# @return [String]
|
141
149
|
attr_accessor( :web )
|
150
|
+
# @return [String]
|
142
151
|
attr_accessor( :contact )
|
143
152
|
|
144
|
-
# Collection of textual categories; elements can be one of VALID_CATEGORIES
|
153
|
+
# @return [Array<String>] Collection of textual categories; elements can be one of {VALID_CATEGORIES}
|
145
154
|
attr_reader( :categories )
|
146
|
-
#
|
155
|
+
# @return [Array<String>] Collection of textual response types; elements must be from {VALID_RESPONSE_TYPES}
|
147
156
|
attr_reader( :response_types )
|
148
|
-
#
|
157
|
+
# @return [Array<EventCode>] Collection of {EventCode} objects
|
149
158
|
attr_reader( :event_codes )
|
150
|
-
# Collection of Parameter objects
|
159
|
+
# @return [Array<Parameter>] Collection of {Parameter} objects
|
151
160
|
attr_reader( :parameters )
|
152
|
-
# Collection of Resource objects
|
161
|
+
# @return [Array<Resource> Collection of {Resource} objects
|
153
162
|
attr_reader( :resources )
|
154
|
-
# Collection of Area objects
|
163
|
+
# @return [Array<Area>] Collection of {Area} objects
|
155
164
|
attr_reader( :areas )
|
156
165
|
|
166
|
+
# @param [Hash] attributes
|
167
|
+
# @option attributes [String] :language Defaults to {DEFAULT_LANGUAGE}
|
168
|
+
# @option attributes [Array<String>] :categories Collection of categories in {VALID_CATEGORIES}
|
169
|
+
# @option attributes [String] :audience
|
170
|
+
# @option attributes [String] :event
|
171
|
+
# @option attributes [Array<String>] :response_types Collection of textual response types from {VALID_RESPONSE_TYPES}
|
172
|
+
# @option attributes [String] :urgency A member of {VALID_URGENCIES}
|
173
|
+
# @option attributes [String] :severity A member of {VALID_SEVERITIES}
|
174
|
+
# @option attributes [String] :certainty A member of {VALID_CERTAINTIES}
|
175
|
+
# @option attributes [DateTime] :effective
|
176
|
+
# @option attributes [DateTime] :onset
|
177
|
+
# @option attributes [DateTime] :expires
|
178
|
+
# @option attributes [Array<EventCode>] :event_codes Collection of {EventCode} objects
|
179
|
+
# @option attributes [String] :sender_name
|
180
|
+
# @option attributes [String] :headline
|
181
|
+
# @option attributes [String] :description
|
182
|
+
# @option attributes [String] :instruction
|
183
|
+
# @option attributes [String] :web URL
|
184
|
+
# @option attributes [String] :contact
|
185
|
+
# @option attributes [Array<Parameter>] :parameters Collection of {Parameter} objects
|
186
|
+
# @option attributes [Array<Resource>] :resources Collection of {Resource} objects
|
187
|
+
# @option attributes [Array<Area>] :areas Collection of {Area} objects
|
157
188
|
def initialize( attributes = {} )
|
158
189
|
@language = attributes[ :language ] || DEFAULT_LANGUAGE
|
159
190
|
@categories = Array( attributes[ :categories ])
|
@@ -180,62 +211,83 @@ module RCAP
|
|
180
211
|
|
181
212
|
# Creates a new EventCode object and adds it to the event_codes array. The
|
182
213
|
# event_code_attributes are passed as a parameter to EventCode.new.
|
214
|
+
#
|
215
|
+
# @see EventCode#initialize
|
216
|
+
#
|
217
|
+
# @param [Hash] event_code_attributes (see EventCode#initialize)
|
218
|
+
# @return [EventCode]
|
183
219
|
def add_event_code( event_code_attributes = {})
|
184
220
|
event_code = EventCode.new( event_code_attributes )
|
185
|
-
|
221
|
+
@event_codes << event_code
|
186
222
|
event_code
|
187
223
|
end
|
188
224
|
|
189
225
|
# Creates a new Parameter object and adds it to the parameters array. The
|
190
226
|
# parameter_attributes are passed as a parameter to Parameter.new.
|
227
|
+
#
|
228
|
+
# @see Parameter#initialize
|
229
|
+
#
|
230
|
+
# @param [Hash] parameter_attributes (see Parameter#initialize)
|
231
|
+
# @return [Parameter]
|
191
232
|
def add_parameter( parameter_attributes = {})
|
192
233
|
parameter = Parameter.new( parameter_attributes )
|
193
|
-
|
234
|
+
@parameters << parameter
|
194
235
|
parameter
|
195
236
|
end
|
196
237
|
|
197
238
|
# Creates a new Resource object and adds it to the resources array. The
|
198
239
|
# resource_attributes are passed as a parameter to Resource.new.
|
240
|
+
#
|
241
|
+
# @see Resource#initialize
|
242
|
+
#
|
243
|
+
# @param [Hash] resource_attributes (See Resource#initialize)
|
244
|
+
# @return [Resource]
|
199
245
|
def add_resource( resource_attributes = {})
|
200
246
|
resource = Resource.new( resource_attributes )
|
201
|
-
|
247
|
+
@resources << resource
|
202
248
|
resource
|
203
249
|
end
|
204
250
|
|
205
251
|
# Creates a new Area object and adds it to the areas array. The
|
206
252
|
# area_attributes are passed as a parameter to Area.new.
|
253
|
+
#
|
254
|
+
# @see Area#initialize
|
255
|
+
#
|
256
|
+
# @param [Hash] area_attributes (see Area#initialize)
|
257
|
+
# @return [Area]
|
207
258
|
def add_area( area_attributes = {})
|
208
259
|
area = Area.new( area_attributes )
|
209
|
-
|
260
|
+
@areas << area
|
210
261
|
area
|
211
262
|
end
|
212
263
|
|
213
|
-
|
264
|
+
# @return [REXML::Element]
|
265
|
+
def to_xml_element
|
214
266
|
xml_element = REXML::Element.new( XML_ELEMENT_NAME )
|
215
|
-
xml_element.add_element( LANGUAGE_ELEMENT_NAME ).add_text(
|
267
|
+
xml_element.add_element( LANGUAGE_ELEMENT_NAME ).add_text( @language ) if @language
|
216
268
|
@categories.each do |category|
|
217
269
|
xml_element.add_element( CATEGORY_ELEMENT_NAME ).add_text( category )
|
218
270
|
end
|
219
|
-
xml_element.add_element( EVENT_ELEMENT_NAME ).add_text(
|
271
|
+
xml_element.add_element( EVENT_ELEMENT_NAME ).add_text( @event )
|
220
272
|
@response_types.each do |response_type|
|
221
273
|
xml_element.add_element( RESPONSE_TYPE_ELEMENT_NAME ).add_text( response_type )
|
222
274
|
end
|
223
|
-
xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text(
|
224
|
-
xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text(
|
225
|
-
xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text(
|
226
|
-
xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text(
|
275
|
+
xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text( @urgency )
|
276
|
+
xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text( @severity )
|
277
|
+
xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text( @certainty )
|
278
|
+
xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text( @audience ) if @audience
|
227
279
|
@event_codes.each do |event_code|
|
228
280
|
xml_element.add_element( event_code.to_xml_element )
|
229
281
|
end
|
230
|
-
xml_element.add_element( EFFECTIVE_ELEMENT_NAME ).add_text(
|
231
|
-
xml_element.add_element( ONSET_ELEMENT_NAME ).add_text(
|
232
|
-
xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text(
|
233
|
-
xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text(
|
234
|
-
xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text(
|
235
|
-
xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text(
|
236
|
-
xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text(
|
237
|
-
xml_element.add_element( WEB_ELEMENT_NAME ).add_text(
|
238
|
-
xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text(
|
282
|
+
xml_element.add_element( EFFECTIVE_ELEMENT_NAME ).add_text( @effective.to_s_for_cap ) if @effective
|
283
|
+
xml_element.add_element( ONSET_ELEMENT_NAME ).add_text( @onset.to_s_for_cap ) if @onset
|
284
|
+
xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text( @expires.to_s_for_cap ) if @expires
|
285
|
+
xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text( @sender_name ) if @sender_name
|
286
|
+
xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text( @headline ) if @headline
|
287
|
+
xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text( @description ) if @description
|
288
|
+
xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text( @instruction ) if @instruction
|
289
|
+
xml_element.add_element( WEB_ELEMENT_NAME ).add_text( @web ) if @web
|
290
|
+
xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text( @contact ) if @contact
|
239
291
|
@parameters.each do |parameter|
|
240
292
|
xml_element.add_element( parameter.to_xml_element )
|
241
293
|
end
|
@@ -248,46 +300,52 @@ module RCAP
|
|
248
300
|
xml_element
|
249
301
|
end
|
250
302
|
|
251
|
-
|
303
|
+
# @return [String]
|
304
|
+
def to_xml
|
252
305
|
self.to_xml_element.to_s
|
253
306
|
end
|
254
307
|
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
"
|
259
|
-
"
|
260
|
-
"
|
261
|
-
"
|
262
|
-
"
|
263
|
-
"
|
264
|
-
"
|
265
|
-
"
|
266
|
-
"
|
267
|
-
"
|
268
|
-
"
|
269
|
-
"
|
308
|
+
# @return [String]
|
309
|
+
def inspect
|
310
|
+
info_inspect = "Language: #{ @language }\n"+
|
311
|
+
"Categories: #{ @categories.to_s_for_cap }\n"+
|
312
|
+
"Event: #{ @event }\n"+
|
313
|
+
"Response Types: #{ @response_types.to_s_for_cap }\n"+
|
314
|
+
"Urgency: #{ @urgency }\n"+
|
315
|
+
"Severity: #{ @severity }\n"+
|
316
|
+
"Certainty: #{ @certainty }\n"+
|
317
|
+
"Audience: #{ @audience }\n"+
|
318
|
+
"Event Codes: #{ @event_codes.inspect }\n"+
|
319
|
+
"Effective: #{ @effective }\n"+
|
320
|
+
"Onset: #{ @onset }\n"+
|
321
|
+
"Expires: #{ @expires }\n"+
|
322
|
+
"Sender Name: #{ @sender_name }\n"+
|
323
|
+
"Headline: #{ @headline }\n"+
|
270
324
|
"Description:\n"+
|
271
|
-
|
272
|
-
"Instruction: #{
|
273
|
-
"Web: #{
|
274
|
-
"Contact: #{
|
325
|
+
@description.to_s.lines.map{ |line| " " + line }.join( "\n")+"\n"+
|
326
|
+
"Instruction: #{ @instruction }\n"+
|
327
|
+
"Web: #{ @web }\n"+
|
328
|
+
"Contact: #{ @contact }\n"+
|
275
329
|
"Parameters:\n"+
|
276
|
-
|
330
|
+
@parameters.map{ |parameter| parameter.inspect }.join( "\n" )+"\n"+
|
277
331
|
"Resources:\n"+
|
278
|
-
|
332
|
+
@resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
|
279
333
|
"Area:\n"+
|
280
|
-
|
334
|
+
@areas.map{ |area| " #{ area }" }.join( "\n" )+"\n"
|
281
335
|
RCAP.format_lines_for_inspect( 'INFO', info_inspect )
|
282
336
|
end
|
283
337
|
|
284
338
|
# Returns a string representation of the event of the form
|
285
339
|
# event(urgency/severity/certainty)
|
340
|
+
#
|
341
|
+
# @return [String]
|
286
342
|
def to_s
|
287
|
-
"#{
|
343
|
+
"#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
|
288
344
|
end
|
289
345
|
|
290
|
-
|
346
|
+
# @param [REXML::Element] info_xml_element
|
347
|
+
# @return [Info]
|
348
|
+
def self.from_xml_element( info_xml_element )
|
291
349
|
self.new(
|
292
350
|
:language => RCAP.xpath_text( info_xml_element, LANGUAGE_XPATH, Alert::XMLNS ) || DEFAULT_LANGUAGE,
|
293
351
|
:categories => RCAP.xpath_match( info_xml_element, CATEGORY_XPATH, Alert::XMLNS ).map{ |element| element.text },
|
@@ -313,56 +371,59 @@ module RCAP
|
|
313
371
|
)
|
314
372
|
end
|
315
373
|
|
316
|
-
LANGUAGE_YAML = 'Language'
|
317
|
-
CATEGORIES_YAML = 'Categories'
|
318
|
-
EVENT_YAML = 'Event'
|
319
|
-
RESPONSE_TYPES_YAML = 'Response Types'
|
320
|
-
URGENCY_YAML = 'Urgency'
|
321
|
-
SEVERITY_YAML = 'Severity'
|
322
|
-
CERTAINTY_YAML = 'Certainty'
|
323
|
-
AUDIENCE_YAML = 'Audience'
|
324
|
-
EFFECTIVE_YAML = 'Effective'
|
325
|
-
ONSET_YAML = 'Onset'
|
326
|
-
EXPIRES_YAML = 'Expires'
|
327
|
-
SENDER_NAME_YAML = 'Sender Name'
|
328
|
-
HEADLINE_YAML = 'Headline'
|
329
|
-
DESCRIPTION_YAML = 'Description'
|
330
|
-
INSTRUCTION_YAML = 'Instruction'
|
331
|
-
WEB_YAML = 'Web'
|
332
|
-
CONTACT_YAML = 'Contact'
|
333
|
-
EVENT_CODES_YAML = 'Event Codes'
|
334
|
-
PARAMETERS_YAML = 'Parameters'
|
335
|
-
RESOURCES_YAML = 'Resources'
|
336
|
-
AREAS_YAML = 'Areas'
|
374
|
+
LANGUAGE_YAML = 'Language'
|
375
|
+
CATEGORIES_YAML = 'Categories'
|
376
|
+
EVENT_YAML = 'Event'
|
377
|
+
RESPONSE_TYPES_YAML = 'Response Types'
|
378
|
+
URGENCY_YAML = 'Urgency'
|
379
|
+
SEVERITY_YAML = 'Severity'
|
380
|
+
CERTAINTY_YAML = 'Certainty'
|
381
|
+
AUDIENCE_YAML = 'Audience'
|
382
|
+
EFFECTIVE_YAML = 'Effective'
|
383
|
+
ONSET_YAML = 'Onset'
|
384
|
+
EXPIRES_YAML = 'Expires'
|
385
|
+
SENDER_NAME_YAML = 'Sender Name'
|
386
|
+
HEADLINE_YAML = 'Headline'
|
387
|
+
DESCRIPTION_YAML = 'Description'
|
388
|
+
INSTRUCTION_YAML = 'Instruction'
|
389
|
+
WEB_YAML = 'Web'
|
390
|
+
CONTACT_YAML = 'Contact'
|
391
|
+
EVENT_CODES_YAML = 'Event Codes'
|
392
|
+
PARAMETERS_YAML = 'Parameters'
|
393
|
+
RESOURCES_YAML = 'Resources'
|
394
|
+
AREAS_YAML = 'Areas'
|
337
395
|
|
338
|
-
|
396
|
+
# @return [String]
|
397
|
+
def to_yaml( options = {} )
|
339
398
|
parameter_to_hash = lambda{ |hash, parameter| hash.merge( parameter.name => parameter.value )}
|
340
399
|
|
341
400
|
RCAP.attribute_values_to_hash(
|
342
|
-
[ LANGUAGE_YAML,
|
343
|
-
[ CATEGORIES_YAML,
|
344
|
-
[ EVENT_YAML,
|
345
|
-
[ RESPONSE_TYPES_YAML,
|
346
|
-
[ URGENCY_YAML,
|
347
|
-
[ SEVERITY_YAML,
|
348
|
-
[ CERTAINTY_YAML,
|
349
|
-
[ AUDIENCE_YAML,
|
350
|
-
[ EFFECTIVE_YAML,
|
351
|
-
[ ONSET_YAML,
|
352
|
-
[ EXPIRES_YAML,
|
353
|
-
[ SENDER_NAME_YAML,
|
354
|
-
[ HEADLINE_YAML,
|
355
|
-
[ DESCRIPTION_YAML,
|
356
|
-
[ INSTRUCTION_YAML,
|
357
|
-
[ WEB_YAML,
|
358
|
-
[ CONTACT_YAML,
|
359
|
-
[ EVENT_CODES_YAML,
|
360
|
-
[ PARAMETERS_YAML,
|
361
|
-
[ RESOURCES_YAML,
|
362
|
-
[ AREAS_YAML,
|
401
|
+
[ LANGUAGE_YAML, @language ],
|
402
|
+
[ CATEGORIES_YAML, @categories ],
|
403
|
+
[ EVENT_YAML, @event ],
|
404
|
+
[ RESPONSE_TYPES_YAML, @response_types ],
|
405
|
+
[ URGENCY_YAML, @urgency ],
|
406
|
+
[ SEVERITY_YAML, @severity ],
|
407
|
+
[ CERTAINTY_YAML, @certainty ],
|
408
|
+
[ AUDIENCE_YAML, @audience ],
|
409
|
+
[ EFFECTIVE_YAML, @effective ],
|
410
|
+
[ ONSET_YAML, @onset ],
|
411
|
+
[ EXPIRES_YAML, @expires ],
|
412
|
+
[ SENDER_NAME_YAML, @sender_name ],
|
413
|
+
[ HEADLINE_YAML, @headline ],
|
414
|
+
[ DESCRIPTION_YAML, @description ],
|
415
|
+
[ INSTRUCTION_YAML, @instruction ],
|
416
|
+
[ WEB_YAML, @web ],
|
417
|
+
[ CONTACT_YAML, @contact ],
|
418
|
+
[ EVENT_CODES_YAML, @event_codes.inject({}, ¶meter_to_hash )],
|
419
|
+
[ PARAMETERS_YAML, @parameters.inject({}, ¶meter_to_hash )],
|
420
|
+
[ RESOURCES_YAML, @resources ],
|
421
|
+
[ AREAS_YAML, @areas ]).to_yaml( options )
|
363
422
|
end
|
364
423
|
|
365
|
-
|
424
|
+
# @param [Hash] info_yaml_data
|
425
|
+
# @return [Info]
|
426
|
+
def self.from_yaml_data( info_yaml_data )
|
366
427
|
self.new(
|
367
428
|
:language => info_yaml_data [ LANGUAGE_YAML ],
|
368
429
|
:categories => info_yaml_data [ CATEGORIES_YAML ],
|
@@ -388,54 +449,57 @@ module RCAP
|
|
388
449
|
)
|
389
450
|
end
|
390
451
|
|
391
|
-
LANGUAGE_KEY = 'language'
|
392
|
-
CATEGORIES_KEY = 'categories'
|
393
|
-
EVENT_KEY = 'event'
|
394
|
-
RESPONSE_TYPES_KEY = 'response_types'
|
395
|
-
URGENCY_KEY = 'urgency'
|
396
|
-
SEVERITY_KEY = 'severity'
|
397
|
-
CERTAINTY_KEY = 'certainty'
|
398
|
-
AUDIENCE_KEY = 'audience'
|
399
|
-
EFFECTIVE_KEY = 'effective'
|
400
|
-
ONSET_KEY = 'onset'
|
401
|
-
EXPIRES_KEY = 'expires'
|
402
|
-
SENDER_NAME_KEY = 'sender_name'
|
403
|
-
HEADLINE_KEY = 'headline'
|
404
|
-
DESCRIPTION_KEY = 'description'
|
405
|
-
INSTRUCTION_KEY = 'instruction'
|
406
|
-
WEB_KEY = 'web'
|
407
|
-
CONTACT_KEY = 'contact'
|
408
|
-
RESOURCES_KEY = 'resources'
|
409
|
-
EVENT_CODES_KEY = 'event_codes'
|
410
|
-
PARAMETERS_KEY = 'parameters'
|
411
|
-
AREAS_KEY = 'areas'
|
452
|
+
LANGUAGE_KEY = 'language'
|
453
|
+
CATEGORIES_KEY = 'categories'
|
454
|
+
EVENT_KEY = 'event'
|
455
|
+
RESPONSE_TYPES_KEY = 'response_types'
|
456
|
+
URGENCY_KEY = 'urgency'
|
457
|
+
SEVERITY_KEY = 'severity'
|
458
|
+
CERTAINTY_KEY = 'certainty'
|
459
|
+
AUDIENCE_KEY = 'audience'
|
460
|
+
EFFECTIVE_KEY = 'effective'
|
461
|
+
ONSET_KEY = 'onset'
|
462
|
+
EXPIRES_KEY = 'expires'
|
463
|
+
SENDER_NAME_KEY = 'sender_name'
|
464
|
+
HEADLINE_KEY = 'headline'
|
465
|
+
DESCRIPTION_KEY = 'description'
|
466
|
+
INSTRUCTION_KEY = 'instruction'
|
467
|
+
WEB_KEY = 'web'
|
468
|
+
CONTACT_KEY = 'contact'
|
469
|
+
RESOURCES_KEY = 'resources'
|
470
|
+
EVENT_CODES_KEY = 'event_codes'
|
471
|
+
PARAMETERS_KEY = 'parameters'
|
472
|
+
AREAS_KEY = 'areas'
|
412
473
|
|
413
|
-
|
474
|
+
# @return [Hash]
|
475
|
+
def to_h
|
414
476
|
RCAP.attribute_values_to_hash(
|
415
|
-
[ LANGUAGE_KEY,
|
416
|
-
[ CATEGORIES_KEY,
|
417
|
-
[ EVENT_KEY,
|
418
|
-
[ RESPONSE_TYPES_KEY,
|
419
|
-
[ URGENCY_KEY,
|
420
|
-
[ SEVERITY_KEY,
|
421
|
-
[ CERTAINTY_KEY,
|
422
|
-
[ AUDIENCE_KEY,
|
423
|
-
[ EFFECTIVE_KEY, RCAP.to_s_for_cap(
|
424
|
-
[ ONSET_KEY, RCAP.to_s_for_cap(
|
425
|
-
[ EXPIRES_KEY, RCAP.to_s_for_cap(
|
426
|
-
[ SENDER_NAME_KEY,
|
427
|
-
[ HEADLINE_KEY,
|
428
|
-
[ DESCRIPTION_KEY,
|
429
|
-
[ INSTRUCTION_KEY,
|
430
|
-
[ WEB_KEY,
|
431
|
-
[ CONTACT_KEY,
|
432
|
-
[ RESOURCES_KEY,
|
433
|
-
[ EVENT_CODES_KEY,
|
434
|
-
[ PARAMETERS_KEY,
|
435
|
-
[ AREAS_KEY,
|
477
|
+
[ LANGUAGE_KEY, @language ],
|
478
|
+
[ CATEGORIES_KEY, @categories ],
|
479
|
+
[ EVENT_KEY, @event ],
|
480
|
+
[ RESPONSE_TYPES_KEY, @response_types ],
|
481
|
+
[ URGENCY_KEY, @urgency ],
|
482
|
+
[ SEVERITY_KEY, @severity ],
|
483
|
+
[ CERTAINTY_KEY, @certainty ],
|
484
|
+
[ AUDIENCE_KEY, @audience ],
|
485
|
+
[ EFFECTIVE_KEY, RCAP.to_s_for_cap( @effective )],
|
486
|
+
[ ONSET_KEY, RCAP.to_s_for_cap( @onset )],
|
487
|
+
[ EXPIRES_KEY, RCAP.to_s_for_cap( @expires )],
|
488
|
+
[ SENDER_NAME_KEY, @sender_name ],
|
489
|
+
[ HEADLINE_KEY, @headline ],
|
490
|
+
[ DESCRIPTION_KEY, @description ],
|
491
|
+
[ INSTRUCTION_KEY, @instruction ],
|
492
|
+
[ WEB_KEY, @web ],
|
493
|
+
[ CONTACT_KEY, @contact ],
|
494
|
+
[ RESOURCES_KEY, @resources.map{ |resource| resource.to_h } ],
|
495
|
+
[ EVENT_CODES_KEY, @event_codes.map{ |event_code| event_code.to_h } ],
|
496
|
+
[ PARAMETERS_KEY, @parameters.map{ |parameter| parameter.to_h } ],
|
497
|
+
[ AREAS_KEY, @areas.map{ |area| area.to_h }])
|
436
498
|
end
|
437
499
|
|
438
|
-
|
500
|
+
# @param [Hash] info_hash
|
501
|
+
# @return [Info]
|
502
|
+
def self.from_h( info_hash )
|
439
503
|
self.new( :language => info_hash[ LANGUAGE_KEY ],
|
440
504
|
:categories => info_hash[ CATEGORIES_KEY ],
|
441
505
|
:event => info_hash[ EVENT_KEY ],
|