diff options
author | John Paul Ashenfelter <johnpaul@transitionpoint.com> | 2010-11-30 13:48:25 -0500 |
---|---|---|
committer | Piotr Sarnacki <drogus@gmail.com> | 2010-12-22 09:44:46 +0100 |
commit | 9b4622a483319f3d1e7f4489442f0d86afb6da36 (patch) | |
tree | a0523dc7cc41524379d028f9e378ff6ca23f569b /activesupport | |
parent | baebe7d0d5c82cc7bb0570ae7d17a947f9bf58f7 (diff) | |
download | rails-9b4622a483319f3d1e7f4489442f0d86afb6da36.tar.gz rails-9b4622a483319f3d1e7f4489442f0d86afb6da36.tar.bz2 rails-9b4622a483319f3d1e7f4489442f0d86afb6da36.zip |
Added a word boundary to uncountable inflection regex for #singularize so short inflections like ors do not affect larger words like sponsors [#6093 state:resolved]
Diffstat (limited to 'activesupport')
-rw-r--r-- | activesupport/lib/active_support/inflector/inflections.rb | 2 | ||||
-rw-r--r-- | activesupport/test/inflector_test.rb | 27 |
2 files changed, 28 insertions, 1 deletions
diff --git a/activesupport/lib/active_support/inflector/inflections.rb b/activesupport/lib/active_support/inflector/inflections.rb index 3caf78bc7d..e136e4c5b3 100644 --- a/activesupport/lib/active_support/inflector/inflections.rb +++ b/activesupport/lib/active_support/inflector/inflections.rb @@ -148,7 +148,7 @@ module ActiveSupport def singularize(word) result = word.to_s.dup - if inflections.uncountables.any? { |inflection| result =~ /#{inflection}\Z/i } + if inflections.uncountables.any? { |inflection| result =~ /\b(#{inflection})\Z/i } result else inflections.singulars.each { |(rule, replacement)| break if result.gsub!(rule, replacement) } diff --git a/activesupport/test/inflector_test.rb b/activesupport/test/inflector_test.rb index 2990177bed..e8fe635c03 100644 --- a/activesupport/test/inflector_test.rb +++ b/activesupport/test/inflector_test.rb @@ -21,6 +21,33 @@ class InflectorTest < Test::Unit::TestCase def test_pluralize_empty_string assert_equal "", ActiveSupport::Inflector.pluralize("") end + + ActiveSupport::Inflector.inflections.uncountable.each do |word| + define_method "test_uncountability_of_#{word}" do + assert_equal word, ActiveSupport::Inflector.singularize(word) + assert_equal word, ActiveSupport::Inflector.pluralize(word) + assert_equal ActiveSupport::Inflector.pluralize(word), ActiveSupport::Inflector.singularize(word) + end + end + + def test_uncountable_word_is_not_greedy + uncountable_word = "ors" + countable_word = "sponsor" + + cached_uncountables = ActiveSupport::Inflector.inflections.uncountables + + ActiveSupport::Inflector.inflections.uncountable << uncountable_word + + assert_equal uncountable_word, ActiveSupport::Inflector.singularize(uncountable_word) + assert_equal uncountable_word, ActiveSupport::Inflector.pluralize(uncountable_word) + assert_equal ActiveSupport::Inflector.pluralize(uncountable_word), ActiveSupport::Inflector.singularize(uncountable_word) + + assert_equal "sponsor", ActiveSupport::Inflector.singularize(countable_word) + assert_equal "sponsors", ActiveSupport::Inflector.pluralize(countable_word) + assert_equal "sponsor", ActiveSupport::Inflector.singularize(ActiveSupport::Inflector.pluralize(countable_word)) + + ActiveSupport::Inflector.inflections.instance_variable_set :@uncountables, cached_uncountables + end SingularToPlural.each do |singular, plural| define_method "test_pluralize_#{singular}" do |