From ea0cbdac9f0419457ccdf36284c0eed4c2793c25 Mon Sep 17 00:00:00 2001 From: Guillaume Gauvrit Date: Thu, 16 Oct 2025 23:21:41 +0200 Subject: [PATCH 1/2] Extract for dnpgettext --- babel/messages/extract.py | 1 + tests/messages/test_extract.py | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/babel/messages/extract.py b/babel/messages/extract.py index f0584d460..c8d97aa94 100644 --- a/babel/messages/extract.py +++ b/babel/messages/extract.py @@ -89,6 +89,7 @@ def tell(self) -> int: ... 'N_': None, 'pgettext': ((1, 'c'), 2), 'npgettext': ((1, 'c'), 2, 3), + 'dnpgettext': ((2, 'c'), 3, 4), } DEFAULT_MAPPING: list[tuple[str, str]] = [('**.py', 'python')] diff --git a/tests/messages/test_extract.py b/tests/messages/test_extract.py index 31b21e459..03f537370 100644 --- a/tests/messages/test_extract.py +++ b/tests/messages/test_extract.py @@ -166,6 +166,30 @@ def test_npgettext(self): (1, 'npgettext', ('Strings', 'pylon', 'pylons', None), []), ] + def test_dnpgettext(self): + buf = BytesIO(b"""\ +msg1 = dnpgettext('dev', 'Strings','pylon', + 'pylons', count) +msg2 = dnpgettext('dev', 'Strings','elvis', + 'elvises', + count) +""") + messages = list(extract.extract_python(buf, ('dnpgettext',), [], {})) + assert messages == [ + (1, 'dnpgettext', ('dev', 'Strings', 'pylon', 'pylons', None), []), + (3, 'dnpgettext', ('dev', 'Strings', 'elvis', 'elvises', None), []), + ] + buf = BytesIO(b"""\ +msg = dnpgettext('dev', 'Strings', 'pylon', # TRANSLATORS: shouldn't be + 'pylons', # TRANSLATORS: seeing this + count) +""") + messages = list(extract.extract_python(buf, ('dnpgettext',), + ['TRANSLATORS:'], {})) + assert messages == [ + (1, 'dnpgettext', ('dev', 'Strings', 'pylon', 'pylons', None), []), + ] + def test_triple_quoted_strings(self): buf = BytesIO(b"""\ msg1 = _('''pylons''') From 7ab70cbd6483666f5b99f32a349279b0e6807307 Mon Sep 17 00:00:00 2001 From: Guillaume Gauvrit Date: Fri, 17 Oct 2025 23:44:17 +0200 Subject: [PATCH 2/2] Update keyword installed --- babel/messages/extract.py | 1 + tests/messages/test_extract.py | 21 +++++++++++++++++++++ tests/messages/test_frontend.py | 1 + 3 files changed, 23 insertions(+) diff --git a/babel/messages/extract.py b/babel/messages/extract.py index c8d97aa94..9fa7029ea 100644 --- a/babel/messages/extract.py +++ b/babel/messages/extract.py @@ -86,6 +86,7 @@ def tell(self) -> int: ... 'ungettext': (1, 2), 'dgettext': (2,), 'dngettext': (2, 3), + 'dpgettext': ((2, 'c'), 3), 'N_': None, 'pgettext': ((1, 'c'), 2), 'npgettext': ((1, 'c'), 2, 3), diff --git a/tests/messages/test_extract.py b/tests/messages/test_extract.py index 03f537370..26c56b162 100644 --- a/tests/messages/test_extract.py +++ b/tests/messages/test_extract.py @@ -142,6 +142,27 @@ def test_multiline(self): (3, 'ngettext', ('elvis', 'elvises', None), []), ] + def test_dpgettext(self): + buf = BytesIO(b"""\ +msg1 = dpgettext('dev', 'Strings', + 'pylon') +msg2 = dpgettext('dev', 'Strings', 'elvis') +""") + messages = list(extract.extract_python(buf, ('dpgettext',), [], {})) + assert messages == [ + (1, 'dpgettext', ('dev', 'Strings', 'pylon'), []), + (3, 'dpgettext', ('dev', 'Strings', 'elvis'), []), + ] + buf = BytesIO(b"""\ +msg = dpgettext('dev', 'Strings', 'pylon', # TRANSLATORS: shouldn't be + ) # TRANSLATORS: seeing this +""") + messages = list(extract.extract_python(buf, ('dpgettext',), + ['TRANSLATORS:'], {})) + assert messages == [ + (1, 'dpgettext', ('dev', 'Strings', 'pylon', None), []), + ] + def test_npgettext(self): buf = BytesIO(b"""\ msg1 = npgettext('Strings','pylon', diff --git a/tests/messages/test_frontend.py b/tests/messages/test_frontend.py index 581ad4a8c..c95109db1 100644 --- a/tests/messages/test_frontend.py +++ b/tests/messages/test_frontend.py @@ -1582,6 +1582,7 @@ def test_extract_keyword_args_384(split, arg_name): ) assert isinstance(cmdinst, ExtractMessages) assert set(cmdinst.keywords.keys()) == {'_', 'dgettext', 'dngettext', + 'dnpgettext', 'dpgettext', 'gettext', 'gettext_lazy', 'gettext_noop', 'N_', 'ngettext', 'ngettext_lazy', 'npgettext',