From a6dd4502506e615fa61b1e66002fac0999926267 Mon Sep 17 00:00:00 2001 From: SAY-5 Date: Sat, 1 Aug 2026 23:41:09 -0700 Subject: [PATCH] Handle incomplete input in the interactive console --- backlash/console.py | 4 +++- tests/test_console.py | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/backlash/console.py b/backlash/console.py index 9e3bb6d..9cc7ca6 100644 --- a/backlash/console.py +++ b/backlash/console.py @@ -134,7 +134,9 @@ def _wrap_compiler(console): compile = console.compile def func(source, filename, symbol): code = compile(source, filename, symbol) - console.loader.register(code, source) + if code is not None: + # codeop returns None to signal that more input is needed + console.loader.register(code, source) return code console.compile = func diff --git a/tests/test_console.py b/tests/test_console.py index aa544fd..be330a7 100644 --- a/tests/test_console.py +++ b/tests/test_console.py @@ -69,3 +69,11 @@ def test_exceptions_are_rendered_as_a_traceback(monkeypatch): assert '
' in transcript assert '
1/0
' in transcript # the offending console line assert '
ZeroDivisionError: division by zero
' in transcript + + +def test_multi_line_input_is_buffered_until_complete(monkeypatch): + monkeypatch.setattr(sys, 'stdout', sys.stdout) + console = Console() + assert console.eval('if True:') == '>>> if True:\n' + assert console.eval(' x = 6*7') == '... x = 6*7\n' + assert console.eval('x') == '>>> x\n42'