dm-validations 1.1.0.rc2 → 1.1.0.rc3

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.
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ source 'http://rubygems.org'
5
5
  SOURCE = ENV.fetch('SOURCE', :git).to_sym
6
6
  REPO_POSTFIX = SOURCE == :path ? '' : '.git'
7
7
  DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/datamapper'
8
- DM_VERSION = '~> 1.1.0.rc2'
8
+ DM_VERSION = '~> 1.1.0.rc3'
9
9
  DO_VERSION = '~> 0.10.2'
10
10
  DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
11
11
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0.rc2
1
+ 1.1.0.rc3
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{dm-validations}
8
- s.version = "1.1.0.rc2"
8
+ s.version = "1.1.0.rc3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Guy van den Berg"]
12
- s.date = %q{2011-03-01}
12
+ s.date = %q{2011-03-10}
13
13
  s.description = %q{Library for performing validations on DM models and pure Ruby object}
14
14
  s.email = %q{vandenberg.guy [a] gmail [d] com}
15
15
  s.extra_rdoc_files = [
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
31
31
  "lib/dm-validations/formats/url.rb",
32
32
  "lib/dm-validations/support/context.rb",
33
33
  "lib/dm-validations/support/object.rb",
34
+ "lib/dm-validations/support/ordered_hash.rb",
34
35
  "lib/dm-validations/validation_errors.rb",
35
36
  "lib/dm-validations/validators/absent_field_validator.rb",
36
37
  "lib/dm-validations/validators/acceptance_validator.rb",
@@ -165,7 +166,7 @@ Gem::Specification.new do |s|
165
166
  s.homepage = %q{http://github.com/datamapper/dm-validations}
166
167
  s.require_paths = ["lib"]
167
168
  s.rubyforge_project = %q{datamapper}
168
- s.rubygems_version = %q{1.5.2}
169
+ s.rubygems_version = %q{1.6.2}
169
170
  s.summary = %q{Library for performing validations on DM models and pure Ruby object}
170
171
  s.test_files = [
171
172
  "spec/fixtures/barcode.rb",
@@ -285,21 +286,21 @@ Gem::Specification.new do |s|
285
286
  s.specification_version = 3
286
287
 
287
288
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
288
- s.add_runtime_dependency(%q<dm-core>, ["~> 1.1.0.rc2"])
289
- s.add_development_dependency(%q<dm-types>, ["~> 1.1.0.rc2"])
289
+ s.add_runtime_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
290
+ s.add_development_dependency(%q<dm-types>, ["~> 1.1.0.rc3"])
290
291
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
291
292
  s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
292
293
  s.add_development_dependency(%q<rspec>, ["~> 1.3.1"])
293
294
  else
294
- s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc2"])
295
- s.add_dependency(%q<dm-types>, ["~> 1.1.0.rc2"])
295
+ s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
296
+ s.add_dependency(%q<dm-types>, ["~> 1.1.0.rc3"])
296
297
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
297
298
  s.add_dependency(%q<rake>, ["~> 0.8.7"])
298
299
  s.add_dependency(%q<rspec>, ["~> 1.3.1"])
299
300
  end
300
301
  else
301
- s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc2"])
302
- s.add_dependency(%q<dm-types>, ["~> 1.1.0.rc2"])
302
+ s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
303
+ s.add_dependency(%q<dm-types>, ["~> 1.1.0.rc3"])
303
304
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
304
305
  s.add_dependency(%q<rake>, ["~> 0.8.7"])
305
306
  s.add_dependency(%q<rspec>, ["~> 1.3.1"])
@@ -1,29 +1,5 @@
1
1
  require 'dm-core'
2
-
3
- begin
4
- # We need array for extract_options! which attr_accessors uses, at least in AS
5
- # 2.3.3.
6
- require 'active_support/core_ext/array'
7
- require 'active_support/core_ext/class/attribute_accessors'
8
- rescue LoadError
9
- require 'extlib/class'
10
- end
11
-
12
- begin
13
- require 'active_support/core_ext/object/blank'
14
- rescue LoadError
15
- require 'extlib/blank'
16
- end
17
-
18
- begin
19
- require 'active_support/ordered_hash'
20
- rescue LoadError
21
- require 'extlib/dictionary'
22
-
23
- module ::ActiveSupport
24
- OrderedHash = ::Dictionary
25
- end
26
- end
2
+ require 'dm-validations/support/ordered_hash'
27
3
 
28
4
  class Object
29
5
  # If receiver is callable, calls it and
@@ -74,14 +74,22 @@ module DataMapper
74
74
  # - those applied to dirty attributes only,
75
75
  # - those that should always run (presence/absence)
76
76
  # - those that don't reference any real properties (field-less
77
- # block validators)
78
-
79
- if target.kind_of?(DataMapper::Resource) and !target.new?
77
+ # block validators, validations in virtual attributes)
78
+ if target.kind_of?(DataMapper::Resource) && !target.new?
79
+ attrs = target.attributes.keys
80
80
  dirty_attrs = target.dirty_attributes.keys.map{ |p| p.name }
81
- validators = runnable_validators.select{ |v| dirty_attrs.include?(v.field_name) }
81
+ validators = runnable_validators.select{|v|
82
+ !attrs.include?(v.field_name) || dirty_attrs.include?(v.field_name)
83
+ }
84
+
85
+ # Load all lazy, not-yet-loaded properties that need validation,
86
+ # all at once.
87
+ fields_to_load = validators.map{|v|
88
+ target.class.properties[v.field_name]
89
+ }.compact.select {|p|
90
+ p.lazy? && !p.loaded?(target)
91
+ }
82
92
 
83
- # Load all lazy, not-yet-loaded properties that need validation, all at once.
84
- fields_to_load = validators.map{ |v| target.class.properties[v.field_name] }.select{ |p| p.lazy? && !p.loaded?(target) }
85
93
  target.__send__(:eager_load, fields_to_load)
86
94
 
87
95
  # Finally include any validators that should always run or don't
@@ -0,0 +1,434 @@
1
+ module DataMapper; module Validations
2
+ # TITLE:
3
+ #
4
+ # OrderedHash (originally Dictionary)
5
+ #
6
+ # AUTHORS:
7
+ #
8
+ # - Jan Molic
9
+ # - Thomas Sawyer
10
+ #
11
+ # CREDIT:
12
+ #
13
+ # - Andrew Johnson (merge, to_a, inspect, shift and Hash[])
14
+ # - Jeff Sharpe (reverse and reverse!)
15
+ # - Thomas Leitner (has_key? and key?)
16
+ #
17
+ # LICENSE:
18
+ #
19
+ # Copyright (c) 2005 Jan Molic, Thomas Sawyer
20
+ #
21
+ # Ruby License
22
+ #
23
+ # This module is free software. You may use, modify, and/or redistribute this
24
+ # software under the same terms as Ruby.
25
+ #
26
+ # This program is distributed in the hope that it will be useful, but WITHOUT
27
+ # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
28
+ # FOR A PARTICULAR PURPOSE.
29
+ #
30
+ # Originally ported from OrderHash 2.0, Copyright (c) 2005 jan molic
31
+ #
32
+ # LOG:
33
+ #
34
+ # - 2007.10.31 trans
35
+ # Fixed initialize so the constructor blocks correctly effected dictionary
36
+ # rather then just the internal hash.
37
+
38
+ # = Dictionary
39
+ #
40
+ # The Dictionary class is a Hash that preserves order.
41
+ # So it has some array-like extensions also. By defualt
42
+ # a Dictionary object preserves insertion order, but any
43
+ # order can be specified including alphabetical key order.
44
+ #
45
+ # == Usage
46
+ #
47
+ # Just require this file and use Dictionary instead of Hash.
48
+ #
49
+ # # You can do simply
50
+ # hsh = Dictionary.new
51
+ # hsh['z'] = 1
52
+ # hsh['a'] = 2
53
+ # hsh['c'] = 3
54
+ # p hsh.keys #=> ['z','a','c']
55
+ #
56
+ # # or using Dictionary[] method
57
+ # hsh = Dictionary['z', 1, 'a', 2, 'c', 3]
58
+ # p hsh.keys #=> ['z','a','c']
59
+ #
60
+ # # but this doesn't preserve order
61
+ # hsh = Dictionary['z'=>1, 'a'=>2, 'c'=>3]
62
+ # p hsh.keys #=> ['a','c','z']
63
+ #
64
+ # # Dictionary has useful extensions: push, pop and unshift
65
+ # p hsh.push('to_end', 15) #=> true, key added
66
+ # p hsh.push('to_end', 30) #=> false, already - nothing happen
67
+ # p hsh.unshift('to_begin', 50) #=> true, key added
68
+ # p hsh.unshift('to_begin', 60) #=> false, already - nothing happen
69
+ # p hsh.keys #=> ["to_begin", "a", "c", "z", "to_end"]
70
+ # p hsh.pop #=> ["to_end", 15], if nothing remains, return nil
71
+ # p hsh.keys #=> ["to_begin", "a", "c", "z"]
72
+ # p hsh.shift #=> ["to_begin", 30], if nothing remains, return nil
73
+ #
74
+ # == Usage Notes
75
+ #
76
+ # * You can use #order_by to set internal sort order.
77
+ # * #<< takes a two element [k,v] array and inserts.
78
+ # * Use ::auto which creates Dictionay sub-entries as needed.
79
+ # * And ::alpha which creates a new Dictionary sorted by key.
80
+ class OrderedHash
81
+
82
+ include Enumerable
83
+
84
+ class << self
85
+ #--
86
+ # TODO is this needed? Doesn't the super class do this?
87
+ #++
88
+ def [](*args)
89
+ hsh = new
90
+ if Hash === args[0]
91
+ hsh.replace(args[0])
92
+ elsif (args.size % 2) != 0
93
+ raise ArgumentError, "odd number of elements for Hash"
94
+ else
95
+ while !args.empty?
96
+ hsh[args.shift] = args.shift
97
+ end
98
+ end
99
+ hsh
100
+ end
101
+
102
+ # Like #new but the block sets the order.
103
+ #
104
+ def new_by(*args, &blk)
105
+ new(*args).order_by(&blk)
106
+ end
107
+
108
+ # Alternate to #new which creates a dictionary sorted by key.
109
+ #
110
+ # d = Dictionary.alpha
111
+ # d["z"] = 1
112
+ # d["y"] = 2
113
+ # d["x"] = 3
114
+ # d #=> {"x"=>3,"y"=>2,"z"=>2}
115
+ #
116
+ # This is equivalent to:
117
+ #
118
+ # Dictionary.new.order_by { |key,value| key }
119
+ def alpha(*args, &block)
120
+ new(*args, &block).order_by_key
121
+ end
122
+
123
+ # Alternate to #new which auto-creates sub-dictionaries as needed.
124
+ #
125
+ # d = Dictionary.auto
126
+ # d["a"]["b"]["c"] = "abc" #=> { "a"=>{"b"=>{"c"=>"abc"}}}
127
+ #
128
+ def auto(*args)
129
+ #AutoDictionary.new(*args)
130
+ leet = lambda { |hsh, key| hsh[key] = new(&leet) }
131
+ new(*args, &leet)
132
+ end
133
+ end
134
+
135
+ # New Dictiionary.
136
+ def initialize(*args, &blk)
137
+ @order = []
138
+ @order_by = nil
139
+ if blk
140
+ dict = self # This ensure autmatic key entry effect the
141
+ oblk = lambda{ |hsh, key| blk[dict,key] } # dictionary rather then just the interal hash.
142
+ @hash = Hash.new(*args, &oblk)
143
+ else
144
+ @hash = Hash.new(*args)
145
+ end
146
+ end
147
+
148
+ def order
149
+ reorder if @order_by
150
+ @order
151
+ end
152
+
153
+ # Keep dictionary sorted by a specific sort order.
154
+ def order_by( &block )
155
+ @order_by = block
156
+ order
157
+ self
158
+ end
159
+
160
+ # Keep dictionary sorted by key.
161
+ #
162
+ # d = Dictionary.new.order_by_key
163
+ # d["z"] = 1
164
+ # d["y"] = 2
165
+ # d["x"] = 3
166
+ # d #=> {"x"=>3,"y"=>2,"z"=>2}
167
+ #
168
+ # This is equivalent to:
169
+ #
170
+ # Dictionary.new.order_by { |key,value| key }
171
+ #
172
+ # The initializer Dictionary#alpha also provides this.
173
+ def order_by_key
174
+ @order_by = lambda { |k,v| k }
175
+ order
176
+ self
177
+ end
178
+
179
+ # Keep dictionary sorted by value.
180
+ #
181
+ # d = Dictionary.new.order_by_value
182
+ # d["z"] = 1
183
+ # d["y"] = 2
184
+ # d["x"] = 3
185
+ # d #=> {"x"=>3,"y"=>2,"z"=>2}
186
+ #
187
+ # This is equivalent to:
188
+ #
189
+ # Dictionary.new.order_by { |key,value| value }
190
+ def order_by_value
191
+ @order_by = lambda { |k,v| v }
192
+ order
193
+ self
194
+ end
195
+
196
+ #
197
+ def reorder
198
+ if @order_by
199
+ assoc = @order.collect{ |k| [k,@hash[k]] }.sort_by(&@order_by)
200
+ @order = assoc.collect{ |k,v| k }
201
+ end
202
+ @order
203
+ end
204
+
205
+ def ==(hsh2)
206
+ if hsh2.is_a?( Dictionary )
207
+ @order == hsh2.order &&
208
+ @hash == hsh2.instance_variable_get("@hash")
209
+ else
210
+ false
211
+ end
212
+ end
213
+
214
+ def [] k
215
+ @hash[ k ]
216
+ end
217
+
218
+ def fetch(k, *a, &b)
219
+ @hash.fetch(k, *a, &b)
220
+ end
221
+
222
+ # Store operator.
223
+ #
224
+ # h[key] = value
225
+ #
226
+ # Or with additional index.
227
+ #
228
+ # h[key,index] = value
229
+ def []=(k, i=nil, v=nil)
230
+ if v
231
+ insert(i,k,v)
232
+ else
233
+ store(k,i)
234
+ end
235
+ end
236
+
237
+ def insert( i,k,v )
238
+ @order.insert( i,k )
239
+ @hash.store( k,v )
240
+ end
241
+
242
+ def store( a,b )
243
+ @order.push( a ) unless @hash.has_key?( a )
244
+ @hash.store( a,b )
245
+ end
246
+
247
+ def clear
248
+ @order = []
249
+ @hash.clear
250
+ end
251
+
252
+ def delete( key )
253
+ @order.delete( key )
254
+ @hash.delete( key )
255
+ end
256
+
257
+ def each_key
258
+ order.each { |k| yield( k ) }
259
+ self
260
+ end
261
+
262
+ def each_value
263
+ order.each { |k| yield( @hash[k] ) }
264
+ self
265
+ end
266
+
267
+ def each
268
+ order.each { |k| yield( k,@hash[k] ) }
269
+ self
270
+ end
271
+ alias each_pair each
272
+
273
+ def delete_if
274
+ order.clone.each { |k| delete k if yield(k,@hash[k]) }
275
+ self
276
+ end
277
+
278
+ def values
279
+ ary = []
280
+ order.each { |k| ary.push @hash[k] }
281
+ ary
282
+ end
283
+
284
+ def keys
285
+ order
286
+ end
287
+
288
+ def invert
289
+ hsh2 = self.class.new
290
+ order.each { |k| hsh2[@hash[k]] = k }
291
+ hsh2
292
+ end
293
+
294
+ def reject( &block )
295
+ self.dup.delete_if(&block)
296
+ end
297
+
298
+ def reject!( &block )
299
+ hsh2 = reject(&block)
300
+ self == hsh2 ? nil : hsh2
301
+ end
302
+
303
+ def replace( hsh2 )
304
+ @order = hsh2.order
305
+ @hash = hsh2.hash
306
+ end
307
+
308
+ def shift
309
+ key = order.first
310
+ key ? [key,delete(key)] : super
311
+ end
312
+
313
+ def unshift( k,v )
314
+ unless @hash.include?( k )
315
+ @order.unshift( k )
316
+ @hash.store( k,v )
317
+ true
318
+ else
319
+ false
320
+ end
321
+ end
322
+
323
+ def <<(kv)
324
+ push( *kv )
325
+ end
326
+
327
+ def push( k,v )
328
+ unless @hash.include?( k )
329
+ @order.push( k )
330
+ @hash.store( k,v )
331
+ true
332
+ else
333
+ false
334
+ end
335
+ end
336
+
337
+ def pop
338
+ key = order.last
339
+ key ? [key,delete(key)] : nil
340
+ end
341
+
342
+ def inspect
343
+ ary = []
344
+ each {|k,v| ary << k.inspect + "=>" + v.inspect}
345
+ '{' + ary.join(", ") + '}'
346
+ end
347
+
348
+ def dup
349
+ a = []
350
+ each{ |k,v| a << k; a << v }
351
+ self.class[*a]
352
+ end
353
+
354
+ def update( hsh2 )
355
+ hsh2.each { |k,v| self[k] = v }
356
+ reorder
357
+ self
358
+ end
359
+ alias :merge! update
360
+
361
+ def merge( hsh2 )
362
+ self.dup.update(hsh2)
363
+ end
364
+
365
+ def select
366
+ ary = []
367
+ each { |k,v| ary << [k,v] if yield k,v }
368
+ ary
369
+ end
370
+
371
+ def reverse!
372
+ @order.reverse!
373
+ self
374
+ end
375
+
376
+ def reverse
377
+ dup.reverse!
378
+ end
379
+
380
+ def first
381
+ @hash[order.first]
382
+ end
383
+
384
+ def last
385
+ @hash[order.last]
386
+ end
387
+
388
+ def length
389
+ @order.length
390
+ end
391
+ alias :size :length
392
+
393
+ def empty?
394
+ @hash.empty?
395
+ end
396
+
397
+ def has_key?(key)
398
+ @hash.has_key?(key)
399
+ end
400
+
401
+ def key?(key)
402
+ @hash.key?(key)
403
+ end
404
+
405
+ def to_a
406
+ ary = []
407
+ each { |k,v| ary << [k,v] }
408
+ ary
409
+ end
410
+
411
+ def to_json
412
+ buf = "["
413
+ map do |k,v|
414
+ buf << k.to_json
415
+ buf << ", "
416
+ buf << v.to_json
417
+ end.join(", ")
418
+ buf << "]"
419
+ buf
420
+ end
421
+
422
+ def to_s
423
+ self.to_a.to_s
424
+ end
425
+
426
+ def to_hash
427
+ @hash.dup
428
+ end
429
+
430
+ def to_h
431
+ @hash.dup
432
+ end
433
+ end
434
+ end; end
@@ -48,7 +48,7 @@ module DataMapper
48
48
 
49
49
  def initialize(resource)
50
50
  @resource = resource
51
- @errors = ActiveSupport::OrderedHash.new { |h,k| h[k] = [] }
51
+ @errors = DataMapper::Validations::OrderedHash.new { |h,k| h[k] = [] }
52
52
  end
53
53
 
54
54
  # Clear existing validation errors.
@@ -91,12 +91,12 @@ module DataMapper
91
91
  # array of validation errors or empty array, if there are no errors on given field
92
92
  def on(field_name)
93
93
  errors_for_field = errors[field_name]
94
- errors_for_field.blank? ? nil : errors_for_field.uniq
94
+ DataMapper::Ext.blank?(errors_for_field) ? nil : errors_for_field.uniq
95
95
  end
96
96
 
97
97
  def each
98
98
  errors.map.each do |k, v|
99
- next if v.blank?
99
+ next if DataMapper::Ext.blank?(v)
100
100
  yield(v)
101
101
  end
102
102
  end
@@ -7,7 +7,8 @@ module DataMapper
7
7
  # @since 0.9
8
8
  class AbsenceValidator < GenericValidator
9
9
  def call(target)
10
- return true if target.validation_property_value(field_name).blank?
10
+ value = target.validation_property_value(field_name)
11
+ return true if DataMapper::Ext.blank?(value)
11
12
 
12
13
  error_message = self.options[:message] || ValidationErrors.default_error_message(:absent, field_name)
13
14
  add_error(target, error_message, field_name)
@@ -30,7 +30,7 @@ module DataMapper
30
30
  #
31
31
  def initialize(field_name, options = {})
32
32
  @field_name = field_name
33
- @options = options.except(:if, :unless)
33
+ @options = DataMapper::Ext::Hash.except(options, :if, :unless)
34
34
  @if_clause = options[:if]
35
35
  @unless_clause = options[:unless]
36
36
  @humanized_field_name = DataMapper::Inflector.humanize(@field_name)
@@ -99,7 +99,7 @@ module DataMapper
99
99
  def optional?(value)
100
100
  if value.nil?
101
101
  @options[:allow_nil] || (@options[:allow_blank] && !@options.has_key?(:allow_nil))
102
- elsif value.blank?
102
+ elsif DataMapper::Ext.blank?(value)
103
103
  @options[:allow_blank]
104
104
  end
105
105
  end
@@ -23,7 +23,7 @@ module DataMapper
23
23
  # Other property types are considered present if non-blank.
24
24
  # Non-properties are considered present if non-blank.
25
25
  def present?(value, property)
26
- boolean_type?(property) ? !value.nil? : !value.blank?
26
+ boolean_type?(property) ? !value.nil? : !DataMapper::Ext.blank?(value)
27
27
  end
28
28
 
29
29
  def default_error(property)
@@ -19,16 +19,19 @@ module DataMapper
19
19
  property :height, Float
20
20
  end
21
21
 
22
+ attr_accessor :owner
23
+
22
24
  #
23
25
  # Validations
24
26
  #
25
27
 
26
- validates_length_of :name, :min => 2, :allow_nil => false
28
+ validates_length_of :name, :min => 2, :allow_nil => false
29
+ validates_length_of :owner, :min => 2
27
30
 
28
31
  validates_numericality_of :height, :lt => 55.2
29
32
 
30
33
  def self.valid_instance
31
- new(:name => "Roudolf Wilde", :height => 50.4)
34
+ new(:name => "Roudolf Wilde", :height => 50.4, :owner => 'don')
32
35
  end
33
36
  end # Mittelschnauzer
34
37
  end
@@ -34,7 +34,7 @@ describe 'DataMapper::Validations::Fixtures::Kayak' do
34
34
  end
35
35
 
36
36
  it "has no error messages" do
37
- @kayak.errors.on(:salesman).should be_blank
37
+ @kayak.errors.on(:salesman).should be_nil
38
38
  end
39
39
  end
40
40
 
@@ -49,7 +49,7 @@ describe 'DataMapper::Validations::Fixtures::Kayak' do
49
49
  end
50
50
 
51
51
  it "has no error messages" do
52
- @kayak.errors.on(:salesman).should be_blank
52
+ @kayak.errors.on(:salesman).should be_nil
53
53
  end
54
54
  end
55
55
 
@@ -64,7 +64,7 @@ describe 'DataMapper::Validations::Fixtures::Kayak' do
64
64
  end
65
65
 
66
66
  it "has no error messages" do
67
- @kayak.errors.on(:salesman).should be_blank
67
+ @kayak.errors.on(:salesman).should be_nil
68
68
  end
69
69
  end
70
70
  end
@@ -41,4 +41,14 @@ describe 'DataMapper::Validations::Fixtures::Mittelschnauzer' do
41
41
 
42
42
  it_should_behave_like "entity with a name shorter than 2 characters"
43
43
  end
44
+
45
+ describe "persisted, with a single character owner" do
46
+ before :all do
47
+ @model.save
48
+ @model.owner = 'a'
49
+ @model.valid?
50
+ end
51
+
52
+ it_should_behave_like "invalid model"
53
+ end
44
54
  end
@@ -81,7 +81,7 @@ describe 'DataMapper::Validations::Fixtures::EthernetFrame' do
81
81
  it_should_behave_like "valid model"
82
82
 
83
83
  it "has blank error message" do
84
- @model.errors.on(:payload).should be_blank
84
+ @model.errors.on(:payload).should be_nil
85
85
  end
86
86
  end
87
87
  end
@@ -118,7 +118,7 @@ describe "C++" do
118
118
 
119
119
  it "is not approved by Linus" do
120
120
  @model.valid?(:hacking_on_the_kernel)
121
- @model.errors.on(:ensure_approved_by_linus_himself).should_not be_blank
121
+ @model.errors.on(:ensure_approved_by_linus_himself).should_not be_empty
122
122
  end
123
123
  end
124
124
 
@@ -107,7 +107,7 @@ describe 'PureRubyObjects::Country' do
107
107
  it_should_behave_like "object invalid in default context"
108
108
 
109
109
  it "has errors on name" do
110
- @model.errors.on(:name).should_not be_blank
110
+ @model.errors.on(:name).should_not be_empty
111
111
  end
112
112
 
113
113
  it "is valid in encyclopedia context" do
@@ -35,7 +35,7 @@ describe 'required_field_validator/boolean_type_value_spec' do
35
35
 
36
36
  it "is valid for committing" do
37
37
  @operation.should be_valid_for_committing
38
- @operation.errors.on(:network_connection).should be_blank
38
+ @operation.errors.on(:network_connection).should be_nil
39
39
  end
40
40
 
41
41
  it "is not valid for pushing" do
@@ -26,10 +26,10 @@ describe "invalid model", :shared => true do
26
26
  end
27
27
 
28
28
  it "has error messages" do
29
- @model.errors.should_not be_blank
29
+ @model.errors.should_not be_empty
30
30
  end
31
31
 
32
32
  it "has list of full error messages" do
33
- @model.errors.full_messages.should_not be_blank
33
+ @model.errors.full_messages.should_not be_empty
34
34
  end
35
35
  end
@@ -5,6 +5,14 @@ require 'dm-validations'
5
5
  require 'dm-types'
6
6
  require 'dm-migrations'
7
7
 
8
+ class Hash
9
+ def except(*keys)
10
+ hash = dup
11
+ keys.each { |key| hash.delete(key) }
12
+ hash
13
+ end
14
+ end
15
+
8
16
  SPEC_ROOT = Pathname(__FILE__).dirname
9
17
  Pathname.glob((SPEC_ROOT + 'fixtures/**/*.rb').to_s).each { |file| require file }
10
18
  Pathname.glob((SPEC_ROOT + 'integration/shared/**/*.rb').to_s).each { |file| require file }
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: dm-validations
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 6
5
- version: 1.1.0.rc2
5
+ version: 1.1.0.rc3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Guy van den Berg
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-01 00:00:00 -08:00
13
+ date: 2011-03-10 00:00:00 -08:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 1.1.0.rc2
23
+ version: 1.1.0.rc3
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: *id001
@@ -31,7 +31,7 @@ dependencies:
31
31
  requirements:
32
32
  - - ~>
33
33
  - !ruby/object:Gem::Version
34
- version: 1.1.0.rc2
34
+ version: 1.1.0.rc3
35
35
  type: :development
36
36
  prerelease: false
37
37
  version_requirements: *id002
@@ -92,6 +92,7 @@ files:
92
92
  - lib/dm-validations/formats/url.rb
93
93
  - lib/dm-validations/support/context.rb
94
94
  - lib/dm-validations/support/object.rb
95
+ - lib/dm-validations/support/ordered_hash.rb
95
96
  - lib/dm-validations/validation_errors.rb
96
97
  - lib/dm-validations/validators/absent_field_validator.rb
97
98
  - lib/dm-validations/validators/acceptance_validator.rb
@@ -246,7 +247,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
246
247
  requirements: []
247
248
 
248
249
  rubyforge_project: datamapper
249
- rubygems_version: 1.5.2
250
+ rubygems_version: 1.6.2
250
251
  signing_key:
251
252
  specification_version: 3
252
253
  summary: Library for performing validations on DM models and pure Ruby object