Skip to content

Commit ec02b07

Browse files
committed
Add unparse_spec
1 parent 9f8e9b1 commit ec02b07

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

Lib/test/test_tools/test_i18n.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818

1919

2020
with imports_under_tool("i18n"):
21-
from pygettext import parse_spec, process_keywords, DEFAULTKEYWORDS
21+
from pygettext import (parse_spec, process_keywords, DEFAULTKEYWORDS,
22+
unparse_spec)
2223

2324

2425
def normalize_POT_file(pot):
@@ -497,6 +498,8 @@ def test_parse_keyword_spec(self):
497498
for spec, expected in valid:
498499
with self.subTest(spec=spec):
499500
self.assertEqual(parse_spec(spec), expected)
501+
# test unparse-parse round-trip
502+
self.assertEqual(parse_spec(unparse_spec(*expected)), expected)
500503

501504
invalid = (
502505
('foo:', "Invalid keyword spec 'foo:': missing argument positions"),

Tools/i18n/pygettext.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,20 @@ def parse_spec(spec):
376376
return name, result
377377

378378

379+
def unparse_spec(name, spec):
380+
"""Unparse a keyword spec dictionary into a string."""
381+
if spec == {'msgid': 0}:
382+
return name
383+
384+
parts = []
385+
for arg, pos in sorted(spec.items(), key=lambda x: x[1]):
386+
if arg == 'msgctxt':
387+
parts.append(f'{pos + 1}c')
388+
else:
389+
parts.append(str(pos + 1))
390+
return f'{name}:{','.join(parts)}'
391+
392+
379393
def process_keywords(keywords, *, no_default_keywords):
380394
custom_keywords_list = [parse_spec(spec) for spec in keywords]
381395
custom_keywords = {}

0 commit comments

Comments
 (0)