From 2e5708f8f231696afcbea3f5803ca43b1e33bf7f Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Mon, 31 Oct 2022 13:05:00 +0200 Subject: Use `ast` instead of `eval` for string extraction This is safer (as we don't actually execute anything), and allows us to parse f-strings too. Closes #769 (supersedes it) Refs #715 (doesn't add an error yet, but doesn't crash on f-strings) --- tests/messages/test_extract.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'tests') diff --git a/tests/messages/test_extract.py b/tests/messages/test_extract.py index 47fe306..3873191 100644 --- a/tests/messages/test_extract.py +++ b/tests/messages/test_extract.py @@ -528,3 +528,30 @@ nbsp = _('\xa0') messages = list(extract.extract('python', buf, extract.DEFAULT_KEYWORDS, [], {})) assert messages[0][1] == u'\xa0' + + def test_f_strings(self): + buf = BytesIO(br""" +t1 = _('foobar') +t2 = _(f'spameggs' f'feast') # should be extracted; constant parts only +t2 = _(f'spameggs' 'kerroshampurilainen') # should be extracted (mixing f with no f) +t3 = _(f'''whoa! a ''' # should be extracted (continues on following lines) +f'flying shark' + '... hello' +) +t4 = _(f'spameggs {t1}') # should not be extracted +""") + messages = list(extract.extract('python', buf, extract.DEFAULT_KEYWORDS, [], {})) + assert len(messages) == 4 + assert messages[0][1] == u'foobar' + assert messages[1][1] == u'spameggsfeast' + assert messages[2][1] == u'spameggskerroshampurilainen' + assert messages[3][1] == u'whoa! a flying shark... hello' + + def test_f_strings_non_utf8(self): + buf = BytesIO(b""" +# -- coding: latin-1 -- +t2 = _(f'\xe5\xe4\xf6' f'\xc5\xc4\xd6') +""") + messages = list(extract.extract('python', buf, extract.DEFAULT_KEYWORDS, [], {})) + assert len(messages) == 1 + assert messages[0][1] == u'åäöÅÄÖ' -- cgit v1.2.1