Skip to content

Commit

Permalink
gh-124295: Add translation tests for argparse (GH-124803)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasr8 authored Oct 27, 2024
1 parent f819d43 commit 0922a4a
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 0 deletions.
58 changes: 58 additions & 0 deletions Lib/test/test_argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@
import operator
import os
import py_compile
import re
import shutil
import stat
import subprocess
import sys
import textwrap
import tempfile
Expand All @@ -17,9 +19,13 @@
import warnings

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 requires_subprocess
from test.support import script_helper
from unittest import mock

Expand Down Expand Up @@ -7014,6 +7020,54 @@ def test_directory_in_zipfile(self, compiled=False):
def test_directory_in_zipfile_compiled(self):
self.test_directory_in_zipfile(compiled=True)

# =================
# Translation tests
# =================

pygettext = Path(REPO_ROOT) / 'Tools' / 'i18n' / 'pygettext.py'
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):
# Test messages extracted from the argparse module against a snapshot
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():
# Remove global references to avoid looking like we have refleaks.
Expand All @@ -7022,4 +7076,8 @@ def tearDownModule():


if __name__ == '__main__':
# To regenerate translation snapshots
if len(sys.argv) > 1 and sys.argv[1] == '--snapshot-update':
update_translation_snapshots()
sys.exit(0)
unittest.main()
41 changes: 41 additions & 0 deletions Lib/test/translationdata/argparse/msgids.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
(default: %(default)s)
%(heading)s:
%(prog)s: error: %(message)s\n
%(prog)s: warning: %(message)s\n
%r is not callable
'required' is an invalid argument for positionals
.__call__() not defined
ambiguous option: %(option)s could match %(matches)s
argument "-" with mode %r
argument %(argument_name)s: %(message)s
argument '%(argument_name)s' is deprecated
can't open '%(filename)s': %(error)s
cannot have multiple subparser arguments
cannot merge actions - two groups are named %r
command '%(parser_name)s' is deprecated
conflicting subparser alias: %s
conflicting subparser: %s
dest= is required for options like %r
expected at least one argument
expected at most one argument
expected one argument
ignored explicit argument %r
invalid %(type)s value: %(value)r
invalid choice: %(value)r (choose from %(choices)s)
invalid choice: %(value)r, maybe you meant %(closest)r? (choose from %(choices)s)
invalid conflict_resolution value: %r
invalid option string %(option)r: must start with a character %(prefix_chars)r
mutually exclusive arguments must be optional
not allowed with argument %s
one of the arguments %s is required
option '%(option)s' is deprecated
options
positional arguments
show program's version number and exit
show this help message and exit
subcommands
the following arguments are required: %s
unexpected option string: %s
unknown parser %(parser_name)r (choices: %(choices)s)
unrecognized arguments: %s
usage:
2 changes: 2 additions & 0 deletions Makefile.pre.in
Original file line number Diff line number Diff line change
Expand Up @@ -2548,6 +2548,8 @@ TESTSUBDIRS= idlelib/idle_test \
test/tkinterdata \
test/tokenizedata \
test/tracedmodules \
test/translationdata \
test/translationdata/argparse \
test/typinganndata \
test/wheeldata \
test/xmltestdata \
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add translation tests to the :mod:`argparse` module.

0 comments on commit 0922a4a

Please sign in to comment.