Skip to content

Commit

Permalink
Only raise first exception and remove test case
Browse files Browse the repository at this point in the history
  • Loading branch information
felix-hilden committed Jun 3, 2021
1 parent 520317e commit f31375f
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 72 deletions.
31 changes: 13 additions & 18 deletions src/black/parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,34 +108,29 @@ def lib2to3_unparse(node: Node) -> str:

def parse_ast(src: str) -> Union[ast.AST, ast3.AST, ast27.AST]:
filename = "<unknown>"
error = None
first_error = ""
if sys.version_info >= (3, 8):
# TODO: support Python 4+ ;)
for minor_version in range(sys.version_info[1], 4, -1):
try:
return ast.parse(src, filename, feature_version=(3, minor_version))
except SyntaxError as e:
if error is None:
error = str(e)
continue
if not first_error:
first_error = str(e)
else:
for feature_version in (7, 6):
try:
return ast3.parse(src, filename, feature_version=feature_version)
except SyntaxError as e:
if error is None:
error = str(e)
continue
if ast27.__name__ == "ast":
raise SyntaxError(
"The requested source code has invalid Python 3 syntax.\n"
"If you are trying to format Python 2 files please reinstall Black"
" with the 'python2' extra: `python3 -m pip install black[python2]`."
)
try:
return ast27.parse(src)
except SyntaxError as e:
raise SyntaxError(error or str(e))
except SyntaxError:
pass

if ast27.__name__ != "ast":
try:
return ast27.parse(src)
except SyntaxError:
pass

raise SyntaxError(first_error)


def stringify_ast(
Expand Down
54 changes: 0 additions & 54 deletions tests/test_black.py
Original file line number Diff line number Diff line change
Expand Up @@ -448,60 +448,6 @@ def test_skip_magic_trailing_comma(self) -> None:
)
self.assertEqual(expected, actual, msg)

@pytest.mark.no_python2
def test_python2_should_fail_without_optional_install(self) -> None:
if sys.version_info < (3, 8):
self.skipTest(
"Python 3.6 and 3.7 will install typed-ast to work and as such will be"
" able to parse Python 2 syntax without explicitly specifying the"
" python2 extra"
)

source = "x = 1234l"
tmp_file = Path(black.dump_to_file(source))
try:
runner = BlackRunner()
result = runner.invoke(black.main, [str(tmp_file)])
self.assertEqual(result.exit_code, 123)
finally:
os.unlink(tmp_file)
actual = (
result.stderr_bytes.decode()
.replace("\n", "")
.replace("\\n", "")
.replace("\\r", "")
.replace("\r", "")
)
msg = (
"The requested source code has invalid Python 3 syntax."
"If you are trying to format Python 2 files please reinstall Black"
" with the 'python2' extra: `python3 -m pip install black[python2]`."
)
self.assertIn(msg, actual)

@pytest.mark.python2
def test_safety_check_syntax_error(self) -> None:
source = "e = 'test'\nx = f'{'"
tmp_file = Path(black.dump_to_file(source))
try:
runner = BlackRunner()
result = runner.invoke(black.main, [str(tmp_file)])
self.assertEqual(result.exit_code, 123)
finally:
os.unlink(tmp_file)
actual = (
runner.stderr_bytes.decode()
.replace("\n", "")
.replace("\\n", "")
.replace("\\r", "")
.replace("\r", "")
)
msg = (
"cannot use --safe with this file; failed to parse source file."
" AST error message: f-string: expecting '}' (<unknown>, line 2)"
)
self.assertIn(msg, actual)

@pytest.mark.python2
@patch("black.dump_to_file", dump_to_stderr)
def test_python2_print_function(self) -> None:
Expand Down

0 comments on commit f31375f

Please sign in to comment.