validatable 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +56 -74
- data/lib/base.rb +71 -5
- data/rakefile.rb +1 -1
- data/test/functional/validatable_test.rb +12 -0
- metadata +4 -3
data/README
CHANGED
@@ -16,79 +16,61 @@ You may use, copy and redistribute this library under the same terms as Ruby its
|
|
16
16
|
|
17
17
|
== Examples
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
klass = Class.new do
|
76
|
-
include Validatable
|
77
|
-
attr_accessor :name
|
78
|
-
validates_format_of :name, :with => /.+/, :if => Proc.new { !name.nil? }
|
79
|
-
end
|
80
|
-
assert_equal true, klass.new.valid?
|
81
|
-
end
|
82
|
-
|
83
|
-
test "given invalid name format and a name, when validated, then error is in the objects error collection" do
|
84
|
-
klass = Class.new do
|
85
|
-
include Validatable
|
86
|
-
attr_accessor :name
|
87
|
-
validates_format_of :name, :with => /.+/, :if => Proc.new { name.nil? }
|
88
|
-
end
|
89
|
-
assert_equal false, klass.new.valid?
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
19
|
+
Validation of an entire hierarchy of objects with errors aggregated at the root object.
|
20
|
+
|
21
|
+
class Person
|
22
|
+
include Validatable
|
23
|
+
validates_presence_of :name
|
24
|
+
attr_accessor :name
|
25
|
+
end
|
26
|
+
|
27
|
+
class PersonPresenter
|
28
|
+
include Validatable
|
29
|
+
include_validations_for :person
|
30
|
+
attr_accessor :person
|
31
|
+
|
32
|
+
def initialize(person)
|
33
|
+
@person = person
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
presenter = PersonPresenter.new(Person.new)
|
38
|
+
presenter.valid? #=> false
|
39
|
+
presenter.errors.on(:name) #=> "can't be blank"
|
40
|
+
|
41
|
+
Validations that turn off after X times of failed attempts.
|
42
|
+
|
43
|
+
class Person
|
44
|
+
include Validatable
|
45
|
+
validates_presence_of :name, :times => 1
|
46
|
+
attr_accessor :name
|
47
|
+
end
|
48
|
+
|
49
|
+
person = Person.new
|
50
|
+
person.valid? #=> false
|
51
|
+
person.valid? #=> true
|
52
|
+
|
53
|
+
Validations can be given levels. If a validation fails on a level the validations for subsequent levels will not be executed.
|
54
|
+
|
55
|
+
class Person
|
56
|
+
include Validatable
|
57
|
+
validates_presence_of :name, :level => 1, :message => "name message"
|
58
|
+
validates_presence_of :address, :level => 2
|
59
|
+
attr_accessor :name, :address
|
60
|
+
end
|
61
|
+
|
62
|
+
person = Person.new
|
63
|
+
person.valid? #=> false
|
64
|
+
person.errors.on(:name) #=> "name message"
|
65
|
+
person.errors.on(:address) #=> nil
|
66
|
+
|
67
|
+
Similar to Rails, Validatable also supports conditional validation.
|
68
|
+
|
69
|
+
class Person
|
70
|
+
include Validatable
|
71
|
+
attr_accessor :name
|
72
|
+
validates_format_of :name, :with => /.+/, :if => Proc.new { !name.nil? }
|
73
|
+
end
|
74
|
+
Person.new.valid? #=> true
|
93
75
|
|
94
76
|
See the tests for more examples
|
data/lib/base.rb
CHANGED
@@ -10,6 +10,14 @@ module Validatable
|
|
10
10
|
# end
|
11
11
|
#
|
12
12
|
# A regular expression must be provided or else an exception will be raised.
|
13
|
+
#
|
14
|
+
# Configuration options:
|
15
|
+
#
|
16
|
+
# * message - The message to add to the errors collection when the validation fails
|
17
|
+
# * times - The number of times the validation applies
|
18
|
+
# * level - The level at which the validation should occur
|
19
|
+
# * if - A block that when executed must return true of the validation will not occur
|
20
|
+
# * with - The regular expression used to validate the format
|
13
21
|
def validates_format_of(*args)
|
14
22
|
add_validations(args, ValidatesFormatOf) do |validation, options|
|
15
23
|
validation.with = options[:with]
|
@@ -28,6 +36,10 @@ module Validatable
|
|
28
36
|
#
|
29
37
|
# Configuration options:
|
30
38
|
#
|
39
|
+
# * message - The message to add to the errors collection when the validation fails
|
40
|
+
# * times - The number of times the validation applies
|
41
|
+
# * level - The level at which the validation should occur
|
42
|
+
# * if - A block that when executed must return true of the validation will not occur
|
31
43
|
# * minimum - The minimum size of the attribute
|
32
44
|
# * maximum - The maximum size of the attribute
|
33
45
|
def validates_length_of(*args)
|
@@ -46,6 +58,13 @@ module Validatable
|
|
46
58
|
# validates_acceptance_of :terms_of_service
|
47
59
|
# validates_acceptance_of :eula, :message => "must be abided"
|
48
60
|
# end
|
61
|
+
#
|
62
|
+
# Configuration options:
|
63
|
+
#
|
64
|
+
# * message - The message to add to the errors collection when the validation fails
|
65
|
+
# * times - The number of times the validation applies
|
66
|
+
# * level - The level at which the validation should occur
|
67
|
+
# * if - A block that when executed must return true of the validation will not occur
|
49
68
|
def validates_acceptance_of(*args)
|
50
69
|
add_validations(args, ValidatesAcceptanceOf)
|
51
70
|
end
|
@@ -64,6 +83,13 @@ module Validatable
|
|
64
83
|
# View:
|
65
84
|
# <%= password_field "person", "password" %>
|
66
85
|
# <%= password_field "person", "password_confirmation" %>
|
86
|
+
#
|
87
|
+
# Configuration options:
|
88
|
+
#
|
89
|
+
# * message - The message to add to the errors collection when the validation fails
|
90
|
+
# * times - The number of times the validation applies
|
91
|
+
# * level - The level at which the validation should occur
|
92
|
+
# * if - A block that when executed must return true of the validation will not occur
|
67
93
|
def validates_confirmation_of(*args)
|
68
94
|
add_validations(args, ValidatesConfirmationOf)
|
69
95
|
end
|
@@ -78,6 +104,13 @@ module Validatable
|
|
78
104
|
# end
|
79
105
|
#
|
80
106
|
# The first_name attribute must be in the object and it cannot be nil or empty.
|
107
|
+
#
|
108
|
+
# Configuration options:
|
109
|
+
#
|
110
|
+
# * message - The message to add to the errors collection when the validation fails
|
111
|
+
# * times - The number of times the validation applies
|
112
|
+
# * level - The level at which the validation should occur
|
113
|
+
# * if - A block that when executed must return true of the validation will not occur
|
81
114
|
def validates_presence_of(*args)
|
82
115
|
add_validations(args, ValidatesPresenceOf)
|
83
116
|
end
|
@@ -85,6 +118,11 @@ module Validatable
|
|
85
118
|
# call-seq: include_validations_for(*args)
|
86
119
|
#
|
87
120
|
# Validates the specified attributes.
|
121
|
+
# class Person
|
122
|
+
# include Validatable
|
123
|
+
# validates_presence_of :name
|
124
|
+
# attr_accessor :name
|
125
|
+
# end
|
88
126
|
#
|
89
127
|
# class PersonPresenter
|
90
128
|
# include Validatable
|
@@ -95,6 +133,10 @@ module Validatable
|
|
95
133
|
# @person = person
|
96
134
|
# end
|
97
135
|
# end
|
136
|
+
#
|
137
|
+
# presenter = PersonPresenter.new(Person.new)
|
138
|
+
# presenter.valid? #=> false
|
139
|
+
# presenter.errors.on(:name) #=> "can't be blank"
|
98
140
|
#
|
99
141
|
# The person attribute will be validated. If person is invalid the errors will be added to the PersonPresenter errors collection.
|
100
142
|
def include_validations_for(*args)
|
@@ -123,6 +165,10 @@ module Validatable
|
|
123
165
|
end
|
124
166
|
end
|
125
167
|
|
168
|
+
def validations #:nodoc:
|
169
|
+
@validations ||= []
|
170
|
+
end
|
171
|
+
|
126
172
|
protected
|
127
173
|
def add_validations(args, klass) #:nodoc:
|
128
174
|
options = args.last.is_a?(Hash) ? args.pop : {}
|
@@ -136,10 +182,6 @@ module Validatable
|
|
136
182
|
def children_to_validate #:nodoc:
|
137
183
|
@children_to_validate ||= []
|
138
184
|
end
|
139
|
-
|
140
|
-
def validations #:nodoc:
|
141
|
-
@validations ||= []
|
142
|
-
end
|
143
185
|
end
|
144
186
|
|
145
187
|
def self.included(klass) #:nodoc:
|
@@ -151,8 +193,8 @@ module Validatable
|
|
151
193
|
# Returns true if no errors were added otherwise false.
|
152
194
|
def valid?
|
153
195
|
errors.clear
|
154
|
-
self.class.validate(self)
|
155
196
|
self.class.validate_children(self)
|
197
|
+
self.validate
|
156
198
|
errors.empty?
|
157
199
|
end
|
158
200
|
|
@@ -162,4 +204,28 @@ module Validatable
|
|
162
204
|
def errors
|
163
205
|
@errors ||= Validatable::Errors.new
|
164
206
|
end
|
207
|
+
|
208
|
+
protected
|
209
|
+
def validate #:nodoc:
|
210
|
+
validation_levels.sort.each do |level|
|
211
|
+
validations_for_level(level).each do |validation|
|
212
|
+
if validation.should_validate?(self)
|
213
|
+
self.errors.add(validation.attribute, validation.message) unless validation.valid?(self)
|
214
|
+
end
|
215
|
+
end
|
216
|
+
return unless self.errors.empty?
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def validation_levels #:nodoc:
|
221
|
+
self.validations.collect { |validation| validation.level }.uniq
|
222
|
+
end
|
223
|
+
|
224
|
+
def validations_for_level(level) #:nodoc:
|
225
|
+
self.validations.select { |validation| validation.level == level }
|
226
|
+
end
|
227
|
+
|
228
|
+
def validations #:nodoc:
|
229
|
+
@validations ||= self.class.validations.collect { |validation| validation.dup }
|
230
|
+
end
|
165
231
|
end
|
data/rakefile.rb
CHANGED
@@ -29,7 +29,7 @@ Gem::manage_gems
|
|
29
29
|
specification = Gem::Specification.new do |s|
|
30
30
|
s.name = "validatable"
|
31
31
|
s.summary = "Validatable is a library for adding validations."
|
32
|
-
s.version = "1.1.
|
32
|
+
s.version = "1.1.1"
|
33
33
|
s.author = 'Jay Fields'
|
34
34
|
s.description = "Validatable is a library for adding validations."
|
35
35
|
s.email = 'validatable-developer@rubyforge.org'
|
@@ -33,6 +33,18 @@ module Functional
|
|
33
33
|
instance.valid?
|
34
34
|
end
|
35
35
|
|
36
|
+
expect false do
|
37
|
+
klass = Class.new do
|
38
|
+
include Validatable
|
39
|
+
validates_presence_of :name, :times => 1
|
40
|
+
attr_accessor :name
|
41
|
+
end
|
42
|
+
instance1 = klass.new
|
43
|
+
instance1.valid?
|
44
|
+
instance2 = klass.new
|
45
|
+
instance2.valid?
|
46
|
+
end
|
47
|
+
|
36
48
|
expect "name message" do
|
37
49
|
klass = Class.new do
|
38
50
|
include Validatable
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.0
|
3
3
|
specification_version: 1
|
4
4
|
name: validatable
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.1.
|
7
|
-
date: 2007-02-
|
6
|
+
version: 1.1.1
|
7
|
+
date: 2007-02-13 00:00:00 -05:00
|
8
8
|
summary: Validatable is a library for adding validations.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -25,6 +25,7 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
25
25
|
platform: ruby
|
26
26
|
signing_key:
|
27
27
|
cert_chain:
|
28
|
+
post_install_message:
|
28
29
|
authors:
|
29
30
|
- Jay Fields
|
30
31
|
files:
|