[3.12] gh-126413: Add translation tests for getopt and optparse (GH-126698) (GH-126756)

(cherry picked from commit dff074d144)
This commit is contained in:
Tomas R. 2024-11-15 12:07:16 +01:00 committed by GitHub
parent 04f38bb775
commit ad4f8debda
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 114 additions and 58 deletions

View file

@ -0,0 +1,63 @@
import re
import subprocess
import sys
import unittest
from pathlib import Path
from test.support import REPO_ROOT, TEST_HOME_DIR, requires_subprocess
from test.test_tools import skip_if_missing
pygettext = Path(REPO_ROOT) / 'Tools' / 'i18n' / 'pygettext.py'
msgid_pattern = re.compile(r'msgid(.*?)(?:msgid_plural|msgctxt|msgstr)',
re.DOTALL)
msgid_string_pattern = re.compile(r'"((?:\\"|[^"])*)"')
def _generate_po_file(path, *, stdout_only=True):
res = subprocess.run([sys.executable, pygettext,
'--no-location', '-o', '-', path],
stdout=subprocess.PIPE, stderr=subprocess.PIPE,
text=True)
if stdout_only:
return res.stdout
return res
def _extract_msgids(po):
msgids = []
for msgid in msgid_pattern.findall(po):
msgid_string = ''.join(msgid_string_pattern.findall(msgid))
msgid_string = msgid_string.replace(r'\"', '"')
if msgid_string:
msgids.append(msgid_string)
return sorted(msgids)
def _get_snapshot_path(module_name):
return Path(TEST_HOME_DIR) / 'translationdata' / module_name / 'msgids.txt'
@requires_subprocess()
class TestTranslationsBase(unittest.TestCase):
def assertMsgidsEqual(self, module):
'''Assert that msgids extracted from a given module match a
snapshot.
'''
skip_if_missing('i18n')
res = _generate_po_file(module.__file__, stdout_only=False)
self.assertEqual(res.returncode, 0)
self.assertEqual(res.stderr, '')
msgids = _extract_msgids(res.stdout)
snapshot_path = _get_snapshot_path(module.__name__)
snapshot = snapshot_path.read_text().splitlines()
self.assertListEqual(msgids, snapshot)
def update_translation_snapshots(module):
contents = _generate_po_file(module.__file__)
msgids = _extract_msgids(contents)
snapshot_path = _get_snapshot_path(module.__name__)
snapshot_path.write_text('\n'.join(msgids))

View file

@ -6,10 +6,8 @@ import inspect
import io import io
import operator import operator
import os import os
import re
import shutil import shutil
import stat import stat
import subprocess
import sys import sys
import textwrap import textwrap
import tempfile import tempfile
@ -18,15 +16,8 @@ import argparse
import warnings import warnings
from enum import StrEnum from enum import StrEnum
from pathlib import Path
from test.support import REPO_ROOT
from test.support import TEST_HOME_DIR
from test.support import captured_stderr
from test.support import import_helper
from test.support import os_helper from test.support import os_helper
from test.support import requires_subprocess from test.support.i18n_helper import TestTranslationsBase, update_translation_snapshots
from test.support import script_helper
from test.test_tools import skip_if_missing
from unittest import mock from unittest import mock
@ -6402,50 +6393,10 @@ class TestExitOnError(TestCase):
# Translation tests # Translation tests
# ================= # =================
pygettext = Path(REPO_ROOT) / 'Tools' / 'i18n' / 'pygettext.py' class TestTranslations(TestTranslationsBase):
snapshot_path = Path(TEST_HOME_DIR) / 'translationdata' / 'argparse' / 'msgids.txt'
msgid_pattern = re.compile(r'msgid(.*?)(?:msgid_plural|msgctxt|msgstr)', re.DOTALL)
msgid_string_pattern = re.compile(r'"((?:\\"|[^"])*)"')
@requires_subprocess()
class TestTranslations(unittest.TestCase):
def test_translations(self): def test_translations(self):
# Test messages extracted from the argparse module against a snapshot self.assertMsgidsEqual(argparse)
skip_if_missing('i18n')
res = generate_po_file(stdout_only=False)
self.assertEqual(res.returncode, 0)
self.assertEqual(res.stderr, '')
msgids = extract_msgids(res.stdout)
snapshot = snapshot_path.read_text().splitlines()
self.assertListEqual(msgids, snapshot)
def generate_po_file(*, stdout_only=True):
res = subprocess.run([sys.executable, pygettext,
'--no-location', '-o', '-', argparse.__file__],
stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if stdout_only:
return res.stdout
return res
def extract_msgids(po):
msgids = []
for msgid in msgid_pattern.findall(po):
msgid_string = ''.join(msgid_string_pattern.findall(msgid))
msgid_string = msgid_string.replace(r'\"', '"')
if msgid_string:
msgids.append(msgid_string)
return sorted(msgids)
def update_translation_snapshots():
contents = generate_po_file()
msgids = extract_msgids(contents)
snapshot_path.write_text('\n'.join(msgids))
def tearDownModule(): def tearDownModule():
@ -6457,6 +6408,6 @@ def tearDownModule():
if __name__ == '__main__': if __name__ == '__main__':
# To regenerate translation snapshots # To regenerate translation snapshots
if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update': if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update':
update_translation_snapshots() update_translation_snapshots(argparse)
sys.exit(0) sys.exit(0)
unittest.main() unittest.main()

View file

@ -1,11 +1,12 @@
# test_getopt.py # test_getopt.py
# David Goodger <dgoodger@bigfoot.com> 2000-08-19 # David Goodger <dgoodger@bigfoot.com> 2000-08-19
from test.support.os_helper import EnvironmentVarGuard
import doctest import doctest
import unittest
import getopt import getopt
import sys
import unittest
from test.support.i18n_helper import TestTranslationsBase, update_translation_snapshots
from test.support.os_helper import EnvironmentVarGuard
sentinel = object() sentinel = object()
@ -173,10 +174,20 @@ def test_libref_examples():
['a1', 'a2'] ['a1', 'a2']
""" """
class TestTranslations(TestTranslationsBase):
def test_translations(self):
self.assertMsgidsEqual(getopt)
def load_tests(loader, tests, pattern): def load_tests(loader, tests, pattern):
tests.addTest(doctest.DocTestSuite()) tests.addTest(doctest.DocTestSuite())
return tests return tests
if __name__ == "__main__": if __name__ == '__main__':
# To regenerate translation snapshots
if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update':
update_translation_snapshots(getopt)
sys.exit(0)
unittest.main() unittest.main()

View file

@ -15,7 +15,7 @@ import unittest
from io import StringIO from io import StringIO
from test import support from test import support
from test.support import os_helper from test.support import os_helper
from test.support.i18n_helper import TestTranslationsBase, update_translation_snapshots
import optparse import optparse
from optparse import make_option, Option, \ from optparse import make_option, Option, \
@ -1656,5 +1656,14 @@ class MiscTestCase(unittest.TestCase):
support.check__all__(self, optparse, not_exported=not_exported) support.check__all__(self, optparse, not_exported=not_exported)
class TestTranslations(TestTranslationsBase):
def test_translations(self):
self.assertMsgidsEqual(optparse)
if __name__ == '__main__': if __name__ == '__main__':
# To regenerate translation snapshots
if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update':
update_translation_snapshots(optparse)
sys.exit(0)
unittest.main() unittest.main()

View file

@ -0,0 +1,6 @@
option -%s not recognized
option -%s requires argument
option --%s must not have an argument
option --%s not a unique prefix
option --%s not recognized
option --%s requires argument

View file

@ -0,0 +1,14 @@
%prog [options]
%s option does not take a value
Options
Usage
Usage: %s\n
ambiguous option: %s (%s?)
complex
floating-point
integer
no such option: %s
option %s: invalid %s value: %r
option %s: invalid choice: %r (choose from %s)
show program's version number and exit
show this help message and exit

View file

@ -2249,6 +2249,8 @@ TESTSUBDIRS= idlelib/idle_test \
test/tracedmodules \ test/tracedmodules \
test/translationdata \ test/translationdata \
test/translationdata/argparse \ test/translationdata/argparse \
test/translationdata/getopt \
test/translationdata/optparse \
test/typinganndata \ test/typinganndata \
test/wheeldata \ test/wheeldata \
test/xmltestdata \ test/xmltestdata \