Permalink
Browse files

Refactor new callbacks and AR implementation.

Signed-off-by: Joshua Peek <josh@joshpeek.com>
  • Loading branch information...
1 parent 4f37b97 commit 2ea1d684d93bd59887a9fd12e647941f0d1f4868 @josevalim josevalim committed with josh Sep 8, 2009
@@ -9,7 +9,7 @@ module Validations
include ActiveSupport::NewCallbacks
included do
- define_callbacks :validate
+ define_callbacks :validate, :scope => :name
end
module ClassMethods
@@ -79,7 +79,7 @@ def validate(*args, &block)
options[:if] = Array(options[:if])
options[:if] << "@_on_validate == :#{options[:on]}"
end
- set_callback(:validate, :before, *args, &block)
+ set_callback(:validate, *args, &block)
end
end
@@ -214,16 +214,18 @@ module Callbacks
CALLBACKS = [
:after_initialize, :after_find, :before_validation, :after_validation,
- :before_save, :after_save, :before_create, :after_create, :before_update,
- :after_update, :before_destroy, :after_destroy
+ :before_save, :around_save, :after_save, :before_create, :around_create,
+ :after_create, :before_update, :around_update, :after_update,
+ :before_destroy, :around_destroy, :after_destroy
]
included do
[:create_or_update, :valid?, :create, :update, :destroy].each do |method|
alias_method_chain method, :callbacks
end
- define_callbacks :initialize, :find, :save, :create, :update, :destroy, :validation, "result == false"
+ define_callbacks :initialize, :find, :save, :create, :update, :destroy,
+ :validation, :terminator => "result == false", :scope => [:kind, :name]
end
module ClassMethods
@@ -239,64 +241,23 @@ def after_find(*args, &block)
set_callback(:find, :after, *(args << options), &block)
end
- def before_save(*args, &block)
- set_callback(:save, :before, *args, &block)
- end
-
- def around_save(*args, &block)
- set_callback(:save, :around, *args, &block)
- end
-
- def after_save(*args, &block)
- options = args.extract_options!
- options[:prepend] = true
- options[:if] = Array(options[:if]) << "!halted && value != false"
- set_callback(:save, :after, *(args << options), &block)
- end
-
- def before_create(*args, &block)
- set_callback(:create, :before, *args, &block)
- end
-
- def around_create(*args, &block)
- set_callback(:create, :around, *args, &block)
- end
-
- def after_create(*args, &block)
- options = args.extract_options!
- options[:prepend] = true
- options[:if] = Array(options[:if]) << "!halted && value != false"
- set_callback(:create, :after, *(args << options), &block)
- end
-
- def before_update(*args, &block)
- set_callback(:update, :before, *args, &block)
- end
-
- def around_update(*args, &block)
- set_callback(:update, :around, *args, &block)
- end
-
- def after_update(*args, &block)
- options = args.extract_options!
- options[:prepend] = true
- options[:if] = Array(options[:if]) << "!halted && value != false"
- set_callback(:update, :after, *(args << options), &block)
- end
+ [:save, :create, :update, :destroy].each do |callback|
+ module_eval <<-CALLBACKS, __FILE__, __LINE__
+ def before_#{callback}(*args, &block)
+ set_callback(:#{callback}, :before, *args, &block)
+ end
- def before_destroy(*args, &block)
- set_callback(:destroy, :before, *args, &block)
- end
+ def around_#{callback}(*args, &block)
+ set_callback(:#{callback}, :around, *args, &block)
+ end
- def around_destroy(*args, &block)
- set_callback(:destroy, :around, *args, &block)
- end
-
- def after_destroy(*args, &block)
- options = args.extract_options!
- options[:prepend] = true
- options[:if] = Array(options[:if]) << "!halted && value != false"
- set_callback(:destroy, :after, *(args << options), &block)
+ def after_#{callback}(*args, &block)
+ options = args.extract_options!
+ options[:prepend] = true
+ options[:if] = Array(options[:if]) << "!halted && value != false"
+ set_callback(:#{callback}, :after, *(args << options), &block)
+ end
+ CALLBACKS
end
def before_validation(*args, &block)
@@ -5,7 +5,7 @@ class Comment < ActiveRecord::Base
before_validation :record_callers
- def after_validation
+ after_validation do
record_callers
end
@@ -32,7 +32,6 @@ def test_model_callbacks_fire_before_observers_are_notified
CommentObserver.instance.callers = callers
comment.valid?
-
assert_equal [Comment, Comment, CommentObserver], callers, "model callbacks did not fire before observers were notified"
end
end
@@ -18,18 +18,18 @@ def define_callback_method(callback_method)
end
end
- def callback_object(callback_symbol)
+ def callback_object(callback_method)
klass = Class.new
- callback_method = callback_symbol.to_s.split('_').first.to_sym
klass.send(:define_method, callback_method) do |model|
- model.history << [callback_symbol, :object]
+ model.history << [callback_method, :object]
end
klass.new
end
end
ActiveSupport::Deprecation.silence do
ActiveRecord::Callbacks::CALLBACKS.each do |callback_method|
+ next if callback_method.to_s =~ /^around_/
define_callback_method(callback_method)
send(callback_method, callback_string(callback_method))
send(callback_method, callback_proc(callback_method))
@@ -4,8 +4,6 @@
require 'models/reply'
require 'models/minimalistic'
-class Topic; def after_find() end end
-class Developer; def after_find() end end
class SpecialDeveloper < Developer; end
class TopicManualObserver
@@ -164,22 +162,6 @@ def test_after_find_can_be_observed_when_its_defined_on_the_model
assert_equal topic, observer.topic
end
- def test_after_find_is_not_clobbered_if_it_already_exists
- # use a fresh observer class so we can instantiate it (Observer is
- # a Singleton)
- model_class = Class.new(ActiveRecord::Base) do
- def after_find; end
- end
- original_method = model_class.instance_method(:after_find)
- observer_class = Class.new(ActiveRecord::Observer) do
- def after_find; end
- end
- observer_class.observe(model_class)
-
- observer = observer_class.instance
- assert_equal original_method, model_class.instance_method(:after_find)
- end
-
def test_invalid_observer
assert_raise(ArgumentError) { Topic.observers = Object.new; Topic.instantiate_observers }
end
@@ -382,28 +382,28 @@ def test_sqlite_add_column_in_transaction
private
def add_exception_raising_after_save_callback_to_topic
- Topic.class_eval "def after_save; raise 'Make the transaction rollback' end"
+ Topic.class_eval "def after_save_for_transaction; raise 'Make the transaction rollback' end"
end
def remove_exception_raising_after_save_callback_to_topic
- Topic.class_eval "def after_save; end"
+ Topic.class_eval "def after_save_for_transaction; end"
end
def add_exception_raising_after_create_callback_to_topic
- Topic.class_eval "def after_create; raise 'Make the transaction rollback' end"
+ Topic.class_eval "def after_create_for_transaction; raise 'Make the transaction rollback' end"
end
def remove_exception_raising_after_create_callback_to_topic
- Topic.class_eval "def after_create; end"
+ Topic.class_eval "def after_create_for_transaction; end"
end
%w(validation save destroy).each do |filter|
define_method("add_cancelling_before_#{filter}_with_db_side_effect_to_topic") do
- Topic.class_eval "def before_#{filter}() Book.create; false end"
+ Topic.class_eval "def before_#{filter}_for_transaction() Book.create; false end"
end
define_method("remove_cancelling_before_#{filter}_with_db_side_effect_to_topic") do
- Topic.class_eval "def before_#{filter}; end"
+ Topic.class_eval "def before_#{filter}_for_transaction; end"
end
end
end
@@ -94,8 +94,9 @@ def testing_proxy_target
belongs_to :author_address_extra, :dependent => :delete, :class_name => "AuthorAddress"
attr_accessor :post_log
+ after_initialize :set_post_log
- def after_initialize
+ def set_post_log
@post_log = []
end
@@ -22,8 +22,9 @@ class Project < ActiveRecord::Base
has_and_belongs_to_many :well_payed_salary_groups, :class_name => "Developer", :group => "developers.salary", :having => "SUM(salary) > 10000", :select => "SUM(salary) as salary"
attr_accessor :developers_log
+ after_initialize :set_developers_log
- def after_initialize
+ def set_developers_log
@developers_log = []
end
@@ -52,6 +52,15 @@ def topic_id
id
end
+ before_validation :before_validation_for_transaction
+ before_save :before_save_for_transaction
+ before_destroy :before_destroy_for_transaction
+
+ after_save :after_save_for_transaction
+ after_create :after_create_for_transaction
+
+ after_initialize :set_email_address
+
protected
def approved=(val)
@custom_approved = val
@@ -66,11 +75,17 @@ def destroy_children
self.class.delete_all "parent_id = #{id}"
end
- def after_initialize
+ def set_email_address
if self.new_record?
self.author_email_address = 'test@test.com'
end
end
+
+ def before_validation_for_transaction; end
+ def before_save_for_transaction; end
+ def before_destroy_for_transaction; end
+ def after_save_for_transaction; end
+ def after_create_for_transaction; end
end
module Web
Oops, something went wrong.

1 comment on commit 2ea1d68

nice scooping

Please sign in to comment.