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) 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..60b68b829 100644 --- a/tests/test_shortcuts.py +++ b/tests/test_shortcuts.py @@ -1,7 +1,15 @@ 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 importlib import import_module +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 +74,19 @@ 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()) + prompt_module = import_module("prompt_toolkit.shortcuts.prompt") + + with patch.object(prompt_module, "PromptSession", session): + result = confirm() + + assert result is expected