Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Multibyte strings respond_to the String methods they proxy so they ca…

…n be duck-typed. Closes #6549.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6882 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 428d1f67dab05b84330c7fc66bff0202aee91bd8 1 parent d8b67f7
@jeremy jeremy authored
View
4 activesupport/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Multibyte strings respond_to the String methods they proxy so they can be duck-typed. #6549 [Tuxie]
+
* Array#to_xml yields the builder just like Hash and ActiveRecord::Base. #8472 [seth]
* Date, Time, and DateTime support formatting blocks in addition to strftime strings. Introduce :long_ordinal format, e.g. "February 21st, 2005". #8191 [Coda Hale]
@@ -146,7 +148,7 @@
* Make String#chars slicing behaviour consistent with String. Closes #6387 [Manfred Stienstra]
-* Pull in latest multibye patch. Closes #6346 [Manfred Stienstra]
+* Pull in latest multibyte patch. Closes #6346 [Manfred Stienstra]
* Add ActiveSupport::Multibyte. Provides String#chars which lets you deal with strings as a sequence of chars, not of bytes. Closes #6242 [Julian Tarkhanov, Manfred Stienstra, Thijs van der Vossen & Jan Behrens]
View
6 activesupport/lib/active_support/multibyte/chars.rb
@@ -41,6 +41,12 @@ def to_str
@string
end
+ # Make duck-typing with String possible
+ def respond_to?(method)
+ super || @string.respond_to?(method) || handler.respond_to?(method) ||
+ (method.to_s =~ /(.*)!/ && handler.respond_to?($1)) || false
+ end
+
# Create a new Chars instance.
def initialize(str)
@string = str.respond_to?(:string) ? str.string : str
View
7 activesupport/test/multibyte_chars_test.rb
@@ -151,6 +151,13 @@ def test_resilience
end
end
+ def test_duck_typing
+ assert_equal true, 'test'.chars.respond_to?(:strip)
+ assert_equal true, 'test'.chars.respond_to?(:normalize)
+ assert_equal true, 'test'.chars.respond_to?(:normalize!)
+ assert_equal false, 'test'.chars.respond_to?(:a_method_that_doesnt_exist)
+ end
+
protected
def with_kcode(kcode)
Please sign in to comment.
Something went wrong with that request. Please try again.