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