mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
More inflector fixes #1608
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1699 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
This commit is contained in:
parent
0e92f36d75
commit
f4c579e92e
3 changed files with 60 additions and 45 deletions
|
@ -2,7 +2,7 @@
|
|||
|
||||
* Fixed conflict with Glue gem #1606 [Rick Olson]
|
||||
|
||||
* Added new rules to the Inflector to deal with more unusual plurals mouse/louse => mice/lice, information => information, ox => oxen, virus => viri, archive => archives #1571, #1583, #1490, #1599 [foamdino@gmail.com/others]
|
||||
* Added new rules to the Inflector to deal with more unusual plurals mouse/louse => mice/lice, information => information, ox => oxen, virus => viri, archive => archives #1571, #1583, #1490, #1599, #1608 [foamdino@gmail.com/others]
|
||||
|
||||
* Fixed memory leak with Object#remove_subclasses_of, which inflicted a Rails application running in development mode with a ~20KB leak per request #1289 [c.r.mcgrath@gmail.com]
|
||||
|
||||
|
|
|
@ -5,18 +5,24 @@ module Inflector
|
|||
|
||||
def pluralize(word)
|
||||
result = word.to_s.dup
|
||||
plural_rules.each do |(rule, replacement)|
|
||||
break if result.gsub!(rule, replacement)
|
||||
|
||||
if uncountable_words.include?(result.downcase)
|
||||
result
|
||||
else
|
||||
plural_rules.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
|
||||
result
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
def singularize(word)
|
||||
result = word.to_s.dup
|
||||
singular_rules.each do |(rule, replacement)|
|
||||
break if result.gsub!(rule, replacement)
|
||||
|
||||
if uncountable_words.include?(result.downcase)
|
||||
result
|
||||
else
|
||||
singular_rules.each { |(rule, replacement)| break if result.gsub!(rule, replacement) }
|
||||
result
|
||||
end
|
||||
return result
|
||||
end
|
||||
|
||||
def camelize(lower_case_and_underscored_word)
|
||||
|
@ -55,42 +61,47 @@ module Inflector
|
|||
end
|
||||
|
||||
private
|
||||
def uncountable_words #:doc
|
||||
%w( equipment information rice money species series fish )
|
||||
end
|
||||
|
||||
def plural_rules #:doc:
|
||||
[
|
||||
[/(fish)$/i, '\1\2'], # fish
|
||||
[/(information|equipment|money)$/i, '\1'], # plural nouns
|
||||
[/^(ox)$/i, '\1\2en'], # ox
|
||||
[/([m|l])ouse/i, '\1ice'], # mouse, louse
|
||||
[/(x|ch|ss|sh)$/i, '\1es'], # search, switch, fix, box, process, address
|
||||
[/(series)$/i, '\1\2'],
|
||||
[/^(ox)$/i, '\1\2en'], # ox
|
||||
[/([m|l])ouse$/i, '\1ice'], # mouse, louse
|
||||
[/(matr|vert)ix|ex$/i, '\1ices'], # matrix, vertex, index
|
||||
[/(x|ch|ss|sh)$/i, '\1es'], # search, switch, fix, box, process, address
|
||||
[/([^aeiouy]|qu)ies$/i, '\1y'],
|
||||
[/([^aeiouy]|qu)y$/i, '\1ies'], # query, ability, agency
|
||||
[/(hive)$/i, '\1s'], # archive, hive
|
||||
[/([^aeiouy]|qu)y$/i, '\1ies'], # query, ability, agency
|
||||
[/(hive)$/i, '\1s'], # archive, hive
|
||||
[/(?:([^f])fe|([lr])f)$/i, '\1\2ves'], # half, safe, wife
|
||||
[/sis$/i, 'ses'], # basis, diagnosis
|
||||
[/([ti])um$/i, '\1a'], # datum, medium
|
||||
[/(p)erson$/i, '\1\2eople'], # person, salesperson
|
||||
[/(m)an$/i, '\1\2en'], # man, woman, spokesman
|
||||
[/(c)hild$/i, '\1\2hildren'], # child
|
||||
[/(photo)$/i, '\1s'],
|
||||
[/(buffal|tomat)o$/i, '\1\2oes'], # buffalo, tomato
|
||||
[/(bu)s$/i, '\1\2ses'], # bus
|
||||
[/(alias)/i, '\1es'], # alias
|
||||
[/([octop|vir])us$/i, '\1i'], # octopus, virus - virus has no defined plural (according to Latin/dictionary.com), but viri is better than viruses/viruss
|
||||
[/s$/i, 's'], # no change (compatibility)
|
||||
[/sis$/i, 'ses'], # basis, diagnosis
|
||||
[/([ti])um$/i, '\1a'], # datum, medium
|
||||
[/(p)erson$/i, '\1eople'], # person, salesperson
|
||||
[/(m)an$/i, '\1en'], # man, woman, spokesman
|
||||
[/(c)hild$/i, '\1hildren'], # child
|
||||
[/(buffal|tomat)o$/i, '\1\2oes'], # buffalo, tomato
|
||||
[/(bu)s$/i, '\1\2ses'], # bus
|
||||
[/(alias)/i, '\1es'], # alias
|
||||
[/(octop|vir)us$/i, '\1i'], # octopus, virus - virus has no defined plural (according to Latin/dictionary.com), but viri is better than viruses/viruss
|
||||
[/(ax|cri|test)is$/i, '\1es'], # axis, crisis
|
||||
[/s$/i, 's'], # no change (compatibility)
|
||||
[/$/, 's']
|
||||
]
|
||||
end
|
||||
|
||||
def singular_rules #:doc:
|
||||
[
|
||||
[/(f)ish$/i, '\1\2ish'],
|
||||
[/(matr)ices$/i, '\1ix'],
|
||||
[/(vert)ices$/i, '\1ex'],
|
||||
[/^(ox)en/i, '\1'],
|
||||
[/(alias)es$/i, '\1'],
|
||||
[/([octop|vir])i$/i, '\1us'],
|
||||
[/(o)es/i, '\1'],
|
||||
[/(cris|ax|test)es$/i, '\1is'],
|
||||
[/(shoe)s$/i, '\1'],
|
||||
[/(o)es$/i, '\1'],
|
||||
[/(bus)es$/i, '\1'],
|
||||
[/([m|l])ice/i, '\1ouse'],
|
||||
[/([m|l])ice$/i, '\1ouse'],
|
||||
[/(x|ch|ss|sh)es$/i, '\1'],
|
||||
[/(m)ovies$/i, '\1\2ovie'],
|
||||
[/(s)eries$/i, '\1\2eries'],
|
||||
|
@ -103,11 +114,11 @@ module Inflector
|
|||
[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i, '\1\2sis'],
|
||||
[/([ti])a$/i, '\1um'],
|
||||
[/(p)eople$/i, '\1\2erson'],
|
||||
[/(m)en$/i, '\1\2an'],
|
||||
[/(m)en$/i, '\1an'],
|
||||
[/(s)tatus$/i, '\1\2tatus'],
|
||||
[/(c)hildren$/i, '\1\2hild'],
|
||||
[/(n)ews$/i, '\1\2ews'],
|
||||
[/s$/i, '']
|
||||
]
|
||||
end
|
||||
end
|
||||
end
|
|
@ -61,6 +61,7 @@ class InflectorTest < Test::Unit::TestCase
|
|||
"news" => "news",
|
||||
|
||||
"series" => "series",
|
||||
"species" => "species",
|
||||
|
||||
"perspective" => "perspectives",
|
||||
|
||||
|
@ -74,12 +75,27 @@ class InflectorTest < Test::Unit::TestCase
|
|||
"equipment" => "equipment",
|
||||
"bus" => "buses",
|
||||
"mouse" => "mice",
|
||||
|
||||
"louse" => "lice",
|
||||
"house" => "houses",
|
||||
"octopus" => "octopi",
|
||||
"virus" => "viri",
|
||||
"alias" => "aliases",
|
||||
"portfolio" => "portfolios"
|
||||
"portfolio" => "portfolios",
|
||||
|
||||
"vertex" => "vertices",
|
||||
"matrix" => "matrices",
|
||||
|
||||
"axis" => "axes",
|
||||
"testis" => "testes",
|
||||
"crisis" => "crises",
|
||||
|
||||
"rice" => "rice",
|
||||
"shoe" => "shoes",
|
||||
|
||||
"horse" => "horses",
|
||||
"prize" => "prizes",
|
||||
"edge" => "edges"
|
||||
}
|
||||
|
||||
CamelToUnderscore = {
|
||||
|
@ -198,16 +214,4 @@ class InflectorTest < Test::Unit::TestCase
|
|||
assert_equal InflectorTest, Inflector.constantize("InflectorTest")
|
||||
assert_raises(NameError) { Inflector.constantize("UnknownClass") }
|
||||
end
|
||||
|
||||
# def test_staying_singular
|
||||
# for term in SingularToPlural.keys
|
||||
# assert_equal term, Inflector.singularize(term)
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# def test_staying_plural
|
||||
# for term in SingularToPlural.values
|
||||
# assert_equal term, Inflector.singularize(term)
|
||||
# end
|
||||
# end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue