rcap 2.5.0 → 2.7.4

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 (89) 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 +4 -2
  7. data/lib/rcap/base/alert.rb +70 -73
  8. data/lib/rcap/base/area.rb +19 -13
  9. data/lib/rcap/base/circle.rb +15 -4
  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 +81 -75
  13. data/lib/rcap/base/parameter.rb +8 -6
  14. data/lib/rcap/base/point.rb +4 -2
  15. data/lib/rcap/base/polygon.rb +16 -8
  16. data/lib/rcap/base/resource.rb +13 -13
  17. data/lib/rcap/cap_1_0/alert.rb +36 -39
  18. data/lib/rcap/cap_1_0/area.rb +2 -0
  19. data/lib/rcap/cap_1_0/circle.rb +2 -0
  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 -1
  23. data/lib/rcap/cap_1_0/parameter.rb +3 -2
  24. data/lib/rcap/cap_1_0/point.rb +2 -0
  25. data/lib/rcap/cap_1_0/polygon.rb +3 -1
  26. data/lib/rcap/cap_1_0/resource.rb +2 -0
  27. data/lib/rcap/cap_1_1/alert.rb +4 -2
  28. data/lib/rcap/cap_1_1/area.rb +2 -0
  29. data/lib/rcap/cap_1_1/circle.rb +2 -0
  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 +48 -46
  33. data/lib/rcap/cap_1_1/parameter.rb +2 -1
  34. data/lib/rcap/cap_1_1/point.rb +2 -0
  35. data/lib/rcap/cap_1_1/polygon.rb +3 -1
  36. data/lib/rcap/cap_1_1/resource.rb +12 -11
  37. data/lib/rcap/cap_1_2/alert.rb +4 -2
  38. data/lib/rcap/cap_1_2/area.rb +2 -0
  39. data/lib/rcap/cap_1_2/circle.rb +2 -0
  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 +55 -51
  43. data/lib/rcap/cap_1_2/parameter.rb +2 -1
  44. data/lib/rcap/cap_1_2/point.rb +2 -0
  45. data/lib/rcap/cap_1_2/polygon.rb +4 -2
  46. data/lib/rcap/cap_1_2/resource.rb +14 -12
  47. data/lib/rcap/config.rb +2 -0
  48. data/lib/rcap/custom_validators.rb +30 -27
  49. data/lib/rcap/extensions/array.rb +2 -0
  50. data/lib/rcap/extensions/date.rb +3 -1
  51. data/lib/rcap/extensions/date_time.rb +4 -1
  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 +3 -1
  56. data/lib/rcap/extensions/time.rb +3 -0
  57. data/lib/rcap/formatters/yaml.rb +5 -0
  58. data/lib/rcap/info.rb +2 -0
  59. data/lib/rcap/utilities.rb +8 -10
  60. data/lib/rcap/validation.rb +19 -14
  61. data/lib/rcap/version.rb +3 -1
  62. data/rcap.gemspec +5 -5
  63. data/spec/alert_spec.rb +8 -9
  64. data/spec/cap_1_0/alert_spec.rb +4 -5
  65. data/spec/cap_1_0/area_spec.rb +7 -10
  66. data/spec/cap_1_0/circle_spec.rb +9 -0
  67. data/spec/cap_1_0/event_code_spec.rb +1 -1
  68. data/spec/cap_1_0/geocode_spec.rb +1 -1
  69. data/spec/cap_1_0/info_spec.rb +38 -38
  70. data/spec/cap_1_0/polygon_spec.rb +7 -5
  71. data/spec/cap_1_0/resource_spec.rb +6 -7
  72. data/spec/cap_1_1/alert_spec.rb +6 -7
  73. data/spec/cap_1_1/area_spec.rb +6 -8
  74. data/spec/cap_1_1/circle_spec.rb +9 -0
  75. data/spec/cap_1_1/info_spec.rb +26 -26
  76. data/spec/cap_1_1/parameter_spec.rb +1 -2
  77. data/spec/cap_1_1/polygon_spec.rb +12 -10
  78. data/spec/cap_1_1/resource_spec.rb +13 -13
  79. data/spec/cap_1_2/alert_spec.rb +7 -8
  80. data/spec/cap_1_2/area_spec.rb +6 -6
  81. data/spec/cap_1_2/circle_spec.rb +9 -0
  82. data/spec/cap_1_2/info_spec.rb +25 -26
  83. data/spec/cap_1_2/polygon_spec.rb +8 -0
  84. data/spec/cap_1_2/resource_spec.rb +13 -13
  85. data/spec/extensions_spec.rb +2 -2
  86. data/spec/spec_helper.rb +2 -2
  87. data/spec/validations_spec.rb +0 -1
  88. metadata +15 -15
  89. data/lib/rcap/extensions/fixnum.rb +0 -5
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_1
3
5
  # A Parameter object is valid if
4
6
  # * it has a name
5
- # * it has a value
6
7
  class Parameter < RCAP::Base::Parameter
7
8
  # @return [String]
8
9
  def xmlns
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_1
3
5
  # A Point object is valid if
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_1
3
5
  # A Polygon object is valid if
4
- # * it has a minimum of three points
6
+ # * if points are given it has a minimum of three points
5
7
  # * each Point object in the points collection is valid
6
8
  class Polygon < RCAP::Base::Polygon
7
9
  # @return [Class]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_1
3
5
  # A Resource object is valid if
@@ -6,19 +8,18 @@ module RCAP
6
8
  # @return [String] Dereferenced URI - contents of URI Base64 encoded
7
9
  attr_accessor(:deref_uri)
8
10
 
9
- DEREF_URI_ELEMENT_NAME = 'derefUri'
10
- DEREF_URI_XPATH = "cap:#{ DEREF_URI_ELEMENT_NAME }"
11
+ DEREF_URI_ELEMENT_NAME = 'derefUri'
12
+ DEREF_URI_XPATH = "cap:#{DEREF_URI_ELEMENT_NAME}"
11
13
 
12
14
  # @return [REXML::Element]
13
15
  def to_xml_element
14
- xml_element = super
15
16
  xml_element = REXML::Element.new(XML_ELEMENT_NAME)
16
- xml_element.add_element(RESOURCE_DESC_ELEMENT_NAME).add_text(@resource_desc)
17
- xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type) if @mime_type
18
- xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s) if @size
19
- xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri) if @uri
20
- xml_element.add_element(DEREF_URI_ELEMENT_NAME).add_text(@deref_uri) if @deref_uri
21
- xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest) if @digest
17
+ xml_element.add_element(RESOURCE_DESC_ELEMENT_NAME).add_text(@resource_desc.to_s)
18
+ xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type.to_s) if @mime_type
19
+ xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s) if @size
20
+ xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri.to_s) if @uri
21
+ xml_element.add_element(DEREF_URI_ELEMENT_NAME).add_text(@deref_uri.to_s) if @deref_uri
22
+ xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest.to_s) if @digest
22
23
  xml_element
23
24
  end
24
25
 
@@ -51,7 +52,7 @@ module RCAP
51
52
  end
52
53
  end
53
54
 
54
- DEREF_URI_YAML = 'Derefrenced URI Data'
55
+ DEREF_URI_YAML = 'Derefrenced URI Data'
55
56
 
56
57
  def to_yaml_data
57
58
  RCAP.attribute_values_to_hash([RESOURCE_DESC_YAML, @resource_desc],
@@ -76,7 +77,7 @@ module RCAP
76
77
  end
77
78
  end
78
79
 
79
- DEREF_URI_KEY = 'deref_uri'
80
+ DEREF_URI_KEY = 'deref_uri'
80
81
 
81
82
  # @return [Hash]
82
83
  def to_h
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # An Alert object is valid if
@@ -12,9 +14,9 @@ module RCAP
12
14
  XMLNS = 'urn:oasis:names:tc:emergency:cap:1.2'
13
15
  CAP_VERSION = '1.2'
14
16
 
15
- STATUS_DRAFT = 'Draft'
17
+ STATUS_DRAFT = 'Draft'
16
18
  # Valid values for status
17
- VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT]
19
+ VALID_STATUSES = [STATUS_ACTUAL, STATUS_EXERCISE, STATUS_SYSTEM, STATUS_TEST, STATUS_DRAFT].freeze
18
20
 
19
21
  # @return [String]
20
22
  def xmlns
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # An Area object is valid if
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # A Circle object is valid if
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # Subclass of {Parameter}
4
6
  class EventCode < RCAP::Base::EventCode
5
7
  XML_ELEMENT_NAME = 'eventCode'
6
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
8
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
7
9
 
8
10
  # @return [String]
9
11
  def xmlns
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # Subclass of {Parameter}
4
6
  class Geocode < RCAP::Base::Geocode
5
7
  XML_ELEMENT_NAME = 'geocode'
6
- XPATH = "cap:#{ XML_ELEMENT_NAME }"
8
+ XPATH = "cap:#{XML_ELEMENT_NAME}"
7
9
 
8
10
  # @return [String]
9
11
  def xmlns
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # In Info object is valid if
@@ -9,26 +11,28 @@ module RCAP
9
11
  # * all Resource objects in the resources collection are valid
10
12
  # * all Area objects in the areas collection are valid
11
13
  class Info < RCAP::Base::Info
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'
14
+ RESPONSE_TYPE_SHELTER = 'Shelter'
15
+ RESPONSE_TYPE_EVACUATE = 'Evacuate'
16
+ RESPONSE_TYPE_PREPARE = 'Prepare'
17
+ RESPONSE_TYPE_EXECUTE = 'Execute'
18
+ RESPONSE_TYPE_MONITOR = 'Monitor'
19
+ RESPONSE_TYPE_AVOID = 'Avoid'
20
+ RESPONSE_TYPE_ASSESS = 'Assess'
21
+ RESPONSE_TYPE_ALL_CLEAR = 'AllClear'
22
+ RESPONSE_TYPE_NONE = 'None'
19
23
  # Valid values for response_type
20
- VALID_RESPONSE_TYPES = [RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE, RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR, RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_NONE]
24
+ VALID_RESPONSE_TYPES = [RESPONSE_TYPE_SHELTER, RESPONSE_TYPE_EVACUATE, RESPONSE_TYPE_PREPARE, RESPONSE_TYPE_EXECUTE, RESPONSE_TYPE_MONITOR, RESPONSE_TYPE_AVOID, RESPONSE_TYPE_ASSESS, RESPONSE_TYPE_ALL_CLEAR, RESPONSE_TYPE_NONE].freeze
21
25
 
22
26
  CERTAINTY_OBSERVED = 'Observed'
23
27
  # Valid valies for certainty
24
- VALID_CERTAINTIES = [CERTAINTY_OBSERVED, CERTAINTY_LIKELY, CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN]
28
+ VALID_CERTAINTIES = [CERTAINTY_OBSERVED, CERTAINTY_LIKELY, CERTAINTY_POSSIBLE, CERTAINTY_UNLIKELY, CERTAINTY_UNKNOWN].freeze
25
29
 
26
30
  RESPONSE_TYPE_ELEMENT_NAME = 'responseType'
27
- RESPONSE_TYPE_XPATH = "cap:#{ RESPONSE_TYPE_ELEMENT_NAME }"
31
+ RESPONSE_TYPE_XPATH = "cap:#{RESPONSE_TYPE_ELEMENT_NAME}"
28
32
 
29
33
  validates_length_of(:categories, minimum: 1)
30
34
  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(', ') }")
35
+ validates_inclusion_of(:certainty, allow_nil: true, in: VALID_CERTAINTIES, message: "can only be assigned the following values: #{VALID_CERTAINTIES.join(', ')}")
32
36
 
33
37
  # @return [Array<String>] Collection of textual response types; elements must be from {VALID_RESPONSE_TYPES}
34
38
  attr_reader(:response_types)
@@ -70,30 +74,30 @@ module RCAP
70
74
  # @return [REXML::Element]
71
75
  def to_xml_element
72
76
  xml_element = REXML::Element.new(XML_ELEMENT_NAME)
73
- xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language) if @language
77
+ xml_element.add_element(LANGUAGE_ELEMENT_NAME).add_text(@language.to_s) if @language
74
78
  @categories.each do |category|
75
- xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category)
79
+ xml_element.add_element(CATEGORY_ELEMENT_NAME).add_text(category.to_s)
76
80
  end
77
- xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event)
81
+ xml_element.add_element(EVENT_ELEMENT_NAME).add_text(@event.to_s)
78
82
  @response_types.each do |response_type|
79
83
  xml_element.add_element(RESPONSE_TYPE_ELEMENT_NAME).add_text(response_type)
80
84
  end
81
- xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency)
82
- xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity)
83
- xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty)
84
- xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience) if @audience
85
+ xml_element.add_element(URGENCY_ELEMENT_NAME).add_text(@urgency.to_s)
86
+ xml_element.add_element(SEVERITY_ELEMENT_NAME).add_text(@severity.to_s)
87
+ xml_element.add_element(CERTAINTY_ELEMENT_NAME).add_text(@certainty.to_s)
88
+ xml_element.add_element(AUDIENCE_ELEMENT_NAME).add_text(@audience.to_s) if @audience
85
89
  @event_codes.each do |event_code|
86
90
  xml_element.add_element(event_code.to_xml_element)
87
91
  end
88
92
  xml_element.add_element(EFFECTIVE_ELEMENT_NAME).add_text(@effective.to_s_for_cap) if @effective
89
93
  xml_element.add_element(ONSET_ELEMENT_NAME).add_text(@onset.to_s_for_cap) if @onset
90
94
  xml_element.add_element(EXPIRES_ELEMENT_NAME).add_text(@expires.to_s_for_cap) if @expires
91
- xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name) if @sender_name
92
- xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline) if @headline
93
- xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description) if @description
94
- xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction) if @instruction
95
- xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web) if @web
96
- xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact) if @contact
95
+ xml_element.add_element(SENDER_NAME_ELEMENT_NAME).add_text(@sender_name.to_s) if @sender_name
96
+ xml_element.add_element(HEADLINE_ELEMENT_NAME).add_text(@headline.to_s) if @headline
97
+ xml_element.add_element(DESCRIPTION_ELEMENT_NAME).add_text(@description.to_s) if @description
98
+ xml_element.add_element(INSTRUCTION_ELEMENT_NAME).add_text(@instruction.to_s) if @instruction
99
+ xml_element.add_element(WEB_ELEMENT_NAME).add_text(@web.to_s) if @web
100
+ xml_element.add_element(CONTACT_ELEMENT_NAME).add_text(@contact.to_s) if @contact
97
101
  @parameters.each do |parameter|
98
102
  xml_element.add_element(parameter.to_xml_element)
99
103
  end
@@ -113,27 +117,27 @@ module RCAP
113
117
 
114
118
  # @return [String]
115
119
  def inspect
116
- info_inspect = "Language: #{ @language }\n"\
117
- "Categories: #{ @categories.to_s_for_cap }\n"\
118
- "Event: #{ @event }\n"\
119
- "Response Types: #{ @response_types.to_s_for_cap }\n"\
120
- "Urgency: #{ @urgency }\n"\
121
- "Severity: #{ @severity }\n"\
122
- "Certainty: #{ @certainty }\n"\
123
- "Audience: #{ @audience }\n"\
124
- "Event Codes: #{ @event_codes.inspect }\n"\
125
- "Effective: #{ @effective }\n"\
126
- "Onset: #{ @onset }\n"\
127
- "Expires: #{ @expires }\n"\
128
- "Sender Name: #{ @sender_name }\n"\
129
- "Headline: #{ @headline }\n"\
130
- "Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
131
- "Instruction: #{ @instruction }\n"\
132
- "Web: #{ @web }\n"\
133
- "Contact: #{ @contact }\n"\
134
- "Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
135
- "Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
136
- "Area:\n" + @areas.map { |area| " #{ area }" }.join("\n") + "\n"
120
+ info_inspect = "Language: #{@language}\n"\
121
+ "Categories: #{@categories.to_s_for_cap}\n"\
122
+ "Event: #{@event}\n"\
123
+ "Response Types: #{@response_types.to_s_for_cap}\n"\
124
+ "Urgency: #{@urgency}\n"\
125
+ "Severity: #{@severity}\n"\
126
+ "Certainty: #{@certainty}\n"\
127
+ "Audience: #{@audience}\n"\
128
+ "Event Codes: #{@event_codes.inspect}\n"\
129
+ "Effective: #{@effective}\n"\
130
+ "Onset: #{@onset}\n"\
131
+ "Expires: #{@expires}\n"\
132
+ "Sender Name: #{@sender_name}\n"\
133
+ "Headline: #{@headline}\n"\
134
+ "Description:\n" + @description.to_s.lines.map { |line| ' ' + line }.join("\n") + "\n"\
135
+ "Instruction: #{@instruction}\n"\
136
+ "Web: #{@web}\n"\
137
+ "Contact: #{@contact}\n"\
138
+ "Parameters:\n" + @parameters.map { |parameter| ' ' + parameter.inspect }.join("\n") + "\n"\
139
+ "Resources:\n" + @resources.map { |resource| ' ' + resource.inspect }.join("\n") + "\n"\
140
+ "Area:\n" + @areas.map { |area| " #{area}" }.join("\n") + "\n"
137
141
  RCAP.format_lines_for_inspect('INFO', info_inspect)
138
142
  end
139
143
 
@@ -142,7 +146,7 @@ module RCAP
142
146
  #
143
147
  # @return [String]
144
148
  def to_s
145
- "#{ @event }(#{ @urgency }/#{ @severity }/#{ @certainty })"
149
+ "#{@event}(#{@urgency}/#{@severity}/#{@certainty})"
146
150
  end
147
151
 
148
152
  # @param [REXML::Element] info_xml_element
@@ -159,7 +163,7 @@ module RCAP
159
163
 
160
164
  # @return [Hash]
161
165
  def to_yaml_data
162
- parameter_to_hash = lambda { |hash, parameter| hash.merge(parameter.name => parameter.value) }
166
+ parameter_to_hash = ->(hash, parameter) { hash.merge(parameter.name => parameter.value) }
163
167
 
164
168
  RCAP.attribute_values_to_hash([LANGUAGE_YAML, @language],
165
169
  [CATEGORIES_YAML, @categories],
@@ -220,10 +224,10 @@ module RCAP
220
224
  [INSTRUCTION_KEY, @instruction],
221
225
  [WEB_KEY, @web],
222
226
  [CONTACT_KEY, @contact],
223
- [RESOURCES_KEY, @resources.map { |resource| resource.to_h }],
224
- [EVENT_CODES_KEY, @event_codes.map { |event_code| event_code.to_h }],
225
- [PARAMETERS_KEY, @parameters.map { |parameter| parameter.to_h }],
226
- [AREAS_KEY, @areas.map { |area| area.to_h }])
227
+ [RESOURCES_KEY, @resources.map(&:to_h)],
228
+ [EVENT_CODES_KEY, @event_codes.map(&:to_h)],
229
+ [PARAMETERS_KEY, @parameters.map(&:to_h)],
230
+ [AREAS_KEY, @areas.map(&:to_h)])
227
231
  end
228
232
 
229
233
  # @param [Hash] info_hash
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # A Parameter object is valid if
4
6
  # * it has a name
5
- # * it has a value
6
7
  class Parameter < RCAP::Base::Parameter
7
8
  # @return [String]
8
9
  def xmlns
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # A Point object is valid if
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # A Polygon object is valid if
4
- # * it has a minimum of three points
6
+ # * if points are given it has a minimum of three points
5
7
  # * each Point object in the points collection is valid
6
8
  class Polygon < RCAP::Base::Polygon
7
- validates_length_of(:points, minimum: 4)
9
+ validates_length_of(:points, minimum: 4, allow_blank: true)
8
10
 
9
11
  # @return [Class]
10
12
  def point_class
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  module CAP_1_2
3
5
  # A Resource object is valid if
@@ -9,20 +11,19 @@ module RCAP
9
11
 
10
12
  validates_presence_of(:mime_type)
11
13
 
12
- DEREF_URI_ELEMENT_NAME = 'derefUri'
14
+ DEREF_URI_ELEMENT_NAME = 'derefUri'
13
15
 
14
- DEREF_URI_XPATH = "cap:#{ DEREF_URI_ELEMENT_NAME }"
16
+ DEREF_URI_XPATH = "cap:#{DEREF_URI_ELEMENT_NAME}"
15
17
 
16
18
  # @return [REXML::Element]
17
19
  def to_xml_element
18
- xml_element = super
19
20
  xml_element = REXML::Element.new(XML_ELEMENT_NAME)
20
- xml_element.add_element(RESOURCE_DESC_ELEMENT_NAME).add_text(@resource_desc)
21
- xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type) if @mime_type
22
- xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s) if @size
23
- xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri) if @uri
24
- xml_element.add_element(DEREF_URI_ELEMENT_NAME).add_text(@deref_uri) if @deref_uri
25
- xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest) if @digest
21
+ xml_element.add_element(RESOURCE_DESC_ELEMENT_NAME).add_text(@resource_desc.to_s)
22
+ xml_element.add_element(MIME_TYPE_ELEMENT_NAME).add_text(@mime_type.to_s) if @mime_type
23
+ xml_element.add_element(SIZE_ELEMENT_NAME).add_text(@size.to_s) if @size
24
+ xml_element.add_element(URI_ELEMENT_NAME).add_text(@uri.to_s) if @uri
25
+ xml_element.add_element(DEREF_URI_ELEMENT_NAME).add_text(@deref_uri.to_s) if @deref_uri
26
+ xml_element.add_element(DIGEST_ELEMENT_NAME).add_text(@digest.to_s) if @digest
26
27
  xml_element
27
28
  end
28
29
 
@@ -55,7 +56,7 @@ module RCAP
55
56
  end
56
57
  end
57
58
 
58
- DEREF_URI_YAML = 'Derefrenced URI Data'
59
+ DEREF_URI_YAML = 'Derefrenced URI Data'
59
60
 
60
61
  # @param [Hash] options
61
62
  # @return [String]
@@ -66,7 +67,8 @@ module RCAP
66
67
  [MIME_TYPE_YAML, @mime_type],
67
68
  [DEREF_URI_YAML, @deref_uri],
68
69
  [SIZE_YAML, @size],
69
- [DIGEST_YAML, @digest]).to_yaml(options)
70
+ [DIGEST_YAML, @digest]
71
+ ).to_yaml(options)
70
72
  end
71
73
 
72
74
  # @param [Hash] resource_yaml_data
@@ -77,7 +79,7 @@ module RCAP
77
79
  end
78
80
  end
79
81
 
80
- DEREF_URI_KEY = 'deref_uri'
82
+ DEREF_URI_KEY = 'deref_uri'
81
83
 
82
84
  # @return [Hash]
83
85
  def to_h
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RCAP
2
4
  XML_PRETTY_PRINTER = REXML::Formatters::Pretty.new(2)
3
5
  XML_PRETTY_PRINTER.compact = true
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Validation
2
4
  module ClassMethods
3
5
  CAP_NUMBER_REGEX = Regexp.new('^-{0,1}\d*\.{0,1}\d+$')
@@ -12,9 +14,8 @@ module Validation
12
14
 
13
15
  validates_each(*attributes) do |object, attribute, value|
14
16
  next if value.nil? && options[:allow_nil]
15
- unless options[:in].include?(value)
16
- object.errors[attribute] << options[:message]
17
- end
17
+
18
+ object.errors[attribute] << options[:message] unless options[:in].include?(value)
18
19
  end
19
20
  end
20
21
 
@@ -27,10 +28,9 @@ module Validation
27
28
  }.merge!(attributes.extract_options!)
28
29
 
29
30
  validates_each(*attributes) do |object, attribute, collection|
30
- next if ( collection.nil? && options[:allow_nil]) || ( collection.empty? && options[:allow_empty])
31
- unless collection.all? { |member| options[:in].include?(member) }
32
- object.errors[attribute] << options[:message]
33
- end
31
+ next if (collection.nil? && options[:allow_nil]) || (collection.empty? && options[:allow_empty])
32
+
33
+ object.errors[attribute] << options[:message] unless collection.all? { |member| options[:in].include?(member) }
34
34
  end
35
35
  end
36
36
 
@@ -40,10 +40,9 @@ module Validation
40
40
  }.merge!(attributes.extract_options!)
41
41
 
42
42
  validates_each(*attributes) do |object, attribute, collection|
43
- next if ( collection.nil? && options[:allow_nil]) || ( collection.empty? && options[:allow_empty])
44
- unless options[:minimum] && collection.length >= options[:minimum]
45
- object.errors[attribute] << options[:message]
46
- end
43
+ next if (collection.nil? && options[:allow_nil]) || (collection.empty? && options[:allow_empty])
44
+
45
+ object.errors[attribute] << options[:message] unless options[:minimum] && collection.length >= options[:minimum]
47
46
  end
48
47
  end
49
48
 
@@ -54,9 +53,8 @@ module Validation
54
53
 
55
54
  validates_each(*attributes) do |object, attribute, value|
56
55
  next if value.nil? && options[:allow_nil]
57
- unless value && value.valid?
58
- object.errors[attribute] << options[:message]
59
- end
56
+
57
+ object.errors[attribute] << options[:message] unless value&.valid?
60
58
  end
61
59
  end
62
60
 
@@ -66,10 +64,9 @@ module Validation
66
64
  }.merge!(attributes.extract_options!)
67
65
 
68
66
  validates_each(*attributes) do |object, attribute, collection|
69
- next if ( collection.nil? && options[:allow_nil]) || ( collection.empty? && options[:allow_empty])
70
- unless collection.all? { |element| element.valid? }
71
- object.errors[attribute] << options[:message]
72
- end
67
+ next if (collection.nil? && options[:allow_nil]) || (collection.empty? && options[:allow_empty])
68
+
69
+ object.errors[attribute] << options[:message] unless collection.all?(&:valid?)
73
70
  end
74
71
  end
75
72
 
@@ -80,6 +77,7 @@ module Validation
80
77
 
81
78
  validates_each(*attributes) do |object, attribute, value|
82
79
  next if value.blank?
80
+
83
81
  contingent_on_attribute = object.send(options[:on])
84
82
  contingent_on_attribute_value = options[:with_value]
85
83
 
@@ -98,7 +96,10 @@ module Validation
98
96
  contingent_attribute_value = object.send(options[:when])
99
97
  required_contingent_attribute_value = options[:is]
100
98
 
101
- next if contingent_attribute_value.nil? || contingent_attribute_value != required_contingent_attribute_value && !options[:is].blank?
99
+ if contingent_attribute_value.nil? || contingent_attribute_value != required_contingent_attribute_value && !options[:is].blank?
100
+ next
101
+ end
102
+
102
103
  if value.blank?
103
104
  object.errors[attribute] << options[:message].gsub(/:contingent_attribute/, options[:whenn].to_s)
104
105
  end
@@ -107,16 +108,17 @@ module Validation
107
108
 
108
109
  def validates_numericality_of(*attributes)
109
110
  options = {
110
- message: 'is not a number or does not meet a conditional requirement',
111
+ message: 'is not a number or does not meet a conditional requirement'
111
112
  }.merge!(attributes.extract_options!)
112
113
 
113
114
  re = options[:only_integer] ? CAP_INTEGER_REGEX : CAP_NUMBER_REGEX
114
115
 
115
116
  validates_each(*attributes) do |object, attribute, value|
116
117
  next if value.nil? && options[:allow_nil]
117
- unless ( value.to_s =~ re) &&
118
- ( options[:greater_than].nil? || value && value > options[:greater_than]) &&
119
- ( options[:greater_than_or_equal].nil? || value && value >= options[:greater_than_or_equal])
118
+
119
+ unless (value.to_s =~ re) &&
120
+ (options[:greater_than].nil? || value && value > options[:greater_than]) &&
121
+ (options[:greater_than_or_equal].nil? || value && value >= options[:greater_than_or_equal])
120
122
  object.errors[attribute] << options[:message]
121
123
  end
122
124
  end
@@ -129,6 +131,7 @@ module Validation
129
131
 
130
132
  validates_each(*attributes) do |object, attribute, _value|
131
133
  next if collection.nil? && options[:allow_nil]
134
+
132
135
  unless options[:to].all? { |method_name| object.respond_to?(method_name) }
133
136
  object.errors[attribute] << options [:message]
134
137
  end
@@ -141,10 +144,10 @@ module Validation
141
144
  }.merge!(attributes.extract_options!)
142
145
 
143
146
  validates_each(*attributes) do |object, attribute, collection|
144
- next if collection.nil? && options[:allow_nil]
145
- unless collection.first == collection.last
146
- object.errors[attribute] << options[:message]
147
- end
147
+ next if collection.nil? && options[:allow_nil]
148
+ next if collection.empty? && options[:allow_empty]
149
+
150
+ object.errors[attribute] << options[:message] unless collection.first == collection.last
148
151
  end
149
152
  end
150
153
  end