rcap 2.4.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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