bug 1432163, add all locales to plurals.py, hack for bs, hr, sr, r?Pike draft
authorFrancesco Lodolo [:flod] <francesco.lodolo@gmail.com>
Mon, 19 Feb 2018 08:14:40 +0100
changeset 455 5a756a7d18f242c64aeb3ebea404c62feb7bebaa
parent 449 5a024113dd7c60ce98f339c929f426f1aa0449e4
push id150
push useraxel@mozilla.com
push dateMon, 19 Feb 2018 07:37:24 +0000
reviewersPike
bugs1432163
bug 1432163, add all locales to plurals.py, hack for bs, hr, sr, r?Pike MozReview-Commit-ID: Eu85X83FDxy
compare_locales/integration_tests/test_plurals.py
compare_locales/plurals.py
--- a/compare_locales/integration_tests/test_plurals.py
+++ b/compare_locales/integration_tests/test_plurals.py
@@ -17,30 +17,46 @@ TRANSVISION_URL = (
 )
 
 
 class TestPlural(unittest.TestCase):
     '''Integration test for plural forms and l10n-central.
 
     Having more plural forms than in l10n-central is OK, missing or
     mismatching ones isn't.
-    Depends on transvision.
+    Depends on Transvision.
     '''
     maxDiff = None
 
     def test_valid_forms(self):
         reference_form_map = self._load_transvision()
         compare_locales_map = self._parse_plurals_py()
-        # Notify locales in compare-locales but not in transvision
+        # For some locales the rule defined in intl.properties needs to be
+        # mapped to a different value in CATEGORIES_BY_INDEX
+        rules_exceptions = {
+            'bs': { 7: 100 },
+            'hr': { 7: 100 },
+            'sr': { 7: 100 },
+        }
+        reference_form_map = dict(
+            (
+                locale,
+                unicode(rules_exceptions[locale].get(int(rule), rule)) \
+                    if locale in rules_exceptions else rule
+            )
+            for (locale, rule) in reference_form_map.items()
+        )
+
+        # Notify locales in compare-locales but not in Transvision
         # Might be incubator locales
         extra_locales = set()
         extra_locales.update(compare_locales_map)
         extra_locales.difference_update(reference_form_map)
         for locale in sorted(extra_locales):
-            print("{} not in transvision, OK".format(locale))
+            print("{} not in Transvision, OK".format(locale))
             compare_locales_map.pop(locale)
         # Strip matches from dicts, to make diff for test small
         locales = set()
         locales.update(compare_locales_map)
         locales.intersection_update(reference_form_map)
         for locale in locales:
             if compare_locales_map[locale] == reference_form_map[locale]:
                 compare_locales_map.pop(locale)
@@ -50,17 +66,17 @@ class TestPlural(unittest.TestCase):
     def _load_transvision(self):
         '''Use the Transvision API to load all values of pluralRule
         in intl.properties.
         Skip test on load failure.
         '''
         try:
             data = urllib2.urlopen(TRANSVISION_URL).read()
         except urllib2.URLError:
-            raise unittest.SkipTest("Couldn't load transvision API.")
+            raise unittest.SkipTest("Couldn't load Transvision API.")
         return json.loads(data)
 
     def _parse_plurals_py(self):
         '''Load compare_locales.plurals, parse the AST, and inspect
         the dictionary assigned to CATEGORIES_BY_LOCALE to find
         the actual plural number.
         Convert both number and locale code to unicode for comparing
         to json.
--- a/compare_locales/plurals.py
+++ b/compare_locales/plurals.py
@@ -1,76 +1,79 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 'Mapping of locales to CLDR plural categories as implemented by PluralForm.jsm'
 
-CATEGORIES_BY_INDEX = (
+CATEGORIES_BY_INDEX = {
     # 0 (Chinese)
-    ('other',),
+    0: ('other',),
     # 1 (English)
-    ('one', 'other'),
+    1: ('one', 'other'),
     # 2 (French)
-    ('one', 'other'),
+    2: ('one', 'other'),
     # 3 (Latvian)
-    ('zero', 'one', 'other'),
+    3: ('zero', 'one', 'other'),
     # 4 (Scottish Gaelic)
-    ('one', 'two', 'few', 'other'),
+    4: ('one', 'two', 'few', 'other'),
     # 5 (Romanian)
-    ('one', 'few', 'other'),
+    5: ('one', 'few', 'other'),
     # 6 (Lithuanian)
     # CLDR: one, few, many (fractions), other
-    ('one', 'other', 'few'),
+    6: ('one', 'other', 'few'),
     # 7 (Russian)
     # CLDR: one, few, many, other (fractions)
-    ('one', 'few', 'many'),
+    7: ('one', 'few', 'many'),
     # 8 (Slovak)
     # CLDR: one, few, many (fractions), other
-    ('one', 'few', 'other'),
+    8: ('one', 'few', 'other'),
     # 9 (Polish)
     # CLDR: one, few, many, other (fractions)
-    ('one', 'few', 'many'),
+    9: ('one', 'few', 'many'),
     # 10 (Slovenian)
-    ('one', 'two', 'few', 'other'),
+    10: ('one', 'two', 'few', 'other'),
     # 11 (Irish Gaelic)
-    ('one', 'two', 'few', 'many', 'other'),
+    11: ('one', 'two', 'few', 'many', 'other'),
     # 12 (Arabic)
     # CLDR: zero, one, two, few, many, other
-    ('one', 'two', 'few', 'many', 'other', 'zero'),
+    12: ('one', 'two', 'few', 'many', 'other', 'zero'),
     # 13 (Maltese)
-    ('one', 'few', 'many', 'other'),
+    13: ('one', 'few', 'many', 'other'),
     # 14 (Unused)
     # CLDR: one, other
-    ('one', 'two', 'other'),
+    14: ('one', 'two', 'other'),
     # 15 (Icelandic, Macedonian)
-    ('one', 'other'),
+    15: ('one', 'other'),
     # 16 (Breton)
-    ('one', 'two', 'few', 'many', 'other'),
+    16: ('one', 'two', 'few', 'many', 'other'),
     # 17 (Shuar)
     # CLDR: (missing)
-    ('zero', 'other'),
+    17: ('zero', 'other'),
     # 18 (Welsh),
-    ('zero', 'one', 'two', 'few', 'many', 'other'),
-)
+    18: ('zero', 'one', 'two', 'few', 'many', 'other'),
+    # Fake plural rules to match the different CLDR order
+    # Used for bs, hr, sr instead of rule 7
+    100: ('one', 'few', 'other'),
+}
 
 CATEGORIES_BY_LOCALE = {
     'ach': CATEGORIES_BY_INDEX[1],
     'af': CATEGORIES_BY_INDEX[1],
     'an': CATEGORIES_BY_INDEX[1],
     'ar': CATEGORIES_BY_INDEX[12],
     'as': CATEGORIES_BY_INDEX[1],
     'ast': CATEGORIES_BY_INDEX[1],
     'az': CATEGORIES_BY_INDEX[1],
     'be': CATEGORIES_BY_INDEX[7],
     'bg': CATEGORIES_BY_INDEX[1],
     'bn-BD': CATEGORIES_BY_INDEX[2],
     'bn-IN': CATEGORIES_BY_INDEX[2],
     'br': CATEGORIES_BY_INDEX[1],
-    'bs': CATEGORIES_BY_INDEX[7],
+    'bs': CATEGORIES_BY_INDEX[100],
     'ca': CATEGORIES_BY_INDEX[1],
     'cak': CATEGORIES_BY_INDEX[1],
     'cs': CATEGORIES_BY_INDEX[8],
     'cy': CATEGORIES_BY_INDEX[18],
     'da': CATEGORIES_BY_INDEX[1],
     'de': CATEGORIES_BY_INDEX[1],
     'dsb': CATEGORIES_BY_INDEX[10],
     'el': CATEGORIES_BY_INDEX[1],
@@ -91,17 +94,17 @@ CATEGORIES_BY_LOCALE = {
     'fy-NL': CATEGORIES_BY_INDEX[1],
     'ga-IE': CATEGORIES_BY_INDEX[11],
     'gd': CATEGORIES_BY_INDEX[4],
     'gl': CATEGORIES_BY_INDEX[1],
     'gn': CATEGORIES_BY_INDEX[1],
     'gu-IN': CATEGORIES_BY_INDEX[2],
     'he': CATEGORIES_BY_INDEX[1],
     'hi-IN': CATEGORIES_BY_INDEX[2],
-    'hr': CATEGORIES_BY_INDEX[7],
+    'hr': CATEGORIES_BY_INDEX[100],
     'hsb': CATEGORIES_BY_INDEX[10],
     'hu': CATEGORIES_BY_INDEX[1],
     'hy-AM': CATEGORIES_BY_INDEX[1],
     'ia': CATEGORIES_BY_INDEX[1],
     'id': CATEGORIES_BY_INDEX[0],
     'is': CATEGORIES_BY_INDEX[15],
     'it': CATEGORIES_BY_INDEX[1],
     'ja': CATEGORIES_BY_INDEX[0],
@@ -114,16 +117,17 @@ CATEGORIES_BY_LOCALE = {
     'kn': CATEGORIES_BY_INDEX[1],
     'ko': CATEGORIES_BY_INDEX[0],
     'lij': CATEGORIES_BY_INDEX[1],
     'lo': CATEGORIES_BY_INDEX[0],
     'lt': CATEGORIES_BY_INDEX[6],
     'ltg': CATEGORIES_BY_INDEX[3],
     'lv': CATEGORIES_BY_INDEX[3],
     'mai': CATEGORIES_BY_INDEX[1],
+    'meh': CATEGORIES_BY_INDEX[0],
     'mk': CATEGORIES_BY_INDEX[15],
     'ml': CATEGORIES_BY_INDEX[1],
     'mr': CATEGORIES_BY_INDEX[1],
     'ms': CATEGORIES_BY_INDEX[0],
     'my': CATEGORIES_BY_INDEX[0],
     'nb-NO': CATEGORIES_BY_INDEX[1],
     'ne-NP': CATEGORIES_BY_INDEX[1],
     'nl': CATEGORIES_BY_INDEX[1],
@@ -137,26 +141,62 @@ CATEGORIES_BY_LOCALE = {
     'rm': CATEGORIES_BY_INDEX[1],
     'ro': CATEGORIES_BY_INDEX[5],
     'ru': CATEGORIES_BY_INDEX[7],
     'si': CATEGORIES_BY_INDEX[1],
     'sk': CATEGORIES_BY_INDEX[8],
     'sl': CATEGORIES_BY_INDEX[10],
     'son': CATEGORIES_BY_INDEX[1],
     'sq': CATEGORIES_BY_INDEX[1],
-    'sr': CATEGORIES_BY_INDEX[7],
+    'sr': CATEGORIES_BY_INDEX[100],
     'sv-SE': CATEGORIES_BY_INDEX[1],
     'ta': CATEGORIES_BY_INDEX[1],
     'te': CATEGORIES_BY_INDEX[1],
     'th': CATEGORIES_BY_INDEX[0],
     'tl': CATEGORIES_BY_INDEX[1],
     'tr': CATEGORIES_BY_INDEX[1],
     'trs': CATEGORIES_BY_INDEX[1],
     'uk': CATEGORIES_BY_INDEX[7],
     'ur': CATEGORIES_BY_INDEX[1],
     'uz': CATEGORIES_BY_INDEX[1],
     'vi': CATEGORIES_BY_INDEX[0],
     'wo': CATEGORIES_BY_INDEX[0],
     'xh': CATEGORIES_BY_INDEX[1],
     'zam': CATEGORIES_BY_INDEX[1],
     'zh-CN': CATEGORIES_BY_INDEX[1],
-    'zh-TW': CATEGORIES_BY_INDEX[0]
+    'zh-TW': CATEGORIES_BY_INDEX[0],
+    # Non building locales
+    'ace': CATEGORIES_BY_INDEX[0],
+    'ak': CATEGORIES_BY_INDEX[2],
+    'arn': CATEGORIES_BY_INDEX[1],
+    'brx': CATEGORIES_BY_INDEX[1],
+    'crh': CATEGORIES_BY_INDEX[1],
+    'csb': CATEGORIES_BY_INDEX[9],
+    'cv': CATEGORIES_BY_INDEX[1],
+    'fur': CATEGORIES_BY_INDEX[1],
+    'hto': CATEGORIES_BY_INDEX[1],
+    'ks': CATEGORIES_BY_INDEX[1],
+    'ku': CATEGORIES_BY_INDEX[1],
+    'lb': CATEGORIES_BY_INDEX[1],
+    'lg': CATEGORIES_BY_INDEX[1],
+    'mix': CATEGORIES_BY_INDEX[0],
+    'mn': CATEGORIES_BY_INDEX[1],
+    'nr': CATEGORIES_BY_INDEX[1],
+    'nso': CATEGORIES_BY_INDEX[2],
+    'ny': CATEGORIES_BY_INDEX[1],
+    'pai': CATEGORIES_BY_INDEX[0],
+    'quy': CATEGORIES_BY_INDEX[1],
+    'qvi': CATEGORIES_BY_INDEX[1],
+    'rw': CATEGORIES_BY_INDEX[1],
+    'sah': CATEGORIES_BY_INDEX[0],
+    'sat': CATEGORIES_BY_INDEX[1],
+    'sc': CATEGORIES_BY_INDEX[1],
+    'scn': CATEGORIES_BY_INDEX[1],
+    'ss': CATEGORIES_BY_INDEX[1],
+    'st': CATEGORIES_BY_INDEX[1],
+    'sw': CATEGORIES_BY_INDEX[1],
+    'ta-LK': CATEGORIES_BY_INDEX[1],
+    'tn': CATEGORIES_BY_INDEX[1],
+    'ts': CATEGORIES_BY_INDEX[1],
+    'tsz': CATEGORIES_BY_INDEX[1],
+    've': CATEGORIES_BY_INDEX[1],
+    'zu': CATEGORIES_BY_INDEX[2],
 }