]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-139445: Skip pyrepl tests if the terminal is not supported (GH-154497)
authorSerhiy Storchaka <storchaka@gmail.com>
Thu, 23 Jul 2026 07:44:26 +0000 (10:44 +0300)
committerGitHub <noreply@github.com>
Thu, 23 Jul 2026 07:44:26 +0000 (10:44 +0300)
They were only skipped if TERM was unset or "dumb", but pyrepl also
needs the terminal to have several capabilities.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Lib/test/test_pyrepl/test_pyrepl.py

index 4240a3c3174959950d286ae47cc0b5aa54c19ac0..04a7a1b7f56751edd7240ac99ab1db9461711a09 100644 (file)
@@ -13,7 +13,7 @@ import sys
 import tempfile
 from functools import partial
 from pkgutil import ModuleInfo
-from unittest import TestCase, skipUnless, skipIf, SkipTest
+from unittest import TestCase, skipUnless, SkipTest
 from unittest.mock import Mock, patch
 import warnings
 from test.support import (
@@ -37,6 +37,7 @@ from .support import (
     code_to_events,
 )
 from _colorize import ANSIColors, get_theme
+from _pyrepl import terminfo
 from _pyrepl.console import Event
 from _pyrepl.completing_reader import stripcolor
 from _pyrepl._module_completer import (
@@ -1998,8 +1999,20 @@ class TestDumbTerminal(ReplTestCase):
         self.assertNotIn("Traceback", output)
 
 
+def supports_pyrepl():
+    # pyrepl falls back to the basic REPL if the terminal lacks any of the
+    # capabilities which UnixConsole requires.  This covers an unset or
+    # "dumb" TERM as well, they are resolved to the "dumb" capabilities.
+    try:
+        info = terminfo.TermInfo(None)
+    except Exception:
+        return False
+    return all(info.get(cap) is not None
+               for cap in ("bel", "clear", "cup", "el"))
+
+
 @skipUnless(pty, "requires pty")
-@skipIf((os.environ.get("TERM") or "dumb") == "dumb", "can't use pyrepl in dumb terminal")
+@skipUnless(supports_pyrepl(), "can't use pyrepl in this terminal")
 class TestMain(ReplTestCase):
     def setUp(self):
         # Cleanup from PYTHON* variables to isolate from local