diff options
author | Niklas Hambüchen <mail@nh2.me> | 2020-01-28 00:37:22 +0100 |
---|---|---|
committer | Niklas Hambüchen <mail@nh2.me> | 2020-01-28 03:00:20 +0100 |
commit | da7f31143847659b6b74d802618b03438aceb350 (patch) | |
tree | a0e7f79452e75718cb850cfbe30a5ac986bc4e4b | |
parent | f4f6653e6aa053724d2c6dc0ee71dcb928013352 (diff) | |
download | babel-da7f31143847659b6b74d802618b03438aceb350.tar.gz |
Fix unicode printing error on Python 2 without TTY.
Until now, on Python 2.7, `python setup.py test | cat` crashed in the test
runner with
======================================================================
ERROR: test_abort_invalid_po_file (tests.messages.test_pofile.ReadPoTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "src/babel/tests/messages/test_pofile.py", line 458, in test_abort_invalid_po_file
output = pofile.read_po(buf, locale='fr', abort_invalid=False)
File "src/babel/babel/messages/pofile.py", line 377, in read_po
parser.parse(fileobj)
File "src/babel/babel/messages/pofile.py", line 310, in parse
self._process_message_line(lineno, line)
File "src/babel/babel/messages/pofile.py", line 210, in _process_message_line
self._process_keyword_line(lineno, line, obsolete)
File "src/babel/babel/messages/pofile.py", line 222, in _process_keyword_line
self._invalid_pofile(line, lineno, "Start of line didn't match any expected keyword.")
File "src/babel/babel/messages/pofile.py", line 325, in _invalid_pofile
print(u"WARNING: Problem on line {0}: {1}".format(lineno + 1, line))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 84: ordinal not in range(128)
The test suite would show this when printing the `à` in the test pofile contents
Pour toute question, veuillez communiquer avec Fulano à nadie@blah.com
But this bug is not confined to the test suite only. Any call to `read_po()`
with invalid .po file could trigger it in non-test code when
`sys.stdout.encoding` is `None`, which is the default for Python 2 when
`sys.stdout.isatty()` is false (as induced e.g. by `| cat`).
The fix is to `repr()` the line when printing the WARNING.
-rw-r--r-- | babel/messages/pofile.py | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/babel/messages/pofile.py b/babel/messages/pofile.py index f6771be..b86dd40 100644 --- a/babel/messages/pofile.py +++ b/babel/messages/pofile.py @@ -323,7 +323,10 @@ class PoFileParser(object): if self.abort_invalid: raise PoFileError(msg, self.catalog, line, lineno) print("WARNING:", msg) - print(u"WARNING: Problem on line {0}: {1}".format(lineno + 1, line)) + # `line` is guaranteed to be unicode so u"{}"-interpolating would always + # succeed, but on Python < 2 if not in a TTY, `sys.stdout.encoding` + # is `None`, unicode may not be printable so we `repr()` to ASCII. + print(u"WARNING: Problem on line {0}: {1}".format(lineno + 1, repr(line))) def read_po(fileobj, locale=None, domain=None, ignore_obsolete=False, charset=None, abort_invalid=False): |