Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 3521

Show
Ignore:
Timestamp:
02/02/06 05:41:00 (3 years ago)
Author:
ulysses
Message:

Add Reloadable::OnlySubclasses which handles the common case where a base class should not be reloaded, but its subclasses should be.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionmailer/lib/action_mailer/base.rb

    r3495 r3521  
    124124    # Action Mailer subclasses should be reloaded by the dispatcher in Rails 
    125125    # when Dependencies.mechanism = :load. 
    126     def self.inherited(child) #:nodoc: 
    127       child.send :include, Reloadable 
    128       super 
    129     end 
    130  
     126    include Reloadable::OnlySubclasses 
     127     
    131128    private_class_method :new #:nodoc: 
    132129 
  • trunk/actionpack/lib/action_controller/base.rb

    r3497 r3521  
    225225  class Base 
    226226    DEFAULT_RENDER_STATUS_CODE = "200 OK" 
    227  
    228     # Action Controller subclasses should be reloaded by the dispatcher in Rails 
    229     # when Dependencies.mechanism = :load. 
    230     def self.inherited(child) #:nodoc: 
    231       child.send :include, Reloadable 
    232       super 
    233     end 
    234    
     227     
     228    include Reloadable::OnlySubclasses 
     229     
    235230    # Determines whether the view has access to controller internals @request, @response, @session, and @template. 
    236231    # By default, it does. 
  • trunk/actionpack/lib/action_controller/caching.rb

    r3519 r3521  
    524524        # ActiveRecord::Observer will mark this class as reloadable even though it should not be. 
    525525        # However, subclasses of ActionController::Caching::Sweeper should be Reloadable 
    526         def self.reloadable? #:nodoc: 
    527           self != Sweeper 
    528         end 
    529  
     526        include Reloadable::OnlySubclasses 
     527         
    530528        def before(controller) 
    531529          self.controller = controller 
  • trunk/activerecord/lib/active_record/base.rb

    r3493 r3521  
    243243    # on to any new database connections made and which can be retrieved on both a class and instance level by calling +logger+. 
    244244    cattr_accessor :logger 
    245  
     245     
     246    include Reloadable::OnlySubclasses 
     247     
    246248    def self.inherited(child) #:nodoc: 
    247       child.send :include, Reloadable 
    248249      @@subclasses[self] ||= [] 
    249250      @@subclasses[self] << child 
  • trunk/activerecord/lib/active_record/observer.rb

    r3493 r3521  
    8484    # Observer subclasses should be reloaded by the dispatcher in Rails 
    8585    # when Dependencies.mechanism = :load. 
    86     def self.inherited(child) #:nodoc: 
    87       child.send :include, Reloadable 
    88       super 
    89     end 
    90  
     86    include Reloadable::OnlySubclasses 
     87     
    9188    # Attaches the observer to the supplied model classes. 
    9289    def self.observe(*models) 
  • trunk/activesupport/CHANGELOG

    r3519 r3521  
    11*SVN* 
     2 
     3* Add Reloadable::OnlySubclasses which handles the common case where a base class should not be reloaded, but its subclasses should be. [Nicholas Seckar] 
    24 
    35* Further improvements to reloading code [Nicholas Seckar, Trevor Squires] 
  • trunk/activesupport/lib/active_support/reloadable.rb

    r3519 r3521  
    1515    end 
    1616  end 
     17   
     18  module OnlySubclasses 
     19    class << self 
     20      def included(base) #nodoc: 
     21        base.send :include, Reloadable 
     22        (class << base; self; end;).class_eval do 
     23          define_method(:reloadable?) { self != base } 
     24        end 
     25      end 
     26    end 
     27  end 
    1728end 
  • trunk/activesupport/test/reloadable_test.rb

    r3519 r3521  
    2828    include Reloadable 
    2929  end 
     30   
     31  class OnlySubclassesReloadable 
     32    include Reloadable::OnlySubclasses 
     33  end 
     34  class ASubclassOfOnlySubclassesReloadable < OnlySubclassesReloadable 
     35  end 
     36   
     37  class AnOnlySubclassReloadableClassSubclassingAReloadableClass 
     38    include Reloadable::OnlySubclasses 
     39  end 
     40   
     41  class ASubclassofAOnlySubclassReloadableClassWhichWasSubclassingAReloadableClass < AnOnlySubclassReloadableClassSubclassingAReloadableClass 
     42  end 
    3043end 
    3144 
     
    4457  end 
    4558   
     59  def test_only_subclass_reloadable 
     60    assert ! ReloadableTestSandbox::OnlySubclassesReloadable.reloadable? 
     61    assert ReloadableTestSandbox::ASubclassOfOnlySubclassesReloadable.reloadable? 
     62  end 
     63   
     64  def test_inside_hierarchy_only_subclass_reloadable 
     65    assert ! ReloadableTestSandbox::AnOnlySubclassReloadableClassSubclassingAReloadableClass.reloadable? 
     66    assert ReloadableTestSandbox::ASubclassofAOnlySubclassReloadableClassWhichWasSubclassingAReloadableClass.reloadable? 
     67  end 
     68   
    4669  def test_removable_classes 
    47     reloadables = %w(AReloadableClass AReloadableClassWithSubclasses AReloadableSubclass AClassWhichDefinesItsOwnReloadable) 
    48     non_reloadables = %w(ANonReloadableSubclass AModuleIncludingReloadable) 
     70    reloadables = %w( 
     71      AReloadableClass 
     72      AReloadableClassWithSubclasses 
     73      AReloadableSubclass 
     74      AClassWhichDefinesItsOwnReloadable 
     75      ASubclassOfOnlySubclassesReloadable 
     76    ) 
     77    non_reloadables = %w( 
     78      ANonReloadableSubclass 
     79      AModuleIncludingReloadable 
     80      OnlySubclassesReloadable 
     81    ) 
    4982     
    5083    results = Reloadable.reloadable_classes