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

Changeset 4311

Show
Ignore:
Timestamp:
04/29/06 20:13:27 (2 years ago)
Author:
marcel
Message:

Strip out punctuation on predicates or bang methods being aliased with alias_method_chain since target?_without_feature is not a valid method name. Add tests for Module#alias_method_chain. [Marcel Molina Jr.]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/activesupport/CHANGELOG

    r4310 r4311  
    11*SVN* 
     2 
     3* Strip out punctuation on predicates or bang methods being aliased with alias_method_chain since target?_without_feature is not a valid method name. Add tests for Module#alias_method_chain. [Marcel Molina Jr.] 
    24 
    35* Replace Ruby's deprecated append_features in favor of included. [Marcel Molina Jr.] 
  • trunk/activesupport/lib/active_support/core_ext/module/aliasing.rb

    r4276 r4311  
    1111  # And both aliases are set up for you. 
    1212  def alias_method_chain(target, feature) 
    13     alias_method "#{target}_without_#{feature}", target 
    14     alias_method target, "#{target}_with_#{feature}" 
     13    # Strip out punctuation on predicates or bang methods since 
     14    # e.g. target?_without_feature is not a valid method name. 
     15    aliased_target = target.to_s.sub(/[?!]/, '') 
     16    alias_method "#{aliased_target}_without_#{feature}", target 
     17    alias_method target, "#{aliased_target}_with_#{feature}" 
    1518  end 
    1619end 
  • trunk/activesupport/test/core_ext/module_test.rb

    r4060 r4311  
    100100  end 
    101101end 
     102 
     103module BarMethodAliaser 
     104  def self.included(foo_class) 
     105    foo_class.alias_method_chain :bar, :baz 
     106  end 
     107 
     108  def bar_with_baz 
     109    bar_without_baz << '_with_baz' 
     110  end 
     111 
     112  def quux_with_baz 
     113    quux_without_baz << '_with_baz' 
     114  end 
     115end 
     116 
     117class MethodAliasingTest < Test::Unit::TestCase 
     118 
     119  def setup 
     120    Object.const_set(:FooClassWithBarMethod, Class.new) 
     121    FooClassWithBarMethod.send(:define_method, 'bar', Proc.new { 'bar' }) 
     122    @instance = FooClassWithBarMethod.new 
     123  end 
     124 
     125  def teardown 
     126    Object.send(:remove_const, :FooClassWithBarMethod) 
     127  end 
     128 
     129  def test_alias_method_chain 
     130    assert @instance.respond_to? :bar 
     131    feature_aliases = [:bar_with_baz, :bar_without_baz] 
     132 
     133    feature_aliases.each do |method| 
     134      assert !@instance.respond_to?(method) 
     135    end 
     136 
     137    assert_equal 'bar', @instance.bar 
     138 
     139    FooClassWithBarMethod.send(:include, BarMethodAliaser) 
     140 
     141    feature_aliases.each do |method| 
     142      assert @instance.respond_to?(method) 
     143    end 
     144 
     145    assert_equal 'bar_with_baz', @instance.bar 
     146    assert_equal 'bar', @instance.bar_without_baz 
     147  end 
     148 
     149  def test_alias_method_chain_with_punctuation_method 
     150    FooClassWithBarMethod.send(:define_method, 'quux!', Proc.new { 'quux' }) 
     151    assert !@instance.respond_to?(:quux_with_baz) 
     152    FooClassWithBarMethod.send(:include, BarMethodAliaser) 
     153    FooClassWithBarMethod.alias_method_chain :quux!, :baz 
     154    assert @instance.respond_to?(:quux_with_baz) 
     155     
     156    assert_equal 'quux_with_baz', @instance.quux! 
     157    assert_equal 'quux', @instance.quux_without_baz 
     158  end 
     159end