sequel 2.8.0 → 2.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. data/CHANGELOG +34 -0
  2. data/COPYING +1 -1
  3. data/Rakefile +1 -1
  4. data/bin/sequel +12 -5
  5. data/doc/advanced_associations.rdoc +17 -3
  6. data/lib/sequel_core/adapters/informix.rb +1 -1
  7. data/lib/sequel_core/adapters/postgres.rb +12 -2
  8. data/lib/sequel_core/adapters/shared/mssql.rb +3 -1
  9. data/lib/sequel_core/adapters/shared/mysql.rb +14 -0
  10. data/lib/sequel_core/adapters/shared/oracle.rb +7 -6
  11. data/lib/sequel_core/adapters/shared/postgres.rb +170 -3
  12. data/lib/sequel_core/adapters/shared/progress.rb +1 -1
  13. data/lib/sequel_core/adapters/shared/sqlite.rb +11 -6
  14. data/lib/sequel_core/adapters/sqlite.rb +8 -0
  15. data/lib/sequel_core/dataset/sql.rb +23 -19
  16. data/lib/sequel_core/dataset/unsupported.rb +12 -0
  17. data/lib/sequel_core/schema/sql.rb +3 -1
  18. data/lib/sequel_model.rb +1 -1
  19. data/lib/sequel_model/associations.rb +1 -1
  20. data/lib/sequel_model/base.rb +2 -1
  21. data/lib/sequel_model/dataset_methods.rb +1 -1
  22. data/lib/sequel_model/eager_loading.rb +1 -1
  23. data/lib/sequel_model/exceptions.rb +7 -0
  24. data/lib/sequel_model/record.rb +22 -13
  25. data/lib/sequel_model/validations.rb +8 -4
  26. data/spec/adapters/mysql_spec.rb +17 -0
  27. data/spec/adapters/postgres_spec.rb +69 -0
  28. data/spec/adapters/sqlite_spec.rb +38 -3
  29. data/spec/integration/dataset_test.rb +51 -0
  30. data/spec/integration/schema_test.rb +4 -0
  31. data/spec/sequel_core/core_ext_spec.rb +2 -2
  32. data/spec/sequel_core/dataset_spec.rb +35 -1
  33. data/spec/sequel_core/schema_spec.rb +7 -0
  34. data/spec/sequel_model/association_reflection_spec.rb +13 -13
  35. data/spec/sequel_model/hooks_spec.rb +9 -5
  36. data/spec/sequel_model/validations_spec.rb +1 -1
  37. metadata +3 -2
@@ -248,6 +248,20 @@ context "An SQLite dataset" do
248
248
  end
249
249
  end
250
250
 
251
+ context "An SQLite numeric column" do
252
+ specify "should handle and return BigDecimal values" do
253
+ SQLITE_DB.create_table!(:d){numeric :d}
254
+ d = SQLITE_DB[:d]
255
+ d.insert(:d=>BigDecimal.new('80.0'))
256
+ d.insert(:d=>BigDecimal.new('NaN'))
257
+ d.insert(:d=>BigDecimal.new('Infinity'))
258
+ d.insert(:d=>BigDecimal.new('-Infinity'))
259
+ ds = d.all
260
+ ds.shift.should == {:d=>BigDecimal.new('80.0')}
261
+ ds.map{|x| x[:d].to_s}.should == %w'NaN Infinity -Infinity'
262
+ end
263
+ end
264
+
251
265
  context "An SQLite dataset AS clause" do
252
266
  specify "should use a string literal for :col___alias" do
253
267
  SQLITE_DB.literal(:c___a).should == "c AS 'a'"
@@ -421,7 +435,27 @@ context "A SQLite database" do
421
435
  @db[:test2] << {:name => 'mmm'}
422
436
  @db[:test2].first.should == {:name => 'mmm'}
423
437
  end
424
-
438
+
439
+ specify "should keep column attributes when dropping a column" do
440
+ @db.create_table! :test3 do
441
+ primary_key :id
442
+ text :name
443
+ integer :value
444
+ end
445
+
446
+ # This lame set of additions and deletions are to test that the primary keys
447
+ # don't get messed up when we recreate the database.
448
+ @db[:test3] << { :name => "foo", :value => 1}
449
+ @db[:test3] << { :name => "foo", :value => 2}
450
+ @db[:test3] << { :name => "foo", :value => 3}
451
+ @db[:test3].filter(:id => 2).delete
452
+
453
+ @db.drop_column :test3, :value
454
+
455
+ @db['PRAGMA table_info(?)', :test3][:id][:pk].to_i.should == 1
456
+ @db[:test3].select(:id).all.should == [{:id => 1}, {:id => 3}]
457
+ end
458
+
425
459
  specify "should not support rename_column operations" do
426
460
  proc {@db.rename_column :test2, :value, :zyx}.should raise_error(Sequel::Error)
427
461
  end
@@ -435,7 +469,8 @@ context "A SQLite database" do
435
469
  @db.add_index :test2, [:name, :value]
436
470
  end
437
471
 
438
- specify "should not support drop_index" do
439
- proc {@db.drop_index :test2, :value}.should raise_error(Sequel::Error)
472
+ specify "should support drop_index" do
473
+ @db.add_index :test2, :value, :unique => true
474
+ @db.drop_index :test2, :value
440
475
  end
441
476
  end
@@ -81,3 +81,54 @@ describe "Simple Dataset operations in transactions" do
81
81
  end
82
82
  end
83
83
  end
84
+
85
+ describe "Dataset UNION, EXCEPT, and INTERSECT" do
86
+ before do
87
+ INTEGRATION_DB.create_table!(:i1){integer :number}
88
+ INTEGRATION_DB.create_table!(:i2){integer :number}
89
+ INTEGRATION_DB.create_table!(:i3){integer :number}
90
+ @ds1 = INTEGRATION_DB[:i1]
91
+ @ds1.insert(:number=>10)
92
+ @ds1.insert(:number=>20)
93
+ @ds2 = INTEGRATION_DB[:i2]
94
+ @ds2.insert(:number=>10)
95
+ @ds2.insert(:number=>30)
96
+ @ds3 = INTEGRATION_DB[:i3]
97
+ @ds3.insert(:number=>10)
98
+ @ds3.insert(:number=>40)
99
+ clear_sqls
100
+ end
101
+
102
+ specify "should give the correct results for simple UNION, EXCEPT, and INTERSECT" do
103
+ @ds1.union(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30'
104
+ unless @ds1.class.ancestors.include?(Sequel::Dataset::UnsupportedIntersectExcept)
105
+ @ds1.except(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'20'
106
+ @ds1.intersect(@ds2).order(:number).map{|x| x[:number].to_s}.should == %w'10'
107
+ end
108
+ end
109
+
110
+ specify "should give the correct results for compound UNION, EXCEPT, and INTERSECT" do
111
+ @ds1.union(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30 40'
112
+ @ds1.union(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30 40'
113
+ unless @ds1.class.ancestors.include?(Sequel::Dataset::UnsupportedIntersectExcept)
114
+ @ds1.union(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'20 30'
115
+ @ds1.union(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 30'
116
+ @ds1.union(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 '
117
+ @ds1.union(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20'
118
+
119
+ @ds1.except(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 20 40'
120
+ @ds1.except(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'20'
121
+ @ds1.except(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'20'
122
+ @ds1.except(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10 20'
123
+ @ds1.except(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w''
124
+ @ds1.except(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'20'
125
+
126
+ @ds1.intersect(@ds2).union(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10 40'
127
+ @ds1.intersect(@ds2.union(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10'
128
+ @ds1.intersect(@ds2).except(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w''
129
+ @ds1.intersect(@ds2.except(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w''
130
+ @ds1.intersect(@ds2).intersect(@ds3).order(:number).map{|x| x[:number].to_s}.should == %w'10'
131
+ @ds1.intersect(@ds2.intersect(@ds3)).order(:number).map{|x| x[:number].to_s}.should == %w'10'
132
+ end
133
+ end
134
+ end
@@ -25,6 +25,10 @@ describe "Database schema parser" do
25
25
  INTEGRATION_DB.schema(:items, :reload=>true).should == INTEGRATION_DB.schema(nil, :reload=>true)[:items]
26
26
  end
27
27
 
28
+ specify "should raise an error when the table doesn't exist" do
29
+ proc{INTEGRATION_DB.schema(:no_table)}.should raise_error(Sequel::Error)
30
+ end
31
+
28
32
  specify "should return the schema correctly" do
29
33
  INTEGRATION_DB.create_table!(:items){integer :number}
30
34
  schema = INTEGRATION_DB.schema(:items, :reload=>true)
@@ -27,7 +27,7 @@ context "Range#interval" do
27
27
  (1..10).interval.should == 9
28
28
 
29
29
  r = rand(100000) + 10
30
- t1 = Time.now; t2 = t1 + r
30
+ t1 = Time.now.to_i; t2 = t1 + r
31
31
  (t1..t2).interval.should == r
32
32
  end
33
33
 
@@ -35,7 +35,7 @@ context "Range#interval" do
35
35
  (1...10).interval.should == 8
36
36
 
37
37
  r = rand(100000) + 10
38
- t1 = Time.now; t2 = t1 + r
38
+ t1 = Time.now.to_i; t2 = t1 + r
39
39
  (t1...t2).interval.should == r - 1
40
40
  end
41
41
  end
@@ -686,6 +686,9 @@ context "Dataset#literal" do
686
686
 
687
687
  specify "should literalize BigDecimal instances correctly" do
688
688
  @dataset.literal(BigDecimal.new("80")).should == "80.0"
689
+ @dataset.literal(BigDecimal.new("NaN")).should == "'NaN'"
690
+ @dataset.literal(BigDecimal.new("Infinity")).should == "'Infinity'"
691
+ @dataset.literal(BigDecimal.new("-Infinity")).should == "'-Infinity'"
689
692
  end
690
693
 
691
694
  specify "should raise an Error if the object can't be literalized" do
@@ -1168,6 +1171,15 @@ context "Dataset#count" do
1168
1171
  @c.sql.should == "SELECT COUNT(*) FROM (select abc from xyz) AS t1 LIMIT 1"
1169
1172
  end
1170
1173
 
1174
+ specify "should count properly when using UNION, INTERSECT, or EXCEPT" do
1175
+ @dataset.union(@dataset).count.should == 1
1176
+ @c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test UNION SELECT * FROM test) AS t1 LIMIT 1"
1177
+ @dataset.intersect(@dataset).count.should == 1
1178
+ @c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test INTERSECT SELECT * FROM test) AS t1 LIMIT 1"
1179
+ @dataset.except(@dataset).count.should == 1
1180
+ @c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test EXCEPT SELECT * FROM test) AS t1 LIMIT 1"
1181
+ end
1182
+
1171
1183
  specify "should return limit if count is greater than it" do
1172
1184
  @dataset.limit(5).count.should == 1
1173
1185
  @c.sql.should == "SELECT COUNT(*) FROM (SELECT * FROM test LIMIT 5) AS t1 LIMIT 1"
@@ -1722,7 +1734,7 @@ context "Dataset #first and #last" do
1722
1734
  end
1723
1735
  end
1724
1736
 
1725
- context "Dataset set operations" do
1737
+ context "Dataset compound operations" do
1726
1738
  setup do
1727
1739
  @a = Sequel::Dataset.new(nil).from(:a).filter(:z => 1)
1728
1740
  @b = Sequel::Dataset.new(nil).from(:b).filter(:z => 2)
@@ -1748,6 +1760,28 @@ context "Dataset set operations" do
1748
1760
  @b.except(@a, true).sql.should == \
1749
1761
  "SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1)"
1750
1762
  end
1763
+
1764
+ specify "should handle chained compound operations" do
1765
+ @a.union(@b).union(@a, true).sql.should == \
1766
+ "SELECT * FROM a WHERE (z = 1) UNION SELECT * FROM b WHERE (z = 2) UNION ALL SELECT * FROM a WHERE (z = 1)"
1767
+ @a.intersect(@b, true).intersect(@a).sql.should == \
1768
+ "SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM b WHERE (z = 2) INTERSECT SELECT * FROM a WHERE (z = 1)"
1769
+ @a.except(@b).except(@a, true).sql.should == \
1770
+ "SELECT * FROM a WHERE (z = 1) EXCEPT SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1)"
1771
+ @a.union(@b, true).intersect(@a).except(@b, true).union(@a).intersect(@b, true).except(@a).sql.should == \
1772
+ "SELECT * FROM a WHERE (z = 1) UNION ALL SELECT * FROM b WHERE (z = 2) INTERSECT SELECT * FROM a WHERE (z = 1) EXCEPT ALL SELECT * FROM b WHERE (z = 2) UNION SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM b WHERE (z = 2) EXCEPT SELECT * FROM a WHERE (z = 1)"
1773
+ end
1774
+
1775
+ specify "should use a subselect when using a compound operation with a dataset that already has a compound operation" do
1776
+ @a.union(@b.union(@a, true)).sql.should == \
1777
+ "SELECT * FROM a WHERE (z = 1) UNION SELECT * FROM (SELECT * FROM b WHERE (z = 2) UNION ALL SELECT * FROM a WHERE (z = 1))"
1778
+ @a.intersect(@b.intersect(@a), true).sql.should == \
1779
+ "SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM (SELECT * FROM b WHERE (z = 2) INTERSECT SELECT * FROM a WHERE (z = 1))"
1780
+ @a.except(@b.except(@a, true)).sql.should == \
1781
+ "SELECT * FROM a WHERE (z = 1) EXCEPT SELECT * FROM (SELECT * FROM b WHERE (z = 2) EXCEPT ALL SELECT * FROM a WHERE (z = 1))"
1782
+ @a.union(@b.intersect(@a.except(@b, true)), true).union(@a.intersect(@b.except(@a), true)).sql.should == \
1783
+ "SELECT * FROM a WHERE (z = 1) UNION ALL SELECT * FROM (SELECT * FROM b WHERE (z = 2) INTERSECT SELECT * FROM (SELECT * FROM a WHERE (z = 1) EXCEPT ALL SELECT * FROM b WHERE (z = 2))) UNION SELECT * FROM (SELECT * FROM a WHERE (z = 1) INTERSECT ALL SELECT * FROM (SELECT * FROM b WHERE (z = 2) EXCEPT SELECT * FROM a WHERE (z = 1)))"
1784
+ end
1751
1785
  end
1752
1786
 
1753
1787
  context "Dataset#[]" do
@@ -650,6 +650,13 @@ context "Schema Parser" do
650
650
  Sequel.convert_tinyint_to_bool = true
651
651
  end
652
652
 
653
+ specify "should raise an error if there are no columns" do
654
+ @db.meta_def(:schema_parse_table) do |t, opts|
655
+ []
656
+ end
657
+ proc{@db.schema(:x)}.should raise_error(Sequel::Error)
658
+ end
659
+
653
660
  specify "should parse the schema correctly for a single table" do
654
661
  sqls = @sqls
655
662
  proc{@db.schema(:x)}.should raise_error(Sequel::Error)
@@ -8,12 +8,12 @@ describe Sequel::Model::Associations::AssociationReflection, "#associated_class"
8
8
 
9
9
  it "should use the :class value if present" do
10
10
  @c.many_to_one :c, :class=>ParParent
11
- @c.association_reflection(:c).should include(:class)
11
+ @c.association_reflection(:c).keys.should include(:class)
12
12
  @c.association_reflection(:c).associated_class.should == ParParent
13
13
  end
14
14
  it "should figure out the class if the :class value is not present" do
15
15
  @c.many_to_one :c, :class=>'ParParent'
16
- @c.association_reflection(:c).should_not include(:class)
16
+ @c.association_reflection(:c).keys.should_not include(:class)
17
17
  @c.association_reflection(:c).associated_class.should == ParParent
18
18
  end
19
19
  end
@@ -26,12 +26,12 @@ describe Sequel::Model::Associations::AssociationReflection, "#primary_key" do
26
26
 
27
27
  it "should use the :primary_key value if present" do
28
28
  @c.many_to_one :c, :class=>ParParent, :primary_key=>:blah__blah
29
- @c.association_reflection(:c).should include(:primary_key)
29
+ @c.association_reflection(:c).keys.should include(:primary_key)
30
30
  @c.association_reflection(:c).primary_key.should == :blah__blah
31
31
  end
32
32
  it "should use the associated table's primary key if :primary_key is not present" do
33
33
  @c.many_to_one :c, :class=>'ParParent'
34
- @c.association_reflection(:c).should_not include(:primary_key)
34
+ @c.association_reflection(:c).keys.should_not include(:primary_key)
35
35
  @c.association_reflection(:c).primary_key.should == :id
36
36
  end
37
37
  end
@@ -41,7 +41,7 @@ describe Sequel::Model::Associations::AssociationReflection, "#reciprocal" do
41
41
  @c = Class.new(Sequel::Model)
42
42
  @d = Class.new(Sequel::Model)
43
43
  @c.many_to_one :c, :class=>@d, :reciprocal=>:xx
44
- @c.association_reflection(:c).should include(:reciprocal)
44
+ @c.association_reflection(:c).keys.should include(:reciprocal)
45
45
  @c.association_reflection(:c).reciprocal.should == :xx
46
46
  end
47
47
 
@@ -54,13 +54,13 @@ describe Sequel::Model::Associations::AssociationReflection, "#reciprocal" do
54
54
  ParParent.many_to_many :par_parent_threes
55
55
  ParParentThree.many_to_many :par_parents
56
56
 
57
- ParParent.association_reflection(:par_parent_two).should_not include(:reciprocal)
57
+ ParParent.association_reflection(:par_parent_two).keys.should_not include(:reciprocal)
58
58
  ParParent.association_reflection(:par_parent_two).reciprocal.should == :par_parents
59
- ParParentTwo.association_reflection(:par_parents).should_not include(:reciprocal)
59
+ ParParentTwo.association_reflection(:par_parents).keys.should_not include(:reciprocal)
60
60
  ParParentTwo.association_reflection(:par_parents).reciprocal.should == :par_parent_two
61
- ParParent.association_reflection(:par_parent_threes).should_not include(:reciprocal)
61
+ ParParent.association_reflection(:par_parent_threes).keys.should_not include(:reciprocal)
62
62
  ParParent.association_reflection(:par_parent_threes).reciprocal.should == :par_parents
63
- ParParentThree.association_reflection(:par_parents).should_not include(:reciprocal)
63
+ ParParentThree.association_reflection(:par_parents).keys.should_not include(:reciprocal)
64
64
  ParParentThree.association_reflection(:par_parents).reciprocal.should == :par_parent_threes
65
65
  end
66
66
  end
@@ -73,20 +73,20 @@ describe Sequel::Model::Associations::AssociationReflection, "#select" do
73
73
 
74
74
  it "should use the :select value if present" do
75
75
  @c.many_to_one :c, :class=>ParParent, :select=>[:par_parents__id]
76
- @c.association_reflection(:c).should include(:select)
76
+ @c.association_reflection(:c).keys.should include(:select)
77
77
  @c.association_reflection(:c).select.should == [:par_parents__id]
78
78
  end
79
79
  it "should be the associated_table.* if :select is not present for a many_to_many associaiton" do
80
80
  @c.many_to_many :cs, :class=>'ParParent'
81
- @c.association_reflection(:cs).should_not include(:select)
81
+ @c.association_reflection(:cs).keys.should_not include(:select)
82
82
  @c.association_reflection(:cs).select.should == :par_parents.*
83
83
  end
84
84
  it "should be if :select is not present for a many_to_one and one_to_many associaiton" do
85
85
  @c.one_to_many :cs, :class=>'ParParent'
86
- @c.association_reflection(:cs).should_not include(:select)
86
+ @c.association_reflection(:cs).keys.should_not include(:select)
87
87
  @c.association_reflection(:cs).select.should == nil
88
88
  @c.many_to_one :c, :class=>'ParParent'
89
- @c.association_reflection(:c).should_not include(:select)
89
+ @c.association_reflection(:c).keys.should_not include(:select)
90
90
  @c.association_reflection(:c).select.should == nil
91
91
  end
92
92
  end
@@ -213,7 +213,8 @@ describe "Model#before_create && Model#after_create" do
213
213
 
214
214
  specify ".create should cancel the save and raise an error if before_create returns false and raise_on_save_failure is true" do
215
215
  @c.before_create{false}
216
- proc{@c.create(:x => 2)}.should raise_error(Sequel::Error)
216
+ proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
217
+ proc{@c.create(:x => 2)}.should raise_error(Sequel::BeforeHookFailed)
217
218
  MODEL_DB.sqls.should == []
218
219
  end
219
220
 
@@ -248,7 +249,8 @@ describe "Model#before_update && Model#after_update" do
248
249
 
249
250
  specify "#save should cancel the save and raise an error if before_update returns false and raise_on_save_failure is true" do
250
251
  @c.before_update{false}
251
- proc{@c.load(:id => 2233).save}.should raise_error(Sequel::Error)
252
+ proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
253
+ proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
252
254
  MODEL_DB.sqls.should == []
253
255
  end
254
256
 
@@ -295,7 +297,8 @@ describe "Model#before_save && Model#after_save" do
295
297
 
296
298
  specify "#save should cancel the save and raise an error if before_save returns false and raise_on_save_failure is true" do
297
299
  @c.before_save{false}
298
- proc{@c.load(:id => 2233).save}.should raise_error(Sequel::Error)
300
+ proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
301
+ proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
299
302
  MODEL_DB.sqls.should == []
300
303
  end
301
304
 
@@ -334,7 +337,7 @@ describe "Model#before_destroy && Model#after_destroy" do
334
337
 
335
338
  specify "#destroy should cancel the destroy and raise an error if before_destroy returns false and raise_on_save_failure is true" do
336
339
  @c.before_destroy{false}
337
- proc{@c.load(:id => 2233).destroy}.should raise_error(Sequel::Error)
340
+ proc{@c.load(:id => 2233).destroy}.should raise_error(Sequel::BeforeHookFailed)
338
341
  MODEL_DB.sqls.should == []
339
342
  end
340
343
 
@@ -393,7 +396,8 @@ describe "Model#before_validation && Model#after_validation" do
393
396
 
394
397
  specify "#save should cancel the save and raise an error if before_validation returns false and raise_on_save_failure is true" do
395
398
  @c.before_validation{false}
396
- proc{@c.load(:id => 2233).save}.should raise_error(Sequel::Error)
399
+ proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
400
+ proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
397
401
  MODEL_DB.sqls.should == []
398
402
  end
399
403
 
@@ -897,7 +897,7 @@ describe "Model#save" do
897
897
  end
898
898
 
899
899
  specify "should raise error if validations fail and raise_on_save_faiure is true" do
900
- proc{@m.save}.should raise_error(Sequel::Error)
900
+ proc{@m.save}.should raise_error(Sequel::ValidationFailed)
901
901
  end
902
902
 
903
903
  specify "should return nil if validations fail and raise_on_save_faiure is false" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.0
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Evans
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-12-05 00:00:00 -08:00
12
+ date: 2009-01-12 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -156,6 +156,7 @@ files:
156
156
  - lib/sequel_model/record.rb
157
157
  - lib/sequel_model/schema.rb
158
158
  - lib/sequel_model/validations.rb
159
+ - lib/sequel_model/exceptions.rb
159
160
  has_rdoc: true
160
161
  homepage: http://sequel.rubyforge.org
161
162
  post_install_message: