From 60ac989d6f9884f551327cc7e9a4b71ef67ab533 Mon Sep 17 00:00:00 2001
From: Serhiy Storchaka <storchaka@gmail.com>
Date: Mon, 14 Nov 2016 19:22:12 +0200
Subject: Issue #28563: Make plural form selection more lenient and accepting
 non-integer numbers.  Django tests depend on this.

---
 Lib/gettext.py           | 12 ++++++++++--
 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())
 
 
 
-- 
cgit v0.12