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