validatable 1.5.2 → 1.6.0

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.
@@ -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