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_2/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_2/circle.rb
CHANGED
@@ -6,75 +6,100 @@ 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
|
-
|
54
|
-
|
69
|
+
:longitude => longitude,
|
70
|
+
:radius => radius )
|
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 ],
|
78
103
|
:lattitude => circle_hash[ LATTITUDE_KEY ],
|
79
104
|
:longitude => circle_hash[ LONGITUDE_KEY ])
|
80
105
|
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
module RCAP
|
2
2
|
module CAP_1_2
|
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_2/geocode.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
module RCAP
|
2
2
|
module CAP_1_2
|
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_2/info.rb
CHANGED
@@ -11,104 +11,104 @@ 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_ALL_CLEAR = "All Clear"
|
39
|
-
RESPONSE_TYPE_AVOID = "Avoid"
|
40
|
-
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_ALL_CLEAR = "All Clear"
|
39
|
+
RESPONSE_TYPE_AVOID = "Avoid"
|
40
|
+
RESPONSE_TYPE_NONE = "None"
|
41
41
|
# Valid values for response_type
|
42
42
|
VALID_RESPONSE_TYPES = [ RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE,
|
43
43
|
RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR,
|
44
44
|
RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_AVOID, RESPONSE_TYPE_ALL_CLEAR, RESPONSE_TYPE_NONE ]
|
45
45
|
|
46
|
-
URGENCY_IMMEDIATE = "Immediate"
|
47
|
-
URGENCY_EXPECTED = "Expected"
|
48
|
-
URGENCY_FUTURE = "Future"
|
49
|
-
URGENCY_PAST = "Past"
|
50
|
-
URGENCY_UNKNOWN = "Unknown"
|
46
|
+
URGENCY_IMMEDIATE = "Immediate"
|
47
|
+
URGENCY_EXPECTED = "Expected"
|
48
|
+
URGENCY_FUTURE = "Future"
|
49
|
+
URGENCY_PAST = "Past"
|
50
|
+
URGENCY_UNKNOWN = "Unknown"
|
51
51
|
# Valid values for urgency
|
52
52
|
VALID_URGENCIES = [ URGENCY_IMMEDIATE, URGENCY_EXPECTED, URGENCY_FUTURE,
|
53
53
|
URGENCY_PAST, URGENCY_UNKNOWN ]
|
54
54
|
|
55
|
-
SEVERITY_EXTREME = "Extreme"
|
56
|
-
SEVERITY_SEVERE = "Severe"
|
57
|
-
SEVERITY_MODERATE = "Moderate"
|
58
|
-
SEVERITY_MINOR = "Minor"
|
59
|
-
SEVERITY_UNKNOWN = "Unknown"
|
55
|
+
SEVERITY_EXTREME = "Extreme"
|
56
|
+
SEVERITY_SEVERE = "Severe"
|
57
|
+
SEVERITY_MODERATE = "Moderate"
|
58
|
+
SEVERITY_MINOR = "Minor"
|
59
|
+
SEVERITY_UNKNOWN = "Unknown"
|
60
60
|
# Valid values for severity
|
61
61
|
VALID_SEVERITIES = [ SEVERITY_EXTREME, SEVERITY_SEVERE, SEVERITY_MODERATE,
|
62
62
|
SEVERITY_MINOR, SEVERITY_UNKNOWN ]
|
63
63
|
|
64
|
-
CERTAINTY_OBSERVED = "Observed"
|
65
|
-
CERTAINTY_LIKELY = "Likely"
|
66
|
-
CERTAINTY_POSSIBLE = "Possible"
|
67
|
-
CERTAINTY_UNLIKELY = "Unlikely"
|
68
|
-
CERTAINTY_UNKNOWN = "Unknown"
|
64
|
+
CERTAINTY_OBSERVED = "Observed"
|
65
|
+
CERTAINTY_LIKELY = "Likely"
|
66
|
+
CERTAINTY_POSSIBLE = "Possible"
|
67
|
+
CERTAINTY_UNLIKELY = "Unlikely"
|
68
|
+
CERTAINTY_UNKNOWN = "Unknown"
|
69
69
|
# Valid valies for certainty
|
70
70
|
VALID_CERTAINTIES = [ CERTAINTY_OBSERVED, CERTAINTY_LIKELY,
|
71
71
|
CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN ]
|
72
72
|
|
73
|
-
XML_ELEMENT_NAME = 'info'
|
74
|
-
LANGUAGE_ELEMENT_NAME = 'language'
|
75
|
-
CATEGORY_ELEMENT_NAME = 'category'
|
76
|
-
EVENT_ELEMENT_NAME = 'event'
|
77
|
-
RESPONSE_TYPE_ELEMENT_NAME = 'responseType'
|
78
|
-
URGENCY_ELEMENT_NAME = 'urgency'
|
79
|
-
SEVERITY_ELEMENT_NAME = 'severity'
|
80
|
-
CERTAINTY_ELEMENT_NAME = 'certainty'
|
81
|
-
AUDIENCE_ELEMENT_NAME = 'audience'
|
82
|
-
EVENT_CODE_ELEMENT_NAME = 'eventCode'
|
83
|
-
EFFECTIVE_ELEMENT_NAME = 'effective'
|
84
|
-
ONSET_ELEMENT_NAME = 'onset'
|
85
|
-
EXPIRES_ELEMENT_NAME = 'expires'
|
86
|
-
SENDER_NAME_ELEMENT_NAME = 'senderName'
|
87
|
-
HEADLINE_ELEMENT_NAME = 'headline'
|
88
|
-
DESCRIPTION_ELEMENT_NAME = 'description'
|
89
|
-
INSTRUCTION_ELEMENT_NAME = 'instruction'
|
90
|
-
WEB_ELEMENT_NAME = 'web'
|
91
|
-
CONTACT_ELEMENT_NAME = 'contact'
|
73
|
+
XML_ELEMENT_NAME = 'info'
|
74
|
+
LANGUAGE_ELEMENT_NAME = 'language'
|
75
|
+
CATEGORY_ELEMENT_NAME = 'category'
|
76
|
+
EVENT_ELEMENT_NAME = 'event'
|
77
|
+
RESPONSE_TYPE_ELEMENT_NAME = 'responseType'
|
78
|
+
URGENCY_ELEMENT_NAME = 'urgency'
|
79
|
+
SEVERITY_ELEMENT_NAME = 'severity'
|
80
|
+
CERTAINTY_ELEMENT_NAME = 'certainty'
|
81
|
+
AUDIENCE_ELEMENT_NAME = 'audience'
|
82
|
+
EVENT_CODE_ELEMENT_NAME = 'eventCode'
|
83
|
+
EFFECTIVE_ELEMENT_NAME = 'effective'
|
84
|
+
ONSET_ELEMENT_NAME = 'onset'
|
85
|
+
EXPIRES_ELEMENT_NAME = 'expires'
|
86
|
+
SENDER_NAME_ELEMENT_NAME = 'senderName'
|
87
|
+
HEADLINE_ELEMENT_NAME = 'headline'
|
88
|
+
DESCRIPTION_ELEMENT_NAME = 'description'
|
89
|
+
INSTRUCTION_ELEMENT_NAME = 'instruction'
|
90
|
+
WEB_ELEMENT_NAME = 'web'
|
91
|
+
CONTACT_ELEMENT_NAME = 'contact'
|
92
92
|
|
93
|
-
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
94
|
-
LANGUAGE_XPATH = "cap:#{ LANGUAGE_ELEMENT_NAME }"
|
95
|
-
EVENT_XPATH = "cap:#{ EVENT_ELEMENT_NAME }"
|
96
|
-
URGENCY_XPATH = "cap:#{ URGENCY_ELEMENT_NAME }"
|
97
|
-
RESPONSE_TYPE_XPATH = "cap:#{ RESPONSE_TYPE_ELEMENT_NAME }"
|
98
|
-
CATEGORY_XPATH = "cap:#{ CATEGORY_ELEMENT_NAME }"
|
99
|
-
SEVERITY_XPATH = "cap:#{ SEVERITY_ELEMENT_NAME }"
|
100
|
-
CERTAINTY_XPATH = "cap:#{ CERTAINTY_ELEMENT_NAME }"
|
101
|
-
AUDIENCE_XPATH = "cap:#{ AUDIENCE_ELEMENT_NAME }"
|
102
|
-
EVENT_CODE_XPATH = "cap:#{ EVENT_CODE_ELEMENT_NAME }"
|
103
|
-
EFFECTIVE_XPATH = "cap:#{ EFFECTIVE_ELEMENT_NAME }"
|
104
|
-
ONSET_XPATH = "cap:#{ ONSET_ELEMENT_NAME }"
|
105
|
-
EXPIRES_XPATH = "cap:#{ EXPIRES_ELEMENT_NAME }"
|
106
|
-
SENDER_NAME_XPATH = "cap:#{ SENDER_NAME_ELEMENT_NAME }"
|
107
|
-
HEADLINE_XPATH = "cap:#{ HEADLINE_ELEMENT_NAME }"
|
108
|
-
DESCRIPTION_XPATH = "cap:#{ DESCRIPTION_ELEMENT_NAME }"
|
109
|
-
INSTRUCTION_XPATH = "cap:#{ INSTRUCTION_ELEMENT_NAME }"
|
110
|
-
WEB_XPATH = "cap:#{ WEB_ELEMENT_NAME }"
|
111
|
-
CONTACT_XPATH = "cap:#{ CONTACT_ELEMENT_NAME }"
|
93
|
+
XPATH = "cap:#{ XML_ELEMENT_NAME }"
|
94
|
+
LANGUAGE_XPATH = "cap:#{ LANGUAGE_ELEMENT_NAME }"
|
95
|
+
EVENT_XPATH = "cap:#{ EVENT_ELEMENT_NAME }"
|
96
|
+
URGENCY_XPATH = "cap:#{ URGENCY_ELEMENT_NAME }"
|
97
|
+
RESPONSE_TYPE_XPATH = "cap:#{ RESPONSE_TYPE_ELEMENT_NAME }"
|
98
|
+
CATEGORY_XPATH = "cap:#{ CATEGORY_ELEMENT_NAME }"
|
99
|
+
SEVERITY_XPATH = "cap:#{ SEVERITY_ELEMENT_NAME }"
|
100
|
+
CERTAINTY_XPATH = "cap:#{ CERTAINTY_ELEMENT_NAME }"
|
101
|
+
AUDIENCE_XPATH = "cap:#{ AUDIENCE_ELEMENT_NAME }"
|
102
|
+
EVENT_CODE_XPATH = "cap:#{ EVENT_CODE_ELEMENT_NAME }"
|
103
|
+
EFFECTIVE_XPATH = "cap:#{ EFFECTIVE_ELEMENT_NAME }"
|
104
|
+
ONSET_XPATH = "cap:#{ ONSET_ELEMENT_NAME }"
|
105
|
+
EXPIRES_XPATH = "cap:#{ EXPIRES_ELEMENT_NAME }"
|
106
|
+
SENDER_NAME_XPATH = "cap:#{ SENDER_NAME_ELEMENT_NAME }"
|
107
|
+
HEADLINE_XPATH = "cap:#{ HEADLINE_ELEMENT_NAME }"
|
108
|
+
DESCRIPTION_XPATH = "cap:#{ DESCRIPTION_ELEMENT_NAME }"
|
109
|
+
INSTRUCTION_XPATH = "cap:#{ INSTRUCTION_ELEMENT_NAME }"
|
110
|
+
WEB_XPATH = "cap:#{ WEB_ELEMENT_NAME }"
|
111
|
+
CONTACT_XPATH = "cap:#{ CONTACT_ELEMENT_NAME }"
|
112
112
|
|
113
113
|
DEFAULT_LANGUAGE = 'en-US'
|
114
114
|
|
@@ -121,41 +121,72 @@ module RCAP
|
|
121
121
|
validates_inclusion_of_members_of( :categories, :in => VALID_CATEGORIES, :allow_blank => true )
|
122
122
|
validates_collection_of( :resources, :areas, :event_codes, :parameters )
|
123
123
|
|
124
|
+
# @return [String]
|
124
125
|
attr_accessor( :event )
|
125
|
-
# Value can only be one of VALID_URGENCIES
|
126
|
+
# @return [String] Value can only be one of {VALID_URGENCIES}
|
126
127
|
attr_accessor( :urgency )
|
127
|
-
# Value can only be one of VALID_SEVERITIES
|
128
|
+
# @return [String] Value can only be one of {VALID_SEVERITIES}
|
128
129
|
attr_accessor( :severity )
|
129
|
-
# Value can only be one of VALID_CERTAINTIES
|
130
|
+
# @return [String] Value can only be one of {VALID_CERTAINTIES}
|
130
131
|
attr_accessor( :certainty )
|
132
|
+
# @return [String]
|
131
133
|
attr_accessor( :language )
|
134
|
+
# @return [String]
|
132
135
|
attr_accessor( :audience )
|
133
|
-
# Effective start time of information
|
136
|
+
# @return [DateTime] Effective start time of information
|
134
137
|
attr_accessor( :effective )
|
135
|
-
# Expected start of event
|
138
|
+
# @return [DateTime] Expected start of event
|
136
139
|
attr_accessor( :onset )
|
137
|
-
# Effective expiry time of information
|
140
|
+
# @return [DateTime] Effective expiry time of information
|
138
141
|
attr_accessor( :expires )
|
142
|
+
# @return [String]
|
139
143
|
attr_accessor( :sender_name )
|
144
|
+
# @return [String]
|
140
145
|
attr_accessor( :headline )
|
146
|
+
# @return [String]
|
141
147
|
attr_accessor( :description )
|
148
|
+
# @return [String]
|
142
149
|
attr_accessor( :instruction )
|
150
|
+
# @return [String]
|
143
151
|
attr_accessor( :web )
|
152
|
+
# @return [String]
|
144
153
|
attr_accessor( :contact )
|
145
154
|
|
146
|
-
# Collection of textual categories; elements can be one of VALID_CATEGORIES
|
155
|
+
# @return [Array<String>] Collection of textual categories; elements can be one of {VALID_CATEGORIES}
|
147
156
|
attr_reader( :categories )
|
148
|
-
#
|
157
|
+
# @return [Array<String>] Collection of textual response types; elements must be from {VALID_RESPONSE_TYPES}
|
149
158
|
attr_reader( :response_types )
|
150
|
-
#
|
159
|
+
# @return [Array<EventCode>] Collection of {EventCode} objects
|
151
160
|
attr_reader( :event_codes )
|
152
|
-
# Collection of Parameter objects
|
161
|
+
# @return [Array<Parameter>] Collection of {Parameter} objects
|
153
162
|
attr_reader( :parameters )
|
154
|
-
# Collection of Resource objects
|
163
|
+
# @return [Array<Resource> Collection of {Resource} objects
|
155
164
|
attr_reader( :resources )
|
156
|
-
# Collection of Area objects
|
165
|
+
# @return [Array<Area>] Collection of {Area} objects
|
157
166
|
attr_reader( :areas )
|
158
167
|
|
168
|
+
# @param [Hash] attributes
|
169
|
+
# @option attributes [String] :language Defaults to {DEFAULT_LANGUAGE}
|
170
|
+
# @option attributes [Array<String>] :categories Collection of categories in {VALID_CATEGORIES}
|
171
|
+
# @option attributes [String] :audience
|
172
|
+
# @option attributes [String] :event
|
173
|
+
# @option attributes [Array<String>] :response_types Collection of textual response types from {VALID_RESPONSE_TYPES}
|
174
|
+
# @option attributes [String] :urgency A member of {VALID_URGENCIES}
|
175
|
+
# @option attributes [String] :severity A member of {VALID_SEVERITIES}
|
176
|
+
# @option attributes [String] :certainty A member of {VALID_CERTAINTIES}
|
177
|
+
# @option attributes [DateTime] :effective
|
178
|
+
# @option attributes [DateTime] :onset
|
179
|
+
# @option attributes [DateTime] :expires
|
180
|
+
# @option attributes [Array<EventCode>] :event_codes Collection of {EventCode} objects
|
181
|
+
# @option attributes [String] :sender_name
|
182
|
+
# @option attributes [String] :headline
|
183
|
+
# @option attributes [String] :description
|
184
|
+
# @option attributes [String] :instruction
|
185
|
+
# @option attributes [String] :web URL
|
186
|
+
# @option attributes [String] :contact
|
187
|
+
# @option attributes [Array<Parameter>] :parameters Collection of {Parameter} objects
|
188
|
+
# @option attributes [Array<Resource>] :resources Collection of {Resource} objects
|
189
|
+
# @option attributes [Array<Area>] :areas Collection of {Area} objects
|
159
190
|
def initialize( attributes = {} )
|
160
191
|
@language = attributes[ :language ] || DEFAULT_LANGUAGE
|
161
192
|
@categories = Array( attributes[ :categories ])
|
@@ -182,62 +213,83 @@ module RCAP
|
|
182
213
|
|
183
214
|
# Creates a new EventCode object and adds it to the event_codes array. The
|
184
215
|
# event_code_attributes are passed as a parameter to EventCode.new.
|
216
|
+
#
|
217
|
+
# @see EventCode#initialize
|
218
|
+
#
|
219
|
+
# @param [Hash] event_code_attributes (see EventCode#initialize)
|
220
|
+
# @return [EventCode]
|
185
221
|
def add_event_code( event_code_attributes = {})
|
186
222
|
event_code = EventCode.new( event_code_attributes )
|
187
|
-
|
223
|
+
@event_codes << event_code
|
188
224
|
event_code
|
189
225
|
end
|
190
226
|
|
191
227
|
# Creates a new Parameter object and adds it to the parameters array. The
|
192
228
|
# parameter_attributes are passed as a parameter to Parameter.new.
|
229
|
+
#
|
230
|
+
# @see Parameter#initialize
|
231
|
+
#
|
232
|
+
# @param [Hash] parameter_attributes (see Parameter#initialize)
|
233
|
+
# @return [Parameter]
|
193
234
|
def add_parameter( parameter_attributes = {})
|
194
235
|
parameter = Parameter.new( parameter_attributes )
|
195
|
-
|
236
|
+
@parameters << parameter
|
196
237
|
parameter
|
197
238
|
end
|
198
239
|
|
199
240
|
# Creates a new Resource object and adds it to the resources array. The
|
200
241
|
# resource_attributes are passed as a parameter to Resource.new.
|
242
|
+
#
|
243
|
+
# @see Resource#initialize
|
244
|
+
#
|
245
|
+
# @param [Hash] resource_attributes (See Resource#initialize)
|
246
|
+
# @return [Resource]
|
201
247
|
def add_resource( resource_attributes = {})
|
202
248
|
resource = Resource.new( resource_attributes )
|
203
|
-
|
249
|
+
@resources << resource
|
204
250
|
resource
|
205
251
|
end
|
206
252
|
|
207
253
|
# Creates a new Area object and adds it to the areas array. The
|
208
254
|
# area_attributes are passed as a parameter to Area.new.
|
255
|
+
#
|
256
|
+
# @see Area#initialize
|
257
|
+
#
|
258
|
+
# @param [Hash] area_attributes (see Area#initialize)
|
259
|
+
# @return [Area]
|
209
260
|
def add_area( area_attributes = {})
|
210
261
|
area = Area.new( area_attributes )
|
211
|
-
|
262
|
+
@areas << area
|
212
263
|
area
|
213
264
|
end
|
214
265
|
|
215
|
-
|
266
|
+
# @return [REXML::Element]
|
267
|
+
def to_xml_element
|
216
268
|
xml_element = REXML::Element.new( XML_ELEMENT_NAME )
|
217
|
-
xml_element.add_element( LANGUAGE_ELEMENT_NAME ).add_text(
|
269
|
+
xml_element.add_element( LANGUAGE_ELEMENT_NAME ).add_text( @language ) if @language
|
218
270
|
@categories.each do |category|
|
219
271
|
xml_element.add_element( CATEGORY_ELEMENT_NAME ).add_text( category )
|
220
272
|
end
|
221
|
-
xml_element.add_element( EVENT_ELEMENT_NAME ).add_text(
|
273
|
+
xml_element.add_element( EVENT_ELEMENT_NAME ).add_text( @event )
|
222
274
|
@response_types.each do |response_type|
|
223
275
|
xml_element.add_element( RESPONSE_TYPE_ELEMENT_NAME ).add_text( response_type )
|
224
276
|
end
|
225
|
-
xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text(
|
226
|
-
xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text(
|
227
|
-
xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text(
|
228
|
-
xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text(
|
277
|
+
xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text( @urgency )
|
278
|
+
xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text( @severity )
|
279
|
+
xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text( @certainty )
|
280
|
+
xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text( @audience ) if @audience
|
229
281
|
@event_codes.each do |event_code|
|
230
282
|
xml_element.add_element( event_code.to_xml_element )
|
231
283
|
end
|
232
|
-
xml_element.add_element( EFFECTIVE_ELEMENT_NAME ).add_text(
|
233
|
-
xml_element.add_element( ONSET_ELEMENT_NAME ).add_text(
|
234
|
-
xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text(
|
235
|
-
xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text(
|
236
|
-
xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text(
|
237
|
-
xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text(
|
238
|
-
xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text(
|
239
|
-
xml_element.add_element( WEB_ELEMENT_NAME ).add_text(
|
240
|
-
xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text(
|
284
|
+
xml_element.add_element( EFFECTIVE_ELEMENT_NAME ).add_text( @effective.to_s_for_cap ) if @effective
|
285
|
+
xml_element.add_element( ONSET_ELEMENT_NAME ).add_text( @onset.to_s_for_cap ) if @onset
|
286
|
+
xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text( @expires.to_s_for_cap ) if @expires
|
287
|
+
xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text( @sender_name ) if @sender_name
|
288
|
+
xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text( @headline ) if @headline
|
289
|
+
xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text( @description ) if @description
|
290
|
+
xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text( @instruction ) if @instruction
|
291
|
+
xml_element.add_element( WEB_ELEMENT_NAME ).add_text( @web ) if @web
|
292
|
+
xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text( @contact ) if @contact
|
241
293
|
@parameters.each do |parameter|
|
242
294
|
xml_element.add_element( parameter.to_xml_element )
|
243
295
|
end
|
@@ -250,46 +302,52 @@ module RCAP
|
|
250
302
|
xml_element
|
251
303
|
end
|
252
304
|
|
253
|
-
|
305
|
+
# @return [String]
|
306
|
+
def to_xml
|
254
307
|
self.to_xml_element.to_s
|
255
308
|
end
|
256
309
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
"
|
261
|
-
"
|
262
|
-
"
|
263
|
-
"
|
264
|
-
"
|
265
|
-
"
|
266
|
-
"
|
267
|
-
"
|
268
|
-
"
|
269
|
-
"
|
270
|
-
"
|
271
|
-
"
|
310
|
+
# @return [String]
|
311
|
+
def inspect
|
312
|
+
info_inspect = "Language: #{ @language }\n"+
|
313
|
+
"Categories: #{ @categories.to_s_for_cap }\n"+
|
314
|
+
"Event: #{ @event }\n"+
|
315
|
+
"Response Types: #{ @response_types.to_s_for_cap }\n"+
|
316
|
+
"Urgency: #{ @urgency }\n"+
|
317
|
+
"Severity: #{ @severity }\n"+
|
318
|
+
"Certainty: #{ @certainty }\n"+
|
319
|
+
"Audience: #{ @audience }\n"+
|
320
|
+
"Event Codes: #{ @event_codes.inspect }\n"+
|
321
|
+
"Effective: #{ @effective }\n"+
|
322
|
+
"Onset: #{ @onset }\n"+
|
323
|
+
"Expires: #{ @expires }\n"+
|
324
|
+
"Sender Name: #{ @sender_name }\n"+
|
325
|
+
"Headline: #{ @headline }\n"+
|
272
326
|
"Description:\n"+
|
273
|
-
|
274
|
-
"Instruction: #{
|
275
|
-
"Web: #{
|
276
|
-
"Contact: #{
|
327
|
+
@description.to_s.lines.map{ |line| " " + line }.join( "\n")+"\n"+
|
328
|
+
"Instruction: #{ @instruction }\n"+
|
329
|
+
"Web: #{ @web }\n"+
|
330
|
+
"Contact: #{ @contact }\n"+
|
277
331
|
"Parameters:\n"+
|
278
|
-
|
332
|
+
@parameters.map{ |parameter| parameter.inspect }.join( "\n" )+"\n"+
|
279
333
|
"Resources:\n"+
|
280
|
-
|
334
|
+
@resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
|
281
335
|
"Area:\n"+
|
282
|
-
|
336
|
+
@areas.map{ |area| " #{ area }" }.join( "\n" )+"\n"
|
283
337
|
RCAP.format_lines_for_inspect( 'INFO', info_inspect )
|
284
338
|
end
|
285
339
|
|
286
340
|
# Returns a string representation of the event of the form
|
287
341
|
# event(urgency/severity/certainty)
|
342
|
+
#
|
343
|
+
# @return [String]
|
288
344
|
def to_s
|
289
|
-
"#{
|
345
|
+
"#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
|
290
346
|
end
|
291
347
|
|
292
|
-
|
348
|
+
# @param [REXML::Element] info_xml_element
|
349
|
+
# @return [Info]
|
350
|
+
def self.from_xml_element( info_xml_element )
|
293
351
|
self.new(
|
294
352
|
:language => RCAP.xpath_text( info_xml_element, LANGUAGE_XPATH, Alert::XMLNS ) || DEFAULT_LANGUAGE,
|
295
353
|
:categories => RCAP.xpath_match( info_xml_element, CATEGORY_XPATH, Alert::XMLNS ).map{ |element| element.text },
|
@@ -315,55 +373,59 @@ module RCAP
|
|
315
373
|
)
|
316
374
|
end
|
317
375
|
|
318
|
-
LANGUAGE_YAML = 'Language'
|
319
|
-
CATEGORIES_YAML = 'Categories'
|
320
|
-
EVENT_YAML = 'Event'
|
321
|
-
RESPONSE_TYPES_YAML = 'Response Types'
|
322
|
-
URGENCY_YAML = 'Urgency'
|
323
|
-
SEVERITY_YAML = 'Severity'
|
324
|
-
CERTAINTY_YAML = 'Certainty'
|
325
|
-
AUDIENCE_YAML = 'Audience'
|
326
|
-
EFFECTIVE_YAML = 'Effective'
|
327
|
-
ONSET_YAML = 'Onset'
|
328
|
-
EXPIRES_YAML = 'Expires'
|
329
|
-
SENDER_NAME_YAML = 'Sender Name'
|
330
|
-
HEADLINE_YAML = 'Headline'
|
331
|
-
DESCRIPTION_YAML = 'Description'
|
332
|
-
INSTRUCTION_YAML = 'Instruction'
|
333
|
-
WEB_YAML = 'Web'
|
334
|
-
CONTACT_YAML = 'Contact'
|
335
|
-
EVENT_CODES_YAML = 'Event Codes'
|
336
|
-
PARAMETERS_YAML = 'Parameters'
|
337
|
-
RESOURCES_YAML = 'Resources'
|
338
|
-
AREAS_YAML = 'Areas'
|
376
|
+
LANGUAGE_YAML = 'Language'
|
377
|
+
CATEGORIES_YAML = 'Categories'
|
378
|
+
EVENT_YAML = 'Event'
|
379
|
+
RESPONSE_TYPES_YAML = 'Response Types'
|
380
|
+
URGENCY_YAML = 'Urgency'
|
381
|
+
SEVERITY_YAML = 'Severity'
|
382
|
+
CERTAINTY_YAML = 'Certainty'
|
383
|
+
AUDIENCE_YAML = 'Audience'
|
384
|
+
EFFECTIVE_YAML = 'Effective'
|
385
|
+
ONSET_YAML = 'Onset'
|
386
|
+
EXPIRES_YAML = 'Expires'
|
387
|
+
SENDER_NAME_YAML = 'Sender Name'
|
388
|
+
HEADLINE_YAML = 'Headline'
|
389
|
+
DESCRIPTION_YAML = 'Description'
|
390
|
+
INSTRUCTION_YAML = 'Instruction'
|
391
|
+
WEB_YAML = 'Web'
|
392
|
+
CONTACT_YAML = 'Contact'
|
393
|
+
EVENT_CODES_YAML = 'Event Codes'
|
394
|
+
PARAMETERS_YAML = 'Parameters'
|
395
|
+
RESOURCES_YAML = 'Resources'
|
396
|
+
AREAS_YAML = 'Areas'
|
339
397
|
|
340
|
-
|
398
|
+
# @return [String]
|
399
|
+
def to_yaml( options = {} )
|
341
400
|
parameter_to_hash = lambda{ |hash, parameter| hash.merge( parameter.name => parameter.value )}
|
342
401
|
|
343
|
-
RCAP.attribute_values_to_hash(
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
402
|
+
RCAP.attribute_values_to_hash(
|
403
|
+
[ LANGUAGE_YAML, @language ],
|
404
|
+
[ CATEGORIES_YAML, @categories ],
|
405
|
+
[ EVENT_YAML, @event ],
|
406
|
+
[ RESPONSE_TYPES_YAML, @response_types ],
|
407
|
+
[ URGENCY_YAML, @urgency ],
|
408
|
+
[ SEVERITY_YAML, @severity ],
|
409
|
+
[ CERTAINTY_YAML, @certainty ],
|
410
|
+
[ AUDIENCE_YAML, @audience ],
|
411
|
+
[ EFFECTIVE_YAML, @effective ],
|
412
|
+
[ ONSET_YAML, @onset ],
|
413
|
+
[ EXPIRES_YAML, @expires ],
|
414
|
+
[ SENDER_NAME_YAML, @sender_name ],
|
415
|
+
[ HEADLINE_YAML, @headline ],
|
416
|
+
[ DESCRIPTION_YAML, @description ],
|
417
|
+
[ INSTRUCTION_YAML, @instruction ],
|
418
|
+
[ WEB_YAML, @web ],
|
419
|
+
[ CONTACT_YAML, @contact ],
|
420
|
+
[ EVENT_CODES_YAML, @event_codes.inject({}, ¶meter_to_hash )],
|
421
|
+
[ PARAMETERS_YAML, @parameters.inject({}, ¶meter_to_hash )],
|
422
|
+
[ RESOURCES_YAML, @resources ],
|
423
|
+
[ AREAS_YAML, @areas ]).to_yaml( options )
|
364
424
|
end
|
365
425
|
|
366
|
-
|
426
|
+
# @param [Hash] info_yaml_data
|
427
|
+
# @return [Info]
|
428
|
+
def self.from_yaml_data( info_yaml_data )
|
367
429
|
self.new(
|
368
430
|
:language => info_yaml_data [ LANGUAGE_YAML ],
|
369
431
|
:categories => info_yaml_data [ CATEGORIES_YAML ],
|
@@ -389,53 +451,57 @@ module RCAP
|
|
389
451
|
)
|
390
452
|
end
|
391
453
|
|
392
|
-
LANGUAGE_KEY = 'language'
|
393
|
-
CATEGORIES_KEY = 'categories'
|
394
|
-
EVENT_KEY = 'event'
|
395
|
-
RESPONSE_TYPES_KEY = 'response_types'
|
396
|
-
URGENCY_KEY = 'urgency'
|
397
|
-
SEVERITY_KEY = 'severity'
|
398
|
-
CERTAINTY_KEY = 'certainty'
|
399
|
-
AUDIENCE_KEY = 'audience'
|
400
|
-
EFFECTIVE_KEY = 'effective'
|
401
|
-
ONSET_KEY = 'onset'
|
402
|
-
EXPIRES_KEY = 'expires'
|
403
|
-
SENDER_NAME_KEY = 'sender_name'
|
404
|
-
HEADLINE_KEY = 'headline'
|
405
|
-
DESCRIPTION_KEY = 'description'
|
406
|
-
INSTRUCTION_KEY = 'instruction'
|
407
|
-
WEB_KEY = 'web'
|
408
|
-
CONTACT_KEY = 'contact'
|
409
|
-
RESOURCES_KEY = 'resources'
|
410
|
-
EVENT_CODES_KEY = 'event_codes'
|
411
|
-
PARAMETERS_KEY = 'parameters'
|
412
|
-
AREAS_KEY = 'areas'
|
454
|
+
LANGUAGE_KEY = 'language'
|
455
|
+
CATEGORIES_KEY = 'categories'
|
456
|
+
EVENT_KEY = 'event'
|
457
|
+
RESPONSE_TYPES_KEY = 'response_types'
|
458
|
+
URGENCY_KEY = 'urgency'
|
459
|
+
SEVERITY_KEY = 'severity'
|
460
|
+
CERTAINTY_KEY = 'certainty'
|
461
|
+
AUDIENCE_KEY = 'audience'
|
462
|
+
EFFECTIVE_KEY = 'effective'
|
463
|
+
ONSET_KEY = 'onset'
|
464
|
+
EXPIRES_KEY = 'expires'
|
465
|
+
SENDER_NAME_KEY = 'sender_name'
|
466
|
+
HEADLINE_KEY = 'headline'
|
467
|
+
DESCRIPTION_KEY = 'description'
|
468
|
+
INSTRUCTION_KEY = 'instruction'
|
469
|
+
WEB_KEY = 'web'
|
470
|
+
CONTACT_KEY = 'contact'
|
471
|
+
RESOURCES_KEY = 'resources'
|
472
|
+
EVENT_CODES_KEY = 'event_codes'
|
473
|
+
PARAMETERS_KEY = 'parameters'
|
474
|
+
AREAS_KEY = 'areas'
|
413
475
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
476
|
+
# @return [Hash]
|
477
|
+
def to_h
|
478
|
+
RCAP.attribute_values_to_hash(
|
479
|
+
[ LANGUAGE_KEY, @language ],
|
480
|
+
[ CATEGORIES_KEY, @categories ],
|
481
|
+
[ EVENT_KEY, @event ],
|
482
|
+
[ RESPONSE_TYPES_KEY, @response_types ],
|
483
|
+
[ URGENCY_KEY, @urgency ],
|
484
|
+
[ SEVERITY_KEY, @severity ],
|
485
|
+
[ CERTAINTY_KEY, @certainty ],
|
486
|
+
[ AUDIENCE_KEY, @audience ],
|
487
|
+
[ EFFECTIVE_KEY, RCAP.to_s_for_cap( @effective )],
|
488
|
+
[ ONSET_KEY, RCAP.to_s_for_cap( @onset )],
|
489
|
+
[ EXPIRES_KEY, RCAP.to_s_for_cap( @expires )],
|
490
|
+
[ SENDER_NAME_KEY, @sender_name ],
|
491
|
+
[ HEADLINE_KEY, @headline ],
|
492
|
+
[ DESCRIPTION_KEY, @description ],
|
493
|
+
[ INSTRUCTION_KEY, @instruction ],
|
494
|
+
[ WEB_KEY, @web ],
|
495
|
+
[ CONTACT_KEY, @contact ],
|
496
|
+
[ RESOURCES_KEY, @resources.map{ |resource| resource.to_h } ],
|
497
|
+
[ EVENT_CODES_KEY, @event_codes.map{ |event_code| event_code.to_h } ],
|
498
|
+
[ PARAMETERS_KEY, @parameters.map{ |parameter| parameter.to_h } ],
|
499
|
+
[ AREAS_KEY, @areas.map{ |area| area.to_h }])
|
436
500
|
end
|
437
501
|
|
438
|
-
|
502
|
+
# @param [Hash] info_hash
|
503
|
+
# @return [Info]
|
504
|
+
def self.from_h( info_hash )
|
439
505
|
self.new( :language => info_hash[ LANGUAGE_KEY ],
|
440
506
|
:categories => info_hash[ CATEGORIES_KEY ],
|
441
507
|
:event => info_hash[ EVENT_KEY ],
|