rcap 2.3.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1bb205d2fab692f7bd6b270029a96918a32eea19
4
- data.tar.gz: fd94605d3d3a99040c3cf183cc873f0db15dd64b
3
+ metadata.gz: 548ad24cc10525bee68f71efb84786a0f490419f
4
+ data.tar.gz: 4baf6cbd9b0b98973f139181d69a968b3c16dc50
5
5
  SHA512:
6
- metadata.gz: a3c720fc8e87dddd70b4dc92f03d2eab1ff21875c33b9c83b8b714e35e4fa0bdb1d065c945b67c55d9bac02f037ac8941172eff5e943fb6209871a6095cd2126
7
- data.tar.gz: 93bf5df1405126c70f80894da9bf0b40b10f8089c17d8877d0c92e6c0fb047475ef843aceaadc5cdd5a48d5691b7a17b044628c4821aca5bbee21653928d5eac
6
+ metadata.gz: 11bf3c92150c6ce9585e675208ce7553427e83c10de6a0d91fa50919c038eba254c2eefaf7902fedccb60109949d2f2a58eecb3297fa28ea526498be8e92b50f
7
+ data.tar.gz: e0660c2f73fd50bdd268221b496e32d018a2a86c55734ca31ec3c11e66bddad4445eea4efd6de6c92739812203b19a7eae1da19470447d76090483d75631c217
data/.gitignore CHANGED
@@ -6,3 +6,4 @@ tags
6
6
  .bundle
7
7
  Gemfile.lock
8
8
  .yardoc
9
+ *.sublime-*
data/CHANGELOG.md CHANGED
@@ -1,6 +1,10 @@
1
1
  Change Log
2
2
  ==========
3
3
 
4
+ ## 2.4.0 - 29 July 2014
5
+
6
+ * Removed assistance gem and extracted validations into a local file. (David van Geest)
7
+
4
8
  ## 2.3.0 - 6 March 2014
5
9
 
6
10
  * Fixed YAML import and export.
data/README.md CHANGED
@@ -13,7 +13,6 @@ Dependencies
13
13
 
14
14
  RCAP depends on the following gems
15
15
 
16
- * [Assistance](http://assistance.rubyforge.org)
17
16
  * [UUIDTools](http://uuidtools.rubyforge.org)
18
17
  * [JSON](http://json.rubyforge.org)
19
18
 
@@ -33,7 +32,7 @@ Usage
33
32
 
34
33
  ### Creating an Alert
35
34
 
36
- RCAP uses a 'builder' style syntax to create alerts.
35
+ RCAP uses a 'builder' style syntax to create alerts.
37
36
 
38
37
  require 'rcap'
39
38
 
@@ -41,13 +40,13 @@ RCAP uses a 'builder' style syntax to create alerts.
41
40
  alert.sender = 'cape_town_disaster_relief@capetown.municipal.za'
42
41
  alert.status = Alert::STATUS_ACTUAL
43
42
  alert.msg_type = Alert::MSG_TYPE_ALERT
44
- alert.scope = Alert::SCOPE_PUBLIC
45
-
43
+ alert.scope = Alert::SCOPE_PUBLIC
44
+
46
45
  alert.add_info do |info|
47
46
  info.event = 'Liquid Petroleoum Tanker Fire'
48
47
  info.language = 'en-ZA'
49
48
  info.categories << Info::CATEGORY_TRANSPORT
50
- info.categories << Info::CATEGORY_FIRE
49
+ info.categories << Info::CATEGORY_FIRE
51
50
  info.urgency = Info::URGENCY_IMMEDIATE
52
51
  info.severity = Info::SEVERITY_SEVERE
53
52
  info.certainty = Info::CERTAINTY_OBSERVED
@@ -55,18 +54,18 @@ RCAP uses a 'builder' style syntax to create alerts.
55
54
  info.description = 'A liquid petroleoum tanker has caught fire on the N2 incoming freeway 1km
56
55
  after the R300 interchange. Municipal fire fighting crews have been dispatched.
57
56
  Traffic control officers are on the scene and have diverted traffic onto
58
- alternate routes.'
59
-
57
+ alternate routes.'
58
+
60
59
  info.add_area do |area|
61
- area.area_desc = 'N2 Highway/R300 Interchange'
60
+ area.area_desc = 'N2 Highway/R300 Interchange'
62
61
  area.add_geocode do |geocode|
63
62
  geocode.name = 'Intersection'
64
- geocode.value = 'N2-15'
63
+ geocode.value = 'N2-15'
65
64
  end
66
65
  end
67
66
  end
68
67
  end
69
-
68
+
70
69
  # Accessing attributes
71
70
  puts alert.status # "Actual"
72
71
  info = alert.infos.first
@@ -128,7 +127,7 @@ The RCAP API aims to codify as many of the rules of the CAP XML format into vali
128
127
  info.severity = nil # Severity is not assigned
129
128
  info.certainty = 'Incorrect Certainty' # Certainty is assigned an incorrect value
130
129
  end
131
-
130
+
132
131
  puts "Is info valid: #{ info.valid? }"
133
132
  info.errors.full_messages.each{ |message| puts "Error: #{ message }" }
134
133
 
@@ -146,7 +145,7 @@ Web resources
146
145
  * The RCAP project page can be found at [http://www.aimred.com/projects/rcap](http://www.aimred.com/projects/rcap)
147
146
  * The RCAP API docs can be found at [http://www.aimred.com/projects/rcap/api](http://www.aimred.com/projects/rcap/api)
148
147
  * A public git repository can be found at [http://github.com/farrel/RCAP](http://github.com/farrel/RCAP)
149
- * A CAP Validator based on RCAP can be found at [http://capvalidator.heroku.com](http://capvalidator.heroku.com)
148
+ * A CAP Validator based on RCAP can be found at [http://capvalidator.herokuapp.com](http://capvalidator.herokuapp.com)
150
149
 
151
150
  Authors
152
151
  -------
@@ -156,6 +155,7 @@ Authors
156
155
  ### Contributors
157
156
 
158
157
  * Earle Clubb - http://github.com/eclubb
158
+ * David van Geest - https://github.com/DWvanGeest
159
159
 
160
160
  Change Log
161
161
  ----------
@@ -0,0 +1,14 @@
1
+ # Array extensions
2
+ class Array
3
+ # Removes and returns the last member of the array if it is a hash. Otherwise,
4
+ # an empty hash is returned This method is useful when writing methods that
5
+ # take an options hash as the last parameter. For example:
6
+ #
7
+ # def validate_each(*args, &block)
8
+ # opts = args.extract_options!
9
+ # ...
10
+ # end
11
+ def extract_options!
12
+ last.is_a?(Hash) ? pop : {}
13
+ end
14
+ end
@@ -0,0 +1,251 @@
1
+ # This file is ripped directly from the no-longer-maintained assistance gem. Other code in that gem
2
+ # was causing issues, so I'm putting the needed code directly in rcap as a workaround.
3
+
4
+ # See https://github.com/farrel/RCAP/issues/4
5
+
6
+ # The Validations module provides validation capabilities as a mixin. When
7
+ # included into a class, it enhances the class with class and instance
8
+ # methods for defining validations and validating class instances.
9
+ #
10
+ # The Validation emulates the validation capabilities of ActiveRecord, and
11
+ # provides methods for validating acceptance, confirmation, presence, format,
12
+ # length and numericality of attributes.
13
+ #
14
+ # To use validations, you need to include the Validation module in your
15
+ # class:
16
+ #
17
+ # class MyClass
18
+ # include Validation
19
+ # validates_length_of :password, :minimum => 6
20
+ # end
21
+ module Validation
22
+ # Includes the Validation class methods into the including class.
23
+ def self.included(c)
24
+ c.extend ClassMethods
25
+ end
26
+
27
+ # Returns the validation errors associated with the object.
28
+ def errors
29
+ @errors ||= Errors.new
30
+ end
31
+
32
+ # Validates the object.
33
+ def validate
34
+ errors.clear
35
+ self.class.validate(self)
36
+ end
37
+
38
+ # Validates the object and returns true if no errors are reported.
39
+ def valid?
40
+ validate
41
+ errors.empty?
42
+ end
43
+
44
+ # Validation::Errors represents validation errors.
45
+ class Errors
46
+ # Initializes a new instance of validation errors.
47
+ def initialize
48
+ @errors = Hash.new {|h, k| h[k] = []}
49
+ end
50
+
51
+ # Returns true if no errors are stored.
52
+ def empty?
53
+ @errors.empty?
54
+ end
55
+
56
+ # Clears all errors.
57
+ def clear
58
+ @errors.clear
59
+ end
60
+
61
+ # Returns the errors for the given attribute.
62
+ def on(att)
63
+ @errors[att]
64
+ end
65
+ alias_method :[], :on
66
+
67
+ # Adds an error for the given attribute.
68
+ def add(att, msg)
69
+ @errors[att] << msg
70
+ end
71
+
72
+ # Returns an array of fully-formatted error messages.
73
+ def full_messages
74
+ @errors.inject([]) do |m, kv| att, errors = *kv
75
+ errors.each {|e| m << "#{att} #{e}"}
76
+ m
77
+ end
78
+ end
79
+ end
80
+
81
+ # The Generator class is used to generate validation definitions using
82
+ # the validates {} idiom.
83
+ class Generator
84
+ # Initializes a new generator.
85
+ def initialize(receiver ,&block)
86
+ @receiver = receiver
87
+ instance_eval(&block)
88
+ end
89
+
90
+ # Delegates method calls to the receiver by calling receiver.validates_xxx.
91
+ def method_missing(m, *args, &block)
92
+ @receiver.send(:"validates_#{m}", *args, &block)
93
+ end
94
+ end
95
+
96
+ # Validation class methods.
97
+ module ClassMethods
98
+ # Defines validations by converting a longhand block into a series of
99
+ # shorthand definitions. For example:
100
+ #
101
+ # class MyClass
102
+ # include Validation
103
+ # validates do
104
+ # length_of :name, :minimum => 6
105
+ # length_of :password, :minimum => 8
106
+ # end
107
+ # end
108
+ #
109
+ # is equivalent to:
110
+ # class MyClass
111
+ # include Validation
112
+ # validates_length_of :name, :minimum => 6
113
+ # validates_length_of :password, :minimum => 8
114
+ # end
115
+ def validates(&block)
116
+ Generator.new(self, &block)
117
+ end
118
+
119
+ # Returns the validations hash for the class.
120
+ def validations
121
+ @validations ||= Hash.new {|h, k| h[k] = []}
122
+ end
123
+
124
+ # Returns true if validations are defined.
125
+ def has_validations?
126
+ !validations.empty?
127
+ end
128
+
129
+ # Validates the given instance.
130
+ def validate(o)
131
+ if superclass.respond_to?(:validate) && !@skip_superclass_validations
132
+ superclass.validate(o)
133
+ end
134
+ validations.each do |att, procs|
135
+ v = o.send(att)
136
+ procs.each {|p| p[o, att, v]}
137
+ end
138
+ end
139
+
140
+ def skip_superclass_validations
141
+ @skip_superclass_validations = true
142
+ end
143
+
144
+ # Adds a validation for each of the given attributes using the supplied
145
+ # block. The block must accept three arguments: instance, attribute and
146
+ # value, e.g.:
147
+ #
148
+ # validates_each :name, :password do |object, attribute, value|
149
+ # object.errors[attribute] << 'is not nice' unless value.nice?
150
+ # end
151
+ def validates_each(*atts, &block)
152
+ atts.each {|a| validations[a] << block}
153
+ end
154
+
155
+ # Validates acceptance of an attribute.
156
+ def validates_acceptance_of(*atts)
157
+ opts = {
158
+ :message => 'is not accepted',
159
+ :allow_nil => true,
160
+ :accept => '1'
161
+ }.merge!(atts.extract_options!)
162
+
163
+ validates_each(*atts) do |o, a, v|
164
+ next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
165
+ o.errors[a] << opts[:message] unless v == opts[:accept]
166
+ end
167
+ end
168
+
169
+ # Validates confirmation of an attribute.
170
+ def validates_confirmation_of(*atts)
171
+ opts = {
172
+ :message => 'is not confirmed',
173
+ }.merge!(atts.extract_options!)
174
+
175
+ validates_each(*atts) do |o, a, v|
176
+ next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
177
+ c = o.send(:"#{a}_confirmation")
178
+ o.errors[a] << opts[:message] unless v == c
179
+ end
180
+ end
181
+
182
+ # Validates the format of an attribute.
183
+ def validates_format_of(*atts)
184
+ opts = {
185
+ :message => 'is invalid',
186
+ }.merge!(atts.extract_options!)
187
+
188
+ unless opts[:with].is_a?(Regexp)
189
+ raise ArgumentError, "A regular expression must be supplied as the :with option of the options hash"
190
+ end
191
+
192
+ validates_each(*atts) do |o, a, v|
193
+ next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
194
+ o.errors[a] << opts[:message] unless v.to_s =~ opts[:with]
195
+ end
196
+ end
197
+
198
+ # Validates the length of an attribute.
199
+ def validates_length_of(*atts)
200
+ opts = {
201
+ :too_long => 'is too long',
202
+ :too_short => 'is too short',
203
+ :wrong_length => 'is the wrong length'
204
+ }.merge!(atts.extract_options!)
205
+
206
+ validates_each(*atts) do |o, a, v|
207
+ next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
208
+ if m = opts[:maximum]
209
+ o.errors[a] << (opts[:message] || opts[:too_long]) unless v && v.size <= m
210
+ end
211
+ if m = opts[:minimum]
212
+ o.errors[a] << (opts[:message] || opts[:too_short]) unless v && v.size >= m
213
+ end
214
+ if i = opts[:is]
215
+ o.errors[a] << (opts[:message] || opts[:wrong_length]) unless v && v.size == i
216
+ end
217
+ if w = opts[:within]
218
+ o.errors[a] << (opts[:message] || opts[:wrong_length]) unless v && w.include?(v.size)
219
+ end
220
+ end
221
+ end
222
+
223
+ NUMBER_RE = /^\d*\.{0,1}\d+$/
224
+ INTEGER_RE = /\A[+-]?\d+\Z/
225
+
226
+ # Validates whether an attribute is a number.
227
+ def validates_numericality_of(*atts)
228
+ opts = {
229
+ :message => 'is not a number',
230
+ }.merge!(atts.extract_options!)
231
+
232
+ re = opts[:only_integer] ? INTEGER_RE : NUMBER_RE
233
+
234
+ validates_each(*atts) do |o, a, v|
235
+ next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
236
+ o.errors[a] << opts[:message] unless v.to_s =~ re
237
+ end
238
+ end
239
+
240
+ # Validates the presence of an attribute.
241
+ def validates_presence_of(*atts)
242
+ opts = {
243
+ :message => 'is not present',
244
+ }.merge!(atts.extract_options!)
245
+
246
+ validates_each(*atts) do |o, a, v|
247
+ o.errors[a] << opts[:message] unless v && !v.blank?
248
+ end
249
+ end
250
+ end
251
+ end
@@ -8,4 +8,8 @@ class Array
8
8
  def to_s_for_cap
9
9
  self.map{ |element| element.to_s.for_cap_list }.join( ' ' )
10
10
  end
11
+
12
+ def blank?
13
+ empty?
14
+ end
11
15
  end
@@ -10,6 +10,10 @@ class DateTime
10
10
  t.sub(/\+(00:\d\d)$/, '-\1')
11
11
  end
12
12
 
13
+ def blank?
14
+ false
15
+ end
16
+
13
17
  private
14
18
  def utc_hours_offset
15
19
  self.offset * 24
@@ -0,0 +1,5 @@
1
+ class Fixnum
2
+ def blank?
3
+ false
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class Float
2
+ def blank?
3
+ false
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class NilClass
2
+ def blank?
3
+ true
4
+ end
5
+ end
@@ -26,4 +26,8 @@ class String
26
26
  def unpack_cap_list
27
27
  self.split( CAP_LIST_REGEX ).reject{ |match| match == "" || match =~ WHITESPACE_REGEX }
28
28
  end
29
+
30
+ def blank?
31
+ empty?
32
+ end
29
33
  end
data/lib/rcap/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module RCAP
2
- VERSION = '2.3.0'
2
+ VERSION = '2.4.0'
3
3
  end
data/lib/rcap.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  # System and require libs
2
2
  require 'date'
3
- require 'assistance'
4
3
  require 'uuidtools'
5
4
  require 'yaml'
6
5
  require 'json'
@@ -10,7 +9,14 @@ require 'open-uri'
10
9
  require 'base64'
11
10
  require 'digest/sha1'
12
11
 
12
+ # these files are taken from the defunct assitance gem and are included as source in this gem
13
+ require 'assistance/extract_options'
14
+ require 'assistance/validation'
15
+
13
16
  # Extensions
17
+ require 'rcap/extensions/nil_class'
18
+ require 'rcap/extensions/fixnum'
19
+ require 'rcap/extensions/float'
14
20
  require 'rcap/extensions/array'
15
21
  require 'rcap/extensions/string'
16
22
  require 'rcap/extensions/date_time'
data/rcap.gemspec CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ['lib']
21
21
 
22
22
  s.extra_rdoc_files = ['README.md','CHANGELOG.md']
23
- s.add_dependency('assistance', '>= 0.1.5')
24
23
  s.add_dependency('json', '>= 1.5.1')
25
24
  s.add_dependency('uuidtools', '>= 2.1.2')
26
25
 
data/spec/alert_spec.rb CHANGED
@@ -257,7 +257,7 @@ describe( RCAP::Alert ) do
257
257
 
258
258
  @alert.infos.size.should == 2
259
259
  info = @alert.infos.first
260
- info.categories.include?( RCAP::CAP_1_1::Info::CATEGORY_GEO ).should( be_true )
260
+ info.categories.include?( RCAP::CAP_1_1::Info::CATEGORY_GEO ).should eq true
261
261
 
262
262
  info.areas.size.should == 1
263
263
  area = info.areas.first
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rcap
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Farrel Lifson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-06 00:00:00.000000000 Z
11
+ date: 2014-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: assistance
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 0.1.5
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 0.1.5
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: json
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -109,6 +95,8 @@ files:
109
95
  - Gemfile
110
96
  - README.md
111
97
  - Rakefile
98
+ - lib/assistance/extract_options.rb
99
+ - lib/assistance/validation.rb
112
100
  - lib/rcap.rb
113
101
  - lib/rcap/alert.rb
114
102
  - lib/rcap/base/alert.rb
@@ -155,6 +143,9 @@ files:
155
143
  - lib/rcap/extensions/array.rb
156
144
  - lib/rcap/extensions/date.rb
157
145
  - lib/rcap/extensions/date_time.rb
146
+ - lib/rcap/extensions/fixnum.rb
147
+ - lib/rcap/extensions/float.rb
148
+ - lib/rcap/extensions/nil_class.rb
158
149
  - lib/rcap/extensions/string.rb
159
150
  - lib/rcap/extensions/time.rb
160
151
  - lib/rcap/info.rb