aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2011-04-28 09:32:57 +0200
committerJosé Valim <jose.valim@gmail.com>2011-04-28 09:32:57 +0200
commit2a25c5818b03d7d6cd63aad180bff23479dbd861 (patch)
tree251fa94604fc45a6edf273fb089ff0fe8181ff58 /activemodel
parent5297049e32c3b176893e7ef029d9fa22f2003409 (diff)
downloadrails-2a25c5818b03d7d6cd63aad180bff23479dbd861.tar.gz
rails-2a25c5818b03d7d6cd63aad180bff23479dbd861.tar.bz2
rails-2a25c5818b03d7d6cd63aad180bff23479dbd861.zip
Revert "Handle enabling/disabling observers at different levels of the class hierarchy."
This reverts commit ad62f1928768bd2676958a4a08512bad342fe469 because the current subclasses implementation leaks memory in development. Instead of keeping an array of subclasses, the better solution is to ask the parent if an observer is being disabled or not.
Diffstat (limited to 'activemodel')
-rw-r--r--activemodel/lib/active_model/observer_array.rb34
-rw-r--r--activemodel/lib/active_model/observing.rb5
-rw-r--r--activemodel/test/cases/observer_array_test.rb39
3 files changed, 3 insertions, 75 deletions
diff --git a/activemodel/lib/active_model/observer_array.rb b/activemodel/lib/active_model/observer_array.rb
index f3b5811b81..b8aa9cc1e2 100644
--- a/activemodel/lib/active_model/observer_array.rb
+++ b/activemodel/lib/active_model/observer_array.rb
@@ -48,7 +48,7 @@ module ActiveModel
set_enablement(true, observers, &block)
end
- protected
+ private
def observer_class_for(observer)
return observer if observer.is_a?(Class)
@@ -61,37 +61,13 @@ module ActiveModel
end
end
- def start_transaction
- disabled_observer_stack.push(disabled_observers.dup)
- each_subclass_array do |array|
- array.start_transaction
- end
- end
-
- def disabled_observer_stack
- @disabled_observer_stack ||= []
- end
-
- def end_transaction
- @disabled_observers = disabled_observer_stack.pop
- each_subclass_array do |array|
- array.end_transaction
- end
- end
-
def transaction
- start_transaction
+ orig_disabled_observers = disabled_observers.dup
begin
yield
ensure
- end_transaction
- end
- end
-
- def each_subclass_array
- model_class.subclasses.each do |subclass|
- yield self.class.for(subclass)
+ @disabled_observers = orig_disabled_observers
end
end
@@ -116,10 +92,6 @@ module ActiveModel
disabled_observers << klass
end
end
-
- each_subclass_array do |array|
- array.set_enablement(enabled, observers)
- end
end
end
end
diff --git a/activemodel/lib/active_model/observing.rb b/activemodel/lib/active_model/observing.rb
index ba6be46670..e1a2ce218d 100644
--- a/activemodel/lib/active_model/observing.rb
+++ b/activemodel/lib/active_model/observing.rb
@@ -70,10 +70,6 @@ module ActiveModel
observer_instances.size
end
- def subclasses
- @subclasses ||= []
- end
-
protected
def instantiate_observer(observer) #:nodoc:
# string/symbol
@@ -93,7 +89,6 @@ module ActiveModel
# Notify observers when the observed class is subclassed.
def inherited(subclass)
super
- subclasses << subclass
notify_observers :observed_class_inherited, subclass
end
end
diff --git a/activemodel/test/cases/observer_array_test.rb b/activemodel/test/cases/observer_array_test.rb
index 38e4fd59fc..215ca80bb4 100644
--- a/activemodel/test/cases/observer_array_test.rb
+++ b/activemodel/test/cases/observer_array_test.rb
@@ -118,44 +118,5 @@ class ObserverArrayTest < ActiveModel::TestCase
ORM.observers.disable Widget
end
end
-
- test "allows #enable at the superclass level to override #disable at the subclass level when called last" do
- Widget.observers.disable :all
- ORM.observers.enable :all
-
- assert_observer_notified Widget, WidgetObserver
- assert_observer_notified Budget, BudgetObserver
- assert_observer_notified Widget, AuditTrail
- assert_observer_notified Budget, AuditTrail
- end
-
- test "allows #disable at the superclass level to override #enable at the subclass level when called last" do
- Budget.observers.enable :audit_trail
- ORM.observers.disable :audit_trail
-
- assert_observer_notified Widget, WidgetObserver
- assert_observer_notified Budget, BudgetObserver
- assert_observer_not_notified Widget, AuditTrail
- assert_observer_not_notified Budget, AuditTrail
- end
-
- test "can use the block form at different levels of the hierarchy" do
- yielded = false
- Widget.observers.disable :all
-
- ORM.observers.enable :all do
- yielded = true
- assert_observer_notified Widget, WidgetObserver
- assert_observer_notified Budget, BudgetObserver
- assert_observer_notified Widget, AuditTrail
- assert_observer_notified Budget, AuditTrail
- end
-
- assert yielded
- assert_observer_not_notified Widget, WidgetObserver
- assert_observer_notified Budget, BudgetObserver
- assert_observer_not_notified Widget, AuditTrail
- assert_observer_notified Budget, AuditTrail
- end
end