Skip to content

Commit

Permalink
Fixed error message prints function decorators when using assert in P…
Browse files Browse the repository at this point in the history
…ython 3.9 and above. (pytest-dev#9359)
  • Loading branch information
yuvalshi0 authored and nicoddemus committed Dec 7, 2021
1 parent 85897ed commit 9bfa02e
Show file tree
Hide file tree
Showing 4 changed files with 20 additions and 0 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ Xixi Zhao
Xuan Luong
Xuecong Liao
Yoav Caspi
Yuval Shimon
Zac Hatfield-Dodds
Zachary Kneupper
Zoltán Máté
Expand Down
1 change: 1 addition & 0 deletions changelog/9355.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed error message prints function decorators when using assert in Python 3.9 and above.
5 changes: 5 additions & 0 deletions src/_pytest/_code/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ def get_statement_startend2(lineno: int, node: ast.AST) -> Tuple[int, Optional[i
values: List[int] = []
for x in ast.walk(node):
if isinstance(x, (ast.stmt, ast.ExceptHandler)):
# Before Python 3.8, the lineno of a decorated class or function pointed at the decorator.
# Since Python 3.8, the lineno points to the class/def, so need to include the decorators.
if isinstance(x, (ast.ClassDef, ast.FunctionDef, ast.AsyncFunctionDef)):
for d in x.decorator_list:
values.append(d.lineno - 1)
values.append(x.lineno - 1)
for name in ("finalbody", "orelse"):
val: Optional[List[ast.stmt]] = getattr(x, name, None)
Expand Down
13 changes: 13 additions & 0 deletions testing/code/test_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -618,6 +618,19 @@ def something():
assert str(source) == "def func(): raise ValueError(42)"


def test_decorator() -> None:
s = """\
def foo(f):
pass
@foo
def bar():
pass
"""
source = getstatement(3, s)
assert "@foo" in str(source)


def XXX_test_expression_multiline() -> None:
source = """\
something
Expand Down

0 comments on commit 9bfa02e

Please sign in to comment.