From b8898c502f66a0c64ed815f31413c018bfc2d29f Mon Sep 17 00:00:00 2001 From: zhangli091011 Date: Sun, 19 Jul 2026 22:40:55 +0800 Subject: [PATCH 1/3] Ensure confirm returns a boolean after Enter --- src/prompt_toolkit/shortcuts/prompt.py | 5 +++++ tests/test_shortcuts.py | 26 ++++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/prompt_toolkit/shortcuts/prompt.py b/src/prompt_toolkit/shortcuts/prompt.py index f14ecd80c..bf263103e 100644 --- a/src/prompt_toolkit/shortcuts/prompt.py +++ b/src/prompt_toolkit/shortcuts/prompt.py @@ -1527,6 +1527,11 @@ def no(event: E) -> None: session.default_buffer.text = "n" event.app.exit(result=False) + @bindings.add("enter") + def _(event: E) -> None: + "Disallow submitting without an answer." + pass + @bindings.add(Keys.Any) def _(event: E) -> None: "Disallow inserting other text." diff --git a/tests/test_shortcuts.py b/tests/test_shortcuts.py index 287c6d33a..4f955c4df 100644 --- a/tests/test_shortcuts.py +++ b/tests/test_shortcuts.py @@ -1,7 +1,14 @@ from __future__ import annotations -from prompt_toolkit.shortcuts import print_container -from prompt_toolkit.shortcuts.prompt import _split_multiline_prompt +from functools import partial +from unittest.mock import patch + +import pytest + +from prompt_toolkit.input import create_pipe_input +from prompt_toolkit.output import DummyOutput +from prompt_toolkit.shortcuts import confirm, print_container +from prompt_toolkit.shortcuts.prompt import PromptSession, _split_multiline_prompt from prompt_toolkit.widgets import Frame, TextArea @@ -66,3 +73,18 @@ def test_print_container(tmpdir): text = fd.read() assert "Hello world" in text assert "Title" in text + + +@pytest.mark.parametrize( + ("answer", "expected"), + [("y", True), ("Y", True), ("n", False), ("N", False)], +) +def test_confirm_ignores_enter_without_answer(answer, expected): + with create_pipe_input() as input: + input.send_text(f"\r{answer}") + session = partial(PromptSession, input=input, output=DummyOutput()) + + with patch("prompt_toolkit.shortcuts.prompt.PromptSession", session): + result = confirm() + + assert result is expected From 25bc40b624eda5c8b8a84b814e7358353fd66766 Mon Sep 17 00:00:00 2001 From: zhangli091011 Date: Sun, 19 Jul 2026 23:57:46 +0800 Subject: [PATCH 2/3] Fix confirm test module patching --- tests/test_shortcuts.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_shortcuts.py b/tests/test_shortcuts.py index 4f955c4df..60b68b829 100644 --- a/tests/test_shortcuts.py +++ b/tests/test_shortcuts.py @@ -1,6 +1,7 @@ from __future__ import annotations from functools import partial +from importlib import import_module from unittest.mock import patch import pytest @@ -83,8 +84,9 @@ def test_confirm_ignores_enter_without_answer(answer, expected): with create_pipe_input() as input: input.send_text(f"\r{answer}") session = partial(PromptSession, input=input, output=DummyOutput()) + prompt_module = import_module("prompt_toolkit.shortcuts.prompt") - with patch("prompt_toolkit.shortcuts.prompt.PromptSession", session): + with patch.object(prompt_module, "PromptSession", session): result = confirm() assert result is expected From b893fcdd0eedcb495e8d8b4632f7a63d0ce98f8a Mon Sep 17 00:00:00 2001 From: zhangli091011 Date: Mon, 20 Jul 2026 00:06:00 +0800 Subject: [PATCH 3/3] Fix PDB trace dispatch typing --- src/prompt_toolkit/application/application.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/prompt_toolkit/application/application.py b/src/prompt_toolkit/application/application.py index 5e9c6a997..8c7c1bb30 100644 --- a/src/prompt_toolkit/application/application.py +++ b/src/prompt_toolkit/application/application.py @@ -1055,8 +1055,6 @@ def _breakpointhook(self, *a: object, **kw: object) -> None: import pdb from types import FrameType - TraceDispatch = Callable[[FrameType, str, Any], Any] - @contextmanager def hide_app_from_eventloop_thread() -> Generator[None, None, None]: """Stop application if `__breakpointhook__` is called from within @@ -1110,9 +1108,7 @@ async def in_loop() -> None: done.set() class CustomPdb(pdb.Pdb): - def trace_dispatch( - self, frame: FrameType, event: str, arg: Any - ) -> TraceDispatch: + def trace_dispatch(self, frame: FrameType, event: str, arg: Any) -> Any: if app._loop_thread is None: return super().trace_dispatch(frame, event, arg)