textual-debugger 0.0.2__tar.gz → 0.0.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {textual_debugger-0.0.2/src/textual_debugger.egg-info → textual_debugger-0.0.4}/PKG-INFO +38 -17
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/README.md +36 -16
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/pyproject.toml +27 -2
- textual_debugger-0.0.4/src/tdb/README.md +661 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/__init__.py +1 -1
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/cli.py +53 -15
- {textual_debugger-0.0.2 → textual_debugger-0.0.4/src/textual_debugger.egg-info}/PKG-INFO +38 -17
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/textual_debugger.egg-info/SOURCES.txt +1 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/textual_debugger.egg-info/requires.txt +1 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/LICENSE +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/setup.cfg +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/__main__.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/app.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/app_handlers/__init__.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/app_handlers/dap_events.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/app_handlers/inspection.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/app_helpers.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/breakpoint_hook.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/dap/__init__.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/dap/client.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/dap/messages.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/dap/protocol.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/dap/types.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/inspection.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/keybindings/__init__.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/persist.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/post_mortem.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/server/__init__.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/server/app.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/server/event_handler.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/server/handlers.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/server/rpc_types.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/server/runner.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/session/__init__.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/session/controller.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/session/event_bus.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/session/messages.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/session/state.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/session/textual_handler.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/__init__.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/async_tasks_modal.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/breakpoint_view.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/code_view.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/console_view.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/evaluate_console.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/menu_bar.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/modals.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/processes_modal.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/stack_view.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/status_bar.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/threads_modal.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/tdb/widgets/variable_view.py +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/textual_debugger.egg-info/dependency_links.txt +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/textual_debugger.egg-info/entry_points.txt +0 -0
- {textual_debugger-0.0.2 → textual_debugger-0.0.4}/src/textual_debugger.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: textual-debugger
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.4
|
|
4
4
|
Summary: A TUI Python debugger based on textual and debugpy
|
|
5
5
|
Author-email: Al Danial <al.danial@gmail.com>
|
|
6
6
|
License: textual-debugger is licensed to you under the MIT/X Consortium license:
|
|
@@ -53,6 +53,7 @@ Requires-Dist: fastapi>=0.115.0
|
|
|
53
53
|
Requires-Dist: uvicorn>=0.30.0
|
|
54
54
|
Provides-Extra: dev
|
|
55
55
|
Requires-Dist: pytest; extra == "dev"
|
|
56
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
56
57
|
Requires-Dist: pytest-asyncio; extra == "dev"
|
|
57
58
|
Requires-Dist: httpx; extra == "dev"
|
|
58
59
|
Requires-Dist: matplotlib; extra == "dev"
|
|
@@ -62,7 +63,7 @@ Requires-Dist: ruff; extra == "dev"
|
|
|
62
63
|
Requires-Dist: ipython; extra == "dev"
|
|
63
64
|
Dynamic: license-file
|
|
64
65
|
|
|
65
|
-
# `textual-debugger`
|
|
66
|
+
# `textual-debugger` version 0.0.4 2026-05-10
|
|
66
67
|
|
|
67
68
|
`textual-debugger` (the package) provides `tdb` (the command-line tool and module),
|
|
68
69
|
a full-featured terminal-based Python debugger.
|
|
@@ -83,7 +84,7 @@ MIT License. Copyright 2026 by Al Danial.
|
|
|
83
84
|
|
|
84
85
|
- supports debugging of synchronous, asynchronous, multi-threaded, and multi-process Python code.
|
|
85
86
|
It specifically supports modules
|
|
86
|
-
- `asyncio` (with a built-in async task inspector)
|
|
87
|
+
- `asyncio` (with a built-in async task inspector and task wait graph)
|
|
87
88
|
- `threading` (with a thread inspector)
|
|
88
89
|
- `multiprocessing` / `concurrent.futures` (with automatic child process attachment and a process inspector)
|
|
89
90
|
|
|
@@ -130,27 +131,46 @@ or (better):
|
|
|
130
131
|
uv pip install textual-debugger
|
|
131
132
|
```
|
|
132
133
|
|
|
134
|
+
or run it without installing:
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
uvx --from textual-debugger tdb
|
|
138
|
+
```
|
|
139
|
+
|
|
133
140
|
|
|
134
141
|
## Quick Start
|
|
135
142
|
|
|
136
143
|
```bash
|
|
137
|
-
#
|
|
144
|
+
# show comprehensive documentation in a terminal-based Markdown viewer
|
|
145
|
+
tdb --doc
|
|
146
|
+
|
|
147
|
+
# debug a script (stops at first line by default)
|
|
138
148
|
tdb my_script.py
|
|
139
149
|
|
|
140
|
-
#
|
|
150
|
+
# debug with arguments
|
|
141
151
|
tdb my_script.py arg1 arg2
|
|
142
152
|
|
|
143
|
-
#
|
|
153
|
+
# add breakpoints at lines 20 and 35 of `my_script.py` and line 14 of `module.py`
|
|
154
|
+
tdb -k 20 -k 35 -k module.py:14 my_script.py arg1 arg2
|
|
155
|
+
|
|
156
|
+
# use a specific virtualenv
|
|
144
157
|
tdb --python /path/to/venv/bin/python my_script.py
|
|
145
158
|
|
|
146
|
-
#
|
|
159
|
+
# step into, or stop at tracebacks in library code
|
|
160
|
+
tdb --no-just-my-code /path/to/venv/bin/python my_script.py
|
|
161
|
+
|
|
162
|
+
# run until first breakpoint or exit
|
|
147
163
|
tdb --no-stop-on-entry my_script.py
|
|
148
164
|
|
|
149
|
-
|
|
150
|
-
|
|
165
|
+
# run the debuggee in an external terminal
|
|
166
|
+
tdb --terminal xterm my_script.py
|
|
151
167
|
|
|
152
|
-
#
|
|
153
|
-
tdb
|
|
168
|
+
# attach to a remote Python program that has a debugpy server on port 5678
|
|
169
|
+
tdb -r remotehost:5678 my_script.py
|
|
170
|
+
|
|
171
|
+
> prevent `argparse` confusion by separating `tdb` switches from
|
|
172
|
+
> the debuggee switches by prefixing the debuggee with `--`.
|
|
173
|
+
tdb --python /path/to/venv/bin/python -- my_script.py -k 17 --max 23.3
|
|
154
174
|
```
|
|
155
175
|
|
|
156
176
|
Or use the module entry point:
|
|
@@ -505,7 +525,7 @@ This example assumes the debuggee runs on 192.168.1.10 and listens on port 5678:
|
|
|
505
525
|
|
|
506
526
|
```bash
|
|
507
527
|
# Attach from tdb:
|
|
508
|
-
tdb -r 5678
|
|
528
|
+
tdb -r 5678 # to localhost
|
|
509
529
|
tdb -r 192.168.1.10:5678
|
|
510
530
|
|
|
511
531
|
# With breakpoints:
|
|
@@ -643,18 +663,19 @@ Each is JSON with `event`, `data`, and `timestamp` fields.
|
|
|
643
663
|
## CLI Reference
|
|
644
664
|
|
|
645
665
|
```
|
|
646
|
-
usage: tdb [-h] [-r [HOST:]PORT] [
|
|
647
|
-
[--no-
|
|
648
|
-
[--
|
|
666
|
+
usage: tdb [-h] [-v/--version] [-r [HOST:]PORT] [--cwd CWD] [--no-stop-on-entry]
|
|
667
|
+
[--no-just-my-code] [--no-subprocess] [--python PYTHON]
|
|
668
|
+
[-d/--doc] [--doc-text] [--keybindings {default,vim,emacs}]
|
|
649
669
|
[--terminal {xterm,konsole,gnome-terminal,ghostty,kitty,iterm2,warp,wezterm,terminator}]
|
|
650
|
-
[--server] [--headless] [--server-port
|
|
670
|
+
[--server] [--headless] [-k FILE:LINE|LINE] [--server-port SERVER_PORT]
|
|
651
671
|
[program] [args ...]
|
|
672
|
+
|
|
652
673
|
```
|
|
653
674
|
|
|
654
675
|
| Flag | Description |
|
|
655
676
|
|------|-------------|
|
|
656
677
|
| `-r`, `--remote-attach HOST:PORT` | Attach to a remote debugpy server |
|
|
657
|
-
| `-k`, `--breakpoint FILE:LINE` | Set a breakpoint (may be repeated) |
|
|
678
|
+
| `-k`, `--breakpoint FILE:LINE|LINE` | Set a breakpoint (may be repeated) |
|
|
658
679
|
| `--no-stop-on-entry` | Do not pause at the first line (default: stop on entry) |
|
|
659
680
|
| `--cwd DIR` | Working directory for the debuggee |
|
|
660
681
|
| `--python PATH` | Python interpreter for the debuggee |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# `textual-debugger`
|
|
1
|
+
# `textual-debugger` version 0.0.4 2026-05-10
|
|
2
2
|
|
|
3
3
|
`textual-debugger` (the package) provides `tdb` (the command-line tool and module),
|
|
4
4
|
a full-featured terminal-based Python debugger.
|
|
@@ -19,7 +19,7 @@ MIT License. Copyright 2026 by Al Danial.
|
|
|
19
19
|
|
|
20
20
|
- supports debugging of synchronous, asynchronous, multi-threaded, and multi-process Python code.
|
|
21
21
|
It specifically supports modules
|
|
22
|
-
- `asyncio` (with a built-in async task inspector)
|
|
22
|
+
- `asyncio` (with a built-in async task inspector and task wait graph)
|
|
23
23
|
- `threading` (with a thread inspector)
|
|
24
24
|
- `multiprocessing` / `concurrent.futures` (with automatic child process attachment and a process inspector)
|
|
25
25
|
|
|
@@ -66,27 +66,46 @@ or (better):
|
|
|
66
66
|
uv pip install textual-debugger
|
|
67
67
|
```
|
|
68
68
|
|
|
69
|
+
or run it without installing:
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
uvx --from textual-debugger tdb
|
|
73
|
+
```
|
|
74
|
+
|
|
69
75
|
|
|
70
76
|
## Quick Start
|
|
71
77
|
|
|
72
78
|
```bash
|
|
73
|
-
#
|
|
79
|
+
# show comprehensive documentation in a terminal-based Markdown viewer
|
|
80
|
+
tdb --doc
|
|
81
|
+
|
|
82
|
+
# debug a script (stops at first line by default)
|
|
74
83
|
tdb my_script.py
|
|
75
84
|
|
|
76
|
-
#
|
|
85
|
+
# debug with arguments
|
|
77
86
|
tdb my_script.py arg1 arg2
|
|
78
87
|
|
|
79
|
-
#
|
|
88
|
+
# add breakpoints at lines 20 and 35 of `my_script.py` and line 14 of `module.py`
|
|
89
|
+
tdb -k 20 -k 35 -k module.py:14 my_script.py arg1 arg2
|
|
90
|
+
|
|
91
|
+
# use a specific virtualenv
|
|
80
92
|
tdb --python /path/to/venv/bin/python my_script.py
|
|
81
93
|
|
|
82
|
-
#
|
|
94
|
+
# step into, or stop at tracebacks in library code
|
|
95
|
+
tdb --no-just-my-code /path/to/venv/bin/python my_script.py
|
|
96
|
+
|
|
97
|
+
# run until first breakpoint or exit
|
|
83
98
|
tdb --no-stop-on-entry my_script.py
|
|
84
99
|
|
|
85
|
-
|
|
86
|
-
|
|
100
|
+
# run the debuggee in an external terminal
|
|
101
|
+
tdb --terminal xterm my_script.py
|
|
87
102
|
|
|
88
|
-
#
|
|
89
|
-
tdb
|
|
103
|
+
# attach to a remote Python program that has a debugpy server on port 5678
|
|
104
|
+
tdb -r remotehost:5678 my_script.py
|
|
105
|
+
|
|
106
|
+
> prevent `argparse` confusion by separating `tdb` switches from
|
|
107
|
+
> the debuggee switches by prefixing the debuggee with `--`.
|
|
108
|
+
tdb --python /path/to/venv/bin/python -- my_script.py -k 17 --max 23.3
|
|
90
109
|
```
|
|
91
110
|
|
|
92
111
|
Or use the module entry point:
|
|
@@ -441,7 +460,7 @@ This example assumes the debuggee runs on 192.168.1.10 and listens on port 5678:
|
|
|
441
460
|
|
|
442
461
|
```bash
|
|
443
462
|
# Attach from tdb:
|
|
444
|
-
tdb -r 5678
|
|
463
|
+
tdb -r 5678 # to localhost
|
|
445
464
|
tdb -r 192.168.1.10:5678
|
|
446
465
|
|
|
447
466
|
# With breakpoints:
|
|
@@ -579,18 +598,19 @@ Each is JSON with `event`, `data`, and `timestamp` fields.
|
|
|
579
598
|
## CLI Reference
|
|
580
599
|
|
|
581
600
|
```
|
|
582
|
-
usage: tdb [-h] [-r [HOST:]PORT] [
|
|
583
|
-
[--no-
|
|
584
|
-
[--
|
|
601
|
+
usage: tdb [-h] [-v/--version] [-r [HOST:]PORT] [--cwd CWD] [--no-stop-on-entry]
|
|
602
|
+
[--no-just-my-code] [--no-subprocess] [--python PYTHON]
|
|
603
|
+
[-d/--doc] [--doc-text] [--keybindings {default,vim,emacs}]
|
|
585
604
|
[--terminal {xterm,konsole,gnome-terminal,ghostty,kitty,iterm2,warp,wezterm,terminator}]
|
|
586
|
-
[--server] [--headless] [--server-port
|
|
605
|
+
[--server] [--headless] [-k FILE:LINE|LINE] [--server-port SERVER_PORT]
|
|
587
606
|
[program] [args ...]
|
|
607
|
+
|
|
588
608
|
```
|
|
589
609
|
|
|
590
610
|
| Flag | Description |
|
|
591
611
|
|------|-------------|
|
|
592
612
|
| `-r`, `--remote-attach HOST:PORT` | Attach to a remote debugpy server |
|
|
593
|
-
| `-k`, `--breakpoint FILE:LINE` | Set a breakpoint (may be repeated) |
|
|
613
|
+
| `-k`, `--breakpoint FILE:LINE|LINE` | Set a breakpoint (may be repeated) |
|
|
594
614
|
| `--no-stop-on-entry` | Do not pause at the first line (default: stop on entry) |
|
|
595
615
|
| `--cwd DIR` | Working directory for the debuggee |
|
|
596
616
|
| `--python PATH` | Python interpreter for the debuggee |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "textual-debugger"
|
|
3
|
-
|
|
3
|
+
dynamic = ["version"]
|
|
4
4
|
description = "A TUI Python debugger based on textual and debugpy"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10"
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
# extras needed to run the examples and tests
|
|
31
31
|
[project.optional-dependencies]
|
|
32
|
-
dev = ["pytest", "pytest-asyncio", "httpx",
|
|
32
|
+
dev = ["pytest", "pytest-cov", "pytest-asyncio", "httpx",
|
|
33
33
|
"matplotlib",
|
|
34
34
|
"pyyaml",
|
|
35
35
|
"toml",
|
|
@@ -48,12 +48,37 @@
|
|
|
48
48
|
requires = ["setuptools>=68.0"]
|
|
49
49
|
build-backend = "setuptools.build_meta"
|
|
50
50
|
|
|
51
|
+
[tool.setuptools.dynamic]
|
|
52
|
+
version = {attr = "tdb.__version__"}
|
|
53
|
+
|
|
51
54
|
[tool.setuptools.packages.find]
|
|
52
55
|
where = ["src"]
|
|
53
56
|
|
|
57
|
+
[tool.setuptools.package-data]
|
|
58
|
+
tdb = ["README.md"]
|
|
59
|
+
|
|
54
60
|
[tool.pytest.ini_options]
|
|
55
61
|
testpaths = ["tests"]
|
|
56
62
|
asyncio_mode = "auto"
|
|
63
|
+
addopts = "--cov=tdb --cov-report=term-missing"
|
|
57
64
|
filterwarnings = [
|
|
58
65
|
"ignore::DeprecationWarning",
|
|
59
66
|
]
|
|
67
|
+
|
|
68
|
+
[tool.coverage.run]
|
|
69
|
+
source = ["src/tdb"]
|
|
70
|
+
branch = true
|
|
71
|
+
omit = [
|
|
72
|
+
"*/tests/*",
|
|
73
|
+
"src/tdb/__main__.py",
|
|
74
|
+
]
|
|
75
|
+
|
|
76
|
+
[tool.coverage.report]
|
|
77
|
+
exclude_lines = [
|
|
78
|
+
"pragma: no cover",
|
|
79
|
+
"raise NotImplementedError",
|
|
80
|
+
"if TYPE_CHECKING:",
|
|
81
|
+
"if __name__ == .__main__.:",
|
|
82
|
+
]
|
|
83
|
+
show_missing = true
|
|
84
|
+
skip_covered = false
|