sequel 2.8.0 → 2.9.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.
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: