sequel 4.18.0 → 4.19.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +18 -0
  3. data/MIT-LICENSE +1 -1
  4. data/doc/advanced_associations.rdoc +1 -1
  5. data/doc/association_basics.rdoc +55 -34
  6. data/doc/model_hooks.rdoc +7 -5
  7. data/doc/release_notes/4.19.0.txt +45 -0
  8. data/doc/validations.rdoc +4 -0
  9. data/lib/sequel/adapters/shared/mysql.rb +5 -3
  10. data/lib/sequel/adapters/shared/sqlanywhere.rb +3 -2
  11. data/lib/sequel/dataset/sql.rb +1 -1
  12. data/lib/sequel/extensions/migration.rb +12 -8
  13. data/lib/sequel/model/associations.rb +24 -24
  14. data/lib/sequel/model/base.rb +39 -8
  15. data/lib/sequel/plugins/accessed_columns.rb +61 -0
  16. data/lib/sequel/plugins/association_pks.rb +4 -4
  17. data/lib/sequel/plugins/boolean_readers.rb +1 -1
  18. data/lib/sequel/plugins/class_table_inheritance.rb +1 -1
  19. data/lib/sequel/plugins/column_conflicts.rb +93 -0
  20. data/lib/sequel/plugins/composition.rb +3 -3
  21. data/lib/sequel/plugins/dirty.rb +6 -6
  22. data/lib/sequel/plugins/json_serializer.rb +1 -1
  23. data/lib/sequel/plugins/list.rb +4 -4
  24. data/lib/sequel/plugins/mssql_optimistic_locking.rb +1 -1
  25. data/lib/sequel/plugins/nested_attributes.rb +2 -2
  26. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  27. data/lib/sequel/plugins/pg_array_associations.rb +23 -23
  28. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -1
  29. data/lib/sequel/plugins/rcte_tree.rb +2 -2
  30. data/lib/sequel/plugins/serialization.rb +1 -1
  31. data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
  32. data/lib/sequel/plugins/timestamps.rb +2 -2
  33. data/lib/sequel/plugins/typecast_on_load.rb +1 -1
  34. data/lib/sequel/plugins/validation_class_methods.rb +4 -4
  35. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  36. data/lib/sequel/version.rb +1 -1
  37. data/spec/core/dataset_spec.rb +7 -0
  38. data/spec/extensions/accessed_columns_spec.rb +51 -0
  39. data/spec/extensions/column_conflicts_spec.rb +55 -0
  40. data/spec/extensions/hook_class_methods_spec.rb +18 -5
  41. data/spec/extensions/migration_spec.rb +4 -1
  42. data/spec/extensions/static_cache_spec.rb +3 -3
  43. data/spec/model/hooks_spec.rb +76 -9
  44. data/spec/model/record_spec.rb +43 -2
  45. metadata +8 -2
@@ -94,7 +94,7 @@ module Sequel
94
94
  # many_to_pg_array associations can have associated objects as long as they have
95
95
  # a primary key.
96
96
  def can_have_associated_objects?(obj)
97
- obj.send(self[:primary_key])
97
+ obj.get_column_value(self[:primary_key])
98
98
  end
99
99
 
100
100
  # Assume that the key in the associated table uses a version of the current
@@ -195,7 +195,7 @@ module Sequel
195
195
  # pg_array_to_many associations can only have associated objects if
196
196
  # the array field is not nil or empty.
197
197
  def can_have_associated_objects?(obj)
198
- v = obj.send(self[:key])
198
+ v = obj.get_column_value(self[:key])
199
199
  v && !v.empty?
200
200
  end
201
201
 
@@ -307,13 +307,13 @@ module Sequel
307
307
  key_column = opts[:key_column] ||= opts[:key]
308
308
  opts[:after_load].unshift(:array_uniq!) if opts[:uniq]
309
309
  opts[:dataset] ||= lambda do
310
- opts.associated_dataset.where(Sequel.pg_array_op(opts.predicate_key).contains(Sequel.pg_array([send(pk)], opts.array_type)))
310
+ opts.associated_dataset.where(Sequel.pg_array_op(opts.predicate_key).contains(Sequel.pg_array([get_column_value(pk)], opts.array_type)))
311
311
  end
312
312
  opts[:eager_loader] ||= proc do |eo|
313
313
  id_map = eo[:id_map]
314
314
 
315
315
  eager_load_results(opts, eo.merge(:loader=>false)) do |assoc_record|
316
- if pks ||= assoc_record.send(key)
316
+ if pks ||= assoc_record.get_column_value(key)
317
317
  pks.each do |pkv|
318
318
  next unless objects = id_map[pkv]
319
319
  objects.each do |object|
@@ -358,23 +358,23 @@ module Sequel
358
358
  save_opts[:raise_on_failure] = opts[:raise_on_save_failure] != false
359
359
 
360
360
  opts[:adder] ||= proc do |o|
361
- if array = o.send(key)
362
- array << send(pk)
361
+ if array = o.get_column_value(key)
362
+ array << get_column_value(pk)
363
363
  else
364
- o.send("#{key}=", Sequel.pg_array([send(pk)], opts.array_type))
364
+ o.set_column_value("#{key}=", Sequel.pg_array([get_column_value(pk)], opts.array_type))
365
365
  end
366
366
  o.save(save_opts)
367
367
  end
368
368
 
369
369
  opts[:remover] ||= proc do |o|
370
- if (array = o.send(key)) && !array.empty?
371
- array.delete(send(pk))
370
+ if (array = o.get_column_value(key)) && !array.empty?
371
+ array.delete(get_column_value(pk))
372
372
  o.save(save_opts)
373
373
  end
374
374
  end
375
375
 
376
376
  opts[:clearer] ||= proc do
377
- opts.associated_dataset.where(Sequel.pg_array_op(key).contains([send(pk)])).update(key=>Sequel.function(:array_remove, key, send(pk)))
377
+ opts.associated_dataset.where(Sequel.pg_array_op(key).contains([get_column_value(pk)])).update(key=>Sequel.function(:array_remove, key, get_column_value(pk)))
378
378
  end
379
379
  end
380
380
 
@@ -387,7 +387,7 @@ module Sequel
387
387
  opts[:eager_loader_key] = nil
388
388
  opts[:after_load].unshift(:array_uniq!) if opts[:uniq]
389
389
  opts[:dataset] ||= lambda do
390
- opts.associated_dataset.where(opts.predicate_key=>send(key).to_a)
390
+ opts.associated_dataset.where(opts.predicate_key=>get_column_value(key).to_a)
391
391
  end
392
392
  opts[:eager_loader] ||= proc do |eo|
393
393
  rows = eo[:rows]
@@ -395,7 +395,7 @@ module Sequel
395
395
  pkm = opts.primary_key_method
396
396
 
397
397
  rows.each do |object|
398
- if associated_pks = object.send(key)
398
+ if associated_pks = object.get_column_value(key)
399
399
  associated_pks.each do |apk|
400
400
  (id_map[apk] ||= []) << object
401
401
  end
@@ -403,7 +403,7 @@ module Sequel
403
403
  end
404
404
 
405
405
  eager_load_results(opts, eo.merge(:id_map=>id_map)) do |assoc_record|
406
- if objects = id_map[assoc_record.send(pkm)]
406
+ if objects = id_map[assoc_record.get_column_value(pkm)]
407
407
  objects.each do |object|
408
408
  object.associations[name].push(assoc_record)
409
409
  end
@@ -451,26 +451,26 @@ module Sequel
451
451
  end
452
452
 
453
453
  opts[:adder] ||= proc do |o|
454
- opk = o.send(opts.primary_key)
455
- if array = send(key)
454
+ opk = o.get_column_value(opts.primary_key)
455
+ if array = get_column_value(key)
456
456
  modified!(key)
457
457
  array << opk
458
458
  else
459
- send("#{key}=", Sequel.pg_array([opk], opts.array_type))
459
+ set_column_value("#{key}=", Sequel.pg_array([opk], opts.array_type))
460
460
  end
461
461
  save_after_modify.call(self) if save_after_modify
462
462
  end
463
463
 
464
464
  opts[:remover] ||= proc do |o|
465
- if (array = send(key)) && !array.empty?
465
+ if (array = get_column_value(key)) && !array.empty?
466
466
  modified!(key)
467
- array.delete(o.send(opts.primary_key))
467
+ array.delete(o.get_column_value(opts.primary_key))
468
468
  save_after_modify.call(self) if save_after_modify
469
469
  end
470
470
  end
471
471
 
472
472
  opts[:clearer] ||= proc do
473
- if (array = send(key)) && !array.empty?
473
+ if (array = get_column_value(key)) && !array.empty?
474
474
  modified!(key)
475
475
  array.clear
476
476
  save_after_modify.call(self) if save_after_modify
@@ -488,11 +488,11 @@ module Sequel
488
488
  key = ref[:key]
489
489
  expr = case obj
490
490
  when Sequel::Model
491
- if (assoc_pks = obj.send(key)) && !assoc_pks.empty?
491
+ if (assoc_pks = obj.get_column_value(key)) && !assoc_pks.empty?
492
492
  Sequel.expr(pk=>assoc_pks.to_a)
493
493
  end
494
494
  when Array
495
- if (assoc_pks = obj.map{|o| o.send(key)}.flatten.compact.uniq) && !assoc_pks.empty?
495
+ if (assoc_pks = obj.map{|o| o.get_column_value(key)}.flatten.compact.uniq) && !assoc_pks.empty?
496
496
  Sequel.expr(pk=>assoc_pks)
497
497
  end
498
498
  when Sequel::Dataset
@@ -508,11 +508,11 @@ module Sequel
508
508
  key = ref.qualify(model.table_name, ref[:key_column])
509
509
  expr = case obj
510
510
  when Sequel::Model
511
- if pkv = obj.send(ref.primary_key_method)
511
+ if pkv = obj.get_column_value(ref.primary_key_method)
512
512
  Sequel.pg_array_op(key).contains(Sequel.pg_array([pkv], ref.array_type))
513
513
  end
514
514
  when Array
515
- if (pkvs = obj.map{|o| o.send(ref.primary_key_method)}.compact) && !pkvs.empty?
515
+ if (pkvs = obj.map{|o| o.get_column_value(ref.primary_key_method)}.compact) && !pkvs.empty?
516
516
  Sequel.pg_array(key).overlaps(Sequel.pg_array(pkvs, ref.array_type))
517
517
  end
518
518
  when Sequel::Dataset
@@ -28,7 +28,7 @@ module Sequel
28
28
  # Return a bound variable hash that maps the keys in +ks+ (qualified by the +table+)
29
29
  # to the values of the results of sending the methods in +vs+.
30
30
  def association_bound_variable_hash(table, ks, vs)
31
- Hash[*ks.zip(vs).map{|k, v| [:"#{table}.#{k}", send(v)]}.flatten]
31
+ Hash[*ks.zip(vs).map{|k, v| [:"#{table}.#{k}", get_column_value(v)]}.flatten]
32
32
  end
33
33
 
34
34
  # Given an association reflection, return a bound variable hash for the given
@@ -148,7 +148,7 @@ module Sequel
148
148
  a[:read_only] = true unless a.has_key?(:read_only)
149
149
  a[:eager_loader_key] = key
150
150
  a[:dataset] ||= proc do
151
- base_ds = model.filter(prkey_array.zip(key_array.map{|k| send(k)}))
151
+ base_ds = model.filter(prkey_array.zip(key_array.map{|k| get_column_value(k)}))
152
152
  recursive_ds = model.join(t, key_array.zip(prkey_array))
153
153
  if c = a[:conditions]
154
154
  (base_ds, recursive_ds) = [base_ds, recursive_ds].collect do |ds|
@@ -243,7 +243,7 @@ module Sequel
243
243
  d[:read_only] = true unless d.has_key?(:read_only)
244
244
  la = d[:level_alias] ||= :x_level_x
245
245
  d[:dataset] ||= proc do
246
- base_ds = model.filter(key_array.zip(prkey_array.map{|k| send(k)}))
246
+ base_ds = model.filter(key_array.zip(prkey_array.map{|k| get_column_value(k)}))
247
247
  recursive_ds = model.join(t, prkey_array.zip(key_array))
248
248
  if c = d[:conditions]
249
249
  (base_ds, recursive_ds) = [base_ds, recursive_ds].collect do |ds|
@@ -163,7 +163,7 @@ module Sequel
163
163
  end
164
164
  end
165
165
  define_method("#{column}=") do |v|
166
- if !changed_columns.include?(column) && (new? || send(column) != v)
166
+ if !changed_columns.include?(column) && (new? || get_column_value(column) != v)
167
167
  changed_columns << column
168
168
  end
169
169
 
@@ -220,7 +220,7 @@ module Sequel
220
220
  # Set the sti_key column based on the sti_key_map.
221
221
  def _before_validation
222
222
  if new? && !self[model.sti_key]
223
- send("#{model.sti_key}=", model.sti_key_chooser.call(self))
223
+ set_column_value("#{model.sti_key}=", model.sti_key_chooser.call(self))
224
224
  end
225
225
  super
226
226
  end
@@ -79,7 +79,7 @@ module Sequel
79
79
  def set_create_timestamp(time=nil)
80
80
  field = model.create_timestamp_field
81
81
  meth = :"#{field}="
82
- self.send(meth, time||=model.dataset.current_datetime) if respond_to?(field) && respond_to?(meth) && (model.create_timestamp_overwrite? || send(field).nil?)
82
+ set_column_value(meth, time||=model.dataset.current_datetime) if respond_to?(field) && respond_to?(meth) && (model.create_timestamp_overwrite? || get_column_value(field).nil?)
83
83
  set_update_timestamp(time) if model.set_update_timestamp_on_create?
84
84
  end
85
85
 
@@ -87,7 +87,7 @@ module Sequel
87
87
  # object has a setter method for the update timestamp field.
88
88
  def set_update_timestamp(time=nil)
89
89
  meth = :"#{model.update_timestamp_field}="
90
- self.send(meth, time||model.dataset.current_datetime) if respond_to?(meth)
90
+ set_column_value(meth, time||model.dataset.current_datetime) if respond_to?(meth)
91
91
  end
92
92
  end
93
93
  end
@@ -51,7 +51,7 @@ module Sequel
51
51
  def load_typecast
52
52
  model.typecast_on_load_columns.each do |c|
53
53
  if v = values[c]
54
- send("#{c}=", v)
54
+ set_column_value("#{c}=", v)
55
55
  end
56
56
  end
57
57
  changed_columns.clear
@@ -103,9 +103,9 @@ module Sequel
103
103
  validations.each do |att, procs|
104
104
  v = case att
105
105
  when Array
106
- att.collect{|a| o.send(a)}
106
+ att.collect{|a| o.get_column_value(a)}
107
107
  else
108
- o.send(att)
108
+ o.get_column_value(att)
109
109
  end
110
110
  procs.each {|tag, p| p.call(o, att, v)}
111
111
  end
@@ -150,7 +150,7 @@ module Sequel
150
150
  reflect_validation(:confirmation, opts, atts)
151
151
  atts << opts
152
152
  validates_each(*atts) do |o, a, v|
153
- o.errors.add(a, opts[:message]) unless v == o.send(:"#{a}_confirmation")
153
+ o.errors.add(a, opts[:message]) unless v == o.get_column_value(:"#{a}_confirmation")
154
154
  end
155
155
  end
156
156
 
@@ -418,7 +418,7 @@ module Sequel
418
418
  def validation_if_proc(o, i)
419
419
  case i
420
420
  when Symbol
421
- o.send(i)
421
+ o.get_column_value(i)
422
422
  when Proc
423
423
  o.instance_eval(&i)
424
424
  else
@@ -236,7 +236,7 @@ module Sequel
236
236
  ds = if where
237
237
  where.call(ds, self, arr)
238
238
  else
239
- vals = arr.map{|x| send(x)}
239
+ vals = arr.map{|x| get_column_value(x)}
240
240
  next if vals.any?{|v| v.nil?}
241
241
  ds.where(arr.zip(vals))
242
242
  end
@@ -267,7 +267,7 @@ module Sequel
267
267
  am, an, ab, m = opts.values_at(:allow_missing, :allow_nil, :allow_blank, :message)
268
268
  Array(atts).each do |a|
269
269
  next if am && !values.has_key?(a)
270
- v = send(a)
270
+ v = get_column_value(a)
271
271
  next if an && v.nil?
272
272
  next if ab && v.respond_to?(:blank?) && v.blank?
273
273
  if message = yield(a, v, m)
@@ -3,7 +3,7 @@ module Sequel
3
3
  MAJOR = 4
4
4
  # The minor version of Sequel. Bumped for every non-patch level
5
5
  # release, generally around once a month.
6
- MINOR = 18
6
+ MINOR = 19
7
7
  # The tiny version of Sequel. Usually 0, only bumped for bugfix
8
8
  # releases that fix regressions from previous versions.
9
9
  TINY = 0
@@ -2619,6 +2619,13 @@ describe "Dataset compound operations" do
2619
2619
  "SELECT * FROM (SELECT * FROM (SELECT * FROM test ORDER BY a LIMIT 2) AS t1 UNION SELECT * FROM (SELECT * FROM test ORDER BY b LIMIT 3) AS t1) AS t1 ORDER BY c LIMIT 4"
2620
2620
  end
2621
2621
 
2622
+ specify "should handle raw SQL datasets properly when using UNION, INTERSECT, or EXCEPT" do
2623
+ @dataset = Sequel.mock['SELECT 1']
2624
+ @dataset.union(@dataset).sql.should == "SELECT * FROM (SELECT * FROM (SELECT 1) AS t1 UNION SELECT * FROM (SELECT 1) AS t1) AS t1"
2625
+ @dataset.intersect(@dataset).sql.should == "SELECT * FROM (SELECT * FROM (SELECT 1) AS t1 INTERSECT SELECT * FROM (SELECT 1) AS t1) AS t1"
2626
+ @dataset.except(@dataset).sql.should == "SELECT * FROM (SELECT * FROM (SELECT 1) AS t1 EXCEPT SELECT * FROM (SELECT 1) AS t1) AS t1"
2627
+ end
2628
+
2622
2629
  specify "should hoist WITH clauses in given dataset if dataset doesn't support WITH in subselect" do
2623
2630
  ds = Sequel.mock.dataset
2624
2631
  meta_def(ds, :supports_cte?){true}
@@ -0,0 +1,51 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "accessed_columns plugin" do
4
+ before do
5
+ @db = Sequel.mock(:fetch=>{:name=>'a', :b=>'c'}, :numrows=>1)
6
+ @c = Class.new(Sequel::Model(@db[:test]))
7
+ @c.columns :name, :b
8
+ @c.plugin :accessed_columns
9
+ @o = @c.new
10
+ end
11
+
12
+ it "should record columns accessed" do
13
+ @o.accessed_columns.should == []
14
+ @o.name
15
+ @o.accessed_columns.should == [:name]
16
+ @o.name
17
+ @o.accessed_columns.should == [:name]
18
+ @o.b
19
+ @o.accessed_columns.sort_by{|s| s.to_s}.should == [:b, :name]
20
+ end
21
+
22
+ it "should clear accessed columns when refreshing" do
23
+ @o.name
24
+ @o.refresh
25
+ @o.accessed_columns.should == []
26
+ end
27
+
28
+ it "should clear accessed columns when saving" do
29
+ @o.name
30
+ @o.save
31
+ @o.accessed_columns.should == []
32
+ end
33
+
34
+ it "should work when duping and cloning instances" do
35
+ @o.name
36
+ o = @o.dup
37
+ @o.accessed_columns.should == [:name]
38
+ @o.b
39
+ @o.accessed_columns.sort_by{|s| s.to_s}.should == [:b, :name]
40
+ o.accessed_columns.should == [:name]
41
+ o2 = o.clone
42
+ o2.refresh
43
+ o.accessed_columns.should == [:name]
44
+ o2.accessed_columns.should == []
45
+ end
46
+
47
+ it "should not raise exceptions when object is frozen" do
48
+ @o.freeze
49
+ proc{@o.name}.should_not raise_error
50
+ end
51
+ end
@@ -0,0 +1,55 @@
1
+ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
+
3
+ describe "column_conflicts plugin" do
4
+ before do
5
+ @db = Sequel.mock
6
+ @c = Class.new(Sequel::Model(@db[:test]))
7
+ @c.columns :model, :use_transactions, :foo
8
+ @c.plugin :column_conflicts
9
+ @o = @c.load(:model=>1, :use_transactions=>2, :foo=>4)
10
+ end
11
+
12
+ it "should have mass assignment work correctly" do
13
+ @o.set_fields({:use_transactions=>3}, [:use_transactions])
14
+ @o.get_column_value(:use_transactions).should == 3
15
+ end
16
+
17
+ it "should handle both symbols and strings" do
18
+ @o.get_column_value(:model).should == 1
19
+ @o.get_column_value("model").should == 1
20
+ @o.set_column_value(:use_transactions=, 3)
21
+ @o.get_column_value(:use_transactions).should == 3
22
+ @o.set_column_value(:use_transactions=, 4)
23
+ @o.get_column_value(:use_transactions).should == 4
24
+ end
25
+
26
+ it "should allow manual setting of conflicted columns" do
27
+ @c.send(:define_method, :foo){raise}
28
+ @c.get_column_conflict!(:foo)
29
+ @o.get_column_value(:foo).should == 4
30
+
31
+ @c.send(:define_method, :model=){raise}
32
+ @c.set_column_conflict!(:model)
33
+ @o.set_column_value(:model=, 2).should == 2
34
+ @o.get_column_value(:model).should == 2
35
+ end
36
+
37
+ it "should work correctly in subclasses" do
38
+ @o = Class.new(@c).load(:model=>1, :use_transactions=>2)
39
+ @o.get_column_value(:model).should == 1
40
+ @o.get_column_value("model").should == 1
41
+ @o.set_column_value(:use_transactions=, 3)
42
+ @o.get_column_value(:use_transactions).should == 3
43
+ @o.set_column_value(:use_transactions=, 4)
44
+ @o.get_column_value(:use_transactions).should == 4
45
+ end
46
+
47
+ it "should work correctly for dataset changes" do
48
+ ds = @db[:test]
49
+ def ds.columns; [:object_id] end
50
+ @c.dataset = ds
51
+ o = @c.load(:object_id=>3)
52
+ o.get_column_value(:object_id).should == 3
53
+ o.object_id.should_not == 3
54
+ end
55
+ end
@@ -184,7 +184,13 @@ describe "Model#before_create && Model#after_create" do
184
184
 
185
185
  specify ".create should cancel the save and raise an error if before_create returns false and raise_on_save_failure is true" do
186
186
  @c.before_create{false}
187
- proc{@c.create(:x => 2)}.should raise_error(Sequel::BeforeHookFailed)
187
+ proc{@c.create(:x => 2)}.should raise_error(Sequel::HookFailed)
188
+ DB.sqls.should == []
189
+ end
190
+
191
+ specify ".create should cancel the save and raise an error if before_create calls cancel_action and raise_on_save_failure is true" do
192
+ @c.before_create{cancel_action}
193
+ proc{@c.create(:x => 2)}.should raise_error(Sequel::HookFailed)
188
194
  DB.sqls.should == []
189
195
  end
190
196
 
@@ -194,6 +200,13 @@ describe "Model#before_create && Model#after_create" do
194
200
  @c.create(:x => 2).should == nil
195
201
  DB.sqls.should == []
196
202
  end
203
+
204
+ specify ".create should cancel the save and return nil if before_create calls cancel_action and raise_on_save_failure is false" do
205
+ @c.before_create{cancel_action}
206
+ @c.raise_on_save_failure = false
207
+ @c.create(:x => 2).should == nil
208
+ DB.sqls.should == []
209
+ end
197
210
  end
198
211
 
199
212
  describe "Model#before_update && Model#after_update" do
@@ -214,7 +227,7 @@ describe "Model#before_update && Model#after_update" do
214
227
 
215
228
  specify "#save should cancel the save and raise an error if before_update returns false and raise_on_save_failure is true" do
216
229
  @c.before_update{false}
217
- proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
230
+ proc{@c.load(:id => 2233).save}.should raise_error(Sequel::HookFailed)
218
231
  DB.sqls.should == []
219
232
  end
220
233
 
@@ -252,7 +265,7 @@ describe "Model#before_save && Model#after_save" do
252
265
 
253
266
  specify "#save should cancel the save and raise an error if before_save returns false and raise_on_save_failure is true" do
254
267
  @c.before_save{false}
255
- proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
268
+ proc{@c.load(:id => 2233).save}.should raise_error(Sequel::HookFailed)
256
269
  DB.sqls.should == []
257
270
  end
258
271
 
@@ -282,7 +295,7 @@ describe "Model#before_destroy && Model#after_destroy" do
282
295
 
283
296
  specify "#destroy should cancel the destroy and raise an error if before_destroy returns false and raise_on_save_failure is true" do
284
297
  @c.before_destroy{false}
285
- proc{@c.load(:id => 2233).destroy}.should raise_error(Sequel::BeforeHookFailed)
298
+ proc{@c.load(:id => 2233).destroy}.should raise_error(Sequel::HookFailed)
286
299
  DB.sqls.should == []
287
300
  end
288
301
 
@@ -336,7 +349,7 @@ describe "Model#before_validation && Model#after_validation" do
336
349
 
337
350
  specify "#save should cancel the save and raise an error if before_validation returns false and raise_on_save_failure is true" do
338
351
  @c.before_validation{false}
339
- proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
352
+ proc{@c.load(:id => 2233).save}.should raise_error(Sequel::HookFailed)
340
353
  DB.sqls.should == []
341
354
  end
342
355