mirror of https://github.com/python/cpython
gh-126413: Add translation tests for getopt and optparse (GH-126698)
This commit is contained in:
parent
b697d8c48e
commit
dff074d144
|
@ -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))
|
|
@ -7,10 +7,8 @@ import io
|
||||||
import operator
|
import operator
|
||||||
import os
|
import os
|
||||||
import py_compile
|
import py_compile
|
||||||
import re
|
|
||||||
import shutil
|
import shutil
|
||||||
import stat
|
import stat
|
||||||
import subprocess
|
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
import tempfile
|
import tempfile
|
||||||
|
@ -19,15 +17,11 @@ 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 captured_stderr
|
||||||
from test.support import import_helper
|
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 import script_helper
|
from test.support import script_helper
|
||||||
from test.test_tools import skip_if_missing
|
from test.support.i18n_helper import TestTranslationsBase, update_translation_snapshots
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
|
|
||||||
|
@ -7056,50 +7050,10 @@ class TestProgName(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():
|
||||||
|
@ -7111,6 +7065,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()
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
@ -224,10 +225,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()
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -2567,6 +2567,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 \
|
||||||
|
|
Loading…
Reference in New Issue