jaraco / inflect

Correctly generate plurals, ordinals, indefinite articles; convert numbers to words
https://pypi.org/project/inflect
MIT License
957 stars 107 forks source link

Handle a single apostrophe more gracefully #218

Closed mgalgs closed 6 days ago

mgalgs commented 3 weeks ago

Currently we raise an exception if you pass a single-character string consisting solely of an apostrophe to engine.plural(), e.g.:

>>> import inflect
>>> p = inflect.engine()
>>> p.plural("'")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/mgalgs/src/inflect/inflect/__init__.py", line 2386, in plural
    self._pl_special_adjective(word, count)
  File "/home/mgalgs/src/inflect/inflect/__init__.py", line 3157, in _pl_special_adjective
    pl = self.plural_noun(mo.group(1))
  File "/home/mgalgs/src/inflect/inflect/__init__.py", line 2393, in plural_noun
    def plural_noun(
  File "/home/mgalgs/src/inflect/env/lib/python3.9/site-packages/typeguard/_functions.py", line 136, in check_argument_types
    check_type_internal(value, annotation, memo)
  File "/home/mgalgs/src/inflect/env/lib/python3.9/site-packages/typeguard/_checkers.py", line 866, in check_type_internal
    raise TypeCheckError(f"is not an instance of {qualified_name(origin_type)}")
typeguard.TypeCheckError: argument "text" (str) is not an instance of inflect.Word

Rather than raising an exception, just return the "'" string back to the caller (since nothing needs to be done to pluralize it).

This is accomplished by modifying the "ends with apostrophe s" regex to require that there is at least one character present preceding the apostrophe (rather than "zero or more"), to ensure that the match group isn't empty for the "'" string.