validatable 1.5.2 → 1.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -22,6 +22,11 @@ module Validatable
22
22
  end
23
23
  end
24
24
 
25
+ def all_validations
26
+ return validations + self.superclass.validations if self.superclass.respond_to? :validations
27
+ validations
28
+ end
29
+
25
30
  def validations
26
31
  @validations ||= []
27
32
  end
@@ -65,12 +65,12 @@ module Validatable
65
65
  end
66
66
 
67
67
  def validations_for_level_and_group(level, group) #:nodoc:
68
- validations_for_level = self.class.validations.select { |validation| validation.level == level }
68
+ validations_for_level = self.class.all_validations.select { |validation| validation.level == level }
69
69
  return validations_for_level.select { |validation| validation.groups.empty? } if group.nil?
70
70
  validations_for_level.select { |validation| validation.groups.include?(group) }
71
71
  end
72
72
 
73
73
  def validation_levels #:nodoc:
74
- self.class.validations.inject([1]) { |accum,validation| accum << validation.level }.uniq.sort
74
+ self.class.all_validations.inject([1]) { |result, validation| result << validation.level }.uniq.sort
75
75
  end
76
76
  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.5.2"
32
+ s.version = "1.6.0"
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'
@@ -38,7 +38,7 @@ specification = Gem::Specification.new do |s|
38
38
 
39
39
  s.has_rdoc = true
40
40
  s.extra_rdoc_files = ['README']
41
- s.rdoc_options << '--title' << 'SQL DSL' << '--main' << 'README' << '--line-numbers'
41
+ s.rdoc_options << '--title' << 'Validatable' << '--main' << 'README' << '--line-numbers'
42
42
 
43
43
  s.autorequire = 'validatable'
44
44
  s.files = FileList['{lib,test}/**/*.rb', '[A-Z]*$', 'rakefile.rb'].to_a
@@ -1,299 +1,321 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
2
2
 
3
- module Functional
4
- class ValidatableTest < Test::Unit::TestCase
5
-
6
- expect ArgumentError do
7
- Class.new do
8
- include Validatable
9
- attr_accessor :name
10
- validates_presence_of :name, :times => 1
11
- validates_presence_of :name, :times => 1
12
- end
13
- end
14
-
15
- expect ArgumentError do
16
- Class.new do
17
- include Validatable
18
- attr_accessor :name
19
- validates_presence_of :name, :times => 1, :key => 'anything'
20
- validates_presence_of :name, :times => 1, :key => 'anything'
21
- end
3
+ functional_tests do
4
+
5
+ expect false do
6
+ klass = Class.new do
7
+ include Validatable
8
+ attr_accessor :name
9
+ validates_presence_of :name
22
10
  end
23
-
24
- expect "is invalid" do
25
- child_class = Class.new do
26
- include Validatable
27
- attr_accessor :name, :address
28
- validates_presence_of :name
29
- validates_format_of :address, :with => /.+/
30
- end
31
- klass = Class.new do
32
- include Validatable
33
- include_validations_for :child
34
- define_method :child do
35
- child_class.new
36
- end
37
- end
38
- instance = klass.new
39
- instance.valid?
40
- instance.errors.on(:address)
41
- end
42
-
43
- expect "can't be empty" do
44
- child_class = Class.new do
45
- include Validatable
46
- attr_accessor :name, :address
47
- validates_presence_of :name
48
- validates_format_of :address, :with => /.+/
49
- end
50
- klass = Class.new do
51
- include Validatable
52
- include_validations_for :child
53
- define_method :child do
54
- child_class.new
55
- end
56
- end
57
- instance = klass.new
58
- instance.valid?
59
- instance.errors.on(:name)
60
- end
61
-
62
-
63
- test "when child validations have errors, level 2 and higher parent validations are not performed" do
64
- child_class = Class.new do
65
- include Validatable
66
- attr_accessor :name
67
- validates_presence_of :name
68
- end
69
-
70
- klass = Class.new do
71
- include Validatable
72
- extend Forwardable
73
- def_delegator :child, :name
74
- validates_true_for :name, :logic => lambda { false }, :level => 2, :message => "invalid message"
75
- include_validations_for :child
76
- define_method :child do
77
- @child ||= child_class.new
78
- end
79
- end
80
- instance = klass.new
81
- instance.valid?
82
- assert_equal "can't be empty", instance.errors.on(:name)
11
+ subclass = Class.new klass do
83
12
  end
13
+ subclass.new.valid?
14
+ end
84
15
 
85
- test "when child validations have errors, level 1 parent validations are still performed" do
86
- child_class = Class.new do
87
- include Validatable
88
- attr_accessor :name
89
- validates_presence_of :name
90
- end
16
+ expect true do
17
+ klass = Class.new do
18
+ include Validatable
19
+ attr_accessor :name
20
+ validates_presence_of :name
21
+ end
22
+ subclass = Class.new klass do
23
+ end
24
+ instance = subclass.new
25
+ instance.name = 'a name'
26
+ instance.valid?
27
+ end
91
28
 
92
- klass = Class.new do
93
- include Validatable
94
- validates_true_for :address, :logic => lambda { false }, :level => 1, :message => "invalid message"
95
- include_validations_for :child
96
- define_method :child do
97
- @child ||= child_class.new
98
- end
29
+ expect ArgumentError do
30
+ Class.new do
31
+ include Validatable
32
+ attr_accessor :name
33
+ validates_presence_of :name, :times => 1
34
+ validates_presence_of :name, :times => 1
35
+ end
36
+ end
99
37
 
100
- end
101
- instance = klass.new
102
- instance.valid?
103
- assert_equal "can't be empty", instance.errors.on(:name)
104
- assert_equal "invalid message", instance.errors.on(:address)
38
+ expect ArgumentError do
39
+ Class.new do
40
+ include Validatable
41
+ attr_accessor :name
42
+ validates_presence_of :name, :times => 1, :key => 'anything'
43
+ validates_presence_of :name, :times => 1, :key => 'anything'
105
44
  end
106
-
107
- expect "can't be empty" do
108
- child_class = Class.new do
109
- include Validatable
110
- attr_accessor :name, :address
111
- validates_presence_of :name
112
- end
113
- klass = Class.new do
114
- include Validatable
115
- include_validations_for :child, :map => {:name => :namen}
116
- define_method :child do
117
- child_class.new
118
- end
119
- end
120
- instance = klass.new
121
- instance.valid?
122
- instance.errors.on(:namen)
123
- end
124
-
125
- expect "can't be empty" do
126
- child_class = Class.new do
127
- include Validatable
128
- attr_accessor :name, :address
129
- validates_presence_of :name
130
- end
131
- klass = Class.new do
132
- include Validatable
133
- include_validations_for :child, :if => lambda { true }
134
- define_method :child do
135
- child_class.new
136
- end
137
- end
138
- instance = klass.new
139
- instance.valid?
140
- instance.errors.on(:name)
141
- end
142
-
143
- expect true do
144
- child_class = Class.new do
145
- include Validatable
146
- attr_accessor :name, :address
147
- validates_presence_of :name
148
- end
149
- klass = Class.new do
150
- include Validatable
151
- include_validations_for :child, :if => lambda { false }
152
- define_method :child do
153
- child_class.new
154
- end
155
- end
156
- instance = klass.new
157
- instance.valid?
158
- end
159
-
160
- test "classes only have valid_for_* methods for groups that appear in their validations" do
161
- class_with_group_one = Class.new do
162
- include Validatable
163
- validates_presence_of :name, :groups => :group_one
164
- attr_accessor :name
165
- end
166
- class_with_group_two = Class.new do
167
- include Validatable
168
- validates_presence_of :name, :groups => :group_two
169
- attr_accessor :name
170
- end
171
- assert_equal false, class_with_group_one.public_instance_methods.include?(:valid_for_group_two?)
172
- assert_equal false, class_with_group_two.public_instance_methods.include?(:valid_for_group_one?)
173
- end
174
-
175
- test "nonmatching groups are not used as validations" do
176
- klass = Class.new do
177
- include Validatable
178
- validates_presence_of :name, :groups => :group_one
179
- validates_presence_of :address, :groups => :group_two
180
- attr_accessor :name, :address
181
- end
182
- instance = klass.new
183
- assert_equal nil, instance.errors.on(:name)
184
- end
185
-
186
- expect "can't be empty twice changed message" do
187
- klass = Class.new do
188
- include Validatable
189
- validates_presence_of :name
190
- attr_accessor :name
191
- end
192
-
193
- Validatable::ValidationBase.class_eval do
194
- after_validate do |result, instance, attribute|
195
- instance.errors.add(attribute, " changed message")
196
- end
197
- end
198
- Validatable::ValidatesPresenceOf.class_eval do
199
- after_validate do |result, instance, attribute|
200
- instance.errors.add(attribute, " twice")
201
- end
45
+ end
46
+
47
+ expect "is invalid" do
48
+ child_class = Class.new do
49
+ include Validatable
50
+ attr_accessor :name, :address
51
+ validates_presence_of :name
52
+ validates_format_of :address, :with => /.+/
53
+ end
54
+ klass = Class.new do
55
+ include Validatable
56
+ include_validations_for :child
57
+ define_method :child do
58
+ child_class.new
202
59
  end
203
- instance = klass.new
204
- instance.valid?
205
- Validatable::ValidatesPresenceOf.after_validations.clear
206
- Validatable::ValidationBase.after_validations.clear
207
- instance.errors.on(:name).join
208
60
  end
61
+ instance = klass.new
62
+ instance.valid?
63
+ instance.errors.on(:address)
64
+ end
209
65
 
210
- expect false do
211
- klass = Class.new do
212
- include Validatable
213
- validates_presence_of :name, :groups => :group_one
214
- attr_accessor :name
66
+ expect "can't be empty" do
67
+ child_class = Class.new do
68
+ include Validatable
69
+ attr_accessor :name, :address
70
+ validates_presence_of :name
71
+ validates_format_of :address, :with => /.+/
72
+ end
73
+ klass = Class.new do
74
+ include Validatable
75
+ include_validations_for :child
76
+ define_method :child do
77
+ child_class.new
215
78
  end
216
- instance = klass.new
217
- instance.valid_for_group_one?
218
- end
219
-
220
- expect false do
221
- klass = Class.new do
222
- include Validatable
223
- validates_presence_of :name, :groups => [:group_one, :group_two]
224
- attr_accessor :name
79
+ end
80
+ instance = klass.new
81
+ instance.valid?
82
+ instance.errors.on(:name)
83
+ end
84
+
85
+
86
+ test "when child validations have errors, level 2 and higher parent validations are not performed" do
87
+ child_class = Class.new do
88
+ include Validatable
89
+ attr_accessor :name
90
+ validates_presence_of :name
91
+ end
92
+
93
+ klass = Class.new do
94
+ include Validatable
95
+ extend Forwardable
96
+ def_delegator :child, :name
97
+ validates_true_for :name, :logic => lambda { false }, :level => 2, :message => "invalid message"
98
+ include_validations_for :child
99
+ define_method :child do
100
+ @child ||= child_class.new
225
101
  end
226
- instance = klass.new
227
- instance.valid_for_group_one?
228
- end
229
-
230
- expect true do
231
- klass = Class.new do
232
- include Validatable
233
- validates_presence_of :name, :groups => :group_one
234
- validates_presence_of :address
235
- attr_accessor :name, :address
102
+ end
103
+ instance = klass.new
104
+ instance.valid?
105
+ assert_equal "can't be empty", instance.errors.on(:name)
106
+ end
107
+
108
+ test "when child validations have errors, level 1 parent validations are still performed" do
109
+ child_class = Class.new do
110
+ include Validatable
111
+ attr_accessor :name
112
+ validates_presence_of :name
113
+ end
114
+
115
+ klass = Class.new do
116
+ include Validatable
117
+ validates_true_for :address, :logic => lambda { false }, :level => 1, :message => "invalid message"
118
+ include_validations_for :child
119
+ define_method :child do
120
+ @child ||= child_class.new
236
121
  end
237
- instance = klass.new
238
- instance.address = 'anything'
239
- instance.valid?
240
- end
241
-
242
- expect true do
243
- klass = Class.new do
244
- include Validatable
245
- validates_presence_of :name, :groups => :group_one
246
- attr_accessor :name
122
+
123
+ end
124
+ instance = klass.new
125
+ instance.valid?
126
+ assert_equal "can't be empty", instance.errors.on(:name)
127
+ assert_equal "invalid message", instance.errors.on(:address)
128
+ end
129
+
130
+ expect "can't be empty" do
131
+ child_class = Class.new do
132
+ include Validatable
133
+ attr_accessor :name, :address
134
+ validates_presence_of :name
135
+ end
136
+ klass = Class.new do
137
+ include Validatable
138
+ include_validations_for :child, :map => {:name => :namen}
139
+ define_method :child do
140
+ child_class.new
247
141
  end
248
- instance = klass.new
249
- instance.valid?
250
- end
251
-
252
- expect true do
253
- klass = Class.new do
254
- include Validatable
255
- validates_presence_of :name, :times => 1
256
- attr_accessor :name
142
+ end
143
+ instance = klass.new
144
+ instance.valid?
145
+ instance.errors.on(:namen)
146
+ end
147
+
148
+ expect "can't be empty" do
149
+ child_class = Class.new do
150
+ include Validatable
151
+ attr_accessor :name, :address
152
+ validates_presence_of :name
153
+ end
154
+ klass = Class.new do
155
+ include Validatable
156
+ include_validations_for :child, :if => lambda { true }
157
+ define_method :child do
158
+ child_class.new
257
159
  end
258
- instance = klass.new
259
- instance.valid?
260
- instance.valid?
261
- end
262
-
263
- expect false do
264
- klass = Class.new do
265
- include Validatable
266
- validates_presence_of :name, :times => 1
267
- attr_accessor :name
160
+ end
161
+ instance = klass.new
162
+ instance.valid?
163
+ instance.errors.on(:name)
164
+ end
165
+
166
+ expect true do
167
+ child_class = Class.new do
168
+ include Validatable
169
+ attr_accessor :name, :address
170
+ validates_presence_of :name
171
+ end
172
+ klass = Class.new do
173
+ include Validatable
174
+ include_validations_for :child, :if => lambda { false }
175
+ define_method :child do
176
+ child_class.new
268
177
  end
269
- instance1 = klass.new
270
- instance1.valid?
271
- instance2 = klass.new
272
- instance2.valid?
273
- end
274
-
275
- expect "name message" do
276
- klass = Class.new do
277
- include Validatable
278
- validates_presence_of :name, :level => 1, :message => "name message"
279
- validates_presence_of :address, :level => 2
280
- attr_accessor :name, :address
178
+ end
179
+ instance = klass.new
180
+ instance.valid?
181
+ end
182
+
183
+ test "classes only have valid_for_* methods for groups that appear in their validations" do
184
+ class_with_group_one = Class.new do
185
+ include Validatable
186
+ validates_presence_of :name, :groups => :group_one
187
+ attr_accessor :name
188
+ end
189
+ class_with_group_two = Class.new do
190
+ include Validatable
191
+ validates_presence_of :name, :groups => :group_two
192
+ attr_accessor :name
193
+ end
194
+ assert_equal false, class_with_group_one.public_instance_methods.include?(:valid_for_group_two?)
195
+ assert_equal false, class_with_group_two.public_instance_methods.include?(:valid_for_group_one?)
196
+ end
197
+
198
+ test "nonmatching groups are not used as validations" do
199
+ klass = Class.new do
200
+ include Validatable
201
+ validates_presence_of :name, :groups => :group_one
202
+ validates_presence_of :address, :groups => :group_two
203
+ attr_accessor :name, :address
204
+ end
205
+ instance = klass.new
206
+ assert_equal nil, instance.errors.on(:name)
207
+ end
208
+
209
+ expect "can't be empty twice changed message" do
210
+ klass = Class.new do
211
+ include Validatable
212
+ validates_presence_of :name
213
+ attr_accessor :name
214
+ end
215
+
216
+ Validatable::ValidationBase.class_eval do
217
+ after_validate do |result, instance, attribute|
218
+ instance.errors.add(attribute, " changed message")
281
219
  end
282
- instance = klass.new
283
- instance.valid?
284
- instance.errors.on(:name)
285
- end
286
-
287
- expect nil do
288
- klass = Class.new do
289
- include Validatable
290
- validates_presence_of :name, :level => 1, :message => "name message"
291
- validates_presence_of :address, :level => 2
292
- attr_accessor :name, :address
220
+ end
221
+ Validatable::ValidatesPresenceOf.class_eval do
222
+ after_validate do |result, instance, attribute|
223
+ instance.errors.add(attribute, " twice")
293
224
  end
294
- instance = klass.new
295
- instance.valid?
296
- instance.errors.on(:address)
297
225
  end
226
+ instance = klass.new
227
+ instance.valid?
228
+ Validatable::ValidatesPresenceOf.after_validations.clear
229
+ Validatable::ValidationBase.after_validations.clear
230
+ instance.errors.on(:name).join
231
+ end
232
+
233
+ expect false do
234
+ klass = Class.new do
235
+ include Validatable
236
+ validates_presence_of :name, :groups => :group_one
237
+ attr_accessor :name
238
+ end
239
+ instance = klass.new
240
+ instance.valid_for_group_one?
241
+ end
242
+
243
+ expect false do
244
+ klass = Class.new do
245
+ include Validatable
246
+ validates_presence_of :name, :groups => [:group_one, :group_two]
247
+ attr_accessor :name
248
+ end
249
+ instance = klass.new
250
+ instance.valid_for_group_one?
251
+ end
252
+
253
+ expect true do
254
+ klass = Class.new do
255
+ include Validatable
256
+ validates_presence_of :name, :groups => :group_one
257
+ validates_presence_of :address
258
+ attr_accessor :name, :address
259
+ end
260
+ instance = klass.new
261
+ instance.address = 'anything'
262
+ instance.valid?
263
+ end
264
+
265
+ expect true do
266
+ klass = Class.new do
267
+ include Validatable
268
+ validates_presence_of :name, :groups => :group_one
269
+ attr_accessor :name
270
+ end
271
+ instance = klass.new
272
+ instance.valid?
273
+ end
274
+
275
+ expect true do
276
+ klass = Class.new do
277
+ include Validatable
278
+ validates_presence_of :name, :times => 1
279
+ attr_accessor :name
280
+ end
281
+ instance = klass.new
282
+ instance.valid?
283
+ instance.valid?
284
+ end
285
+
286
+ expect false do
287
+ klass = Class.new do
288
+ include Validatable
289
+ validates_presence_of :name, :times => 1
290
+ attr_accessor :name
291
+ end
292
+ instance1 = klass.new
293
+ instance1.valid?
294
+ instance2 = klass.new
295
+ instance2.valid?
296
+ end
297
+
298
+ expect "name message" do
299
+ klass = Class.new do
300
+ include Validatable
301
+ validates_presence_of :name, :level => 1, :message => "name message"
302
+ validates_presence_of :address, :level => 2
303
+ attr_accessor :name, :address
304
+ end
305
+ instance = klass.new
306
+ instance.valid?
307
+ instance.errors.on(:name)
308
+ end
309
+
310
+ expect nil do
311
+ klass = Class.new do
312
+ include Validatable
313
+ validates_presence_of :name, :level => 1, :message => "name message"
314
+ validates_presence_of :address, :level => 2
315
+ attr_accessor :name, :address
316
+ end
317
+ instance = klass.new
318
+ instance.valid?
319
+ instance.errors.on(:address)
298
320
  end
299
- end
321
+ end
data/test/test_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'test/unit'
2
2
  require 'rubygems'
3
3
  require 'mocha'
4
+ require 'dust'
4
5
  require 'set'
5
6
 
6
7
  require File.dirname(__FILE__) + '/../lib/validatable'
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
3
3
  specification_version: 1
4
4
  name: validatable
5
5
  version: !ruby/object:Gem::Version
6
- version: 1.5.2
7
- date: 2007-06-19 00:00:00 -04:00
6
+ version: 1.6.0
7
+ date: 2007-08-14 00:00:00 -04:00
8
8
  summary: Validatable is a library for adding validations.
9
9
  require_paths:
10
10
  - lib
@@ -77,7 +77,7 @@ test_files:
77
77
  - test/all_tests.rb
78
78
  rdoc_options:
79
79
  - --title
80
- - SQL DSL
80
+ - Validatable
81
81
  - --main
82
82
  - README
83
83
  - --line-numbers