##// END OF EJS Templates
Start of new callback system
Thomas Kluyver -
Show More
@@ -0,0 +1,57 b''
1 from __future__ import print_function
2
3 class CallbackManager(object):
4 def __init__(self, shell, available_callbacks):
5 self.shell = shell
6 self.callbacks = {n:[] for n in available_callbacks}
7
8 def register(self, name, function):
9 if not callable(function):
10 raise TypeError('Need a callable, got %r' % function)
11 self.callbacks[name].append(function)
12
13 def unregister(self, name, function):
14 self.callbacks[name].remove(function)
15
16 def reset(self, name):
17 self.callbacks[name] = []
18
19 def reset_all(self):
20 self.callbacks = {n:[] for n in self.callbacks}
21
22 def fire(self, name, *args, **kwargs):
23 for func in self.callbacks[name]:
24 try:
25 func(*args, **kwargs)
26 except Exception:
27 print("Error in callback {} (for {}):".format(func, name))
28 self.shell.showtraceback()
29
30 available_callbacks = {}
31 def _collect(callback_proto):
32 available_callbacks[callback_proto.__name__] = callback_proto
33 return callback_proto
34
35 @_collect
36 def pre_execute():
37 """Fires before code is executed in response to user/frontend action.
38
39 This includes comm and widget messages."""
40 pass
41
42 @_collect
43 def pre_execute_explicit():
44 """Fires before user-entered code runs."""
45 pass
46
47 @_collect
48 def post_execute():
49 """Fires after code is executed in response to user/frontend action.
50
51 This includes comm and widget messages."""
52 pass
53
54 @_collect
55 def post_execute_explicit():
56 """Fires after user-entered code runs."""
57 pass No newline at end of file
@@ -1,3213 +1,3210 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Main IPython class."""
2 """Main IPython class."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Copyright (C) 2008-2011 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 from __future__ import absolute_import
17 from __future__ import absolute_import
18 from __future__ import print_function
18 from __future__ import print_function
19
19
20 import __future__
20 import __future__
21 import abc
21 import abc
22 import ast
22 import ast
23 import atexit
23 import atexit
24 import functools
24 import functools
25 import os
25 import os
26 import re
26 import re
27 import runpy
27 import runpy
28 import sys
28 import sys
29 import tempfile
29 import tempfile
30 import types
30 import types
31 import subprocess
31 import subprocess
32 from io import open as io_open
32 from io import open as io_open
33
33
34 from IPython.config.configurable import SingletonConfigurable
34 from IPython.config.configurable import SingletonConfigurable
35 from IPython.core import debugger, oinspect
35 from IPython.core import debugger, oinspect
36 from IPython.core import magic
36 from IPython.core import magic
37 from IPython.core import page
37 from IPython.core import page
38 from IPython.core import prefilter
38 from IPython.core import prefilter
39 from IPython.core import shadowns
39 from IPython.core import shadowns
40 from IPython.core import ultratb
40 from IPython.core import ultratb
41 from IPython.core.alias import AliasManager, AliasError
41 from IPython.core.alias import AliasManager, AliasError
42 from IPython.core.autocall import ExitAutocall
42 from IPython.core.autocall import ExitAutocall
43 from IPython.core.builtin_trap import BuiltinTrap
43 from IPython.core.builtin_trap import BuiltinTrap
44 from IPython.core.callbacks import CallbackManager, available_callbacks
44 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
45 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
45 from IPython.core.display_trap import DisplayTrap
46 from IPython.core.display_trap import DisplayTrap
46 from IPython.core.displayhook import DisplayHook
47 from IPython.core.displayhook import DisplayHook
47 from IPython.core.displaypub import DisplayPublisher
48 from IPython.core.displaypub import DisplayPublisher
48 from IPython.core.error import UsageError
49 from IPython.core.error import UsageError
49 from IPython.core.extensions import ExtensionManager
50 from IPython.core.extensions import ExtensionManager
50 from IPython.core.formatters import DisplayFormatter
51 from IPython.core.formatters import DisplayFormatter
51 from IPython.core.history import HistoryManager
52 from IPython.core.history import HistoryManager
52 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
53 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
53 from IPython.core.logger import Logger
54 from IPython.core.logger import Logger
54 from IPython.core.macro import Macro
55 from IPython.core.macro import Macro
55 from IPython.core.payload import PayloadManager
56 from IPython.core.payload import PayloadManager
56 from IPython.core.prefilter import PrefilterManager
57 from IPython.core.prefilter import PrefilterManager
57 from IPython.core.profiledir import ProfileDir
58 from IPython.core.profiledir import ProfileDir
58 from IPython.core.prompts import PromptManager
59 from IPython.core.prompts import PromptManager
59 from IPython.lib.latextools import LaTeXTool
60 from IPython.lib.latextools import LaTeXTool
60 from IPython.testing.skipdoctest import skip_doctest
61 from IPython.testing.skipdoctest import skip_doctest
61 from IPython.utils import PyColorize
62 from IPython.utils import PyColorize
62 from IPython.utils import io
63 from IPython.utils import io
63 from IPython.utils import py3compat
64 from IPython.utils import py3compat
64 from IPython.utils import openpy
65 from IPython.utils import openpy
65 from IPython.utils.decorators import undoc
66 from IPython.utils.decorators import undoc
66 from IPython.utils.io import ask_yes_no
67 from IPython.utils.io import ask_yes_no
67 from IPython.utils.ipstruct import Struct
68 from IPython.utils.ipstruct import Struct
68 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
69 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
69 from IPython.utils.pickleshare import PickleShareDB
70 from IPython.utils.pickleshare import PickleShareDB
70 from IPython.utils.process import system, getoutput
71 from IPython.utils.process import system, getoutput
71 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
72 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
72 with_metaclass, iteritems)
73 with_metaclass, iteritems)
73 from IPython.utils.strdispatch import StrDispatch
74 from IPython.utils.strdispatch import StrDispatch
74 from IPython.utils.syspathcontext import prepended_to_syspath
75 from IPython.utils.syspathcontext import prepended_to_syspath
75 from IPython.utils.text import (format_screen, LSString, SList,
76 from IPython.utils.text import (format_screen, LSString, SList,
76 DollarFormatter)
77 DollarFormatter)
77 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
78 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
78 List, Unicode, Instance, Type)
79 List, Unicode, Instance, Type)
79 from IPython.utils.warn import warn, error
80 from IPython.utils.warn import warn, error
80 import IPython.core.hooks
81 import IPython.core.hooks
81
82
82 #-----------------------------------------------------------------------------
83 #-----------------------------------------------------------------------------
83 # Globals
84 # Globals
84 #-----------------------------------------------------------------------------
85 #-----------------------------------------------------------------------------
85
86
86 # compiled regexps for autoindent management
87 # compiled regexps for autoindent management
87 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
88 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
88
89
89 #-----------------------------------------------------------------------------
90 #-----------------------------------------------------------------------------
90 # Utilities
91 # Utilities
91 #-----------------------------------------------------------------------------
92 #-----------------------------------------------------------------------------
92
93
93 @undoc
94 @undoc
94 def softspace(file, newvalue):
95 def softspace(file, newvalue):
95 """Copied from code.py, to remove the dependency"""
96 """Copied from code.py, to remove the dependency"""
96
97
97 oldvalue = 0
98 oldvalue = 0
98 try:
99 try:
99 oldvalue = file.softspace
100 oldvalue = file.softspace
100 except AttributeError:
101 except AttributeError:
101 pass
102 pass
102 try:
103 try:
103 file.softspace = newvalue
104 file.softspace = newvalue
104 except (AttributeError, TypeError):
105 except (AttributeError, TypeError):
105 # "attribute-less object" or "read-only attributes"
106 # "attribute-less object" or "read-only attributes"
106 pass
107 pass
107 return oldvalue
108 return oldvalue
108
109
109 @undoc
110 @undoc
110 def no_op(*a, **kw): pass
111 def no_op(*a, **kw): pass
111
112
112 @undoc
113 @undoc
113 class NoOpContext(object):
114 class NoOpContext(object):
114 def __enter__(self): pass
115 def __enter__(self): pass
115 def __exit__(self, type, value, traceback): pass
116 def __exit__(self, type, value, traceback): pass
116 no_op_context = NoOpContext()
117 no_op_context = NoOpContext()
117
118
118 class SpaceInInput(Exception): pass
119 class SpaceInInput(Exception): pass
119
120
120 @undoc
121 @undoc
121 class Bunch: pass
122 class Bunch: pass
122
123
123
124
124 def get_default_colors():
125 def get_default_colors():
125 if sys.platform=='darwin':
126 if sys.platform=='darwin':
126 return "LightBG"
127 return "LightBG"
127 elif os.name=='nt':
128 elif os.name=='nt':
128 return 'Linux'
129 return 'Linux'
129 else:
130 else:
130 return 'Linux'
131 return 'Linux'
131
132
132
133
133 class SeparateUnicode(Unicode):
134 class SeparateUnicode(Unicode):
134 r"""A Unicode subclass to validate separate_in, separate_out, etc.
135 r"""A Unicode subclass to validate separate_in, separate_out, etc.
135
136
136 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
137 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
137 """
138 """
138
139
139 def validate(self, obj, value):
140 def validate(self, obj, value):
140 if value == '0': value = ''
141 if value == '0': value = ''
141 value = value.replace('\\n','\n')
142 value = value.replace('\\n','\n')
142 return super(SeparateUnicode, self).validate(obj, value)
143 return super(SeparateUnicode, self).validate(obj, value)
143
144
144
145
145 class ReadlineNoRecord(object):
146 class ReadlineNoRecord(object):
146 """Context manager to execute some code, then reload readline history
147 """Context manager to execute some code, then reload readline history
147 so that interactive input to the code doesn't appear when pressing up."""
148 so that interactive input to the code doesn't appear when pressing up."""
148 def __init__(self, shell):
149 def __init__(self, shell):
149 self.shell = shell
150 self.shell = shell
150 self._nested_level = 0
151 self._nested_level = 0
151
152
152 def __enter__(self):
153 def __enter__(self):
153 if self._nested_level == 0:
154 if self._nested_level == 0:
154 try:
155 try:
155 self.orig_length = self.current_length()
156 self.orig_length = self.current_length()
156 self.readline_tail = self.get_readline_tail()
157 self.readline_tail = self.get_readline_tail()
157 except (AttributeError, IndexError): # Can fail with pyreadline
158 except (AttributeError, IndexError): # Can fail with pyreadline
158 self.orig_length, self.readline_tail = 999999, []
159 self.orig_length, self.readline_tail = 999999, []
159 self._nested_level += 1
160 self._nested_level += 1
160
161
161 def __exit__(self, type, value, traceback):
162 def __exit__(self, type, value, traceback):
162 self._nested_level -= 1
163 self._nested_level -= 1
163 if self._nested_level == 0:
164 if self._nested_level == 0:
164 # Try clipping the end if it's got longer
165 # Try clipping the end if it's got longer
165 try:
166 try:
166 e = self.current_length() - self.orig_length
167 e = self.current_length() - self.orig_length
167 if e > 0:
168 if e > 0:
168 for _ in range(e):
169 for _ in range(e):
169 self.shell.readline.remove_history_item(self.orig_length)
170 self.shell.readline.remove_history_item(self.orig_length)
170
171
171 # If it still doesn't match, just reload readline history.
172 # If it still doesn't match, just reload readline history.
172 if self.current_length() != self.orig_length \
173 if self.current_length() != self.orig_length \
173 or self.get_readline_tail() != self.readline_tail:
174 or self.get_readline_tail() != self.readline_tail:
174 self.shell.refill_readline_hist()
175 self.shell.refill_readline_hist()
175 except (AttributeError, IndexError):
176 except (AttributeError, IndexError):
176 pass
177 pass
177 # Returning False will cause exceptions to propagate
178 # Returning False will cause exceptions to propagate
178 return False
179 return False
179
180
180 def current_length(self):
181 def current_length(self):
181 return self.shell.readline.get_current_history_length()
182 return self.shell.readline.get_current_history_length()
182
183
183 def get_readline_tail(self, n=10):
184 def get_readline_tail(self, n=10):
184 """Get the last n items in readline history."""
185 """Get the last n items in readline history."""
185 end = self.shell.readline.get_current_history_length() + 1
186 end = self.shell.readline.get_current_history_length() + 1
186 start = max(end-n, 1)
187 start = max(end-n, 1)
187 ghi = self.shell.readline.get_history_item
188 ghi = self.shell.readline.get_history_item
188 return [ghi(x) for x in range(start, end)]
189 return [ghi(x) for x in range(start, end)]
189
190
190
191
191 @undoc
192 @undoc
192 class DummyMod(object):
193 class DummyMod(object):
193 """A dummy module used for IPython's interactive module when
194 """A dummy module used for IPython's interactive module when
194 a namespace must be assigned to the module's __dict__."""
195 a namespace must be assigned to the module's __dict__."""
195 pass
196 pass
196
197
197 #-----------------------------------------------------------------------------
198 #-----------------------------------------------------------------------------
198 # Main IPython class
199 # Main IPython class
199 #-----------------------------------------------------------------------------
200 #-----------------------------------------------------------------------------
200
201
201 class InteractiveShell(SingletonConfigurable):
202 class InteractiveShell(SingletonConfigurable):
202 """An enhanced, interactive shell for Python."""
203 """An enhanced, interactive shell for Python."""
203
204
204 _instance = None
205 _instance = None
205
206
206 ast_transformers = List([], config=True, help=
207 ast_transformers = List([], config=True, help=
207 """
208 """
208 A list of ast.NodeTransformer subclass instances, which will be applied
209 A list of ast.NodeTransformer subclass instances, which will be applied
209 to user input before code is run.
210 to user input before code is run.
210 """
211 """
211 )
212 )
212
213
213 autocall = Enum((0,1,2), default_value=0, config=True, help=
214 autocall = Enum((0,1,2), default_value=0, config=True, help=
214 """
215 """
215 Make IPython automatically call any callable object even if you didn't
216 Make IPython automatically call any callable object even if you didn't
216 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
217 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
217 automatically. The value can be '0' to disable the feature, '1' for
218 automatically. The value can be '0' to disable the feature, '1' for
218 'smart' autocall, where it is not applied if there are no more
219 'smart' autocall, where it is not applied if there are no more
219 arguments on the line, and '2' for 'full' autocall, where all callable
220 arguments on the line, and '2' for 'full' autocall, where all callable
220 objects are automatically called (even if no arguments are present).
221 objects are automatically called (even if no arguments are present).
221 """
222 """
222 )
223 )
223 # TODO: remove all autoindent logic and put into frontends.
224 # TODO: remove all autoindent logic and put into frontends.
224 # We can't do this yet because even runlines uses the autoindent.
225 # We can't do this yet because even runlines uses the autoindent.
225 autoindent = CBool(True, config=True, help=
226 autoindent = CBool(True, config=True, help=
226 """
227 """
227 Autoindent IPython code entered interactively.
228 Autoindent IPython code entered interactively.
228 """
229 """
229 )
230 )
230 automagic = CBool(True, config=True, help=
231 automagic = CBool(True, config=True, help=
231 """
232 """
232 Enable magic commands to be called without the leading %.
233 Enable magic commands to be called without the leading %.
233 """
234 """
234 )
235 )
235 cache_size = Integer(1000, config=True, help=
236 cache_size = Integer(1000, config=True, help=
236 """
237 """
237 Set the size of the output cache. The default is 1000, you can
238 Set the size of the output cache. The default is 1000, you can
238 change it permanently in your config file. Setting it to 0 completely
239 change it permanently in your config file. Setting it to 0 completely
239 disables the caching system, and the minimum value accepted is 20 (if
240 disables the caching system, and the minimum value accepted is 20 (if
240 you provide a value less than 20, it is reset to 0 and a warning is
241 you provide a value less than 20, it is reset to 0 and a warning is
241 issued). This limit is defined because otherwise you'll spend more
242 issued). This limit is defined because otherwise you'll spend more
242 time re-flushing a too small cache than working
243 time re-flushing a too small cache than working
243 """
244 """
244 )
245 )
245 color_info = CBool(True, config=True, help=
246 color_info = CBool(True, config=True, help=
246 """
247 """
247 Use colors for displaying information about objects. Because this
248 Use colors for displaying information about objects. Because this
248 information is passed through a pager (like 'less'), and some pagers
249 information is passed through a pager (like 'less'), and some pagers
249 get confused with color codes, this capability can be turned off.
250 get confused with color codes, this capability can be turned off.
250 """
251 """
251 )
252 )
252 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
253 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
253 default_value=get_default_colors(), config=True,
254 default_value=get_default_colors(), config=True,
254 help="Set the color scheme (NoColor, Linux, or LightBG)."
255 help="Set the color scheme (NoColor, Linux, or LightBG)."
255 )
256 )
256 colors_force = CBool(False, help=
257 colors_force = CBool(False, help=
257 """
258 """
258 Force use of ANSI color codes, regardless of OS and readline
259 Force use of ANSI color codes, regardless of OS and readline
259 availability.
260 availability.
260 """
261 """
261 # FIXME: This is essentially a hack to allow ZMQShell to show colors
262 # FIXME: This is essentially a hack to allow ZMQShell to show colors
262 # without readline on Win32. When the ZMQ formatting system is
263 # without readline on Win32. When the ZMQ formatting system is
263 # refactored, this should be removed.
264 # refactored, this should be removed.
264 )
265 )
265 debug = CBool(False, config=True)
266 debug = CBool(False, config=True)
266 deep_reload = CBool(False, config=True, help=
267 deep_reload = CBool(False, config=True, help=
267 """
268 """
268 Enable deep (recursive) reloading by default. IPython can use the
269 Enable deep (recursive) reloading by default. IPython can use the
269 deep_reload module which reloads changes in modules recursively (it
270 deep_reload module which reloads changes in modules recursively (it
270 replaces the reload() function, so you don't need to change anything to
271 replaces the reload() function, so you don't need to change anything to
271 use it). deep_reload() forces a full reload of modules whose code may
272 use it). deep_reload() forces a full reload of modules whose code may
272 have changed, which the default reload() function does not. When
273 have changed, which the default reload() function does not. When
273 deep_reload is off, IPython will use the normal reload(), but
274 deep_reload is off, IPython will use the normal reload(), but
274 deep_reload will still be available as dreload().
275 deep_reload will still be available as dreload().
275 """
276 """
276 )
277 )
277 disable_failing_post_execute = CBool(False, config=True,
278 disable_failing_post_execute = CBool(False, config=True,
278 help="Don't call post-execute functions that have failed in the past."
279 help="Don't call post-execute functions that have failed in the past."
279 )
280 )
280 display_formatter = Instance(DisplayFormatter)
281 display_formatter = Instance(DisplayFormatter)
281 displayhook_class = Type(DisplayHook)
282 displayhook_class = Type(DisplayHook)
282 display_pub_class = Type(DisplayPublisher)
283 display_pub_class = Type(DisplayPublisher)
283 data_pub_class = None
284 data_pub_class = None
284
285
285 exit_now = CBool(False)
286 exit_now = CBool(False)
286 exiter = Instance(ExitAutocall)
287 exiter = Instance(ExitAutocall)
287 def _exiter_default(self):
288 def _exiter_default(self):
288 return ExitAutocall(self)
289 return ExitAutocall(self)
289 # Monotonically increasing execution counter
290 # Monotonically increasing execution counter
290 execution_count = Integer(1)
291 execution_count = Integer(1)
291 filename = Unicode("<ipython console>")
292 filename = Unicode("<ipython console>")
292 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
293 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
293
294
294 # Input splitter, to transform input line by line and detect when a block
295 # Input splitter, to transform input line by line and detect when a block
295 # is ready to be executed.
296 # is ready to be executed.
296 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
297 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
297 (), {'line_input_checker': True})
298 (), {'line_input_checker': True})
298
299
299 # This InputSplitter instance is used to transform completed cells before
300 # This InputSplitter instance is used to transform completed cells before
300 # running them. It allows cell magics to contain blank lines.
301 # running them. It allows cell magics to contain blank lines.
301 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
302 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
302 (), {'line_input_checker': False})
303 (), {'line_input_checker': False})
303
304
304 logstart = CBool(False, config=True, help=
305 logstart = CBool(False, config=True, help=
305 """
306 """
306 Start logging to the default log file.
307 Start logging to the default log file.
307 """
308 """
308 )
309 )
309 logfile = Unicode('', config=True, help=
310 logfile = Unicode('', config=True, help=
310 """
311 """
311 The name of the logfile to use.
312 The name of the logfile to use.
312 """
313 """
313 )
314 )
314 logappend = Unicode('', config=True, help=
315 logappend = Unicode('', config=True, help=
315 """
316 """
316 Start logging to the given file in append mode.
317 Start logging to the given file in append mode.
317 """
318 """
318 )
319 )
319 object_info_string_level = Enum((0,1,2), default_value=0,
320 object_info_string_level = Enum((0,1,2), default_value=0,
320 config=True)
321 config=True)
321 pdb = CBool(False, config=True, help=
322 pdb = CBool(False, config=True, help=
322 """
323 """
323 Automatically call the pdb debugger after every exception.
324 Automatically call the pdb debugger after every exception.
324 """
325 """
325 )
326 )
326 multiline_history = CBool(sys.platform != 'win32', config=True,
327 multiline_history = CBool(sys.platform != 'win32', config=True,
327 help="Save multi-line entries as one entry in readline history"
328 help="Save multi-line entries as one entry in readline history"
328 )
329 )
329
330
330 # deprecated prompt traits:
331 # deprecated prompt traits:
331
332
332 prompt_in1 = Unicode('In [\\#]: ', config=True,
333 prompt_in1 = Unicode('In [\\#]: ', config=True,
333 help="Deprecated, use PromptManager.in_template")
334 help="Deprecated, use PromptManager.in_template")
334 prompt_in2 = Unicode(' .\\D.: ', config=True,
335 prompt_in2 = Unicode(' .\\D.: ', config=True,
335 help="Deprecated, use PromptManager.in2_template")
336 help="Deprecated, use PromptManager.in2_template")
336 prompt_out = Unicode('Out[\\#]: ', config=True,
337 prompt_out = Unicode('Out[\\#]: ', config=True,
337 help="Deprecated, use PromptManager.out_template")
338 help="Deprecated, use PromptManager.out_template")
338 prompts_pad_left = CBool(True, config=True,
339 prompts_pad_left = CBool(True, config=True,
339 help="Deprecated, use PromptManager.justify")
340 help="Deprecated, use PromptManager.justify")
340
341
341 def _prompt_trait_changed(self, name, old, new):
342 def _prompt_trait_changed(self, name, old, new):
342 table = {
343 table = {
343 'prompt_in1' : 'in_template',
344 'prompt_in1' : 'in_template',
344 'prompt_in2' : 'in2_template',
345 'prompt_in2' : 'in2_template',
345 'prompt_out' : 'out_template',
346 'prompt_out' : 'out_template',
346 'prompts_pad_left' : 'justify',
347 'prompts_pad_left' : 'justify',
347 }
348 }
348 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
349 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
349 name=name, newname=table[name])
350 name=name, newname=table[name])
350 )
351 )
351 # protect against weird cases where self.config may not exist:
352 # protect against weird cases where self.config may not exist:
352 if self.config is not None:
353 if self.config is not None:
353 # propagate to corresponding PromptManager trait
354 # propagate to corresponding PromptManager trait
354 setattr(self.config.PromptManager, table[name], new)
355 setattr(self.config.PromptManager, table[name], new)
355
356
356 _prompt_in1_changed = _prompt_trait_changed
357 _prompt_in1_changed = _prompt_trait_changed
357 _prompt_in2_changed = _prompt_trait_changed
358 _prompt_in2_changed = _prompt_trait_changed
358 _prompt_out_changed = _prompt_trait_changed
359 _prompt_out_changed = _prompt_trait_changed
359 _prompt_pad_left_changed = _prompt_trait_changed
360 _prompt_pad_left_changed = _prompt_trait_changed
360
361
361 show_rewritten_input = CBool(True, config=True,
362 show_rewritten_input = CBool(True, config=True,
362 help="Show rewritten input, e.g. for autocall."
363 help="Show rewritten input, e.g. for autocall."
363 )
364 )
364
365
365 quiet = CBool(False, config=True)
366 quiet = CBool(False, config=True)
366
367
367 history_length = Integer(10000, config=True)
368 history_length = Integer(10000, config=True)
368
369
369 # The readline stuff will eventually be moved to the terminal subclass
370 # The readline stuff will eventually be moved to the terminal subclass
370 # but for now, we can't do that as readline is welded in everywhere.
371 # but for now, we can't do that as readline is welded in everywhere.
371 readline_use = CBool(True, config=True)
372 readline_use = CBool(True, config=True)
372 readline_remove_delims = Unicode('-/~', config=True)
373 readline_remove_delims = Unicode('-/~', config=True)
373 readline_delims = Unicode() # set by init_readline()
374 readline_delims = Unicode() # set by init_readline()
374 # don't use \M- bindings by default, because they
375 # don't use \M- bindings by default, because they
375 # conflict with 8-bit encodings. See gh-58,gh-88
376 # conflict with 8-bit encodings. See gh-58,gh-88
376 readline_parse_and_bind = List([
377 readline_parse_and_bind = List([
377 'tab: complete',
378 'tab: complete',
378 '"\C-l": clear-screen',
379 '"\C-l": clear-screen',
379 'set show-all-if-ambiguous on',
380 'set show-all-if-ambiguous on',
380 '"\C-o": tab-insert',
381 '"\C-o": tab-insert',
381 '"\C-r": reverse-search-history',
382 '"\C-r": reverse-search-history',
382 '"\C-s": forward-search-history',
383 '"\C-s": forward-search-history',
383 '"\C-p": history-search-backward',
384 '"\C-p": history-search-backward',
384 '"\C-n": history-search-forward',
385 '"\C-n": history-search-forward',
385 '"\e[A": history-search-backward',
386 '"\e[A": history-search-backward',
386 '"\e[B": history-search-forward',
387 '"\e[B": history-search-forward',
387 '"\C-k": kill-line',
388 '"\C-k": kill-line',
388 '"\C-u": unix-line-discard',
389 '"\C-u": unix-line-discard',
389 ], allow_none=False, config=True)
390 ], allow_none=False, config=True)
390
391
391 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
392 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
392 default_value='last_expr', config=True,
393 default_value='last_expr', config=True,
393 help="""
394 help="""
394 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
395 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
395 run interactively (displaying output from expressions).""")
396 run interactively (displaying output from expressions).""")
396
397
397 # TODO: this part of prompt management should be moved to the frontends.
398 # TODO: this part of prompt management should be moved to the frontends.
398 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
399 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
399 separate_in = SeparateUnicode('\n', config=True)
400 separate_in = SeparateUnicode('\n', config=True)
400 separate_out = SeparateUnicode('', config=True)
401 separate_out = SeparateUnicode('', config=True)
401 separate_out2 = SeparateUnicode('', config=True)
402 separate_out2 = SeparateUnicode('', config=True)
402 wildcards_case_sensitive = CBool(True, config=True)
403 wildcards_case_sensitive = CBool(True, config=True)
403 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
404 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
404 default_value='Context', config=True)
405 default_value='Context', config=True)
405
406
406 # Subcomponents of InteractiveShell
407 # Subcomponents of InteractiveShell
407 alias_manager = Instance('IPython.core.alias.AliasManager')
408 alias_manager = Instance('IPython.core.alias.AliasManager')
408 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
409 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
409 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
410 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
410 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
411 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
411 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
412 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
412 payload_manager = Instance('IPython.core.payload.PayloadManager')
413 payload_manager = Instance('IPython.core.payload.PayloadManager')
413 history_manager = Instance('IPython.core.history.HistoryManager')
414 history_manager = Instance('IPython.core.history.HistoryManager')
414 magics_manager = Instance('IPython.core.magic.MagicsManager')
415 magics_manager = Instance('IPython.core.magic.MagicsManager')
415
416
416 profile_dir = Instance('IPython.core.application.ProfileDir')
417 profile_dir = Instance('IPython.core.application.ProfileDir')
417 @property
418 @property
418 def profile(self):
419 def profile(self):
419 if self.profile_dir is not None:
420 if self.profile_dir is not None:
420 name = os.path.basename(self.profile_dir.location)
421 name = os.path.basename(self.profile_dir.location)
421 return name.replace('profile_','')
422 return name.replace('profile_','')
422
423
423
424
424 # Private interface
425 # Private interface
425 _post_execute = Instance(dict)
426 _post_execute = Instance(dict)
426
427
427 # Tracks any GUI loop loaded for pylab
428 # Tracks any GUI loop loaded for pylab
428 pylab_gui_select = None
429 pylab_gui_select = None
429
430
430 def __init__(self, ipython_dir=None, profile_dir=None,
431 def __init__(self, ipython_dir=None, profile_dir=None,
431 user_module=None, user_ns=None,
432 user_module=None, user_ns=None,
432 custom_exceptions=((), None), **kwargs):
433 custom_exceptions=((), None), **kwargs):
433
434
434 # This is where traits with a config_key argument are updated
435 # This is where traits with a config_key argument are updated
435 # from the values on config.
436 # from the values on config.
436 super(InteractiveShell, self).__init__(**kwargs)
437 super(InteractiveShell, self).__init__(**kwargs)
437 self.configurables = [self]
438 self.configurables = [self]
438
439
439 # These are relatively independent and stateless
440 # These are relatively independent and stateless
440 self.init_ipython_dir(ipython_dir)
441 self.init_ipython_dir(ipython_dir)
441 self.init_profile_dir(profile_dir)
442 self.init_profile_dir(profile_dir)
442 self.init_instance_attrs()
443 self.init_instance_attrs()
443 self.init_environment()
444 self.init_environment()
444
445
445 # Check if we're in a virtualenv, and set up sys.path.
446 # Check if we're in a virtualenv, and set up sys.path.
446 self.init_virtualenv()
447 self.init_virtualenv()
447
448
448 # Create namespaces (user_ns, user_global_ns, etc.)
449 # Create namespaces (user_ns, user_global_ns, etc.)
449 self.init_create_namespaces(user_module, user_ns)
450 self.init_create_namespaces(user_module, user_ns)
450 # This has to be done after init_create_namespaces because it uses
451 # This has to be done after init_create_namespaces because it uses
451 # something in self.user_ns, but before init_sys_modules, which
452 # something in self.user_ns, but before init_sys_modules, which
452 # is the first thing to modify sys.
453 # is the first thing to modify sys.
453 # TODO: When we override sys.stdout and sys.stderr before this class
454 # TODO: When we override sys.stdout and sys.stderr before this class
454 # is created, we are saving the overridden ones here. Not sure if this
455 # is created, we are saving the overridden ones here. Not sure if this
455 # is what we want to do.
456 # is what we want to do.
456 self.save_sys_module_state()
457 self.save_sys_module_state()
457 self.init_sys_modules()
458 self.init_sys_modules()
458
459
459 # While we're trying to have each part of the code directly access what
460 # While we're trying to have each part of the code directly access what
460 # it needs without keeping redundant references to objects, we have too
461 # it needs without keeping redundant references to objects, we have too
461 # much legacy code that expects ip.db to exist.
462 # much legacy code that expects ip.db to exist.
462 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
463 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
463
464
464 self.init_history()
465 self.init_history()
465 self.init_encoding()
466 self.init_encoding()
466 self.init_prefilter()
467 self.init_prefilter()
467
468
468 self.init_syntax_highlighting()
469 self.init_syntax_highlighting()
469 self.init_hooks()
470 self.init_hooks()
471 self.init_callbacks()
470 self.init_pushd_popd_magic()
472 self.init_pushd_popd_magic()
471 # self.init_traceback_handlers use to be here, but we moved it below
473 # self.init_traceback_handlers use to be here, but we moved it below
472 # because it and init_io have to come after init_readline.
474 # because it and init_io have to come after init_readline.
473 self.init_user_ns()
475 self.init_user_ns()
474 self.init_logger()
476 self.init_logger()
475 self.init_builtins()
477 self.init_builtins()
476
478
477 # The following was in post_config_initialization
479 # The following was in post_config_initialization
478 self.init_inspector()
480 self.init_inspector()
479 # init_readline() must come before init_io(), because init_io uses
481 # init_readline() must come before init_io(), because init_io uses
480 # readline related things.
482 # readline related things.
481 self.init_readline()
483 self.init_readline()
482 # We save this here in case user code replaces raw_input, but it needs
484 # We save this here in case user code replaces raw_input, but it needs
483 # to be after init_readline(), because PyPy's readline works by replacing
485 # to be after init_readline(), because PyPy's readline works by replacing
484 # raw_input.
486 # raw_input.
485 if py3compat.PY3:
487 if py3compat.PY3:
486 self.raw_input_original = input
488 self.raw_input_original = input
487 else:
489 else:
488 self.raw_input_original = raw_input
490 self.raw_input_original = raw_input
489 # init_completer must come after init_readline, because it needs to
491 # init_completer must come after init_readline, because it needs to
490 # know whether readline is present or not system-wide to configure the
492 # know whether readline is present or not system-wide to configure the
491 # completers, since the completion machinery can now operate
493 # completers, since the completion machinery can now operate
492 # independently of readline (e.g. over the network)
494 # independently of readline (e.g. over the network)
493 self.init_completer()
495 self.init_completer()
494 # TODO: init_io() needs to happen before init_traceback handlers
496 # TODO: init_io() needs to happen before init_traceback handlers
495 # because the traceback handlers hardcode the stdout/stderr streams.
497 # because the traceback handlers hardcode the stdout/stderr streams.
496 # This logic in in debugger.Pdb and should eventually be changed.
498 # This logic in in debugger.Pdb and should eventually be changed.
497 self.init_io()
499 self.init_io()
498 self.init_traceback_handlers(custom_exceptions)
500 self.init_traceback_handlers(custom_exceptions)
499 self.init_prompts()
501 self.init_prompts()
500 self.init_display_formatter()
502 self.init_display_formatter()
501 self.init_display_pub()
503 self.init_display_pub()
502 self.init_data_pub()
504 self.init_data_pub()
503 self.init_displayhook()
505 self.init_displayhook()
504 self.init_latextool()
506 self.init_latextool()
505 self.init_magics()
507 self.init_magics()
506 self.init_alias()
508 self.init_alias()
507 self.init_logstart()
509 self.init_logstart()
508 self.init_pdb()
510 self.init_pdb()
509 self.init_extension_manager()
511 self.init_extension_manager()
510 self.init_payload()
512 self.init_payload()
511 self.init_comms()
513 self.init_comms()
512 self.hooks.late_startup_hook()
514 self.hooks.late_startup_hook()
513 atexit.register(self.atexit_operations)
515 atexit.register(self.atexit_operations)
514
516
515 def get_ipython(self):
517 def get_ipython(self):
516 """Return the currently running IPython instance."""
518 """Return the currently running IPython instance."""
517 return self
519 return self
518
520
519 #-------------------------------------------------------------------------
521 #-------------------------------------------------------------------------
520 # Trait changed handlers
522 # Trait changed handlers
521 #-------------------------------------------------------------------------
523 #-------------------------------------------------------------------------
522
524
523 def _ipython_dir_changed(self, name, new):
525 def _ipython_dir_changed(self, name, new):
524 if not os.path.isdir(new):
526 if not os.path.isdir(new):
525 os.makedirs(new, mode = 0o777)
527 os.makedirs(new, mode = 0o777)
526
528
527 def set_autoindent(self,value=None):
529 def set_autoindent(self,value=None):
528 """Set the autoindent flag, checking for readline support.
530 """Set the autoindent flag, checking for readline support.
529
531
530 If called with no arguments, it acts as a toggle."""
532 If called with no arguments, it acts as a toggle."""
531
533
532 if value != 0 and not self.has_readline:
534 if value != 0 and not self.has_readline:
533 if os.name == 'posix':
535 if os.name == 'posix':
534 warn("The auto-indent feature requires the readline library")
536 warn("The auto-indent feature requires the readline library")
535 self.autoindent = 0
537 self.autoindent = 0
536 return
538 return
537 if value is None:
539 if value is None:
538 self.autoindent = not self.autoindent
540 self.autoindent = not self.autoindent
539 else:
541 else:
540 self.autoindent = value
542 self.autoindent = value
541
543
542 #-------------------------------------------------------------------------
544 #-------------------------------------------------------------------------
543 # init_* methods called by __init__
545 # init_* methods called by __init__
544 #-------------------------------------------------------------------------
546 #-------------------------------------------------------------------------
545
547
546 def init_ipython_dir(self, ipython_dir):
548 def init_ipython_dir(self, ipython_dir):
547 if ipython_dir is not None:
549 if ipython_dir is not None:
548 self.ipython_dir = ipython_dir
550 self.ipython_dir = ipython_dir
549 return
551 return
550
552
551 self.ipython_dir = get_ipython_dir()
553 self.ipython_dir = get_ipython_dir()
552
554
553 def init_profile_dir(self, profile_dir):
555 def init_profile_dir(self, profile_dir):
554 if profile_dir is not None:
556 if profile_dir is not None:
555 self.profile_dir = profile_dir
557 self.profile_dir = profile_dir
556 return
558 return
557 self.profile_dir =\
559 self.profile_dir =\
558 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
560 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
559
561
560 def init_instance_attrs(self):
562 def init_instance_attrs(self):
561 self.more = False
563 self.more = False
562
564
563 # command compiler
565 # command compiler
564 self.compile = CachingCompiler()
566 self.compile = CachingCompiler()
565
567
566 # Make an empty namespace, which extension writers can rely on both
568 # Make an empty namespace, which extension writers can rely on both
567 # existing and NEVER being used by ipython itself. This gives them a
569 # existing and NEVER being used by ipython itself. This gives them a
568 # convenient location for storing additional information and state
570 # convenient location for storing additional information and state
569 # their extensions may require, without fear of collisions with other
571 # their extensions may require, without fear of collisions with other
570 # ipython names that may develop later.
572 # ipython names that may develop later.
571 self.meta = Struct()
573 self.meta = Struct()
572
574
573 # Temporary files used for various purposes. Deleted at exit.
575 # Temporary files used for various purposes. Deleted at exit.
574 self.tempfiles = []
576 self.tempfiles = []
575 self.tempdirs = []
577 self.tempdirs = []
576
578
577 # Keep track of readline usage (later set by init_readline)
579 # Keep track of readline usage (later set by init_readline)
578 self.has_readline = False
580 self.has_readline = False
579
581
580 # keep track of where we started running (mainly for crash post-mortem)
582 # keep track of where we started running (mainly for crash post-mortem)
581 # This is not being used anywhere currently.
583 # This is not being used anywhere currently.
582 self.starting_dir = py3compat.getcwd()
584 self.starting_dir = py3compat.getcwd()
583
585
584 # Indentation management
586 # Indentation management
585 self.indent_current_nsp = 0
587 self.indent_current_nsp = 0
586
588
587 # Dict to track post-execution functions that have been registered
589 # Dict to track post-execution functions that have been registered
588 self._post_execute = {}
590 self._post_execute = {}
589
591
590 def init_environment(self):
592 def init_environment(self):
591 """Any changes we need to make to the user's environment."""
593 """Any changes we need to make to the user's environment."""
592 pass
594 pass
593
595
594 def init_encoding(self):
596 def init_encoding(self):
595 # Get system encoding at startup time. Certain terminals (like Emacs
597 # Get system encoding at startup time. Certain terminals (like Emacs
596 # under Win32 have it set to None, and we need to have a known valid
598 # under Win32 have it set to None, and we need to have a known valid
597 # encoding to use in the raw_input() method
599 # encoding to use in the raw_input() method
598 try:
600 try:
599 self.stdin_encoding = sys.stdin.encoding or 'ascii'
601 self.stdin_encoding = sys.stdin.encoding or 'ascii'
600 except AttributeError:
602 except AttributeError:
601 self.stdin_encoding = 'ascii'
603 self.stdin_encoding = 'ascii'
602
604
603 def init_syntax_highlighting(self):
605 def init_syntax_highlighting(self):
604 # Python source parser/formatter for syntax highlighting
606 # Python source parser/formatter for syntax highlighting
605 pyformat = PyColorize.Parser().format
607 pyformat = PyColorize.Parser().format
606 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
608 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
607
609
608 def init_pushd_popd_magic(self):
610 def init_pushd_popd_magic(self):
609 # for pushd/popd management
611 # for pushd/popd management
610 self.home_dir = get_home_dir()
612 self.home_dir = get_home_dir()
611
613
612 self.dir_stack = []
614 self.dir_stack = []
613
615
614 def init_logger(self):
616 def init_logger(self):
615 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
617 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
616 logmode='rotate')
618 logmode='rotate')
617
619
618 def init_logstart(self):
620 def init_logstart(self):
619 """Initialize logging in case it was requested at the command line.
621 """Initialize logging in case it was requested at the command line.
620 """
622 """
621 if self.logappend:
623 if self.logappend:
622 self.magic('logstart %s append' % self.logappend)
624 self.magic('logstart %s append' % self.logappend)
623 elif self.logfile:
625 elif self.logfile:
624 self.magic('logstart %s' % self.logfile)
626 self.magic('logstart %s' % self.logfile)
625 elif self.logstart:
627 elif self.logstart:
626 self.magic('logstart')
628 self.magic('logstart')
627
629
628 def init_builtins(self):
630 def init_builtins(self):
629 # A single, static flag that we set to True. Its presence indicates
631 # A single, static flag that we set to True. Its presence indicates
630 # that an IPython shell has been created, and we make no attempts at
632 # that an IPython shell has been created, and we make no attempts at
631 # removing on exit or representing the existence of more than one
633 # removing on exit or representing the existence of more than one
632 # IPython at a time.
634 # IPython at a time.
633 builtin_mod.__dict__['__IPYTHON__'] = True
635 builtin_mod.__dict__['__IPYTHON__'] = True
634
636
635 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
637 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
636 # manage on enter/exit, but with all our shells it's virtually
638 # manage on enter/exit, but with all our shells it's virtually
637 # impossible to get all the cases right. We're leaving the name in for
639 # impossible to get all the cases right. We're leaving the name in for
638 # those who adapted their codes to check for this flag, but will
640 # those who adapted their codes to check for this flag, but will
639 # eventually remove it after a few more releases.
641 # eventually remove it after a few more releases.
640 builtin_mod.__dict__['__IPYTHON__active'] = \
642 builtin_mod.__dict__['__IPYTHON__active'] = \
641 'Deprecated, check for __IPYTHON__'
643 'Deprecated, check for __IPYTHON__'
642
644
643 self.builtin_trap = BuiltinTrap(shell=self)
645 self.builtin_trap = BuiltinTrap(shell=self)
644
646
645 def init_inspector(self):
647 def init_inspector(self):
646 # Object inspector
648 # Object inspector
647 self.inspector = oinspect.Inspector(oinspect.InspectColors,
649 self.inspector = oinspect.Inspector(oinspect.InspectColors,
648 PyColorize.ANSICodeColors,
650 PyColorize.ANSICodeColors,
649 'NoColor',
651 'NoColor',
650 self.object_info_string_level)
652 self.object_info_string_level)
651
653
652 def init_io(self):
654 def init_io(self):
653 # This will just use sys.stdout and sys.stderr. If you want to
655 # This will just use sys.stdout and sys.stderr. If you want to
654 # override sys.stdout and sys.stderr themselves, you need to do that
656 # override sys.stdout and sys.stderr themselves, you need to do that
655 # *before* instantiating this class, because io holds onto
657 # *before* instantiating this class, because io holds onto
656 # references to the underlying streams.
658 # references to the underlying streams.
657 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
659 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
658 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
660 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
659 else:
661 else:
660 io.stdout = io.IOStream(sys.stdout)
662 io.stdout = io.IOStream(sys.stdout)
661 io.stderr = io.IOStream(sys.stderr)
663 io.stderr = io.IOStream(sys.stderr)
662
664
663 def init_prompts(self):
665 def init_prompts(self):
664 self.prompt_manager = PromptManager(shell=self, parent=self)
666 self.prompt_manager = PromptManager(shell=self, parent=self)
665 self.configurables.append(self.prompt_manager)
667 self.configurables.append(self.prompt_manager)
666 # Set system prompts, so that scripts can decide if they are running
668 # Set system prompts, so that scripts can decide if they are running
667 # interactively.
669 # interactively.
668 sys.ps1 = 'In : '
670 sys.ps1 = 'In : '
669 sys.ps2 = '...: '
671 sys.ps2 = '...: '
670 sys.ps3 = 'Out: '
672 sys.ps3 = 'Out: '
671
673
672 def init_display_formatter(self):
674 def init_display_formatter(self):
673 self.display_formatter = DisplayFormatter(parent=self)
675 self.display_formatter = DisplayFormatter(parent=self)
674 self.configurables.append(self.display_formatter)
676 self.configurables.append(self.display_formatter)
675
677
676 def init_display_pub(self):
678 def init_display_pub(self):
677 self.display_pub = self.display_pub_class(parent=self)
679 self.display_pub = self.display_pub_class(parent=self)
678 self.configurables.append(self.display_pub)
680 self.configurables.append(self.display_pub)
679
681
680 def init_data_pub(self):
682 def init_data_pub(self):
681 if not self.data_pub_class:
683 if not self.data_pub_class:
682 self.data_pub = None
684 self.data_pub = None
683 return
685 return
684 self.data_pub = self.data_pub_class(parent=self)
686 self.data_pub = self.data_pub_class(parent=self)
685 self.configurables.append(self.data_pub)
687 self.configurables.append(self.data_pub)
686
688
687 def init_displayhook(self):
689 def init_displayhook(self):
688 # Initialize displayhook, set in/out prompts and printing system
690 # Initialize displayhook, set in/out prompts and printing system
689 self.displayhook = self.displayhook_class(
691 self.displayhook = self.displayhook_class(
690 parent=self,
692 parent=self,
691 shell=self,
693 shell=self,
692 cache_size=self.cache_size,
694 cache_size=self.cache_size,
693 )
695 )
694 self.configurables.append(self.displayhook)
696 self.configurables.append(self.displayhook)
695 # This is a context manager that installs/revmoes the displayhook at
697 # This is a context manager that installs/revmoes the displayhook at
696 # the appropriate time.
698 # the appropriate time.
697 self.display_trap = DisplayTrap(hook=self.displayhook)
699 self.display_trap = DisplayTrap(hook=self.displayhook)
698
700
699 def init_latextool(self):
701 def init_latextool(self):
700 """Configure LaTeXTool."""
702 """Configure LaTeXTool."""
701 cfg = LaTeXTool.instance(parent=self)
703 cfg = LaTeXTool.instance(parent=self)
702 if cfg not in self.configurables:
704 if cfg not in self.configurables:
703 self.configurables.append(cfg)
705 self.configurables.append(cfg)
704
706
705 def init_virtualenv(self):
707 def init_virtualenv(self):
706 """Add a virtualenv to sys.path so the user can import modules from it.
708 """Add a virtualenv to sys.path so the user can import modules from it.
707 This isn't perfect: it doesn't use the Python interpreter with which the
709 This isn't perfect: it doesn't use the Python interpreter with which the
708 virtualenv was built, and it ignores the --no-site-packages option. A
710 virtualenv was built, and it ignores the --no-site-packages option. A
709 warning will appear suggesting the user installs IPython in the
711 warning will appear suggesting the user installs IPython in the
710 virtualenv, but for many cases, it probably works well enough.
712 virtualenv, but for many cases, it probably works well enough.
711
713
712 Adapted from code snippets online.
714 Adapted from code snippets online.
713
715
714 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
716 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
715 """
717 """
716 if 'VIRTUAL_ENV' not in os.environ:
718 if 'VIRTUAL_ENV' not in os.environ:
717 # Not in a virtualenv
719 # Not in a virtualenv
718 return
720 return
719
721
720 # venv detection:
722 # venv detection:
721 # stdlib venv may symlink sys.executable, so we can't use realpath.
723 # stdlib venv may symlink sys.executable, so we can't use realpath.
722 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
724 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
723 # So we just check every item in the symlink tree (generally <= 3)
725 # So we just check every item in the symlink tree (generally <= 3)
724 p = sys.executable
726 p = sys.executable
725 paths = [p]
727 paths = [p]
726 while os.path.islink(p):
728 while os.path.islink(p):
727 p = os.path.join(os.path.dirname(p), os.readlink(p))
729 p = os.path.join(os.path.dirname(p), os.readlink(p))
728 paths.append(p)
730 paths.append(p)
729 if any(p.startswith(os.environ['VIRTUAL_ENV']) for p in paths):
731 if any(p.startswith(os.environ['VIRTUAL_ENV']) for p in paths):
730 # Running properly in the virtualenv, don't need to do anything
732 # Running properly in the virtualenv, don't need to do anything
731 return
733 return
732
734
733 warn("Attempting to work in a virtualenv. If you encounter problems, please "
735 warn("Attempting to work in a virtualenv. If you encounter problems, please "
734 "install IPython inside the virtualenv.")
736 "install IPython inside the virtualenv.")
735 if sys.platform == "win32":
737 if sys.platform == "win32":
736 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
738 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
737 else:
739 else:
738 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
740 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
739 'python%d.%d' % sys.version_info[:2], 'site-packages')
741 'python%d.%d' % sys.version_info[:2], 'site-packages')
740
742
741 import site
743 import site
742 sys.path.insert(0, virtual_env)
744 sys.path.insert(0, virtual_env)
743 site.addsitedir(virtual_env)
745 site.addsitedir(virtual_env)
744
746
745 #-------------------------------------------------------------------------
747 #-------------------------------------------------------------------------
746 # Things related to injections into the sys module
748 # Things related to injections into the sys module
747 #-------------------------------------------------------------------------
749 #-------------------------------------------------------------------------
748
750
749 def save_sys_module_state(self):
751 def save_sys_module_state(self):
750 """Save the state of hooks in the sys module.
752 """Save the state of hooks in the sys module.
751
753
752 This has to be called after self.user_module is created.
754 This has to be called after self.user_module is created.
753 """
755 """
754 self._orig_sys_module_state = {}
756 self._orig_sys_module_state = {}
755 self._orig_sys_module_state['stdin'] = sys.stdin
757 self._orig_sys_module_state['stdin'] = sys.stdin
756 self._orig_sys_module_state['stdout'] = sys.stdout
758 self._orig_sys_module_state['stdout'] = sys.stdout
757 self._orig_sys_module_state['stderr'] = sys.stderr
759 self._orig_sys_module_state['stderr'] = sys.stderr
758 self._orig_sys_module_state['excepthook'] = sys.excepthook
760 self._orig_sys_module_state['excepthook'] = sys.excepthook
759 self._orig_sys_modules_main_name = self.user_module.__name__
761 self._orig_sys_modules_main_name = self.user_module.__name__
760 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
762 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
761
763
762 def restore_sys_module_state(self):
764 def restore_sys_module_state(self):
763 """Restore the state of the sys module."""
765 """Restore the state of the sys module."""
764 try:
766 try:
765 for k, v in iteritems(self._orig_sys_module_state):
767 for k, v in iteritems(self._orig_sys_module_state):
766 setattr(sys, k, v)
768 setattr(sys, k, v)
767 except AttributeError:
769 except AttributeError:
768 pass
770 pass
769 # Reset what what done in self.init_sys_modules
771 # Reset what what done in self.init_sys_modules
770 if self._orig_sys_modules_main_mod is not None:
772 if self._orig_sys_modules_main_mod is not None:
771 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
773 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
772
774
773 #-------------------------------------------------------------------------
775 #-------------------------------------------------------------------------
774 # Things related to hooks
776 # Things related to hooks
775 #-------------------------------------------------------------------------
777 #-------------------------------------------------------------------------
776
778
777 def init_hooks(self):
779 def init_hooks(self):
778 # hooks holds pointers used for user-side customizations
780 # hooks holds pointers used for user-side customizations
779 self.hooks = Struct()
781 self.hooks = Struct()
780
782
781 self.strdispatchers = {}
783 self.strdispatchers = {}
782
784
783 # Set all default hooks, defined in the IPython.hooks module.
785 # Set all default hooks, defined in the IPython.hooks module.
784 hooks = IPython.core.hooks
786 hooks = IPython.core.hooks
785 for hook_name in hooks.__all__:
787 for hook_name in hooks.__all__:
786 # default hooks have priority 100, i.e. low; user hooks should have
788 # default hooks have priority 100, i.e. low; user hooks should have
787 # 0-100 priority
789 # 0-100 priority
788 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
790 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
789
791
790 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
792 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
791 """set_hook(name,hook) -> sets an internal IPython hook.
793 """set_hook(name,hook) -> sets an internal IPython hook.
792
794
793 IPython exposes some of its internal API as user-modifiable hooks. By
795 IPython exposes some of its internal API as user-modifiable hooks. By
794 adding your function to one of these hooks, you can modify IPython's
796 adding your function to one of these hooks, you can modify IPython's
795 behavior to call at runtime your own routines."""
797 behavior to call at runtime your own routines."""
796
798
797 # At some point in the future, this should validate the hook before it
799 # At some point in the future, this should validate the hook before it
798 # accepts it. Probably at least check that the hook takes the number
800 # accepts it. Probably at least check that the hook takes the number
799 # of args it's supposed to.
801 # of args it's supposed to.
800
802
801 f = types.MethodType(hook,self)
803 f = types.MethodType(hook,self)
802
804
803 # check if the hook is for strdispatcher first
805 # check if the hook is for strdispatcher first
804 if str_key is not None:
806 if str_key is not None:
805 sdp = self.strdispatchers.get(name, StrDispatch())
807 sdp = self.strdispatchers.get(name, StrDispatch())
806 sdp.add_s(str_key, f, priority )
808 sdp.add_s(str_key, f, priority )
807 self.strdispatchers[name] = sdp
809 self.strdispatchers[name] = sdp
808 return
810 return
809 if re_key is not None:
811 if re_key is not None:
810 sdp = self.strdispatchers.get(name, StrDispatch())
812 sdp = self.strdispatchers.get(name, StrDispatch())
811 sdp.add_re(re.compile(re_key), f, priority )
813 sdp.add_re(re.compile(re_key), f, priority )
812 self.strdispatchers[name] = sdp
814 self.strdispatchers[name] = sdp
813 return
815 return
814
816
815 dp = getattr(self.hooks, name, None)
817 dp = getattr(self.hooks, name, None)
816 if name not in IPython.core.hooks.__all__:
818 if name not in IPython.core.hooks.__all__:
817 print("Warning! Hook '%s' is not one of %s" % \
819 print("Warning! Hook '%s' is not one of %s" % \
818 (name, IPython.core.hooks.__all__ ))
820 (name, IPython.core.hooks.__all__ ))
819 if not dp:
821 if not dp:
820 dp = IPython.core.hooks.CommandChainDispatcher()
822 dp = IPython.core.hooks.CommandChainDispatcher()
821
823
822 try:
824 try:
823 dp.add(f,priority)
825 dp.add(f,priority)
824 except AttributeError:
826 except AttributeError:
825 # it was not commandchain, plain old func - replace
827 # it was not commandchain, plain old func - replace
826 dp = f
828 dp = f
827
829
828 setattr(self.hooks,name, dp)
830 setattr(self.hooks,name, dp)
829
831
832 #-------------------------------------------------------------------------
833 # Things related to callbacks
834 #-------------------------------------------------------------------------
835
836 def init_callbacks(self):
837 self.callbacks = CallbackManager(self, available_callbacks)
838
830 def register_post_execute(self, func):
839 def register_post_execute(self, func):
831 """Register a function for calling after code execution.
840 """DEPRECATED: Use ip.callbacks.register('post_execute_explicit', func)
841
842 Register a function for calling after code execution.
832 """
843 """
833 if not callable(func):
844 warn("ip.register_post_execute is deprecated, use "
834 raise ValueError('argument %s must be callable' % func)
845 "ip.callbacks.register('post_execute_explicit', func) instead.")
835 self._post_execute[func] = True
846 self.callbacks.register('post_execute_explicit', func)
836
847
837 #-------------------------------------------------------------------------
848 #-------------------------------------------------------------------------
838 # Things related to the "main" module
849 # Things related to the "main" module
839 #-------------------------------------------------------------------------
850 #-------------------------------------------------------------------------
840
851
841 def new_main_mod(self, filename, modname):
852 def new_main_mod(self, filename, modname):
842 """Return a new 'main' module object for user code execution.
853 """Return a new 'main' module object for user code execution.
843
854
844 ``filename`` should be the path of the script which will be run in the
855 ``filename`` should be the path of the script which will be run in the
845 module. Requests with the same filename will get the same module, with
856 module. Requests with the same filename will get the same module, with
846 its namespace cleared.
857 its namespace cleared.
847
858
848 ``modname`` should be the module name - normally either '__main__' or
859 ``modname`` should be the module name - normally either '__main__' or
849 the basename of the file without the extension.
860 the basename of the file without the extension.
850
861
851 When scripts are executed via %run, we must keep a reference to their
862 When scripts are executed via %run, we must keep a reference to their
852 __main__ module around so that Python doesn't
863 __main__ module around so that Python doesn't
853 clear it, rendering references to module globals useless.
864 clear it, rendering references to module globals useless.
854
865
855 This method keeps said reference in a private dict, keyed by the
866 This method keeps said reference in a private dict, keyed by the
856 absolute path of the script. This way, for multiple executions of the
867 absolute path of the script. This way, for multiple executions of the
857 same script we only keep one copy of the namespace (the last one),
868 same script we only keep one copy of the namespace (the last one),
858 thus preventing memory leaks from old references while allowing the
869 thus preventing memory leaks from old references while allowing the
859 objects from the last execution to be accessible.
870 objects from the last execution to be accessible.
860 """
871 """
861 filename = os.path.abspath(filename)
872 filename = os.path.abspath(filename)
862 try:
873 try:
863 main_mod = self._main_mod_cache[filename]
874 main_mod = self._main_mod_cache[filename]
864 except KeyError:
875 except KeyError:
865 main_mod = self._main_mod_cache[filename] = types.ModuleType(modname,
876 main_mod = self._main_mod_cache[filename] = types.ModuleType(modname,
866 doc="Module created for script run in IPython")
877 doc="Module created for script run in IPython")
867 else:
878 else:
868 main_mod.__dict__.clear()
879 main_mod.__dict__.clear()
869 main_mod.__name__ = modname
880 main_mod.__name__ = modname
870
881
871 main_mod.__file__ = filename
882 main_mod.__file__ = filename
872 # It seems pydoc (and perhaps others) needs any module instance to
883 # It seems pydoc (and perhaps others) needs any module instance to
873 # implement a __nonzero__ method
884 # implement a __nonzero__ method
874 main_mod.__nonzero__ = lambda : True
885 main_mod.__nonzero__ = lambda : True
875
886
876 return main_mod
887 return main_mod
877
888
878 def clear_main_mod_cache(self):
889 def clear_main_mod_cache(self):
879 """Clear the cache of main modules.
890 """Clear the cache of main modules.
880
891
881 Mainly for use by utilities like %reset.
892 Mainly for use by utilities like %reset.
882
893
883 Examples
894 Examples
884 --------
895 --------
885
896
886 In [15]: import IPython
897 In [15]: import IPython
887
898
888 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
899 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
889
900
890 In [17]: len(_ip._main_mod_cache) > 0
901 In [17]: len(_ip._main_mod_cache) > 0
891 Out[17]: True
902 Out[17]: True
892
903
893 In [18]: _ip.clear_main_mod_cache()
904 In [18]: _ip.clear_main_mod_cache()
894
905
895 In [19]: len(_ip._main_mod_cache) == 0
906 In [19]: len(_ip._main_mod_cache) == 0
896 Out[19]: True
907 Out[19]: True
897 """
908 """
898 self._main_mod_cache.clear()
909 self._main_mod_cache.clear()
899
910
900 #-------------------------------------------------------------------------
911 #-------------------------------------------------------------------------
901 # Things related to debugging
912 # Things related to debugging
902 #-------------------------------------------------------------------------
913 #-------------------------------------------------------------------------
903
914
904 def init_pdb(self):
915 def init_pdb(self):
905 # Set calling of pdb on exceptions
916 # Set calling of pdb on exceptions
906 # self.call_pdb is a property
917 # self.call_pdb is a property
907 self.call_pdb = self.pdb
918 self.call_pdb = self.pdb
908
919
909 def _get_call_pdb(self):
920 def _get_call_pdb(self):
910 return self._call_pdb
921 return self._call_pdb
911
922
912 def _set_call_pdb(self,val):
923 def _set_call_pdb(self,val):
913
924
914 if val not in (0,1,False,True):
925 if val not in (0,1,False,True):
915 raise ValueError('new call_pdb value must be boolean')
926 raise ValueError('new call_pdb value must be boolean')
916
927
917 # store value in instance
928 # store value in instance
918 self._call_pdb = val
929 self._call_pdb = val
919
930
920 # notify the actual exception handlers
931 # notify the actual exception handlers
921 self.InteractiveTB.call_pdb = val
932 self.InteractiveTB.call_pdb = val
922
933
923 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
934 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
924 'Control auto-activation of pdb at exceptions')
935 'Control auto-activation of pdb at exceptions')
925
936
926 def debugger(self,force=False):
937 def debugger(self,force=False):
927 """Call the pydb/pdb debugger.
938 """Call the pydb/pdb debugger.
928
939
929 Keywords:
940 Keywords:
930
941
931 - force(False): by default, this routine checks the instance call_pdb
942 - force(False): by default, this routine checks the instance call_pdb
932 flag and does not actually invoke the debugger if the flag is false.
943 flag and does not actually invoke the debugger if the flag is false.
933 The 'force' option forces the debugger to activate even if the flag
944 The 'force' option forces the debugger to activate even if the flag
934 is false.
945 is false.
935 """
946 """
936
947
937 if not (force or self.call_pdb):
948 if not (force or self.call_pdb):
938 return
949 return
939
950
940 if not hasattr(sys,'last_traceback'):
951 if not hasattr(sys,'last_traceback'):
941 error('No traceback has been produced, nothing to debug.')
952 error('No traceback has been produced, nothing to debug.')
942 return
953 return
943
954
944 # use pydb if available
955 # use pydb if available
945 if debugger.has_pydb:
956 if debugger.has_pydb:
946 from pydb import pm
957 from pydb import pm
947 else:
958 else:
948 # fallback to our internal debugger
959 # fallback to our internal debugger
949 pm = lambda : self.InteractiveTB.debugger(force=True)
960 pm = lambda : self.InteractiveTB.debugger(force=True)
950
961
951 with self.readline_no_record:
962 with self.readline_no_record:
952 pm()
963 pm()
953
964
954 #-------------------------------------------------------------------------
965 #-------------------------------------------------------------------------
955 # Things related to IPython's various namespaces
966 # Things related to IPython's various namespaces
956 #-------------------------------------------------------------------------
967 #-------------------------------------------------------------------------
957 default_user_namespaces = True
968 default_user_namespaces = True
958
969
959 def init_create_namespaces(self, user_module=None, user_ns=None):
970 def init_create_namespaces(self, user_module=None, user_ns=None):
960 # Create the namespace where the user will operate. user_ns is
971 # Create the namespace where the user will operate. user_ns is
961 # normally the only one used, and it is passed to the exec calls as
972 # normally the only one used, and it is passed to the exec calls as
962 # the locals argument. But we do carry a user_global_ns namespace
973 # the locals argument. But we do carry a user_global_ns namespace
963 # given as the exec 'globals' argument, This is useful in embedding
974 # given as the exec 'globals' argument, This is useful in embedding
964 # situations where the ipython shell opens in a context where the
975 # situations where the ipython shell opens in a context where the
965 # distinction between locals and globals is meaningful. For
976 # distinction between locals and globals is meaningful. For
966 # non-embedded contexts, it is just the same object as the user_ns dict.
977 # non-embedded contexts, it is just the same object as the user_ns dict.
967
978
968 # FIXME. For some strange reason, __builtins__ is showing up at user
979 # FIXME. For some strange reason, __builtins__ is showing up at user
969 # level as a dict instead of a module. This is a manual fix, but I
980 # level as a dict instead of a module. This is a manual fix, but I
970 # should really track down where the problem is coming from. Alex
981 # should really track down where the problem is coming from. Alex
971 # Schmolck reported this problem first.
982 # Schmolck reported this problem first.
972
983
973 # A useful post by Alex Martelli on this topic:
984 # A useful post by Alex Martelli on this topic:
974 # Re: inconsistent value from __builtins__
985 # Re: inconsistent value from __builtins__
975 # Von: Alex Martelli <aleaxit@yahoo.com>
986 # Von: Alex Martelli <aleaxit@yahoo.com>
976 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
987 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
977 # Gruppen: comp.lang.python
988 # Gruppen: comp.lang.python
978
989
979 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
990 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
980 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
991 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
981 # > <type 'dict'>
992 # > <type 'dict'>
982 # > >>> print type(__builtins__)
993 # > >>> print type(__builtins__)
983 # > <type 'module'>
994 # > <type 'module'>
984 # > Is this difference in return value intentional?
995 # > Is this difference in return value intentional?
985
996
986 # Well, it's documented that '__builtins__' can be either a dictionary
997 # Well, it's documented that '__builtins__' can be either a dictionary
987 # or a module, and it's been that way for a long time. Whether it's
998 # or a module, and it's been that way for a long time. Whether it's
988 # intentional (or sensible), I don't know. In any case, the idea is
999 # intentional (or sensible), I don't know. In any case, the idea is
989 # that if you need to access the built-in namespace directly, you
1000 # that if you need to access the built-in namespace directly, you
990 # should start with "import __builtin__" (note, no 's') which will
1001 # should start with "import __builtin__" (note, no 's') which will
991 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1002 # definitely give you a module. Yeah, it's somewhat confusing:-(.
992
1003
993 # These routines return a properly built module and dict as needed by
1004 # These routines return a properly built module and dict as needed by
994 # the rest of the code, and can also be used by extension writers to
1005 # the rest of the code, and can also be used by extension writers to
995 # generate properly initialized namespaces.
1006 # generate properly initialized namespaces.
996 if (user_ns is not None) or (user_module is not None):
1007 if (user_ns is not None) or (user_module is not None):
997 self.default_user_namespaces = False
1008 self.default_user_namespaces = False
998 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1009 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
999
1010
1000 # A record of hidden variables we have added to the user namespace, so
1011 # A record of hidden variables we have added to the user namespace, so
1001 # we can list later only variables defined in actual interactive use.
1012 # we can list later only variables defined in actual interactive use.
1002 self.user_ns_hidden = {}
1013 self.user_ns_hidden = {}
1003
1014
1004 # Now that FakeModule produces a real module, we've run into a nasty
1015 # Now that FakeModule produces a real module, we've run into a nasty
1005 # problem: after script execution (via %run), the module where the user
1016 # problem: after script execution (via %run), the module where the user
1006 # code ran is deleted. Now that this object is a true module (needed
1017 # code ran is deleted. Now that this object is a true module (needed
1007 # so docetst and other tools work correctly), the Python module
1018 # so docetst and other tools work correctly), the Python module
1008 # teardown mechanism runs over it, and sets to None every variable
1019 # teardown mechanism runs over it, and sets to None every variable
1009 # present in that module. Top-level references to objects from the
1020 # present in that module. Top-level references to objects from the
1010 # script survive, because the user_ns is updated with them. However,
1021 # script survive, because the user_ns is updated with them. However,
1011 # calling functions defined in the script that use other things from
1022 # calling functions defined in the script that use other things from
1012 # the script will fail, because the function's closure had references
1023 # the script will fail, because the function's closure had references
1013 # to the original objects, which are now all None. So we must protect
1024 # to the original objects, which are now all None. So we must protect
1014 # these modules from deletion by keeping a cache.
1025 # these modules from deletion by keeping a cache.
1015 #
1026 #
1016 # To avoid keeping stale modules around (we only need the one from the
1027 # To avoid keeping stale modules around (we only need the one from the
1017 # last run), we use a dict keyed with the full path to the script, so
1028 # last run), we use a dict keyed with the full path to the script, so
1018 # only the last version of the module is held in the cache. Note,
1029 # only the last version of the module is held in the cache. Note,
1019 # however, that we must cache the module *namespace contents* (their
1030 # however, that we must cache the module *namespace contents* (their
1020 # __dict__). Because if we try to cache the actual modules, old ones
1031 # __dict__). Because if we try to cache the actual modules, old ones
1021 # (uncached) could be destroyed while still holding references (such as
1032 # (uncached) could be destroyed while still holding references (such as
1022 # those held by GUI objects that tend to be long-lived)>
1033 # those held by GUI objects that tend to be long-lived)>
1023 #
1034 #
1024 # The %reset command will flush this cache. See the cache_main_mod()
1035 # The %reset command will flush this cache. See the cache_main_mod()
1025 # and clear_main_mod_cache() methods for details on use.
1036 # and clear_main_mod_cache() methods for details on use.
1026
1037
1027 # This is the cache used for 'main' namespaces
1038 # This is the cache used for 'main' namespaces
1028 self._main_mod_cache = {}
1039 self._main_mod_cache = {}
1029
1040
1030 # A table holding all the namespaces IPython deals with, so that
1041 # A table holding all the namespaces IPython deals with, so that
1031 # introspection facilities can search easily.
1042 # introspection facilities can search easily.
1032 self.ns_table = {'user_global':self.user_module.__dict__,
1043 self.ns_table = {'user_global':self.user_module.__dict__,
1033 'user_local':self.user_ns,
1044 'user_local':self.user_ns,
1034 'builtin':builtin_mod.__dict__
1045 'builtin':builtin_mod.__dict__
1035 }
1046 }
1036
1047
1037 @property
1048 @property
1038 def user_global_ns(self):
1049 def user_global_ns(self):
1039 return self.user_module.__dict__
1050 return self.user_module.__dict__
1040
1051
1041 def prepare_user_module(self, user_module=None, user_ns=None):
1052 def prepare_user_module(self, user_module=None, user_ns=None):
1042 """Prepare the module and namespace in which user code will be run.
1053 """Prepare the module and namespace in which user code will be run.
1043
1054
1044 When IPython is started normally, both parameters are None: a new module
1055 When IPython is started normally, both parameters are None: a new module
1045 is created automatically, and its __dict__ used as the namespace.
1056 is created automatically, and its __dict__ used as the namespace.
1046
1057
1047 If only user_module is provided, its __dict__ is used as the namespace.
1058 If only user_module is provided, its __dict__ is used as the namespace.
1048 If only user_ns is provided, a dummy module is created, and user_ns
1059 If only user_ns is provided, a dummy module is created, and user_ns
1049 becomes the global namespace. If both are provided (as they may be
1060 becomes the global namespace. If both are provided (as they may be
1050 when embedding), user_ns is the local namespace, and user_module
1061 when embedding), user_ns is the local namespace, and user_module
1051 provides the global namespace.
1062 provides the global namespace.
1052
1063
1053 Parameters
1064 Parameters
1054 ----------
1065 ----------
1055 user_module : module, optional
1066 user_module : module, optional
1056 The current user module in which IPython is being run. If None,
1067 The current user module in which IPython is being run. If None,
1057 a clean module will be created.
1068 a clean module will be created.
1058 user_ns : dict, optional
1069 user_ns : dict, optional
1059 A namespace in which to run interactive commands.
1070 A namespace in which to run interactive commands.
1060
1071
1061 Returns
1072 Returns
1062 -------
1073 -------
1063 A tuple of user_module and user_ns, each properly initialised.
1074 A tuple of user_module and user_ns, each properly initialised.
1064 """
1075 """
1065 if user_module is None and user_ns is not None:
1076 if user_module is None and user_ns is not None:
1066 user_ns.setdefault("__name__", "__main__")
1077 user_ns.setdefault("__name__", "__main__")
1067 user_module = DummyMod()
1078 user_module = DummyMod()
1068 user_module.__dict__ = user_ns
1079 user_module.__dict__ = user_ns
1069
1080
1070 if user_module is None:
1081 if user_module is None:
1071 user_module = types.ModuleType("__main__",
1082 user_module = types.ModuleType("__main__",
1072 doc="Automatically created module for IPython interactive environment")
1083 doc="Automatically created module for IPython interactive environment")
1073
1084
1074 # We must ensure that __builtin__ (without the final 's') is always
1085 # We must ensure that __builtin__ (without the final 's') is always
1075 # available and pointing to the __builtin__ *module*. For more details:
1086 # available and pointing to the __builtin__ *module*. For more details:
1076 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1087 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1077 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1088 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1078 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1089 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1079
1090
1080 if user_ns is None:
1091 if user_ns is None:
1081 user_ns = user_module.__dict__
1092 user_ns = user_module.__dict__
1082
1093
1083 return user_module, user_ns
1094 return user_module, user_ns
1084
1095
1085 def init_sys_modules(self):
1096 def init_sys_modules(self):
1086 # We need to insert into sys.modules something that looks like a
1097 # We need to insert into sys.modules something that looks like a
1087 # module but which accesses the IPython namespace, for shelve and
1098 # module but which accesses the IPython namespace, for shelve and
1088 # pickle to work interactively. Normally they rely on getting
1099 # pickle to work interactively. Normally they rely on getting
1089 # everything out of __main__, but for embedding purposes each IPython
1100 # everything out of __main__, but for embedding purposes each IPython
1090 # instance has its own private namespace, so we can't go shoving
1101 # instance has its own private namespace, so we can't go shoving
1091 # everything into __main__.
1102 # everything into __main__.
1092
1103
1093 # note, however, that we should only do this for non-embedded
1104 # note, however, that we should only do this for non-embedded
1094 # ipythons, which really mimic the __main__.__dict__ with their own
1105 # ipythons, which really mimic the __main__.__dict__ with their own
1095 # namespace. Embedded instances, on the other hand, should not do
1106 # namespace. Embedded instances, on the other hand, should not do
1096 # this because they need to manage the user local/global namespaces
1107 # this because they need to manage the user local/global namespaces
1097 # only, but they live within a 'normal' __main__ (meaning, they
1108 # only, but they live within a 'normal' __main__ (meaning, they
1098 # shouldn't overtake the execution environment of the script they're
1109 # shouldn't overtake the execution environment of the script they're
1099 # embedded in).
1110 # embedded in).
1100
1111
1101 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1112 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1102 main_name = self.user_module.__name__
1113 main_name = self.user_module.__name__
1103 sys.modules[main_name] = self.user_module
1114 sys.modules[main_name] = self.user_module
1104
1115
1105 def init_user_ns(self):
1116 def init_user_ns(self):
1106 """Initialize all user-visible namespaces to their minimum defaults.
1117 """Initialize all user-visible namespaces to their minimum defaults.
1107
1118
1108 Certain history lists are also initialized here, as they effectively
1119 Certain history lists are also initialized here, as they effectively
1109 act as user namespaces.
1120 act as user namespaces.
1110
1121
1111 Notes
1122 Notes
1112 -----
1123 -----
1113 All data structures here are only filled in, they are NOT reset by this
1124 All data structures here are only filled in, they are NOT reset by this
1114 method. If they were not empty before, data will simply be added to
1125 method. If they were not empty before, data will simply be added to
1115 therm.
1126 therm.
1116 """
1127 """
1117 # This function works in two parts: first we put a few things in
1128 # This function works in two parts: first we put a few things in
1118 # user_ns, and we sync that contents into user_ns_hidden so that these
1129 # user_ns, and we sync that contents into user_ns_hidden so that these
1119 # initial variables aren't shown by %who. After the sync, we add the
1130 # initial variables aren't shown by %who. After the sync, we add the
1120 # rest of what we *do* want the user to see with %who even on a new
1131 # rest of what we *do* want the user to see with %who even on a new
1121 # session (probably nothing, so theye really only see their own stuff)
1132 # session (probably nothing, so theye really only see their own stuff)
1122
1133
1123 # The user dict must *always* have a __builtin__ reference to the
1134 # The user dict must *always* have a __builtin__ reference to the
1124 # Python standard __builtin__ namespace, which must be imported.
1135 # Python standard __builtin__ namespace, which must be imported.
1125 # This is so that certain operations in prompt evaluation can be
1136 # This is so that certain operations in prompt evaluation can be
1126 # reliably executed with builtins. Note that we can NOT use
1137 # reliably executed with builtins. Note that we can NOT use
1127 # __builtins__ (note the 's'), because that can either be a dict or a
1138 # __builtins__ (note the 's'), because that can either be a dict or a
1128 # module, and can even mutate at runtime, depending on the context
1139 # module, and can even mutate at runtime, depending on the context
1129 # (Python makes no guarantees on it). In contrast, __builtin__ is
1140 # (Python makes no guarantees on it). In contrast, __builtin__ is
1130 # always a module object, though it must be explicitly imported.
1141 # always a module object, though it must be explicitly imported.
1131
1142
1132 # For more details:
1143 # For more details:
1133 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1144 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1134 ns = dict()
1145 ns = dict()
1135
1146
1136 # make global variables for user access to the histories
1147 # make global variables for user access to the histories
1137 ns['_ih'] = self.history_manager.input_hist_parsed
1148 ns['_ih'] = self.history_manager.input_hist_parsed
1138 ns['_oh'] = self.history_manager.output_hist
1149 ns['_oh'] = self.history_manager.output_hist
1139 ns['_dh'] = self.history_manager.dir_hist
1150 ns['_dh'] = self.history_manager.dir_hist
1140
1151
1141 ns['_sh'] = shadowns
1152 ns['_sh'] = shadowns
1142
1153
1143 # user aliases to input and output histories. These shouldn't show up
1154 # user aliases to input and output histories. These shouldn't show up
1144 # in %who, as they can have very large reprs.
1155 # in %who, as they can have very large reprs.
1145 ns['In'] = self.history_manager.input_hist_parsed
1156 ns['In'] = self.history_manager.input_hist_parsed
1146 ns['Out'] = self.history_manager.output_hist
1157 ns['Out'] = self.history_manager.output_hist
1147
1158
1148 # Store myself as the public api!!!
1159 # Store myself as the public api!!!
1149 ns['get_ipython'] = self.get_ipython
1160 ns['get_ipython'] = self.get_ipython
1150
1161
1151 ns['exit'] = self.exiter
1162 ns['exit'] = self.exiter
1152 ns['quit'] = self.exiter
1163 ns['quit'] = self.exiter
1153
1164
1154 # Sync what we've added so far to user_ns_hidden so these aren't seen
1165 # Sync what we've added so far to user_ns_hidden so these aren't seen
1155 # by %who
1166 # by %who
1156 self.user_ns_hidden.update(ns)
1167 self.user_ns_hidden.update(ns)
1157
1168
1158 # Anything put into ns now would show up in %who. Think twice before
1169 # Anything put into ns now would show up in %who. Think twice before
1159 # putting anything here, as we really want %who to show the user their
1170 # putting anything here, as we really want %who to show the user their
1160 # stuff, not our variables.
1171 # stuff, not our variables.
1161
1172
1162 # Finally, update the real user's namespace
1173 # Finally, update the real user's namespace
1163 self.user_ns.update(ns)
1174 self.user_ns.update(ns)
1164
1175
1165 @property
1176 @property
1166 def all_ns_refs(self):
1177 def all_ns_refs(self):
1167 """Get a list of references to all the namespace dictionaries in which
1178 """Get a list of references to all the namespace dictionaries in which
1168 IPython might store a user-created object.
1179 IPython might store a user-created object.
1169
1180
1170 Note that this does not include the displayhook, which also caches
1181 Note that this does not include the displayhook, which also caches
1171 objects from the output."""
1182 objects from the output."""
1172 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1183 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1173 [m.__dict__ for m in self._main_mod_cache.values()]
1184 [m.__dict__ for m in self._main_mod_cache.values()]
1174
1185
1175 def reset(self, new_session=True):
1186 def reset(self, new_session=True):
1176 """Clear all internal namespaces, and attempt to release references to
1187 """Clear all internal namespaces, and attempt to release references to
1177 user objects.
1188 user objects.
1178
1189
1179 If new_session is True, a new history session will be opened.
1190 If new_session is True, a new history session will be opened.
1180 """
1191 """
1181 # Clear histories
1192 # Clear histories
1182 self.history_manager.reset(new_session)
1193 self.history_manager.reset(new_session)
1183 # Reset counter used to index all histories
1194 # Reset counter used to index all histories
1184 if new_session:
1195 if new_session:
1185 self.execution_count = 1
1196 self.execution_count = 1
1186
1197
1187 # Flush cached output items
1198 # Flush cached output items
1188 if self.displayhook.do_full_cache:
1199 if self.displayhook.do_full_cache:
1189 self.displayhook.flush()
1200 self.displayhook.flush()
1190
1201
1191 # The main execution namespaces must be cleared very carefully,
1202 # The main execution namespaces must be cleared very carefully,
1192 # skipping the deletion of the builtin-related keys, because doing so
1203 # skipping the deletion of the builtin-related keys, because doing so
1193 # would cause errors in many object's __del__ methods.
1204 # would cause errors in many object's __del__ methods.
1194 if self.user_ns is not self.user_global_ns:
1205 if self.user_ns is not self.user_global_ns:
1195 self.user_ns.clear()
1206 self.user_ns.clear()
1196 ns = self.user_global_ns
1207 ns = self.user_global_ns
1197 drop_keys = set(ns.keys())
1208 drop_keys = set(ns.keys())
1198 drop_keys.discard('__builtin__')
1209 drop_keys.discard('__builtin__')
1199 drop_keys.discard('__builtins__')
1210 drop_keys.discard('__builtins__')
1200 drop_keys.discard('__name__')
1211 drop_keys.discard('__name__')
1201 for k in drop_keys:
1212 for k in drop_keys:
1202 del ns[k]
1213 del ns[k]
1203
1214
1204 self.user_ns_hidden.clear()
1215 self.user_ns_hidden.clear()
1205
1216
1206 # Restore the user namespaces to minimal usability
1217 # Restore the user namespaces to minimal usability
1207 self.init_user_ns()
1218 self.init_user_ns()
1208
1219
1209 # Restore the default and user aliases
1220 # Restore the default and user aliases
1210 self.alias_manager.clear_aliases()
1221 self.alias_manager.clear_aliases()
1211 self.alias_manager.init_aliases()
1222 self.alias_manager.init_aliases()
1212
1223
1213 # Flush the private list of module references kept for script
1224 # Flush the private list of module references kept for script
1214 # execution protection
1225 # execution protection
1215 self.clear_main_mod_cache()
1226 self.clear_main_mod_cache()
1216
1227
1217 def del_var(self, varname, by_name=False):
1228 def del_var(self, varname, by_name=False):
1218 """Delete a variable from the various namespaces, so that, as
1229 """Delete a variable from the various namespaces, so that, as
1219 far as possible, we're not keeping any hidden references to it.
1230 far as possible, we're not keeping any hidden references to it.
1220
1231
1221 Parameters
1232 Parameters
1222 ----------
1233 ----------
1223 varname : str
1234 varname : str
1224 The name of the variable to delete.
1235 The name of the variable to delete.
1225 by_name : bool
1236 by_name : bool
1226 If True, delete variables with the given name in each
1237 If True, delete variables with the given name in each
1227 namespace. If False (default), find the variable in the user
1238 namespace. If False (default), find the variable in the user
1228 namespace, and delete references to it.
1239 namespace, and delete references to it.
1229 """
1240 """
1230 if varname in ('__builtin__', '__builtins__'):
1241 if varname in ('__builtin__', '__builtins__'):
1231 raise ValueError("Refusing to delete %s" % varname)
1242 raise ValueError("Refusing to delete %s" % varname)
1232
1243
1233 ns_refs = self.all_ns_refs
1244 ns_refs = self.all_ns_refs
1234
1245
1235 if by_name: # Delete by name
1246 if by_name: # Delete by name
1236 for ns in ns_refs:
1247 for ns in ns_refs:
1237 try:
1248 try:
1238 del ns[varname]
1249 del ns[varname]
1239 except KeyError:
1250 except KeyError:
1240 pass
1251 pass
1241 else: # Delete by object
1252 else: # Delete by object
1242 try:
1253 try:
1243 obj = self.user_ns[varname]
1254 obj = self.user_ns[varname]
1244 except KeyError:
1255 except KeyError:
1245 raise NameError("name '%s' is not defined" % varname)
1256 raise NameError("name '%s' is not defined" % varname)
1246 # Also check in output history
1257 # Also check in output history
1247 ns_refs.append(self.history_manager.output_hist)
1258 ns_refs.append(self.history_manager.output_hist)
1248 for ns in ns_refs:
1259 for ns in ns_refs:
1249 to_delete = [n for n, o in iteritems(ns) if o is obj]
1260 to_delete = [n for n, o in iteritems(ns) if o is obj]
1250 for name in to_delete:
1261 for name in to_delete:
1251 del ns[name]
1262 del ns[name]
1252
1263
1253 # displayhook keeps extra references, but not in a dictionary
1264 # displayhook keeps extra references, but not in a dictionary
1254 for name in ('_', '__', '___'):
1265 for name in ('_', '__', '___'):
1255 if getattr(self.displayhook, name) is obj:
1266 if getattr(self.displayhook, name) is obj:
1256 setattr(self.displayhook, name, None)
1267 setattr(self.displayhook, name, None)
1257
1268
1258 def reset_selective(self, regex=None):
1269 def reset_selective(self, regex=None):
1259 """Clear selective variables from internal namespaces based on a
1270 """Clear selective variables from internal namespaces based on a
1260 specified regular expression.
1271 specified regular expression.
1261
1272
1262 Parameters
1273 Parameters
1263 ----------
1274 ----------
1264 regex : string or compiled pattern, optional
1275 regex : string or compiled pattern, optional
1265 A regular expression pattern that will be used in searching
1276 A regular expression pattern that will be used in searching
1266 variable names in the users namespaces.
1277 variable names in the users namespaces.
1267 """
1278 """
1268 if regex is not None:
1279 if regex is not None:
1269 try:
1280 try:
1270 m = re.compile(regex)
1281 m = re.compile(regex)
1271 except TypeError:
1282 except TypeError:
1272 raise TypeError('regex must be a string or compiled pattern')
1283 raise TypeError('regex must be a string or compiled pattern')
1273 # Search for keys in each namespace that match the given regex
1284 # Search for keys in each namespace that match the given regex
1274 # If a match is found, delete the key/value pair.
1285 # If a match is found, delete the key/value pair.
1275 for ns in self.all_ns_refs:
1286 for ns in self.all_ns_refs:
1276 for var in ns:
1287 for var in ns:
1277 if m.search(var):
1288 if m.search(var):
1278 del ns[var]
1289 del ns[var]
1279
1290
1280 def push(self, variables, interactive=True):
1291 def push(self, variables, interactive=True):
1281 """Inject a group of variables into the IPython user namespace.
1292 """Inject a group of variables into the IPython user namespace.
1282
1293
1283 Parameters
1294 Parameters
1284 ----------
1295 ----------
1285 variables : dict, str or list/tuple of str
1296 variables : dict, str or list/tuple of str
1286 The variables to inject into the user's namespace. If a dict, a
1297 The variables to inject into the user's namespace. If a dict, a
1287 simple update is done. If a str, the string is assumed to have
1298 simple update is done. If a str, the string is assumed to have
1288 variable names separated by spaces. A list/tuple of str can also
1299 variable names separated by spaces. A list/tuple of str can also
1289 be used to give the variable names. If just the variable names are
1300 be used to give the variable names. If just the variable names are
1290 give (list/tuple/str) then the variable values looked up in the
1301 give (list/tuple/str) then the variable values looked up in the
1291 callers frame.
1302 callers frame.
1292 interactive : bool
1303 interactive : bool
1293 If True (default), the variables will be listed with the ``who``
1304 If True (default), the variables will be listed with the ``who``
1294 magic.
1305 magic.
1295 """
1306 """
1296 vdict = None
1307 vdict = None
1297
1308
1298 # We need a dict of name/value pairs to do namespace updates.
1309 # We need a dict of name/value pairs to do namespace updates.
1299 if isinstance(variables, dict):
1310 if isinstance(variables, dict):
1300 vdict = variables
1311 vdict = variables
1301 elif isinstance(variables, string_types+(list, tuple)):
1312 elif isinstance(variables, string_types+(list, tuple)):
1302 if isinstance(variables, string_types):
1313 if isinstance(variables, string_types):
1303 vlist = variables.split()
1314 vlist = variables.split()
1304 else:
1315 else:
1305 vlist = variables
1316 vlist = variables
1306 vdict = {}
1317 vdict = {}
1307 cf = sys._getframe(1)
1318 cf = sys._getframe(1)
1308 for name in vlist:
1319 for name in vlist:
1309 try:
1320 try:
1310 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1321 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1311 except:
1322 except:
1312 print('Could not get variable %s from %s' %
1323 print('Could not get variable %s from %s' %
1313 (name,cf.f_code.co_name))
1324 (name,cf.f_code.co_name))
1314 else:
1325 else:
1315 raise ValueError('variables must be a dict/str/list/tuple')
1326 raise ValueError('variables must be a dict/str/list/tuple')
1316
1327
1317 # Propagate variables to user namespace
1328 # Propagate variables to user namespace
1318 self.user_ns.update(vdict)
1329 self.user_ns.update(vdict)
1319
1330
1320 # And configure interactive visibility
1331 # And configure interactive visibility
1321 user_ns_hidden = self.user_ns_hidden
1332 user_ns_hidden = self.user_ns_hidden
1322 if interactive:
1333 if interactive:
1323 for name in vdict:
1334 for name in vdict:
1324 user_ns_hidden.pop(name, None)
1335 user_ns_hidden.pop(name, None)
1325 else:
1336 else:
1326 user_ns_hidden.update(vdict)
1337 user_ns_hidden.update(vdict)
1327
1338
1328 def drop_by_id(self, variables):
1339 def drop_by_id(self, variables):
1329 """Remove a dict of variables from the user namespace, if they are the
1340 """Remove a dict of variables from the user namespace, if they are the
1330 same as the values in the dictionary.
1341 same as the values in the dictionary.
1331
1342
1332 This is intended for use by extensions: variables that they've added can
1343 This is intended for use by extensions: variables that they've added can
1333 be taken back out if they are unloaded, without removing any that the
1344 be taken back out if they are unloaded, without removing any that the
1334 user has overwritten.
1345 user has overwritten.
1335
1346
1336 Parameters
1347 Parameters
1337 ----------
1348 ----------
1338 variables : dict
1349 variables : dict
1339 A dictionary mapping object names (as strings) to the objects.
1350 A dictionary mapping object names (as strings) to the objects.
1340 """
1351 """
1341 for name, obj in iteritems(variables):
1352 for name, obj in iteritems(variables):
1342 if name in self.user_ns and self.user_ns[name] is obj:
1353 if name in self.user_ns and self.user_ns[name] is obj:
1343 del self.user_ns[name]
1354 del self.user_ns[name]
1344 self.user_ns_hidden.pop(name, None)
1355 self.user_ns_hidden.pop(name, None)
1345
1356
1346 #-------------------------------------------------------------------------
1357 #-------------------------------------------------------------------------
1347 # Things related to object introspection
1358 # Things related to object introspection
1348 #-------------------------------------------------------------------------
1359 #-------------------------------------------------------------------------
1349
1360
1350 def _ofind(self, oname, namespaces=None):
1361 def _ofind(self, oname, namespaces=None):
1351 """Find an object in the available namespaces.
1362 """Find an object in the available namespaces.
1352
1363
1353 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1364 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1354
1365
1355 Has special code to detect magic functions.
1366 Has special code to detect magic functions.
1356 """
1367 """
1357 oname = oname.strip()
1368 oname = oname.strip()
1358 #print '1- oname: <%r>' % oname # dbg
1369 #print '1- oname: <%r>' % oname # dbg
1359 if not oname.startswith(ESC_MAGIC) and \
1370 if not oname.startswith(ESC_MAGIC) and \
1360 not oname.startswith(ESC_MAGIC2) and \
1371 not oname.startswith(ESC_MAGIC2) and \
1361 not py3compat.isidentifier(oname, dotted=True):
1372 not py3compat.isidentifier(oname, dotted=True):
1362 return dict(found=False)
1373 return dict(found=False)
1363
1374
1364 alias_ns = None
1375 alias_ns = None
1365 if namespaces is None:
1376 if namespaces is None:
1366 # Namespaces to search in:
1377 # Namespaces to search in:
1367 # Put them in a list. The order is important so that we
1378 # Put them in a list. The order is important so that we
1368 # find things in the same order that Python finds them.
1379 # find things in the same order that Python finds them.
1369 namespaces = [ ('Interactive', self.user_ns),
1380 namespaces = [ ('Interactive', self.user_ns),
1370 ('Interactive (global)', self.user_global_ns),
1381 ('Interactive (global)', self.user_global_ns),
1371 ('Python builtin', builtin_mod.__dict__),
1382 ('Python builtin', builtin_mod.__dict__),
1372 ]
1383 ]
1373
1384
1374 # initialize results to 'null'
1385 # initialize results to 'null'
1375 found = False; obj = None; ospace = None; ds = None;
1386 found = False; obj = None; ospace = None; ds = None;
1376 ismagic = False; isalias = False; parent = None
1387 ismagic = False; isalias = False; parent = None
1377
1388
1378 # We need to special-case 'print', which as of python2.6 registers as a
1389 # We need to special-case 'print', which as of python2.6 registers as a
1379 # function but should only be treated as one if print_function was
1390 # function but should only be treated as one if print_function was
1380 # loaded with a future import. In this case, just bail.
1391 # loaded with a future import. In this case, just bail.
1381 if (oname == 'print' and not py3compat.PY3 and not \
1392 if (oname == 'print' and not py3compat.PY3 and not \
1382 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1393 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1383 return {'found':found, 'obj':obj, 'namespace':ospace,
1394 return {'found':found, 'obj':obj, 'namespace':ospace,
1384 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1395 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1385
1396
1386 # Look for the given name by splitting it in parts. If the head is
1397 # Look for the given name by splitting it in parts. If the head is
1387 # found, then we look for all the remaining parts as members, and only
1398 # found, then we look for all the remaining parts as members, and only
1388 # declare success if we can find them all.
1399 # declare success if we can find them all.
1389 oname_parts = oname.split('.')
1400 oname_parts = oname.split('.')
1390 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1401 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1391 for nsname,ns in namespaces:
1402 for nsname,ns in namespaces:
1392 try:
1403 try:
1393 obj = ns[oname_head]
1404 obj = ns[oname_head]
1394 except KeyError:
1405 except KeyError:
1395 continue
1406 continue
1396 else:
1407 else:
1397 #print 'oname_rest:', oname_rest # dbg
1408 #print 'oname_rest:', oname_rest # dbg
1398 for part in oname_rest:
1409 for part in oname_rest:
1399 try:
1410 try:
1400 parent = obj
1411 parent = obj
1401 obj = getattr(obj,part)
1412 obj = getattr(obj,part)
1402 except:
1413 except:
1403 # Blanket except b/c some badly implemented objects
1414 # Blanket except b/c some badly implemented objects
1404 # allow __getattr__ to raise exceptions other than
1415 # allow __getattr__ to raise exceptions other than
1405 # AttributeError, which then crashes IPython.
1416 # AttributeError, which then crashes IPython.
1406 break
1417 break
1407 else:
1418 else:
1408 # If we finish the for loop (no break), we got all members
1419 # If we finish the for loop (no break), we got all members
1409 found = True
1420 found = True
1410 ospace = nsname
1421 ospace = nsname
1411 break # namespace loop
1422 break # namespace loop
1412
1423
1413 # Try to see if it's magic
1424 # Try to see if it's magic
1414 if not found:
1425 if not found:
1415 obj = None
1426 obj = None
1416 if oname.startswith(ESC_MAGIC2):
1427 if oname.startswith(ESC_MAGIC2):
1417 oname = oname.lstrip(ESC_MAGIC2)
1428 oname = oname.lstrip(ESC_MAGIC2)
1418 obj = self.find_cell_magic(oname)
1429 obj = self.find_cell_magic(oname)
1419 elif oname.startswith(ESC_MAGIC):
1430 elif oname.startswith(ESC_MAGIC):
1420 oname = oname.lstrip(ESC_MAGIC)
1431 oname = oname.lstrip(ESC_MAGIC)
1421 obj = self.find_line_magic(oname)
1432 obj = self.find_line_magic(oname)
1422 else:
1433 else:
1423 # search without prefix, so run? will find %run?
1434 # search without prefix, so run? will find %run?
1424 obj = self.find_line_magic(oname)
1435 obj = self.find_line_magic(oname)
1425 if obj is None:
1436 if obj is None:
1426 obj = self.find_cell_magic(oname)
1437 obj = self.find_cell_magic(oname)
1427 if obj is not None:
1438 if obj is not None:
1428 found = True
1439 found = True
1429 ospace = 'IPython internal'
1440 ospace = 'IPython internal'
1430 ismagic = True
1441 ismagic = True
1431
1442
1432 # Last try: special-case some literals like '', [], {}, etc:
1443 # Last try: special-case some literals like '', [], {}, etc:
1433 if not found and oname_head in ["''",'""','[]','{}','()']:
1444 if not found and oname_head in ["''",'""','[]','{}','()']:
1434 obj = eval(oname_head)
1445 obj = eval(oname_head)
1435 found = True
1446 found = True
1436 ospace = 'Interactive'
1447 ospace = 'Interactive'
1437
1448
1438 return {'found':found, 'obj':obj, 'namespace':ospace,
1449 return {'found':found, 'obj':obj, 'namespace':ospace,
1439 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1450 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1440
1451
1441 def _ofind_property(self, oname, info):
1452 def _ofind_property(self, oname, info):
1442 """Second part of object finding, to look for property details."""
1453 """Second part of object finding, to look for property details."""
1443 if info.found:
1454 if info.found:
1444 # Get the docstring of the class property if it exists.
1455 # Get the docstring of the class property if it exists.
1445 path = oname.split('.')
1456 path = oname.split('.')
1446 root = '.'.join(path[:-1])
1457 root = '.'.join(path[:-1])
1447 if info.parent is not None:
1458 if info.parent is not None:
1448 try:
1459 try:
1449 target = getattr(info.parent, '__class__')
1460 target = getattr(info.parent, '__class__')
1450 # The object belongs to a class instance.
1461 # The object belongs to a class instance.
1451 try:
1462 try:
1452 target = getattr(target, path[-1])
1463 target = getattr(target, path[-1])
1453 # The class defines the object.
1464 # The class defines the object.
1454 if isinstance(target, property):
1465 if isinstance(target, property):
1455 oname = root + '.__class__.' + path[-1]
1466 oname = root + '.__class__.' + path[-1]
1456 info = Struct(self._ofind(oname))
1467 info = Struct(self._ofind(oname))
1457 except AttributeError: pass
1468 except AttributeError: pass
1458 except AttributeError: pass
1469 except AttributeError: pass
1459
1470
1460 # We return either the new info or the unmodified input if the object
1471 # We return either the new info or the unmodified input if the object
1461 # hadn't been found
1472 # hadn't been found
1462 return info
1473 return info
1463
1474
1464 def _object_find(self, oname, namespaces=None):
1475 def _object_find(self, oname, namespaces=None):
1465 """Find an object and return a struct with info about it."""
1476 """Find an object and return a struct with info about it."""
1466 inf = Struct(self._ofind(oname, namespaces))
1477 inf = Struct(self._ofind(oname, namespaces))
1467 return Struct(self._ofind_property(oname, inf))
1478 return Struct(self._ofind_property(oname, inf))
1468
1479
1469 def _inspect(self, meth, oname, namespaces=None, **kw):
1480 def _inspect(self, meth, oname, namespaces=None, **kw):
1470 """Generic interface to the inspector system.
1481 """Generic interface to the inspector system.
1471
1482
1472 This function is meant to be called by pdef, pdoc & friends."""
1483 This function is meant to be called by pdef, pdoc & friends."""
1473 info = self._object_find(oname, namespaces)
1484 info = self._object_find(oname, namespaces)
1474 if info.found:
1485 if info.found:
1475 pmethod = getattr(self.inspector, meth)
1486 pmethod = getattr(self.inspector, meth)
1476 formatter = format_screen if info.ismagic else None
1487 formatter = format_screen if info.ismagic else None
1477 if meth == 'pdoc':
1488 if meth == 'pdoc':
1478 pmethod(info.obj, oname, formatter)
1489 pmethod(info.obj, oname, formatter)
1479 elif meth == 'pinfo':
1490 elif meth == 'pinfo':
1480 pmethod(info.obj, oname, formatter, info, **kw)
1491 pmethod(info.obj, oname, formatter, info, **kw)
1481 else:
1492 else:
1482 pmethod(info.obj, oname)
1493 pmethod(info.obj, oname)
1483 else:
1494 else:
1484 print('Object `%s` not found.' % oname)
1495 print('Object `%s` not found.' % oname)
1485 return 'not found' # so callers can take other action
1496 return 'not found' # so callers can take other action
1486
1497
1487 def object_inspect(self, oname, detail_level=0):
1498 def object_inspect(self, oname, detail_level=0):
1488 with self.builtin_trap:
1499 with self.builtin_trap:
1489 info = self._object_find(oname)
1500 info = self._object_find(oname)
1490 if info.found:
1501 if info.found:
1491 return self.inspector.info(info.obj, oname, info=info,
1502 return self.inspector.info(info.obj, oname, info=info,
1492 detail_level=detail_level
1503 detail_level=detail_level
1493 )
1504 )
1494 else:
1505 else:
1495 return oinspect.object_info(name=oname, found=False)
1506 return oinspect.object_info(name=oname, found=False)
1496
1507
1497 #-------------------------------------------------------------------------
1508 #-------------------------------------------------------------------------
1498 # Things related to history management
1509 # Things related to history management
1499 #-------------------------------------------------------------------------
1510 #-------------------------------------------------------------------------
1500
1511
1501 def init_history(self):
1512 def init_history(self):
1502 """Sets up the command history, and starts regular autosaves."""
1513 """Sets up the command history, and starts regular autosaves."""
1503 self.history_manager = HistoryManager(shell=self, parent=self)
1514 self.history_manager = HistoryManager(shell=self, parent=self)
1504 self.configurables.append(self.history_manager)
1515 self.configurables.append(self.history_manager)
1505
1516
1506 #-------------------------------------------------------------------------
1517 #-------------------------------------------------------------------------
1507 # Things related to exception handling and tracebacks (not debugging)
1518 # Things related to exception handling and tracebacks (not debugging)
1508 #-------------------------------------------------------------------------
1519 #-------------------------------------------------------------------------
1509
1520
1510 def init_traceback_handlers(self, custom_exceptions):
1521 def init_traceback_handlers(self, custom_exceptions):
1511 # Syntax error handler.
1522 # Syntax error handler.
1512 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1523 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1513
1524
1514 # The interactive one is initialized with an offset, meaning we always
1525 # The interactive one is initialized with an offset, meaning we always
1515 # want to remove the topmost item in the traceback, which is our own
1526 # want to remove the topmost item in the traceback, which is our own
1516 # internal code. Valid modes: ['Plain','Context','Verbose']
1527 # internal code. Valid modes: ['Plain','Context','Verbose']
1517 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1528 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1518 color_scheme='NoColor',
1529 color_scheme='NoColor',
1519 tb_offset = 1,
1530 tb_offset = 1,
1520 check_cache=check_linecache_ipython)
1531 check_cache=check_linecache_ipython)
1521
1532
1522 # The instance will store a pointer to the system-wide exception hook,
1533 # The instance will store a pointer to the system-wide exception hook,
1523 # so that runtime code (such as magics) can access it. This is because
1534 # so that runtime code (such as magics) can access it. This is because
1524 # during the read-eval loop, it may get temporarily overwritten.
1535 # during the read-eval loop, it may get temporarily overwritten.
1525 self.sys_excepthook = sys.excepthook
1536 self.sys_excepthook = sys.excepthook
1526
1537
1527 # and add any custom exception handlers the user may have specified
1538 # and add any custom exception handlers the user may have specified
1528 self.set_custom_exc(*custom_exceptions)
1539 self.set_custom_exc(*custom_exceptions)
1529
1540
1530 # Set the exception mode
1541 # Set the exception mode
1531 self.InteractiveTB.set_mode(mode=self.xmode)
1542 self.InteractiveTB.set_mode(mode=self.xmode)
1532
1543
1533 def set_custom_exc(self, exc_tuple, handler):
1544 def set_custom_exc(self, exc_tuple, handler):
1534 """set_custom_exc(exc_tuple,handler)
1545 """set_custom_exc(exc_tuple,handler)
1535
1546
1536 Set a custom exception handler, which will be called if any of the
1547 Set a custom exception handler, which will be called if any of the
1537 exceptions in exc_tuple occur in the mainloop (specifically, in the
1548 exceptions in exc_tuple occur in the mainloop (specifically, in the
1538 run_code() method).
1549 run_code() method).
1539
1550
1540 Parameters
1551 Parameters
1541 ----------
1552 ----------
1542
1553
1543 exc_tuple : tuple of exception classes
1554 exc_tuple : tuple of exception classes
1544 A *tuple* of exception classes, for which to call the defined
1555 A *tuple* of exception classes, for which to call the defined
1545 handler. It is very important that you use a tuple, and NOT A
1556 handler. It is very important that you use a tuple, and NOT A
1546 LIST here, because of the way Python's except statement works. If
1557 LIST here, because of the way Python's except statement works. If
1547 you only want to trap a single exception, use a singleton tuple::
1558 you only want to trap a single exception, use a singleton tuple::
1548
1559
1549 exc_tuple == (MyCustomException,)
1560 exc_tuple == (MyCustomException,)
1550
1561
1551 handler : callable
1562 handler : callable
1552 handler must have the following signature::
1563 handler must have the following signature::
1553
1564
1554 def my_handler(self, etype, value, tb, tb_offset=None):
1565 def my_handler(self, etype, value, tb, tb_offset=None):
1555 ...
1566 ...
1556 return structured_traceback
1567 return structured_traceback
1557
1568
1558 Your handler must return a structured traceback (a list of strings),
1569 Your handler must return a structured traceback (a list of strings),
1559 or None.
1570 or None.
1560
1571
1561 This will be made into an instance method (via types.MethodType)
1572 This will be made into an instance method (via types.MethodType)
1562 of IPython itself, and it will be called if any of the exceptions
1573 of IPython itself, and it will be called if any of the exceptions
1563 listed in the exc_tuple are caught. If the handler is None, an
1574 listed in the exc_tuple are caught. If the handler is None, an
1564 internal basic one is used, which just prints basic info.
1575 internal basic one is used, which just prints basic info.
1565
1576
1566 To protect IPython from crashes, if your handler ever raises an
1577 To protect IPython from crashes, if your handler ever raises an
1567 exception or returns an invalid result, it will be immediately
1578 exception or returns an invalid result, it will be immediately
1568 disabled.
1579 disabled.
1569
1580
1570 WARNING: by putting in your own exception handler into IPython's main
1581 WARNING: by putting in your own exception handler into IPython's main
1571 execution loop, you run a very good chance of nasty crashes. This
1582 execution loop, you run a very good chance of nasty crashes. This
1572 facility should only be used if you really know what you are doing."""
1583 facility should only be used if you really know what you are doing."""
1573
1584
1574 assert type(exc_tuple)==type(()) , \
1585 assert type(exc_tuple)==type(()) , \
1575 "The custom exceptions must be given AS A TUPLE."
1586 "The custom exceptions must be given AS A TUPLE."
1576
1587
1577 def dummy_handler(self,etype,value,tb,tb_offset=None):
1588 def dummy_handler(self,etype,value,tb,tb_offset=None):
1578 print('*** Simple custom exception handler ***')
1589 print('*** Simple custom exception handler ***')
1579 print('Exception type :',etype)
1590 print('Exception type :',etype)
1580 print('Exception value:',value)
1591 print('Exception value:',value)
1581 print('Traceback :',tb)
1592 print('Traceback :',tb)
1582 #print 'Source code :','\n'.join(self.buffer)
1593 #print 'Source code :','\n'.join(self.buffer)
1583
1594
1584 def validate_stb(stb):
1595 def validate_stb(stb):
1585 """validate structured traceback return type
1596 """validate structured traceback return type
1586
1597
1587 return type of CustomTB *should* be a list of strings, but allow
1598 return type of CustomTB *should* be a list of strings, but allow
1588 single strings or None, which are harmless.
1599 single strings or None, which are harmless.
1589
1600
1590 This function will *always* return a list of strings,
1601 This function will *always* return a list of strings,
1591 and will raise a TypeError if stb is inappropriate.
1602 and will raise a TypeError if stb is inappropriate.
1592 """
1603 """
1593 msg = "CustomTB must return list of strings, not %r" % stb
1604 msg = "CustomTB must return list of strings, not %r" % stb
1594 if stb is None:
1605 if stb is None:
1595 return []
1606 return []
1596 elif isinstance(stb, string_types):
1607 elif isinstance(stb, string_types):
1597 return [stb]
1608 return [stb]
1598 elif not isinstance(stb, list):
1609 elif not isinstance(stb, list):
1599 raise TypeError(msg)
1610 raise TypeError(msg)
1600 # it's a list
1611 # it's a list
1601 for line in stb:
1612 for line in stb:
1602 # check every element
1613 # check every element
1603 if not isinstance(line, string_types):
1614 if not isinstance(line, string_types):
1604 raise TypeError(msg)
1615 raise TypeError(msg)
1605 return stb
1616 return stb
1606
1617
1607 if handler is None:
1618 if handler is None:
1608 wrapped = dummy_handler
1619 wrapped = dummy_handler
1609 else:
1620 else:
1610 def wrapped(self,etype,value,tb,tb_offset=None):
1621 def wrapped(self,etype,value,tb,tb_offset=None):
1611 """wrap CustomTB handler, to protect IPython from user code
1622 """wrap CustomTB handler, to protect IPython from user code
1612
1623
1613 This makes it harder (but not impossible) for custom exception
1624 This makes it harder (but not impossible) for custom exception
1614 handlers to crash IPython.
1625 handlers to crash IPython.
1615 """
1626 """
1616 try:
1627 try:
1617 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1628 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1618 return validate_stb(stb)
1629 return validate_stb(stb)
1619 except:
1630 except:
1620 # clear custom handler immediately
1631 # clear custom handler immediately
1621 self.set_custom_exc((), None)
1632 self.set_custom_exc((), None)
1622 print("Custom TB Handler failed, unregistering", file=io.stderr)
1633 print("Custom TB Handler failed, unregistering", file=io.stderr)
1623 # show the exception in handler first
1634 # show the exception in handler first
1624 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1635 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1625 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1636 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1626 print("The original exception:", file=io.stdout)
1637 print("The original exception:", file=io.stdout)
1627 stb = self.InteractiveTB.structured_traceback(
1638 stb = self.InteractiveTB.structured_traceback(
1628 (etype,value,tb), tb_offset=tb_offset
1639 (etype,value,tb), tb_offset=tb_offset
1629 )
1640 )
1630 return stb
1641 return stb
1631
1642
1632 self.CustomTB = types.MethodType(wrapped,self)
1643 self.CustomTB = types.MethodType(wrapped,self)
1633 self.custom_exceptions = exc_tuple
1644 self.custom_exceptions = exc_tuple
1634
1645
1635 def excepthook(self, etype, value, tb):
1646 def excepthook(self, etype, value, tb):
1636 """One more defense for GUI apps that call sys.excepthook.
1647 """One more defense for GUI apps that call sys.excepthook.
1637
1648
1638 GUI frameworks like wxPython trap exceptions and call
1649 GUI frameworks like wxPython trap exceptions and call
1639 sys.excepthook themselves. I guess this is a feature that
1650 sys.excepthook themselves. I guess this is a feature that
1640 enables them to keep running after exceptions that would
1651 enables them to keep running after exceptions that would
1641 otherwise kill their mainloop. This is a bother for IPython
1652 otherwise kill their mainloop. This is a bother for IPython
1642 which excepts to catch all of the program exceptions with a try:
1653 which excepts to catch all of the program exceptions with a try:
1643 except: statement.
1654 except: statement.
1644
1655
1645 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1656 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1646 any app directly invokes sys.excepthook, it will look to the user like
1657 any app directly invokes sys.excepthook, it will look to the user like
1647 IPython crashed. In order to work around this, we can disable the
1658 IPython crashed. In order to work around this, we can disable the
1648 CrashHandler and replace it with this excepthook instead, which prints a
1659 CrashHandler and replace it with this excepthook instead, which prints a
1649 regular traceback using our InteractiveTB. In this fashion, apps which
1660 regular traceback using our InteractiveTB. In this fashion, apps which
1650 call sys.excepthook will generate a regular-looking exception from
1661 call sys.excepthook will generate a regular-looking exception from
1651 IPython, and the CrashHandler will only be triggered by real IPython
1662 IPython, and the CrashHandler will only be triggered by real IPython
1652 crashes.
1663 crashes.
1653
1664
1654 This hook should be used sparingly, only in places which are not likely
1665 This hook should be used sparingly, only in places which are not likely
1655 to be true IPython errors.
1666 to be true IPython errors.
1656 """
1667 """
1657 self.showtraceback((etype,value,tb),tb_offset=0)
1668 self.showtraceback((etype,value,tb),tb_offset=0)
1658
1669
1659 def _get_exc_info(self, exc_tuple=None):
1670 def _get_exc_info(self, exc_tuple=None):
1660 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1671 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1661
1672
1662 Ensures sys.last_type,value,traceback hold the exc_info we found,
1673 Ensures sys.last_type,value,traceback hold the exc_info we found,
1663 from whichever source.
1674 from whichever source.
1664
1675
1665 raises ValueError if none of these contain any information
1676 raises ValueError if none of these contain any information
1666 """
1677 """
1667 if exc_tuple is None:
1678 if exc_tuple is None:
1668 etype, value, tb = sys.exc_info()
1679 etype, value, tb = sys.exc_info()
1669 else:
1680 else:
1670 etype, value, tb = exc_tuple
1681 etype, value, tb = exc_tuple
1671
1682
1672 if etype is None:
1683 if etype is None:
1673 if hasattr(sys, 'last_type'):
1684 if hasattr(sys, 'last_type'):
1674 etype, value, tb = sys.last_type, sys.last_value, \
1685 etype, value, tb = sys.last_type, sys.last_value, \
1675 sys.last_traceback
1686 sys.last_traceback
1676
1687
1677 if etype is None:
1688 if etype is None:
1678 raise ValueError("No exception to find")
1689 raise ValueError("No exception to find")
1679
1690
1680 # Now store the exception info in sys.last_type etc.
1691 # Now store the exception info in sys.last_type etc.
1681 # WARNING: these variables are somewhat deprecated and not
1692 # WARNING: these variables are somewhat deprecated and not
1682 # necessarily safe to use in a threaded environment, but tools
1693 # necessarily safe to use in a threaded environment, but tools
1683 # like pdb depend on their existence, so let's set them. If we
1694 # like pdb depend on their existence, so let's set them. If we
1684 # find problems in the field, we'll need to revisit their use.
1695 # find problems in the field, we'll need to revisit their use.
1685 sys.last_type = etype
1696 sys.last_type = etype
1686 sys.last_value = value
1697 sys.last_value = value
1687 sys.last_traceback = tb
1698 sys.last_traceback = tb
1688
1699
1689 return etype, value, tb
1700 return etype, value, tb
1690
1701
1691 def show_usage_error(self, exc):
1702 def show_usage_error(self, exc):
1692 """Show a short message for UsageErrors
1703 """Show a short message for UsageErrors
1693
1704
1694 These are special exceptions that shouldn't show a traceback.
1705 These are special exceptions that shouldn't show a traceback.
1695 """
1706 """
1696 self.write_err("UsageError: %s" % exc)
1707 self.write_err("UsageError: %s" % exc)
1697
1708
1698 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1709 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1699 exception_only=False):
1710 exception_only=False):
1700 """Display the exception that just occurred.
1711 """Display the exception that just occurred.
1701
1712
1702 If nothing is known about the exception, this is the method which
1713 If nothing is known about the exception, this is the method which
1703 should be used throughout the code for presenting user tracebacks,
1714 should be used throughout the code for presenting user tracebacks,
1704 rather than directly invoking the InteractiveTB object.
1715 rather than directly invoking the InteractiveTB object.
1705
1716
1706 A specific showsyntaxerror() also exists, but this method can take
1717 A specific showsyntaxerror() also exists, but this method can take
1707 care of calling it if needed, so unless you are explicitly catching a
1718 care of calling it if needed, so unless you are explicitly catching a
1708 SyntaxError exception, don't try to analyze the stack manually and
1719 SyntaxError exception, don't try to analyze the stack manually and
1709 simply call this method."""
1720 simply call this method."""
1710
1721
1711 try:
1722 try:
1712 try:
1723 try:
1713 etype, value, tb = self._get_exc_info(exc_tuple)
1724 etype, value, tb = self._get_exc_info(exc_tuple)
1714 except ValueError:
1725 except ValueError:
1715 self.write_err('No traceback available to show.\n')
1726 self.write_err('No traceback available to show.\n')
1716 return
1727 return
1717
1728
1718 if issubclass(etype, SyntaxError):
1729 if issubclass(etype, SyntaxError):
1719 # Though this won't be called by syntax errors in the input
1730 # Though this won't be called by syntax errors in the input
1720 # line, there may be SyntaxError cases with imported code.
1731 # line, there may be SyntaxError cases with imported code.
1721 self.showsyntaxerror(filename)
1732 self.showsyntaxerror(filename)
1722 elif etype is UsageError:
1733 elif etype is UsageError:
1723 self.show_usage_error(value)
1734 self.show_usage_error(value)
1724 else:
1735 else:
1725 if exception_only:
1736 if exception_only:
1726 stb = ['An exception has occurred, use %tb to see '
1737 stb = ['An exception has occurred, use %tb to see '
1727 'the full traceback.\n']
1738 'the full traceback.\n']
1728 stb.extend(self.InteractiveTB.get_exception_only(etype,
1739 stb.extend(self.InteractiveTB.get_exception_only(etype,
1729 value))
1740 value))
1730 else:
1741 else:
1731 try:
1742 try:
1732 # Exception classes can customise their traceback - we
1743 # Exception classes can customise their traceback - we
1733 # use this in IPython.parallel for exceptions occurring
1744 # use this in IPython.parallel for exceptions occurring
1734 # in the engines. This should return a list of strings.
1745 # in the engines. This should return a list of strings.
1735 stb = value._render_traceback_()
1746 stb = value._render_traceback_()
1736 except Exception:
1747 except Exception:
1737 stb = self.InteractiveTB.structured_traceback(etype,
1748 stb = self.InteractiveTB.structured_traceback(etype,
1738 value, tb, tb_offset=tb_offset)
1749 value, tb, tb_offset=tb_offset)
1739
1750
1740 self._showtraceback(etype, value, stb)
1751 self._showtraceback(etype, value, stb)
1741 if self.call_pdb:
1752 if self.call_pdb:
1742 # drop into debugger
1753 # drop into debugger
1743 self.debugger(force=True)
1754 self.debugger(force=True)
1744 return
1755 return
1745
1756
1746 # Actually show the traceback
1757 # Actually show the traceback
1747 self._showtraceback(etype, value, stb)
1758 self._showtraceback(etype, value, stb)
1748
1759
1749 except KeyboardInterrupt:
1760 except KeyboardInterrupt:
1750 self.write_err("\nKeyboardInterrupt\n")
1761 self.write_err("\nKeyboardInterrupt\n")
1751
1762
1752 def _showtraceback(self, etype, evalue, stb):
1763 def _showtraceback(self, etype, evalue, stb):
1753 """Actually show a traceback.
1764 """Actually show a traceback.
1754
1765
1755 Subclasses may override this method to put the traceback on a different
1766 Subclasses may override this method to put the traceback on a different
1756 place, like a side channel.
1767 place, like a side channel.
1757 """
1768 """
1758 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1769 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1759
1770
1760 def showsyntaxerror(self, filename=None):
1771 def showsyntaxerror(self, filename=None):
1761 """Display the syntax error that just occurred.
1772 """Display the syntax error that just occurred.
1762
1773
1763 This doesn't display a stack trace because there isn't one.
1774 This doesn't display a stack trace because there isn't one.
1764
1775
1765 If a filename is given, it is stuffed in the exception instead
1776 If a filename is given, it is stuffed in the exception instead
1766 of what was there before (because Python's parser always uses
1777 of what was there before (because Python's parser always uses
1767 "<string>" when reading from a string).
1778 "<string>" when reading from a string).
1768 """
1779 """
1769 etype, value, last_traceback = self._get_exc_info()
1780 etype, value, last_traceback = self._get_exc_info()
1770
1781
1771 if filename and issubclass(etype, SyntaxError):
1782 if filename and issubclass(etype, SyntaxError):
1772 try:
1783 try:
1773 value.filename = filename
1784 value.filename = filename
1774 except:
1785 except:
1775 # Not the format we expect; leave it alone
1786 # Not the format we expect; leave it alone
1776 pass
1787 pass
1777
1788
1778 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1789 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1779 self._showtraceback(etype, value, stb)
1790 self._showtraceback(etype, value, stb)
1780
1791
1781 # This is overridden in TerminalInteractiveShell to show a message about
1792 # This is overridden in TerminalInteractiveShell to show a message about
1782 # the %paste magic.
1793 # the %paste magic.
1783 def showindentationerror(self):
1794 def showindentationerror(self):
1784 """Called by run_cell when there's an IndentationError in code entered
1795 """Called by run_cell when there's an IndentationError in code entered
1785 at the prompt.
1796 at the prompt.
1786
1797
1787 This is overridden in TerminalInteractiveShell to show a message about
1798 This is overridden in TerminalInteractiveShell to show a message about
1788 the %paste magic."""
1799 the %paste magic."""
1789 self.showsyntaxerror()
1800 self.showsyntaxerror()
1790
1801
1791 #-------------------------------------------------------------------------
1802 #-------------------------------------------------------------------------
1792 # Things related to readline
1803 # Things related to readline
1793 #-------------------------------------------------------------------------
1804 #-------------------------------------------------------------------------
1794
1805
1795 def init_readline(self):
1806 def init_readline(self):
1796 """Command history completion/saving/reloading."""
1807 """Command history completion/saving/reloading."""
1797
1808
1798 if self.readline_use:
1809 if self.readline_use:
1799 import IPython.utils.rlineimpl as readline
1810 import IPython.utils.rlineimpl as readline
1800
1811
1801 self.rl_next_input = None
1812 self.rl_next_input = None
1802 self.rl_do_indent = False
1813 self.rl_do_indent = False
1803
1814
1804 if not self.readline_use or not readline.have_readline:
1815 if not self.readline_use or not readline.have_readline:
1805 self.has_readline = False
1816 self.has_readline = False
1806 self.readline = None
1817 self.readline = None
1807 # Set a number of methods that depend on readline to be no-op
1818 # Set a number of methods that depend on readline to be no-op
1808 self.readline_no_record = no_op_context
1819 self.readline_no_record = no_op_context
1809 self.set_readline_completer = no_op
1820 self.set_readline_completer = no_op
1810 self.set_custom_completer = no_op
1821 self.set_custom_completer = no_op
1811 if self.readline_use:
1822 if self.readline_use:
1812 warn('Readline services not available or not loaded.')
1823 warn('Readline services not available or not loaded.')
1813 else:
1824 else:
1814 self.has_readline = True
1825 self.has_readline = True
1815 self.readline = readline
1826 self.readline = readline
1816 sys.modules['readline'] = readline
1827 sys.modules['readline'] = readline
1817
1828
1818 # Platform-specific configuration
1829 # Platform-specific configuration
1819 if os.name == 'nt':
1830 if os.name == 'nt':
1820 # FIXME - check with Frederick to see if we can harmonize
1831 # FIXME - check with Frederick to see if we can harmonize
1821 # naming conventions with pyreadline to avoid this
1832 # naming conventions with pyreadline to avoid this
1822 # platform-dependent check
1833 # platform-dependent check
1823 self.readline_startup_hook = readline.set_pre_input_hook
1834 self.readline_startup_hook = readline.set_pre_input_hook
1824 else:
1835 else:
1825 self.readline_startup_hook = readline.set_startup_hook
1836 self.readline_startup_hook = readline.set_startup_hook
1826
1837
1827 # Load user's initrc file (readline config)
1838 # Load user's initrc file (readline config)
1828 # Or if libedit is used, load editrc.
1839 # Or if libedit is used, load editrc.
1829 inputrc_name = os.environ.get('INPUTRC')
1840 inputrc_name = os.environ.get('INPUTRC')
1830 if inputrc_name is None:
1841 if inputrc_name is None:
1831 inputrc_name = '.inputrc'
1842 inputrc_name = '.inputrc'
1832 if readline.uses_libedit:
1843 if readline.uses_libedit:
1833 inputrc_name = '.editrc'
1844 inputrc_name = '.editrc'
1834 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1845 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1835 if os.path.isfile(inputrc_name):
1846 if os.path.isfile(inputrc_name):
1836 try:
1847 try:
1837 readline.read_init_file(inputrc_name)
1848 readline.read_init_file(inputrc_name)
1838 except:
1849 except:
1839 warn('Problems reading readline initialization file <%s>'
1850 warn('Problems reading readline initialization file <%s>'
1840 % inputrc_name)
1851 % inputrc_name)
1841
1852
1842 # Configure readline according to user's prefs
1853 # Configure readline according to user's prefs
1843 # This is only done if GNU readline is being used. If libedit
1854 # This is only done if GNU readline is being used. If libedit
1844 # is being used (as on Leopard) the readline config is
1855 # is being used (as on Leopard) the readline config is
1845 # not run as the syntax for libedit is different.
1856 # not run as the syntax for libedit is different.
1846 if not readline.uses_libedit:
1857 if not readline.uses_libedit:
1847 for rlcommand in self.readline_parse_and_bind:
1858 for rlcommand in self.readline_parse_and_bind:
1848 #print "loading rl:",rlcommand # dbg
1859 #print "loading rl:",rlcommand # dbg
1849 readline.parse_and_bind(rlcommand)
1860 readline.parse_and_bind(rlcommand)
1850
1861
1851 # Remove some chars from the delimiters list. If we encounter
1862 # Remove some chars from the delimiters list. If we encounter
1852 # unicode chars, discard them.
1863 # unicode chars, discard them.
1853 delims = readline.get_completer_delims()
1864 delims = readline.get_completer_delims()
1854 if not py3compat.PY3:
1865 if not py3compat.PY3:
1855 delims = delims.encode("ascii", "ignore")
1866 delims = delims.encode("ascii", "ignore")
1856 for d in self.readline_remove_delims:
1867 for d in self.readline_remove_delims:
1857 delims = delims.replace(d, "")
1868 delims = delims.replace(d, "")
1858 delims = delims.replace(ESC_MAGIC, '')
1869 delims = delims.replace(ESC_MAGIC, '')
1859 readline.set_completer_delims(delims)
1870 readline.set_completer_delims(delims)
1860 # Store these so we can restore them if something like rpy2 modifies
1871 # Store these so we can restore them if something like rpy2 modifies
1861 # them.
1872 # them.
1862 self.readline_delims = delims
1873 self.readline_delims = delims
1863 # otherwise we end up with a monster history after a while:
1874 # otherwise we end up with a monster history after a while:
1864 readline.set_history_length(self.history_length)
1875 readline.set_history_length(self.history_length)
1865
1876
1866 self.refill_readline_hist()
1877 self.refill_readline_hist()
1867 self.readline_no_record = ReadlineNoRecord(self)
1878 self.readline_no_record = ReadlineNoRecord(self)
1868
1879
1869 # Configure auto-indent for all platforms
1880 # Configure auto-indent for all platforms
1870 self.set_autoindent(self.autoindent)
1881 self.set_autoindent(self.autoindent)
1871
1882
1872 def refill_readline_hist(self):
1883 def refill_readline_hist(self):
1873 # Load the last 1000 lines from history
1884 # Load the last 1000 lines from history
1874 self.readline.clear_history()
1885 self.readline.clear_history()
1875 stdin_encoding = sys.stdin.encoding or "utf-8"
1886 stdin_encoding = sys.stdin.encoding or "utf-8"
1876 last_cell = u""
1887 last_cell = u""
1877 for _, _, cell in self.history_manager.get_tail(1000,
1888 for _, _, cell in self.history_manager.get_tail(1000,
1878 include_latest=True):
1889 include_latest=True):
1879 # Ignore blank lines and consecutive duplicates
1890 # Ignore blank lines and consecutive duplicates
1880 cell = cell.rstrip()
1891 cell = cell.rstrip()
1881 if cell and (cell != last_cell):
1892 if cell and (cell != last_cell):
1882 try:
1893 try:
1883 if self.multiline_history:
1894 if self.multiline_history:
1884 self.readline.add_history(py3compat.unicode_to_str(cell,
1895 self.readline.add_history(py3compat.unicode_to_str(cell,
1885 stdin_encoding))
1896 stdin_encoding))
1886 else:
1897 else:
1887 for line in cell.splitlines():
1898 for line in cell.splitlines():
1888 self.readline.add_history(py3compat.unicode_to_str(line,
1899 self.readline.add_history(py3compat.unicode_to_str(line,
1889 stdin_encoding))
1900 stdin_encoding))
1890 last_cell = cell
1901 last_cell = cell
1891
1902
1892 except TypeError:
1903 except TypeError:
1893 # The history DB can get corrupted so it returns strings
1904 # The history DB can get corrupted so it returns strings
1894 # containing null bytes, which readline objects to.
1905 # containing null bytes, which readline objects to.
1895 continue
1906 continue
1896
1907
1897 @skip_doctest
1908 @skip_doctest
1898 def set_next_input(self, s):
1909 def set_next_input(self, s):
1899 """ Sets the 'default' input string for the next command line.
1910 """ Sets the 'default' input string for the next command line.
1900
1911
1901 Requires readline.
1912 Requires readline.
1902
1913
1903 Example::
1914 Example::
1904
1915
1905 In [1]: _ip.set_next_input("Hello Word")
1916 In [1]: _ip.set_next_input("Hello Word")
1906 In [2]: Hello Word_ # cursor is here
1917 In [2]: Hello Word_ # cursor is here
1907 """
1918 """
1908 self.rl_next_input = py3compat.cast_bytes_py2(s)
1919 self.rl_next_input = py3compat.cast_bytes_py2(s)
1909
1920
1910 # Maybe move this to the terminal subclass?
1921 # Maybe move this to the terminal subclass?
1911 def pre_readline(self):
1922 def pre_readline(self):
1912 """readline hook to be used at the start of each line.
1923 """readline hook to be used at the start of each line.
1913
1924
1914 Currently it handles auto-indent only."""
1925 Currently it handles auto-indent only."""
1915
1926
1916 if self.rl_do_indent:
1927 if self.rl_do_indent:
1917 self.readline.insert_text(self._indent_current_str())
1928 self.readline.insert_text(self._indent_current_str())
1918 if self.rl_next_input is not None:
1929 if self.rl_next_input is not None:
1919 self.readline.insert_text(self.rl_next_input)
1930 self.readline.insert_text(self.rl_next_input)
1920 self.rl_next_input = None
1931 self.rl_next_input = None
1921
1932
1922 def _indent_current_str(self):
1933 def _indent_current_str(self):
1923 """return the current level of indentation as a string"""
1934 """return the current level of indentation as a string"""
1924 return self.input_splitter.indent_spaces * ' '
1935 return self.input_splitter.indent_spaces * ' '
1925
1936
1926 #-------------------------------------------------------------------------
1937 #-------------------------------------------------------------------------
1927 # Things related to text completion
1938 # Things related to text completion
1928 #-------------------------------------------------------------------------
1939 #-------------------------------------------------------------------------
1929
1940
1930 def init_completer(self):
1941 def init_completer(self):
1931 """Initialize the completion machinery.
1942 """Initialize the completion machinery.
1932
1943
1933 This creates completion machinery that can be used by client code,
1944 This creates completion machinery that can be used by client code,
1934 either interactively in-process (typically triggered by the readline
1945 either interactively in-process (typically triggered by the readline
1935 library), programatically (such as in test suites) or out-of-prcess
1946 library), programatically (such as in test suites) or out-of-prcess
1936 (typically over the network by remote frontends).
1947 (typically over the network by remote frontends).
1937 """
1948 """
1938 from IPython.core.completer import IPCompleter
1949 from IPython.core.completer import IPCompleter
1939 from IPython.core.completerlib import (module_completer,
1950 from IPython.core.completerlib import (module_completer,
1940 magic_run_completer, cd_completer, reset_completer)
1951 magic_run_completer, cd_completer, reset_completer)
1941
1952
1942 self.Completer = IPCompleter(shell=self,
1953 self.Completer = IPCompleter(shell=self,
1943 namespace=self.user_ns,
1954 namespace=self.user_ns,
1944 global_namespace=self.user_global_ns,
1955 global_namespace=self.user_global_ns,
1945 use_readline=self.has_readline,
1956 use_readline=self.has_readline,
1946 parent=self,
1957 parent=self,
1947 )
1958 )
1948 self.configurables.append(self.Completer)
1959 self.configurables.append(self.Completer)
1949
1960
1950 # Add custom completers to the basic ones built into IPCompleter
1961 # Add custom completers to the basic ones built into IPCompleter
1951 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1962 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1952 self.strdispatchers['complete_command'] = sdisp
1963 self.strdispatchers['complete_command'] = sdisp
1953 self.Completer.custom_completers = sdisp
1964 self.Completer.custom_completers = sdisp
1954
1965
1955 self.set_hook('complete_command', module_completer, str_key = 'import')
1966 self.set_hook('complete_command', module_completer, str_key = 'import')
1956 self.set_hook('complete_command', module_completer, str_key = 'from')
1967 self.set_hook('complete_command', module_completer, str_key = 'from')
1957 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1968 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1958 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1969 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1959 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1970 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1960
1971
1961 # Only configure readline if we truly are using readline. IPython can
1972 # Only configure readline if we truly are using readline. IPython can
1962 # do tab-completion over the network, in GUIs, etc, where readline
1973 # do tab-completion over the network, in GUIs, etc, where readline
1963 # itself may be absent
1974 # itself may be absent
1964 if self.has_readline:
1975 if self.has_readline:
1965 self.set_readline_completer()
1976 self.set_readline_completer()
1966
1977
1967 def complete(self, text, line=None, cursor_pos=None):
1978 def complete(self, text, line=None, cursor_pos=None):
1968 """Return the completed text and a list of completions.
1979 """Return the completed text and a list of completions.
1969
1980
1970 Parameters
1981 Parameters
1971 ----------
1982 ----------
1972
1983
1973 text : string
1984 text : string
1974 A string of text to be completed on. It can be given as empty and
1985 A string of text to be completed on. It can be given as empty and
1975 instead a line/position pair are given. In this case, the
1986 instead a line/position pair are given. In this case, the
1976 completer itself will split the line like readline does.
1987 completer itself will split the line like readline does.
1977
1988
1978 line : string, optional
1989 line : string, optional
1979 The complete line that text is part of.
1990 The complete line that text is part of.
1980
1991
1981 cursor_pos : int, optional
1992 cursor_pos : int, optional
1982 The position of the cursor on the input line.
1993 The position of the cursor on the input line.
1983
1994
1984 Returns
1995 Returns
1985 -------
1996 -------
1986 text : string
1997 text : string
1987 The actual text that was completed.
1998 The actual text that was completed.
1988
1999
1989 matches : list
2000 matches : list
1990 A sorted list with all possible completions.
2001 A sorted list with all possible completions.
1991
2002
1992 The optional arguments allow the completion to take more context into
2003 The optional arguments allow the completion to take more context into
1993 account, and are part of the low-level completion API.
2004 account, and are part of the low-level completion API.
1994
2005
1995 This is a wrapper around the completion mechanism, similar to what
2006 This is a wrapper around the completion mechanism, similar to what
1996 readline does at the command line when the TAB key is hit. By
2007 readline does at the command line when the TAB key is hit. By
1997 exposing it as a method, it can be used by other non-readline
2008 exposing it as a method, it can be used by other non-readline
1998 environments (such as GUIs) for text completion.
2009 environments (such as GUIs) for text completion.
1999
2010
2000 Simple usage example:
2011 Simple usage example:
2001
2012
2002 In [1]: x = 'hello'
2013 In [1]: x = 'hello'
2003
2014
2004 In [2]: _ip.complete('x.l')
2015 In [2]: _ip.complete('x.l')
2005 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2016 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2006 """
2017 """
2007
2018
2008 # Inject names into __builtin__ so we can complete on the added names.
2019 # Inject names into __builtin__ so we can complete on the added names.
2009 with self.builtin_trap:
2020 with self.builtin_trap:
2010 return self.Completer.complete(text, line, cursor_pos)
2021 return self.Completer.complete(text, line, cursor_pos)
2011
2022
2012 def set_custom_completer(self, completer, pos=0):
2023 def set_custom_completer(self, completer, pos=0):
2013 """Adds a new custom completer function.
2024 """Adds a new custom completer function.
2014
2025
2015 The position argument (defaults to 0) is the index in the completers
2026 The position argument (defaults to 0) is the index in the completers
2016 list where you want the completer to be inserted."""
2027 list where you want the completer to be inserted."""
2017
2028
2018 newcomp = types.MethodType(completer,self.Completer)
2029 newcomp = types.MethodType(completer,self.Completer)
2019 self.Completer.matchers.insert(pos,newcomp)
2030 self.Completer.matchers.insert(pos,newcomp)
2020
2031
2021 def set_readline_completer(self):
2032 def set_readline_completer(self):
2022 """Reset readline's completer to be our own."""
2033 """Reset readline's completer to be our own."""
2023 self.readline.set_completer(self.Completer.rlcomplete)
2034 self.readline.set_completer(self.Completer.rlcomplete)
2024
2035
2025 def set_completer_frame(self, frame=None):
2036 def set_completer_frame(self, frame=None):
2026 """Set the frame of the completer."""
2037 """Set the frame of the completer."""
2027 if frame:
2038 if frame:
2028 self.Completer.namespace = frame.f_locals
2039 self.Completer.namespace = frame.f_locals
2029 self.Completer.global_namespace = frame.f_globals
2040 self.Completer.global_namespace = frame.f_globals
2030 else:
2041 else:
2031 self.Completer.namespace = self.user_ns
2042 self.Completer.namespace = self.user_ns
2032 self.Completer.global_namespace = self.user_global_ns
2043 self.Completer.global_namespace = self.user_global_ns
2033
2044
2034 #-------------------------------------------------------------------------
2045 #-------------------------------------------------------------------------
2035 # Things related to magics
2046 # Things related to magics
2036 #-------------------------------------------------------------------------
2047 #-------------------------------------------------------------------------
2037
2048
2038 def init_magics(self):
2049 def init_magics(self):
2039 from IPython.core import magics as m
2050 from IPython.core import magics as m
2040 self.magics_manager = magic.MagicsManager(shell=self,
2051 self.magics_manager = magic.MagicsManager(shell=self,
2041 parent=self,
2052 parent=self,
2042 user_magics=m.UserMagics(self))
2053 user_magics=m.UserMagics(self))
2043 self.configurables.append(self.magics_manager)
2054 self.configurables.append(self.magics_manager)
2044
2055
2045 # Expose as public API from the magics manager
2056 # Expose as public API from the magics manager
2046 self.register_magics = self.magics_manager.register
2057 self.register_magics = self.magics_manager.register
2047 self.define_magic = self.magics_manager.define_magic
2058 self.define_magic = self.magics_manager.define_magic
2048
2059
2049 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2060 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2050 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2061 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2051 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2062 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2052 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2063 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2053 )
2064 )
2054
2065
2055 # Register Magic Aliases
2066 # Register Magic Aliases
2056 mman = self.magics_manager
2067 mman = self.magics_manager
2057 # FIXME: magic aliases should be defined by the Magics classes
2068 # FIXME: magic aliases should be defined by the Magics classes
2058 # or in MagicsManager, not here
2069 # or in MagicsManager, not here
2059 mman.register_alias('ed', 'edit')
2070 mman.register_alias('ed', 'edit')
2060 mman.register_alias('hist', 'history')
2071 mman.register_alias('hist', 'history')
2061 mman.register_alias('rep', 'recall')
2072 mman.register_alias('rep', 'recall')
2062 mman.register_alias('SVG', 'svg', 'cell')
2073 mman.register_alias('SVG', 'svg', 'cell')
2063 mman.register_alias('HTML', 'html', 'cell')
2074 mman.register_alias('HTML', 'html', 'cell')
2064 mman.register_alias('file', 'writefile', 'cell')
2075 mman.register_alias('file', 'writefile', 'cell')
2065
2076
2066 # FIXME: Move the color initialization to the DisplayHook, which
2077 # FIXME: Move the color initialization to the DisplayHook, which
2067 # should be split into a prompt manager and displayhook. We probably
2078 # should be split into a prompt manager and displayhook. We probably
2068 # even need a centralize colors management object.
2079 # even need a centralize colors management object.
2069 self.magic('colors %s' % self.colors)
2080 self.magic('colors %s' % self.colors)
2070
2081
2071 # Defined here so that it's included in the documentation
2082 # Defined here so that it's included in the documentation
2072 @functools.wraps(magic.MagicsManager.register_function)
2083 @functools.wraps(magic.MagicsManager.register_function)
2073 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2084 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2074 self.magics_manager.register_function(func,
2085 self.magics_manager.register_function(func,
2075 magic_kind=magic_kind, magic_name=magic_name)
2086 magic_kind=magic_kind, magic_name=magic_name)
2076
2087
2077 def run_line_magic(self, magic_name, line):
2088 def run_line_magic(self, magic_name, line):
2078 """Execute the given line magic.
2089 """Execute the given line magic.
2079
2090
2080 Parameters
2091 Parameters
2081 ----------
2092 ----------
2082 magic_name : str
2093 magic_name : str
2083 Name of the desired magic function, without '%' prefix.
2094 Name of the desired magic function, without '%' prefix.
2084
2095
2085 line : str
2096 line : str
2086 The rest of the input line as a single string.
2097 The rest of the input line as a single string.
2087 """
2098 """
2088 fn = self.find_line_magic(magic_name)
2099 fn = self.find_line_magic(magic_name)
2089 if fn is None:
2100 if fn is None:
2090 cm = self.find_cell_magic(magic_name)
2101 cm = self.find_cell_magic(magic_name)
2091 etpl = "Line magic function `%%%s` not found%s."
2102 etpl = "Line magic function `%%%s` not found%s."
2092 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2103 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2093 'did you mean that instead?)' % magic_name )
2104 'did you mean that instead?)' % magic_name )
2094 error(etpl % (magic_name, extra))
2105 error(etpl % (magic_name, extra))
2095 else:
2106 else:
2096 # Note: this is the distance in the stack to the user's frame.
2107 # Note: this is the distance in the stack to the user's frame.
2097 # This will need to be updated if the internal calling logic gets
2108 # This will need to be updated if the internal calling logic gets
2098 # refactored, or else we'll be expanding the wrong variables.
2109 # refactored, or else we'll be expanding the wrong variables.
2099 stack_depth = 2
2110 stack_depth = 2
2100 magic_arg_s = self.var_expand(line, stack_depth)
2111 magic_arg_s = self.var_expand(line, stack_depth)
2101 # Put magic args in a list so we can call with f(*a) syntax
2112 # Put magic args in a list so we can call with f(*a) syntax
2102 args = [magic_arg_s]
2113 args = [magic_arg_s]
2103 kwargs = {}
2114 kwargs = {}
2104 # Grab local namespace if we need it:
2115 # Grab local namespace if we need it:
2105 if getattr(fn, "needs_local_scope", False):
2116 if getattr(fn, "needs_local_scope", False):
2106 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2117 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2107 with self.builtin_trap:
2118 with self.builtin_trap:
2108 result = fn(*args,**kwargs)
2119 result = fn(*args,**kwargs)
2109 return result
2120 return result
2110
2121
2111 def run_cell_magic(self, magic_name, line, cell):
2122 def run_cell_magic(self, magic_name, line, cell):
2112 """Execute the given cell magic.
2123 """Execute the given cell magic.
2113
2124
2114 Parameters
2125 Parameters
2115 ----------
2126 ----------
2116 magic_name : str
2127 magic_name : str
2117 Name of the desired magic function, without '%' prefix.
2128 Name of the desired magic function, without '%' prefix.
2118
2129
2119 line : str
2130 line : str
2120 The rest of the first input line as a single string.
2131 The rest of the first input line as a single string.
2121
2132
2122 cell : str
2133 cell : str
2123 The body of the cell as a (possibly multiline) string.
2134 The body of the cell as a (possibly multiline) string.
2124 """
2135 """
2125 fn = self.find_cell_magic(magic_name)
2136 fn = self.find_cell_magic(magic_name)
2126 if fn is None:
2137 if fn is None:
2127 lm = self.find_line_magic(magic_name)
2138 lm = self.find_line_magic(magic_name)
2128 etpl = "Cell magic `%%{0}` not found{1}."
2139 etpl = "Cell magic `%%{0}` not found{1}."
2129 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2140 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2130 'did you mean that instead?)'.format(magic_name))
2141 'did you mean that instead?)'.format(magic_name))
2131 error(etpl.format(magic_name, extra))
2142 error(etpl.format(magic_name, extra))
2132 elif cell == '':
2143 elif cell == '':
2133 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2144 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2134 if self.find_line_magic(magic_name) is not None:
2145 if self.find_line_magic(magic_name) is not None:
2135 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2146 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2136 raise UsageError(message)
2147 raise UsageError(message)
2137 else:
2148 else:
2138 # Note: this is the distance in the stack to the user's frame.
2149 # Note: this is the distance in the stack to the user's frame.
2139 # This will need to be updated if the internal calling logic gets
2150 # This will need to be updated if the internal calling logic gets
2140 # refactored, or else we'll be expanding the wrong variables.
2151 # refactored, or else we'll be expanding the wrong variables.
2141 stack_depth = 2
2152 stack_depth = 2
2142 magic_arg_s = self.var_expand(line, stack_depth)
2153 magic_arg_s = self.var_expand(line, stack_depth)
2143 with self.builtin_trap:
2154 with self.builtin_trap:
2144 result = fn(magic_arg_s, cell)
2155 result = fn(magic_arg_s, cell)
2145 return result
2156 return result
2146
2157
2147 def find_line_magic(self, magic_name):
2158 def find_line_magic(self, magic_name):
2148 """Find and return a line magic by name.
2159 """Find and return a line magic by name.
2149
2160
2150 Returns None if the magic isn't found."""
2161 Returns None if the magic isn't found."""
2151 return self.magics_manager.magics['line'].get(magic_name)
2162 return self.magics_manager.magics['line'].get(magic_name)
2152
2163
2153 def find_cell_magic(self, magic_name):
2164 def find_cell_magic(self, magic_name):
2154 """Find and return a cell magic by name.
2165 """Find and return a cell magic by name.
2155
2166
2156 Returns None if the magic isn't found."""
2167 Returns None if the magic isn't found."""
2157 return self.magics_manager.magics['cell'].get(magic_name)
2168 return self.magics_manager.magics['cell'].get(magic_name)
2158
2169
2159 def find_magic(self, magic_name, magic_kind='line'):
2170 def find_magic(self, magic_name, magic_kind='line'):
2160 """Find and return a magic of the given type by name.
2171 """Find and return a magic of the given type by name.
2161
2172
2162 Returns None if the magic isn't found."""
2173 Returns None if the magic isn't found."""
2163 return self.magics_manager.magics[magic_kind].get(magic_name)
2174 return self.magics_manager.magics[magic_kind].get(magic_name)
2164
2175
2165 def magic(self, arg_s):
2176 def magic(self, arg_s):
2166 """DEPRECATED. Use run_line_magic() instead.
2177 """DEPRECATED. Use run_line_magic() instead.
2167
2178
2168 Call a magic function by name.
2179 Call a magic function by name.
2169
2180
2170 Input: a string containing the name of the magic function to call and
2181 Input: a string containing the name of the magic function to call and
2171 any additional arguments to be passed to the magic.
2182 any additional arguments to be passed to the magic.
2172
2183
2173 magic('name -opt foo bar') is equivalent to typing at the ipython
2184 magic('name -opt foo bar') is equivalent to typing at the ipython
2174 prompt:
2185 prompt:
2175
2186
2176 In[1]: %name -opt foo bar
2187 In[1]: %name -opt foo bar
2177
2188
2178 To call a magic without arguments, simply use magic('name').
2189 To call a magic without arguments, simply use magic('name').
2179
2190
2180 This provides a proper Python function to call IPython's magics in any
2191 This provides a proper Python function to call IPython's magics in any
2181 valid Python code you can type at the interpreter, including loops and
2192 valid Python code you can type at the interpreter, including loops and
2182 compound statements.
2193 compound statements.
2183 """
2194 """
2184 # TODO: should we issue a loud deprecation warning here?
2195 # TODO: should we issue a loud deprecation warning here?
2185 magic_name, _, magic_arg_s = arg_s.partition(' ')
2196 magic_name, _, magic_arg_s = arg_s.partition(' ')
2186 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2197 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2187 return self.run_line_magic(magic_name, magic_arg_s)
2198 return self.run_line_magic(magic_name, magic_arg_s)
2188
2199
2189 #-------------------------------------------------------------------------
2200 #-------------------------------------------------------------------------
2190 # Things related to macros
2201 # Things related to macros
2191 #-------------------------------------------------------------------------
2202 #-------------------------------------------------------------------------
2192
2203
2193 def define_macro(self, name, themacro):
2204 def define_macro(self, name, themacro):
2194 """Define a new macro
2205 """Define a new macro
2195
2206
2196 Parameters
2207 Parameters
2197 ----------
2208 ----------
2198 name : str
2209 name : str
2199 The name of the macro.
2210 The name of the macro.
2200 themacro : str or Macro
2211 themacro : str or Macro
2201 The action to do upon invoking the macro. If a string, a new
2212 The action to do upon invoking the macro. If a string, a new
2202 Macro object is created by passing the string to it.
2213 Macro object is created by passing the string to it.
2203 """
2214 """
2204
2215
2205 from IPython.core import macro
2216 from IPython.core import macro
2206
2217
2207 if isinstance(themacro, string_types):
2218 if isinstance(themacro, string_types):
2208 themacro = macro.Macro(themacro)
2219 themacro = macro.Macro(themacro)
2209 if not isinstance(themacro, macro.Macro):
2220 if not isinstance(themacro, macro.Macro):
2210 raise ValueError('A macro must be a string or a Macro instance.')
2221 raise ValueError('A macro must be a string or a Macro instance.')
2211 self.user_ns[name] = themacro
2222 self.user_ns[name] = themacro
2212
2223
2213 #-------------------------------------------------------------------------
2224 #-------------------------------------------------------------------------
2214 # Things related to the running of system commands
2225 # Things related to the running of system commands
2215 #-------------------------------------------------------------------------
2226 #-------------------------------------------------------------------------
2216
2227
2217 def system_piped(self, cmd):
2228 def system_piped(self, cmd):
2218 """Call the given cmd in a subprocess, piping stdout/err
2229 """Call the given cmd in a subprocess, piping stdout/err
2219
2230
2220 Parameters
2231 Parameters
2221 ----------
2232 ----------
2222 cmd : str
2233 cmd : str
2223 Command to execute (can not end in '&', as background processes are
2234 Command to execute (can not end in '&', as background processes are
2224 not supported. Should not be a command that expects input
2235 not supported. Should not be a command that expects input
2225 other than simple text.
2236 other than simple text.
2226 """
2237 """
2227 if cmd.rstrip().endswith('&'):
2238 if cmd.rstrip().endswith('&'):
2228 # this is *far* from a rigorous test
2239 # this is *far* from a rigorous test
2229 # We do not support backgrounding processes because we either use
2240 # We do not support backgrounding processes because we either use
2230 # pexpect or pipes to read from. Users can always just call
2241 # pexpect or pipes to read from. Users can always just call
2231 # os.system() or use ip.system=ip.system_raw
2242 # os.system() or use ip.system=ip.system_raw
2232 # if they really want a background process.
2243 # if they really want a background process.
2233 raise OSError("Background processes not supported.")
2244 raise OSError("Background processes not supported.")
2234
2245
2235 # we explicitly do NOT return the subprocess status code, because
2246 # we explicitly do NOT return the subprocess status code, because
2236 # a non-None value would trigger :func:`sys.displayhook` calls.
2247 # a non-None value would trigger :func:`sys.displayhook` calls.
2237 # Instead, we store the exit_code in user_ns.
2248 # Instead, we store the exit_code in user_ns.
2238 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2249 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2239
2250
2240 def system_raw(self, cmd):
2251 def system_raw(self, cmd):
2241 """Call the given cmd in a subprocess using os.system on Windows or
2252 """Call the given cmd in a subprocess using os.system on Windows or
2242 subprocess.call using the system shell on other platforms.
2253 subprocess.call using the system shell on other platforms.
2243
2254
2244 Parameters
2255 Parameters
2245 ----------
2256 ----------
2246 cmd : str
2257 cmd : str
2247 Command to execute.
2258 Command to execute.
2248 """
2259 """
2249 cmd = self.var_expand(cmd, depth=1)
2260 cmd = self.var_expand(cmd, depth=1)
2250 # protect os.system from UNC paths on Windows, which it can't handle:
2261 # protect os.system from UNC paths on Windows, which it can't handle:
2251 if sys.platform == 'win32':
2262 if sys.platform == 'win32':
2252 from IPython.utils._process_win32 import AvoidUNCPath
2263 from IPython.utils._process_win32 import AvoidUNCPath
2253 with AvoidUNCPath() as path:
2264 with AvoidUNCPath() as path:
2254 if path is not None:
2265 if path is not None:
2255 cmd = '"pushd %s &&"%s' % (path, cmd)
2266 cmd = '"pushd %s &&"%s' % (path, cmd)
2256 cmd = py3compat.unicode_to_str(cmd)
2267 cmd = py3compat.unicode_to_str(cmd)
2257 ec = os.system(cmd)
2268 ec = os.system(cmd)
2258 else:
2269 else:
2259 cmd = py3compat.unicode_to_str(cmd)
2270 cmd = py3compat.unicode_to_str(cmd)
2260 # Call the cmd using the OS shell, instead of the default /bin/sh, if set.
2271 # Call the cmd using the OS shell, instead of the default /bin/sh, if set.
2261 ec = subprocess.call(cmd, shell=True, executable=os.environ.get('SHELL', None))
2272 ec = subprocess.call(cmd, shell=True, executable=os.environ.get('SHELL', None))
2262 # exit code is positive for program failure, or negative for
2273 # exit code is positive for program failure, or negative for
2263 # terminating signal number.
2274 # terminating signal number.
2264
2275
2265 # We explicitly do NOT return the subprocess status code, because
2276 # We explicitly do NOT return the subprocess status code, because
2266 # a non-None value would trigger :func:`sys.displayhook` calls.
2277 # a non-None value would trigger :func:`sys.displayhook` calls.
2267 # Instead, we store the exit_code in user_ns.
2278 # Instead, we store the exit_code in user_ns.
2268 self.user_ns['_exit_code'] = ec
2279 self.user_ns['_exit_code'] = ec
2269
2280
2270 # use piped system by default, because it is better behaved
2281 # use piped system by default, because it is better behaved
2271 system = system_piped
2282 system = system_piped
2272
2283
2273 def getoutput(self, cmd, split=True, depth=0):
2284 def getoutput(self, cmd, split=True, depth=0):
2274 """Get output (possibly including stderr) from a subprocess.
2285 """Get output (possibly including stderr) from a subprocess.
2275
2286
2276 Parameters
2287 Parameters
2277 ----------
2288 ----------
2278 cmd : str
2289 cmd : str
2279 Command to execute (can not end in '&', as background processes are
2290 Command to execute (can not end in '&', as background processes are
2280 not supported.
2291 not supported.
2281 split : bool, optional
2292 split : bool, optional
2282 If True, split the output into an IPython SList. Otherwise, an
2293 If True, split the output into an IPython SList. Otherwise, an
2283 IPython LSString is returned. These are objects similar to normal
2294 IPython LSString is returned. These are objects similar to normal
2284 lists and strings, with a few convenience attributes for easier
2295 lists and strings, with a few convenience attributes for easier
2285 manipulation of line-based output. You can use '?' on them for
2296 manipulation of line-based output. You can use '?' on them for
2286 details.
2297 details.
2287 depth : int, optional
2298 depth : int, optional
2288 How many frames above the caller are the local variables which should
2299 How many frames above the caller are the local variables which should
2289 be expanded in the command string? The default (0) assumes that the
2300 be expanded in the command string? The default (0) assumes that the
2290 expansion variables are in the stack frame calling this function.
2301 expansion variables are in the stack frame calling this function.
2291 """
2302 """
2292 if cmd.rstrip().endswith('&'):
2303 if cmd.rstrip().endswith('&'):
2293 # this is *far* from a rigorous test
2304 # this is *far* from a rigorous test
2294 raise OSError("Background processes not supported.")
2305 raise OSError("Background processes not supported.")
2295 out = getoutput(self.var_expand(cmd, depth=depth+1))
2306 out = getoutput(self.var_expand(cmd, depth=depth+1))
2296 if split:
2307 if split:
2297 out = SList(out.splitlines())
2308 out = SList(out.splitlines())
2298 else:
2309 else:
2299 out = LSString(out)
2310 out = LSString(out)
2300 return out
2311 return out
2301
2312
2302 #-------------------------------------------------------------------------
2313 #-------------------------------------------------------------------------
2303 # Things related to aliases
2314 # Things related to aliases
2304 #-------------------------------------------------------------------------
2315 #-------------------------------------------------------------------------
2305
2316
2306 def init_alias(self):
2317 def init_alias(self):
2307 self.alias_manager = AliasManager(shell=self, parent=self)
2318 self.alias_manager = AliasManager(shell=self, parent=self)
2308 self.configurables.append(self.alias_manager)
2319 self.configurables.append(self.alias_manager)
2309
2320
2310 #-------------------------------------------------------------------------
2321 #-------------------------------------------------------------------------
2311 # Things related to extensions
2322 # Things related to extensions
2312 #-------------------------------------------------------------------------
2323 #-------------------------------------------------------------------------
2313
2324
2314 def init_extension_manager(self):
2325 def init_extension_manager(self):
2315 self.extension_manager = ExtensionManager(shell=self, parent=self)
2326 self.extension_manager = ExtensionManager(shell=self, parent=self)
2316 self.configurables.append(self.extension_manager)
2327 self.configurables.append(self.extension_manager)
2317
2328
2318 #-------------------------------------------------------------------------
2329 #-------------------------------------------------------------------------
2319 # Things related to payloads
2330 # Things related to payloads
2320 #-------------------------------------------------------------------------
2331 #-------------------------------------------------------------------------
2321
2332
2322 def init_payload(self):
2333 def init_payload(self):
2323 self.payload_manager = PayloadManager(parent=self)
2334 self.payload_manager = PayloadManager(parent=self)
2324 self.configurables.append(self.payload_manager)
2335 self.configurables.append(self.payload_manager)
2325
2336
2326 #-------------------------------------------------------------------------
2337 #-------------------------------------------------------------------------
2327 # Things related to widgets
2338 # Things related to widgets
2328 #-------------------------------------------------------------------------
2339 #-------------------------------------------------------------------------
2329
2340
2330 def init_comms(self):
2341 def init_comms(self):
2331 # not implemented in the base class
2342 # not implemented in the base class
2332 pass
2343 pass
2333
2344
2334 #-------------------------------------------------------------------------
2345 #-------------------------------------------------------------------------
2335 # Things related to the prefilter
2346 # Things related to the prefilter
2336 #-------------------------------------------------------------------------
2347 #-------------------------------------------------------------------------
2337
2348
2338 def init_prefilter(self):
2349 def init_prefilter(self):
2339 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2350 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2340 self.configurables.append(self.prefilter_manager)
2351 self.configurables.append(self.prefilter_manager)
2341 # Ultimately this will be refactored in the new interpreter code, but
2352 # Ultimately this will be refactored in the new interpreter code, but
2342 # for now, we should expose the main prefilter method (there's legacy
2353 # for now, we should expose the main prefilter method (there's legacy
2343 # code out there that may rely on this).
2354 # code out there that may rely on this).
2344 self.prefilter = self.prefilter_manager.prefilter_lines
2355 self.prefilter = self.prefilter_manager.prefilter_lines
2345
2356
2346 def auto_rewrite_input(self, cmd):
2357 def auto_rewrite_input(self, cmd):
2347 """Print to the screen the rewritten form of the user's command.
2358 """Print to the screen the rewritten form of the user's command.
2348
2359
2349 This shows visual feedback by rewriting input lines that cause
2360 This shows visual feedback by rewriting input lines that cause
2350 automatic calling to kick in, like::
2361 automatic calling to kick in, like::
2351
2362
2352 /f x
2363 /f x
2353
2364
2354 into::
2365 into::
2355
2366
2356 ------> f(x)
2367 ------> f(x)
2357
2368
2358 after the user's input prompt. This helps the user understand that the
2369 after the user's input prompt. This helps the user understand that the
2359 input line was transformed automatically by IPython.
2370 input line was transformed automatically by IPython.
2360 """
2371 """
2361 if not self.show_rewritten_input:
2372 if not self.show_rewritten_input:
2362 return
2373 return
2363
2374
2364 rw = self.prompt_manager.render('rewrite') + cmd
2375 rw = self.prompt_manager.render('rewrite') + cmd
2365
2376
2366 try:
2377 try:
2367 # plain ascii works better w/ pyreadline, on some machines, so
2378 # plain ascii works better w/ pyreadline, on some machines, so
2368 # we use it and only print uncolored rewrite if we have unicode
2379 # we use it and only print uncolored rewrite if we have unicode
2369 rw = str(rw)
2380 rw = str(rw)
2370 print(rw, file=io.stdout)
2381 print(rw, file=io.stdout)
2371 except UnicodeEncodeError:
2382 except UnicodeEncodeError:
2372 print("------> " + cmd)
2383 print("------> " + cmd)
2373
2384
2374 #-------------------------------------------------------------------------
2385 #-------------------------------------------------------------------------
2375 # Things related to extracting values/expressions from kernel and user_ns
2386 # Things related to extracting values/expressions from kernel and user_ns
2376 #-------------------------------------------------------------------------
2387 #-------------------------------------------------------------------------
2377
2388
2378 def _user_obj_error(self):
2389 def _user_obj_error(self):
2379 """return simple exception dict
2390 """return simple exception dict
2380
2391
2381 for use in user_variables / expressions
2392 for use in user_variables / expressions
2382 """
2393 """
2383
2394
2384 etype, evalue, tb = self._get_exc_info()
2395 etype, evalue, tb = self._get_exc_info()
2385 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2396 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2386
2397
2387 exc_info = {
2398 exc_info = {
2388 u'status' : 'error',
2399 u'status' : 'error',
2389 u'traceback' : stb,
2400 u'traceback' : stb,
2390 u'ename' : unicode_type(etype.__name__),
2401 u'ename' : unicode_type(etype.__name__),
2391 u'evalue' : py3compat.safe_unicode(evalue),
2402 u'evalue' : py3compat.safe_unicode(evalue),
2392 }
2403 }
2393
2404
2394 return exc_info
2405 return exc_info
2395
2406
2396 def _format_user_obj(self, obj):
2407 def _format_user_obj(self, obj):
2397 """format a user object to display dict
2408 """format a user object to display dict
2398
2409
2399 for use in user_expressions / variables
2410 for use in user_expressions / variables
2400 """
2411 """
2401
2412
2402 data, md = self.display_formatter.format(obj)
2413 data, md = self.display_formatter.format(obj)
2403 value = {
2414 value = {
2404 'status' : 'ok',
2415 'status' : 'ok',
2405 'data' : data,
2416 'data' : data,
2406 'metadata' : md,
2417 'metadata' : md,
2407 }
2418 }
2408 return value
2419 return value
2409
2420
2410 def user_variables(self, names):
2421 def user_variables(self, names):
2411 """Get a list of variable names from the user's namespace.
2422 """Get a list of variable names from the user's namespace.
2412
2423
2413 Parameters
2424 Parameters
2414 ----------
2425 ----------
2415 names : list of strings
2426 names : list of strings
2416 A list of names of variables to be read from the user namespace.
2427 A list of names of variables to be read from the user namespace.
2417
2428
2418 Returns
2429 Returns
2419 -------
2430 -------
2420 A dict, keyed by the input names and with the rich mime-type repr(s) of each value.
2431 A dict, keyed by the input names and with the rich mime-type repr(s) of each value.
2421 Each element will be a sub-dict of the same form as a display_data message.
2432 Each element will be a sub-dict of the same form as a display_data message.
2422 """
2433 """
2423 out = {}
2434 out = {}
2424 user_ns = self.user_ns
2435 user_ns = self.user_ns
2425
2436
2426 for varname in names:
2437 for varname in names:
2427 try:
2438 try:
2428 value = self._format_user_obj(user_ns[varname])
2439 value = self._format_user_obj(user_ns[varname])
2429 except:
2440 except:
2430 value = self._user_obj_error()
2441 value = self._user_obj_error()
2431 out[varname] = value
2442 out[varname] = value
2432 return out
2443 return out
2433
2444
2434 def user_expressions(self, expressions):
2445 def user_expressions(self, expressions):
2435 """Evaluate a dict of expressions in the user's namespace.
2446 """Evaluate a dict of expressions in the user's namespace.
2436
2447
2437 Parameters
2448 Parameters
2438 ----------
2449 ----------
2439 expressions : dict
2450 expressions : dict
2440 A dict with string keys and string values. The expression values
2451 A dict with string keys and string values. The expression values
2441 should be valid Python expressions, each of which will be evaluated
2452 should be valid Python expressions, each of which will be evaluated
2442 in the user namespace.
2453 in the user namespace.
2443
2454
2444 Returns
2455 Returns
2445 -------
2456 -------
2446 A dict, keyed like the input expressions dict, with the rich mime-typed
2457 A dict, keyed like the input expressions dict, with the rich mime-typed
2447 display_data of each value.
2458 display_data of each value.
2448 """
2459 """
2449 out = {}
2460 out = {}
2450 user_ns = self.user_ns
2461 user_ns = self.user_ns
2451 global_ns = self.user_global_ns
2462 global_ns = self.user_global_ns
2452
2463
2453 for key, expr in iteritems(expressions):
2464 for key, expr in iteritems(expressions):
2454 try:
2465 try:
2455 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2466 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2456 except:
2467 except:
2457 value = self._user_obj_error()
2468 value = self._user_obj_error()
2458 out[key] = value
2469 out[key] = value
2459 return out
2470 return out
2460
2471
2461 #-------------------------------------------------------------------------
2472 #-------------------------------------------------------------------------
2462 # Things related to the running of code
2473 # Things related to the running of code
2463 #-------------------------------------------------------------------------
2474 #-------------------------------------------------------------------------
2464
2475
2465 def ex(self, cmd):
2476 def ex(self, cmd):
2466 """Execute a normal python statement in user namespace."""
2477 """Execute a normal python statement in user namespace."""
2467 with self.builtin_trap:
2478 with self.builtin_trap:
2468 exec(cmd, self.user_global_ns, self.user_ns)
2479 exec(cmd, self.user_global_ns, self.user_ns)
2469
2480
2470 def ev(self, expr):
2481 def ev(self, expr):
2471 """Evaluate python expression expr in user namespace.
2482 """Evaluate python expression expr in user namespace.
2472
2483
2473 Returns the result of evaluation
2484 Returns the result of evaluation
2474 """
2485 """
2475 with self.builtin_trap:
2486 with self.builtin_trap:
2476 return eval(expr, self.user_global_ns, self.user_ns)
2487 return eval(expr, self.user_global_ns, self.user_ns)
2477
2488
2478 def safe_execfile(self, fname, *where, **kw):
2489 def safe_execfile(self, fname, *where, **kw):
2479 """A safe version of the builtin execfile().
2490 """A safe version of the builtin execfile().
2480
2491
2481 This version will never throw an exception, but instead print
2492 This version will never throw an exception, but instead print
2482 helpful error messages to the screen. This only works on pure
2493 helpful error messages to the screen. This only works on pure
2483 Python files with the .py extension.
2494 Python files with the .py extension.
2484
2495
2485 Parameters
2496 Parameters
2486 ----------
2497 ----------
2487 fname : string
2498 fname : string
2488 The name of the file to be executed.
2499 The name of the file to be executed.
2489 where : tuple
2500 where : tuple
2490 One or two namespaces, passed to execfile() as (globals,locals).
2501 One or two namespaces, passed to execfile() as (globals,locals).
2491 If only one is given, it is passed as both.
2502 If only one is given, it is passed as both.
2492 exit_ignore : bool (False)
2503 exit_ignore : bool (False)
2493 If True, then silence SystemExit for non-zero status (it is always
2504 If True, then silence SystemExit for non-zero status (it is always
2494 silenced for zero status, as it is so common).
2505 silenced for zero status, as it is so common).
2495 raise_exceptions : bool (False)
2506 raise_exceptions : bool (False)
2496 If True raise exceptions everywhere. Meant for testing.
2507 If True raise exceptions everywhere. Meant for testing.
2497
2508
2498 """
2509 """
2499 kw.setdefault('exit_ignore', False)
2510 kw.setdefault('exit_ignore', False)
2500 kw.setdefault('raise_exceptions', False)
2511 kw.setdefault('raise_exceptions', False)
2501
2512
2502 fname = os.path.abspath(os.path.expanduser(fname))
2513 fname = os.path.abspath(os.path.expanduser(fname))
2503
2514
2504 # Make sure we can open the file
2515 # Make sure we can open the file
2505 try:
2516 try:
2506 with open(fname) as thefile:
2517 with open(fname) as thefile:
2507 pass
2518 pass
2508 except:
2519 except:
2509 warn('Could not open file <%s> for safe execution.' % fname)
2520 warn('Could not open file <%s> for safe execution.' % fname)
2510 return
2521 return
2511
2522
2512 # Find things also in current directory. This is needed to mimic the
2523 # Find things also in current directory. This is needed to mimic the
2513 # behavior of running a script from the system command line, where
2524 # behavior of running a script from the system command line, where
2514 # Python inserts the script's directory into sys.path
2525 # Python inserts the script's directory into sys.path
2515 dname = os.path.dirname(fname)
2526 dname = os.path.dirname(fname)
2516
2527
2517 with prepended_to_syspath(dname):
2528 with prepended_to_syspath(dname):
2518 try:
2529 try:
2519 py3compat.execfile(fname,*where)
2530 py3compat.execfile(fname,*where)
2520 except SystemExit as status:
2531 except SystemExit as status:
2521 # If the call was made with 0 or None exit status (sys.exit(0)
2532 # If the call was made with 0 or None exit status (sys.exit(0)
2522 # or sys.exit() ), don't bother showing a traceback, as both of
2533 # or sys.exit() ), don't bother showing a traceback, as both of
2523 # these are considered normal by the OS:
2534 # these are considered normal by the OS:
2524 # > python -c'import sys;sys.exit(0)'; echo $?
2535 # > python -c'import sys;sys.exit(0)'; echo $?
2525 # 0
2536 # 0
2526 # > python -c'import sys;sys.exit()'; echo $?
2537 # > python -c'import sys;sys.exit()'; echo $?
2527 # 0
2538 # 0
2528 # For other exit status, we show the exception unless
2539 # For other exit status, we show the exception unless
2529 # explicitly silenced, but only in short form.
2540 # explicitly silenced, but only in short form.
2530 if kw['raise_exceptions']:
2541 if kw['raise_exceptions']:
2531 raise
2542 raise
2532 if status.code and not kw['exit_ignore']:
2543 if status.code and not kw['exit_ignore']:
2533 self.showtraceback(exception_only=True)
2544 self.showtraceback(exception_only=True)
2534 except:
2545 except:
2535 if kw['raise_exceptions']:
2546 if kw['raise_exceptions']:
2536 raise
2547 raise
2537 # tb offset is 2 because we wrap execfile
2548 # tb offset is 2 because we wrap execfile
2538 self.showtraceback(tb_offset=2)
2549 self.showtraceback(tb_offset=2)
2539
2550
2540 def safe_execfile_ipy(self, fname):
2551 def safe_execfile_ipy(self, fname):
2541 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2552 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2542
2553
2543 Parameters
2554 Parameters
2544 ----------
2555 ----------
2545 fname : str
2556 fname : str
2546 The name of the file to execute. The filename must have a
2557 The name of the file to execute. The filename must have a
2547 .ipy or .ipynb extension.
2558 .ipy or .ipynb extension.
2548 """
2559 """
2549 fname = os.path.abspath(os.path.expanduser(fname))
2560 fname = os.path.abspath(os.path.expanduser(fname))
2550
2561
2551 # Make sure we can open the file
2562 # Make sure we can open the file
2552 try:
2563 try:
2553 with open(fname) as thefile:
2564 with open(fname) as thefile:
2554 pass
2565 pass
2555 except:
2566 except:
2556 warn('Could not open file <%s> for safe execution.' % fname)
2567 warn('Could not open file <%s> for safe execution.' % fname)
2557 return
2568 return
2558
2569
2559 # Find things also in current directory. This is needed to mimic the
2570 # Find things also in current directory. This is needed to mimic the
2560 # behavior of running a script from the system command line, where
2571 # behavior of running a script from the system command line, where
2561 # Python inserts the script's directory into sys.path
2572 # Python inserts the script's directory into sys.path
2562 dname = os.path.dirname(fname)
2573 dname = os.path.dirname(fname)
2563
2574
2564 def get_cells():
2575 def get_cells():
2565 """generator for sequence of code blocks to run"""
2576 """generator for sequence of code blocks to run"""
2566 if fname.endswith('.ipynb'):
2577 if fname.endswith('.ipynb'):
2567 from IPython.nbformat import current
2578 from IPython.nbformat import current
2568 with open(fname) as f:
2579 with open(fname) as f:
2569 nb = current.read(f, 'json')
2580 nb = current.read(f, 'json')
2570 if not nb.worksheets:
2581 if not nb.worksheets:
2571 return
2582 return
2572 for cell in nb.worksheets[0].cells:
2583 for cell in nb.worksheets[0].cells:
2573 if cell.cell_type == 'code':
2584 if cell.cell_type == 'code':
2574 yield cell.input
2585 yield cell.input
2575 else:
2586 else:
2576 with open(fname) as f:
2587 with open(fname) as f:
2577 yield f.read()
2588 yield f.read()
2578
2589
2579 with prepended_to_syspath(dname):
2590 with prepended_to_syspath(dname):
2580 try:
2591 try:
2581 for cell in get_cells():
2592 for cell in get_cells():
2582 # self.run_cell currently captures all exceptions
2593 # self.run_cell currently captures all exceptions
2583 # raised in user code. It would be nice if there were
2594 # raised in user code. It would be nice if there were
2584 # versions of run_cell that did raise, so
2595 # versions of run_cell that did raise, so
2585 # we could catch the errors.
2596 # we could catch the errors.
2586 self.run_cell(cell, store_history=False, shell_futures=False)
2597 self.run_cell(cell, store_history=False, shell_futures=False)
2587 except:
2598 except:
2588 self.showtraceback()
2599 self.showtraceback()
2589 warn('Unknown failure executing file: <%s>' % fname)
2600 warn('Unknown failure executing file: <%s>' % fname)
2590
2601
2591 def safe_run_module(self, mod_name, where):
2602 def safe_run_module(self, mod_name, where):
2592 """A safe version of runpy.run_module().
2603 """A safe version of runpy.run_module().
2593
2604
2594 This version will never throw an exception, but instead print
2605 This version will never throw an exception, but instead print
2595 helpful error messages to the screen.
2606 helpful error messages to the screen.
2596
2607
2597 `SystemExit` exceptions with status code 0 or None are ignored.
2608 `SystemExit` exceptions with status code 0 or None are ignored.
2598
2609
2599 Parameters
2610 Parameters
2600 ----------
2611 ----------
2601 mod_name : string
2612 mod_name : string
2602 The name of the module to be executed.
2613 The name of the module to be executed.
2603 where : dict
2614 where : dict
2604 The globals namespace.
2615 The globals namespace.
2605 """
2616 """
2606 try:
2617 try:
2607 try:
2618 try:
2608 where.update(
2619 where.update(
2609 runpy.run_module(str(mod_name), run_name="__main__",
2620 runpy.run_module(str(mod_name), run_name="__main__",
2610 alter_sys=True)
2621 alter_sys=True)
2611 )
2622 )
2612 except SystemExit as status:
2623 except SystemExit as status:
2613 if status.code:
2624 if status.code:
2614 raise
2625 raise
2615 except:
2626 except:
2616 self.showtraceback()
2627 self.showtraceback()
2617 warn('Unknown failure executing module: <%s>' % mod_name)
2628 warn('Unknown failure executing module: <%s>' % mod_name)
2618
2629
2619 def _run_cached_cell_magic(self, magic_name, line):
2630 def _run_cached_cell_magic(self, magic_name, line):
2620 """Special method to call a cell magic with the data stored in self.
2631 """Special method to call a cell magic with the data stored in self.
2621 """
2632 """
2622 cell = self._current_cell_magic_body
2633 cell = self._current_cell_magic_body
2623 self._current_cell_magic_body = None
2634 self._current_cell_magic_body = None
2624 return self.run_cell_magic(magic_name, line, cell)
2635 return self.run_cell_magic(magic_name, line, cell)
2625
2636
2626 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2637 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2627 """Run a complete IPython cell.
2638 """Run a complete IPython cell.
2628
2639
2629 Parameters
2640 Parameters
2630 ----------
2641 ----------
2631 raw_cell : str
2642 raw_cell : str
2632 The code (including IPython code such as %magic functions) to run.
2643 The code (including IPython code such as %magic functions) to run.
2633 store_history : bool
2644 store_history : bool
2634 If True, the raw and translated cell will be stored in IPython's
2645 If True, the raw and translated cell will be stored in IPython's
2635 history. For user code calling back into IPython's machinery, this
2646 history. For user code calling back into IPython's machinery, this
2636 should be set to False.
2647 should be set to False.
2637 silent : bool
2648 silent : bool
2638 If True, avoid side-effects, such as implicit displayhooks and
2649 If True, avoid side-effects, such as implicit displayhooks and
2639 and logging. silent=True forces store_history=False.
2650 and logging. silent=True forces store_history=False.
2640 shell_futures : bool
2651 shell_futures : bool
2641 If True, the code will share future statements with the interactive
2652 If True, the code will share future statements with the interactive
2642 shell. It will both be affected by previous __future__ imports, and
2653 shell. It will both be affected by previous __future__ imports, and
2643 any __future__ imports in the code will affect the shell. If False,
2654 any __future__ imports in the code will affect the shell. If False,
2644 __future__ imports are not shared in either direction.
2655 __future__ imports are not shared in either direction.
2645 """
2656 """
2646 if (not raw_cell) or raw_cell.isspace():
2657 if (not raw_cell) or raw_cell.isspace():
2647 return
2658 return
2648
2659
2649 if silent:
2660 if silent:
2650 store_history = False
2661 store_history = False
2651
2662
2663 self.callbacks.fire('pre_execute')
2664 if not silent:
2665 self.callbacks.fire('pre_execute_explicit')
2666
2652 # If any of our input transformation (input_transformer_manager or
2667 # If any of our input transformation (input_transformer_manager or
2653 # prefilter_manager) raises an exception, we store it in this variable
2668 # prefilter_manager) raises an exception, we store it in this variable
2654 # so that we can display the error after logging the input and storing
2669 # so that we can display the error after logging the input and storing
2655 # it in the history.
2670 # it in the history.
2656 preprocessing_exc_tuple = None
2671 preprocessing_exc_tuple = None
2657 try:
2672 try:
2658 # Static input transformations
2673 # Static input transformations
2659 cell = self.input_transformer_manager.transform_cell(raw_cell)
2674 cell = self.input_transformer_manager.transform_cell(raw_cell)
2660 except SyntaxError:
2675 except SyntaxError:
2661 preprocessing_exc_tuple = sys.exc_info()
2676 preprocessing_exc_tuple = sys.exc_info()
2662 cell = raw_cell # cell has to exist so it can be stored/logged
2677 cell = raw_cell # cell has to exist so it can be stored/logged
2663 else:
2678 else:
2664 if len(cell.splitlines()) == 1:
2679 if len(cell.splitlines()) == 1:
2665 # Dynamic transformations - only applied for single line commands
2680 # Dynamic transformations - only applied for single line commands
2666 with self.builtin_trap:
2681 with self.builtin_trap:
2667 try:
2682 try:
2668 # use prefilter_lines to handle trailing newlines
2683 # use prefilter_lines to handle trailing newlines
2669 # restore trailing newline for ast.parse
2684 # restore trailing newline for ast.parse
2670 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2685 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2671 except Exception:
2686 except Exception:
2672 # don't allow prefilter errors to crash IPython
2687 # don't allow prefilter errors to crash IPython
2673 preprocessing_exc_tuple = sys.exc_info()
2688 preprocessing_exc_tuple = sys.exc_info()
2674
2689
2675 # Store raw and processed history
2690 # Store raw and processed history
2676 if store_history:
2691 if store_history:
2677 self.history_manager.store_inputs(self.execution_count,
2692 self.history_manager.store_inputs(self.execution_count,
2678 cell, raw_cell)
2693 cell, raw_cell)
2679 if not silent:
2694 if not silent:
2680 self.logger.log(cell, raw_cell)
2695 self.logger.log(cell, raw_cell)
2681
2696
2682 # Display the exception if input processing failed.
2697 # Display the exception if input processing failed.
2683 if preprocessing_exc_tuple is not None:
2698 if preprocessing_exc_tuple is not None:
2684 self.showtraceback(preprocessing_exc_tuple)
2699 self.showtraceback(preprocessing_exc_tuple)
2685 if store_history:
2700 if store_history:
2686 self.execution_count += 1
2701 self.execution_count += 1
2687 return
2702 return
2688
2703
2689 # Our own compiler remembers the __future__ environment. If we want to
2704 # Our own compiler remembers the __future__ environment. If we want to
2690 # run code with a separate __future__ environment, use the default
2705 # run code with a separate __future__ environment, use the default
2691 # compiler
2706 # compiler
2692 compiler = self.compile if shell_futures else CachingCompiler()
2707 compiler = self.compile if shell_futures else CachingCompiler()
2693
2708
2694 with self.builtin_trap:
2709 with self.builtin_trap:
2695 cell_name = self.compile.cache(cell, self.execution_count)
2710 cell_name = self.compile.cache(cell, self.execution_count)
2696
2711
2697 with self.display_trap:
2712 with self.display_trap:
2698 # Compile to bytecode
2713 # Compile to bytecode
2699 try:
2714 try:
2700 code_ast = compiler.ast_parse(cell, filename=cell_name)
2715 code_ast = compiler.ast_parse(cell, filename=cell_name)
2701 except IndentationError:
2716 except IndentationError:
2702 self.showindentationerror()
2717 self.showindentationerror()
2703 if store_history:
2718 if store_history:
2704 self.execution_count += 1
2719 self.execution_count += 1
2705 return None
2720 return None
2706 except (OverflowError, SyntaxError, ValueError, TypeError,
2721 except (OverflowError, SyntaxError, ValueError, TypeError,
2707 MemoryError):
2722 MemoryError):
2708 self.showsyntaxerror()
2723 self.showsyntaxerror()
2709 if store_history:
2724 if store_history:
2710 self.execution_count += 1
2725 self.execution_count += 1
2711 return None
2726 return None
2712
2727
2713 # Apply AST transformations
2728 # Apply AST transformations
2714 code_ast = self.transform_ast(code_ast)
2729 code_ast = self.transform_ast(code_ast)
2715
2730
2716 # Execute the user code
2731 # Execute the user code
2717 interactivity = "none" if silent else self.ast_node_interactivity
2732 interactivity = "none" if silent else self.ast_node_interactivity
2718 self.run_ast_nodes(code_ast.body, cell_name,
2733 self.run_ast_nodes(code_ast.body, cell_name,
2719 interactivity=interactivity, compiler=compiler)
2734 interactivity=interactivity, compiler=compiler)
2720
2735
2721 # Execute any registered post-execution functions.
2736 self.callbacks.fire('post_execute')
2722 # unless we are silent
2737 if not silent:
2723 post_exec = [] if silent else iteritems(self._post_execute)
2738 self.callbacks.fire('post_execute_explicit')
2724
2725 for func, status in post_exec:
2726 if self.disable_failing_post_execute and not status:
2727 continue
2728 try:
2729 func()
2730 except KeyboardInterrupt:
2731 print("\nKeyboardInterrupt", file=io.stderr)
2732 except Exception:
2733 # register as failing:
2734 self._post_execute[func] = False
2735 self.showtraceback()
2736 print('\n'.join([
2737 "post-execution function %r produced an error." % func,
2738 "If this problem persists, you can disable failing post-exec functions with:",
2739 "",
2740 " get_ipython().disable_failing_post_execute = True"
2741 ]), file=io.stderr)
2742
2739
2743 if store_history:
2740 if store_history:
2744 # Write output to the database. Does nothing unless
2741 # Write output to the database. Does nothing unless
2745 # history output logging is enabled.
2742 # history output logging is enabled.
2746 self.history_manager.store_output(self.execution_count)
2743 self.history_manager.store_output(self.execution_count)
2747 # Each cell is a *single* input, regardless of how many lines it has
2744 # Each cell is a *single* input, regardless of how many lines it has
2748 self.execution_count += 1
2745 self.execution_count += 1
2749
2746
2750 def transform_ast(self, node):
2747 def transform_ast(self, node):
2751 """Apply the AST transformations from self.ast_transformers
2748 """Apply the AST transformations from self.ast_transformers
2752
2749
2753 Parameters
2750 Parameters
2754 ----------
2751 ----------
2755 node : ast.Node
2752 node : ast.Node
2756 The root node to be transformed. Typically called with the ast.Module
2753 The root node to be transformed. Typically called with the ast.Module
2757 produced by parsing user input.
2754 produced by parsing user input.
2758
2755
2759 Returns
2756 Returns
2760 -------
2757 -------
2761 An ast.Node corresponding to the node it was called with. Note that it
2758 An ast.Node corresponding to the node it was called with. Note that it
2762 may also modify the passed object, so don't rely on references to the
2759 may also modify the passed object, so don't rely on references to the
2763 original AST.
2760 original AST.
2764 """
2761 """
2765 for transformer in self.ast_transformers:
2762 for transformer in self.ast_transformers:
2766 try:
2763 try:
2767 node = transformer.visit(node)
2764 node = transformer.visit(node)
2768 except Exception:
2765 except Exception:
2769 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2766 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2770 self.ast_transformers.remove(transformer)
2767 self.ast_transformers.remove(transformer)
2771
2768
2772 if self.ast_transformers:
2769 if self.ast_transformers:
2773 ast.fix_missing_locations(node)
2770 ast.fix_missing_locations(node)
2774 return node
2771 return node
2775
2772
2776
2773
2777 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2774 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2778 compiler=compile):
2775 compiler=compile):
2779 """Run a sequence of AST nodes. The execution mode depends on the
2776 """Run a sequence of AST nodes. The execution mode depends on the
2780 interactivity parameter.
2777 interactivity parameter.
2781
2778
2782 Parameters
2779 Parameters
2783 ----------
2780 ----------
2784 nodelist : list
2781 nodelist : list
2785 A sequence of AST nodes to run.
2782 A sequence of AST nodes to run.
2786 cell_name : str
2783 cell_name : str
2787 Will be passed to the compiler as the filename of the cell. Typically
2784 Will be passed to the compiler as the filename of the cell. Typically
2788 the value returned by ip.compile.cache(cell).
2785 the value returned by ip.compile.cache(cell).
2789 interactivity : str
2786 interactivity : str
2790 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2787 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2791 run interactively (displaying output from expressions). 'last_expr'
2788 run interactively (displaying output from expressions). 'last_expr'
2792 will run the last node interactively only if it is an expression (i.e.
2789 will run the last node interactively only if it is an expression (i.e.
2793 expressions in loops or other blocks are not displayed. Other values
2790 expressions in loops or other blocks are not displayed. Other values
2794 for this parameter will raise a ValueError.
2791 for this parameter will raise a ValueError.
2795 compiler : callable
2792 compiler : callable
2796 A function with the same interface as the built-in compile(), to turn
2793 A function with the same interface as the built-in compile(), to turn
2797 the AST nodes into code objects. Default is the built-in compile().
2794 the AST nodes into code objects. Default is the built-in compile().
2798 """
2795 """
2799 if not nodelist:
2796 if not nodelist:
2800 return
2797 return
2801
2798
2802 if interactivity == 'last_expr':
2799 if interactivity == 'last_expr':
2803 if isinstance(nodelist[-1], ast.Expr):
2800 if isinstance(nodelist[-1], ast.Expr):
2804 interactivity = "last"
2801 interactivity = "last"
2805 else:
2802 else:
2806 interactivity = "none"
2803 interactivity = "none"
2807
2804
2808 if interactivity == 'none':
2805 if interactivity == 'none':
2809 to_run_exec, to_run_interactive = nodelist, []
2806 to_run_exec, to_run_interactive = nodelist, []
2810 elif interactivity == 'last':
2807 elif interactivity == 'last':
2811 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2808 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2812 elif interactivity == 'all':
2809 elif interactivity == 'all':
2813 to_run_exec, to_run_interactive = [], nodelist
2810 to_run_exec, to_run_interactive = [], nodelist
2814 else:
2811 else:
2815 raise ValueError("Interactivity was %r" % interactivity)
2812 raise ValueError("Interactivity was %r" % interactivity)
2816
2813
2817 exec_count = self.execution_count
2814 exec_count = self.execution_count
2818
2815
2819 try:
2816 try:
2820 for i, node in enumerate(to_run_exec):
2817 for i, node in enumerate(to_run_exec):
2821 mod = ast.Module([node])
2818 mod = ast.Module([node])
2822 code = compiler(mod, cell_name, "exec")
2819 code = compiler(mod, cell_name, "exec")
2823 if self.run_code(code):
2820 if self.run_code(code):
2824 return True
2821 return True
2825
2822
2826 for i, node in enumerate(to_run_interactive):
2823 for i, node in enumerate(to_run_interactive):
2827 mod = ast.Interactive([node])
2824 mod = ast.Interactive([node])
2828 code = compiler(mod, cell_name, "single")
2825 code = compiler(mod, cell_name, "single")
2829 if self.run_code(code):
2826 if self.run_code(code):
2830 return True
2827 return True
2831
2828
2832 # Flush softspace
2829 # Flush softspace
2833 if softspace(sys.stdout, 0):
2830 if softspace(sys.stdout, 0):
2834 print()
2831 print()
2835
2832
2836 except:
2833 except:
2837 # It's possible to have exceptions raised here, typically by
2834 # It's possible to have exceptions raised here, typically by
2838 # compilation of odd code (such as a naked 'return' outside a
2835 # compilation of odd code (such as a naked 'return' outside a
2839 # function) that did parse but isn't valid. Typically the exception
2836 # function) that did parse but isn't valid. Typically the exception
2840 # is a SyntaxError, but it's safest just to catch anything and show
2837 # is a SyntaxError, but it's safest just to catch anything and show
2841 # the user a traceback.
2838 # the user a traceback.
2842
2839
2843 # We do only one try/except outside the loop to minimize the impact
2840 # We do only one try/except outside the loop to minimize the impact
2844 # on runtime, and also because if any node in the node list is
2841 # on runtime, and also because if any node in the node list is
2845 # broken, we should stop execution completely.
2842 # broken, we should stop execution completely.
2846 self.showtraceback()
2843 self.showtraceback()
2847
2844
2848 return False
2845 return False
2849
2846
2850 def run_code(self, code_obj):
2847 def run_code(self, code_obj):
2851 """Execute a code object.
2848 """Execute a code object.
2852
2849
2853 When an exception occurs, self.showtraceback() is called to display a
2850 When an exception occurs, self.showtraceback() is called to display a
2854 traceback.
2851 traceback.
2855
2852
2856 Parameters
2853 Parameters
2857 ----------
2854 ----------
2858 code_obj : code object
2855 code_obj : code object
2859 A compiled code object, to be executed
2856 A compiled code object, to be executed
2860
2857
2861 Returns
2858 Returns
2862 -------
2859 -------
2863 False : successful execution.
2860 False : successful execution.
2864 True : an error occurred.
2861 True : an error occurred.
2865 """
2862 """
2866
2863
2867 # Set our own excepthook in case the user code tries to call it
2864 # Set our own excepthook in case the user code tries to call it
2868 # directly, so that the IPython crash handler doesn't get triggered
2865 # directly, so that the IPython crash handler doesn't get triggered
2869 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2866 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2870
2867
2871 # we save the original sys.excepthook in the instance, in case config
2868 # we save the original sys.excepthook in the instance, in case config
2872 # code (such as magics) needs access to it.
2869 # code (such as magics) needs access to it.
2873 self.sys_excepthook = old_excepthook
2870 self.sys_excepthook = old_excepthook
2874 outflag = 1 # happens in more places, so it's easier as default
2871 outflag = 1 # happens in more places, so it's easier as default
2875 try:
2872 try:
2876 try:
2873 try:
2877 self.hooks.pre_run_code_hook()
2874 self.hooks.pre_run_code_hook()
2878 #rprint('Running code', repr(code_obj)) # dbg
2875 #rprint('Running code', repr(code_obj)) # dbg
2879 exec(code_obj, self.user_global_ns, self.user_ns)
2876 exec(code_obj, self.user_global_ns, self.user_ns)
2880 finally:
2877 finally:
2881 # Reset our crash handler in place
2878 # Reset our crash handler in place
2882 sys.excepthook = old_excepthook
2879 sys.excepthook = old_excepthook
2883 except SystemExit:
2880 except SystemExit:
2884 self.showtraceback(exception_only=True)
2881 self.showtraceback(exception_only=True)
2885 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2882 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2886 except self.custom_exceptions:
2883 except self.custom_exceptions:
2887 etype,value,tb = sys.exc_info()
2884 etype,value,tb = sys.exc_info()
2888 self.CustomTB(etype,value,tb)
2885 self.CustomTB(etype,value,tb)
2889 except:
2886 except:
2890 self.showtraceback()
2887 self.showtraceback()
2891 else:
2888 else:
2892 outflag = 0
2889 outflag = 0
2893 return outflag
2890 return outflag
2894
2891
2895 # For backwards compatibility
2892 # For backwards compatibility
2896 runcode = run_code
2893 runcode = run_code
2897
2894
2898 #-------------------------------------------------------------------------
2895 #-------------------------------------------------------------------------
2899 # Things related to GUI support and pylab
2896 # Things related to GUI support and pylab
2900 #-------------------------------------------------------------------------
2897 #-------------------------------------------------------------------------
2901
2898
2902 def enable_gui(self, gui=None):
2899 def enable_gui(self, gui=None):
2903 raise NotImplementedError('Implement enable_gui in a subclass')
2900 raise NotImplementedError('Implement enable_gui in a subclass')
2904
2901
2905 def enable_matplotlib(self, gui=None):
2902 def enable_matplotlib(self, gui=None):
2906 """Enable interactive matplotlib and inline figure support.
2903 """Enable interactive matplotlib and inline figure support.
2907
2904
2908 This takes the following steps:
2905 This takes the following steps:
2909
2906
2910 1. select the appropriate eventloop and matplotlib backend
2907 1. select the appropriate eventloop and matplotlib backend
2911 2. set up matplotlib for interactive use with that backend
2908 2. set up matplotlib for interactive use with that backend
2912 3. configure formatters for inline figure display
2909 3. configure formatters for inline figure display
2913 4. enable the selected gui eventloop
2910 4. enable the selected gui eventloop
2914
2911
2915 Parameters
2912 Parameters
2916 ----------
2913 ----------
2917 gui : optional, string
2914 gui : optional, string
2918 If given, dictates the choice of matplotlib GUI backend to use
2915 If given, dictates the choice of matplotlib GUI backend to use
2919 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2916 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2920 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2917 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2921 matplotlib (as dictated by the matplotlib build-time options plus the
2918 matplotlib (as dictated by the matplotlib build-time options plus the
2922 user's matplotlibrc configuration file). Note that not all backends
2919 user's matplotlibrc configuration file). Note that not all backends
2923 make sense in all contexts, for example a terminal ipython can't
2920 make sense in all contexts, for example a terminal ipython can't
2924 display figures inline.
2921 display figures inline.
2925 """
2922 """
2926 from IPython.core import pylabtools as pt
2923 from IPython.core import pylabtools as pt
2927 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
2924 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
2928
2925
2929 if gui != 'inline':
2926 if gui != 'inline':
2930 # If we have our first gui selection, store it
2927 # If we have our first gui selection, store it
2931 if self.pylab_gui_select is None:
2928 if self.pylab_gui_select is None:
2932 self.pylab_gui_select = gui
2929 self.pylab_gui_select = gui
2933 # Otherwise if they are different
2930 # Otherwise if they are different
2934 elif gui != self.pylab_gui_select:
2931 elif gui != self.pylab_gui_select:
2935 print ('Warning: Cannot change to a different GUI toolkit: %s.'
2932 print ('Warning: Cannot change to a different GUI toolkit: %s.'
2936 ' Using %s instead.' % (gui, self.pylab_gui_select))
2933 ' Using %s instead.' % (gui, self.pylab_gui_select))
2937 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
2934 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
2938
2935
2939 pt.activate_matplotlib(backend)
2936 pt.activate_matplotlib(backend)
2940 pt.configure_inline_support(self, backend)
2937 pt.configure_inline_support(self, backend)
2941
2938
2942 # Now we must activate the gui pylab wants to use, and fix %run to take
2939 # Now we must activate the gui pylab wants to use, and fix %run to take
2943 # plot updates into account
2940 # plot updates into account
2944 self.enable_gui(gui)
2941 self.enable_gui(gui)
2945 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2942 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2946 pt.mpl_runner(self.safe_execfile)
2943 pt.mpl_runner(self.safe_execfile)
2947
2944
2948 return gui, backend
2945 return gui, backend
2949
2946
2950 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2947 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2951 """Activate pylab support at runtime.
2948 """Activate pylab support at runtime.
2952
2949
2953 This turns on support for matplotlib, preloads into the interactive
2950 This turns on support for matplotlib, preloads into the interactive
2954 namespace all of numpy and pylab, and configures IPython to correctly
2951 namespace all of numpy and pylab, and configures IPython to correctly
2955 interact with the GUI event loop. The GUI backend to be used can be
2952 interact with the GUI event loop. The GUI backend to be used can be
2956 optionally selected with the optional ``gui`` argument.
2953 optionally selected with the optional ``gui`` argument.
2957
2954
2958 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
2955 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
2959
2956
2960 Parameters
2957 Parameters
2961 ----------
2958 ----------
2962 gui : optional, string
2959 gui : optional, string
2963 If given, dictates the choice of matplotlib GUI backend to use
2960 If given, dictates the choice of matplotlib GUI backend to use
2964 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2961 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2965 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2962 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2966 matplotlib (as dictated by the matplotlib build-time options plus the
2963 matplotlib (as dictated by the matplotlib build-time options plus the
2967 user's matplotlibrc configuration file). Note that not all backends
2964 user's matplotlibrc configuration file). Note that not all backends
2968 make sense in all contexts, for example a terminal ipython can't
2965 make sense in all contexts, for example a terminal ipython can't
2969 display figures inline.
2966 display figures inline.
2970 import_all : optional, bool, default: True
2967 import_all : optional, bool, default: True
2971 Whether to do `from numpy import *` and `from pylab import *`
2968 Whether to do `from numpy import *` and `from pylab import *`
2972 in addition to module imports.
2969 in addition to module imports.
2973 welcome_message : deprecated
2970 welcome_message : deprecated
2974 This argument is ignored, no welcome message will be displayed.
2971 This argument is ignored, no welcome message will be displayed.
2975 """
2972 """
2976 from IPython.core.pylabtools import import_pylab
2973 from IPython.core.pylabtools import import_pylab
2977
2974
2978 gui, backend = self.enable_matplotlib(gui)
2975 gui, backend = self.enable_matplotlib(gui)
2979
2976
2980 # We want to prevent the loading of pylab to pollute the user's
2977 # We want to prevent the loading of pylab to pollute the user's
2981 # namespace as shown by the %who* magics, so we execute the activation
2978 # namespace as shown by the %who* magics, so we execute the activation
2982 # code in an empty namespace, and we update *both* user_ns and
2979 # code in an empty namespace, and we update *both* user_ns and
2983 # user_ns_hidden with this information.
2980 # user_ns_hidden with this information.
2984 ns = {}
2981 ns = {}
2985 import_pylab(ns, import_all)
2982 import_pylab(ns, import_all)
2986 # warn about clobbered names
2983 # warn about clobbered names
2987 ignored = set(["__builtins__"])
2984 ignored = set(["__builtins__"])
2988 both = set(ns).intersection(self.user_ns).difference(ignored)
2985 both = set(ns).intersection(self.user_ns).difference(ignored)
2989 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
2986 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
2990 self.user_ns.update(ns)
2987 self.user_ns.update(ns)
2991 self.user_ns_hidden.update(ns)
2988 self.user_ns_hidden.update(ns)
2992 return gui, backend, clobbered
2989 return gui, backend, clobbered
2993
2990
2994 #-------------------------------------------------------------------------
2991 #-------------------------------------------------------------------------
2995 # Utilities
2992 # Utilities
2996 #-------------------------------------------------------------------------
2993 #-------------------------------------------------------------------------
2997
2994
2998 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2995 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2999 """Expand python variables in a string.
2996 """Expand python variables in a string.
3000
2997
3001 The depth argument indicates how many frames above the caller should
2998 The depth argument indicates how many frames above the caller should
3002 be walked to look for the local namespace where to expand variables.
2999 be walked to look for the local namespace where to expand variables.
3003
3000
3004 The global namespace for expansion is always the user's interactive
3001 The global namespace for expansion is always the user's interactive
3005 namespace.
3002 namespace.
3006 """
3003 """
3007 ns = self.user_ns.copy()
3004 ns = self.user_ns.copy()
3008 ns.update(sys._getframe(depth+1).f_locals)
3005 ns.update(sys._getframe(depth+1).f_locals)
3009 try:
3006 try:
3010 # We have to use .vformat() here, because 'self' is a valid and common
3007 # We have to use .vformat() here, because 'self' is a valid and common
3011 # name, and expanding **ns for .format() would make it collide with
3008 # name, and expanding **ns for .format() would make it collide with
3012 # the 'self' argument of the method.
3009 # the 'self' argument of the method.
3013 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3010 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3014 except Exception:
3011 except Exception:
3015 # if formatter couldn't format, just let it go untransformed
3012 # if formatter couldn't format, just let it go untransformed
3016 pass
3013 pass
3017 return cmd
3014 return cmd
3018
3015
3019 def mktempfile(self, data=None, prefix='ipython_edit_'):
3016 def mktempfile(self, data=None, prefix='ipython_edit_'):
3020 """Make a new tempfile and return its filename.
3017 """Make a new tempfile and return its filename.
3021
3018
3022 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3019 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3023 but it registers the created filename internally so ipython cleans it up
3020 but it registers the created filename internally so ipython cleans it up
3024 at exit time.
3021 at exit time.
3025
3022
3026 Optional inputs:
3023 Optional inputs:
3027
3024
3028 - data(None): if data is given, it gets written out to the temp file
3025 - data(None): if data is given, it gets written out to the temp file
3029 immediately, and the file is closed again."""
3026 immediately, and the file is closed again."""
3030
3027
3031 dirname = tempfile.mkdtemp(prefix=prefix)
3028 dirname = tempfile.mkdtemp(prefix=prefix)
3032 self.tempdirs.append(dirname)
3029 self.tempdirs.append(dirname)
3033
3030
3034 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3031 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3035 self.tempfiles.append(filename)
3032 self.tempfiles.append(filename)
3036
3033
3037 if data:
3034 if data:
3038 tmp_file = open(filename,'w')
3035 tmp_file = open(filename,'w')
3039 tmp_file.write(data)
3036 tmp_file.write(data)
3040 tmp_file.close()
3037 tmp_file.close()
3041 return filename
3038 return filename
3042
3039
3043 # TODO: This should be removed when Term is refactored.
3040 # TODO: This should be removed when Term is refactored.
3044 def write(self,data):
3041 def write(self,data):
3045 """Write a string to the default output"""
3042 """Write a string to the default output"""
3046 io.stdout.write(data)
3043 io.stdout.write(data)
3047
3044
3048 # TODO: This should be removed when Term is refactored.
3045 # TODO: This should be removed when Term is refactored.
3049 def write_err(self,data):
3046 def write_err(self,data):
3050 """Write a string to the default error output"""
3047 """Write a string to the default error output"""
3051 io.stderr.write(data)
3048 io.stderr.write(data)
3052
3049
3053 def ask_yes_no(self, prompt, default=None):
3050 def ask_yes_no(self, prompt, default=None):
3054 if self.quiet:
3051 if self.quiet:
3055 return True
3052 return True
3056 return ask_yes_no(prompt,default)
3053 return ask_yes_no(prompt,default)
3057
3054
3058 def show_usage(self):
3055 def show_usage(self):
3059 """Show a usage message"""
3056 """Show a usage message"""
3060 page.page(IPython.core.usage.interactive_usage)
3057 page.page(IPython.core.usage.interactive_usage)
3061
3058
3062 def extract_input_lines(self, range_str, raw=False):
3059 def extract_input_lines(self, range_str, raw=False):
3063 """Return as a string a set of input history slices.
3060 """Return as a string a set of input history slices.
3064
3061
3065 Parameters
3062 Parameters
3066 ----------
3063 ----------
3067 range_str : string
3064 range_str : string
3068 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3065 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3069 since this function is for use by magic functions which get their
3066 since this function is for use by magic functions which get their
3070 arguments as strings. The number before the / is the session
3067 arguments as strings. The number before the / is the session
3071 number: ~n goes n back from the current session.
3068 number: ~n goes n back from the current session.
3072
3069
3073 raw : bool, optional
3070 raw : bool, optional
3074 By default, the processed input is used. If this is true, the raw
3071 By default, the processed input is used. If this is true, the raw
3075 input history is used instead.
3072 input history is used instead.
3076
3073
3077 Notes
3074 Notes
3078 -----
3075 -----
3079
3076
3080 Slices can be described with two notations:
3077 Slices can be described with two notations:
3081
3078
3082 * ``N:M`` -> standard python form, means including items N...(M-1).
3079 * ``N:M`` -> standard python form, means including items N...(M-1).
3083 * ``N-M`` -> include items N..M (closed endpoint).
3080 * ``N-M`` -> include items N..M (closed endpoint).
3084 """
3081 """
3085 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3082 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3086 return "\n".join(x for _, _, x in lines)
3083 return "\n".join(x for _, _, x in lines)
3087
3084
3088 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
3085 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
3089 """Get a code string from history, file, url, or a string or macro.
3086 """Get a code string from history, file, url, or a string or macro.
3090
3087
3091 This is mainly used by magic functions.
3088 This is mainly used by magic functions.
3092
3089
3093 Parameters
3090 Parameters
3094 ----------
3091 ----------
3095
3092
3096 target : str
3093 target : str
3097
3094
3098 A string specifying code to retrieve. This will be tried respectively
3095 A string specifying code to retrieve. This will be tried respectively
3099 as: ranges of input history (see %history for syntax), url,
3096 as: ranges of input history (see %history for syntax), url,
3100 correspnding .py file, filename, or an expression evaluating to a
3097 correspnding .py file, filename, or an expression evaluating to a
3101 string or Macro in the user namespace.
3098 string or Macro in the user namespace.
3102
3099
3103 raw : bool
3100 raw : bool
3104 If true (default), retrieve raw history. Has no effect on the other
3101 If true (default), retrieve raw history. Has no effect on the other
3105 retrieval mechanisms.
3102 retrieval mechanisms.
3106
3103
3107 py_only : bool (default False)
3104 py_only : bool (default False)
3108 Only try to fetch python code, do not try alternative methods to decode file
3105 Only try to fetch python code, do not try alternative methods to decode file
3109 if unicode fails.
3106 if unicode fails.
3110
3107
3111 Returns
3108 Returns
3112 -------
3109 -------
3113 A string of code.
3110 A string of code.
3114
3111
3115 ValueError is raised if nothing is found, and TypeError if it evaluates
3112 ValueError is raised if nothing is found, and TypeError if it evaluates
3116 to an object of another type. In each case, .args[0] is a printable
3113 to an object of another type. In each case, .args[0] is a printable
3117 message.
3114 message.
3118 """
3115 """
3119 code = self.extract_input_lines(target, raw=raw) # Grab history
3116 code = self.extract_input_lines(target, raw=raw) # Grab history
3120 if code:
3117 if code:
3121 return code
3118 return code
3122 utarget = unquote_filename(target)
3119 utarget = unquote_filename(target)
3123 try:
3120 try:
3124 if utarget.startswith(('http://', 'https://')):
3121 if utarget.startswith(('http://', 'https://')):
3125 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3122 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3126 except UnicodeDecodeError:
3123 except UnicodeDecodeError:
3127 if not py_only :
3124 if not py_only :
3128 # Deferred import
3125 # Deferred import
3129 try:
3126 try:
3130 from urllib.request import urlopen # Py3
3127 from urllib.request import urlopen # Py3
3131 except ImportError:
3128 except ImportError:
3132 from urllib import urlopen
3129 from urllib import urlopen
3133 response = urlopen(target)
3130 response = urlopen(target)
3134 return response.read().decode('latin1')
3131 return response.read().decode('latin1')
3135 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3132 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3136
3133
3137 potential_target = [target]
3134 potential_target = [target]
3138 try :
3135 try :
3139 potential_target.insert(0,get_py_filename(target))
3136 potential_target.insert(0,get_py_filename(target))
3140 except IOError:
3137 except IOError:
3141 pass
3138 pass
3142
3139
3143 for tgt in potential_target :
3140 for tgt in potential_target :
3144 if os.path.isfile(tgt): # Read file
3141 if os.path.isfile(tgt): # Read file
3145 try :
3142 try :
3146 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3143 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3147 except UnicodeDecodeError :
3144 except UnicodeDecodeError :
3148 if not py_only :
3145 if not py_only :
3149 with io_open(tgt,'r', encoding='latin1') as f :
3146 with io_open(tgt,'r', encoding='latin1') as f :
3150 return f.read()
3147 return f.read()
3151 raise ValueError(("'%s' seem to be unreadable.") % target)
3148 raise ValueError(("'%s' seem to be unreadable.") % target)
3152 elif os.path.isdir(os.path.expanduser(tgt)):
3149 elif os.path.isdir(os.path.expanduser(tgt)):
3153 raise ValueError("'%s' is a directory, not a regular file." % target)
3150 raise ValueError("'%s' is a directory, not a regular file." % target)
3154
3151
3155 try: # User namespace
3152 try: # User namespace
3156 codeobj = eval(target, self.user_ns)
3153 codeobj = eval(target, self.user_ns)
3157 except Exception:
3154 except Exception:
3158 raise ValueError(("'%s' was not found in history, as a file, url, "
3155 raise ValueError(("'%s' was not found in history, as a file, url, "
3159 "nor in the user namespace.") % target)
3156 "nor in the user namespace.") % target)
3160 if isinstance(codeobj, string_types):
3157 if isinstance(codeobj, string_types):
3161 return codeobj
3158 return codeobj
3162 elif isinstance(codeobj, Macro):
3159 elif isinstance(codeobj, Macro):
3163 return codeobj.value
3160 return codeobj.value
3164
3161
3165 raise TypeError("%s is neither a string nor a macro." % target,
3162 raise TypeError("%s is neither a string nor a macro." % target,
3166 codeobj)
3163 codeobj)
3167
3164
3168 #-------------------------------------------------------------------------
3165 #-------------------------------------------------------------------------
3169 # Things related to IPython exiting
3166 # Things related to IPython exiting
3170 #-------------------------------------------------------------------------
3167 #-------------------------------------------------------------------------
3171 def atexit_operations(self):
3168 def atexit_operations(self):
3172 """This will be executed at the time of exit.
3169 """This will be executed at the time of exit.
3173
3170
3174 Cleanup operations and saving of persistent data that is done
3171 Cleanup operations and saving of persistent data that is done
3175 unconditionally by IPython should be performed here.
3172 unconditionally by IPython should be performed here.
3176
3173
3177 For things that may depend on startup flags or platform specifics (such
3174 For things that may depend on startup flags or platform specifics (such
3178 as having readline or not), register a separate atexit function in the
3175 as having readline or not), register a separate atexit function in the
3179 code that has the appropriate information, rather than trying to
3176 code that has the appropriate information, rather than trying to
3180 clutter
3177 clutter
3181 """
3178 """
3182 # Close the history session (this stores the end time and line count)
3179 # Close the history session (this stores the end time and line count)
3183 # this must be *before* the tempfile cleanup, in case of temporary
3180 # this must be *before* the tempfile cleanup, in case of temporary
3184 # history db
3181 # history db
3185 self.history_manager.end_session()
3182 self.history_manager.end_session()
3186
3183
3187 # Cleanup all tempfiles and folders left around
3184 # Cleanup all tempfiles and folders left around
3188 for tfile in self.tempfiles:
3185 for tfile in self.tempfiles:
3189 try:
3186 try:
3190 os.unlink(tfile)
3187 os.unlink(tfile)
3191 except OSError:
3188 except OSError:
3192 pass
3189 pass
3193
3190
3194 for tdir in self.tempdirs:
3191 for tdir in self.tempdirs:
3195 try:
3192 try:
3196 os.rmdir(tdir)
3193 os.rmdir(tdir)
3197 except OSError:
3194 except OSError:
3198 pass
3195 pass
3199
3196
3200 # Clear all user namespaces to release all references cleanly.
3197 # Clear all user namespaces to release all references cleanly.
3201 self.reset(new_session=False)
3198 self.reset(new_session=False)
3202
3199
3203 # Run user hooks
3200 # Run user hooks
3204 self.hooks.shutdown_hook()
3201 self.hooks.shutdown_hook()
3205
3202
3206 def cleanup(self):
3203 def cleanup(self):
3207 self.restore_sys_module_state()
3204 self.restore_sys_module_state()
3208
3205
3209
3206
3210 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3207 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3211 """An abstract base class for InteractiveShell."""
3208 """An abstract base class for InteractiveShell."""
3212
3209
3213 InteractiveShellABC.register(InteractiveShell)
3210 InteractiveShellABC.register(InteractiveShell)
@@ -1,715 +1,730 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Tests for the key interactiveshell module.
2 """Tests for the key interactiveshell module.
3
3
4 Historically the main classes in interactiveshell have been under-tested. This
4 Historically the main classes in interactiveshell have been under-tested. This
5 module should grow as many single-method tests as possible to trap many of the
5 module should grow as many single-method tests as possible to trap many of the
6 recurring bugs we seem to encounter with high-level interaction.
6 recurring bugs we seem to encounter with high-level interaction.
7
7
8 Authors
8 Authors
9 -------
9 -------
10 * Fernando Perez
10 * Fernando Perez
11 """
11 """
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 # Copyright (C) 2011 The IPython Development Team
13 # Copyright (C) 2011 The IPython Development Team
14 #
14 #
15 # Distributed under the terms of the BSD License. The full license is in
15 # Distributed under the terms of the BSD License. The full license is in
16 # the file COPYING, distributed as part of this software.
16 # the file COPYING, distributed as part of this software.
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20 # Imports
20 # Imports
21 #-----------------------------------------------------------------------------
21 #-----------------------------------------------------------------------------
22 # stdlib
22 # stdlib
23 import ast
23 import ast
24 import os
24 import os
25 import signal
25 import signal
26 import shutil
26 import shutil
27 import sys
27 import sys
28 import tempfile
28 import tempfile
29 import unittest
29 import unittest
30 try:
31 from unittest import mock
32 except ImportError:
33 import mock
30 from os.path import join
34 from os.path import join
31
35
32 # third-party
36 # third-party
33 import nose.tools as nt
37 import nose.tools as nt
34
38
35 # Our own
39 # Our own
36 from IPython.core.inputtransformer import InputTransformer
40 from IPython.core.inputtransformer import InputTransformer
37 from IPython.testing.decorators import skipif, skip_win32, onlyif_unicode_paths
41 from IPython.testing.decorators import skipif, skip_win32, onlyif_unicode_paths
38 from IPython.testing import tools as tt
42 from IPython.testing import tools as tt
39 from IPython.utils import io
43 from IPython.utils import io
40 from IPython.utils import py3compat
44 from IPython.utils import py3compat
41 from IPython.utils.py3compat import unicode_type, PY3
45 from IPython.utils.py3compat import unicode_type, PY3
42
46
43 if PY3:
47 if PY3:
44 from io import StringIO
48 from io import StringIO
45 else:
49 else:
46 from StringIO import StringIO
50 from StringIO import StringIO
47
51
48 #-----------------------------------------------------------------------------
52 #-----------------------------------------------------------------------------
49 # Globals
53 # Globals
50 #-----------------------------------------------------------------------------
54 #-----------------------------------------------------------------------------
51 # This is used by every single test, no point repeating it ad nauseam
55 # This is used by every single test, no point repeating it ad nauseam
52 ip = get_ipython()
56 ip = get_ipython()
53
57
54 #-----------------------------------------------------------------------------
58 #-----------------------------------------------------------------------------
55 # Tests
59 # Tests
56 #-----------------------------------------------------------------------------
60 #-----------------------------------------------------------------------------
57
61
58 class InteractiveShellTestCase(unittest.TestCase):
62 class InteractiveShellTestCase(unittest.TestCase):
59 def test_naked_string_cells(self):
63 def test_naked_string_cells(self):
60 """Test that cells with only naked strings are fully executed"""
64 """Test that cells with only naked strings are fully executed"""
61 # First, single-line inputs
65 # First, single-line inputs
62 ip.run_cell('"a"\n')
66 ip.run_cell('"a"\n')
63 self.assertEqual(ip.user_ns['_'], 'a')
67 self.assertEqual(ip.user_ns['_'], 'a')
64 # And also multi-line cells
68 # And also multi-line cells
65 ip.run_cell('"""a\nb"""\n')
69 ip.run_cell('"""a\nb"""\n')
66 self.assertEqual(ip.user_ns['_'], 'a\nb')
70 self.assertEqual(ip.user_ns['_'], 'a\nb')
67
71
68 def test_run_empty_cell(self):
72 def test_run_empty_cell(self):
69 """Just make sure we don't get a horrible error with a blank
73 """Just make sure we don't get a horrible error with a blank
70 cell of input. Yes, I did overlook that."""
74 cell of input. Yes, I did overlook that."""
71 old_xc = ip.execution_count
75 old_xc = ip.execution_count
72 ip.run_cell('')
76 ip.run_cell('')
73 self.assertEqual(ip.execution_count, old_xc)
77 self.assertEqual(ip.execution_count, old_xc)
74
78
75 def test_run_cell_multiline(self):
79 def test_run_cell_multiline(self):
76 """Multi-block, multi-line cells must execute correctly.
80 """Multi-block, multi-line cells must execute correctly.
77 """
81 """
78 src = '\n'.join(["x=1",
82 src = '\n'.join(["x=1",
79 "y=2",
83 "y=2",
80 "if 1:",
84 "if 1:",
81 " x += 1",
85 " x += 1",
82 " y += 1",])
86 " y += 1",])
83 ip.run_cell(src)
87 ip.run_cell(src)
84 self.assertEqual(ip.user_ns['x'], 2)
88 self.assertEqual(ip.user_ns['x'], 2)
85 self.assertEqual(ip.user_ns['y'], 3)
89 self.assertEqual(ip.user_ns['y'], 3)
86
90
87 def test_multiline_string_cells(self):
91 def test_multiline_string_cells(self):
88 "Code sprinkled with multiline strings should execute (GH-306)"
92 "Code sprinkled with multiline strings should execute (GH-306)"
89 ip.run_cell('tmp=0')
93 ip.run_cell('tmp=0')
90 self.assertEqual(ip.user_ns['tmp'], 0)
94 self.assertEqual(ip.user_ns['tmp'], 0)
91 ip.run_cell('tmp=1;"""a\nb"""\n')
95 ip.run_cell('tmp=1;"""a\nb"""\n')
92 self.assertEqual(ip.user_ns['tmp'], 1)
96 self.assertEqual(ip.user_ns['tmp'], 1)
93
97
94 def test_dont_cache_with_semicolon(self):
98 def test_dont_cache_with_semicolon(self):
95 "Ending a line with semicolon should not cache the returned object (GH-307)"
99 "Ending a line with semicolon should not cache the returned object (GH-307)"
96 oldlen = len(ip.user_ns['Out'])
100 oldlen = len(ip.user_ns['Out'])
97 a = ip.run_cell('1;', store_history=True)
101 a = ip.run_cell('1;', store_history=True)
98 newlen = len(ip.user_ns['Out'])
102 newlen = len(ip.user_ns['Out'])
99 self.assertEqual(oldlen, newlen)
103 self.assertEqual(oldlen, newlen)
100 #also test the default caching behavior
104 #also test the default caching behavior
101 ip.run_cell('1', store_history=True)
105 ip.run_cell('1', store_history=True)
102 newlen = len(ip.user_ns['Out'])
106 newlen = len(ip.user_ns['Out'])
103 self.assertEqual(oldlen+1, newlen)
107 self.assertEqual(oldlen+1, newlen)
104
108
105 def test_In_variable(self):
109 def test_In_variable(self):
106 "Verify that In variable grows with user input (GH-284)"
110 "Verify that In variable grows with user input (GH-284)"
107 oldlen = len(ip.user_ns['In'])
111 oldlen = len(ip.user_ns['In'])
108 ip.run_cell('1;', store_history=True)
112 ip.run_cell('1;', store_history=True)
109 newlen = len(ip.user_ns['In'])
113 newlen = len(ip.user_ns['In'])
110 self.assertEqual(oldlen+1, newlen)
114 self.assertEqual(oldlen+1, newlen)
111 self.assertEqual(ip.user_ns['In'][-1],'1;')
115 self.assertEqual(ip.user_ns['In'][-1],'1;')
112
116
113 def test_magic_names_in_string(self):
117 def test_magic_names_in_string(self):
114 ip.run_cell('a = """\n%exit\n"""')
118 ip.run_cell('a = """\n%exit\n"""')
115 self.assertEqual(ip.user_ns['a'], '\n%exit\n')
119 self.assertEqual(ip.user_ns['a'], '\n%exit\n')
116
120
117 def test_trailing_newline(self):
121 def test_trailing_newline(self):
118 """test that running !(command) does not raise a SyntaxError"""
122 """test that running !(command) does not raise a SyntaxError"""
119 ip.run_cell('!(true)\n', False)
123 ip.run_cell('!(true)\n', False)
120 ip.run_cell('!(true)\n\n\n', False)
124 ip.run_cell('!(true)\n\n\n', False)
121
125
122 def test_gh_597(self):
126 def test_gh_597(self):
123 """Pretty-printing lists of objects with non-ascii reprs may cause
127 """Pretty-printing lists of objects with non-ascii reprs may cause
124 problems."""
128 problems."""
125 class Spam(object):
129 class Spam(object):
126 def __repr__(self):
130 def __repr__(self):
127 return "\xe9"*50
131 return "\xe9"*50
128 import IPython.core.formatters
132 import IPython.core.formatters
129 f = IPython.core.formatters.PlainTextFormatter()
133 f = IPython.core.formatters.PlainTextFormatter()
130 f([Spam(),Spam()])
134 f([Spam(),Spam()])
131
135
132
136
133 def test_future_flags(self):
137 def test_future_flags(self):
134 """Check that future flags are used for parsing code (gh-777)"""
138 """Check that future flags are used for parsing code (gh-777)"""
135 ip.run_cell('from __future__ import print_function')
139 ip.run_cell('from __future__ import print_function')
136 try:
140 try:
137 ip.run_cell('prfunc_return_val = print(1,2, sep=" ")')
141 ip.run_cell('prfunc_return_val = print(1,2, sep=" ")')
138 assert 'prfunc_return_val' in ip.user_ns
142 assert 'prfunc_return_val' in ip.user_ns
139 finally:
143 finally:
140 # Reset compiler flags so we don't mess up other tests.
144 # Reset compiler flags so we don't mess up other tests.
141 ip.compile.reset_compiler_flags()
145 ip.compile.reset_compiler_flags()
142
146
143 def test_future_unicode(self):
147 def test_future_unicode(self):
144 """Check that unicode_literals is imported from __future__ (gh #786)"""
148 """Check that unicode_literals is imported from __future__ (gh #786)"""
145 try:
149 try:
146 ip.run_cell(u'byte_str = "a"')
150 ip.run_cell(u'byte_str = "a"')
147 assert isinstance(ip.user_ns['byte_str'], str) # string literals are byte strings by default
151 assert isinstance(ip.user_ns['byte_str'], str) # string literals are byte strings by default
148 ip.run_cell('from __future__ import unicode_literals')
152 ip.run_cell('from __future__ import unicode_literals')
149 ip.run_cell(u'unicode_str = "a"')
153 ip.run_cell(u'unicode_str = "a"')
150 assert isinstance(ip.user_ns['unicode_str'], unicode_type) # strings literals are now unicode
154 assert isinstance(ip.user_ns['unicode_str'], unicode_type) # strings literals are now unicode
151 finally:
155 finally:
152 # Reset compiler flags so we don't mess up other tests.
156 # Reset compiler flags so we don't mess up other tests.
153 ip.compile.reset_compiler_flags()
157 ip.compile.reset_compiler_flags()
154
158
155 def test_can_pickle(self):
159 def test_can_pickle(self):
156 "Can we pickle objects defined interactively (GH-29)"
160 "Can we pickle objects defined interactively (GH-29)"
157 ip = get_ipython()
161 ip = get_ipython()
158 ip.reset()
162 ip.reset()
159 ip.run_cell(("class Mylist(list):\n"
163 ip.run_cell(("class Mylist(list):\n"
160 " def __init__(self,x=[]):\n"
164 " def __init__(self,x=[]):\n"
161 " list.__init__(self,x)"))
165 " list.__init__(self,x)"))
162 ip.run_cell("w=Mylist([1,2,3])")
166 ip.run_cell("w=Mylist([1,2,3])")
163
167
164 from pickle import dumps
168 from pickle import dumps
165
169
166 # We need to swap in our main module - this is only necessary
170 # We need to swap in our main module - this is only necessary
167 # inside the test framework, because IPython puts the interactive module
171 # inside the test framework, because IPython puts the interactive module
168 # in place (but the test framework undoes this).
172 # in place (but the test framework undoes this).
169 _main = sys.modules['__main__']
173 _main = sys.modules['__main__']
170 sys.modules['__main__'] = ip.user_module
174 sys.modules['__main__'] = ip.user_module
171 try:
175 try:
172 res = dumps(ip.user_ns["w"])
176 res = dumps(ip.user_ns["w"])
173 finally:
177 finally:
174 sys.modules['__main__'] = _main
178 sys.modules['__main__'] = _main
175 self.assertTrue(isinstance(res, bytes))
179 self.assertTrue(isinstance(res, bytes))
176
180
177 def test_global_ns(self):
181 def test_global_ns(self):
178 "Code in functions must be able to access variables outside them."
182 "Code in functions must be able to access variables outside them."
179 ip = get_ipython()
183 ip = get_ipython()
180 ip.run_cell("a = 10")
184 ip.run_cell("a = 10")
181 ip.run_cell(("def f(x):\n"
185 ip.run_cell(("def f(x):\n"
182 " return x + a"))
186 " return x + a"))
183 ip.run_cell("b = f(12)")
187 ip.run_cell("b = f(12)")
184 self.assertEqual(ip.user_ns["b"], 22)
188 self.assertEqual(ip.user_ns["b"], 22)
185
189
186 def test_bad_custom_tb(self):
190 def test_bad_custom_tb(self):
187 """Check that InteractiveShell is protected from bad custom exception handlers"""
191 """Check that InteractiveShell is protected from bad custom exception handlers"""
188 from IPython.utils import io
192 from IPython.utils import io
189 save_stderr = io.stderr
193 save_stderr = io.stderr
190 try:
194 try:
191 # capture stderr
195 # capture stderr
192 io.stderr = StringIO()
196 io.stderr = StringIO()
193 ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0)
197 ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0)
194 self.assertEqual(ip.custom_exceptions, (IOError,))
198 self.assertEqual(ip.custom_exceptions, (IOError,))
195 ip.run_cell(u'raise IOError("foo")')
199 ip.run_cell(u'raise IOError("foo")')
196 self.assertEqual(ip.custom_exceptions, ())
200 self.assertEqual(ip.custom_exceptions, ())
197 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
201 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
198 finally:
202 finally:
199 io.stderr = save_stderr
203 io.stderr = save_stderr
200
204
201 def test_bad_custom_tb_return(self):
205 def test_bad_custom_tb_return(self):
202 """Check that InteractiveShell is protected from bad return types in custom exception handlers"""
206 """Check that InteractiveShell is protected from bad return types in custom exception handlers"""
203 from IPython.utils import io
207 from IPython.utils import io
204 save_stderr = io.stderr
208 save_stderr = io.stderr
205 try:
209 try:
206 # capture stderr
210 # capture stderr
207 io.stderr = StringIO()
211 io.stderr = StringIO()
208 ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1)
212 ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1)
209 self.assertEqual(ip.custom_exceptions, (NameError,))
213 self.assertEqual(ip.custom_exceptions, (NameError,))
210 ip.run_cell(u'a=abracadabra')
214 ip.run_cell(u'a=abracadabra')
211 self.assertEqual(ip.custom_exceptions, ())
215 self.assertEqual(ip.custom_exceptions, ())
212 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
216 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
213 finally:
217 finally:
214 io.stderr = save_stderr
218 io.stderr = save_stderr
215
219
216 def test_drop_by_id(self):
220 def test_drop_by_id(self):
217 myvars = {"a":object(), "b":object(), "c": object()}
221 myvars = {"a":object(), "b":object(), "c": object()}
218 ip.push(myvars, interactive=False)
222 ip.push(myvars, interactive=False)
219 for name in myvars:
223 for name in myvars:
220 assert name in ip.user_ns, name
224 assert name in ip.user_ns, name
221 assert name in ip.user_ns_hidden, name
225 assert name in ip.user_ns_hidden, name
222 ip.user_ns['b'] = 12
226 ip.user_ns['b'] = 12
223 ip.drop_by_id(myvars)
227 ip.drop_by_id(myvars)
224 for name in ["a", "c"]:
228 for name in ["a", "c"]:
225 assert name not in ip.user_ns, name
229 assert name not in ip.user_ns, name
226 assert name not in ip.user_ns_hidden, name
230 assert name not in ip.user_ns_hidden, name
227 assert ip.user_ns['b'] == 12
231 assert ip.user_ns['b'] == 12
228 ip.reset()
232 ip.reset()
229
233
230 def test_var_expand(self):
234 def test_var_expand(self):
231 ip.user_ns['f'] = u'Ca\xf1o'
235 ip.user_ns['f'] = u'Ca\xf1o'
232 self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o')
236 self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o')
233 self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o')
237 self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o')
234 self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1')
238 self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1')
235 self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2')
239 self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2')
236
240
237 ip.user_ns['f'] = b'Ca\xc3\xb1o'
241 ip.user_ns['f'] = b'Ca\xc3\xb1o'
238 # This should not raise any exception:
242 # This should not raise any exception:
239 ip.var_expand(u'echo $f')
243 ip.var_expand(u'echo $f')
240
244
241 def test_var_expand_local(self):
245 def test_var_expand_local(self):
242 """Test local variable expansion in !system and %magic calls"""
246 """Test local variable expansion in !system and %magic calls"""
243 # !system
247 # !system
244 ip.run_cell('def test():\n'
248 ip.run_cell('def test():\n'
245 ' lvar = "ttt"\n'
249 ' lvar = "ttt"\n'
246 ' ret = !echo {lvar}\n'
250 ' ret = !echo {lvar}\n'
247 ' return ret[0]\n')
251 ' return ret[0]\n')
248 res = ip.user_ns['test']()
252 res = ip.user_ns['test']()
249 nt.assert_in('ttt', res)
253 nt.assert_in('ttt', res)
250
254
251 # %magic
255 # %magic
252 ip.run_cell('def makemacro():\n'
256 ip.run_cell('def makemacro():\n'
253 ' macroname = "macro_var_expand_locals"\n'
257 ' macroname = "macro_var_expand_locals"\n'
254 ' %macro {macroname} codestr\n')
258 ' %macro {macroname} codestr\n')
255 ip.user_ns['codestr'] = "str(12)"
259 ip.user_ns['codestr'] = "str(12)"
256 ip.run_cell('makemacro()')
260 ip.run_cell('makemacro()')
257 nt.assert_in('macro_var_expand_locals', ip.user_ns)
261 nt.assert_in('macro_var_expand_locals', ip.user_ns)
258
262
259 def test_var_expand_self(self):
263 def test_var_expand_self(self):
260 """Test variable expansion with the name 'self', which was failing.
264 """Test variable expansion with the name 'self', which was failing.
261
265
262 See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218
266 See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218
263 """
267 """
264 ip.run_cell('class cTest:\n'
268 ip.run_cell('class cTest:\n'
265 ' classvar="see me"\n'
269 ' classvar="see me"\n'
266 ' def test(self):\n'
270 ' def test(self):\n'
267 ' res = !echo Variable: {self.classvar}\n'
271 ' res = !echo Variable: {self.classvar}\n'
268 ' return res[0]\n')
272 ' return res[0]\n')
269 nt.assert_in('see me', ip.user_ns['cTest']().test())
273 nt.assert_in('see me', ip.user_ns['cTest']().test())
270
274
271 def test_bad_var_expand(self):
275 def test_bad_var_expand(self):
272 """var_expand on invalid formats shouldn't raise"""
276 """var_expand on invalid formats shouldn't raise"""
273 # SyntaxError
277 # SyntaxError
274 self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}")
278 self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}")
275 # NameError
279 # NameError
276 self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}")
280 self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}")
277 # ZeroDivisionError
281 # ZeroDivisionError
278 self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}")
282 self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}")
279
283
280 def test_silent_nopostexec(self):
284 def test_silent_postexec(self):
281 """run_cell(silent=True) doesn't invoke post-exec funcs"""
285 """run_cell(silent=True) doesn't invoke pre/post_execute_explicit callbacks"""
282 d = dict(called=False)
286 pre_explicit = mock.Mock()
283 def set_called():
287 pre_always = mock.Mock()
284 d['called'] = True
288 post_explicit = mock.Mock()
289 post_always = mock.Mock()
285
290
286 ip.register_post_execute(set_called)
291 ip.callbacks.register('pre_execute_explicit', pre_explicit)
287 ip.run_cell("1", silent=True)
292 ip.callbacks.register('pre_execute', pre_always)
288 self.assertFalse(d['called'])
293 ip.callbacks.register('post_execute_explicit', post_explicit)
289 # double-check that non-silent exec did what we expected
294 ip.callbacks.register('post_execute', post_always)
290 # silent to avoid
295
291 ip.run_cell("1")
296 try:
292 self.assertTrue(d['called'])
297 ip.run_cell("1", silent=True)
293 # remove post-exec
298 assert pre_always.called
294 ip._post_execute.pop(set_called)
299 assert not pre_explicit.called
300 assert post_always.called
301 assert not post_explicit.called
302 # double-check that non-silent exec did what we expected
303 # silent to avoid
304 ip.run_cell("1")
305 assert pre_explicit.called
306 assert post_explicit.called
307 finally:
308 # remove post-exec
309 ip.callbacks.reset_all()
295
310
296 def test_silent_noadvance(self):
311 def test_silent_noadvance(self):
297 """run_cell(silent=True) doesn't advance execution_count"""
312 """run_cell(silent=True) doesn't advance execution_count"""
298 ec = ip.execution_count
313 ec = ip.execution_count
299 # silent should force store_history=False
314 # silent should force store_history=False
300 ip.run_cell("1", store_history=True, silent=True)
315 ip.run_cell("1", store_history=True, silent=True)
301
316
302 self.assertEqual(ec, ip.execution_count)
317 self.assertEqual(ec, ip.execution_count)
303 # double-check that non-silent exec did what we expected
318 # double-check that non-silent exec did what we expected
304 # silent to avoid
319 # silent to avoid
305 ip.run_cell("1", store_history=True)
320 ip.run_cell("1", store_history=True)
306 self.assertEqual(ec+1, ip.execution_count)
321 self.assertEqual(ec+1, ip.execution_count)
307
322
308 def test_silent_nodisplayhook(self):
323 def test_silent_nodisplayhook(self):
309 """run_cell(silent=True) doesn't trigger displayhook"""
324 """run_cell(silent=True) doesn't trigger displayhook"""
310 d = dict(called=False)
325 d = dict(called=False)
311
326
312 trap = ip.display_trap
327 trap = ip.display_trap
313 save_hook = trap.hook
328 save_hook = trap.hook
314
329
315 def failing_hook(*args, **kwargs):
330 def failing_hook(*args, **kwargs):
316 d['called'] = True
331 d['called'] = True
317
332
318 try:
333 try:
319 trap.hook = failing_hook
334 trap.hook = failing_hook
320 ip.run_cell("1", silent=True)
335 ip.run_cell("1", silent=True)
321 self.assertFalse(d['called'])
336 self.assertFalse(d['called'])
322 # double-check that non-silent exec did what we expected
337 # double-check that non-silent exec did what we expected
323 # silent to avoid
338 # silent to avoid
324 ip.run_cell("1")
339 ip.run_cell("1")
325 self.assertTrue(d['called'])
340 self.assertTrue(d['called'])
326 finally:
341 finally:
327 trap.hook = save_hook
342 trap.hook = save_hook
328
343
329 @skipif(sys.version_info[0] >= 3, "softspace removed in py3")
344 @skipif(sys.version_info[0] >= 3, "softspace removed in py3")
330 def test_print_softspace(self):
345 def test_print_softspace(self):
331 """Verify that softspace is handled correctly when executing multiple
346 """Verify that softspace is handled correctly when executing multiple
332 statements.
347 statements.
333
348
334 In [1]: print 1; print 2
349 In [1]: print 1; print 2
335 1
350 1
336 2
351 2
337
352
338 In [2]: print 1,; print 2
353 In [2]: print 1,; print 2
339 1 2
354 1 2
340 """
355 """
341
356
342 def test_ofind_line_magic(self):
357 def test_ofind_line_magic(self):
343 from IPython.core.magic import register_line_magic
358 from IPython.core.magic import register_line_magic
344
359
345 @register_line_magic
360 @register_line_magic
346 def lmagic(line):
361 def lmagic(line):
347 "A line magic"
362 "A line magic"
348
363
349 # Get info on line magic
364 # Get info on line magic
350 lfind = ip._ofind('lmagic')
365 lfind = ip._ofind('lmagic')
351 info = dict(found=True, isalias=False, ismagic=True,
366 info = dict(found=True, isalias=False, ismagic=True,
352 namespace = 'IPython internal', obj= lmagic.__wrapped__,
367 namespace = 'IPython internal', obj= lmagic.__wrapped__,
353 parent = None)
368 parent = None)
354 nt.assert_equal(lfind, info)
369 nt.assert_equal(lfind, info)
355
370
356 def test_ofind_cell_magic(self):
371 def test_ofind_cell_magic(self):
357 from IPython.core.magic import register_cell_magic
372 from IPython.core.magic import register_cell_magic
358
373
359 @register_cell_magic
374 @register_cell_magic
360 def cmagic(line, cell):
375 def cmagic(line, cell):
361 "A cell magic"
376 "A cell magic"
362
377
363 # Get info on cell magic
378 # Get info on cell magic
364 find = ip._ofind('cmagic')
379 find = ip._ofind('cmagic')
365 info = dict(found=True, isalias=False, ismagic=True,
380 info = dict(found=True, isalias=False, ismagic=True,
366 namespace = 'IPython internal', obj= cmagic.__wrapped__,
381 namespace = 'IPython internal', obj= cmagic.__wrapped__,
367 parent = None)
382 parent = None)
368 nt.assert_equal(find, info)
383 nt.assert_equal(find, info)
369
384
370 def test_custom_exception(self):
385 def test_custom_exception(self):
371 called = []
386 called = []
372 def my_handler(shell, etype, value, tb, tb_offset=None):
387 def my_handler(shell, etype, value, tb, tb_offset=None):
373 called.append(etype)
388 called.append(etype)
374 shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
389 shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
375
390
376 ip.set_custom_exc((ValueError,), my_handler)
391 ip.set_custom_exc((ValueError,), my_handler)
377 try:
392 try:
378 ip.run_cell("raise ValueError('test')")
393 ip.run_cell("raise ValueError('test')")
379 # Check that this was called, and only once.
394 # Check that this was called, and only once.
380 self.assertEqual(called, [ValueError])
395 self.assertEqual(called, [ValueError])
381 finally:
396 finally:
382 # Reset the custom exception hook
397 # Reset the custom exception hook
383 ip.set_custom_exc((), None)
398 ip.set_custom_exc((), None)
384
399
385 @skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
400 @skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
386 def test_future_environment(self):
401 def test_future_environment(self):
387 "Can we run code with & without the shell's __future__ imports?"
402 "Can we run code with & without the shell's __future__ imports?"
388 ip.run_cell("from __future__ import division")
403 ip.run_cell("from __future__ import division")
389 ip.run_cell("a = 1/2", shell_futures=True)
404 ip.run_cell("a = 1/2", shell_futures=True)
390 self.assertEqual(ip.user_ns['a'], 0.5)
405 self.assertEqual(ip.user_ns['a'], 0.5)
391 ip.run_cell("b = 1/2", shell_futures=False)
406 ip.run_cell("b = 1/2", shell_futures=False)
392 self.assertEqual(ip.user_ns['b'], 0)
407 self.assertEqual(ip.user_ns['b'], 0)
393
408
394 ip.compile.reset_compiler_flags()
409 ip.compile.reset_compiler_flags()
395 # This shouldn't leak to the shell's compiler
410 # This shouldn't leak to the shell's compiler
396 ip.run_cell("from __future__ import division \nc=1/2", shell_futures=False)
411 ip.run_cell("from __future__ import division \nc=1/2", shell_futures=False)
397 self.assertEqual(ip.user_ns['c'], 0.5)
412 self.assertEqual(ip.user_ns['c'], 0.5)
398 ip.run_cell("d = 1/2", shell_futures=True)
413 ip.run_cell("d = 1/2", shell_futures=True)
399 self.assertEqual(ip.user_ns['d'], 0)
414 self.assertEqual(ip.user_ns['d'], 0)
400
415
401
416
402 class TestSafeExecfileNonAsciiPath(unittest.TestCase):
417 class TestSafeExecfileNonAsciiPath(unittest.TestCase):
403
418
404 @onlyif_unicode_paths
419 @onlyif_unicode_paths
405 def setUp(self):
420 def setUp(self):
406 self.BASETESTDIR = tempfile.mkdtemp()
421 self.BASETESTDIR = tempfile.mkdtemp()
407 self.TESTDIR = join(self.BASETESTDIR, u"Γ₯Àâ")
422 self.TESTDIR = join(self.BASETESTDIR, u"Γ₯Àâ")
408 os.mkdir(self.TESTDIR)
423 os.mkdir(self.TESTDIR)
409 with open(join(self.TESTDIR, u"Γ₯Àâtestscript.py"), "w") as sfile:
424 with open(join(self.TESTDIR, u"Γ₯Àâtestscript.py"), "w") as sfile:
410 sfile.write("pass\n")
425 sfile.write("pass\n")
411 self.oldpath = py3compat.getcwd()
426 self.oldpath = py3compat.getcwd()
412 os.chdir(self.TESTDIR)
427 os.chdir(self.TESTDIR)
413 self.fname = u"Γ₯Àâtestscript.py"
428 self.fname = u"Γ₯Àâtestscript.py"
414
429
415 def tearDown(self):
430 def tearDown(self):
416 os.chdir(self.oldpath)
431 os.chdir(self.oldpath)
417 shutil.rmtree(self.BASETESTDIR)
432 shutil.rmtree(self.BASETESTDIR)
418
433
419 @onlyif_unicode_paths
434 @onlyif_unicode_paths
420 def test_1(self):
435 def test_1(self):
421 """Test safe_execfile with non-ascii path
436 """Test safe_execfile with non-ascii path
422 """
437 """
423 ip.safe_execfile(self.fname, {}, raise_exceptions=True)
438 ip.safe_execfile(self.fname, {}, raise_exceptions=True)
424
439
425 class ExitCodeChecks(tt.TempFileMixin):
440 class ExitCodeChecks(tt.TempFileMixin):
426 def test_exit_code_ok(self):
441 def test_exit_code_ok(self):
427 self.system('exit 0')
442 self.system('exit 0')
428 self.assertEqual(ip.user_ns['_exit_code'], 0)
443 self.assertEqual(ip.user_ns['_exit_code'], 0)
429
444
430 def test_exit_code_error(self):
445 def test_exit_code_error(self):
431 self.system('exit 1')
446 self.system('exit 1')
432 self.assertEqual(ip.user_ns['_exit_code'], 1)
447 self.assertEqual(ip.user_ns['_exit_code'], 1)
433
448
434 @skipif(not hasattr(signal, 'SIGALRM'))
449 @skipif(not hasattr(signal, 'SIGALRM'))
435 def test_exit_code_signal(self):
450 def test_exit_code_signal(self):
436 self.mktmp("import signal, time\n"
451 self.mktmp("import signal, time\n"
437 "signal.setitimer(signal.ITIMER_REAL, 0.1)\n"
452 "signal.setitimer(signal.ITIMER_REAL, 0.1)\n"
438 "time.sleep(1)\n")
453 "time.sleep(1)\n")
439 self.system("%s %s" % (sys.executable, self.fname))
454 self.system("%s %s" % (sys.executable, self.fname))
440 self.assertEqual(ip.user_ns['_exit_code'], -signal.SIGALRM)
455 self.assertEqual(ip.user_ns['_exit_code'], -signal.SIGALRM)
441
456
442 class TestSystemRaw(unittest.TestCase, ExitCodeChecks):
457 class TestSystemRaw(unittest.TestCase, ExitCodeChecks):
443 system = ip.system_raw
458 system = ip.system_raw
444
459
445 @onlyif_unicode_paths
460 @onlyif_unicode_paths
446 def test_1(self):
461 def test_1(self):
447 """Test system_raw with non-ascii cmd
462 """Test system_raw with non-ascii cmd
448 """
463 """
449 cmd = u'''python -c "'Γ₯Àâ'" '''
464 cmd = u'''python -c "'Γ₯Àâ'" '''
450 ip.system_raw(cmd)
465 ip.system_raw(cmd)
451
466
452 # TODO: Exit codes are currently ignored on Windows.
467 # TODO: Exit codes are currently ignored on Windows.
453 class TestSystemPipedExitCode(unittest.TestCase, ExitCodeChecks):
468 class TestSystemPipedExitCode(unittest.TestCase, ExitCodeChecks):
454 system = ip.system_piped
469 system = ip.system_piped
455
470
456 @skip_win32
471 @skip_win32
457 def test_exit_code_ok(self):
472 def test_exit_code_ok(self):
458 ExitCodeChecks.test_exit_code_ok(self)
473 ExitCodeChecks.test_exit_code_ok(self)
459
474
460 @skip_win32
475 @skip_win32
461 def test_exit_code_error(self):
476 def test_exit_code_error(self):
462 ExitCodeChecks.test_exit_code_error(self)
477 ExitCodeChecks.test_exit_code_error(self)
463
478
464 @skip_win32
479 @skip_win32
465 def test_exit_code_signal(self):
480 def test_exit_code_signal(self):
466 ExitCodeChecks.test_exit_code_signal(self)
481 ExitCodeChecks.test_exit_code_signal(self)
467
482
468 class TestModules(unittest.TestCase, tt.TempFileMixin):
483 class TestModules(unittest.TestCase, tt.TempFileMixin):
469 def test_extraneous_loads(self):
484 def test_extraneous_loads(self):
470 """Test we're not loading modules on startup that we shouldn't.
485 """Test we're not loading modules on startup that we shouldn't.
471 """
486 """
472 self.mktmp("import sys\n"
487 self.mktmp("import sys\n"
473 "print('numpy' in sys.modules)\n"
488 "print('numpy' in sys.modules)\n"
474 "print('IPython.parallel' in sys.modules)\n"
489 "print('IPython.parallel' in sys.modules)\n"
475 "print('IPython.kernel.zmq' in sys.modules)\n"
490 "print('IPython.kernel.zmq' in sys.modules)\n"
476 )
491 )
477 out = "False\nFalse\nFalse\n"
492 out = "False\nFalse\nFalse\n"
478 tt.ipexec_validate(self.fname, out)
493 tt.ipexec_validate(self.fname, out)
479
494
480 class Negator(ast.NodeTransformer):
495 class Negator(ast.NodeTransformer):
481 """Negates all number literals in an AST."""
496 """Negates all number literals in an AST."""
482 def visit_Num(self, node):
497 def visit_Num(self, node):
483 node.n = -node.n
498 node.n = -node.n
484 return node
499 return node
485
500
486 class TestAstTransform(unittest.TestCase):
501 class TestAstTransform(unittest.TestCase):
487 def setUp(self):
502 def setUp(self):
488 self.negator = Negator()
503 self.negator = Negator()
489 ip.ast_transformers.append(self.negator)
504 ip.ast_transformers.append(self.negator)
490
505
491 def tearDown(self):
506 def tearDown(self):
492 ip.ast_transformers.remove(self.negator)
507 ip.ast_transformers.remove(self.negator)
493
508
494 def test_run_cell(self):
509 def test_run_cell(self):
495 with tt.AssertPrints('-34'):
510 with tt.AssertPrints('-34'):
496 ip.run_cell('print (12 + 22)')
511 ip.run_cell('print (12 + 22)')
497
512
498 # A named reference to a number shouldn't be transformed.
513 # A named reference to a number shouldn't be transformed.
499 ip.user_ns['n'] = 55
514 ip.user_ns['n'] = 55
500 with tt.AssertNotPrints('-55'):
515 with tt.AssertNotPrints('-55'):
501 ip.run_cell('print (n)')
516 ip.run_cell('print (n)')
502
517
503 def test_timeit(self):
518 def test_timeit(self):
504 called = set()
519 called = set()
505 def f(x):
520 def f(x):
506 called.add(x)
521 called.add(x)
507 ip.push({'f':f})
522 ip.push({'f':f})
508
523
509 with tt.AssertPrints("best of "):
524 with tt.AssertPrints("best of "):
510 ip.run_line_magic("timeit", "-n1 f(1)")
525 ip.run_line_magic("timeit", "-n1 f(1)")
511 self.assertEqual(called, set([-1]))
526 self.assertEqual(called, set([-1]))
512 called.clear()
527 called.clear()
513
528
514 with tt.AssertPrints("best of "):
529 with tt.AssertPrints("best of "):
515 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
530 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
516 self.assertEqual(called, set([-2, -3]))
531 self.assertEqual(called, set([-2, -3]))
517
532
518 def test_time(self):
533 def test_time(self):
519 called = []
534 called = []
520 def f(x):
535 def f(x):
521 called.append(x)
536 called.append(x)
522 ip.push({'f':f})
537 ip.push({'f':f})
523
538
524 # Test with an expression
539 # Test with an expression
525 with tt.AssertPrints("Wall time: "):
540 with tt.AssertPrints("Wall time: "):
526 ip.run_line_magic("time", "f(5+9)")
541 ip.run_line_magic("time", "f(5+9)")
527 self.assertEqual(called, [-14])
542 self.assertEqual(called, [-14])
528 called[:] = []
543 called[:] = []
529
544
530 # Test with a statement (different code path)
545 # Test with a statement (different code path)
531 with tt.AssertPrints("Wall time: "):
546 with tt.AssertPrints("Wall time: "):
532 ip.run_line_magic("time", "a = f(-3 + -2)")
547 ip.run_line_magic("time", "a = f(-3 + -2)")
533 self.assertEqual(called, [5])
548 self.assertEqual(called, [5])
534
549
535 def test_macro(self):
550 def test_macro(self):
536 ip.push({'a':10})
551 ip.push({'a':10})
537 # The AST transformation makes this do a+=-1
552 # The AST transformation makes this do a+=-1
538 ip.define_macro("amacro", "a+=1\nprint(a)")
553 ip.define_macro("amacro", "a+=1\nprint(a)")
539
554
540 with tt.AssertPrints("9"):
555 with tt.AssertPrints("9"):
541 ip.run_cell("amacro")
556 ip.run_cell("amacro")
542 with tt.AssertPrints("8"):
557 with tt.AssertPrints("8"):
543 ip.run_cell("amacro")
558 ip.run_cell("amacro")
544
559
545 class IntegerWrapper(ast.NodeTransformer):
560 class IntegerWrapper(ast.NodeTransformer):
546 """Wraps all integers in a call to Integer()"""
561 """Wraps all integers in a call to Integer()"""
547 def visit_Num(self, node):
562 def visit_Num(self, node):
548 if isinstance(node.n, int):
563 if isinstance(node.n, int):
549 return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()),
564 return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()),
550 args=[node], keywords=[])
565 args=[node], keywords=[])
551 return node
566 return node
552
567
553 class TestAstTransform2(unittest.TestCase):
568 class TestAstTransform2(unittest.TestCase):
554 def setUp(self):
569 def setUp(self):
555 self.intwrapper = IntegerWrapper()
570 self.intwrapper = IntegerWrapper()
556 ip.ast_transformers.append(self.intwrapper)
571 ip.ast_transformers.append(self.intwrapper)
557
572
558 self.calls = []
573 self.calls = []
559 def Integer(*args):
574 def Integer(*args):
560 self.calls.append(args)
575 self.calls.append(args)
561 return args
576 return args
562 ip.push({"Integer": Integer})
577 ip.push({"Integer": Integer})
563
578
564 def tearDown(self):
579 def tearDown(self):
565 ip.ast_transformers.remove(self.intwrapper)
580 ip.ast_transformers.remove(self.intwrapper)
566 del ip.user_ns['Integer']
581 del ip.user_ns['Integer']
567
582
568 def test_run_cell(self):
583 def test_run_cell(self):
569 ip.run_cell("n = 2")
584 ip.run_cell("n = 2")
570 self.assertEqual(self.calls, [(2,)])
585 self.assertEqual(self.calls, [(2,)])
571
586
572 # This shouldn't throw an error
587 # This shouldn't throw an error
573 ip.run_cell("o = 2.0")
588 ip.run_cell("o = 2.0")
574 self.assertEqual(ip.user_ns['o'], 2.0)
589 self.assertEqual(ip.user_ns['o'], 2.0)
575
590
576 def test_timeit(self):
591 def test_timeit(self):
577 called = set()
592 called = set()
578 def f(x):
593 def f(x):
579 called.add(x)
594 called.add(x)
580 ip.push({'f':f})
595 ip.push({'f':f})
581
596
582 with tt.AssertPrints("best of "):
597 with tt.AssertPrints("best of "):
583 ip.run_line_magic("timeit", "-n1 f(1)")
598 ip.run_line_magic("timeit", "-n1 f(1)")
584 self.assertEqual(called, set([(1,)]))
599 self.assertEqual(called, set([(1,)]))
585 called.clear()
600 called.clear()
586
601
587 with tt.AssertPrints("best of "):
602 with tt.AssertPrints("best of "):
588 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
603 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
589 self.assertEqual(called, set([(2,), (3,)]))
604 self.assertEqual(called, set([(2,), (3,)]))
590
605
591 class ErrorTransformer(ast.NodeTransformer):
606 class ErrorTransformer(ast.NodeTransformer):
592 """Throws an error when it sees a number."""
607 """Throws an error when it sees a number."""
593 def visit_Num(self):
608 def visit_Num(self):
594 raise ValueError("test")
609 raise ValueError("test")
595
610
596 class TestAstTransformError(unittest.TestCase):
611 class TestAstTransformError(unittest.TestCase):
597 def test_unregistering(self):
612 def test_unregistering(self):
598 err_transformer = ErrorTransformer()
613 err_transformer = ErrorTransformer()
599 ip.ast_transformers.append(err_transformer)
614 ip.ast_transformers.append(err_transformer)
600
615
601 with tt.AssertPrints("unregister", channel='stderr'):
616 with tt.AssertPrints("unregister", channel='stderr'):
602 ip.run_cell("1 + 2")
617 ip.run_cell("1 + 2")
603
618
604 # This should have been removed.
619 # This should have been removed.
605 nt.assert_not_in(err_transformer, ip.ast_transformers)
620 nt.assert_not_in(err_transformer, ip.ast_transformers)
606
621
607 def test__IPYTHON__():
622 def test__IPYTHON__():
608 # This shouldn't raise a NameError, that's all
623 # This shouldn't raise a NameError, that's all
609 __IPYTHON__
624 __IPYTHON__
610
625
611
626
612 class DummyRepr(object):
627 class DummyRepr(object):
613 def __repr__(self):
628 def __repr__(self):
614 return "DummyRepr"
629 return "DummyRepr"
615
630
616 def _repr_html_(self):
631 def _repr_html_(self):
617 return "<b>dummy</b>"
632 return "<b>dummy</b>"
618
633
619 def _repr_javascript_(self):
634 def _repr_javascript_(self):
620 return "console.log('hi');", {'key': 'value'}
635 return "console.log('hi');", {'key': 'value'}
621
636
622
637
623 def test_user_variables():
638 def test_user_variables():
624 # enable all formatters
639 # enable all formatters
625 ip.display_formatter.active_types = ip.display_formatter.format_types
640 ip.display_formatter.active_types = ip.display_formatter.format_types
626
641
627 ip.user_ns['dummy'] = d = DummyRepr()
642 ip.user_ns['dummy'] = d = DummyRepr()
628 keys = set(['dummy', 'doesnotexist'])
643 keys = set(['dummy', 'doesnotexist'])
629 r = ip.user_variables(keys)
644 r = ip.user_variables(keys)
630
645
631 nt.assert_equal(keys, set(r.keys()))
646 nt.assert_equal(keys, set(r.keys()))
632 dummy = r['dummy']
647 dummy = r['dummy']
633 nt.assert_equal(set(['status', 'data', 'metadata']), set(dummy.keys()))
648 nt.assert_equal(set(['status', 'data', 'metadata']), set(dummy.keys()))
634 nt.assert_equal(dummy['status'], 'ok')
649 nt.assert_equal(dummy['status'], 'ok')
635 data = dummy['data']
650 data = dummy['data']
636 metadata = dummy['metadata']
651 metadata = dummy['metadata']
637 nt.assert_equal(data.get('text/html'), d._repr_html_())
652 nt.assert_equal(data.get('text/html'), d._repr_html_())
638 js, jsmd = d._repr_javascript_()
653 js, jsmd = d._repr_javascript_()
639 nt.assert_equal(data.get('application/javascript'), js)
654 nt.assert_equal(data.get('application/javascript'), js)
640 nt.assert_equal(metadata.get('application/javascript'), jsmd)
655 nt.assert_equal(metadata.get('application/javascript'), jsmd)
641
656
642 dne = r['doesnotexist']
657 dne = r['doesnotexist']
643 nt.assert_equal(dne['status'], 'error')
658 nt.assert_equal(dne['status'], 'error')
644 nt.assert_equal(dne['ename'], 'KeyError')
659 nt.assert_equal(dne['ename'], 'KeyError')
645
660
646 # back to text only
661 # back to text only
647 ip.display_formatter.active_types = ['text/plain']
662 ip.display_formatter.active_types = ['text/plain']
648
663
649 def test_user_expression():
664 def test_user_expression():
650 # enable all formatters
665 # enable all formatters
651 ip.display_formatter.active_types = ip.display_formatter.format_types
666 ip.display_formatter.active_types = ip.display_formatter.format_types
652 query = {
667 query = {
653 'a' : '1 + 2',
668 'a' : '1 + 2',
654 'b' : '1/0',
669 'b' : '1/0',
655 }
670 }
656 r = ip.user_expressions(query)
671 r = ip.user_expressions(query)
657 import pprint
672 import pprint
658 pprint.pprint(r)
673 pprint.pprint(r)
659 nt.assert_equal(set(r.keys()), set(query.keys()))
674 nt.assert_equal(set(r.keys()), set(query.keys()))
660 a = r['a']
675 a = r['a']
661 nt.assert_equal(set(['status', 'data', 'metadata']), set(a.keys()))
676 nt.assert_equal(set(['status', 'data', 'metadata']), set(a.keys()))
662 nt.assert_equal(a['status'], 'ok')
677 nt.assert_equal(a['status'], 'ok')
663 data = a['data']
678 data = a['data']
664 metadata = a['metadata']
679 metadata = a['metadata']
665 nt.assert_equal(data.get('text/plain'), '3')
680 nt.assert_equal(data.get('text/plain'), '3')
666
681
667 b = r['b']
682 b = r['b']
668 nt.assert_equal(b['status'], 'error')
683 nt.assert_equal(b['status'], 'error')
669 nt.assert_equal(b['ename'], 'ZeroDivisionError')
684 nt.assert_equal(b['ename'], 'ZeroDivisionError')
670
685
671 # back to text only
686 # back to text only
672 ip.display_formatter.active_types = ['text/plain']
687 ip.display_formatter.active_types = ['text/plain']
673
688
674
689
675
690
676
691
677
692
678 class TestSyntaxErrorTransformer(unittest.TestCase):
693 class TestSyntaxErrorTransformer(unittest.TestCase):
679 """Check that SyntaxError raised by an input transformer is handled by run_cell()"""
694 """Check that SyntaxError raised by an input transformer is handled by run_cell()"""
680
695
681 class SyntaxErrorTransformer(InputTransformer):
696 class SyntaxErrorTransformer(InputTransformer):
682
697
683 def push(self, line):
698 def push(self, line):
684 pos = line.find('syntaxerror')
699 pos = line.find('syntaxerror')
685 if pos >= 0:
700 if pos >= 0:
686 e = SyntaxError('input contains "syntaxerror"')
701 e = SyntaxError('input contains "syntaxerror"')
687 e.text = line
702 e.text = line
688 e.offset = pos + 1
703 e.offset = pos + 1
689 raise e
704 raise e
690 return line
705 return line
691
706
692 def reset(self):
707 def reset(self):
693 pass
708 pass
694
709
695 def setUp(self):
710 def setUp(self):
696 self.transformer = TestSyntaxErrorTransformer.SyntaxErrorTransformer()
711 self.transformer = TestSyntaxErrorTransformer.SyntaxErrorTransformer()
697 ip.input_splitter.python_line_transforms.append(self.transformer)
712 ip.input_splitter.python_line_transforms.append(self.transformer)
698 ip.input_transformer_manager.python_line_transforms.append(self.transformer)
713 ip.input_transformer_manager.python_line_transforms.append(self.transformer)
699
714
700 def tearDown(self):
715 def tearDown(self):
701 ip.input_splitter.python_line_transforms.remove(self.transformer)
716 ip.input_splitter.python_line_transforms.remove(self.transformer)
702 ip.input_transformer_manager.python_line_transforms.remove(self.transformer)
717 ip.input_transformer_manager.python_line_transforms.remove(self.transformer)
703
718
704 def test_syntaxerror_input_transformer(self):
719 def test_syntaxerror_input_transformer(self):
705 with tt.AssertPrints('1234'):
720 with tt.AssertPrints('1234'):
706 ip.run_cell('1234')
721 ip.run_cell('1234')
707 with tt.AssertPrints('SyntaxError: invalid syntax'):
722 with tt.AssertPrints('SyntaxError: invalid syntax'):
708 ip.run_cell('1 2 3') # plain python syntax error
723 ip.run_cell('1 2 3') # plain python syntax error
709 with tt.AssertPrints('SyntaxError: input contains "syntaxerror"'):
724 with tt.AssertPrints('SyntaxError: input contains "syntaxerror"'):
710 ip.run_cell('2345 # syntaxerror') # input transformer syntax error
725 ip.run_cell('2345 # syntaxerror') # input transformer syntax error
711 with tt.AssertPrints('3456'):
726 with tt.AssertPrints('3456'):
712 ip.run_cell('3456')
727 ip.run_cell('3456')
713
728
714
729
715
730
@@ -1,140 +1,142 b''
1 """Base class for a Comm"""
1 """Base class for a Comm"""
2
2
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (C) 2013 The IPython Development Team
4 # Copyright (C) 2013 The IPython Development Team
5 #
5 #
6 # Distributed under the terms of the BSD License. The full license is in
6 # Distributed under the terms of the BSD License. The full license is in
7 # the file COPYING, distributed as part of this software.
7 # the file COPYING, distributed as part of this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Imports
11 # Imports
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 import uuid
14 import uuid
15
15
16 from IPython.config import LoggingConfigurable
16 from IPython.config import LoggingConfigurable
17 from IPython.core.getipython import get_ipython
17 from IPython.core.getipython import get_ipython
18
18
19 from IPython.utils.traitlets import Instance, Unicode, Bytes, Bool, Dict, Any
19 from IPython.utils.traitlets import Instance, Unicode, Bytes, Bool, Dict, Any
20
20
21 #-----------------------------------------------------------------------------
21 #-----------------------------------------------------------------------------
22 # Code
22 # Code
23 #-----------------------------------------------------------------------------
23 #-----------------------------------------------------------------------------
24
24
25 class Comm(LoggingConfigurable):
25 class Comm(LoggingConfigurable):
26
26
27 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
27 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
28 def _shell_default(self):
28 def _shell_default(self):
29 return get_ipython()
29 return get_ipython()
30
30
31 iopub_socket = Any()
31 iopub_socket = Any()
32 def _iopub_socket_default(self):
32 def _iopub_socket_default(self):
33 return self.shell.kernel.iopub_socket
33 return self.shell.kernel.iopub_socket
34 session = Instance('IPython.kernel.zmq.session.Session')
34 session = Instance('IPython.kernel.zmq.session.Session')
35 def _session_default(self):
35 def _session_default(self):
36 if self.shell is None:
36 if self.shell is None:
37 return
37 return
38 return self.shell.kernel.session
38 return self.shell.kernel.session
39
39
40 target_name = Unicode('comm')
40 target_name = Unicode('comm')
41
41
42 topic = Bytes()
42 topic = Bytes()
43 def _topic_default(self):
43 def _topic_default(self):
44 return ('comm-%s' % self.comm_id).encode('ascii')
44 return ('comm-%s' % self.comm_id).encode('ascii')
45
45
46 _open_data = Dict(help="data dict, if any, to be included in comm_open")
46 _open_data = Dict(help="data dict, if any, to be included in comm_open")
47 _close_data = Dict(help="data dict, if any, to be included in comm_close")
47 _close_data = Dict(help="data dict, if any, to be included in comm_close")
48
48
49 _msg_callback = Any()
49 _msg_callback = Any()
50 _close_callback = Any()
50 _close_callback = Any()
51
51
52 _closed = Bool(False)
52 _closed = Bool(False)
53 comm_id = Unicode()
53 comm_id = Unicode()
54 def _comm_id_default(self):
54 def _comm_id_default(self):
55 return uuid.uuid4().hex
55 return uuid.uuid4().hex
56
56
57 primary = Bool(True, help="Am I the primary or secondary Comm?")
57 primary = Bool(True, help="Am I the primary or secondary Comm?")
58
58
59 def __init__(self, target_name='', data=None, **kwargs):
59 def __init__(self, target_name='', data=None, **kwargs):
60 if target_name:
60 if target_name:
61 kwargs['target_name'] = target_name
61 kwargs['target_name'] = target_name
62 super(Comm, self).__init__(**kwargs)
62 super(Comm, self).__init__(**kwargs)
63 get_ipython().comm_manager.register_comm(self)
63 get_ipython().comm_manager.register_comm(self)
64 if self.primary:
64 if self.primary:
65 # I am primary, open my peer.
65 # I am primary, open my peer.
66 self.open(data)
66 self.open(data)
67
67
68 def _publish_msg(self, msg_type, data=None, metadata=None, **keys):
68 def _publish_msg(self, msg_type, data=None, metadata=None, **keys):
69 """Helper for sending a comm message on IOPub"""
69 """Helper for sending a comm message on IOPub"""
70 data = {} if data is None else data
70 data = {} if data is None else data
71 metadata = {} if metadata is None else metadata
71 metadata = {} if metadata is None else metadata
72 self.session.send(self.iopub_socket, msg_type,
72 self.session.send(self.iopub_socket, msg_type,
73 dict(data=data, comm_id=self.comm_id, **keys),
73 dict(data=data, comm_id=self.comm_id, **keys),
74 metadata=metadata,
74 metadata=metadata,
75 parent=self.shell.get_parent(),
75 parent=self.shell.get_parent(),
76 ident=self.topic,
76 ident=self.topic,
77 )
77 )
78
78
79 def __del__(self):
79 def __del__(self):
80 """trigger close on gc"""
80 """trigger close on gc"""
81 self.close()
81 self.close()
82
82
83 # publishing messages
83 # publishing messages
84
84
85 def open(self, data=None, metadata=None):
85 def open(self, data=None, metadata=None):
86 """Open the frontend-side version of this comm"""
86 """Open the frontend-side version of this comm"""
87 if data is None:
87 if data is None:
88 data = self._open_data
88 data = self._open_data
89 self._publish_msg('comm_open', data, metadata, target_name=self.target_name)
89 self._publish_msg('comm_open', data, metadata, target_name=self.target_name)
90
90
91 def close(self, data=None, metadata=None):
91 def close(self, data=None, metadata=None):
92 """Close the frontend-side version of this comm"""
92 """Close the frontend-side version of this comm"""
93 if self._closed:
93 if self._closed:
94 # only close once
94 # only close once
95 return
95 return
96 if data is None:
96 if data is None:
97 data = self._close_data
97 data = self._close_data
98 self._publish_msg('comm_close', data, metadata)
98 self._publish_msg('comm_close', data, metadata)
99 self._closed = True
99 self._closed = True
100
100
101 def send(self, data=None, metadata=None):
101 def send(self, data=None, metadata=None):
102 """Send a message to the frontend-side version of this comm"""
102 """Send a message to the frontend-side version of this comm"""
103 self._publish_msg('comm_msg', data, metadata)
103 self._publish_msg('comm_msg', data, metadata)
104
104
105 # registering callbacks
105 # registering callbacks
106
106
107 def on_close(self, callback):
107 def on_close(self, callback):
108 """Register a callback for comm_close
108 """Register a callback for comm_close
109
109
110 Will be called with the `data` of the close message.
110 Will be called with the `data` of the close message.
111
111
112 Call `on_close(None)` to disable an existing callback.
112 Call `on_close(None)` to disable an existing callback.
113 """
113 """
114 self._close_callback = callback
114 self._close_callback = callback
115
115
116 def on_msg(self, callback):
116 def on_msg(self, callback):
117 """Register a callback for comm_msg
117 """Register a callback for comm_msg
118
118
119 Will be called with the `data` of any comm_msg messages.
119 Will be called with the `data` of any comm_msg messages.
120
120
121 Call `on_msg(None)` to disable an existing callback.
121 Call `on_msg(None)` to disable an existing callback.
122 """
122 """
123 self._msg_callback = callback
123 self._msg_callback = callback
124
124
125 # handling of incoming messages
125 # handling of incoming messages
126
126
127 def handle_close(self, msg):
127 def handle_close(self, msg):
128 """Handle a comm_close message"""
128 """Handle a comm_close message"""
129 self.log.debug("handle_close[%s](%s)", self.comm_id, msg)
129 self.log.debug("handle_close[%s](%s)", self.comm_id, msg)
130 if self._close_callback:
130 if self._close_callback:
131 self._close_callback(msg)
131 self._close_callback(msg)
132
132
133 def handle_msg(self, msg):
133 def handle_msg(self, msg):
134 """Handle a comm_msg message"""
134 """Handle a comm_msg message"""
135 self.log.debug("handle_msg[%s](%s)", self.comm_id, msg)
135 self.log.debug("handle_msg[%s](%s)", self.comm_id, msg)
136 if self._msg_callback:
136 if self._msg_callback:
137 self.shell.callbacks.fire('pre_execute')
137 self._msg_callback(msg)
138 self._msg_callback(msg)
139 self.shell.callbacks.fire('post_execute')
138
140
139
141
140 __all__ = ['Comm']
142 __all__ = ['Comm']
General Comments 0
You need to be logged in to leave comments. Login now