Show More
@@ -439,11 +439,13 b' class InteractiveShell(Configurable, Magic):' | |||||
439 | self.object_info_string_level) |
|
439 | self.object_info_string_level) | |
440 |
|
440 | |||
441 | def init_io(self): |
|
441 | def init_io(self): | |
442 | import IPython.utils.io |
|
442 | # This will just use sys.stdout and sys.stderr. If you want to | |
|
443 | # override sys.stdout and sys.stderr themselves, you need to do that | |||
|
444 | # *before* instantiating this class, because Term holds onto | |||
|
445 | # references to the underlying streams. | |||
443 | if sys.platform == 'win32' and self.has_readline: |
|
446 | if sys.platform == 'win32' and self.has_readline: | |
444 | Term = io.IOTerm( |
|
447 | Term = io.IOTerm(cout=self.readline._outputfile, | |
445 |
|
|
448 | cerr=self.readline._outputfile) | |
446 | ) |
|
|||
447 | else: |
|
449 | else: | |
448 | Term = io.IOTerm() |
|
450 | Term = io.IOTerm() | |
449 | io.Term = Term |
|
451 | io.Term = Term | |
@@ -1483,9 +1485,7 b' class InteractiveShell(Configurable, Magic):' | |||||
1483 | Subclasses may override this method to put the traceback on a different |
|
1485 | Subclasses may override this method to put the traceback on a different | |
1484 | place, like a side channel. |
|
1486 | place, like a side channel. | |
1485 | """ |
|
1487 | """ | |
1486 | # FIXME: this should use the proper write channels, but our test suite |
|
1488 | print >> io.Term.cout, self.InteractiveTB.stb2text(stb) | |
1487 | # relies on it coming out of stdout... |
|
|||
1488 | print >> sys.stdout, self.InteractiveTB.stb2text(stb) |
|
|||
1489 |
|
1489 | |||
1490 | def showsyntaxerror(self, filename=None): |
|
1490 | def showsyntaxerror(self, filename=None): | |
1491 | """Display the syntax error that just occurred. |
|
1491 | """Display the syntax error that just occurred. |
@@ -5,11 +5,11 b" modifications IPython makes to system behavior don't send the doctest machinery" | |||||
5 | into a fit. This code should be considered a gross hack, but it gets the job |
|
5 | into a fit. This code should be considered a gross hack, but it gets the job | |
6 | done. |
|
6 | done. | |
7 | """ |
|
7 | """ | |
8 |
|
||||
9 | from __future__ import absolute_import |
|
8 | from __future__ import absolute_import | |
|
9 | from __future__ import print_function | |||
10 |
|
10 | |||
11 | #----------------------------------------------------------------------------- |
|
11 | #----------------------------------------------------------------------------- | |
12 | # Copyright (C) 2009 The IPython Development Team |
|
12 | # Copyright (C) 2009-2010 The IPython Development Team | |
13 | # |
|
13 | # | |
14 | # Distributed under the terms of the BSD License. The full license is in |
|
14 | # Distributed under the terms of the BSD License. The full license is in | |
15 | # the file COPYING, distributed as part of this software. |
|
15 | # the file COPYING, distributed as part of this software. | |
@@ -19,13 +19,17 b' from __future__ import absolute_import' | |||||
19 | # Imports |
|
19 | # Imports | |
20 | #----------------------------------------------------------------------------- |
|
20 | #----------------------------------------------------------------------------- | |
21 |
|
21 | |||
|
22 | # stdlib | |||
22 | import __builtin__ |
|
23 | import __builtin__ | |
23 | import commands |
|
|||
24 | import os |
|
24 | import os | |
25 | import sys |
|
25 | import sys | |
|
26 | from types import MethodType | |||
26 |
|
27 | |||
|
28 | # our own | |||
27 | from . import tools |
|
29 | from . import tools | |
28 |
|
30 | |||
|
31 | from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell | |||
|
32 | ||||
29 | #----------------------------------------------------------------------------- |
|
33 | #----------------------------------------------------------------------------- | |
30 | # Functions |
|
34 | # Functions | |
31 | #----------------------------------------------------------------------------- |
|
35 | #----------------------------------------------------------------------------- | |
@@ -53,12 +57,9 b' def _run_ns_sync(self,arg_s,runner=None):' | |||||
53 |
|
57 | |||
54 | This is strictly needed for running doctests that call %run. |
|
58 | This is strictly needed for running doctests that call %run. | |
55 | """ |
|
59 | """ | |
56 |
#print |
|
60 | #print('in run_ns_sync', arg_s, file=sys.stderr) # dbg | |
57 |
|
||||
58 | _ip = get_ipython() |
|
|||
59 | finder = py_file_finder(arg_s) |
|
61 | finder = py_file_finder(arg_s) | |
60 |
|
|
62 | return get_ipython().magic_run_ori(arg_s, runner, finder) | |
61 | return out |
|
|||
62 |
|
63 | |||
63 |
|
64 | |||
64 | class ipnsdict(dict): |
|
65 | class ipnsdict(dict): | |
@@ -104,6 +105,25 b' def get_ipython():' | |||||
104 | return start_ipython() |
|
105 | return start_ipython() | |
105 |
|
106 | |||
106 |
|
107 | |||
|
108 | # A couple of methods to override those in the running IPython to interact | |||
|
109 | # better with doctest (doctest captures on raw stdout, so we need to direct | |||
|
110 | # various types of output there otherwise it will miss them). | |||
|
111 | ||||
|
112 | def xsys(self, cmd): | |||
|
113 | """Replace the default system call with a capturing one for doctest. | |||
|
114 | """ | |||
|
115 | # We use getoutput, but we need to strip it because pexpect captures | |||
|
116 | # the trailing newline differently from commands.getoutput | |||
|
117 | print(self.getoutput(cmd).rstrip(), end='', file=sys.stdout) | |||
|
118 | sys.stdout.flush() | |||
|
119 | ||||
|
120 | ||||
|
121 | def _showtraceback(self, etype, evalue, stb): | |||
|
122 | """Print the traceback purely on stdout for doctest to capture it. | |||
|
123 | """ | |||
|
124 | print(self.InteractiveTB.stb2text(stb), file=sys.stdout) | |||
|
125 | ||||
|
126 | ||||
107 | def start_ipython(): |
|
127 | def start_ipython(): | |
108 | """Start a global IPython shell, which we need for IPython-specific syntax. |
|
128 | """Start a global IPython shell, which we need for IPython-specific syntax. | |
109 | """ |
|
129 | """ | |
@@ -113,19 +133,7 b' def start_ipython():' | |||||
113 | if hasattr(start_ipython, 'already_called'): |
|
133 | if hasattr(start_ipython, 'already_called'): | |
114 | return |
|
134 | return | |
115 | start_ipython.already_called = True |
|
135 | start_ipython.already_called = True | |
116 |
|
||||
117 | from IPython.frontend.terminal import interactiveshell |
|
|||
118 |
|
136 | |||
119 | def xsys(cmd): |
|
|||
120 | """Execute a command and print its output. |
|
|||
121 |
|
||||
122 | This is just a convenience function to replace the IPython system call |
|
|||
123 | with one that is more doctest-friendly. |
|
|||
124 | """ |
|
|||
125 | cmd = _ip.var_expand(cmd,depth=1) |
|
|||
126 | sys.stdout.write(commands.getoutput(cmd)) |
|
|||
127 | sys.stdout.flush() |
|
|||
128 |
|
||||
129 | # Store certain global objects that IPython modifies |
|
137 | # Store certain global objects that IPython modifies | |
130 | _displayhook = sys.displayhook |
|
138 | _displayhook = sys.displayhook | |
131 | _excepthook = sys.excepthook |
|
139 | _excepthook = sys.excepthook | |
@@ -135,10 +143,10 b' def start_ipython():' | |||||
135 | config = tools.default_config() |
|
143 | config = tools.default_config() | |
136 |
|
144 | |||
137 | # Create and initialize our test-friendly IPython instance. |
|
145 | # Create and initialize our test-friendly IPython instance. | |
138 |
shell = |
|
146 | shell = TerminalInteractiveShell.instance(config=config, | |
139 | config=config, |
|
147 | user_ns=ipnsdict(), | |
140 | user_ns=ipnsdict(), user_global_ns={} |
|
148 | user_global_ns={} | |
141 | ) |
|
149 | ) | |
142 |
|
150 | |||
143 | # A few more tweaks needed for playing nicely with doctests... |
|
151 | # A few more tweaks needed for playing nicely with doctests... | |
144 |
|
152 | |||
@@ -149,7 +157,11 b' def start_ipython():' | |||||
149 | # Modify the IPython system call with one that uses getoutput, so that we |
|
157 | # Modify the IPython system call with one that uses getoutput, so that we | |
150 | # can capture subcommands and print them to Python's stdout, otherwise the |
|
158 | # can capture subcommands and print them to Python's stdout, otherwise the | |
151 | # doctest machinery would miss them. |
|
159 | # doctest machinery would miss them. | |
152 | shell.system = xsys |
|
160 | shell.system = MethodType(xsys, shell, TerminalInteractiveShell) | |
|
161 | ||||
|
162 | ||||
|
163 | shell._showtraceback = MethodType(_showtraceback, shell, | |||
|
164 | TerminalInteractiveShell) | |||
153 |
|
165 | |||
154 | # IPython is ready, now clean up some global state... |
|
166 | # IPython is ready, now clean up some global state... | |
155 |
|
167 |
@@ -27,6 +27,7 b' from IPython.core.interactiveshell import (' | |||||
27 | from IPython.core.displayhook import DisplayHook |
|
27 | from IPython.core.displayhook import DisplayHook | |
28 | from IPython.core.macro import Macro |
|
28 | from IPython.core.macro import Macro | |
29 | from IPython.core.payloadpage import install_payload_page |
|
29 | from IPython.core.payloadpage import install_payload_page | |
|
30 | from IPython.utils import io | |||
30 | from IPython.utils.path import get_py_filename |
|
31 | from IPython.utils.path import get_py_filename | |
31 | from IPython.utils.text import StringTypes |
|
32 | from IPython.utils.text import StringTypes | |
32 | from IPython.utils.traitlets import Instance, Type, Dict |
|
33 | from IPython.utils.traitlets import Instance, Type, Dict | |
@@ -77,15 +78,6 b' class ZMQInteractiveShell(InteractiveShell):' | |||||
77 |
|
78 | |||
78 | displayhook_class = Type(ZMQDisplayHook) |
|
79 | displayhook_class = Type(ZMQDisplayHook) | |
79 |
|
80 | |||
80 | def init_io(self): |
|
|||
81 | # This will just use sys.stdout and sys.stderr. If you want to |
|
|||
82 | # override sys.stdout and sys.stderr themselves, you need to do that |
|
|||
83 | # *before* instantiating this class, because Term holds onto |
|
|||
84 | # references to the underlying streams. |
|
|||
85 | import IPython.utils.io |
|
|||
86 | Term = IPython.utils.io.IOTerm() |
|
|||
87 | IPython.utils.io.Term = Term |
|
|||
88 |
|
||||
89 | def magic_doctest_mode(self,parameter_s=''): |
|
81 | def magic_doctest_mode(self,parameter_s=''): | |
90 | """Toggle doctest mode on and off. |
|
82 | """Toggle doctest mode on and off. | |
91 |
|
83 |
General Comments 0
You need to be logged in to leave comments.
Login now