diff options
author | Tomas R. <tomas.roun8@gmail.com> | 2024-11-14 22:17:42 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-14 22:17:42 (GMT) |
commit | 9a456383bed52010b90bd491277ea855626a7bba (patch) | |
tree | f91dbcd12969b9c9b9c4ae2ded757bcfd49abf9a /Lib | |
parent | cae9d9d20f61cdbde0765efa340b6b596c31b67f (diff) | |
download | cpython-9a456383bed52010b90bd491277ea855626a7bba.zip cpython-9a456383bed52010b90bd491277ea855626a7bba.tar.gz cpython-9a456383bed52010b90bd491277ea855626a7bba.tar.bz2 |
gh-126807: pygettext: Do not attempt to extract messages from function definitions. (GH-126808)
Fixes a bug where pygettext would attempt
to extract a message from a code like this:
def _(x): pass
This is because pygettext only looks at one
token at a time and '_(x)' looks like a
function call.
However, since 'x' is not a string literal,
it would erroneously issue a warning.
Diffstat (limited to 'Lib')
-rw-r--r-- | Lib/test/test_tools/test_i18n.py | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/Lib/test/test_tools/test_i18n.py b/Lib/test/test_tools/test_i18n.py index 21dead8..6f71f09 100644 --- a/Lib/test/test_tools/test_i18n.py +++ b/Lib/test/test_tools/test_i18n.py @@ -87,17 +87,23 @@ class Test_pygettext(unittest.TestCase): self.maxDiff = None self.assertEqual(normalize_POT_file(expected), normalize_POT_file(actual)) - def extract_docstrings_from_str(self, module_content): - """ utility: return all msgids extracted from module_content """ - filename = 'test_docstrings.py' - with temp_cwd(None) as cwd: + def extract_from_str(self, module_content, *, args=(), strict=True): + """Return all msgids extracted from module_content.""" + filename = 'test.py' + with temp_cwd(None): with open(filename, 'w', encoding='utf-8') as fp: fp.write(module_content) - assert_python_ok('-Xutf8', self.script, '-D', filename) + res = assert_python_ok('-Xutf8', self.script, *args, filename) + if strict: + self.assertEqual(res.err, b'') with open('messages.pot', encoding='utf-8') as fp: data = fp.read() return self.get_msgids(data) + def extract_docstrings_from_str(self, module_content): + """Return all docstrings extracted from module_content.""" + return self.extract_from_str(module_content, args=('--docstrings',), strict=False) + def test_header(self): """Make sure the required fields are in the header, according to: http://www.gnu.org/software/gettext/manual/gettext.html#Header-Entry @@ -344,6 +350,23 @@ class Test_pygettext(unittest.TestCase): self.assertNotIn('foo', msgids) self.assertIn('bar', msgids) + def test_function_and_class_names(self): + """Test that function and class names are not mistakenly extracted.""" + msgids = self.extract_from_str(dedent('''\ + def _(x): + pass + + def _(x="foo"): + pass + + async def _(x): + pass + + class _(object): + pass + ''')) + self.assertEqual(msgids, ['']) + def test_pygettext_output(self): """Test that the pygettext output exactly matches snapshots.""" for input_file in DATA_DIR.glob('*.py'): |