Warning
This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.util.inflection
#!/usr/bin/env python
# Copyright (c) 2006 Bermi Ferrer Martinez
#
# bermi a-t bermilabs - com
# See the end of this file for the free software, open source license (BSD-style).
#
# Modified by the Galaxy team.
import re
[docs]class Inflector:
"""
Inflector for pluralizing and singularizing English nouns.
"""
# This is a small subset of words that either have the same singular and plural form, or have no singular form
NONCHANGING_WORDS = {
"equipment",
"information",
"rice",
"money",
"species",
"series",
"sheep",
"sms",
}
IRREGULAR_WORDS = {
"person": "people",
"man": "men",
"child": "children",
"sex": "sexes",
"move": "moves",
"octopus": "octopi",
}
PLURALIZE_RULES = (
("(?i)(quiz)$", "\\1zes"),
("(?i)^(ox)$", "\\1en"),
("(?i)([m|l])ouse$", "\\1ice"),
("(?i)(matr|vert|ind)ix|ex$", "\\1ices"),
("(?i)(x|ch|ss|sh)$", "\\1es"),
("(?i)([^aeiouy]|qu)ies$", "\\1y"),
("(?i)([^aeiouy]|qu)y$", "\\1ies"),
("(?i)(hive)$", "\\1s"),
("(?i)(?:([^f])fe|([lr])f)$", "\\1\\2ves"),
("(?i)sis$", "ses"),
("(?i)([ti])um$", "\\1a"),
("(?i)(buffal|tomat)o$", "\\1oes"),
("(?i)(bu)s$", "\\1ses"),
("(?i)(alias|status|virus)", "\\1es"),
("(?i)(ax|test)is$", "\\1es"),
("(?i)s$", "s"),
("(?i)$", "s"),
)
SINGULARIZE_RULES = (
("(?i)(quiz)zes$", "\\1"),
("(?i)(matr)ices$", "\\1ix"),
("(?i)(vert|ind)ices$", "\\1ex"),
("(?i)^(ox)en", "\\1"),
("(?i)(alias|status|virus)es$", "\\1"),
("(?i)(cris|ax|test)es$", "\\1is"),
("(?i)(shoe)s$", "\\1"),
("(?i)(o)es$", "\\1"),
("(?i)(bus)es$", "\\1"),
("(?i)([m|l])ice$", "\\1ouse"),
("(?i)(x|ch|ss|sh)es$", "\\1"),
("(?i)(m)ovies$", "\\1ovie"),
("(?i)(s)eries$", "\\1eries"),
("(?i)([^aeiouy]|qu)ies$", "\\1y"),
("(?i)([lr])ves$", "\\1f"),
("(?i)(tive)s$", "\\1"),
("(?i)(hive)s$", "\\1"),
("(?i)([^f])ves$", "\\1fe"),
("(?i)(^analy)ses$", "\\1sis"),
("(?i)((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$", "\\1\\2sis"),
("(?i)([ti])a$", "\\1um"),
("(?i)(n)ews$", "\\1ews"),
("(?i)s$", ""),
)
[docs] def pluralize(self, word):
"""Pluralizes nouns."""
return self._transform(self.PLURALIZE_RULES, word)
[docs] def singularize(self, word):
"""Singularizes nouns."""
return self._transform(self.SINGULARIZE_RULES, word, pluralize=False)
[docs] def cond_plural(self, number_of_records, word):
"""Returns the plural form of a word if first parameter is greater than 1"""
if number_of_records != 1:
return self.pluralize(word)
return word
def _transform(self, rules, word, pluralize=True):
return (
self._handle_nonchanging(word)
or self._handle_irregular(word, pluralize=pluralize)
or self._apply_rules(rules, word)
or word
)
def _handle_nonchanging(self, word):
lower_cased_word = word.lower()
# Check if word is an item or the suffix of any item in NONCHANGING_WORDS
for nonchanging_word in self.NONCHANGING_WORDS:
if lower_cased_word.endswith(nonchanging_word):
return word
def _handle_irregular(self, word, pluralize=True):
for form_a, form_b in self.IRREGULAR_WORDS.items():
if not pluralize:
form_a, form_b = form_b, form_a
match = re.search(f"({form_a})$", word, re.IGNORECASE)
if match:
return re.sub(f"(?i){form_a}$", match.expand("\\1")[0] + form_b[1:], word)
def _apply_rules(self, rules, word):
for pattern, replacement in rules:
if re.search(pattern, word):
return re.sub(pattern, replacement, word)
# Copyright (c) 2006 Bermi Ferrer Martinez
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software to deal in this software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of this software, and to permit
# persons to whom this software is furnished to do so, subject to the following
# condition:
#
# THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THIS SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THIS SOFTWARE.