diff options
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/CHANGELOG | 2 | ||||
-rw-r--r-- | activesupport/lib/active_support/reloadable.rb | 11 | ||||
-rw-r--r-- | activesupport/test/reloadable_test.rb | 37 |
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| |