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.
Files changed (51) hide show
  1. data/{CHANGELOG.rdoc → CHANGELOG.md} +26 -20
  2. data/README.md +259 -0
  3. data/Rakefile +8 -7
  4. data/lib/extensions/array.rb +7 -1
  5. data/lib/extensions/date_time.rb +5 -1
  6. data/lib/extensions/string.rb +14 -1
  7. data/lib/extensions/time.rb +5 -1
  8. data/lib/rcap.rb +1 -1
  9. data/lib/rcap/alert.rb +24 -10
  10. data/lib/rcap/cap_1_0/alert.rb +232 -166
  11. data/lib/rcap/cap_1_0/area.rb +100 -67
  12. data/lib/rcap/cap_1_0/circle.rb +47 -22
  13. data/lib/rcap/cap_1_0/event_code.rb +3 -2
  14. data/lib/rcap/cap_1_0/geocode.rb +3 -2
  15. data/lib/rcap/cap_1_0/info.rb +265 -202
  16. data/lib/rcap/cap_1_0/parameter.rb +43 -20
  17. data/lib/rcap/cap_1_0/point.rb +23 -9
  18. data/lib/rcap/cap_1_0/polygon.rb +37 -19
  19. data/lib/rcap/cap_1_0/resource.rb +77 -55
  20. data/lib/rcap/cap_1_1/alert.rb +222 -156
  21. data/lib/rcap/cap_1_1/area.rb +100 -67
  22. data/lib/rcap/cap_1_1/circle.rb +49 -22
  23. data/lib/rcap/cap_1_1/event_code.rb +3 -2
  24. data/lib/rcap/cap_1_1/geocode.rb +3 -2
  25. data/lib/rcap/cap_1_1/info.rb +281 -217
  26. data/lib/rcap/cap_1_1/parameter.rb +35 -16
  27. data/lib/rcap/cap_1_1/point.rb +23 -9
  28. data/lib/rcap/cap_1_1/polygon.rb +38 -20
  29. data/lib/rcap/cap_1_1/resource.rb +106 -65
  30. data/lib/rcap/cap_1_2/alert.rb +224 -158
  31. data/lib/rcap/cap_1_2/area.rb +100 -67
  32. data/lib/rcap/cap_1_2/circle.rb +49 -24
  33. data/lib/rcap/cap_1_2/event_code.rb +3 -2
  34. data/lib/rcap/cap_1_2/geocode.rb +3 -2
  35. data/lib/rcap/cap_1_2/info.rb +285 -219
  36. data/lib/rcap/cap_1_2/parameter.rb +39 -19
  37. data/lib/rcap/cap_1_2/point.rb +23 -9
  38. data/lib/rcap/cap_1_2/polygon.rb +37 -20
  39. data/lib/rcap/cap_1_2/resource.rb +107 -67
  40. data/lib/rcap/config.rb +4 -0
  41. data/lib/rcap/utilities.rb +55 -2
  42. data/lib/rcap/validations.rb +2 -2
  43. data/lib/rcap/version.rb +1 -1
  44. data/rcap.gemspec +2 -2
  45. data/spec/cap_1_0/parameter_spec.rb +5 -1
  46. data/spec/cap_1_1/resource_spec.rb +6 -0
  47. data/spec/cap_1_2/alert_spec.rb +8 -0
  48. data/spec/cap_1_2/resource_spec.rb +8 -2
  49. metadata +11 -10
  50. data/README.rdoc +0 -247
  51. data/lib/config.rb +0 -2
@@ -9,33 +9,42 @@ module RCAP
9
9
  class Area
10
10
  include Validation
11
11
 
12
- # Area Description - Textual description of area.
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
- # Collection of Circle objects
18
+ # @return [Array<Circle>]
19
19
  attr_reader( :circles )
20
- # Collection of Geocode objects
20
+ # @return [Array<Geocode>]
21
21
  attr_reader( :geocodes )
22
- # Collection of Polygon objects
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' # :nodoc:
30
- AREA_DESC_ELEMENT_NAME = 'areaDesc' # :nodoc:
31
- ALTITUDE_ELEMENT_NAME = 'altitude' # :nodoc:
32
- CEILING_ELEMENT_NAME = 'ceiling' # :nodoc:
33
-
34
- XPATH = "cap:#{ XML_ELEMENT_NAME }" # :nodoc:
35
- AREA_DESC_XPATH = "cap:#{ AREA_DESC_ELEMENT_NAME }" # :nodoc:
36
- ALTITUDE_XPATH = "cap:#{ ALTITUDE_ELEMENT_NAME }" # :nodoc:
37
- CEILING_XPATH = "cap:#{ CEILING_ELEMENT_NAME }" # :nodoc:
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. The
49
- # polygon_attributes are passed as a parameter to Polygon.new.
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
- self.polygons << polygon
64
+ @polygons << polygon
53
65
  polygon
54
66
  end
55
67
 
56
- # Creates a new Circle object and adds it to the circles array. The
57
- # circle_attributes are passed as a parameter to Circle.new.
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
- self.circles << circle
75
+ @circles << circle
61
76
  circle
62
77
  end
63
78
 
64
- # Creates a new Geocode object and adds it to the geocodes array. The
65
- # geocode_attributes are passed as a parameter to Geocode.new.
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
- self.geocodes << geocode
86
+ @geocodes << geocode
69
87
  geocode
70
88
  end
71
89
 
72
- def to_xml_element # :nodoc:
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 self.altitude.blank?
83
- xml_element.add_element( CEILING_ELEMENT_NAME ).add_text( @ceiling.to_s ) unless self.altitude.blank?
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
- def to_xml # :nodoc:
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
- def inspect # :nodoc:
98
- area_inspect = "Area Description: #{ self.area_desc }\n"+
120
+ # @return [String]
121
+ def inspect
122
+ area_inspect = "Area Description: #{ @area_desc }\n"+
99
123
  "Polygons:\n"+
100
- self.polygons.map{ |polygon| " " + polygon.inspect }.join("\n" )+"\n"+
101
- "Circles: #{ self.circles.inspect }\n"+
102
- "Geocodes: #{ self.geocodes.inspect }\n"
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 a string representation of the area of the form
107
- # area_desc
130
+ # Returns the area description
131
+ #
132
+ # @return [String]
108
133
  def to_s
109
- self.area_desc
134
+ @area_desc
110
135
  end
111
136
 
112
- def self.from_xml_element( area_xml_element ) # :nodoc:
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' # :nodoc:
122
- ALTITUDE_YAML = 'Altitude' # :nodoc:
123
- CEILING_YAML = 'Ceiling' # :nodoc:
124
- CIRCLES_YAML = 'Circles' # :nodoc:
125
- GEOCODES_YAML = 'Geocodes' # :nodoc:
126
- POLYGONS_YAML = 'Polygons' # :nodoc:
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
- def to_yaml( options = {} ) # :nodoc:
155
+ # @return [String] YAML representation of object
156
+ def to_yaml( options = {} )
129
157
  RCAP.attribute_values_to_hash(
130
- [ AREA_DESC_YAML, self.area_desc ],
131
- [ ALTITUDE_YAML, self.altitude ],
132
- [ CEILING_YAML, self.ceiling ],
133
- [ CIRCLES_YAML, self.circles.map{ |circle| [ circle.lattitude, circle.longitude, circle.radius ]} ],
134
- [ GEOCODES_YAML, self.geocodes.inject({}){|h,geocode| h.merge( geocode.name => geocode.value )}],
135
- [ POLYGONS_YAML, self.polygons ]
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
- def self.from_yaml_data( area_yaml_data ) # :nodoc:
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' # :nodoc:
149
- ALTITUDE_KEY = 'altitude' # :nodoc:
150
- CEILING_KEY = 'ceiling' # :nodoc:
151
- CIRCLES_KEY = 'circles' # :nodoc:
152
- GEOCODES_KEY = 'geocodes' # :nodoc:
153
- POLYGONS_KEY = 'polygons' # :nodoc:
154
-
155
- def to_h # :nodoc:
156
- RCAP.attribute_values_to_hash( [ AREA_DESC_KEY, self.area_desc ],
157
- [ ALTITUDE_KEY, self.altitude ],
158
- [ CEILING_KEY, self.ceiling ],
159
- [ CIRCLES_KEY, self.circles.map{ |circle| circle.to_h } ],
160
- [ GEOCODES_KEY, self.geocodes.map{ |geocode| geocode.to_h } ],
161
- [ POLYGONS_KEY, self.polygons.map{ |polygon| polygon.to_h } ])
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
- def self.from_h( area_hash ) # :nodoc:
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 ],
@@ -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' # :nodoc:
15
+ XML_ELEMENT_NAME = 'circle'
16
16
 
17
- XPATH = 'cap:circle' # :nodoc:
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,radius
26
- def to_s # :nodoc:
27
- "#{ self.lattitude },#{ self.longitude } #{ self.radius }"
29
+ # lattitude,longitude radius
30
+ #
31
+ # @return [String]
32
+ def to_s
33
+ "#{ @lattitude },#{ @longitude } #{ @radius }"
28
34
  end
29
35
 
30
- def inspect # :nodoc:
36
+ # @return [String]
37
+ def inspect
31
38
  "(#{ self.to_s })"
32
39
  end
33
40
 
34
- def to_xml_element # :nodoc:
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
- def to_xml # :nodoc:
48
+ # @return [String]
49
+ def to_xml
41
50
  self.to_xml_element.to_s
42
51
  end
43
52
 
44
- def self.parse_circle_string( circle_string ) # :nodoc:
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
- def self.from_xml_element( circle_xml_element ) # :nodoc:
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
- [ self.lattitude, self.longitude, self.radius ] == [ other.lattitude, other.longitude, other.radius ]
78
+ [ @lattitude, @longitude, @radius ] == [ other.lattitude, other.longitude, other.radius ]
60
79
  end
61
80
 
62
- def self.from_yaml_data( circle_yaml_data ) # :nodoc:
63
- lattitude, longitude,radius = circle_yaml_data
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' # :nodoc:
68
- LATTITUDE_KEY = 'lattitude' # :nodoc:
69
- LONGITUDE_KEY = 'longitude' # :nodoc:
70
- def to_h # :nodoc:
71
- RCAP.attribute_values_to_hash( [ RADIUS_KEY, self.radius ],
72
- [ LATTITUDE_KEY, self.lattitude ],
73
- [ LONGITUDE_KEY, self.longitude ])
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
- def self.from_h( circle_hash ) # :nodoc:
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' # :nodoc:
5
- XPATH = "cap:#{ XML_ELEMENT_NAME }" # :nodoc:
5
+ XML_ELEMENT_NAME = 'eventCode'
6
+ XPATH = "cap:#{ XML_ELEMENT_NAME }"
6
7
  end
7
8
  end
8
9
  end
@@ -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' # :nodoc:
5
- XPATH = "cap:#{ XML_ELEMENT_NAME }" # :nodoc:
5
+ XML_ELEMENT_NAME = 'geocode'
6
+ XPATH = "cap:#{ XML_ELEMENT_NAME }"
6
7
  end
7
8
  end
8
9
  end
@@ -11,88 +11,88 @@ module RCAP
11
11
  class Info
12
12
  include Validation
13
13
 
14
- CATEGORY_GEO = "Geo" # :nodoc:
15
- CATEGORY_MET = "Met" # :nodoc:
16
- CATEGORY_SAFETY = "Safety" # :nodoc:
17
- CATEGORY_SECURITY = "Security" # :nodoc:
18
- CATEGORY_RESCUE = "Rescue" # :nodoc:
19
- CATEGORY_FIRE = "Fire" # :nodoc:
20
- CATEGORY_HEALTH = "Health" # :nodoc:
21
- CATEGORY_ENV = "Env" # :nodoc:
22
- CATEGORY_TRANSPORT = "Transport" # :nodoc:
23
- CATEGORY_INFRA = "Infra" # :nodoc:
24
- CATEGORY_CBRNE = "CBRNE" # :nodoc:
25
- CATEGORY_OTHER = "Other" # :nodoc:
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" # :nodoc:
33
- URGENCY_EXPECTED = "Expected" # :nodoc:
34
- URGENCY_FUTURE = "Future" # :nodoc:
35
- URGENCY_PAST = "Past" # :nodoc:
36
- URGENCY_UNKNOWN = "Unknown" # :nodoc:
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" # :nodoc:
42
- SEVERITY_SEVERE = "Severe" # :nodoc:
43
- SEVERITY_MODERATE = "Moderate" # :nodoc:
44
- SEVERITY_MINOR = "Minor" # :nodoc:
45
- SEVERITY_UNKNOWN = "Unknown" # :nodoc:
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" # :nodoc:
51
- CERTAINTY_LIKELY = "Likely" # :nodoc:
52
- CERTAINTY_POSSIBLE = "Possible" # :nodoc:
53
- CERTAINTY_UNLIKELY = "Unlikely" # :nodoc:
54
- CERTAINTY_UNKNOWN = "Unknown" # :nodoc:
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' # :nodoc:
60
- LANGUAGE_ELEMENT_NAME = 'language' # :nodoc:
61
- CATEGORY_ELEMENT_NAME = 'category' # :nodoc:
62
- EVENT_ELEMENT_NAME = 'event' # :nodoc:
63
- URGENCY_ELEMENT_NAME = 'urgency' # :nodoc:
64
- SEVERITY_ELEMENT_NAME = 'severity' # :nodoc:
65
- CERTAINTY_ELEMENT_NAME = 'certainty' # :nodoc:
66
- AUDIENCE_ELEMENT_NAME = 'audience' # :nodoc:
67
- EVENT_CODE_ELEMENT_NAME = 'eventCode' # :nodoc:
68
- EFFECTIVE_ELEMENT_NAME = 'effective' # :nodoc:
69
- ONSET_ELEMENT_NAME = 'onset' # :nodoc:
70
- EXPIRES_ELEMENT_NAME = 'expires' # :nodoc:
71
- SENDER_NAME_ELEMENT_NAME = 'senderName' # :nodoc:
72
- HEADLINE_ELEMENT_NAME = 'headline' # :nodoc:
73
- DESCRIPTION_ELEMENT_NAME = 'description' # :nodoc:
74
- INSTRUCTION_ELEMENT_NAME = 'instruction' # :nodoc:
75
- WEB_ELEMENT_NAME = 'web' # :nodoc:
76
- CONTACT_ELEMENT_NAME = 'contact' # :nodoc:
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 }" # :nodoc:
79
- LANGUAGE_XPATH = "cap:#{ LANGUAGE_ELEMENT_NAME }" # :nodoc:
80
- EVENT_XPATH = "cap:#{ EVENT_ELEMENT_NAME }" # :nodoc:
81
- URGENCY_XPATH = "cap:#{ URGENCY_ELEMENT_NAME }" # :nodoc:
82
- CATEGORY_XPATH = "cap:#{ CATEGORY_ELEMENT_NAME }" # :nodoc:
83
- SEVERITY_XPATH = "cap:#{ SEVERITY_ELEMENT_NAME }" # :nodoc:
84
- CERTAINTY_XPATH = "cap:#{ CERTAINTY_ELEMENT_NAME }" # :nodoc:
85
- AUDIENCE_XPATH = "cap:#{ AUDIENCE_ELEMENT_NAME }" # :nodoc:
86
- EVENT_CODE_XPATH = "cap:#{ EVENT_CODE_ELEMENT_NAME }" # :nodoc:
87
- EFFECTIVE_XPATH = "cap:#{ EFFECTIVE_ELEMENT_NAME }" # :nodoc:
88
- ONSET_XPATH = "cap:#{ ONSET_ELEMENT_NAME }" # :nodoc:
89
- EXPIRES_XPATH = "cap:#{ EXPIRES_ELEMENT_NAME }" # :nodoc:
90
- SENDER_NAME_XPATH = "cap:#{ SENDER_NAME_ELEMENT_NAME }" # :nodoc:
91
- HEADLINE_XPATH = "cap:#{ HEADLINE_ELEMENT_NAME }" # :nodoc:
92
- DESCRIPTION_XPATH = "cap:#{ DESCRIPTION_ELEMENT_NAME }" # :nodoc:
93
- INSTRUCTION_XPATH = "cap:#{ INSTRUCTION_ELEMENT_NAME }" # :nodoc:
94
- WEB_XPATH = "cap:#{ WEB_ELEMENT_NAME }" # :nodoc:
95
- CONTACT_XPATH = "cap:#{ CONTACT_ELEMENT_NAME }" # :nodoc:
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
- # Collectoin of EventCode objects
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
- self.event_codes << event_code
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
- self.parameters << parameter
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
- self.resources << resource
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
- self.areas << area
240
+ @areas << area
191
241
  area
192
242
  end
193
243
 
194
- def to_xml_element # :nodoc:
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( self.language ) if self.language
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( self.event )
201
- xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text( self.urgency )
202
- xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text( self.severity )
203
- xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text( self.certainty )
204
- xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text( self.audience ) if self.audience
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( self.effective.to_s_for_cap ) if self.effective
209
- xml_element.add_element( ONSET_ELEMENT_NAME ).add_text( self.onset.to_s_for_cap ) if self.onset
210
- xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text( self.expires.to_s_for_cap ) if self.expires
211
- xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text( self.sender_name ) if self.sender_name
212
- xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text( self.headline ) if self.headline
213
- xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text( self.description ) if self.description
214
- xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text( self.instruction ) if self.instruction
215
- xml_element.add_element( WEB_ELEMENT_NAME ).add_text( self.web ) if self.web
216
- xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text( self.contact ) if self.contact
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
- def to_xml # :nodoc:
280
+ # @return [String]
281
+ def to_xml
230
282
  self.to_xml_element.to_s
231
283
  end
232
284
 
233
- def inspect # :nodoc:
234
- info_inspect = "Language: #{ self.language }\n"+
235
- "Categories: #{ self.categories.to_s_for_cap }\n"+
236
- "Event: #{ self.event }\n"+
237
- "Urgency: #{ self.urgency }\n"+
238
- "Severity: #{ self.severity }\n"+
239
- "Certainty: #{ self.certainty }\n"+
240
- "Audience: #{ self.audience }\n"+
241
- "Event Codes: #{ self.event_codes.inspect }\n"+
242
- "Effective: #{ self.effective }\n"+
243
- "Onset: #{ self.onset }\n"+
244
- "Expires: #{ self.expires }\n"+
245
- "Sender Name: #{ self.sender_name }\n"+
246
- "Headline: #{ self.headline }\n"+
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
- self.description.to_s.lines.map{ |line| " " + line }.join( "\n")+"\n"+
249
- "Instruction: #{ self.instruction }\n"+
250
- "Web: #{ self.web }\n"+
251
- "Contact: #{ self.contact }\n"+
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
- self.parameters.map{ |parameter| parameter.inspect }.join( "\n" )+"\n"+
306
+ @parameters.map{ |parameter| parameter.inspect }.join( "\n" )+"\n"+
254
307
  "Resources:\n"+
255
- self.resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
308
+ @resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
256
309
  "Area:\n"+
257
- self.areas.map{ |area| " #{ area }" }.join( "\n" )+"\n"
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
- "#{ self.event }(#{ self.urgency }/#{ self.severity }/#{ self.certainty })"
319
+ "#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
265
320
  end
266
321
 
267
- def self.from_xml_element( info_xml_element ) # :nodoc:
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' # :nodoc:
293
- CATEGORIES_YAML = 'Categories' # :nodoc:
294
- EVENT_YAML = 'Event' # :nodoc:
295
- URGENCY_YAML = 'Urgency' # :nodoc:
296
- SEVERITY_YAML = 'Severity' # :nodoc:
297
- CERTAINTY_YAML = 'Certainty' # :nodoc:
298
- AUDIENCE_YAML = 'Audience' # :nodoc:
299
- EFFECTIVE_YAML = 'Effective' # :nodoc:
300
- ONSET_YAML = 'Onset' # :nodoc:
301
- EXPIRES_YAML = 'Expires' # :nodoc:
302
- SENDER_NAME_YAML = 'Sender Name' # :nodoc:
303
- HEADLINE_YAML = 'Headline' # :nodoc:
304
- DESCRIPTION_YAML = 'Description' # :nodoc:
305
- INSTRUCTION_YAML = 'Instruction' # :nodoc:
306
- WEB_YAML = 'Web' # :nodoc:
307
- CONTACT_YAML = 'Contact' # :nodoc:
308
- EVENT_CODES_YAML = 'Event Codes' # :nodoc:
309
- PARAMETERS_YAML = 'Parameters' # :nodoc:
310
- RESOURCES_YAML = 'Resources' # :nodoc:
311
- AREAS_YAML = 'Areas' # :nodoc:
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
- def to_yaml( options = {} ) # :nodoc:
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, self.language ],
317
- [ CATEGORIES_YAML, self.categories ],
318
- [ EVENT_YAML, self.event ],
319
- [ URGENCY_YAML, self.urgency ],
320
- [ SEVERITY_YAML, self.severity ],
321
- [ CERTAINTY_YAML, self.certainty ],
322
- [ AUDIENCE_YAML, self.audience ],
323
- [ EFFECTIVE_YAML, self.effective ],
324
- [ ONSET_YAML, self.onset ],
325
- [ EXPIRES_YAML, self.expires ],
326
- [ SENDER_NAME_YAML, self.sender_name ],
327
- [ HEADLINE_YAML, self.headline ],
328
- [ DESCRIPTION_YAML, self.description ],
329
- [ INSTRUCTION_YAML, self.instruction ],
330
- [ WEB_YAML, self.web ],
331
- [ CONTACT_YAML, self.contact ],
332
- [ EVENT_CODES_YAML, self.event_codes.inject({}, &parameter_to_hash )],
333
- [ PARAMETERS_YAML, self.parameters.inject({}, &parameter_to_hash )],
334
- [ RESOURCES_YAML, self.resources ],
335
- [ AREAS_YAML, self.areas ]).to_yaml( options )
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({}, &parameter_to_hash )],
391
+ [ PARAMETERS_YAML, @parameters.inject({}, &parameter_to_hash )],
392
+ [ RESOURCES_YAML, @resources ],
393
+ [ AREAS_YAML, @areas ]).to_yaml( options )
336
394
  end
337
395
 
338
- def self.from_yaml_data( info_yaml_data ) # :nodoc:
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' # :nodoc:
364
- CATEGORIES_KEY = 'categories' # :nodoc:
365
- EVENT_KEY = 'event' # :nodoc:
366
- URGENCY_KEY = 'urgency' # :nodoc:
367
- SEVERITY_KEY = 'severity' # :nodoc:
368
- CERTAINTY_KEY = 'certainty' # :nodoc:
369
- AUDIENCE_KEY = 'audience' # :nodoc:
370
- EFFECTIVE_KEY = 'effective' # :nodoc:
371
- ONSET_KEY = 'onset' # :nodoc:
372
- EXPIRES_KEY = 'expires' # :nodoc:
373
- SENDER_NAME_KEY = 'sender_name' # :nodoc:
374
- HEADLINE_KEY = 'headline' # :nodoc:
375
- DESCRIPTION_KEY = 'description' # :nodoc:
376
- INSTRUCTION_KEY = 'instruction' # :nodoc:
377
- WEB_KEY = 'web' # :nodoc:
378
- CONTACT_KEY = 'contact' # :nodoc:
379
- RESOURCES_KEY = 'resources' # :nodoc:
380
- EVENT_CODES_KEY = 'event_codes' # :nodoc:
381
- PARAMETERS_KEY = 'parameters' # :nodoc:
382
- AREAS_KEY = 'areas' # :nodoc:
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
- def to_h # :nodoc:
385
- RCAP.attribute_values_to_hash( [ LANGUAGE_KEY, self.language ],
386
- [ CATEGORIES_KEY, self.categories ],
387
- [ EVENT_KEY, self.event ],
388
- [ URGENCY_KEY, self.urgency ],
389
- [ SEVERITY_KEY, self.severity ],
390
- [ CERTAINTY_KEY, self.certainty ],
391
- [ AUDIENCE_KEY, self.audience ],
392
- [ EFFECTIVE_KEY, RCAP.to_s_for_cap( self.effective )],
393
- [ ONSET_KEY, RCAP.to_s_for_cap( self.onset )],
394
- [ EXPIRES_KEY, RCAP.to_s_for_cap( self.expires )],
395
- [ SENDER_NAME_KEY, self.sender_name ],
396
- [ HEADLINE_KEY, self.headline ],
397
- [ DESCRIPTION_KEY, self.description ],
398
- [ INSTRUCTION_KEY, self.instruction ],
399
- [ WEB_KEY, self.web ],
400
- [ CONTACT_KEY, self.contact ],
401
- [ RESOURCES_KEY, self.resources.map{ |resource| resource.to_h } ],
402
- [ EVENT_CODES_KEY, self.event_codes.map{ |event_code| event_code.to_h } ],
403
- [ PARAMETERS_KEY, self.parameters.map{ |parameter| parameter.to_h } ],
404
- [ AREAS_KEY, self.areas.map{ |area| area.to_h }])
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
- def self.from_h( info_hash ) # :nodoc:
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 ],