rcap 2.4.1 → 2.7.3

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 (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