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