Skip to content

Commit

Permalink
redo grammar selection, add test (#765)
Browse files Browse the repository at this point in the history
  • Loading branch information
JelleZijlstra committed Mar 16, 2019
1 parent 2410213 commit ba64fc7
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 13 deletions.
18 changes: 7 additions & 11 deletions black.py
Expand Up @@ -715,24 +715,20 @@ def decode_bytes(src: bytes) -> Tuple[FileContent, Encoding, NewLine]:
return tiow.read(), encoding, newline


GRAMMARS = [
pygram.python_grammar_no_print_statement_no_exec_statement,
pygram.python_grammar_no_print_statement,
pygram.python_grammar,
]


def get_grammars(target_versions: Set[TargetVersion]) -> List[Grammar]:
if not target_versions:
return GRAMMARS
elif all(not version.is_python2() for version in target_versions):
# Python 3-compatible code, so don't try Python 2 grammar
# No target_version specified, so try all grammars.
return [
pygram.python_grammar_no_print_statement_no_exec_statement,
pygram.python_grammar_no_print_statement,
pygram.python_grammar,
]
else:
elif all(version.is_python2() for version in target_versions):
# Python 2-only code, so try Python 2 grammars.
return [pygram.python_grammar_no_print_statement, pygram.python_grammar]
else:
# Python 3-compatible code, so only try Python 3 grammar.
return [pygram.python_grammar_no_print_statement_no_exec_statement]


def lib2to3_parse(src_txt: str, target_versions: Iterable[TargetVersion] = ()) -> Node:
Expand Down
29 changes: 27 additions & 2 deletions tests/test_black.py
Expand Up @@ -28,7 +28,7 @@
from click.testing import CliRunner

import black
from black import Feature
from black import Feature, TargetVersion

try:
import blackd
Expand Down Expand Up @@ -464,7 +464,7 @@ def test_python2(self) -> None:
@patch("black.dump_to_file", dump_to_stderr)
def test_python2_print_function(self) -> None:
source, expected = read_data("python2_print_function")
mode = black.FileMode(target_versions={black.TargetVersion.PY27})
mode = black.FileMode(target_versions={TargetVersion.PY27})
actual = fs(source, mode=mode)
self.assertFormatEqual(expected, actual)
black.assert_stable(source, actual, mode)
Expand Down Expand Up @@ -828,6 +828,31 @@ def err(msg: str, **kwargs: Any) -> None:
"2 files would fail to reformat.",
)

def test_lib2to3_parse(self) -> None:
with self.assertRaises(black.InvalidInput):
black.lib2to3_parse("invalid syntax")

straddling = "x + y"
black.lib2to3_parse(straddling)
black.lib2to3_parse(straddling, {TargetVersion.PY27})
black.lib2to3_parse(straddling, {TargetVersion.PY36})
black.lib2to3_parse(straddling, {TargetVersion.PY27, TargetVersion.PY36})

py2_only = "print x"
black.lib2to3_parse(py2_only)
black.lib2to3_parse(py2_only, {TargetVersion.PY27})
with self.assertRaises(black.InvalidInput):
black.lib2to3_parse(py2_only, {TargetVersion.PY36})
with self.assertRaises(black.InvalidInput):
black.lib2to3_parse(py2_only, {TargetVersion.PY27, TargetVersion.PY36})

py3_only = "exec(x, end=y)"
black.lib2to3_parse(py3_only)
with self.assertRaises(black.InvalidInput):
black.lib2to3_parse(py3_only, {TargetVersion.PY27})
black.lib2to3_parse(py3_only, {TargetVersion.PY36})
black.lib2to3_parse(py3_only, {TargetVersion.PY27, TargetVersion.PY36})

def test_get_features_used(self) -> None:
node = black.lib2to3_parse("def f(*, arg): ...\n")
self.assertEqual(black.get_features_used(node), set())
Expand Down

0 comments on commit ba64fc7

Please sign in to comment.