diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2016-11-14 17:22:12 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2016-11-14 17:22:12 (GMT) |
commit | 60ac989d6f9884f551327cc7e9a4b71ef67ab533 (patch) | |
tree | 4a2c908c9fb6d26fc58cc55628afe0587171be72 /Lib | |
parent | b626643734dfd80780a1d301d4a96e57052aa262 (diff) | |
download | cpython-60ac989d6f9884f551327cc7e9a4b71ef67ab533.zip cpython-60ac989d6f9884f551327cc7e9a4b71ef67ab533.tar.gz cpython-60ac989d6f9884f551327cc7e9a4b71ef67ab533.tar.bz2 |
Issue #28563: Make plural form selection more lenient and accepting
non-integer numbers. Django tests depend on this.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/gettext.py | 12 | ||||
-rw-r--r-- | Lib/test/test_gettext.py | 16 |
2 files changed, 20 insertions, 8 deletions
diff --git a/Lib/gettext.py b/Lib/gettext.py index 1dadbc7..5210c51 100644 --- a/Lib/gettext.py +++ b/Lib/gettext.py @@ -156,6 +156,14 @@ def _parse(tokens, priority=-1): return result, nexttok +def _as_int(n): + try: + i = round(n) + except TypeError: + raise TypeError('Plural value must be an integer, got %s' % + (n.__class__.__name__,)) from None + return n + def c2py(plural): """Gets a C expression as used in PO files for plural forms and returns a Python function that implements an equivalent expression. @@ -179,11 +187,11 @@ def c2py(plural): elif c == ')': depth -= 1 - ns = {} + ns = {'_as_int': _as_int} exec('''if True: def func(n): if not isinstance(n, int): - raise ValueError('Plural value must be an integer.') + n = _as_int(n) return int(%s) ''' % result, ns) return ns['func'] diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index f8df622..3fbc50d 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -365,12 +365,16 @@ class PluralFormsTestCase(GettextBaseTest): self.assertRaises(ZeroDivisionError, f, 0) def test_plural_number(self): - f = gettext.c2py('1') - self.assertEqual(f(1), 1) - self.assertRaises(ValueError, f, 1.0) - self.assertRaises(ValueError, f, '1') - self.assertRaises(ValueError, f, []) - self.assertRaises(ValueError, f, object()) + f = gettext.c2py('n != 1') + self.assertEqual(f(1), 0) + self.assertEqual(f(2), 1) + self.assertEqual(f(1.0), 0) + self.assertEqual(f(2.0), 1) + self.assertEqual(f(1.1), 1) + self.assertRaises(TypeError, f, '2') + self.assertRaises(TypeError, f, b'2') + self.assertRaises(TypeError, f, []) + self.assertRaises(TypeError, f, object()) |