rcap 1.3.1 → 2.0.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 (88) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/README.md +78 -151
  3. data/Rakefile +1 -1
  4. data/lib/rcap/alert.rb +2 -2
  5. data/lib/rcap/base/alert.rb +446 -0
  6. data/lib/rcap/base/area.rb +228 -0
  7. data/lib/rcap/base/circle.rb +121 -0
  8. data/lib/rcap/base/event_code.rb +6 -0
  9. data/lib/rcap/base/geocode.rb +6 -0
  10. data/lib/rcap/base/info.rb +498 -0
  11. data/lib/rcap/base/parameter.rb +88 -0
  12. data/lib/rcap/base/point.rb +87 -0
  13. data/lib/rcap/base/polygon.rb +120 -0
  14. data/lib/rcap/base/resource.rb +168 -0
  15. data/lib/rcap/cap_1_0/alert.rb +59 -342
  16. data/lib/rcap/cap_1_0/area.rb +13 -188
  17. data/lib/rcap/cap_1_0/circle.rb +2 -100
  18. data/lib/rcap/cap_1_0/event_code.rb +8 -3
  19. data/lib/rcap/cap_1_0/geocode.rb +8 -3
  20. data/lib/rcap/cap_1_0/info.rb +16 -468
  21. data/lib/rcap/cap_1_0/parameter.rb +9 -67
  22. data/lib/rcap/cap_1_0/point.rb +2 -61
  23. data/lib/rcap/cap_1_0/polygon.rb +5 -95
  24. data/lib/rcap/cap_1_0/resource.rb +4 -144
  25. data/lib/rcap/cap_1_1/alert.rb +7 -412
  26. data/lib/rcap/cap_1_1/area.rb +13 -188
  27. data/lib/rcap/cap_1_1/circle.rb +2 -100
  28. data/lib/rcap/cap_1_1/event_code.rb +8 -3
  29. data/lib/rcap/cap_1_1/geocode.rb +7 -3
  30. data/lib/rcap/cap_1_1/info.rb +127 -386
  31. data/lib/rcap/cap_1_1/parameter.rb +4 -76
  32. data/lib/rcap/cap_1_1/point.rb +2 -61
  33. data/lib/rcap/cap_1_1/polygon.rb +5 -95
  34. data/lib/rcap/cap_1_1/resource.rb +37 -143
  35. data/lib/rcap/cap_1_2/alert.rb +8 -413
  36. data/lib/rcap/cap_1_2/area.rb +13 -188
  37. data/lib/rcap/cap_1_2/circle.rb +2 -100
  38. data/lib/rcap/cap_1_2/event_code.rb +8 -3
  39. data/lib/rcap/cap_1_2/geocode.rb +8 -3
  40. data/lib/rcap/cap_1_2/info.rb +132 -419
  41. data/lib/rcap/cap_1_2/parameter.rb +4 -76
  42. data/lib/rcap/cap_1_2/point.rb +2 -61
  43. data/lib/rcap/cap_1_2/polygon.rb +5 -92
  44. data/lib/rcap/cap_1_2/resource.rb +31 -134
  45. data/lib/rcap/config.rb +3 -0
  46. data/lib/{extensions → rcap/extensions}/array.rb +1 -1
  47. data/lib/rcap/extensions/date.rb +11 -0
  48. data/lib/{extensions → rcap/extensions}/date_time.rb +2 -5
  49. data/lib/{extensions → rcap/extensions}/string.rb +1 -1
  50. data/lib/{extensions → rcap/extensions}/time.rb +2 -4
  51. data/lib/rcap/utilities.rb +11 -11
  52. data/lib/rcap/validations.rb +7 -2
  53. data/lib/rcap/version.rb +1 -1
  54. data/lib/rcap.rb +21 -4
  55. data/spec/alert_spec.rb +69 -37
  56. data/spec/cap_1_0/alert_spec.rb +46 -61
  57. data/spec/cap_1_0/area_spec.rb +77 -37
  58. data/spec/cap_1_0/circle_spec.rb +26 -6
  59. data/spec/cap_1_0/event_code_spec.rb +10 -3
  60. data/spec/cap_1_0/geocode_spec.rb +11 -4
  61. data/spec/cap_1_0/info_spec.rb +74 -77
  62. data/spec/cap_1_0/parameter_spec.rb +18 -5
  63. data/spec/cap_1_0/point_spec.rb +9 -2
  64. data/spec/cap_1_0/polygon_spec.rb +52 -9
  65. data/spec/cap_1_0/resource_spec.rb +28 -21
  66. data/spec/cap_1_1/alert_spec.rb +47 -60
  67. data/spec/cap_1_1/area_spec.rb +66 -43
  68. data/spec/cap_1_1/circle_spec.rb +29 -6
  69. data/spec/cap_1_1/event_code_spec.rb +11 -3
  70. data/spec/cap_1_1/geocode_spec.rb +11 -3
  71. data/spec/cap_1_1/info_spec.rb +262 -118
  72. data/spec/cap_1_1/parameter_spec.rb +12 -3
  73. data/spec/cap_1_1/point_spec.rb +8 -2
  74. data/spec/cap_1_1/polygon_spec.rb +57 -18
  75. data/spec/cap_1_1/resource_spec.rb +70 -20
  76. data/spec/cap_1_2/alert_spec.rb +97 -110
  77. data/spec/cap_1_2/area_spec.rb +59 -41
  78. data/spec/cap_1_2/circle_spec.rb +15 -8
  79. data/spec/cap_1_2/event_code_spec.rb +11 -3
  80. data/spec/cap_1_2/geocode_spec.rb +11 -3
  81. data/spec/cap_1_2/info_spec.rb +266 -119
  82. data/spec/cap_1_2/parameter_spec.rb +11 -3
  83. data/spec/cap_1_2/point_spec.rb +10 -3
  84. data/spec/cap_1_2/polygon_spec.rb +25 -10
  85. data/spec/cap_1_2/resource_spec.rb +33 -28
  86. data/spec/{utilities_spec.rb → extensions_spec.rb} +0 -0
  87. data/spec/validations_spec.rb +18 -2
  88. metadata +20 -46
@@ -1,5 +1,6 @@
1
1
  module RCAP
2
2
  module CAP_1_0
3
+
3
4
  # An Alert object is valid if
4
5
  # * it has an identifier
5
6
  # * it has a sender
@@ -8,148 +9,28 @@ module RCAP
8
9
  # * it has a valid messge type value
9
10
  # * it has a valid scope value
10
11
  # * all Info objects contained in infos are valid
11
- class Alert
12
- include Validation
12
+ class Alert < RCAP::Base::Alert
13
13
 
14
14
  XMLNS = "http://www.incident.com/cap/1.0"
15
15
  CAP_VERSION = "1.0"
16
16
 
17
- STATUS_ACTUAL = "Actual"
18
- STATUS_EXERCISE = "Exercise"
19
- STATUS_SYSTEM = "System"
20
- STATUS_TEST = "Test"
21
- # Valid values for status
22
- VALID_STATUSES = [ STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST ]
23
-
24
- MSG_TYPE_ALERT = "Alert"
25
- MSG_TYPE_UPDATE = "Update"
26
- MSG_TYPE_CANCEL = "Cancel"
27
- MSG_TYPE_ACK = "Ack"
28
- MSG_TYPE_ERROR = "Error"
29
- # Valid values for msg_type
30
- VALID_MSG_TYPES = [ MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR ]
31
-
32
- SCOPE_PUBLIC = "Public"
33
- SCOPE_RESTRICTED = "Restricted"
34
- SCOPE_PRIVATE = "Private"
35
- # Valid values for scope
36
- VALID_SCOPES = [ SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED ]
37
-
38
-
39
- # @return [String] If not set a UUID will be set by default
40
- attr_accessor( :identifier)
41
- # @return [String]
42
- attr_accessor( :sender )
43
- # @return [DateTime] If not set will value will be time of creation.
44
- attr_accessor( :sent )
45
- # @return [String] Can only be one of {VALID_STATUSES}
46
- attr_accessor( :status )
47
- # @return [String] Can only be one of {VALID_MSG_TYPES}
48
- attr_accessor( :msg_type )
49
17
  # @return [String]
50
18
  attr_accessor( :password )
51
- # @return [String] Can only be one of {VALID_SCOPES}
52
- attr_accessor( :scope )
53
- # @return [String]
54
- attr_accessor( :source )
55
- # @return [String ] Depends on scope being {SCOPE_RESTRICTED}
56
- attr_accessor( :restriction )
57
- # @return [String]
58
- attr_accessor( :note )
59
-
60
- # @return [Array<String>] Collection of address strings. Depends on scope being {SCOPE_PRIVATE}
61
- attr_reader( :addresses )
62
- # @return [Array<String>]
63
- attr_reader( :codes )
64
- # @return [Array<String>] See {#to_reference}
65
- attr_reader( :references)
66
- # @return [Array<String>] Collection of incident strings
67
- attr_reader( :incidents )
68
- # @return [Array<Info>]
69
- attr_reader( :infos )
70
-
71
- validates_presence_of( :identifier, :sender, :sent, :status, :msg_type, :scope )
72
-
73
- validates_inclusion_of( :status, :in => VALID_STATUSES )
74
- validates_inclusion_of( :msg_type, :in => VALID_MSG_TYPES )
75
- validates_inclusion_of( :scope, :in => VALID_SCOPES )
76
-
77
- validates_format_of( :identifier, :with => ALLOWED_CHARACTERS )
78
- validates_format_of( :sender , :with => ALLOWED_CHARACTERS )
79
-
80
- validates_dependency_of( :addresses, :on => :scope, :with_value => SCOPE_PRIVATE )
81
- validates_dependency_of( :restriction, :on => :scope, :with_value => SCOPE_RESTRICTED )
82
19
 
83
- validates_collection_of( :infos )
84
-
85
- # @example
86
- # Alert.new( sender: 'disaster_management@cape_town.municipal.za',
87
- # sent: Date.today,
88
- # status: Alert::STATUS_ACTUAL,
89
- # msg_type: Alert::MSG_TYPE_ALERT,
90
- # scope: Alert::SCOPE_PUBLIC )
91
- #
92
- # @param [Hash] attributes
93
- # @option attributes [String] :identifier Unique identifier - autogenerated if not given
94
- # @option attributes [String] :sender
95
- # @option attributes [DateTime] :sent
96
- # @option attributes [String] :status A member of {VALID_STATUSES}
97
- # @option attributes [String] :msg_type A member of {VALID_MSG_TYPES}
98
- # @option attributes [String] :password
99
- # @option attributes [String] :scope A member of {VALID_SCOPES}
100
- # @option attributes [String] :source
101
- # @option attributes [String] :restriction
102
- # @option attributes [Array<String>] :addresses
103
- # @option attributes [Array<String>] :codes
104
- # @option attributes [Array<String>] :references see {#to_reference}
105
- # @option attributes [Array<String>] :incidents
106
- # @option attributes [Array<Info>] :infos
107
- def initialize( attributes = {})
108
- @identifier = attributes[ :identifier ] || RCAP.generate_identifier
109
- @sender = attributes[ :sender ]
110
- @sent = attributes[ :sent ]
111
- @status = attributes[ :status ]
112
- @msg_type = attributes[ :msg_type ]
113
- @password = attributes[ :password ]
114
- @scope = attributes[ :scope ]
115
- @source = attributes[ :source ]
116
- @restriction = attributes[ :restriction ]
117
- @addresses = Array( attributes[ :addresses ])
118
- @codes = Array( attributes[ :codes ])
119
- @references = Array( attributes[ :references ])
120
- @incidents = Array( attributes[ :incidents ])
121
- @infos = Array( attributes[ :infos ])
20
+ # @return [String]
21
+ def xmlns
22
+ XMLNS
122
23
  end
123
24
 
124
- # Creates a new {Info} object and adds it to the {#infos array}.
125
- #
126
- # @see Info#initialize
127
- # @param [Hash] info_attributes Info attributes - see {Info#initialize}
128
- # @return [Info]
129
- def add_info( info_attributes = {})
130
- info = Info.new( info_attributes )
131
- @infos << info
132
- info
25
+ # @return [Class]
26
+ def info_class
27
+ Info
133
28
  end
134
29
 
135
- XML_ELEMENT_NAME = 'alert'
136
- IDENTIFIER_ELEMENT_NAME = 'identifier'
137
- SENDER_ELEMENT_NAME = 'sender'
138
- SENT_ELEMENT_NAME = 'sent'
139
- STATUS_ELEMENT_NAME = 'status'
140
- MSG_TYPE_ELEMENT_NAME = 'msgType'
141
- PASSWORD_ELEMENT_NAME = 'password'
142
- SOURCE_ELEMENT_NAME = 'source'
143
- SCOPE_ELEMENT_NAME = 'scope'
144
- RESTRICTION_ELEMENT_NAME = 'restriction'
145
- ADDRESSES_ELEMENT_NAME = 'addresses'
146
- CODE_ELEMENT_NAME = 'code'
147
- NOTE_ELEMENT_NAME = 'note'
148
- REFERENCES_ELEMENT_NAME = 'references'
149
- INCIDENTS_ELEMENT_NAME = 'incidents'
30
+ PASSWORD_ELEMENT_NAME = 'password'
150
31
 
151
32
  # @return [REXML::Element]
152
- def to_xml_element
33
+ def to_xml_element
153
34
  xml_element = REXML::Element.new( XML_ELEMENT_NAME )
154
35
  xml_element.add_namespace( XMLNS )
155
36
  xml_element.add_element( IDENTIFIER_ELEMENT_NAME ).add_text( @identifier ) if @identifier
@@ -180,38 +61,8 @@ module RCAP
180
61
  xml_element
181
62
  end
182
63
 
183
- # @return [REXML::Document]
184
- def to_xml_document
185
- xml_document = REXML::Document.new
186
- xml_document.add( REXML::XMLDecl.new )
187
- xml_document.add( to_xml_element )
188
- xml_document
189
- end
190
-
191
- # Returns a string containing the XML representation of the alert.
192
- #
193
- # @param [true,false] pretty_print Pretty print output
194
64
  # @return [String]
195
- def to_xml( pretty_print = false )
196
- if pretty_print
197
- xml_document = ""
198
- RCAP::XML_PRETTY_PRINTER.write( to_xml_document, xml_document )
199
- xml_document
200
- else
201
- to_xml_document.to_s
202
- end
203
- end
204
-
205
- # Returns a string representation of the alert suitable for usage as a reference in a CAP message of the form
206
- # sender,identifier,sent
207
- #
208
- # @return [String]
209
- def to_reference
210
- "#{ @sender },#{ @identifier },#{ @sent }"
211
- end
212
-
213
- # @return [String]
214
- def inspect
65
+ def inspect
215
66
  alert_inspect = [ "CAP Version: #{ CAP_VERSION }",
216
67
  "Identifier: #{ @identifier }",
217
68
  "Sender: #{ @sender }",
@@ -224,7 +75,7 @@ module RCAP
224
75
  "Restriction: #{ @restriction }",
225
76
  "Addresses: #{ @addresses.to_s_for_cap }",
226
77
  "Codes:",
227
- @codes.map{ |code| " " + code }.join("\n")+"",
78
+ @codes.map{ |code| " " + code }.join("\n"),
228
79
  "Note: #{ @note }",
229
80
  "References: #{ @references.join( ' ' )}",
230
81
  "Incidents: #{ @incidents.join( ' ')}",
@@ -233,173 +84,72 @@ module RCAP
233
84
  RCAP.format_lines_for_inspect( 'ALERT', alert_inspect )
234
85
  end
235
86
 
236
- # Returns a string representation of the alert of the form
237
- # sender/identifier/sent
238
- # See {#to_reference} for another string representation suitable as a CAP reference.
239
- #
240
- # @return [String]
241
- def to_s
242
- "#{ @sender }/#{ @identifier }/#{ @sent }"
243
- end
244
87
 
245
- XPATH = 'cap:alert'
246
- IDENTIFIER_XPATH = "cap:#{ IDENTIFIER_ELEMENT_NAME }"
247
- SENDER_XPATH = "cap:#{ SENDER_ELEMENT_NAME }"
248
- SENT_XPATH = "cap:#{ SENT_ELEMENT_NAME }"
249
- STATUS_XPATH = "cap:#{ STATUS_ELEMENT_NAME }"
250
- MSG_TYPE_XPATH = "cap:#{ MSG_TYPE_ELEMENT_NAME }"
251
- PASSWORD_XPATH = "cap:#{ PASSWORD_ELEMENT_NAME }"
252
- SOURCE_XPATH = "cap:#{ SOURCE_ELEMENT_NAME }"
253
- SCOPE_XPATH = "cap:#{ SCOPE_ELEMENT_NAME }"
254
- RESTRICTION_XPATH = "cap:#{ RESTRICTION_ELEMENT_NAME }"
255
- ADDRESSES_XPATH = "cap:#{ ADDRESSES_ELEMENT_NAME }"
256
- CODE_XPATH = "cap:#{ CODE_ELEMENT_NAME }"
257
- NOTE_XPATH = "cap:#{ NOTE_ELEMENT_NAME }"
258
- REFERENCES_XPATH = "cap:#{ REFERENCES_ELEMENT_NAME }"
259
- INCIDENTS_XPATH = "cap:#{ INCIDENTS_ELEMENT_NAME }"
88
+ PASSWORD_XPATH = "cap:#{ PASSWORD_ELEMENT_NAME }"
260
89
 
261
90
  # @param [REXML::Element] alert_xml_element
262
91
  # @return [RCAP::CAP_1_0::Alert]
263
- def self.from_xml_element( alert_xml_element )
264
- self.new( :identifier => RCAP.xpath_text( alert_xml_element, IDENTIFIER_XPATH, Alert::XMLNS ),
265
- :sender => RCAP.xpath_text( alert_xml_element, SENDER_XPATH, Alert::XMLNS ),
266
- :sent => (( sent = RCAP.xpath_first( alert_xml_element, SENT_XPATH, Alert::XMLNS )) ? DateTime.parse( sent.text ) : nil ),
267
- :status => RCAP.xpath_text( alert_xml_element, STATUS_XPATH, Alert::XMLNS ),
268
- :msg_type => RCAP.xpath_text( alert_xml_element, MSG_TYPE_XPATH, Alert::XMLNS ),
269
- :password => RCAP.xpath_text( alert_xml_element, PASSWORD_XPATH, Alert::XMLNS ),
270
- :source => RCAP.xpath_text( alert_xml_element, SOURCE_XPATH, Alert::XMLNS ),
271
- :scope => RCAP.xpath_text( alert_xml_element, SCOPE_XPATH, Alert::XMLNS ),
272
- :restriction => RCAP.xpath_text( alert_xml_element, RESTRICTION_XPATH, Alert::XMLNS ),
273
- :addresses => (( address = RCAP.xpath_text( alert_xml_element, ADDRESSES_XPATH, Alert::XMLNS )) ? address.unpack_cap_list : nil ),
274
- :codes => RCAP.xpath_match( alert_xml_element, CODE_XPATH, Alert::XMLNS ).map{ |element| element.text },
275
- :note => RCAP.xpath_text( alert_xml_element, NOTE_XPATH, Alert::XMLNS ),
276
- :references => (( references = RCAP.xpath_text( alert_xml_element, REFERENCES_XPATH, Alert::XMLNS )) ? references.split( ' ' ) : nil ),
277
- :incidents => (( incidents = RCAP.xpath_text( alert_xml_element, INCIDENTS_XPATH, Alert::XMLNS )) ? incidents.split( ' ' ) : nil ),
278
- :infos => RCAP.xpath_match( alert_xml_element, Info::XPATH, Alert::XMLNS ).map{ |element| Info.from_xml_element( element )})
279
- end
280
-
281
- # @param [REXML::Document] xml_document
282
- # @return [RCAP::CAP_1_0::Alert]
283
- def self.from_xml_document( xml_document )
284
- self.from_xml_element( xml_document.root )
92
+ def self.from_xml_element( alert_xml_element )
93
+ super.tap do |alert|
94
+ alert.password = RCAP.xpath_text( alert_xml_element, PASSWORD_XPATH, Alert::XMLNS )
95
+ end
285
96
  end
286
97
 
287
- # Initialise an Alert object from an XML string. Any object that is a subclass of IO (e.g. File) can be passed in.
288
- #
289
- # @param [String] xml
290
- # @return [RCAP::CAP_1_0::Alert]
291
- def self.from_xml( xml )
292
- self.from_xml_document( REXML::Document.new( xml ))
293
- end
294
98
 
295
- CAP_VERSION_YAML = "CAP Version"
296
- IDENTIFIER_YAML = "Identifier"
297
- SENDER_YAML = "Sender"
298
- SENT_YAML = "Sent"
299
- STATUS_YAML = "Status"
300
- MSG_TYPE_YAML = "Message Type"
301
- PASSWORD_YAML = "Password"
302
- SOURCE_YAML = "Source"
303
- SCOPE_YAML = "Scope"
304
- RESTRICTION_YAML = "Restriction"
305
- ADDRESSES_YAML = "Addresses"
306
- CODES_YAML = "Codes"
307
- NOTE_YAML = "Note"
308
- REFERENCES_YAML = "References"
309
- INCIDENTS_YAML = "Incidents"
310
- INFOS_YAML = "Information"
99
+ PASSWORD_YAML = "Password"
311
100
 
312
101
  # Returns a string containing the YAML representation of the alert.
313
102
  #
314
103
  # @return [String]
315
104
  def to_yaml( options = {} )
316
- RCAP.attribute_values_to_hash(
317
- [ CAP_VERSION_YAML, CAP_VERSION ],
318
- [ IDENTIFIER_YAML, @identifier ],
319
- [ SENDER_YAML, @sender ],
320
- [ SENT_YAML, @sent ],
321
- [ STATUS_YAML, @status ],
322
- [ MSG_TYPE_YAML, @msg_type ],
323
- [ PASSWORD_YAML, @password ],
324
- [ SOURCE_YAML, @source ],
325
- [ SCOPE_YAML, @scope ],
326
- [ RESTRICTION_YAML, @restriction ],
327
- [ ADDRESSES_YAML, @addresses ],
328
- [ CODES_YAML, @codes ],
329
- [ NOTE_YAML, @note ],
330
- [ REFERENCES_YAML, @references ],
331
- [ INCIDENTS_YAML, @incidents ],
332
- [ INFOS_YAML, @infos ]
333
- ).to_yaml( options )
334
- end
335
-
336
- # Initialise an Alert object from a YAML string. Any object that is a subclass of IO (e.g. File) can be passed in.
337
- #
338
- # @param [String] yaml
339
- # @return [RCAP::CAP_1_0::Alert]
340
- def self.from_yaml( yaml )
341
- self.from_yaml_data( YAML.load( yaml ))
342
- end
343
-
344
- # @param [Hash] yaml_data
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 ]).to_yaml( options )
121
+ end
122
+
123
+ # @param [Hash] alert_yaml_data
345
124
  # @return [RCAP::CAP_1_0::Alert]
346
- def self.from_yaml_data( alert_yaml_data )
347
- Alert.new(
348
- :identifier => alert_yaml_data[ IDENTIFIER_YAML ],
349
- :sender => alert_yaml_data[ SENDER_YAML ],
350
- :sent => ( sent = alert_yaml_data[ SENT_YAML ]).blank? ? nil : DateTime.parse( sent.to_s ),
351
- :status => alert_yaml_data[ STATUS_YAML ],
352
- :msg_type => alert_yaml_data[ MSG_TYPE_YAML ],
353
- :password => alert_yaml_data[ PASSWORD_YAML ],
354
- :source => alert_yaml_data[ SOURCE_YAML ],
355
- :scope => alert_yaml_data[ SCOPE_YAML ],
356
- :restriction => alert_yaml_data[ RESTRICTION_YAML ],
357
- :addresses => alert_yaml_data[ ADDRESSES_YAML ],
358
- :codes => alert_yaml_data[ CODES_YAML ],
359
- :note => alert_yaml_data[ NOTE_YAML ],
360
- :references => alert_yaml_data[ REFERENCES_YAML ],
361
- :incidents => alert_yaml_data[ INCIDENTS_YAML ],
362
- :infos => Array( alert_yaml_data[ INFOS_YAML ]).map{ |info_yaml_data| Info.from_yaml_data( info_yaml_data )}
363
- )
125
+ def self.from_yaml_data( alert_yaml_data )
126
+ super.tap do |alert|
127
+ alert.password = alert_yaml_data[ PASSWORD_YAML ]
128
+ end
364
129
  end
365
130
 
366
- CAP_VERSION_KEY = 'cap_version'
367
- IDENTIFIER_KEY = 'identifier'
368
- SENDER_KEY = 'sender'
369
- SENT_KEY = 'sent'
370
- STATUS_KEY = 'status'
371
- MSG_TYPE_KEY = 'msg_type'
372
- PASSWORD_KEY = 'password'
373
- SOURCE_KEY = 'source'
374
- SCOPE_KEY = 'scope'
375
- RESTRICTION_KEY = 'restriction'
376
- ADDRESSES_KEY = 'addresses'
377
- CODES_KEY = 'codes'
378
- NOTE_KEY = 'note'
379
- REFERENCES_KEY = 'references'
380
- INCIDENTS_KEY = 'incidents'
381
- INFOS_KEY = 'infos'
131
+ PASSWORD_KEY = 'password'
382
132
 
383
133
  # Returns a Hash representation of an Alert object
384
134
  #
385
135
  # @return [Hash]
386
136
  def to_h
387
137
  RCAP.attribute_values_to_hash( [ CAP_VERSION_KEY, CAP_VERSION ],
388
- [ IDENTIFIER_KEY, @identifier ],
389
- [ SENDER_KEY, @sender ],
390
- [ SENT_KEY, RCAP.to_s_for_cap( @sent )],
391
- [ STATUS_KEY, @status ],
392
- [ MSG_TYPE_KEY, @msg_type ],
393
- [ PASSWORD_KEY, @password ],
394
- [ SOURCE_KEY, @source ],
395
- [ SCOPE_KEY, @scope ],
396
- [ RESTRICTION_KEY, @restriction ],
397
- [ ADDRESSES_KEY, @addresses ],
398
- [ CODES_KEY, @codes ],
399
- [ NOTE_KEY, @note ],
400
- [ REFERENCES_KEY, @references ],
401
- [ INCIDENTS_KEY, @incidents ],
402
- [ INFOS_KEY, @infos.map{ |info| info.to_h }])
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 }])
403
153
  end
404
154
 
405
155
  # Initialises an Alert object from a Hash produced by Alert#to_h
@@ -407,43 +157,10 @@ module RCAP
407
157
  # @param [Hash] alert_hash
408
158
  # @return [RCAP::CAP_1_0::Alert]
409
159
  def self.from_h( alert_hash )
410
- self.new(
411
- :identifier => alert_hash[ IDENTIFIER_KEY ],
412
- :sender => alert_hash[ SENDER_KEY ],
413
- :sent => RCAP.parse_datetime( alert_hash[ SENT_KEY ]),
414
- :status => alert_hash[ STATUS_KEY ],
415
- :msg_type => alert_hash[ MSG_TYPE_KEY ],
416
- :password => alert_hash[ PASSWORD_KEY ],
417
- :source => alert_hash[ SOURCE_KEY ],
418
- :scope => alert_hash[ SCOPE_KEY ],
419
- :restriction => alert_hash[ RESTRICTION_KEY ],
420
- :addresses => alert_hash[ ADDRESSES_KEY ],
421
- :codes => alert_hash[ CODES_KEY ],
422
- :note => alert_hash[ NOTE_KEY ],
423
- :references => alert_hash[ REFERENCES_KEY ],
424
- :incidents => alert_hash[ INCIDENTS_KEY ],
425
- :infos => Array( alert_hash[ INFOS_KEY ]).map{ |info_hash| Info.from_h( info_hash )})
426
- end
427
-
428
- # Returns a JSON string representation of an Alert object
429
- #
430
- # @param [true,false] pretty_print
431
- # @return [String]
432
- def to_json( pretty_print = false )
433
- if pretty_print
434
- JSON.pretty_generate( self.to_h )
435
- else
436
- self.to_h.to_json
160
+ super.tap do |alert|
161
+ alert.password = alert_hash[ PASSWORD_KEY ]
437
162
  end
438
163
  end
439
-
440
- # Initialises an Alert object from a JSON string produced by Alert#to_json
441
- #
442
- # @param [String] json_string
443
- # @return [RCAP::CAP_1_0::Alert]
444
- def self.from_json( json_string )
445
- self.from_h( JSON.parse( json_string ))
446
- end
447
164
  end
448
165
  end
449
166
  end