rcap 2.4.1 → 2.5.0

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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/lib/rcap/alert.rb +28 -29
  4. data/lib/rcap/base/alert.rb +192 -192
  5. data/lib/rcap/base/area.rb +84 -86
  6. data/lib/rcap/base/circle.rb +32 -32
  7. data/lib/rcap/base/info.rb +248 -253
  8. data/lib/rcap/base/parameter.rb +23 -24
  9. data/lib/rcap/base/point.rb +23 -23
  10. data/lib/rcap/base/polygon.rb +32 -32
  11. data/lib/rcap/base/resource.rb +57 -57
  12. data/lib/rcap/cap_1_0/alert.rb +79 -83
  13. data/lib/rcap/cap_1_0/area.rb +0 -2
  14. data/lib/rcap/cap_1_0/circle.rb +0 -1
  15. data/lib/rcap/cap_1_0/info.rb +1 -3
  16. data/lib/rcap/cap_1_0/parameter.rb +11 -12
  17. data/lib/rcap/cap_1_0/point.rb +0 -1
  18. data/lib/rcap/cap_1_0/polygon.rb +0 -2
  19. data/lib/rcap/cap_1_0/resource.rb +0 -3
  20. data/lib/rcap/cap_1_1/alert.rb +4 -6
  21. data/lib/rcap/cap_1_1/area.rb +0 -2
  22. data/lib/rcap/cap_1_1/circle.rb +0 -1
  23. data/lib/rcap/cap_1_1/info.rb +120 -129
  24. data/lib/rcap/cap_1_1/parameter.rb +0 -2
  25. data/lib/rcap/cap_1_1/point.rb +0 -1
  26. data/lib/rcap/cap_1_1/polygon.rb +0 -2
  27. data/lib/rcap/cap_1_1/resource.rb +32 -34
  28. data/lib/rcap/cap_1_2/alert.rb +4 -6
  29. data/lib/rcap/cap_1_2/area.rb +0 -2
  30. data/lib/rcap/cap_1_2/circle.rb +0 -1
  31. data/lib/rcap/cap_1_2/info.rb +114 -121
  32. data/lib/rcap/cap_1_2/parameter.rb +0 -2
  33. data/lib/rcap/cap_1_2/point.rb +0 -1
  34. data/lib/rcap/cap_1_2/polygon.rb +1 -3
  35. data/lib/rcap/cap_1_2/resource.rb +32 -34
  36. data/lib/rcap/config.rb +3 -3
  37. data/lib/rcap/custom_validators.rb +72 -76
  38. data/lib/rcap/extensions/array.rb +1 -1
  39. data/lib/rcap/extensions/date.rb +2 -2
  40. data/lib/rcap/extensions/date_time.rb +3 -3
  41. data/lib/rcap/extensions/string.rb +3 -3
  42. data/lib/rcap/extensions/time.rb +2 -3
  43. data/lib/rcap/info.rb +4 -5
  44. data/lib/rcap/utilities.rb +24 -25
  45. data/lib/rcap/validation.rb +19 -20
  46. data/lib/rcap/version.rb +1 -1
  47. data/spec/alert_spec.rb +141 -141
  48. data/spec/cap_1_0/alert_spec.rb +92 -94
  49. data/spec/cap_1_0/area_spec.rb +86 -86
  50. data/spec/cap_1_0/circle_spec.rb +39 -39
  51. data/spec/cap_1_0/event_code_spec.rb +15 -15
  52. data/spec/cap_1_0/geocode_spec.rb +16 -16
  53. data/spec/cap_1_0/info_spec.rb +175 -177
  54. data/spec/cap_1_0/parameter_spec.rb +27 -27
  55. data/spec/cap_1_0/point_spec.rb +18 -18
  56. data/spec/cap_1_0/polygon_spec.rb +38 -38
  57. data/spec/cap_1_0/resource_spec.rb +63 -64
  58. data/spec/cap_1_1/alert_spec.rb +107 -109
  59. data/spec/cap_1_1/area_spec.rb +90 -90
  60. data/spec/cap_1_1/circle_spec.rb +34 -34
  61. data/spec/cap_1_1/event_code_spec.rb +15 -16
  62. data/spec/cap_1_1/geocode_spec.rb +16 -16
  63. data/spec/cap_1_1/info_spec.rb +194 -196
  64. data/spec/cap_1_1/parameter_spec.rb +17 -17
  65. data/spec/cap_1_1/point_spec.rb +18 -18
  66. data/spec/cap_1_1/polygon_spec.rb +36 -36
  67. data/spec/cap_1_1/resource_spec.rb +106 -107
  68. data/spec/cap_1_2/alert_spec.rb +98 -99
  69. data/spec/cap_1_2/area_spec.rb +90 -90
  70. data/spec/cap_1_2/circle_spec.rb +43 -43
  71. data/spec/cap_1_2/event_code_spec.rb +19 -20
  72. data/spec/cap_1_2/geocode_spec.rb +20 -20
  73. data/spec/cap_1_2/info_spec.rb +196 -198
  74. data/spec/cap_1_2/parameter_spec.rb +19 -19
  75. data/spec/cap_1_2/point_spec.rb +21 -21
  76. data/spec/cap_1_2/polygon_spec.rb +47 -47
  77. data/spec/cap_1_2/resource_spec.rb +96 -97
  78. data/spec/extensions_spec.rb +29 -29
  79. data/spec/info_spec.rb +15 -15
  80. data/spec/spec_helper.rb +3 -3
  81. data/spec/validations_spec.rb +73 -73
  82. metadata +2 -2
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
-
4
3
  # An Alert object is valid if
5
4
  # * it has an identifier
6
5
  # * it has a sender
@@ -10,12 +9,11 @@ module RCAP
10
9
  # * it has a valid scope value
11
10
  # * all Info objects contained in infos are valid
12
11
  class Alert < RCAP::Base::Alert
13
-
14
- XMLNS = "http://www.incident.com/cap/1.0"
15
- CAP_VERSION = "1.0"
12
+ XMLNS = 'http://www.incident.com/cap/1.0'
13
+ CAP_VERSION = '1.0'
16
14
 
17
15
  # @return [String]
18
- attr_accessor( :password )
16
+ attr_accessor(:password)
19
17
 
20
18
  # @return [String]
21
19
  def xmlns
@@ -31,100 +29,98 @@ module RCAP
31
29
 
32
30
  # @return [REXML::Element]
33
31
  def to_xml_element
34
- xml_element = REXML::Element.new( XML_ELEMENT_NAME )
35
- xml_element.add_namespace( XMLNS )
36
- xml_element.add_element( IDENTIFIER_ELEMENT_NAME ).add_text( @identifier ) if @identifier
37
- xml_element.add_element( SENDER_ELEMENT_NAME ).add_text( @sender ) if @sender
38
- xml_element.add_element( SENT_ELEMENT_NAME ).add_text( @sent.to_s_for_cap ) if @sent
39
- xml_element.add_element( STATUS_ELEMENT_NAME ).add_text( @status ) if @status
40
- xml_element.add_element( MSG_TYPE_ELEMENT_NAME ).add_text( @msg_type ) if @msg_type
41
- xml_element.add_element( PASSWORD_ELEMENT_NAME ).add_text( @password ) if @password
42
- xml_element.add_element( SOURCE_ELEMENT_NAME ).add_text( @source ) if @source
43
- xml_element.add_element( SCOPE_ELEMENT_NAME ).add_text( @scope ) if @scope
44
- xml_element.add_element( RESTRICTION_ELEMENT_NAME ).add_text( @restriction ) if @restriction
32
+ xml_element = REXML::Element.new(XML_ELEMENT_NAME)
33
+ xml_element.add_namespace(XMLNS)
34
+ xml_element.add_element(IDENTIFIER_ELEMENT_NAME).add_text(@identifier) if @identifier
35
+ xml_element.add_element(SENDER_ELEMENT_NAME).add_text(@sender) if @sender
36
+ xml_element.add_element(SENT_ELEMENT_NAME).add_text(@sent.to_s_for_cap) if @sent
37
+ xml_element.add_element(STATUS_ELEMENT_NAME).add_text(@status) if @status
38
+ xml_element.add_element(MSG_TYPE_ELEMENT_NAME).add_text(@msg_type) if @msg_type
39
+ xml_element.add_element(PASSWORD_ELEMENT_NAME).add_text(@password) if @password
40
+ xml_element.add_element(SOURCE_ELEMENT_NAME).add_text(@source) if @source
41
+ xml_element.add_element(SCOPE_ELEMENT_NAME).add_text(@scope) if @scope
42
+ xml_element.add_element(RESTRICTION_ELEMENT_NAME).add_text(@restriction) if @restriction
45
43
  if @addresses.any?
46
- xml_element.add_element( ADDRESSES_ELEMENT_NAME ).add_text( @addresses.to_s_for_cap )
44
+ xml_element.add_element(ADDRESSES_ELEMENT_NAME).add_text(@addresses.to_s_for_cap)
47
45
  end
48
46
  @codes.each do |code|
49
- xml_element.add_element( CODE_ELEMENT_NAME ).add_text( code )
47
+ xml_element.add_element(CODE_ELEMENT_NAME).add_text(code)
50
48
  end
51
- xml_element.add_element( NOTE_ELEMENT_NAME ).add_text( @note ) if @note
49
+ xml_element.add_element(NOTE_ELEMENT_NAME).add_text(@note) if @note
52
50
  if @references.any?
53
- xml_element.add_element( REFERENCES_ELEMENT_NAME ).add_text( @references.join( ' ' ))
51
+ xml_element.add_element(REFERENCES_ELEMENT_NAME).add_text(@references.join(' '))
54
52
  end
55
53
  if @incidents.any?
56
- xml_element.add_element( INCIDENTS_ELEMENT_NAME ).add_text( @incidents.join( ' ' ))
54
+ xml_element.add_element(INCIDENTS_ELEMENT_NAME).add_text(@incidents.join(' '))
57
55
  end
58
56
  @infos.each do |info|
59
- xml_element.add_element( info.to_xml_element )
57
+ xml_element.add_element(info.to_xml_element)
60
58
  end
61
59
  xml_element
62
60
  end
63
61
 
64
62
  # @return [String]
65
63
  def inspect
66
- alert_inspect = [ "CAP Version: #{ CAP_VERSION }",
67
- "Identifier: #{ @identifier }",
68
- "Sender: #{ @sender }",
69
- "Sent: #{ @sent }",
70
- "Status: #{ @status }",
71
- "Message Type: #{ @msg_type }",
72
- "Password: #{ @password }",
73
- "Source: #{ @source }",
74
- "Scope: #{ @scope }",
75
- "Restriction: #{ @restriction }",
76
- "Addresses: #{ @addresses.to_s_for_cap }",
77
- "Codes:",
78
- @codes.map{ |code| " " + code }.join("\n"),
79
- "Note: #{ @note }",
80
- "References: #{ @references.join( ' ' )}",
81
- "Incidents: #{ @incidents.join( ' ')}",
82
- "Information:",
83
- @infos.map{ |info| " " + info.to_s }.join( "\n" )].join("\n")
84
- RCAP.format_lines_for_inspect( 'ALERT', alert_inspect )
64
+ alert_inspect = ["CAP Version: #{ CAP_VERSION }",
65
+ "Identifier: #{ @identifier }",
66
+ "Sender: #{ @sender }",
67
+ "Sent: #{ @sent }",
68
+ "Status: #{ @status }",
69
+ "Message Type: #{ @msg_type }",
70
+ "Password: #{ @password }",
71
+ "Source: #{ @source }",
72
+ "Scope: #{ @scope }",
73
+ "Restriction: #{ @restriction }",
74
+ "Addresses: #{ @addresses.to_s_for_cap }",
75
+ 'Codes:',
76
+ @codes.map { |code| ' ' + code }.join("\n"),
77
+ "Note: #{ @note }",
78
+ "References: #{ @references.join(' ')}",
79
+ "Incidents: #{ @incidents.join(' ')}",
80
+ 'Information:',
81
+ @infos.map { |info| ' ' + info.to_s }.join("\n")].join("\n")
82
+ RCAP.format_lines_for_inspect('ALERT', alert_inspect)
85
83
  end
86
84
 
87
-
88
85
  PASSWORD_XPATH = "cap:#{ PASSWORD_ELEMENT_NAME }"
89
86
 
90
87
  # @param [REXML::Element] alert_xml_element
91
88
  # @return [RCAP::CAP_1_0::Alert]
92
- def self.from_xml_element( alert_xml_element )
89
+ def self.from_xml_element(alert_xml_element)
93
90
  super.tap do |alert|
94
- alert.password = RCAP.xpath_text( alert_xml_element, PASSWORD_XPATH, Alert::XMLNS )
91
+ alert.password = RCAP.xpath_text(alert_xml_element, PASSWORD_XPATH, Alert::XMLNS)
95
92
  end
96
93
  end
97
94
 
98
-
99
- PASSWORD_YAML = "Password"
95
+ PASSWORD_YAML = 'Password'
100
96
 
101
97
  # Returns a string containing the YAML representation of the alert.
102
98
  #
103
99
  # @return [String]
104
- def to_yaml( options = {} )
105
- RCAP.attribute_values_to_hash( [ CAP_VERSION_YAML, CAP_VERSION ],
106
- [ IDENTIFIER_YAML, @identifier ],
107
- [ SENDER_YAML, @sender ],
108
- [ SENT_YAML, @sent ],
109
- [ STATUS_YAML, @status ],
110
- [ MSG_TYPE_YAML, @msg_type ],
111
- [ PASSWORD_YAML, @password ],
112
- [ SOURCE_YAML, @source ],
113
- [ SCOPE_YAML, @scope ],
114
- [ RESTRICTION_YAML, @restriction ],
115
- [ ADDRESSES_YAML, @addresses ],
116
- [ CODES_YAML, @codes ],
117
- [ NOTE_YAML, @note ],
118
- [ REFERENCES_YAML, @references ],
119
- [ INCIDENTS_YAML, @incidents ],
120
- [ INFOS_YAML, @infos.map( &:to_yaml_data )]).to_yaml( options )
100
+ def to_yaml(options = {})
101
+ RCAP.attribute_values_to_hash([CAP_VERSION_YAML, CAP_VERSION],
102
+ [IDENTIFIER_YAML, @identifier],
103
+ [SENDER_YAML, @sender],
104
+ [SENT_YAML, @sent],
105
+ [STATUS_YAML, @status],
106
+ [MSG_TYPE_YAML, @msg_type],
107
+ [PASSWORD_YAML, @password],
108
+ [SOURCE_YAML, @source],
109
+ [SCOPE_YAML, @scope],
110
+ [RESTRICTION_YAML, @restriction],
111
+ [ADDRESSES_YAML, @addresses],
112
+ [CODES_YAML, @codes],
113
+ [NOTE_YAML, @note],
114
+ [REFERENCES_YAML, @references],
115
+ [INCIDENTS_YAML, @incidents],
116
+ [INFOS_YAML, @infos.map(&:to_yaml_data)]).to_yaml(options)
121
117
  end
122
118
 
123
119
  # @param [Hash] alert_yaml_data
124
120
  # @return [RCAP::CAP_1_0::Alert]
125
- def self.from_yaml_data( alert_yaml_data )
121
+ def self.from_yaml_data(alert_yaml_data)
126
122
  super.tap do |alert|
127
- alert.password = RCAP.strip_if_given( alert_yaml_data[ PASSWORD_YAML ])
123
+ alert.password = RCAP.strip_if_given(alert_yaml_data[PASSWORD_YAML])
128
124
  end
129
125
  end
130
126
 
@@ -134,31 +130,31 @@ module RCAP
134
130
  #
135
131
  # @return [Hash]
136
132
  def to_h
137
- RCAP.attribute_values_to_hash( [ CAP_VERSION_KEY, CAP_VERSION ],
138
- [ IDENTIFIER_KEY, @identifier ],
139
- [ SENDER_KEY, @sender ],
140
- [ SENT_KEY, RCAP.to_s_for_cap( @sent )],
141
- [ STATUS_KEY, @status ],
142
- [ MSG_TYPE_KEY, @msg_type ],
143
- [ PASSWORD_KEY, @password ],
144
- [ SOURCE_KEY, @source ],
145
- [ SCOPE_KEY, @scope ],
146
- [ RESTRICTION_KEY, @restriction ],
147
- [ ADDRESSES_KEY, @addresses ],
148
- [ CODES_KEY, @codes ],
149
- [ NOTE_KEY, @note ],
150
- [ REFERENCES_KEY, @references ],
151
- [ INCIDENTS_KEY, @incidents ],
152
- [ INFOS_KEY, @infos.map{ |info| info.to_h }])
133
+ RCAP.attribute_values_to_hash([CAP_VERSION_KEY, CAP_VERSION],
134
+ [IDENTIFIER_KEY, @identifier],
135
+ [SENDER_KEY, @sender],
136
+ [SENT_KEY, RCAP.to_s_for_cap(@sent)],
137
+ [STATUS_KEY, @status],
138
+ [MSG_TYPE_KEY, @msg_type],
139
+ [PASSWORD_KEY, @password],
140
+ [SOURCE_KEY, @source],
141
+ [SCOPE_KEY, @scope],
142
+ [RESTRICTION_KEY, @restriction],
143
+ [ADDRESSES_KEY, @addresses],
144
+ [CODES_KEY, @codes],
145
+ [NOTE_KEY, @note],
146
+ [REFERENCES_KEY, @references],
147
+ [INCIDENTS_KEY, @incidents],
148
+ [INFOS_KEY, @infos.map { |info| info.to_h }])
153
149
  end
154
150
 
155
151
  # Initialises an Alert object from a Hash produced by Alert#to_h
156
152
  #
157
153
  # @param [Hash] alert_hash
158
154
  # @return [RCAP::CAP_1_0::Alert]
159
- def self.from_h( alert_hash )
155
+ def self.from_h(alert_hash)
160
156
  super.tap do |alert|
161
- alert.password = RCAP.strip_if_given( alert_hash[ PASSWORD_KEY ])
157
+ alert.password = RCAP.strip_if_given(alert_hash[PASSWORD_KEY])
162
158
  end
163
159
  end
164
160
  end
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
-
4
3
  # An Area object is valid if
5
4
  # * it has an area description
6
5
  # * all Circle objects contained in circles are valid
@@ -8,7 +7,6 @@ module RCAP
8
7
  # * all Polygon objects contained in polygons are valid
9
8
  # * altitude has a value if ceiling is set
10
9
  class Area < RCAP::Base::Area
11
-
12
10
  # @return [String]
13
11
  def xmlns
14
12
  Alert::XMLNS
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
-
4
3
  # A Circle object is valid if
5
4
  # * it has a valid lattitude and longitude
6
5
  # * it has a radius with a value greater than zero
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
-
4
3
  # In Info object is valid if
5
4
  # * it has an event
6
5
  # * it has an urgency with a valid value
@@ -10,8 +9,7 @@ module RCAP
10
9
  # * all Resource objects in the resources collection are valid
11
10
  # * all Area objects in the areas collection are valid
12
11
  class Info < RCAP::Base::Info
13
-
14
- validates_inclusion_of( :certainty, :allow_nil => true, :in => VALID_CERTAINTIES, :message => "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
12
+ validates_inclusion_of(:certainty, allow_nil: true, in: VALID_CERTAINTIES, message: "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
15
13
 
16
14
  # @return [String]
17
15
  def xmlns
@@ -4,31 +4,30 @@ module RCAP
4
4
  # * it has a name
5
5
  # * it has a value
6
6
  class Parameter < RCAP::Base::Parameter
7
-
8
7
  # @return [REXML::Element]
9
8
  def to_xml_element
10
- xml_element = REXML::Element.new( self.class::XML_ELEMENT_NAME )
11
- xml_element.add_text( "#{ @name }=#{ @value }")
9
+ xml_element = REXML::Element.new(self.class::XML_ELEMENT_NAME)
10
+ xml_element.add_text("#{ @name }=#{ @value }")
12
11
  xml_element
13
12
  end
14
13
 
15
14
  # @param [REXML::Element] parameter_xml_element
16
15
  # @return [Parameter]
17
- def self.from_xml_element( parameter_xml_element )
18
- parameter_hash = self.parse_parameter( parameter_xml_element.text )
19
- self.new do |parameter|
20
- parameter.name = RCAP.strip_if_given( parameter_hash[ :name ])
21
- parameter.value = RCAP.strip_if_given( parameter_hash[ :value ])
16
+ def self.from_xml_element(parameter_xml_element)
17
+ parameter_hash = parse_parameter(parameter_xml_element.text)
18
+ new do |parameter|
19
+ parameter.name = RCAP.strip_if_given(parameter_hash[:name])
20
+ parameter.value = RCAP.strip_if_given(parameter_hash[:value])
22
21
  end
23
22
  end
24
23
 
25
24
  # @param [String] parameter_string
26
25
  # @return [Hash]
27
- def self.parse_parameter( parameter_string )
28
- name, value = parameter_string.split("=")
26
+ def self.parse_parameter(parameter_string)
27
+ name, value = parameter_string.split('=')
29
28
  if name && value
30
- { :name => RCAP.strip_if_given( name ),
31
- :value => RCAP.strip_if_given( value )}
29
+ { name: RCAP.strip_if_given(name),
30
+ value: RCAP.strip_if_given(value) }
32
31
  end
33
32
  end
34
33
  end
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
-
4
3
  # A Point object is valid if
5
4
  # * it has a lattitude within the minimum and maximum lattitude values
6
5
  # * it has a longitude within the minimum and maximum longitude values
@@ -1,11 +1,9 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
-
4
3
  # A Polygon object is valid if
5
4
  # * it has a minimum of three points
6
5
  # * each Point object in the points collection is valid
7
6
  class Polygon < RCAP::Base::Polygon
8
-
9
7
  # @return [Class]
10
8
  def point_class
11
9
  Point
@@ -1,11 +1,8 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
-
4
-
5
3
  # A Resource object is valid if
6
4
  # * it has a resource description
7
5
  class Resource < RCAP::Base::Resource
8
-
9
6
  # @return [String]
10
7
  def xmlns
11
8
  Alert::XMLNS
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_1
3
-
4
3
  # An Alert object is valid if
5
4
  # * it has an identifier
6
5
  # * it has a sender
@@ -10,13 +9,12 @@ module RCAP
10
9
  # * it has a valid scope value
11
10
  # * all Info objects contained in infos are valid
12
11
  class Alert < RCAP::Base::Alert
12
+ XMLNS = 'urn:oasis:names:tc:emergency:cap:1.1'
13
+ CAP_VERSION = '1.1'
13
14
 
14
- XMLNS = "urn:oasis:names:tc:emergency:cap:1.1"
15
- CAP_VERSION = "1.1"
16
-
17
- STATUS_DRAFT = "Draft"
15
+ STATUS_DRAFT = 'Draft'
18
16
  # Valid values for status
19
- VALID_STATUSES = [ STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT ]
17
+ VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT]
20
18
 
21
19
  # @return [String]
22
20
  def xmlns
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_1
3
-
4
3
  # An Area object is valid if
5
4
  # * it has an area description
6
5
  # * all Circle objects contained in circles are valid
@@ -8,7 +7,6 @@ module RCAP
8
7
  # * all Polygon objects contained in polygons are valid
9
8
  # * altitude has a value if ceiling is set
10
9
  class Area < RCAP::Base::Area
11
-
12
10
  # @return [String]
13
11
  def xmlns
14
12
  Alert::XMLNS
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_1
3
-
4
3
  # A Circle object is valid if
5
4
  # * it has a valid lattitude and longitude
6
5
  # * it has a radius with a value greater than zero
@@ -1,6 +1,5 @@
1
1
  module RCAP
2
2
  module CAP_1_1
3
-
4
3
  # In Info object is valid if
5
4
  # * it has an event
6
5
  # * it has an urgency with a valid value
@@ -10,40 +9,37 @@ module RCAP
10
9
  # * all Resource objects in the resources collection are valid
11
10
  # * all Area objects in the areas collection are valid
12
11
  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"
12
+ RESPONSE_TYPE_SHELTER = 'Shelter'
13
+ RESPONSE_TYPE_EVACUATE = 'Evacuate'
14
+ RESPONSE_TYPE_PREPARE = 'Prepare'
15
+ RESPONSE_TYPE_EXECUTE = 'Execute'
16
+ RESPONSE_TYPE_MONITOR = 'Monitor'
17
+ RESPONSE_TYPE_ASSESS = 'Assess'
18
+ RESPONSE_TYPE_NONE = 'None'
21
19
  # Valid values for response_type
22
- VALID_RESPONSE_TYPES = [ RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE,
23
- RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR,
24
- RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_NONE ]
25
-
20
+ VALID_RESPONSE_TYPES = [RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE,
21
+ RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR,
22
+ RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_NONE]
26
23
 
27
- CERTAINTY_OBSERVED = "Observed"
24
+ CERTAINTY_OBSERVED = 'Observed'
28
25
  # Valid valies for certainty
29
- VALID_CERTAINTIES = [ CERTAINTY_OBSERVED, CERTAINTY_LIKELY,
30
- CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN ]
26
+ VALID_CERTAINTIES = [CERTAINTY_OBSERVED, CERTAINTY_LIKELY,
27
+ CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN]
31
28
 
32
-
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(', ') }")
29
+ validates_length_of(:categories, minimum: 1)
30
+ validates_inclusion_of_members_of(:response_types, in: VALID_RESPONSE_TYPES, allow_blank: true)
31
+ validates_inclusion_of(:certainty, allow_nil: true, in: VALID_CERTAINTIES, message: "can only be assigned the following values: #{ VALID_CERTAINTIES.join(', ') }")
36
32
 
37
33
  # @return [Array<String>] Collection of textual response types; elements must be from {VALID_RESPONSE_TYPES}
38
- attr_reader( :response_types )
34
+ attr_reader(:response_types)
39
35
  # @return [Array<EventCode>] Collection of {EventCode} objects
40
- attr_reader( :event_codes )
36
+ attr_reader(:event_codes)
41
37
  # @return [Array<Parameter>] Collection of {Parameter} objects
42
- attr_reader( :parameters )
38
+ attr_reader(:parameters)
43
39
  # @return [Array<Resource> Collection of {Resource} objects
44
- attr_reader( :resources )
40
+ attr_reader(:resources)
45
41
  # @return [Array<Area>] Collection of {Area} objects
46
- attr_reader( :areas )
42
+ attr_reader(:areas)
47
43
 
48
44
  # @param [Hash] attributes
49
45
  # @option attributes [String] :language Defaults to {DEFAULT_LANGUAGE}
@@ -97,86 +93,82 @@ module RCAP
97
93
 
98
94
  # @return [REXML::Element]
99
95
  def to_xml_element
100
- xml_element = REXML::Element.new( XML_ELEMENT_NAME )
101
- xml_element.add_element( LANGUAGE_ELEMENT_NAME ).add_text( @language ) if @language
96
+ xml_element = REXML::Element.new(XML_ELEMENT_NAME)
97
+ xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language) if @language
102
98
  @categories.each do |category|
103
- xml_element.add_element( CATEGORY_ELEMENT_NAME ).add_text( category )
99
+ xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category)
104
100
  end
105
- xml_element.add_element( EVENT_ELEMENT_NAME ).add_text( @event )
101
+ xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event)
106
102
  @response_types.each do |response_type|
107
- xml_element.add_element( RESPONSE_TYPE_ELEMENT_NAME ).add_text( response_type )
103
+ xml_element.add_element(RESPONSE_TYPE_ELEMENT_NAME).add_text(response_type)
108
104
  end
109
- xml_element.add_element( URGENCY_ELEMENT_NAME ).add_text( @urgency )
110
- xml_element.add_element( SEVERITY_ELEMENT_NAME ).add_text( @severity )
111
- xml_element.add_element( CERTAINTY_ELEMENT_NAME ).add_text( @certainty )
112
- xml_element.add_element( AUDIENCE_ELEMENT_NAME ).add_text( @audience ) if @audience
105
+ xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency)
106
+ xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity)
107
+ xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty)
108
+ xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience) if @audience
113
109
  @event_codes.each do |event_code|
114
- xml_element.add_element( event_code.to_xml_element )
110
+ xml_element.add_element(event_code.to_xml_element)
115
111
  end
116
- xml_element.add_element( EFFECTIVE_ELEMENT_NAME ).add_text( @effective.to_s_for_cap ) if @effective
117
- xml_element.add_element( ONSET_ELEMENT_NAME ).add_text( @onset.to_s_for_cap ) if @onset
118
- xml_element.add_element( EXPIRES_ELEMENT_NAME ).add_text( @expires.to_s_for_cap ) if @expires
119
- xml_element.add_element( SENDER_NAME_ELEMENT_NAME ).add_text( @sender_name ) if @sender_name
120
- xml_element.add_element( HEADLINE_ELEMENT_NAME ).add_text( @headline ) if @headline
121
- xml_element.add_element( DESCRIPTION_ELEMENT_NAME ).add_text( @description ) if @description
122
- xml_element.add_element( INSTRUCTION_ELEMENT_NAME ).add_text( @instruction ) if @instruction
123
- xml_element.add_element( WEB_ELEMENT_NAME ).add_text( @web ) if @web
124
- xml_element.add_element( CONTACT_ELEMENT_NAME ).add_text( @contact ) if @contact
112
+ xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
113
+ xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
114
+ xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
115
+ xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name) if @sender_name
116
+ xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline) if @headline
117
+ xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description) if @description
118
+ xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction) if @instruction
119
+ xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web) if @web
120
+ xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact) if @contact
125
121
  @parameters.each do |parameter|
126
- xml_element.add_element( parameter.to_xml_element )
122
+ xml_element.add_element(parameter.to_xml_element)
127
123
  end
128
124
  @resources.each do |resource|
129
- xml_element.add_element( resource.to_xml_element )
125
+ xml_element.add_element(resource.to_xml_element)
130
126
  end
131
127
  @areas.each do |area|
132
- xml_element.add_element( area.to_xml_element )
128
+ xml_element.add_element(area.to_xml_element)
133
129
  end
134
130
  xml_element
135
131
  end
136
132
 
137
133
  # @return [String]
138
134
  def to_xml
139
- self.to_xml_element.to_s
135
+ to_xml_element.to_s
140
136
  end
141
137
 
142
138
  # @param [REXML::Element] info_xml_element
143
139
  # @return [Info]
144
- def self.from_xml_element( info_xml_element )
140
+ def self.from_xml_element(info_xml_element)
145
141
  super.tap do |info|
146
- RCAP.xpath_match( info_xml_element, RESPONSE_TYPE_XPATH, info.xmlns ).each do |element|
147
- info.response_types << RCAP.strip_if_given( element.text )
142
+ RCAP.xpath_match(info_xml_element, RESPONSE_TYPE_XPATH, info.xmlns).each do |element|
143
+ info.response_types << RCAP.strip_if_given(element.text)
148
144
  end
149
145
  end
150
146
  end
151
147
 
152
148
  # @return [String]
153
149
  def inspect
154
- info_inspect = "Language: #{ @language }\n"+
155
- "Categories: #{ @categories.to_s_for_cap }\n"+
156
- "Event: #{ @event }\n"+
157
- "Response Types: #{ @response_types.to_s_for_cap }\n"+
158
- "Urgency: #{ @urgency }\n"+
159
- "Severity: #{ @severity }\n"+
160
- "Certainty: #{ @certainty }\n"+
161
- "Audience: #{ @audience }\n"+
162
- "Event Codes: #{ @event_codes.inspect }\n"+
163
- "Effective: #{ @effective }\n"+
164
- "Onset: #{ @onset }\n"+
165
- "Expires: #{ @expires }\n"+
166
- "Sender Name: #{ @sender_name }\n"+
167
- "Headline: #{ @headline }\n"+
168
- "Description:\n"+
169
- @description.to_s.lines.map{ |line| " " + line }.join( "\n")+"\n"+
170
- "Instruction: #{ @instruction }\n"+
171
- "Web: #{ @web }\n"+
172
- "Contact: #{ @contact }\n"+
173
- "Parameters:\n"+
174
- @parameters.map{ |parameter| " " + parameter.inspect }.join( "\n" )+"\n"+
175
- "Resources:\n"+
176
- @resources.map{ |resource| " " + resource.inspect }.join( "\n" )+"\n"+
177
- "Area:\n"+
178
- @areas.map{ |area| " #{ area }" }.join( "\n" )+"\n"
179
- RCAP.format_lines_for_inspect( 'INFO', info_inspect )
150
+ info_inspect = "Language: #{ @language }\n"\
151
+ "Categories: #{ @categories.to_s_for_cap }\n"\
152
+ "Event: #{ @event }\n"\
153
+ "Response Types: #{ @response_types.to_s_for_cap }\n"\
154
+ "Urgency: #{ @urgency }\n"\
155
+ "Severity: #{ @severity }\n"\
156
+ "Certainty: #{ @certainty }\n"\
157
+ "Audience: #{ @audience }\n"\
158
+ "Event Codes: #{ @event_codes.inspect }\n"\
159
+ "Effective: #{ @effective }\n"\
160
+ "Onset: #{ @onset }\n"\
161
+ "Expires: #{ @expires }\n"\
162
+ "Sender Name: #{ @sender_name }\n"\
163
+ "Headline: #{ @headline }\n"\
164
+ "Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
165
+ "Instruction: #{ @instruction }\n"\
166
+ "Web: #{ @web }\n"\
167
+ "Contact: #{ @contact }\n"\
168
+ "Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
169
+ "Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
170
+ "Area:\n" + @areas.map { |area| " #{ area }" }.join("\n") + "\n"
171
+ RCAP.format_lines_for_inspect('INFO', info_inspect)
180
172
  end
181
173
 
182
174
  # Returns a string representation of the event of the form
@@ -187,47 +179,46 @@ module RCAP
187
179
  "#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
188
180
  end
189
181
 
190
-
191
182
  RESPONSE_TYPES_YAML = 'Response Types'
192
183
 
193
184
  # @return [Hash]
194
185
  def to_yaml_data
195
- parameter_to_hash = lambda{ |hash, parameter| hash.merge( parameter.name => parameter.value )}
186
+ parameter_to_hash = lambda { |hash, parameter| hash.merge(parameter.name => parameter.value) }
196
187
 
197
- RCAP.attribute_values_to_hash( [ LANGUAGE_YAML, @language ],
198
- [ CATEGORIES_YAML, @categories ],
199
- [ EVENT_YAML, @event ],
200
- [ RESPONSE_TYPES_YAML, @response_types ],
201
- [ URGENCY_YAML, @urgency ],
202
- [ SEVERITY_YAML, @severity ],
203
- [ CERTAINTY_YAML, @certainty ],
204
- [ AUDIENCE_YAML, @audience ],
205
- [ EFFECTIVE_YAML, @effective ],
206
- [ ONSET_YAML, @onset ],
207
- [ EXPIRES_YAML, @expires ],
208
- [ SENDER_NAME_YAML, @sender_name ],
209
- [ HEADLINE_YAML, @headline ],
210
- [ DESCRIPTION_YAML, @description ],
211
- [ INSTRUCTION_YAML, @instruction ],
212
- [ WEB_YAML, @web ],
213
- [ CONTACT_YAML, @contact ],
214
- [ EVENT_CODES_YAML, @event_codes.inject({}, &parameter_to_hash )],
215
- [ PARAMETERS_YAML, @parameters.inject({}, &parameter_to_hash )],
216
- [ RESOURCES_YAML, @resources.map( &:to_yaml_data )],
217
- [ AREAS_YAML, @areas.map( &:to_yaml_data )])
188
+ RCAP.attribute_values_to_hash([LANGUAGE_YAML, @language],
189
+ [CATEGORIES_YAML, @categories],
190
+ [EVENT_YAML, @event],
191
+ [RESPONSE_TYPES_YAML, @response_types],
192
+ [URGENCY_YAML, @urgency],
193
+ [SEVERITY_YAML, @severity],
194
+ [CERTAINTY_YAML, @certainty],
195
+ [AUDIENCE_YAML, @audience],
196
+ [EFFECTIVE_YAML, @effective],
197
+ [ONSET_YAML, @onset],
198
+ [EXPIRES_YAML, @expires],
199
+ [SENDER_NAME_YAML, @sender_name],
200
+ [HEADLINE_YAML, @headline],
201
+ [DESCRIPTION_YAML, @description],
202
+ [INSTRUCTION_YAML, @instruction],
203
+ [WEB_YAML, @web],
204
+ [CONTACT_YAML, @contact],
205
+ [EVENT_CODES_YAML, @event_codes.inject({}, &parameter_to_hash)],
206
+ [PARAMETERS_YAML, @parameters.inject({}, &parameter_to_hash)],
207
+ [RESOURCES_YAML, @resources.map(&:to_yaml_data)],
208
+ [AREAS_YAML, @areas.map(&:to_yaml_data)])
218
209
  end
219
210
 
220
211
  # @return [String]
221
- def to_yaml( options = {} )
222
- self.to_yaml_data.to_yaml( options )
212
+ def to_yaml(options = {})
213
+ to_yaml_data.to_yaml(options)
223
214
  end
224
215
 
225
216
  # @param [Hash] info_yaml_data
226
217
  # @return [Info]
227
- def self.from_yaml_data( info_yaml_data )
218
+ def self.from_yaml_data(info_yaml_data)
228
219
  super.tap do |info|
229
- Array( info_yaml_data [ RESPONSE_TYPES_YAML ] ).each do |response_type|
230
- info.response_types << RCAP.strip_if_given( response_type )
220
+ Array(info_yaml_data [RESPONSE_TYPES_YAML]).each do |response_type|
221
+ info.response_types << RCAP.strip_if_given(response_type)
231
222
  end
232
223
  end
233
224
  end
@@ -236,35 +227,35 @@ module RCAP
236
227
 
237
228
  # @return [Hash]
238
229
  def to_h
239
- RCAP.attribute_values_to_hash( [ LANGUAGE_KEY, @language ],
240
- [ CATEGORIES_KEY, @categories ],
241
- [ EVENT_KEY, @event ],
242
- [ RESPONSE_TYPES_KEY, @response_types ],
243
- [ URGENCY_KEY, @urgency ],
244
- [ SEVERITY_KEY, @severity ],
245
- [ CERTAINTY_KEY, @certainty ],
246
- [ AUDIENCE_KEY, @audience ],
247
- [ EFFECTIVE_KEY, RCAP.to_s_for_cap( @effective )],
248
- [ ONSET_KEY, RCAP.to_s_for_cap( @onset )],
249
- [ EXPIRES_KEY, RCAP.to_s_for_cap( @expires )],
250
- [ SENDER_NAME_KEY, @sender_name ],
251
- [ HEADLINE_KEY, @headline ],
252
- [ DESCRIPTION_KEY, @description ],
253
- [ INSTRUCTION_KEY, @instruction ],
254
- [ WEB_KEY, @web ],
255
- [ CONTACT_KEY, @contact ],
256
- [ RESOURCES_KEY, @resources.map{ |resource| resource.to_h } ],
257
- [ EVENT_CODES_KEY, @event_codes.map{ |event_code| event_code.to_h } ],
258
- [ PARAMETERS_KEY, @parameters.map{ |parameter| parameter.to_h } ],
259
- [ AREAS_KEY, @areas.map{ |area| area.to_h }])
230
+ RCAP.attribute_values_to_hash([LANGUAGE_KEY, @language],
231
+ [CATEGORIES_KEY, @categories],
232
+ [EVENT_KEY, @event],
233
+ [RESPONSE_TYPES_KEY, @response_types],
234
+ [URGENCY_KEY, @urgency],
235
+ [SEVERITY_KEY, @severity],
236
+ [CERTAINTY_KEY, @certainty],
237
+ [AUDIENCE_KEY, @audience],
238
+ [EFFECTIVE_KEY, RCAP.to_s_for_cap(@effective)],
239
+ [ONSET_KEY, RCAP.to_s_for_cap(@onset)],
240
+ [EXPIRES_KEY, RCAP.to_s_for_cap(@expires)],
241
+ [SENDER_NAME_KEY, @sender_name],
242
+ [HEADLINE_KEY, @headline],
243
+ [DESCRIPTION_KEY, @description],
244
+ [INSTRUCTION_KEY, @instruction],
245
+ [WEB_KEY, @web],
246
+ [CONTACT_KEY, @contact],
247
+ [RESOURCES_KEY, @resources.map { |resource| resource.to_h }],
248
+ [EVENT_CODES_KEY, @event_codes.map { |event_code| event_code.to_h }],
249
+ [PARAMETERS_KEY, @parameters.map { |parameter| parameter.to_h }],
250
+ [AREAS_KEY, @areas.map { |area| area.to_h }])
260
251
  end
261
252
 
262
253
  # @param [Hash] info_hash
263
254
  # @return [Info]
264
- def self.from_h( info_hash )
255
+ def self.from_h(info_hash)
265
256
  super.tap do |info|
266
- Array( info_hash[ RESPONSE_TYPES_KEY ]).each do |response_type|
267
- info.response_types << RCAP.strip_if_given( response_type )
257
+ Array(info_hash[RESPONSE_TYPES_KEY]).each do |response_type|
258
+ info.response_types << RCAP.strip_if_given(response_type)
268
259
  end
269
260
  end
270
261
  end