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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 7884d08e11ec38241caeca586cff0238fb81bd54
4
- data.tar.gz: b2ab2aa464a5d69917b75bf7f3550a2c0d795f0a
2
+ SHA256:
3
+ metadata.gz: f9d35572f21978f5fff7370828a4c146daf2c2abe960e1c508bcbee6f5713319
4
+ data.tar.gz: b998e0210707386d1d0de2d1157e7296900be5b79c1191e02741524f3ac3fe20
5
5
  SHA512:
6
- metadata.gz: 8dc12b2de19db14730392366b7e6b6e27a22158e939d28582aef7e7ac81691ae8bea37b83ba79aa8a0f6360f603c4d10a6101c8b8481a894b25f76e8fd15bf4c
7
- data.tar.gz: 2027150b43a529be6ab6c778bf39b8d4ff4939894fa443cfa428c946a2749b247d27897c0ebdea04997ea3bf27b8303666b66e13ba1cd728fa1ccdce3d37202d
6
+ metadata.gz: 33705a6c22c94be4b61d469f1f5a7c727cd92e968ef639dd947d51a65ba012d70eda684af771960c10816dace76804fb341696709fb039a1b16c1b71be98c09c
7
+ data.tar.gz: a332b8e3b2f155545afbd53bf319d862f1b2e51c692bebf728646b759d5fc97ef2f0b293df81e65987ae0a999662a436a4298172b4a368d743aab0ca7a956911
@@ -0,0 +1 @@
1
+ 2.5.0
@@ -1,6 +1,24 @@
1
1
  Change Log
2
2
  ==========
3
3
 
4
+ ## 2.7.0 - 22 March 2017
5
+
6
+ * Coordinates of a polygon should be an array of coordinate arrays rather than a single coordinate array. (Seth Deckard)
7
+ * Moved Fixnum extenions to Integer
8
+ * Ruby 2.4.0 tested
9
+
10
+ ## 2.6.0 - 30 October 2016
11
+
12
+ * Adds GeoJSON export to Polygon and Circle
13
+
14
+ ## 2.5.1 - 3 November 2014
15
+
16
+ * Allow the polygons to be empty.
17
+
18
+ ## 2.5.0 - 3 November 2014
19
+
20
+ * Allow the values of parameters, area codes and event codes to be empty.
21
+
4
22
  ## 2.4.1 - 7 August 2013
5
23
 
6
24
  * Further integration of validations.
data/README.md CHANGED
@@ -156,6 +156,7 @@ Authors
156
156
 
157
157
  * Earle Clubb - http://github.com/eclubb
158
158
  * David van Geest - https://github.com/DWvanGeest
159
+ * Seth Deckard - https://github.com/sethdeckard
159
160
 
160
161
  Change Log
161
162
  ----------
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # System and require libs
2
4
  require 'date'
3
5
  require 'uuidtools'
@@ -11,7 +13,7 @@ require 'digest/sha1'
11
13
 
12
14
  # Extensions
13
15
  require 'rcap/extensions/nil_class'
14
- require 'rcap/extensions/fixnum'
16
+ require 'rcap/extensions/integer'
15
17
  require 'rcap/extensions/float'
16
18
  require 'rcap/extensions/array'
17
19
  require 'rcap/extensions/string'
@@ -1,11 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Alert
5
+ XMLNS_KEY = 'xmlns'
6
+ YAML_CAP_VERSION_KEY = 'CAP Version'
7
+ JSON_CAP_VERSION_KEY = 'cap_version'
3
8
 
4
- XMLNS_KEY = "xmlns"
5
- YAML_CAP_VERSION_KEY = "CAP Version"
6
- JSON_CAP_VERSION_KEY = "cap_version"
7
-
8
- CAP_NAMESPACES = [ RCAP::CAP_1_0::Alert::XMLNS, RCAP::CAP_1_1::Alert::XMLNS, RCAP::CAP_1_2::Alert::XMLNS ]
9
+ CAP_NAMESPACES = [RCAP::CAP_1_0::Alert::XMLNS, RCAP::CAP_1_1::Alert::XMLNS, RCAP::CAP_1_2::Alert::XMLNS].freeze
9
10
 
10
11
  # Initialise a RCAP Alert from a XML document.
11
12
  #
@@ -14,19 +15,19 @@ module RCAP
14
15
  # the namespace of the document is inspected and a CAP_1_0::Alert, CAP_1_1::Alert
15
16
  # or CAP_1_2::Alert is instantiated accordingly. If no namespace can be detected
16
17
  # a CAP 1.2 message will be assumed.
17
- # @return [ RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
18
- def self.from_xml( xml, namespace_key = nil )
19
- xml_document = REXML::Document.new( xml )
18
+ # @return [RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
19
+ def self.from_xml(xml, namespace_key = nil)
20
+ xml_document = REXML::Document.new(xml)
20
21
  document_namespaces = xml_document.root.namespaces.invert
21
- namespace = namespace_key || CAP_NAMESPACES.find{ |namepsace| document_namespaces[ namepsace ]}
22
+ namespace = namespace_key || CAP_NAMESPACES.find { |namepsace| document_namespaces[namepsace] }
22
23
 
23
24
  case namespace
24
25
  when CAP_1_0::Alert::XMLNS
25
- CAP_1_0::Alert.from_xml_document( xml_document )
26
+ CAP_1_0::Alert.from_xml_document(xml_document)
26
27
  when CAP_1_1::Alert::XMLNS
27
- CAP_1_1::Alert.from_xml_document( xml_document )
28
+ CAP_1_1::Alert.from_xml_document(xml_document)
28
29
  else
29
- CAP_1_2::Alert.from_xml_document( xml_document )
30
+ CAP_1_2::Alert.from_xml_document(xml_document)
30
31
  end
31
32
  end
32
33
 
@@ -35,17 +36,17 @@ module RCAP
35
36
  # CAP 1.0, 1.1 or 1.2 Alert is instantiated accordingly.
36
37
  #
37
38
  # @param [IO, String] yaml CAP Alert in YAML format. Can be a String or any IO object.
38
- # @return [ RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
39
- def self.from_yaml( yaml )
40
- yaml_data = YAML.load( yaml )
39
+ # @return [RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
40
+ def self.from_yaml(yaml)
41
+ yaml_data = YAML.safe_load(yaml, [Time, DateTime])
41
42
 
42
- case yaml_data[ YAML_CAP_VERSION_KEY ]
43
+ case yaml_data[YAML_CAP_VERSION_KEY]
43
44
  when CAP_1_0::Alert::CAP_VERSION
44
- CAP_1_0::Alert.from_yaml_data( yaml_data )
45
+ CAP_1_0::Alert.from_yaml_data(yaml_data)
45
46
  when CAP_1_1::Alert::CAP_VERSION
46
- CAP_1_1::Alert.from_yaml_data( yaml_data )
47
+ CAP_1_1::Alert.from_yaml_data(yaml_data)
47
48
  else
48
- CAP_1_2::Alert.from_yaml_data( yaml_data )
49
+ CAP_1_2::Alert.from_yaml_data(yaml_data)
49
50
  end
50
51
  end
51
52
 
@@ -54,10 +55,10 @@ module RCAP
54
55
  # CAP 1.0, 1.1 or 1.2 Alert is instantiated accordingly.
55
56
  #
56
57
  # @param [#to_s] json Alert in JSON format
57
- # @return [ RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
58
- def self.from_json( json )
59
- json_hash = JSON.parse( json.to_s )
60
- self.from_h( json_hash )
58
+ # @return [RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
59
+ def self.from_json(json)
60
+ json_hash = JSON.parse(json.to_s)
61
+ from_h(json_hash)
61
62
  end
62
63
 
63
64
  # Initialise a RCAP Alert from a Ruby hash produced by
@@ -65,15 +66,15 @@ module RCAP
65
66
  # CAP 1.0, 1.1 or 1.2 Alert is instantiated accordingly.
66
67
  #
67
68
  # @param [Hash] hash Alert as a Ruby hash.
68
- # @return [ RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
69
- def self.from_h( hash )
70
- case hash[ JSON_CAP_VERSION_KEY ]
69
+ # @return [RCAP::CAP_1_0::Alert, RCAP::CAP_1_1::Alert, RCAP::CAP_1_2::Alert ]
70
+ def self.from_h(hash)
71
+ case hash[JSON_CAP_VERSION_KEY]
71
72
  when CAP_1_0::Alert::CAP_VERSION
72
- CAP_1_0::Alert.from_h( hash )
73
+ CAP_1_0::Alert.from_h(hash)
73
74
  when CAP_1_1::Alert::CAP_VERSION
74
- CAP_1_1::Alert.from_h( hash )
75
+ CAP_1_1::Alert.from_h(hash)
75
76
  else
76
- CAP_1_2::Alert.from_h( hash )
77
+ CAP_1_2::Alert.from_h(hash)
77
78
  end
78
79
  end
79
80
  end
@@ -1,73 +1,75 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module Base
3
5
  class Alert
4
6
  include Validation
5
7
 
6
- STATUS_ACTUAL = "Actual"
7
- STATUS_EXERCISE = "Exercise"
8
- STATUS_SYSTEM = "System"
9
- STATUS_TEST = "Test"
8
+ STATUS_ACTUAL = 'Actual'
9
+ STATUS_EXERCISE = 'Exercise'
10
+ STATUS_SYSTEM = 'System'
11
+ STATUS_TEST = 'Test'
10
12
  # Valid values for status
11
- VALID_STATUSES = [ STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST ]
13
+ VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST].freeze
12
14
 
13
- MSG_TYPE_ALERT = "Alert"
14
- MSG_TYPE_UPDATE = "Update"
15
- MSG_TYPE_CANCEL = "Cancel"
16
- MSG_TYPE_ACK = "Ack"
17
- MSG_TYPE_ERROR = "Error"
15
+ MSG_TYPE_ALERT = 'Alert'
16
+ MSG_TYPE_UPDATE = 'Update'
17
+ MSG_TYPE_CANCEL = 'Cancel'
18
+ MSG_TYPE_ACK = 'Ack'
19
+ MSG_TYPE_ERROR = 'Error'
18
20
  # Valid values for msg_type
19
- VALID_MSG_TYPES = [ MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR ]
21
+ VALID_MSG_TYPES = [MSG_TYPE_ALERT, MSG_TYPE_UPDATE, MSG_TYPE_CANCEL, MSG_TYPE_ACK, MSG_TYPE_ERROR].freeze
20
22
 
21
- SCOPE_PUBLIC = "Public"
22
- SCOPE_RESTRICTED = "Restricted"
23
- SCOPE_PRIVATE = "Private"
23
+ SCOPE_PUBLIC = 'Public'
24
+ SCOPE_RESTRICTED = 'Restricted'
25
+ SCOPE_PRIVATE = 'Private'
24
26
  # Valid values for scope
25
- VALID_SCOPES = [ SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED ]
27
+ VALID_SCOPES = [SCOPE_PUBLIC, SCOPE_PRIVATE, SCOPE_RESTRICTED].freeze
26
28
 
27
29
  # @return [String] If not set a UUID will be set by default on object initialisation
28
- attr_accessor( :identifier)
30
+ attr_accessor(:identifier)
29
31
  # @return [String]
30
- attr_accessor( :sender )
32
+ attr_accessor(:sender)
31
33
  # @return [DateTime] If not set will be time of creation.
32
- attr_accessor( :sent )
34
+ attr_accessor(:sent)
33
35
  # @return [String] Can only be one of {VALID_STATUSES}
34
- attr_accessor( :status )
36
+ attr_accessor(:status)
35
37
  # @return [String] Can only be one of {VALID_MSG_TYPES}
36
- attr_accessor( :msg_type )
38
+ attr_accessor(:msg_type)
37
39
  # @return [String] Can only be one of {VALID_SCOPES}
38
- attr_accessor( :scope )
40
+ attr_accessor(:scope)
39
41
  # @return [String]
40
- attr_accessor( :source )
42
+ attr_accessor(:source)
41
43
  # @return [String ] Required if scope is {SCOPE_RESTRICTED}
42
- attr_accessor( :restriction )
44
+ attr_accessor(:restriction)
43
45
  # @return [String]
44
- attr_accessor( :note )
46
+ attr_accessor(:note)
45
47
 
46
48
  # @return [Array<String>] Collection of address strings. Depends on scope being {SCOPE_PRIVATE}
47
- attr_reader( :addresses )
49
+ attr_reader(:addresses)
48
50
  # @return [Array<String>]
49
- attr_reader( :codes )
51
+ attr_reader(:codes)
50
52
  # @return [Array<String>] Collection of references to previous alerts
51
53
  # @see #to_reference
52
- attr_reader( :references)
54
+ attr_reader(:references)
53
55
  # @return [Array<String>] Collection of incident strings
54
- attr_reader( :incidents )
56
+ attr_reader(:incidents)
55
57
  # @return [Array<Info>]
56
- attr_reader( :infos )
58
+ attr_reader(:infos)
57
59
 
58
- validates_presence_of( :identifier, :sender, :sent, :status, :msg_type, :scope )
60
+ validates_presence_of(:identifier, :sender, :sent, :status, :msg_type, :scope)
59
61
 
60
- validates_inclusion_of( :status, :in => VALID_STATUSES )
61
- validates_inclusion_of( :msg_type, :in => VALID_MSG_TYPES )
62
- validates_inclusion_of( :scope, :in => VALID_SCOPES )
62
+ validates_inclusion_of(:status, in: VALID_STATUSES)
63
+ validates_inclusion_of(:msg_type, in: VALID_MSG_TYPES)
64
+ validates_inclusion_of(:scope, in: VALID_SCOPES)
63
65
 
64
- validates_format_of( :identifier, :with => ALLOWED_CHARACTERS )
65
- validates_format_of( :sender , :with => ALLOWED_CHARACTERS )
66
+ validates_format_of(:identifier, with: ALLOWED_CHARACTERS)
67
+ validates_format_of(:sender, with: ALLOWED_CHARACTERS)
66
68
 
67
- validates_conditional_presence_of( :addresses, :when => :scope, :is => SCOPE_PRIVATE )
68
- validates_conditional_presence_of( :restriction, :when => :scope, :is => SCOPE_RESTRICTED )
69
+ validates_conditional_presence_of(:addresses, when: :scope, is: SCOPE_PRIVATE)
70
+ validates_conditional_presence_of(:restriction, when: :scope, is: SCOPE_RESTRICTED)
69
71
 
70
- validates_collection_of( :infos )
72
+ validates_collection_of(:infos)
71
73
 
72
74
  # Initialises a new Alert object. Yields the initialised alert to a block.
73
75
  #
@@ -87,7 +89,7 @@ module RCAP
87
89
  @references = []
88
90
  @incidents = []
89
91
  @infos = []
90
- yield( self ) if block_given?
92
+ yield(self) if block_given?
91
93
  end
92
94
 
93
95
  # Creates a new {Info} object and adds it to the {#infos} array.
@@ -96,8 +98,8 @@ module RCAP
96
98
  # @yield [Info] The newly initialised Info object.
97
99
  # @return [Info] The initialised Info object after being yielded to the block
98
100
  def add_info
99
- self.info_class.new.tap do |info|
100
- yield( info ) if block_given?
101
+ info_class.new.tap do |info|
102
+ yield(info) if block_given?
101
103
  @infos << info
102
104
  end
103
105
  end
@@ -119,31 +121,31 @@ module RCAP
119
121
 
120
122
  # @return [REXML::Element]
121
123
  def to_xml_element
122
- xml_element = REXML::Element.new( XML_ELEMENT_NAME )
123
- xml_element.add_namespace( self.class::XMLNS )
124
- xml_element.add_element( IDENTIFIER_ELEMENT_NAME ).add_text( @identifier ) if @identifier
125
- xml_element.add_element( SENDER_ELEMENT_NAME ).add_text( @sender ) if @sender
126
- xml_element.add_element( SENT_ELEMENT_NAME ).add_text( @sent.to_s_for_cap ) if @sent
127
- xml_element.add_element( STATUS_ELEMENT_NAME ).add_text( @status ) if @status
128
- xml_element.add_element( MSG_TYPE_ELEMENT_NAME ).add_text( @msg_type ) if @msg_type
129
- xml_element.add_element( SOURCE_ELEMENT_NAME ).add_text( @source ) if @source
130
- xml_element.add_element( SCOPE_ELEMENT_NAME ).add_text( @scope ) if @scope
131
- xml_element.add_element( RESTRICTION_ELEMENT_NAME ).add_text( @restriction ) if @restriction
124
+ xml_element = REXML::Element.new(XML_ELEMENT_NAME)
125
+ xml_element.add_namespace(self.class::XMLNS)
126
+ xml_element.add_element(IDENTIFIER_ELEMENT_NAME).add_text(@identifier) if @identifier
127
+ xml_element.add_element(SENDER_ELEMENT_NAME).add_text(@sender) if @sender
128
+ xml_element.add_element(SENT_ELEMENT_NAME).add_text(@sent.to_s_for_cap) if @sent
129
+ xml_element.add_element(STATUS_ELEMENT_NAME).add_text(@status) if @status
130
+ xml_element.add_element(MSG_TYPE_ELEMENT_NAME).add_text(@msg_type) if @msg_type
131
+ xml_element.add_element(SOURCE_ELEMENT_NAME).add_text(@source) if @source
132
+ xml_element.add_element(SCOPE_ELEMENT_NAME).add_text(@scope) if @scope
133
+ xml_element.add_element(RESTRICTION_ELEMENT_NAME).add_text(@restriction) if @restriction
132
134
  if @addresses.any?
133
- xml_element.add_element( ADDRESSES_ELEMENT_NAME ).add_text( @addresses.to_s_for_cap )
135
+ xml_element.add_element(ADDRESSES_ELEMENT_NAME).add_text(@addresses.to_s_for_cap)
134
136
  end
135
137
  @codes.each do |code|
136
- xml_element.add_element( CODE_ELEMENT_NAME ).add_text( code )
138
+ xml_element.add_element(CODE_ELEMENT_NAME).add_text(code)
137
139
  end
138
- xml_element.add_element( NOTE_ELEMENT_NAME ).add_text( @note ) if @note
140
+ xml_element.add_element(NOTE_ELEMENT_NAME).add_text(@note) if @note
139
141
  if @references.any?
140
- xml_element.add_element( REFERENCES_ELEMENT_NAME ).add_text( @references.join( ' ' ))
142
+ xml_element.add_element(REFERENCES_ELEMENT_NAME).add_text(@references.join(' '))
141
143
  end
142
144
  if @incidents.any?
143
- xml_element.add_element( INCIDENTS_ELEMENT_NAME ).add_text( @incidents.join( ' ' ))
145
+ xml_element.add_element(INCIDENTS_ELEMENT_NAME).add_text(@incidents.join(' '))
144
146
  end
145
147
  @infos.each do |info|
146
- xml_element.add_element( info.to_xml_element )
148
+ xml_element.add_element(info.to_xml_element)
147
149
  end
148
150
  xml_element
149
151
  end
@@ -151,8 +153,8 @@ module RCAP
151
153
  # @return [REXML::Document]
152
154
  def to_xml_document
153
155
  xml_document = REXML::Document.new
154
- xml_document.add( REXML::XMLDecl.new )
155
- xml_document.add( self.to_xml_element )
156
+ xml_document.add(REXML::XMLDecl.new)
157
+ xml_document.add(to_xml_element)
156
158
  xml_document
157
159
  end
158
160
 
@@ -160,13 +162,13 @@ module RCAP
160
162
  #
161
163
  # @param [true,false] pretty_print Pretty print output
162
164
  # @return [String]
163
- def to_xml( pretty_print = false )
165
+ def to_xml(pretty_print = false)
164
166
  if pretty_print
165
- xml_document = ""
166
- RCAP::XML_PRETTY_PRINTER.write( self.to_xml_document, xml_document )
167
+ xml_document = +''
168
+ RCAP::XML_PRETTY_PRINTER.write(to_xml_document, xml_document)
167
169
  xml_document
168
170
  else
169
- self.to_xml_document.to_s
171
+ to_xml_document.to_s
170
172
  end
171
173
  end
172
174
 
@@ -175,29 +177,30 @@ module RCAP
175
177
  #
176
178
  # @return [String]
177
179
  def to_reference
178
- "#{ @sender },#{ @identifier },#{ RCAP.to_s_for_cap( @sent )}"
180
+ "#{@sender},#{@identifier},#{RCAP.to_s_for_cap(@sent)}"
179
181
  end
180
182
 
181
183
  # @return [String]
182
184
  def inspect
183
- alert_inspect = [ "CAP Version: #{ self.class::CAP_VERSION }",
184
- "Identifier: #{ @identifier }",
185
- "Sender: #{ @sender }",
186
- "Sent: #{ @sent }",
187
- "Status: #{ @status }",
188
- "Message Type: #{ @msg_type }",
189
- "Source: #{ @source }",
190
- "Scope: #{ @scope }",
191
- "Restriction: #{ @restriction }",
192
- "Addresses: #{ @addresses.to_s_for_cap }",
193
- "Codes:",
194
- @codes.map{ |code| " " + code }.join("\n")+"",
195
- "Note: #{ @note }",
196
- "References: #{ @references.join( ' ' )}",
197
- "Incidents: #{ @incidents.join( ' ')}",
198
- "Information:",
199
- @infos.map{ |info| " " + info.to_s }.join( "\n" )].join( "\n" )
200
- RCAP.format_lines_for_inspect( 'ALERT', alert_inspect )
185
+ alert_inspect = ["CAP Version: #{self.class::CAP_VERSION}",
186
+ "Identifier: #{@identifier}",
187
+ "Sender: #{@sender}",
188
+ "Sent: #{@sent}",
189
+ "Status: #{@status}",
190
+ "Message Type: #{@msg_type}",
191
+ "Source: #{@source}",
192
+ "Scope: #{@scope}",
193
+ "Restriction: #{@restriction}",
194
+ "Addresses: #{@addresses.to_s_for_cap}",
195
+ 'Codes:',
196
+ @codes.map { |code| ' ' + code }.join("\n") + '',
197
+ "Note: #{@note}",
198
+ 'References:',
199
+ @references.join("\n "),
200
+ "Incidents: #{@incidents.join(' ')}",
201
+ 'Information:',
202
+ @infos.map { |info| ' ' + info.to_s }.join("\n")].join("\n")
203
+ RCAP.format_lines_for_inspect('ALERT', alert_inspect)
201
204
  end
202
205
 
203
206
  # Returns a string representation of the alert of the form
@@ -206,149 +209,149 @@ module RCAP
206
209
  #
207
210
  # @return [String]
208
211
  def to_s
209
- "#{ @sender }/#{ @identifier }/#{ RCAP.to_s_for_cap( @sent )}"
212
+ "#{@sender}/#{@identifier}/#{RCAP.to_s_for_cap(@sent)}"
210
213
  end
211
214
 
212
215
  XPATH = 'cap:alert'
213
- IDENTIFIER_XPATH = "cap:#{ IDENTIFIER_ELEMENT_NAME }"
214
- SENDER_XPATH = "cap:#{ SENDER_ELEMENT_NAME }"
215
- SENT_XPATH = "cap:#{ SENT_ELEMENT_NAME }"
216
- STATUS_XPATH = "cap:#{ STATUS_ELEMENT_NAME }"
217
- MSG_TYPE_XPATH = "cap:#{ MSG_TYPE_ELEMENT_NAME }"
218
- SOURCE_XPATH = "cap:#{ SOURCE_ELEMENT_NAME }"
219
- SCOPE_XPATH = "cap:#{ SCOPE_ELEMENT_NAME }"
220
- RESTRICTION_XPATH = "cap:#{ RESTRICTION_ELEMENT_NAME }"
221
- ADDRESSES_XPATH = "cap:#{ ADDRESSES_ELEMENT_NAME }"
222
- CODE_XPATH = "cap:#{ CODE_ELEMENT_NAME }"
223
- NOTE_XPATH = "cap:#{ NOTE_ELEMENT_NAME }"
224
- REFERENCES_XPATH = "cap:#{ REFERENCES_ELEMENT_NAME }"
225
- INCIDENTS_XPATH = "cap:#{ INCIDENTS_ELEMENT_NAME }"
216
+ IDENTIFIER_XPATH = "cap:#{IDENTIFIER_ELEMENT_NAME}"
217
+ SENDER_XPATH = "cap:#{SENDER_ELEMENT_NAME}"
218
+ SENT_XPATH = "cap:#{SENT_ELEMENT_NAME}"
219
+ STATUS_XPATH = "cap:#{STATUS_ELEMENT_NAME}"
220
+ MSG_TYPE_XPATH = "cap:#{MSG_TYPE_ELEMENT_NAME}"
221
+ SOURCE_XPATH = "cap:#{SOURCE_ELEMENT_NAME}"
222
+ SCOPE_XPATH = "cap:#{SCOPE_ELEMENT_NAME}"
223
+ RESTRICTION_XPATH = "cap:#{RESTRICTION_ELEMENT_NAME}"
224
+ ADDRESSES_XPATH = "cap:#{ADDRESSES_ELEMENT_NAME}"
225
+ CODE_XPATH = "cap:#{CODE_ELEMENT_NAME}"
226
+ NOTE_XPATH = "cap:#{NOTE_ELEMENT_NAME}"
227
+ REFERENCES_XPATH = "cap:#{REFERENCES_ELEMENT_NAME}"
228
+ INCIDENTS_XPATH = "cap:#{INCIDENTS_ELEMENT_NAME}"
226
229
 
227
230
  # @param [REXML::Element] alert_xml_element
228
231
  # @return [RCAP::CAP_1_0::Alert]
229
- def self.from_xml_element( alert_xml_element )
230
- self.new do |alert|
231
- alert.identifier = RCAP.xpath_text( alert_xml_element, IDENTIFIER_XPATH, alert.xmlns )
232
- alert.sender = RCAP.xpath_text( alert_xml_element, SENDER_XPATH, alert.xmlns )
233
- alert.sent = RCAP.parse_datetime( RCAP.xpath_text( alert_xml_element, SENT_XPATH, alert.xmlns ))
234
- alert.status = RCAP.xpath_text( alert_xml_element, STATUS_XPATH, alert.xmlns )
235
- alert.msg_type = RCAP.xpath_text( alert_xml_element, MSG_TYPE_XPATH, alert.xmlns )
236
- alert.source = RCAP.xpath_text( alert_xml_element, SOURCE_XPATH, alert.xmlns )
237
- alert.scope = RCAP.xpath_text( alert_xml_element, SCOPE_XPATH, alert.xmlns )
238
- alert.restriction = RCAP.xpath_text( alert_xml_element, RESTRICTION_XPATH, alert.xmlns )
239
-
240
- RCAP.unpack_if_given( RCAP.xpath_text( alert_xml_element, ADDRESSES_XPATH, alert.xmlns )).each do |address|
232
+ def self.from_xml_element(alert_xml_element)
233
+ new do |alert|
234
+ alert.identifier = RCAP.xpath_text(alert_xml_element, IDENTIFIER_XPATH, alert.xmlns)
235
+ alert.sender = RCAP.xpath_text(alert_xml_element, SENDER_XPATH, alert.xmlns)
236
+ alert.sent = RCAP.parse_datetime(RCAP.xpath_text(alert_xml_element, SENT_XPATH, alert.xmlns))
237
+ alert.status = RCAP.xpath_text(alert_xml_element, STATUS_XPATH, alert.xmlns)
238
+ alert.msg_type = RCAP.xpath_text(alert_xml_element, MSG_TYPE_XPATH, alert.xmlns)
239
+ alert.source = RCAP.xpath_text(alert_xml_element, SOURCE_XPATH, alert.xmlns)
240
+ alert.scope = RCAP.xpath_text(alert_xml_element, SCOPE_XPATH, alert.xmlns)
241
+ alert.restriction = RCAP.xpath_text(alert_xml_element, RESTRICTION_XPATH, alert.xmlns)
242
+
243
+ RCAP.unpack_if_given(RCAP.xpath_text(alert_xml_element, ADDRESSES_XPATH, alert.xmlns)).each do |address|
241
244
  alert.addresses << address.strip
242
245
  end
243
246
 
244
- RCAP.xpath_match( alert_xml_element, CODE_XPATH, alert.xmlns ).each do |element|
247
+ RCAP.xpath_match(alert_xml_element, CODE_XPATH, alert.xmlns).each do |element|
245
248
  alert.codes << element.text.strip
246
249
  end
247
250
 
248
- alert.note = RCAP.xpath_text( alert_xml_element, NOTE_XPATH, alert.xmlns )
251
+ alert.note = RCAP.xpath_text(alert_xml_element, NOTE_XPATH, alert.xmlns)
249
252
 
250
- RCAP.unpack_if_given( RCAP.xpath_text( alert_xml_element, REFERENCES_XPATH, alert.xmlns )).each do |reference|
253
+ RCAP.unpack_if_given(RCAP.xpath_text(alert_xml_element, REFERENCES_XPATH, alert.xmlns)).each do |reference|
251
254
  alert.references << reference.strip
252
255
  end
253
256
 
254
- RCAP.unpack_if_given( RCAP.xpath_text( alert_xml_element, INCIDENTS_XPATH, alert.xmlns )).each do |incident|
257
+ RCAP.unpack_if_given(RCAP.xpath_text(alert_xml_element, INCIDENTS_XPATH, alert.xmlns)).each do |incident|
255
258
  alert.incidents << incident.strip
256
259
  end
257
260
 
258
- RCAP.xpath_match( alert_xml_element, Info::XPATH, alert.xmlns ).each do |element|
259
- alert.infos << alert.info_class.from_xml_element( element )
261
+ RCAP.xpath_match(alert_xml_element, Info::XPATH, alert.xmlns).each do |element|
262
+ alert.infos << alert.info_class.from_xml_element(element)
260
263
  end
261
264
  end
262
265
  end
263
266
 
264
267
  # @param [REXML::Document] xml_document
265
268
  # @return [Alert]
266
- def self.from_xml_document( xml_document )
267
- self.from_xml_element( xml_document.root )
269
+ def self.from_xml_document(xml_document)
270
+ from_xml_element(xml_document.root)
268
271
  end
269
272
 
270
273
  # Initialise an Alert object from an XML string. Any object that is a subclass of IO (e.g. File) can be passed in.
271
274
  #
272
275
  # @param [String] xml
273
276
  # @return [Alert]
274
- def self.from_xml( xml )
275
- self.from_xml_document( REXML::Document.new( xml ))
277
+ def self.from_xml(xml)
278
+ from_xml_document(REXML::Document.new(xml))
276
279
  end
277
280
 
278
- CAP_VERSION_YAML = "CAP Version"
279
- IDENTIFIER_YAML = "Identifier"
280
- SENDER_YAML = "Sender"
281
- SENT_YAML = "Sent"
282
- STATUS_YAML = "Status"
283
- MSG_TYPE_YAML = "Message Type"
284
- SOURCE_YAML = "Source"
285
- SCOPE_YAML = "Scope"
286
- RESTRICTION_YAML = "Restriction"
287
- ADDRESSES_YAML = "Addresses"
288
- CODES_YAML = "Codes"
289
- NOTE_YAML = "Note"
290
- REFERENCES_YAML = "References"
291
- INCIDENTS_YAML = "Incidents"
292
- INFOS_YAML = "Information"
281
+ CAP_VERSION_YAML = 'CAP Version'
282
+ IDENTIFIER_YAML = 'Identifier'
283
+ SENDER_YAML = 'Sender'
284
+ SENT_YAML = 'Sent'
285
+ STATUS_YAML = 'Status'
286
+ MSG_TYPE_YAML = 'Message Type'
287
+ SOURCE_YAML = 'Source'
288
+ SCOPE_YAML = 'Scope'
289
+ RESTRICTION_YAML = 'Restriction'
290
+ ADDRESSES_YAML = 'Addresses'
291
+ CODES_YAML = 'Codes'
292
+ NOTE_YAML = 'Note'
293
+ REFERENCES_YAML = 'References'
294
+ INCIDENTS_YAML = 'Incidents'
295
+ INFOS_YAML = 'Information'
293
296
 
294
297
  # Returns a string containing the YAML representation of the alert.
295
298
  #
296
299
  # @return [String]
297
- def to_yaml( options = {} )
298
- RCAP.attribute_values_to_hash( [ CAP_VERSION_YAML, self.class::CAP_VERSION ],
299
- [ IDENTIFIER_YAML, @identifier ],
300
- [ SENDER_YAML, @sender ],
301
- [ SENT_YAML, @sent ],
302
- [ STATUS_YAML, @status ],
303
- [ MSG_TYPE_YAML, @msg_type ],
304
- [ SOURCE_YAML, @source ],
305
- [ SCOPE_YAML, @scope ],
306
- [ RESTRICTION_YAML, @restriction ],
307
- [ ADDRESSES_YAML, @addresses ],
308
- [ CODES_YAML, @codes ],
309
- [ NOTE_YAML, @note ],
310
- [ REFERENCES_YAML, @references ],
311
- [ INCIDENTS_YAML, @incidents ],
312
- [ INFOS_YAML, @infos.map( &:to_yaml_data )]).to_yaml( options )
300
+ def to_yaml(options = {})
301
+ RCAP.attribute_values_to_hash([CAP_VERSION_YAML, self.class::CAP_VERSION],
302
+ [IDENTIFIER_YAML, @identifier],
303
+ [SENDER_YAML, @sender],
304
+ [SENT_YAML, @sent],
305
+ [STATUS_YAML, @status],
306
+ [MSG_TYPE_YAML, @msg_type],
307
+ [SOURCE_YAML, @source],
308
+ [SCOPE_YAML, @scope],
309
+ [RESTRICTION_YAML, @restriction],
310
+ [ADDRESSES_YAML, @addresses],
311
+ [CODES_YAML, @codes],
312
+ [NOTE_YAML, @note],
313
+ [REFERENCES_YAML, @references],
314
+ [INCIDENTS_YAML, @incidents],
315
+ [INFOS_YAML, @infos.map(&:to_yaml_data)]).to_yaml(options)
313
316
  end
314
317
 
315
318
  # Initialise an Alert object from a YAML string. Any object that is a subclass of IO (e.g. File) can be passed in.
316
319
  #
317
320
  # @param [String] yaml
318
321
  # @return [Alert]
319
- def self.from_yaml( yaml )
320
- self.from_yaml_data( YAML.load( yaml ))
322
+ def self.from_yaml(yaml)
323
+ from_yaml_data(YAML.safe_load(yaml, [Time, DateTime]))
321
324
  end
322
325
 
323
326
  # Initialise an Alert object from a hash reutrned from YAML.load.
324
327
  #
325
328
  # @param [hash] alert_yaml_data
326
329
  # @return [Alert]
327
- def self.from_yaml_data( alert_yaml_data )
328
- self.new do |alert|
329
- alert.identifier = RCAP.strip_if_given( alert_yaml_data[ IDENTIFIER_YAML ])
330
- alert.sender = RCAP.strip_if_given( alert_yaml_data[ SENDER_YAML ])
331
- alert.sent = RCAP.parse_datetime( alert_yaml_data[ SENT_YAML ])
332
- alert.status = RCAP.strip_if_given( alert_yaml_data[ STATUS_YAML ])
333
- alert.msg_type = RCAP.strip_if_given( alert_yaml_data[ MSG_TYPE_YAML ])
334
- alert.source = RCAP.strip_if_given( alert_yaml_data[ SOURCE_YAML ])
335
- alert.scope = RCAP.strip_if_given( alert_yaml_data[ SCOPE_YAML ])
336
- alert.restriction = RCAP.strip_if_given( alert_yaml_data[ RESTRICTION_YAML ])
337
- Array( alert_yaml_data[ ADDRESSES_YAML ]).each do |address|
330
+ def self.from_yaml_data(alert_yaml_data)
331
+ new do |alert|
332
+ alert.identifier = RCAP.strip_if_given(alert_yaml_data[IDENTIFIER_YAML])
333
+ alert.sender = RCAP.strip_if_given(alert_yaml_data[SENDER_YAML])
334
+ alert.sent = RCAP.parse_datetime(alert_yaml_data[SENT_YAML])
335
+ alert.status = RCAP.strip_if_given(alert_yaml_data[STATUS_YAML])
336
+ alert.msg_type = RCAP.strip_if_given(alert_yaml_data[MSG_TYPE_YAML])
337
+ alert.source = RCAP.strip_if_given(alert_yaml_data[SOURCE_YAML])
338
+ alert.scope = RCAP.strip_if_given(alert_yaml_data[SCOPE_YAML])
339
+ alert.restriction = RCAP.strip_if_given(alert_yaml_data[RESTRICTION_YAML])
340
+ Array(alert_yaml_data[ADDRESSES_YAML]).each do |address|
338
341
  alert.addresses << address.strip
339
342
  end
340
- Array( alert_yaml_data[ CODES_YAML ]).each do |code|
343
+ Array(alert_yaml_data[CODES_YAML]).each do |code|
341
344
  alert.codes << code.strip
342
345
  end
343
- alert.note = alert_yaml_data[ NOTE_YAML ]
344
- Array( alert_yaml_data[ REFERENCES_YAML ]).each do |reference|
346
+ alert.note = alert_yaml_data[NOTE_YAML]
347
+ Array(alert_yaml_data[REFERENCES_YAML]).each do |reference|
345
348
  alert.references << reference.strip
346
349
  end
347
- Array( alert_yaml_data[ INCIDENTS_YAML ]).each do |incident|
350
+ Array(alert_yaml_data[INCIDENTS_YAML]).each do |incident|
348
351
  alert.incidents << incident.strip
349
352
  end
350
- Array( alert_yaml_data[ INFOS_YAML ]).each do |info_yaml_data|
351
- alert.infos << alert.info_class.from_yaml_data( info_yaml_data )
353
+ Array(alert_yaml_data[INFOS_YAML]).each do |info_yaml_data|
354
+ alert.infos << alert.info_class.from_yaml_data(info_yaml_data)
352
355
  end
353
356
  end
354
357
  end
@@ -373,54 +376,54 @@ module RCAP
373
376
  #
374
377
  # @return [Hash]
375
378
  def to_h
376
- RCAP.attribute_values_to_hash( [ CAP_VERSION_KEY, self.class::CAP_VERSION ],
377
- [ IDENTIFIER_KEY, @identifier ],
378
- [ SENDER_KEY, @sender ],
379
- [ SENT_KEY, RCAP.to_s_for_cap( @sent )],
380
- [ STATUS_KEY, @status ],
381
- [ MSG_TYPE_KEY, @msg_type ],
382
- [ SOURCE_KEY, @source ],
383
- [ SCOPE_KEY, @scope ],
384
- [ RESTRICTION_KEY, @restriction ],
385
- [ ADDRESSES_KEY, @addresses ],
386
- [ CODES_KEY, @codes ],
387
- [ NOTE_KEY, @note ],
388
- [ REFERENCES_KEY, @references ],
389
- [ INCIDENTS_KEY, @incidents ],
390
- [ INFOS_KEY, @infos.map{ |info| info.to_h }])
379
+ RCAP.attribute_values_to_hash([CAP_VERSION_KEY, self.class::CAP_VERSION],
380
+ [IDENTIFIER_KEY, @identifier],
381
+ [SENDER_KEY, @sender],
382
+ [SENT_KEY, RCAP.to_s_for_cap(@sent)],
383
+ [STATUS_KEY, @status],
384
+ [MSG_TYPE_KEY, @msg_type],
385
+ [SOURCE_KEY, @source],
386
+ [SCOPE_KEY, @scope],
387
+ [RESTRICTION_KEY, @restriction],
388
+ [ADDRESSES_KEY, @addresses],
389
+ [CODES_KEY, @codes],
390
+ [NOTE_KEY, @note],
391
+ [REFERENCES_KEY, @references],
392
+ [INCIDENTS_KEY, @incidents],
393
+ [INFOS_KEY, @infos.map(&:to_h)])
391
394
  end
392
395
 
393
396
  # Initialises an Alert object from a Hash produced by Alert#to_h
394
397
  #
395
398
  # @param [Hash] alert_hash
396
399
  # @return [RCAP::CAP_1_0::Alert]
397
- def self.from_h( alert_hash )
398
- self.new do |alert|
399
- alert.identifier = RCAP.strip_if_given( alert_hash[ IDENTIFIER_KEY ])
400
- alert.sender = RCAP.strip_if_given( alert_hash[ SENDER_KEY ])
401
- alert.sent = RCAP.parse_datetime( alert_hash[ SENT_KEY ])
402
- alert.status = RCAP.strip_if_given( alert_hash[ STATUS_KEY ])
403
- alert.msg_type = RCAP.strip_if_given( alert_hash[ MSG_TYPE_KEY ])
404
- alert.source = RCAP.strip_if_given( alert_hash[ SOURCE_KEY ])
405
- alert.scope = RCAP.strip_if_given( alert_hash[ SCOPE_KEY ])
406
- alert.restriction = RCAP.strip_if_given( alert_hash[ RESTRICTION_KEY ])
407
- Array( alert_hash[ ADDRESSES_KEY ]).each do |address|
400
+ def self.from_h(alert_hash)
401
+ new do |alert|
402
+ alert.identifier = RCAP.strip_if_given(alert_hash[IDENTIFIER_KEY])
403
+ alert.sender = RCAP.strip_if_given(alert_hash[SENDER_KEY])
404
+ alert.sent = RCAP.parse_datetime(alert_hash[SENT_KEY])
405
+ alert.status = RCAP.strip_if_given(alert_hash[STATUS_KEY])
406
+ alert.msg_type = RCAP.strip_if_given(alert_hash[MSG_TYPE_KEY])
407
+ alert.source = RCAP.strip_if_given(alert_hash[SOURCE_KEY])
408
+ alert.scope = RCAP.strip_if_given(alert_hash[SCOPE_KEY])
409
+ alert.restriction = RCAP.strip_if_given(alert_hash[RESTRICTION_KEY])
410
+ Array(alert_hash[ADDRESSES_KEY]).each do |address|
408
411
  alert.addresses << address.strip
409
412
  end
410
- Array( alert_hash[ CODES_KEY ]).each do |code|
413
+ Array(alert_hash[CODES_KEY]).each do |code|
411
414
  alert.codes << code.strip
412
415
  end
413
- alert.note = alert_hash[ NOTE_KEY ]
414
- Array( alert_hash[ REFERENCES_KEY ]).each do |reference|
416
+ alert.note = alert_hash[NOTE_KEY]
417
+ Array(alert_hash[REFERENCES_KEY]).each do |reference|
415
418
  alert.references << reference.strip
416
419
  end
417
420
 
418
- Array( alert_hash[ INCIDENTS_KEY ]).each do |incident|
421
+ Array(alert_hash[INCIDENTS_KEY]).each do |incident|
419
422
  alert.incidents << incident.strip
420
423
  end
421
424
 
422
- Array( alert_hash[ INFOS_KEY ]).each do |info_hash|
423
- alert.infos << alert.info_class.from_h( info_hash )
425
+ Array(alert_hash[INFOS_KEY]).each do |info_hash|
426
+ alert.infos << alert.info_class.from_h(info_hash)
424
427
  end
425
428
  end
426
429
  end
@@ -429,11 +432,11 @@ module RCAP
429
432
  #
430
433
  # @param [true,false] pretty_print
431
434
  # @return [String]
432
- def to_json( pretty_print = false )
435
+ def to_json(pretty_print = false)
433
436
  if pretty_print
434
- JSON.pretty_generate( self.to_h )
437
+ JSON.pretty_generate(to_h)
435
438
  else
436
- self.to_h.to_json
439
+ to_h.to_json
437
440
  end
438
441
  end
439
442
 
@@ -441,8 +444,8 @@ module RCAP
441
444
  #
442
445
  # @param [String] json_string
443
446
  # @return [Alert]
444
- def self.from_json( json_string )
445
- self.from_h( JSON.parse( json_string ))
447
+ def self.from_json(json_string)
448
+ from_h(JSON.parse(json_string))
446
449
  end
447
450
  end
448
451
  end