From 33b18be4b1bd1d69887073fe46d6c3f882c7baff Mon Sep 17 00:00:00 2001 From: David Genord II Date: Fri, 11 Jun 2010 11:02:38 -0400 Subject: [PATCH 5/7] Better handle pluralizing uncountable words --- .../lib/active_support/inflector/inflections.rb | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-) diff --git a/activesupport/lib/active_support/inflector/inflections.rb b/activesupport/lib/active_support/inflector/inflections.rb index 3caf78b..f9e2609 100644 --- a/activesupport/lib/active_support/inflector/inflections.rb +++ b/activesupport/lib/active_support/inflector/inflections.rb @@ -129,12 +129,14 @@ module ActiveSupport def pluralize(word) result = word.to_s.dup - if word.empty? || inflections.uncountables.include?(result.downcase) - result - else + if m = (/(.*_)([a-z]+)$/i.match(result) || /^([A-Za-z]+)([A-Z][a-z]+)$/.match(result)) + result = m[2] + end + + unless word.empty? || inflections.uncountables.include?(result.downcase) inflections.plurals.each { |(rule, replacement)| break if result.gsub!(rule, replacement) } - result end + m ? (m[1] + result) : result end # The reverse of +pluralize+, returns the singular form of a word in a string. -- 1.7.1 From d030faa81c35fc4c405ab79503958d9695baf211 Mon Sep 17 00:00:00 2001 From: David Genord II Date: Fri, 11 Jun 2010 15:41:27 -0400 Subject: [PATCH 7/7] Tests for uncountable behavior --- activesupport/test/inflector_test.rb | 7 +++++++ activesupport/test/inflector_test_cases.rb | 12 ++++++++++++ 2 files changed, 19 insertions(+), 0 deletions(-) diff --git a/activesupport/test/inflector_test.rb b/activesupport/test/inflector_test.rb index 2990177..09dc50f 100644 --- a/activesupport/test/inflector_test.rb +++ b/activesupport/test/inflector_test.rb @@ -36,6 +36,13 @@ class InflectorTest < Test::Unit::TestCase end end + Uncountable.each do |word| + define_method "test_uncountable_#{word}" do + assert_equal(word, ActiveSupport::Inflector.singularize(word)) + assert_equal(word, ActiveSupport::Inflector.pluralize(word)) + end + end + def test_overwrite_previous_inflectors assert_equal("series", ActiveSupport::Inflector.singularize("series")) ActiveSupport::Inflector.inflections.singular "series", "serie" diff --git a/activesupport/test/inflector_test_cases.rb b/activesupport/test/inflector_test_cases.rb index 59515da..7b19e15 100644 --- a/activesupport/test/inflector_test_cases.rb +++ b/activesupport/test/inflector_test_cases.rb @@ -105,6 +105,18 @@ module InflectorTestCases "database" => "databases" } + Uncountable = %w( + equipment StandardEquipment standard_equipment + information TechnicalInformation technical_information + rice WhiteRice white_rice + money EasyMoney easy_money + species OriginOfSpecies origin_of_species + series LinearSeries linear_series + fish BigFish big_fish + sheep BlackSheep black_sheep + jeans BlueJeans blue_jeans + ) + CamelToUnderscore = { "Product" => "product", "SpecialGuest" => "special_guest", -- 1.7.1