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