From 9314230b960ef816cd0aad290f3cb463f26c327f Mon Sep 17 00:00:00 2001 From: Volker Braun Date: Sat, 23 Jul 2016 22:19:08 +0200 Subject: [PATCH] Fix doctests --- src/sage/doctest/forker.py | 25 ++++++++++--------------- src/sage/doctest/test.py | 2 +- src/sage/misc/trace.py | 1 + src/sage/repl/prompts.py | 25 +++++++++++++++++++++++++ src/sage/tests/cmdline.py | 2 +- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/src/sage/doctest/forker.py b/src/sage/doctest/forker.py index 3aad9270848..797c186a260 100644 --- a/src/sage/doctest/forker.py +++ b/src/sage/doctest/forker.py @@ -115,10 +115,6 @@ def init_sage(): from sage.structure.debug_options import debug debug.refine_category_hash_check = True - # Disable IPython colors during doctests - from sage.repl.interpreter import DEFAULT_SAGE_CONFIG - DEFAULT_SAGE_CONFIG.TerminalInteractiveShell.colors = 'NoColor' - # We import readline before forking, otherwise Pdb doesn't work # os OS X: http://trac.sagemath.org/14289 import readline @@ -1087,15 +1083,13 @@ def report_failure(self, out, test, example, got, globs): sage: _ = sage0.eval("import doctest, sys, os, multiprocessing, subprocess") sage: _ = sage0.eval("from sage.doctest.parsing import SageOutputChecker") sage: _ = sage0.eval("import sage.doctest.forker as sdf") - sage: _ = sage0.eval("sdf.init_sage()") sage: _ = sage0.eval("from sage.doctest.control import DocTestDefaults") sage: _ = sage0.eval("DD = DocTestDefaults(debug=True)") sage: _ = sage0.eval("ex1 = doctest.Example('a = 17', '')") sage: _ = sage0.eval("ex2 = doctest.Example('2*a', '1')") sage: _ = sage0.eval("DT = doctest.DocTest([ex1,ex2], globals(), 'doubling', None, 0, None)") sage: _ = sage0.eval("DTR = sdf.SageDocTestRunner(SageOutputChecker(), verbose=False, sage_options=DD, optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)") - sage: sage0._prompt = r"debug: " - sage: print(sage0.eval("DTR.run(DT, clear_globs=False)")) # indirect doctest + sage: print(sage0.eval("sdf.init_sage(); DTR.run(DT, clear_globs=False)")) # indirect doctest ********************************************************************** Line 1, in doubling Failed example: @@ -1109,7 +1103,6 @@ def report_failure(self, out, test, example, got, globs): ... sage: sage0.eval("a") '...17' - sage: sage0._prompt = "sage: " sage: sage0.eval("quit") 'Returning to doctests...TestResults(failed=1, attempted=2)' """ @@ -1143,13 +1136,14 @@ def report_failure(self, out, test, example, got, globs): print(src) if ex.want: print(doctest._indent(ex.want[:-1])) - from sage.repl.interpreter import DEFAULT_SAGE_CONFIG + from sage.repl.configuration import sage_ipython_config + from sage.repl.prompts import DebugPrompts from IPython.terminal.embed import InteractiveShellEmbed - import copy - cfg = copy.deepcopy(DEFAULT_SAGE_CONFIG) - prompt_config = cfg.PromptManager - prompt_config.in_template = 'debug: ' - prompt_config.in2_template = '.....: ' + cfg = sage_ipython_config.default() + # Currently this doesn't work: prompts only work in pty + # We keep simple_prompt=True, prompts will be "In [0]:" + # cfg.InteractiveShell.prompts_class = DebugPrompts + # cfg.InteractiveShell.simple_prompt = False shell = InteractiveShellEmbed(config=cfg, banner1='', user_ns=dict(globs)) shell(header='', stack_depth=2) except KeyboardInterrupt: @@ -1247,6 +1241,7 @@ def report_unexpected_exception(self, out, test, example, exc_info): sage: _ = sage0.eval("ex = doctest.Example('E = EllipticCurve([0,0]); E', 'A singular Elliptic Curve')") sage: _ = sage0.eval("DT = doctest.DocTest([ex], globals(), 'singular_curve', None, 0, None)") sage: _ = sage0.eval("DTR = sdf.SageDocTestRunner(SageOutputChecker(), verbose=False, sage_options=DD, optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS)") + sage: old_prompt = sage0._prompt sage: sage0._prompt = r"\(Pdb\) " sage: sage0.eval("DTR.run(DT, clear_globs=False)") # indirect doctest '... ArithmeticError("invariants " + str(ainvs) + " define a singular curve")' @@ -1256,7 +1251,7 @@ def report_unexpected_exception(self, out, test, example, exc_info): '...EllipticCurve_field.__init__(self, K, ainvs)' sage: sage0.eval("p ainvs") '(0, 0, 0, 0, 0)' - sage: sage0._prompt = "sage: " + sage: sage0._prompt = old_prompt sage: sage0.eval("quit") 'TestResults(failed=1, attempted=1)' """ diff --git a/src/sage/doctest/test.py b/src/sage/doctest/test.py index d69136f6849..a6cc4d0c657 100644 --- a/src/sage/doctest/test.py +++ b/src/sage/doctest/test.py @@ -360,7 +360,7 @@ s...: b = 5 s...: a + b 8 - debug: + In [1]: Returning to doctests... ********************************************************************** diff --git a/src/sage/misc/trace.py b/src/sage/misc/trace.py index 0da17e75cf1..efcaa33cc5f 100644 --- a/src/sage/misc/trace.py +++ b/src/sage/misc/trace.py @@ -54,6 +54,7 @@ def trace(code, preparse=True): sage: import pexpect sage: s = pexpect.spawn('sage') sage: _ = s.sendline("trace('print(factor(10))'); print(3+97)") + sage: _ = s.expect('ipdb>', timeout=90) sage: _ = s.sendline("s"); _ = s.sendline("c"); sage: _ = s.expect('100', timeout=90) diff --git a/src/sage/repl/prompts.py b/src/sage/repl/prompts.py index 69f8cddc324..e8857304d94 100644 --- a/src/sage/repl/prompts.py +++ b/src/sage/repl/prompts.py @@ -65,3 +65,28 @@ def out_prompt_tokens(self): (Token.OutPrompt, ''), ] + +class DebugPrompts(Prompts): + + def in_prompt_tokens(self, cli=None): + return [ + (Token.Prompt, 'debug: '), + ] + + def continuation_prompt_tokens(self, cli=None, width=None): + return [ + (Token.Prompt, '.....: '), + ] + + def rewrite_prompt_tokens(self): + return [ + (Token.Prompt, '-----> '), + ] + + def out_prompt_tokens(self): + return [ + (Token.OutPrompt, ''), + ] + + + diff --git a/src/sage/tests/cmdline.py b/src/sage/tests/cmdline.py index d9c8fd1eea6..98686c122f8 100644 --- a/src/sage/tests/cmdline.py +++ b/src/sage/tests/cmdline.py @@ -385,7 +385,7 @@ def test_executable(args, input="", timeout=100.0, **kwds): ********************************************************************** Previously executed commands: s...: assert True == False - debug: + In [1]: Returning to doctests... **********************************************************************