aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/CHANGELOG2
-rw-r--r--activesupport/lib/active_support/reloadable.rb11
-rw-r--r--activesupport/test/reloadable_test.rb37
3 files changed, 48 insertions, 2 deletions
diff --git a/activesupport/CHANGELOG b/activesupport/CHANGELOG
index 9fe54c2397..b2dfa0744c 100644
--- a/activesupport/CHANGELOG
+++ b/activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Add Reloadable::OnlySubclasses which handles the common case where a base class should not be reloaded, but its subclasses should be. [Nicholas Seckar]
+
* Further improvements to reloading code [Nicholas Seckar, Trevor Squires]
- All classes/modules which include Reloadable can define reloadable? for fine grained control of reloading
diff --git a/activesupport/lib/active_support/reloadable.rb b/activesupport/lib/active_support/reloadable.rb
index 49e6442a37..7749f0b165 100644
--- a/activesupport/lib/active_support/reloadable.rb
+++ b/activesupport/lib/active_support/reloadable.rb
@@ -14,4 +14,15 @@ module Reloadable
included_in_classes.select { |klass| klass.reloadable? }
end
end
+
+ module OnlySubclasses
+ class << self
+ def included(base) #nodoc:
+ base.send :include, Reloadable
+ (class << base; self; end;).class_eval do
+ define_method(:reloadable?) { self != base }
+ end
+ end
+ end
+ end
end \ No newline at end of file
diff --git a/activesupport/test/reloadable_test.rb b/activesupport/test/reloadable_test.rb
index adac2fccec..fb1d61740d 100644
--- a/activesupport/test/reloadable_test.rb
+++ b/activesupport/test/reloadable_test.rb
@@ -27,6 +27,19 @@ module ReloadableTestSandbox
end
include Reloadable
end
+
+ class OnlySubclassesReloadable
+ include Reloadable::OnlySubclasses
+ end
+ class ASubclassOfOnlySubclassesReloadable < OnlySubclassesReloadable
+ end
+
+ class AnOnlySubclassReloadableClassSubclassingAReloadableClass
+ include Reloadable::OnlySubclasses
+ end
+
+ class ASubclassofAOnlySubclassReloadableClassWhichWasSubclassingAReloadableClass < AnOnlySubclassReloadableClassSubclassingAReloadableClass
+ end
end
class ReloadableTest < Test::Unit::TestCase
@@ -43,9 +56,29 @@ class ReloadableTest < Test::Unit::TestCase
assert_equal 10, ReloadableTestSandbox::AClassWhichDefinesItsOwnReloadable.reloadable?
end
+ def test_only_subclass_reloadable
+ assert ! ReloadableTestSandbox::OnlySubclassesReloadable.reloadable?
+ assert ReloadableTestSandbox::ASubclassOfOnlySubclassesReloadable.reloadable?
+ end
+
+ def test_inside_hierarchy_only_subclass_reloadable
+ assert ! ReloadableTestSandbox::AnOnlySubclassReloadableClassSubclassingAReloadableClass.reloadable?
+ assert ReloadableTestSandbox::ASubclassofAOnlySubclassReloadableClassWhichWasSubclassingAReloadableClass.reloadable?
+ end
+
def test_removable_classes
- reloadables = %w(AReloadableClass AReloadableClassWithSubclasses AReloadableSubclass AClassWhichDefinesItsOwnReloadable)
- non_reloadables = %w(ANonReloadableSubclass AModuleIncludingReloadable)
+ reloadables = %w(
+ AReloadableClass
+ AReloadableClassWithSubclasses
+ AReloadableSubclass
+ AClassWhichDefinesItsOwnReloadable
+ ASubclassOfOnlySubclassesReloadable
+ )
+ non_reloadables = %w(
+ ANonReloadableSubclass
+ AModuleIncludingReloadable
+ OnlySubclassesReloadable
+ )
results = Reloadable.reloadable_classes
reloadables.each do |name|