sequel 4.18.0 → 4.19.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 (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