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