##// END OF EJS Templates
Isolate the displayhook created by ipython0. This fixes a test not...
Gael Varoquaux -
Show More
@@ -60,6 +60,7 b' class PrefilterFrontEnd(LineFrontEndBase):'
60 60
61 61 def __init__(self, *args, **kwargs):
62 62 LineFrontEndBase.__init__(self, *args, **kwargs)
63 self.save_output_hooks()
63 64 # Instanciate an IPython0 interpreter to be able to use the
64 65 # prefiltering.
65 66 self.ipython0 = make_IPython()
@@ -78,6 +79,8 b' class PrefilterFrontEnd(LineFrontEndBase):'
78 79 # in our environment
79 80 self.ipython0.magic_ls = mk_system_call(self.system_call,
80 81 'ls -CF')
82 # And now clean up the mess created by ipython0
83 self.release_output()
81 84 self.shell.output_trap = RedirectorOutputTrap(
82 85 out_callback=self.write,
83 86 err_callback=self.write,
@@ -85,10 +88,6 b' class PrefilterFrontEnd(LineFrontEndBase):'
85 88 self.shell.traceback_trap = SyncTracebackTrap(
86 89 formatters=self.shell.traceback_trap.formatters,
87 90 )
88 # Capture and release the outputs, to make sure all the
89 # shadow variables are set
90 self.capture_output()
91 self.release_output()
92 91
93 92 #--------------------------------------------------------------------------
94 93 # FrontEndBase interface
@@ -109,18 +108,29 b' class PrefilterFrontEnd(LineFrontEndBase):'
109 108 self.release_output()
110 109
111 110
111 def save_output_hooks(self):
112 """ Store all the output hooks we can think of, to be able to
113 restore them.
114
115 We need to do this early, as starting the ipython0 instance will
116 screw ouput hooks.
117 """
118 self.__old_cout_write = Term.cout.write
119 self.__old_cerr_write = Term.cerr.write
120 self.__old_stdout = sys.stdout
121 self.__old_stderr= sys.stderr
122 self.__old_help_output = pydoc.help.output
123 self.__old_display_hook = sys.displayhook
124
125
112 126 def capture_output(self):
113 127 """ Capture all the output mechanisms we can think of.
114 128 """
115 self.__old_cout_write = Term.cout.write
116 self.__old_err_write = Term.cerr.write
129 self.save_output_hooks()
117 130 Term.cout.write = self.write
118 131 Term.cerr.write = self.write
119 self.__old_stdout = sys.stdout
120 self.__old_stderr= sys.stderr
121 132 sys.stdout = Term.cout
122 133 sys.stderr = Term.cerr
123 self.__old_help_output = pydoc.help.output
124 134 pydoc.help.output = self.shell.output_trap.out
125 135
126 136
@@ -128,10 +138,11 b' class PrefilterFrontEnd(LineFrontEndBase):'
128 138 """ Release all the different captures we have made.
129 139 """
130 140 Term.cout.write = self.__old_cout_write
131 Term.cerr.write = self.__old_err_write
141 Term.cerr.write = self.__old_cerr_write
132 142 sys.stdout = self.__old_stdout
133 143 sys.stderr = self.__old_stderr
134 144 pydoc.help.output = self.__old_help_output
145 sys.displayhook = self.__old_display_hook
135 146
136 147
137 148 def complete(self, line):
@@ -15,6 +15,7 b' __docformat__ = "restructuredtext en"'
15 15 from IPython.frontend.prefilterfrontend import PrefilterFrontEnd
16 16 from cStringIO import StringIO
17 17 import string
18 import sys
18 19
19 20 class TestPrefilterFrontEnd(PrefilterFrontEnd):
20 21
@@ -133,8 +133,6 b' class ConsoleWidget(editwindow.EditWindow):'
133 133 # XXX: do not put print statements to sys.stdout/sys.stderr in
134 134 # this method, the print statements will call this method, as
135 135 # you will end up with an infinit loop
136 if self.debug:
137 print >>sys.__stderr__, text
138 136 title = self.title_pat.split(text)
139 137 if len(title)>1:
140 138 self.title = title[-2]
@@ -12,7 +12,7 b' class IPythonXController(WxController):'
12 12 bindings.
13 13 """
14 14
15 debug = False
15 debug = True
16 16
17 17 def __init__(self, *args, **kwargs):
18 18 WxController.__init__(self, *args, **kwargs)
@@ -42,12 +42,13 b' from IPython.frontend.prefilterfrontend import PrefilterFrontEnd'
42 42 # Constants
43 43 #-------------------------------------------------------------------------------
44 44
45 #_COMMAND_BG = '#FAFAF1' # Nice green
46 _RUNNING_BUFFER_BG = '#FDFFD3' # Nice yellow
45 _COMPLETE_BUFFER_BG = '#FAFAF1' # Nice green
46 _INPUT_BUFFER_BG = '#FDFFD3' # Nice yellow
47 47 _ERROR_BG = '#FFF1F1' # Nice red
48 48
49 _RUNNING_BUFFER_MARKER = 31
49 _COMPLETE_BUFFER_MARKER = 31
50 50 _ERROR_MARKER = 30
51 _INPUT_MARKER = 29
51 52
52 53 prompt_in1 = \
53 54 '\n\x01\x1b[0;34m\x02In [\x01\x1b[1;34m\x02$number\x01\x1b[0;34m\x02]: \x01\x1b[0m\x02'
@@ -124,6 +125,8 b' class WxController(ConsoleWidget, PrefilterFrontEnd):'
124 125 # while it is being swapped
125 126 _out_buffer_lock = Lock()
126 127
128 _markers = dict()
129
127 130 #--------------------------------------------------------------------------
128 131 # Public API
129 132 #--------------------------------------------------------------------------
@@ -136,9 +139,12 b' class WxController(ConsoleWidget, PrefilterFrontEnd):'
136 139 ConsoleWidget.__init__(self, parent, id, pos, size, style)
137 140 PrefilterFrontEnd.__init__(self)
138 141
139 # Marker for running buffer.
140 self.MarkerDefine(_RUNNING_BUFFER_MARKER, stc.STC_MARK_BACKGROUND,
141 background=_RUNNING_BUFFER_BG)
142 # Marker for complete buffer.
143 self.MarkerDefine(_COMPLETE_BUFFER_MARKER, stc.STC_MARK_BACKGROUND,
144 background=_COMPLETE_BUFFER_BG)
145 # Marker for current input buffer.
146 self.MarkerDefine(_INPUT_MARKER, stc.STC_MARK_BACKGROUND,
147 background=_INPUT_BUFFER_BG)
142 148 # Marker for tracebacks.
143 149 self.MarkerDefine(_ERROR_MARKER, stc.STC_MARK_BACKGROUND,
144 150 background=_ERROR_BG)
@@ -148,6 +154,10 b' class WxController(ConsoleWidget, PrefilterFrontEnd):'
148 154 self._buffer_flush_timer = wx.Timer(self, BUFFER_FLUSH_TIMER_ID)
149 155 wx.EVT_TIMER(self, BUFFER_FLUSH_TIMER_ID, self._buffer_flush)
150 156
157 # Inject self in namespace, for debug
158 if self.debug:
159 self.shell.user_ns['self'] = self
160
151 161
152 162 def raw_input(self, prompt):
153 163 """ A replacement from python's raw_input.
@@ -258,7 +268,9 b' class WxController(ConsoleWidget, PrefilterFrontEnd):'
258 268 end_line = self.current_prompt_line \
259 269 + max(1, len(raw_string.split('\n'))-1)
260 270 for i in range(self.current_prompt_line, end_line):
261 self.MarkerAdd(i, _RUNNING_BUFFER_MARKER)
271 if i in self._markers:
272 self.MarkerDeleteHandle(self._markers[i])
273 self._markers[i] = self.MarkerAdd(i, _COMPLETE_BUFFER_MARKER)
262 274 # Update the display:
263 275 wx.Yield()
264 276 self.GotoPos(self.GetLength())
@@ -273,7 +285,7 b' class WxController(ConsoleWidget, PrefilterFrontEnd):'
273 285
274 286 def release_output(self):
275 287 __builtin__.raw_input = self.__old_raw_input
276 PrefilterFrontEnd.capture_output(self)
288 PrefilterFrontEnd.release_output(self)
277 289
278 290
279 291 def after_execute(self):
@@ -288,7 +300,7 b' class WxController(ConsoleWidget, PrefilterFrontEnd):'
288 300 PrefilterFrontEnd.show_traceback(self)
289 301 wx.Yield()
290 302 for i in range(start_line, self.GetCurrentLine()):
291 self.MarkerAdd(i, _ERROR_MARKER)
303 self._markers[i] = self.MarkerAdd(i, _ERROR_MARKER)
292 304
293 305
294 306 #--------------------------------------------------------------------------
@@ -403,6 +415,8 b' class WxController(ConsoleWidget, PrefilterFrontEnd):'
403 415 """
404 416 if self.debug:
405 417 print >>sys.__stdout__, repr(self.input_buffer)
418 i = self.GetLineCount()
419 self._markers[i] = self.MarkerAdd(i, _INPUT_MARKER)
406 420 PrefilterFrontEnd._on_enter(self)
407 421
408 422
@@ -68,10 +68,12 b' class OutputTrap(object):'
68 68 """ Remove the hooks.
69 69 """
70 70
71 sys.stdout = self._out_save
71 if self.out_set:
72 sys.stdout = self._out_save
72 73 self.out_set = False
73 74
74 sys.stderr = self._err_save
75 if self.err_set:
76 sys.stderr = self._err_save
75 77 self.err_set = False
76 78
77 79 def clear(self):
General Comments 0
You need to be logged in to leave comments. Login now