rcap 2.4.1 → 2.7.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +5 -5
  2. data/.ruby-version +1 -0
  3. data/CHANGELOG.md +18 -0
  4. data/README.md +1 -0
  5. data/lib/rcap.rb +3 -1
  6. data/lib/rcap/alert.rb +30 -29
  7. data/lib/rcap/base/alert.rb +208 -205
  8. data/lib/rcap/base/area.rb +95 -91
  9. data/lib/rcap/base/circle.rb +45 -34
  10. data/lib/rcap/base/event_code.rb +2 -0
  11. data/lib/rcap/base/geocode.rb +2 -0
  12. data/lib/rcap/base/info.rb +273 -272
  13. data/lib/rcap/base/parameter.rb +29 -28
  14. data/lib/rcap/base/point.rb +26 -24
  15. data/lib/rcap/base/polygon.rb +43 -35
  16. data/lib/rcap/base/resource.rb +65 -65
  17. data/lib/rcap/cap_1_0/alert.rb +85 -86
  18. data/lib/rcap/cap_1_0/area.rb +2 -2
  19. data/lib/rcap/cap_1_0/circle.rb +2 -1
  20. data/lib/rcap/cap_1_0/event_code.rb +3 -1
  21. data/lib/rcap/cap_1_0/geocode.rb +3 -1
  22. data/lib/rcap/cap_1_0/info.rb +3 -3
  23. data/lib/rcap/cap_1_0/parameter.rb +13 -13
  24. data/lib/rcap/cap_1_0/point.rb +2 -1
  25. data/lib/rcap/cap_1_0/polygon.rb +3 -3
  26. data/lib/rcap/cap_1_0/resource.rb +2 -3
  27. data/lib/rcap/cap_1_1/alert.rb +6 -6
  28. data/lib/rcap/cap_1_1/area.rb +2 -2
  29. data/lib/rcap/cap_1_1/circle.rb +2 -1
  30. data/lib/rcap/cap_1_1/event_code.rb +3 -1
  31. data/lib/rcap/cap_1_1/geocode.rb +3 -1
  32. data/lib/rcap/cap_1_1/info.rb +125 -132
  33. data/lib/rcap/cap_1_1/parameter.rb +2 -3
  34. data/lib/rcap/cap_1_1/point.rb +2 -1
  35. data/lib/rcap/cap_1_1/polygon.rb +3 -3
  36. data/lib/rcap/cap_1_1/resource.rb +37 -38
  37. data/lib/rcap/cap_1_2/alert.rb +6 -6
  38. data/lib/rcap/cap_1_2/area.rb +2 -2
  39. data/lib/rcap/cap_1_2/circle.rb +2 -1
  40. data/lib/rcap/cap_1_2/event_code.rb +3 -1
  41. data/lib/rcap/cap_1_2/geocode.rb +3 -1
  42. data/lib/rcap/cap_1_2/info.rb +120 -123
  43. data/lib/rcap/cap_1_2/parameter.rb +2 -3
  44. data/lib/rcap/cap_1_2/point.rb +2 -1
  45. data/lib/rcap/cap_1_2/polygon.rb +4 -4
  46. data/lib/rcap/cap_1_2/resource.rb +38 -38
  47. data/lib/rcap/config.rb +5 -3
  48. data/lib/rcap/custom_validators.rb +75 -78
  49. data/lib/rcap/extensions/array.rb +3 -1
  50. data/lib/rcap/extensions/date.rb +3 -1
  51. data/lib/rcap/extensions/date_time.rb +5 -2
  52. data/lib/rcap/extensions/float.rb +2 -0
  53. data/lib/rcap/extensions/integer.rb +7 -0
  54. data/lib/rcap/extensions/nil_class.rb +2 -0
  55. data/lib/rcap/extensions/string.rb +6 -4
  56. data/lib/rcap/extensions/time.rb +5 -3
  57. data/lib/rcap/formatters/yaml.rb +5 -0
  58. data/lib/rcap/info.rb +6 -5
  59. data/lib/rcap/utilities.rb +27 -30
  60. data/lib/rcap/validation.rb +22 -21
  61. data/lib/rcap/version.rb +3 -1
  62. data/rcap.gemspec +5 -5
  63. data/spec/alert_spec.rb +141 -141
  64. data/spec/cap_1_0/alert_spec.rb +92 -94
  65. data/spec/cap_1_0/area_spec.rb +86 -86
  66. data/spec/cap_1_0/circle_spec.rb +48 -39
  67. data/spec/cap_1_0/event_code_spec.rb +15 -15
  68. data/spec/cap_1_0/geocode_spec.rb +16 -16
  69. data/spec/cap_1_0/info_spec.rb +175 -177
  70. data/spec/cap_1_0/parameter_spec.rb +27 -27
  71. data/spec/cap_1_0/point_spec.rb +18 -18
  72. data/spec/cap_1_0/polygon_spec.rb +43 -41
  73. data/spec/cap_1_0/resource_spec.rb +63 -64
  74. data/spec/cap_1_1/alert_spec.rb +107 -109
  75. data/spec/cap_1_1/area_spec.rb +90 -90
  76. data/spec/cap_1_1/circle_spec.rb +43 -34
  77. data/spec/cap_1_1/event_code_spec.rb +15 -16
  78. data/spec/cap_1_1/geocode_spec.rb +16 -16
  79. data/spec/cap_1_1/info_spec.rb +194 -196
  80. data/spec/cap_1_1/parameter_spec.rb +17 -17
  81. data/spec/cap_1_1/point_spec.rb +18 -18
  82. data/spec/cap_1_1/polygon_spec.rb +43 -41
  83. data/spec/cap_1_1/resource_spec.rb +106 -107
  84. data/spec/cap_1_2/alert_spec.rb +98 -99
  85. data/spec/cap_1_2/area_spec.rb +90 -90
  86. data/spec/cap_1_2/circle_spec.rb +52 -43
  87. data/spec/cap_1_2/event_code_spec.rb +19 -20
  88. data/spec/cap_1_2/geocode_spec.rb +20 -20
  89. data/spec/cap_1_2/info_spec.rb +196 -198
  90. data/spec/cap_1_2/parameter_spec.rb +19 -19
  91. data/spec/cap_1_2/point_spec.rb +21 -21
  92. data/spec/cap_1_2/polygon_spec.rb +55 -47
  93. data/spec/cap_1_2/resource_spec.rb +96 -97
  94. data/spec/extensions_spec.rb +29 -29
  95. data/spec/info_spec.rb +15 -15
  96. data/spec/spec_helper.rb +3 -3
  97. data/spec/validations_spec.rb +73 -73
  98. metadata +12 -11
  99. data/lib/rcap/extensions/fixnum.rb +0 -5
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
-
4
5
  # An Alert object is valid if
5
6
  # * it has an identifier
6
7
  # * it has a sender
@@ -10,13 +11,12 @@ module RCAP
10
11
  # * it has a valid scope value
11
12
  # * all Info objects contained in infos are valid
12
13
  class Alert < RCAP::Base::Alert
14
+ XMLNS = 'urn:oasis:names:tc:emergency:cap:1.2'
15
+ CAP_VERSION = '1.2'
13
16
 
14
- XMLNS = "urn:oasis:names:tc:emergency:cap:1.2"
15
- CAP_VERSION = "1.2"
16
-
17
- STATUS_DRAFT = "Draft"
17
+ STATUS_DRAFT = 'Draft'
18
18
  # Valid values for status
19
- VALID_STATUSES = [ STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT ]
19
+ VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT].freeze
20
20
 
21
21
  # @return [String]
22
22
  def xmlns
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
-
4
5
  # An Area object is valid if
5
6
  # * it has an area description
6
7
  # * all Circle objects contained in circles are valid
@@ -8,7 +9,6 @@ module RCAP
8
9
  # * all Polygon objects contained in polygons are valid
9
10
  # * altitude has a value if ceiling is set
10
11
  class Area < RCAP::Base::Area
11
-
12
12
  # @return [String]
13
13
  def xmlns
14
14
  Alert::XMLNS
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
-
4
5
  # A Circle object is valid if
5
6
  # * it has a valid lattitude and longitude
6
7
  # * it has a radius with a value greater than zero
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # Subclass of {Parameter}
4
6
  class EventCode < RCAP::Base::EventCode
5
7
  XML_ELEMENT_NAME = 'eventCode'
6
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
8
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
7
9
 
8
10
  # @return [String]
9
11
  def xmlns
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # Subclass of {Parameter}
4
6
  class Geocode < RCAP::Base::Geocode
5
7
  XML_ELEMENT_NAME = 'geocode'
6
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
8
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
7
9
 
8
10
  # @return [String]
9
11
  def xmlns
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
-
4
5
  # In Info object is valid if
5
6
  # * it has an event
6
7
  # * it has an urgency with a valid value
@@ -10,31 +11,31 @@ module RCAP
10
11
  # * all Resource objects in the resources collection are valid
11
12
  # * all Area objects in the areas collection are valid
12
13
  class Info < RCAP::Base::Info
13
-
14
- RESPONSE_TYPE_SHELTER = "Shelter"
15
- RESPONSE_TYPE_EVACUATE = "Evacuate"
16
- RESPONSE_TYPE_PREPARE = "Prepare"
17
- RESPONSE_TYPE_EXECUTE = "Execute"
18
- RESPONSE_TYPE_MONITOR = "Monitor"
19
- RESPONSE_TYPE_ASSESS = "Assess"
20
- RESPONSE_TYPE_NONE = "None"
14
+ RESPONSE_TYPE_SHELTER = 'Shelter'
15
+ RESPONSE_TYPE_EVACUATE = 'Evacuate'
16
+ RESPONSE_TYPE_PREPARE = 'Prepare'
17
+ RESPONSE_TYPE_EXECUTE = 'Execute'
18
+ RESPONSE_TYPE_MONITOR = 'Monitor'
19
+ RESPONSE_TYPE_AVOID = 'Avoid'
20
+ RESPONSE_TYPE_ASSESS = 'Assess'
21
+ RESPONSE_TYPE_ALL_CLEAR = 'AllClear'
22
+ RESPONSE_TYPE_NONE = 'None'
21
23
  # Valid values for response_type
22
- VALID_RESPONSE_TYPES = [ RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE, RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR, RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_NONE ]
23
-
24
+ VALID_RESPONSE_TYPES = [RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE, RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR, RESPONSE_TYPE_AVOID, RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_ALL_CLEAR, RESPONSE_TYPE_NONE].freeze
24
25
 
25
- CERTAINTY_OBSERVED = "Observed"
26
+ CERTAINTY_OBSERVED = 'Observed'
26
27
  # Valid valies for certainty
27
- VALID_CERTAINTIES = [ CERTAINTY_OBSERVED, CERTAINTY_LIKELY, CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN ]
28
+ VALID_CERTAINTIES = [CERTAINTY_OBSERVED, CERTAINTY_LIKELY, CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN].freeze
28
29
 
29
30
  RESPONSE_TYPE_ELEMENT_NAME = 'responseType'
30
- RESPONSE_TYPE_XPATH = "cap:#{ RESPONSE_TYPE_ELEMENT_NAME }"
31
+ RESPONSE_TYPE_XPATH = "cap:#{RESPONSE_TYPE_ELEMENT_NAME}"
31
32
 
32
- validates_length_of( :categories, :minimum => 1 )
33
- validates_inclusion_of_members_of( :response_types, :in => VALID_RESPONSE_TYPES, :allow_blank => true )
34
- validates_inclusion_of( :certainty, :allow_nil => true, :in => VALID_CERTAINTIES, :message => "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
33
+ validates_length_of(:categories, minimum: 1)
34
+ validates_inclusion_of_members_of(:response_types, in: VALID_RESPONSE_TYPES, allow_blank: true)
35
+ validates_inclusion_of(:certainty, allow_nil: true, in: VALID_CERTAINTIES, message: "can only be assigned the following values: #{VALID_CERTAINTIES.join(', ')}")
35
36
 
36
37
  # @return [Array<String>] Collection of textual response types; elements must be from {VALID_RESPONSE_TYPES}
37
- attr_reader( :response_types )
38
+ attr_reader(:response_types)
38
39
 
39
40
  # Initialises a new Info object which will be yielded to an attached block if given
40
41
  #
@@ -72,76 +73,72 @@ module RCAP
72
73
 
73
74
  # @return [REXML::Element]
74
75
  def to_xml_element
75
- xml_element = REXML::Element.new( XML_ELEMENT_NAME )
76
- xml_element.add_element( LANGUAGE_ELEMENT_NAME ).add_text( @language ) if @language
76
+ xml_element = REXML::Element.new(XML_ELEMENT_NAME)
77
+ xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language) if @language
77
78
  @categories.each do |category|
78
- xml_element.add_element( CATEGORY_ELEMENT_NAME ).add_text( category )
79
+ xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category)
79
80
  end
80
- xml_element.add_element( EVENT_ELEMENT_NAME ).add_text( @event )
81
+ xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event)
81
82
  @response_types.each do |response_type|
82
- xml_element.add_element( RESPONSE_TYPE_ELEMENT_NAME ).add_text( response_type )
83
+ xml_element.add_element(RESPONSE_TYPE_ELEMENT_NAME).add_text(response_type)
83
84
  end
84
- xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text( @urgency )
85
- xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text( @severity )
86
- xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text( @certainty )
87
- xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text( @audience ) if @audience
85
+ xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency)
86
+ xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity)
87
+ xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty)
88
+ xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience) if @audience
88
89
  @event_codes.each do |event_code|
89
- xml_element.add_element( event_code.to_xml_element )
90
+ xml_element.add_element(event_code.to_xml_element)
90
91
  end
91
- xml_element.add_element( EFFECTIVE_ELEMENT_NAME ).add_text( @effective.to_s_for_cap ) if @effective
92
- xml_element.add_element( ONSET_ELEMENT_NAME ).add_text( @onset.to_s_for_cap ) if @onset
93
- xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text( @expires.to_s_for_cap ) if @expires
94
- xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text( @sender_name ) if @sender_name
95
- xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text( @headline ) if @headline
96
- xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text( @description ) if @description
97
- xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text( @instruction ) if @instruction
98
- xml_element.add_element( WEB_ELEMENT_NAME ).add_text( @web ) if @web
99
- xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text( @contact ) if @contact
92
+ xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
93
+ xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
94
+ xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
95
+ xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name) if @sender_name
96
+ xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline) if @headline
97
+ xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description) if @description
98
+ xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction) if @instruction
99
+ xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web) if @web
100
+ xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact) if @contact
100
101
  @parameters.each do |parameter|
101
- xml_element.add_element( parameter.to_xml_element )
102
+ xml_element.add_element(parameter.to_xml_element)
102
103
  end
103
104
  @resources.each do |resource|
104
- xml_element.add_element( resource.to_xml_element )
105
+ xml_element.add_element(resource.to_xml_element)
105
106
  end
106
107
  @areas.each do |area|
107
- xml_element.add_element( area.to_xml_element )
108
+ xml_element.add_element(area.to_xml_element)
108
109
  end
109
110
  xml_element
110
111
  end
111
112
 
112
113
  # @return [String]
113
114
  def to_xml
114
- self.to_xml_element.to_s
115
+ to_xml_element.to_s
115
116
  end
116
117
 
117
118
  # @return [String]
118
119
  def inspect
119
- info_inspect = "Language: #{ @language }\n"+
120
- "Categories: #{ @categories.to_s_for_cap }\n"+
121
- "Event: #{ @event }\n"+
122
- "Response Types: #{ @response_types.to_s_for_cap }\n"+
123
- "Urgency: #{ @urgency }\n"+
124
- "Severity: #{ @severity }\n"+
125
- "Certainty: #{ @certainty }\n"+
126
- "Audience: #{ @audience }\n"+
127
- "Event Codes: #{ @event_codes.inspect }\n"+
128
- "Effective: #{ @effective }\n"+
129
- "Onset: #{ @onset }\n"+
130
- "Expires: #{ @expires }\n"+
131
- "Sender Name: #{ @sender_name }\n"+
132
- "Headline: #{ @headline }\n"+
133
- "Description:\n"+
134
- @description.to_s.lines.map{ |line| " " + line }.join( "\n")+"\n"+
135
- "Instruction: #{ @instruction }\n"+
136
- "Web: #{ @web }\n"+
137
- "Contact: #{ @contact }\n"+
138
- "Parameters:\n"+
139
- @parameters.map{ |parameter| " " + parameter.inspect }.join( "\n" )+"\n"+
140
- "Resources:\n"+
141
- @resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
142
- "Area:\n"+
143
- @areas.map{ |area| " #{ area }" }.join( "\n" )+"\n"
144
- RCAP.format_lines_for_inspect( 'INFO', info_inspect )
120
+ info_inspect = "Language: #{@language}\n"\
121
+ "Categories: #{@categories.to_s_for_cap}\n"\
122
+ "Event: #{@event}\n"\
123
+ "Response Types: #{@response_types.to_s_for_cap}\n"\
124
+ "Urgency: #{@urgency}\n"\
125
+ "Severity: #{@severity}\n"\
126
+ "Certainty: #{@certainty}\n"\
127
+ "Audience: #{@audience}\n"\
128
+ "Event Codes: #{@event_codes.inspect}\n"\
129
+ "Effective: #{@effective}\n"\
130
+ "Onset: #{@onset}\n"\
131
+ "Expires: #{@expires}\n"\
132
+ "Sender Name: #{@sender_name}\n"\
133
+ "Headline: #{@headline}\n"\
134
+ "Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
135
+ "Instruction: #{@instruction}\n"\
136
+ "Web: #{@web}\n"\
137
+ "Contact: #{@contact}\n"\
138
+ "Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
139
+ "Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
140
+ "Area:\n" + @areas.map { |area| " #{area}" }.join("\n") + "\n"
141
+ RCAP.format_lines_for_inspect('INFO', info_inspect)
145
142
  end
146
143
 
147
144
  # Returns a string representation of the event of the form
@@ -149,15 +146,15 @@ module RCAP
149
146
  #
150
147
  # @return [String]
151
148
  def to_s
152
- "#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
149
+ "#{@event}(#{@urgency}/#{@severity}/#{@certainty})"
153
150
  end
154
151
 
155
152
  # @param [REXML::Element] info_xml_element
156
153
  # @return [Info]
157
- def self.from_xml_element( info_xml_element )
154
+ def self.from_xml_element(info_xml_element)
158
155
  super.tap do |info|
159
- RCAP.xpath_match( info_xml_element, RESPONSE_TYPE_XPATH, Alert::XMLNS ).each do |element|
160
- info.response_types << RCAP.strip_if_given( element.text )
156
+ RCAP.xpath_match(info_xml_element, RESPONSE_TYPE_XPATH, Alert::XMLNS).each do |element|
157
+ info.response_types << RCAP.strip_if_given(element.text)
161
158
  end
162
159
  end
163
160
  end
@@ -166,42 +163,42 @@ module RCAP
166
163
 
167
164
  # @return [Hash]
168
165
  def to_yaml_data
169
- parameter_to_hash = lambda{ |hash, parameter| hash.merge( parameter.name => parameter.value )}
170
-
171
- RCAP.attribute_values_to_hash( [ LANGUAGE_YAML, @language ],
172
- [ CATEGORIES_YAML, @categories ],
173
- [ EVENT_YAML, @event ],
174
- [ RESPONSE_TYPES_YAML, @response_types ],
175
- [ URGENCY_YAML, @urgency ],
176
- [ SEVERITY_YAML, @severity ],
177
- [ CERTAINTY_YAML, @certainty ],
178
- [ AUDIENCE_YAML, @audience ],
179
- [ EFFECTIVE_YAML, RCAP.to_s_for_cap( @effective )],
180
- [ ONSET_YAML, RCAP.to_s_for_cap( @onset )],
181
- [ EXPIRES_YAML, RCAP.to_s_for_cap( @expires )],
182
- [ SENDER_NAME_YAML, @sender_name ],
183
- [ HEADLINE_YAML, @headline ],
184
- [ DESCRIPTION_YAML, @description ],
185
- [ INSTRUCTION_YAML, @instruction ],
186
- [ WEB_YAML, @web ],
187
- [ CONTACT_YAML, @contact ],
188
- [ EVENT_CODES_YAML, @event_codes.inject({}, &parameter_to_hash )],
189
- [ PARAMETERS_YAML, @parameters.inject({}, &parameter_to_hash )],
190
- [ RESOURCES_YAML, @resources.map( &:to_yaml_data )],
191
- [ AREAS_YAML, @areas.map( &:to_yaml_data )])
166
+ parameter_to_hash = ->(hash, parameter) { hash.merge(parameter.name => parameter.value) }
167
+
168
+ RCAP.attribute_values_to_hash([LANGUAGE_YAML, @language],
169
+ [CATEGORIES_YAML, @categories],
170
+ [EVENT_YAML, @event],
171
+ [RESPONSE_TYPES_YAML, @response_types],
172
+ [URGENCY_YAML, @urgency],
173
+ [SEVERITY_YAML, @severity],
174
+ [CERTAINTY_YAML, @certainty],
175
+ [AUDIENCE_YAML, @audience],
176
+ [EFFECTIVE_YAML, RCAP.to_s_for_cap(@effective)],
177
+ [ONSET_YAML, RCAP.to_s_for_cap(@onset)],
178
+ [EXPIRES_YAML, RCAP.to_s_for_cap(@expires)],
179
+ [SENDER_NAME_YAML, @sender_name],
180
+ [HEADLINE_YAML, @headline],
181
+ [DESCRIPTION_YAML, @description],
182
+ [INSTRUCTION_YAML, @instruction],
183
+ [WEB_YAML, @web],
184
+ [CONTACT_YAML, @contact],
185
+ [EVENT_CODES_YAML, @event_codes.inject({}, &parameter_to_hash)],
186
+ [PARAMETERS_YAML, @parameters.inject({}, &parameter_to_hash)],
187
+ [RESOURCES_YAML, @resources.map(&:to_yaml_data)],
188
+ [AREAS_YAML, @areas.map(&:to_yaml_data)])
192
189
  end
193
190
 
194
191
  # @return [String]
195
- def to_yaml( options = {} )
196
- self.to_yaml_data.to_yaml( options )
192
+ def to_yaml(options = {})
193
+ to_yaml_data.to_yaml(options)
197
194
  end
198
195
 
199
196
  # @param [Hash] info_yaml_data
200
197
  # @return [Info]
201
- def self.from_yaml_data( info_yaml_data )
198
+ def self.from_yaml_data(info_yaml_data)
202
199
  super.tap do |info|
203
- Array( info_yaml_data [ RESPONSE_TYPES_YAML ]).each do |response_type|
204
- info.response_types << RCAP.strip_if_given( response_type )
200
+ Array(info_yaml_data [RESPONSE_TYPES_YAML]).each do |response_type|
201
+ info.response_types << RCAP.strip_if_given(response_type)
205
202
  end
206
203
  end
207
204
  end
@@ -210,35 +207,35 @@ module RCAP
210
207
 
211
208
  # @return [Hash]
212
209
  def to_h
213
- RCAP.attribute_values_to_hash( [ LANGUAGE_KEY, @language ],
214
- [ CATEGORIES_KEY, @categories ],
215
- [ EVENT_KEY, @event ],
216
- [ RESPONSE_TYPES_KEY, @response_types ],
217
- [ URGENCY_KEY, @urgency ],
218
- [ SEVERITY_KEY, @severity ],
219
- [ CERTAINTY_KEY, @certainty ],
220
- [ AUDIENCE_KEY, @audience ],
221
- [ EFFECTIVE_KEY, RCAP.to_s_for_cap( @effective )],
222
- [ ONSET_KEY, RCAP.to_s_for_cap( @onset )],
223
- [ EXPIRES_KEY, RCAP.to_s_for_cap( @expires )],
224
- [ SENDER_NAME_KEY, @sender_name ],
225
- [ HEADLINE_KEY, @headline ],
226
- [ DESCRIPTION_KEY, @description ],
227
- [ INSTRUCTION_KEY, @instruction ],
228
- [ WEB_KEY, @web ],
229
- [ CONTACT_KEY, @contact ],
230
- [ RESOURCES_KEY, @resources.map{ |resource| resource.to_h } ],
231
- [ EVENT_CODES_KEY, @event_codes.map{ |event_code| event_code.to_h } ],
232
- [ PARAMETERS_KEY, @parameters.map{ |parameter| parameter.to_h } ],
233
- [ AREAS_KEY, @areas.map{ |area| area.to_h }])
210
+ RCAP.attribute_values_to_hash([LANGUAGE_KEY, @language],
211
+ [CATEGORIES_KEY, @categories],
212
+ [EVENT_KEY, @event],
213
+ [RESPONSE_TYPES_KEY, @response_types],
214
+ [URGENCY_KEY, @urgency],
215
+ [SEVERITY_KEY, @severity],
216
+ [CERTAINTY_KEY, @certainty],
217
+ [AUDIENCE_KEY, @audience],
218
+ [EFFECTIVE_KEY, RCAP.to_s_for_cap(@effective)],
219
+ [ONSET_KEY, RCAP.to_s_for_cap(@onset)],
220
+ [EXPIRES_KEY, RCAP.to_s_for_cap(@expires)],
221
+ [SENDER_NAME_KEY, @sender_name],
222
+ [HEADLINE_KEY, @headline],
223
+ [DESCRIPTION_KEY, @description],
224
+ [INSTRUCTION_KEY, @instruction],
225
+ [WEB_KEY, @web],
226
+ [CONTACT_KEY, @contact],
227
+ [RESOURCES_KEY, @resources.map(&:to_h)],
228
+ [EVENT_CODES_KEY, @event_codes.map(&:to_h)],
229
+ [PARAMETERS_KEY, @parameters.map(&:to_h)],
230
+ [AREAS_KEY, @areas.map(&:to_h)])
234
231
  end
235
232
 
236
233
  # @param [Hash] info_hash
237
234
  # @return [Info]
238
- def self.from_h( info_hash )
235
+ def self.from_h(info_hash)
239
236
  super.tap do |info|
240
- Array( info_hash[ RESPONSE_TYPES_KEY ]).each do |response_type|
241
- info.response_types << RCAP.strip_if_given( response_type )
237
+ Array(info_hash[RESPONSE_TYPES_KEY]).each do |response_type|
238
+ info.response_types << RCAP.strip_if_given(response_type)
242
239
  end
243
240
  end
244
241
  end
@@ -1,11 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
-
4
5
  # A Parameter object is valid if
5
6
  # * it has a name
6
- # * it has a value
7
7
  class Parameter < RCAP::Base::Parameter
8
-
9
8
  # @return [String]
10
9
  def xmlns
11
10
  Alert::XMLNS
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
-
4
5
  # A Point object is valid if
5
6
  # * it has a lattitude within the minimum and maximum lattitude values
6
7
  # * it has a longitude within the minimum and maximum longitude values
@@ -1,12 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
-
4
5
  # A Polygon object is valid if
5
- # * it has a minimum of three points
6
+ # * if points are given it has a minimum of three points
6
7
  # * each Point object in the points collection is valid
7
8
  class Polygon < RCAP::Base::Polygon
8
-
9
- validates_length_of( :points, :minimum => 4 )
9
+ validates_length_of(:points, minimum: 4, allow_blank: true)
10
10
 
11
11
  # @return [Class]
12
12
  def point_class