Skip to content

Commit

Permalink
Copy docstrings to wrapped pdb methods
Browse files Browse the repository at this point in the history
Co-authored-by: Bruno Oliveira <bruno@pytest.org>
Co-authored-by: 🇺🇦 Sviatoslav Sydorenko (Святослав Сидоренко) <wk.cvs.github@sydorenko.org.ua>
  • Loading branch information
3 people committed Dec 28, 2024
1 parent 24e84f0 commit cc0b883
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 6 deletions.
1 change: 1 addition & 0 deletions changelog/12946.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed missing help for :mod:`pdb` commands wrapped by pytest -- by :user:`adamchainz`.
20 changes: 14 additions & 6 deletions src/_pytest/debugging.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,9 @@ def do_debug(self, arg):
cls._recursive_debug -= 1
return ret

if hasattr(pdb_cls, "do_debug"):
do_debug.__doc__ = pdb_cls.do_debug.__doc__

def do_continue(self, arg):
ret = super().do_continue(arg)
if cls._recursive_debug == 0:
Expand All @@ -185,22 +188,27 @@ def do_continue(self, arg):
self._continued = True
return ret

if hasattr(pdb_cls, "do_continue"):
do_continue.__doc__ = pdb_cls.do_continue.__doc__

do_c = do_cont = do_continue

def do_quit(self, arg):
"""Raise Exit outcome when quit command is used in pdb.
This is a bit of a hack - it would be better if BdbQuit
could be handled, but this would require to wrap the
whole pytest run, and adjust the report etc.
"""
# Raise Exit outcome when quit command is used in pdb.
#
# This is a bit of a hack - it would be better if BdbQuit
# could be handled, but this would require to wrap the
# whole pytest run, and adjust the report etc.
ret = super().do_quit(arg)

if cls._recursive_debug == 0:
outcomes.exit("Quitting debugger")

return ret

if hasattr(pdb_cls, "do_quit"):
do_quit.__doc__ = pdb_cls.do_quit.__doc__

do_q = do_quit
do_exit = do_quit

Expand Down
68 changes: 68 additions & 0 deletions testing/test_debugging.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,16 @@ def reset(self):
def interaction(self, *args):
called.append("interaction")

# Methods which we copy docstrings to.
def do_debug(self, *args): # pragma: no cover
pass

def do_continue(self, *args): # pragma: no cover
pass

def do_quit(self, *args): # pragma: no cover
pass

_pytest._CustomPdb = _CustomPdb # type: ignore
return called

Expand All @@ -75,6 +85,16 @@ def set_trace(self, frame):
print("**CustomDebugger**")
called.append("set_trace")

# Methods which we copy docstrings to.
def do_debug(self, *args): # pragma: no cover
pass

def do_continue(self, *args): # pragma: no cover
pass

def do_quit(self, *args): # pragma: no cover
pass

_pytest._CustomDebugger = _CustomDebugger # type: ignore
yield called
del _pytest._CustomDebugger # type: ignore
Expand Down Expand Up @@ -965,6 +985,34 @@ def test_1():
child.sendeof()
self.flush(child)

def test_pdb_wrapped_commands_docstrings(self, pytester: Pytester) -> None:
p1 = pytester.makepyfile(
"""
def test_1():
assert False
"""
)

child = pytester.spawn_pytest(f"--pdb {p1}")
child.expect("Pdb")

Check warning on line 997 in testing/test_debugging.py

View check run for this annotation

Codecov / codecov/patch

testing/test_debugging.py#L997

Added line #L997 was not covered by tests

# Verify no undocumented commands
child.sendline("help")
child.expect("Documented commands")
assert "Undocumented commands" not in child.before.decode()

Check warning on line 1002 in testing/test_debugging.py

View check run for this annotation

Codecov / codecov/patch

testing/test_debugging.py#L1000-L1002

Added lines #L1000 - L1002 were not covered by tests

child.sendline("help continue")
child.expect("Continue execution")
child.expect("Pdb")

Check warning on line 1006 in testing/test_debugging.py

View check run for this annotation

Codecov / codecov/patch

testing/test_debugging.py#L1004-L1006

Added lines #L1004 - L1006 were not covered by tests

child.sendline("help debug")
child.expect("Enter a recursive debugger")
child.expect("Pdb")

Check warning on line 1010 in testing/test_debugging.py

View check run for this annotation

Codecov / codecov/patch

testing/test_debugging.py#L1008-L1010

Added lines #L1008 - L1010 were not covered by tests

child.sendline("c")
child.sendeof()
self.flush(child)

Check warning on line 1014 in testing/test_debugging.py

View check run for this annotation

Codecov / codecov/patch

testing/test_debugging.py#L1012-L1014

Added lines #L1012 - L1014 were not covered by tests


class TestDebuggingBreakpoints:
@pytest.mark.parametrize("arg", ["--pdb", ""])
Expand Down Expand Up @@ -1288,6 +1336,16 @@ def set_trace(self, *args):
def runcall(self, *args, **kwds):
print("runcall_called", args, kwds)
# Methods which we copy the docstring over.
def do_debug(self, *args):
pass
def do_continue(self, *args):
pass
def do_quit(self, *args):
pass
""",
)
result = pytester.runpytest(
Expand Down Expand Up @@ -1354,6 +1412,16 @@ def __init__(self, *args, **kwargs):
def set_trace(self, *args):
print("set_trace_called", args)
# Methods which we copy the docstring over.
def do_debug(self, *args):
pass
def do_continue(self, *args):
pass
def do_quit(self, *args):
pass
""",
)
result = pytester.runpytest(str(p1), "--pdbcls=mypdb:MyPdb", syspathinsert=True)
Expand Down

0 comments on commit cc0b883

Please sign in to comment.