Compare commits

...

2 Commits

Author SHA1 Message Date
Tyler Goodlet d716c57234 Always pass `repl: PdbREPL` as first param to fixture 2025-05-16 00:25:10 -04:00
Tyler Goodlet 7695e79cb8 Add `typing_extensions`, it's a sub-dep of `stackscope`?
Oddly my env was borked bc this (apparently missed by `uv`?) sub-dep
wasn't installed and then `stackscope` was silently failing import and
caused the shield-pause test to also fail (since it couldn't match the
expected `log.devx()` on console). The import failure is not very
explanatory due to the `log.warning()`; change it to `.error()` level.

Also, explicitly import `_sync_pause_from_builtin` in
`examples/debugging/restore_builtin_breakpoint.py` to ensure the ref is
exported properly from `.devx.debug` (which it wasn't during dev of the
prior commit Bp).
2025-05-16 00:24:09 -04:00
5 changed files with 22 additions and 4 deletions

View File

@ -4,6 +4,11 @@ import sys
import trio
import tractor
# ensure mod-path is correct!
from tractor.devx.debug import (
_sync_pause_from_builtin as _sync_pause_from_builtin,
)
async def main() -> None:
@ -13,6 +18,7 @@ async def main() -> None:
async with tractor.open_nursery(
debug_mode=True,
loglevel='devx',
) as an:
assert an
assert (

View File

@ -61,6 +61,7 @@ dev = [
# `tractor.devx` tooling
"greenback>=1.2.1,<2",
"stackscope>=0.2.2,<0.3",
"typing-extensions>=4.13.2", # needed for stackscope
"pyperclip>=1.9.0",
"prompt-toolkit>=3.0.50",
"xonsh>=0.19.2",

View File

@ -237,7 +237,7 @@ def enable_stack_on_sig(
try:
import stackscope
except ImportError:
log.warning(
log.error(
'`stackscope` not installed for use in debug mode!'
)
return None
@ -255,8 +255,8 @@ def enable_stack_on_sig(
dump_tree_on_sig,
)
log.devx(
'Enabling trace-trees on `SIGUSR1` '
'since `stackscope` is installed @ \n'
f'Enabling trace-trees on `SIGUSR1` '
f'since `stackscope` is installed @ \n'
f'{stackscope!r}\n\n'
f'With `SIGUSR1` handler\n'
f'|_{dump_tree_on_sig}\n'

View File

@ -144,6 +144,7 @@ def _post_mortem(
__tracebackhide__: bool = hide_tb
with _maybe_open_repl_fixture(
repl=repl,
repl_fixture=repl_fixture,
boxed_maybe_exc=boxed_maybe_exc,
) as enter_repl:

View File

@ -90,6 +90,7 @@ if TYPE_CHECKING:
Actor,
)
from ._post_mortem import BoxedMaybeException
from ._repl import PdbREPL
log = get_logger(__package__)
@ -109,6 +110,11 @@ _repl_fail_msg: str|None = (
# |_https://docs.python.org/3/library/contextlib.html#using-a-context-manager-as-a-function-decorator
@cm
def _maybe_open_repl_fixture(
repl: PdbREPL,
# ^XXX **always provided** by the low-level REPL-invoker,
# - _post_mortem()
# - _pause()
repl_fixture: (
AbstractContextManager[bool]
|None
@ -134,7 +140,10 @@ def _maybe_open_repl_fixture(
repl_fixture
or
rt_repl_fixture
)(maybe_bxerr=boxed_maybe_exc)
)(
repl=repl,
maybe_bxerr=boxed_maybe_exc
)
with _repl_fixture as enter_repl:
@ -252,6 +261,7 @@ async def _pause(
# nonlocal repl_fixture
with _maybe_open_repl_fixture(
repl=repl,
repl_fixture=repl_fixture,
) as enter_repl:
if not enter_repl: