From cb10dd5e1c8748a7058a4a80977287f2b7ee0c55 Mon Sep 17 00:00:00 2001 From: Sergey B Kirpichev Date: Fri, 23 Aug 2024 02:25:33 +0300 Subject: [PATCH] [3.13] gh-122546: Relax SyntaxError check when raising errors on the new REPL (GH-123233) (cherry picked from commit 4c3f0cbeaec0d49212d305618743fabb0e74a696) Co-authored-by: Sergey B Kirpichev --- Lib/code.py | 11 +++++++---- Lib/test/test_pyrepl/test_pyrepl.py | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Lib/code.py b/Lib/code.py index ccf2d9d144ca01..b9929685d132ae 100644 --- a/Lib/code.py +++ b/Lib/code.py @@ -13,6 +13,7 @@ __all__ = ["InteractiveInterpreter", "InteractiveConsole", "interact", "compile_command"] + class InteractiveInterpreter: """Base class for InteractiveConsole. @@ -112,7 +113,7 @@ def showsyntaxerror(self, filename=None, **kwargs): sys.last_type = type sys.last_value = value sys.last_traceback = tb - if filename and type is SyntaxError: + if filename and type and issubclass(type, SyntaxError): value.filename = filename # Set the line of text that the exception refers to source = kwargs.pop('source', '') @@ -121,7 +122,8 @@ def showsyntaxerror(self, filename=None, **kwargs): and not value.text and len(lines) >= value.lineno): value.text = lines[value.lineno - 1] if sys.excepthook is sys.__excepthook__: - lines = traceback.format_exception_only(type, value, colorize=colorize) + lines = traceback.format_exception_only( + type, value, colorize=colorize) self.write(''.join(lines)) else: # If someone has set sys.excepthook, we let that take precedence @@ -142,7 +144,8 @@ def showtraceback(self, **kwargs): sys.last_exc = ei[1] try: if sys.excepthook is sys.__excepthook__: - lines = traceback.format_exception(ei[0], ei[1], last_tb.tb_next, colorize=colorize) + lines = traceback.format_exception( + ei[0], ei[1], last_tb.tb_next, colorize=colorize) self.write(''.join(lines)) else: # If someone has set sys.excepthook, we let that take precedence @@ -376,7 +379,7 @@ def interact(banner=None, readfunc=None, local=None, exitmsg=None, local_exit=Fa parser = argparse.ArgumentParser() parser.add_argument('-q', action='store_true', - help="don't print version and copyright messages") + help="don't print version and copyright messages") args = parser.parse_args() if args.q or sys.flags.quiet: banner = '' diff --git a/Lib/test/test_pyrepl/test_pyrepl.py b/Lib/test/test_pyrepl/test_pyrepl.py index a433212fe92ddc..9944cd08dd5162 100644 --- a/Lib/test/test_pyrepl/test_pyrepl.py +++ b/Lib/test/test_pyrepl/test_pyrepl.py @@ -1109,6 +1109,10 @@ def test_correct_filename_in_syntaxerrors(self): self.skipTest("pyrepl not available") self.assertIn("SyntaxError: invalid syntax", output) self.assertIn("", output) + commands = " b\nexit()\n" + output, exit_code = self.run_repl(commands, env=env) + self.assertIn("IndentationError: unexpected indent", output) + self.assertIn("", output) def run_repl( self,