Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add suport for python-brace-format #1

Draft
wants to merge 2 commits into
base: python-format-extract
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion babel/messages/extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import sys
from tokenize import generate_tokens, COMMENT, NAME, OP, STRING

from babel.util import parse_encoding, parse_future_flags, pathmatch, has_python_format
from babel.util import parse_encoding, parse_future_flags, pathmatch, has_python_format, has_python_brace_format
from textwrap import dedent


Expand Down Expand Up @@ -480,6 +480,9 @@ def extract_python(fileobj, keywords, comment_tags, options):
if has_python_format(message for message in messages if message):
flags.add("python-format")

if has_python_brace_format(message for message in messages if message):
flags.add('python-brace-format')

if len(messages) > 1:
messages = tuple(messages)
else:
Expand Down
14 changes: 14 additions & 0 deletions babel/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import re
import textwrap
import pytz as _pytz
import string
from babel import localtime

missing = object()
Expand Down Expand Up @@ -281,3 +282,16 @@ def has_python_format(ids):
if isinstance(ids, str):
ids = [ids]
return any(PYTHON_FORMAT.search(id) for id in ids)


FORMATTER = string.Formatter()


def has_python_brace_format(ids):
if isinstance(ids, str):
ids = [ids]
return any(
field_name
for message_id in ids
for _, field_name, format_spec, conversion in FORMATTER.parse(message_id)
)
18 changes: 18 additions & 0 deletions tests/messages/test_extract.py
Original file line number Diff line number Diff line change
Expand Up @@ -557,3 +557,21 @@ def test_python_format_positional(self):
extract.DEFAULT_KEYWORDS, [], {}))
assert messages[0][1] == u'foo %s'
assert messages[0][4] == {u'python-format'}

def test_python_brace_format_keyword(self):
buf = BytesIO(br"""
_(u'foo {bar}').format(bar=u'test')
""")
messages = list(extract.extract('python', buf,
extract.DEFAULT_KEYWORDS, [], {}))
assert messages[0][1] == u'foo {bar}'
assert messages[0][4] == {u'python-brace-format'}

def test_python_brace_format_positional(self):
buf = BytesIO(br"""
_(u'foo {0}').format(u'bar')
""")
messages = list(extract.extract('python', buf,
extract.DEFAULT_KEYWORDS, [], {}))
assert messages[0][1] == u'foo {0}'
assert messages[0][4] == {u'python-brace-format'}
19 changes: 18 additions & 1 deletion tests/test_util.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
import pytest

from babel import util
from babel.util import parse_future_flags, has_python_format
from babel.util import parse_future_flags, has_python_format, has_python_brace_format


class _FF:
Expand Down Expand Up @@ -124,6 +124,23 @@ def test_has_python_format(ids):

@pytest.mark.parametrize('ids', [
('foo',),
('foo {name}',),
])
def test_not_has_python_format(ids):
assert not has_python_format(ids)

@pytest.mark.parametrize('ids', [
('foo {name} bar',),
('foo {name:.3f} bar',),
('foo {name!r:20} bar',),
])
def test_has_python_brace_format(ids):
assert has_python_brace_format(ids)

@pytest.mark.parametrize('ids', [
('foo',),
('fo {}', ),
('foo %d bar',),
])
def test_not_has_python_brace_format(ids):
assert not has_python_brace_format(ids)