##// END OF EJS Templates
jupyter_nbformat is now nbformat
Min RK -
Show More
@@ -1,3393 +1,3393 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 pickleshare import PickleShareDB
30 from pickleshare import PickleShareDB
31
31
32 from traitlets.config.configurable import SingletonConfigurable
32 from traitlets.config.configurable import SingletonConfigurable
33 from IPython.core import debugger, oinspect
33 from IPython.core import debugger, oinspect
34 from IPython.core import magic
34 from IPython.core import magic
35 from IPython.core import page
35 from IPython.core import page
36 from IPython.core import prefilter
36 from IPython.core import prefilter
37 from IPython.core import shadowns
37 from IPython.core import shadowns
38 from IPython.core import ultratb
38 from IPython.core import ultratb
39 from IPython.core.alias import Alias, AliasManager
39 from IPython.core.alias import Alias, AliasManager
40 from IPython.core.autocall import ExitAutocall
40 from IPython.core.autocall import ExitAutocall
41 from IPython.core.builtin_trap import BuiltinTrap
41 from IPython.core.builtin_trap import BuiltinTrap
42 from IPython.core.events import EventManager, available_events
42 from IPython.core.events import EventManager, available_events
43 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
43 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
44 from IPython.core.display_trap import DisplayTrap
44 from IPython.core.display_trap import DisplayTrap
45 from IPython.core.displayhook import DisplayHook
45 from IPython.core.displayhook import DisplayHook
46 from IPython.core.displaypub import DisplayPublisher
46 from IPython.core.displaypub import DisplayPublisher
47 from IPython.core.error import InputRejected, UsageError
47 from IPython.core.error import InputRejected, UsageError
48 from IPython.core.extensions import ExtensionManager
48 from IPython.core.extensions import ExtensionManager
49 from IPython.core.formatters import DisplayFormatter
49 from IPython.core.formatters import DisplayFormatter
50 from IPython.core.history import HistoryManager
50 from IPython.core.history import HistoryManager
51 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
51 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
52 from IPython.core.logger import Logger
52 from IPython.core.logger import Logger
53 from IPython.core.macro import Macro
53 from IPython.core.macro import Macro
54 from IPython.core.payload import PayloadManager
54 from IPython.core.payload import PayloadManager
55 from IPython.core.prefilter import PrefilterManager
55 from IPython.core.prefilter import PrefilterManager
56 from IPython.core.profiledir import ProfileDir
56 from IPython.core.profiledir import ProfileDir
57 from IPython.core.prompts import PromptManager
57 from IPython.core.prompts import PromptManager
58 from IPython.core.usage import default_banner
58 from IPython.core.usage import default_banner
59 from IPython.testing.skipdoctest import skip_doctest
59 from IPython.testing.skipdoctest import skip_doctest
60 from IPython.utils import PyColorize
60 from IPython.utils import PyColorize
61 from IPython.utils import io
61 from IPython.utils import io
62 from IPython.utils import py3compat
62 from IPython.utils import py3compat
63 from IPython.utils import openpy
63 from IPython.utils import openpy
64 from IPython.utils.decorators import undoc
64 from IPython.utils.decorators import undoc
65 from IPython.utils.io import ask_yes_no
65 from IPython.utils.io import ask_yes_no
66 from IPython.utils.ipstruct import Struct
66 from IPython.utils.ipstruct import Struct
67 from IPython.paths import get_ipython_dir
67 from IPython.paths import get_ipython_dir
68 from IPython.utils.path import get_home_dir, get_py_filename, unquote_filename, ensure_dir_exists
68 from IPython.utils.path import get_home_dir, get_py_filename, unquote_filename, ensure_dir_exists
69 from IPython.utils.process import system, getoutput
69 from IPython.utils.process import system, getoutput
70 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
70 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
71 with_metaclass, iteritems)
71 with_metaclass, iteritems)
72 from IPython.utils.strdispatch import StrDispatch
72 from IPython.utils.strdispatch import StrDispatch
73 from IPython.utils.syspathcontext import prepended_to_syspath
73 from IPython.utils.syspathcontext import prepended_to_syspath
74 from IPython.utils.text import (format_screen, LSString, SList,
74 from IPython.utils.text import (format_screen, LSString, SList,
75 DollarFormatter)
75 DollarFormatter)
76 from traitlets import (Integer, Bool, CBool, CaselessStrEnum, Enum,
76 from traitlets import (Integer, Bool, CBool, CaselessStrEnum, Enum,
77 List, Dict, Unicode, Instance, Type)
77 List, Dict, Unicode, Instance, Type)
78 from IPython.utils.warn import warn, error
78 from IPython.utils.warn import warn, error
79 import IPython.core.hooks
79 import IPython.core.hooks
80
80
81 #-----------------------------------------------------------------------------
81 #-----------------------------------------------------------------------------
82 # Globals
82 # Globals
83 #-----------------------------------------------------------------------------
83 #-----------------------------------------------------------------------------
84
84
85 # compiled regexps for autoindent management
85 # compiled regexps for autoindent management
86 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
86 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
87
87
88 #-----------------------------------------------------------------------------
88 #-----------------------------------------------------------------------------
89 # Utilities
89 # Utilities
90 #-----------------------------------------------------------------------------
90 #-----------------------------------------------------------------------------
91
91
92 @undoc
92 @undoc
93 def softspace(file, newvalue):
93 def softspace(file, newvalue):
94 """Copied from code.py, to remove the dependency"""
94 """Copied from code.py, to remove the dependency"""
95
95
96 oldvalue = 0
96 oldvalue = 0
97 try:
97 try:
98 oldvalue = file.softspace
98 oldvalue = file.softspace
99 except AttributeError:
99 except AttributeError:
100 pass
100 pass
101 try:
101 try:
102 file.softspace = newvalue
102 file.softspace = newvalue
103 except (AttributeError, TypeError):
103 except (AttributeError, TypeError):
104 # "attribute-less object" or "read-only attributes"
104 # "attribute-less object" or "read-only attributes"
105 pass
105 pass
106 return oldvalue
106 return oldvalue
107
107
108 @undoc
108 @undoc
109 def no_op(*a, **kw): pass
109 def no_op(*a, **kw): pass
110
110
111 @undoc
111 @undoc
112 class NoOpContext(object):
112 class NoOpContext(object):
113 def __enter__(self): pass
113 def __enter__(self): pass
114 def __exit__(self, type, value, traceback): pass
114 def __exit__(self, type, value, traceback): pass
115 no_op_context = NoOpContext()
115 no_op_context = NoOpContext()
116
116
117 class SpaceInInput(Exception): pass
117 class SpaceInInput(Exception): pass
118
118
119 @undoc
119 @undoc
120 class Bunch: pass
120 class Bunch: pass
121
121
122
122
123 def get_default_colors():
123 def get_default_colors():
124 if sys.platform=='darwin':
124 if sys.platform=='darwin':
125 return "LightBG"
125 return "LightBG"
126 elif os.name=='nt':
126 elif os.name=='nt':
127 return 'Linux'
127 return 'Linux'
128 else:
128 else:
129 return 'Linux'
129 return 'Linux'
130
130
131
131
132 class SeparateUnicode(Unicode):
132 class SeparateUnicode(Unicode):
133 r"""A Unicode subclass to validate separate_in, separate_out, etc.
133 r"""A Unicode subclass to validate separate_in, separate_out, etc.
134
134
135 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
135 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
136 """
136 """
137
137
138 def validate(self, obj, value):
138 def validate(self, obj, value):
139 if value == '0': value = ''
139 if value == '0': value = ''
140 value = value.replace('\\n','\n')
140 value = value.replace('\\n','\n')
141 return super(SeparateUnicode, self).validate(obj, value)
141 return super(SeparateUnicode, self).validate(obj, value)
142
142
143
143
144 class ReadlineNoRecord(object):
144 class ReadlineNoRecord(object):
145 """Context manager to execute some code, then reload readline history
145 """Context manager to execute some code, then reload readline history
146 so that interactive input to the code doesn't appear when pressing up."""
146 so that interactive input to the code doesn't appear when pressing up."""
147 def __init__(self, shell):
147 def __init__(self, shell):
148 self.shell = shell
148 self.shell = shell
149 self._nested_level = 0
149 self._nested_level = 0
150
150
151 def __enter__(self):
151 def __enter__(self):
152 if self._nested_level == 0:
152 if self._nested_level == 0:
153 try:
153 try:
154 self.orig_length = self.current_length()
154 self.orig_length = self.current_length()
155 self.readline_tail = self.get_readline_tail()
155 self.readline_tail = self.get_readline_tail()
156 except (AttributeError, IndexError): # Can fail with pyreadline
156 except (AttributeError, IndexError): # Can fail with pyreadline
157 self.orig_length, self.readline_tail = 999999, []
157 self.orig_length, self.readline_tail = 999999, []
158 self._nested_level += 1
158 self._nested_level += 1
159
159
160 def __exit__(self, type, value, traceback):
160 def __exit__(self, type, value, traceback):
161 self._nested_level -= 1
161 self._nested_level -= 1
162 if self._nested_level == 0:
162 if self._nested_level == 0:
163 # Try clipping the end if it's got longer
163 # Try clipping the end if it's got longer
164 try:
164 try:
165 e = self.current_length() - self.orig_length
165 e = self.current_length() - self.orig_length
166 if e > 0:
166 if e > 0:
167 for _ in range(e):
167 for _ in range(e):
168 self.shell.readline.remove_history_item(self.orig_length)
168 self.shell.readline.remove_history_item(self.orig_length)
169
169
170 # If it still doesn't match, just reload readline history.
170 # If it still doesn't match, just reload readline history.
171 if self.current_length() != self.orig_length \
171 if self.current_length() != self.orig_length \
172 or self.get_readline_tail() != self.readline_tail:
172 or self.get_readline_tail() != self.readline_tail:
173 self.shell.refill_readline_hist()
173 self.shell.refill_readline_hist()
174 except (AttributeError, IndexError):
174 except (AttributeError, IndexError):
175 pass
175 pass
176 # Returning False will cause exceptions to propagate
176 # Returning False will cause exceptions to propagate
177 return False
177 return False
178
178
179 def current_length(self):
179 def current_length(self):
180 return self.shell.readline.get_current_history_length()
180 return self.shell.readline.get_current_history_length()
181
181
182 def get_readline_tail(self, n=10):
182 def get_readline_tail(self, n=10):
183 """Get the last n items in readline history."""
183 """Get the last n items in readline history."""
184 end = self.shell.readline.get_current_history_length() + 1
184 end = self.shell.readline.get_current_history_length() + 1
185 start = max(end-n, 1)
185 start = max(end-n, 1)
186 ghi = self.shell.readline.get_history_item
186 ghi = self.shell.readline.get_history_item
187 return [ghi(x) for x in range(start, end)]
187 return [ghi(x) for x in range(start, end)]
188
188
189
189
190 @undoc
190 @undoc
191 class DummyMod(object):
191 class DummyMod(object):
192 """A dummy module used for IPython's interactive module when
192 """A dummy module used for IPython's interactive module when
193 a namespace must be assigned to the module's __dict__."""
193 a namespace must be assigned to the module's __dict__."""
194 pass
194 pass
195
195
196
196
197 class ExecutionResult(object):
197 class ExecutionResult(object):
198 """The result of a call to :meth:`InteractiveShell.run_cell`
198 """The result of a call to :meth:`InteractiveShell.run_cell`
199
199
200 Stores information about what took place.
200 Stores information about what took place.
201 """
201 """
202 execution_count = None
202 execution_count = None
203 error_before_exec = None
203 error_before_exec = None
204 error_in_exec = None
204 error_in_exec = None
205 result = None
205 result = None
206
206
207 @property
207 @property
208 def success(self):
208 def success(self):
209 return (self.error_before_exec is None) and (self.error_in_exec is None)
209 return (self.error_before_exec is None) and (self.error_in_exec is None)
210
210
211
211
212 class InteractiveShell(SingletonConfigurable):
212 class InteractiveShell(SingletonConfigurable):
213 """An enhanced, interactive shell for Python."""
213 """An enhanced, interactive shell for Python."""
214
214
215 _instance = None
215 _instance = None
216
216
217 ast_transformers = List([], config=True, help=
217 ast_transformers = List([], config=True, help=
218 """
218 """
219 A list of ast.NodeTransformer subclass instances, which will be applied
219 A list of ast.NodeTransformer subclass instances, which will be applied
220 to user input before code is run.
220 to user input before code is run.
221 """
221 """
222 )
222 )
223
223
224 autocall = Enum((0,1,2), default_value=0, config=True, help=
224 autocall = Enum((0,1,2), default_value=0, config=True, help=
225 """
225 """
226 Make IPython automatically call any callable object even if you didn't
226 Make IPython automatically call any callable object even if you didn't
227 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
227 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
228 automatically. The value can be '0' to disable the feature, '1' for
228 automatically. The value can be '0' to disable the feature, '1' for
229 'smart' autocall, where it is not applied if there are no more
229 'smart' autocall, where it is not applied if there are no more
230 arguments on the line, and '2' for 'full' autocall, where all callable
230 arguments on the line, and '2' for 'full' autocall, where all callable
231 objects are automatically called (even if no arguments are present).
231 objects are automatically called (even if no arguments are present).
232 """
232 """
233 )
233 )
234 # TODO: remove all autoindent logic and put into frontends.
234 # TODO: remove all autoindent logic and put into frontends.
235 # We can't do this yet because even runlines uses the autoindent.
235 # We can't do this yet because even runlines uses the autoindent.
236 autoindent = CBool(True, config=True, help=
236 autoindent = CBool(True, config=True, help=
237 """
237 """
238 Autoindent IPython code entered interactively.
238 Autoindent IPython code entered interactively.
239 """
239 """
240 )
240 )
241 automagic = CBool(True, config=True, help=
241 automagic = CBool(True, config=True, help=
242 """
242 """
243 Enable magic commands to be called without the leading %.
243 Enable magic commands to be called without the leading %.
244 """
244 """
245 )
245 )
246
246
247 banner1 = Unicode(default_banner, config=True,
247 banner1 = Unicode(default_banner, config=True,
248 help="""The part of the banner to be printed before the profile"""
248 help="""The part of the banner to be printed before the profile"""
249 )
249 )
250 banner2 = Unicode('', config=True,
250 banner2 = Unicode('', config=True,
251 help="""The part of the banner to be printed after the profile"""
251 help="""The part of the banner to be printed after the profile"""
252 )
252 )
253
253
254 cache_size = Integer(1000, config=True, help=
254 cache_size = Integer(1000, config=True, help=
255 """
255 """
256 Set the size of the output cache. The default is 1000, you can
256 Set the size of the output cache. The default is 1000, you can
257 change it permanently in your config file. Setting it to 0 completely
257 change it permanently in your config file. Setting it to 0 completely
258 disables the caching system, and the minimum value accepted is 20 (if
258 disables the caching system, and the minimum value accepted is 20 (if
259 you provide a value less than 20, it is reset to 0 and a warning is
259 you provide a value less than 20, it is reset to 0 and a warning is
260 issued). This limit is defined because otherwise you'll spend more
260 issued). This limit is defined because otherwise you'll spend more
261 time re-flushing a too small cache than working
261 time re-flushing a too small cache than working
262 """
262 """
263 )
263 )
264 color_info = CBool(True, config=True, help=
264 color_info = CBool(True, config=True, help=
265 """
265 """
266 Use colors for displaying information about objects. Because this
266 Use colors for displaying information about objects. Because this
267 information is passed through a pager (like 'less'), and some pagers
267 information is passed through a pager (like 'less'), and some pagers
268 get confused with color codes, this capability can be turned off.
268 get confused with color codes, this capability can be turned off.
269 """
269 """
270 )
270 )
271 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
271 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
272 default_value=get_default_colors(), config=True,
272 default_value=get_default_colors(), config=True,
273 help="Set the color scheme (NoColor, Linux, or LightBG)."
273 help="Set the color scheme (NoColor, Linux, or LightBG)."
274 )
274 )
275 colors_force = CBool(False, help=
275 colors_force = CBool(False, help=
276 """
276 """
277 Force use of ANSI color codes, regardless of OS and readline
277 Force use of ANSI color codes, regardless of OS and readline
278 availability.
278 availability.
279 """
279 """
280 # FIXME: This is essentially a hack to allow ZMQShell to show colors
280 # FIXME: This is essentially a hack to allow ZMQShell to show colors
281 # without readline on Win32. When the ZMQ formatting system is
281 # without readline on Win32. When the ZMQ formatting system is
282 # refactored, this should be removed.
282 # refactored, this should be removed.
283 )
283 )
284 debug = CBool(False, config=True)
284 debug = CBool(False, config=True)
285 deep_reload = CBool(False, config=True, help=
285 deep_reload = CBool(False, config=True, help=
286 """
286 """
287 Enable deep (recursive) reloading by default. IPython can use the
287 Enable deep (recursive) reloading by default. IPython can use the
288 deep_reload module which reloads changes in modules recursively (it
288 deep_reload module which reloads changes in modules recursively (it
289 replaces the reload() function, so you don't need to change anything to
289 replaces the reload() function, so you don't need to change anything to
290 use it). deep_reload() forces a full reload of modules whose code may
290 use it). deep_reload() forces a full reload of modules whose code may
291 have changed, which the default reload() function does not. When
291 have changed, which the default reload() function does not. When
292 deep_reload is off, IPython will use the normal reload(), but
292 deep_reload is off, IPython will use the normal reload(), but
293 deep_reload will still be available as dreload().
293 deep_reload will still be available as dreload().
294 """
294 """
295 )
295 )
296 disable_failing_post_execute = CBool(False, config=True,
296 disable_failing_post_execute = CBool(False, config=True,
297 help="Don't call post-execute functions that have failed in the past."
297 help="Don't call post-execute functions that have failed in the past."
298 )
298 )
299 display_formatter = Instance(DisplayFormatter, allow_none=True)
299 display_formatter = Instance(DisplayFormatter, allow_none=True)
300 displayhook_class = Type(DisplayHook)
300 displayhook_class = Type(DisplayHook)
301 display_pub_class = Type(DisplayPublisher)
301 display_pub_class = Type(DisplayPublisher)
302 data_pub_class = None
302 data_pub_class = None
303
303
304 exit_now = CBool(False)
304 exit_now = CBool(False)
305 exiter = Instance(ExitAutocall)
305 exiter = Instance(ExitAutocall)
306 def _exiter_default(self):
306 def _exiter_default(self):
307 return ExitAutocall(self)
307 return ExitAutocall(self)
308 # Monotonically increasing execution counter
308 # Monotonically increasing execution counter
309 execution_count = Integer(1)
309 execution_count = Integer(1)
310 filename = Unicode("<ipython console>")
310 filename = Unicode("<ipython console>")
311 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
311 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
312
312
313 # Input splitter, to transform input line by line and detect when a block
313 # Input splitter, to transform input line by line and detect when a block
314 # is ready to be executed.
314 # is ready to be executed.
315 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
315 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
316 (), {'line_input_checker': True})
316 (), {'line_input_checker': True})
317
317
318 # This InputSplitter instance is used to transform completed cells before
318 # This InputSplitter instance is used to transform completed cells before
319 # running them. It allows cell magics to contain blank lines.
319 # running them. It allows cell magics to contain blank lines.
320 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
320 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
321 (), {'line_input_checker': False})
321 (), {'line_input_checker': False})
322
322
323 logstart = CBool(False, config=True, help=
323 logstart = CBool(False, config=True, help=
324 """
324 """
325 Start logging to the default log file in overwrite mode.
325 Start logging to the default log file in overwrite mode.
326 Use `logappend` to specify a log file to **append** logs to.
326 Use `logappend` to specify a log file to **append** logs to.
327 """
327 """
328 )
328 )
329 logfile = Unicode('', config=True, help=
329 logfile = Unicode('', config=True, help=
330 """
330 """
331 The name of the logfile to use.
331 The name of the logfile to use.
332 """
332 """
333 )
333 )
334 logappend = Unicode('', config=True, help=
334 logappend = Unicode('', config=True, help=
335 """
335 """
336 Start logging to the given file in append mode.
336 Start logging to the given file in append mode.
337 Use `logfile` to specify a log file to **overwrite** logs to.
337 Use `logfile` to specify a log file to **overwrite** logs to.
338 """
338 """
339 )
339 )
340 object_info_string_level = Enum((0,1,2), default_value=0,
340 object_info_string_level = Enum((0,1,2), default_value=0,
341 config=True)
341 config=True)
342 pdb = CBool(False, config=True, help=
342 pdb = CBool(False, config=True, help=
343 """
343 """
344 Automatically call the pdb debugger after every exception.
344 Automatically call the pdb debugger after every exception.
345 """
345 """
346 )
346 )
347 multiline_history = CBool(sys.platform != 'win32', config=True,
347 multiline_history = CBool(sys.platform != 'win32', config=True,
348 help="Save multi-line entries as one entry in readline history"
348 help="Save multi-line entries as one entry in readline history"
349 )
349 )
350 display_page = Bool(False, config=True,
350 display_page = Bool(False, config=True,
351 help="""If True, anything that would be passed to the pager
351 help="""If True, anything that would be passed to the pager
352 will be displayed as regular output instead."""
352 will be displayed as regular output instead."""
353 )
353 )
354
354
355 # deprecated prompt traits:
355 # deprecated prompt traits:
356
356
357 prompt_in1 = Unicode('In [\\#]: ', config=True,
357 prompt_in1 = Unicode('In [\\#]: ', config=True,
358 help="Deprecated, use PromptManager.in_template")
358 help="Deprecated, use PromptManager.in_template")
359 prompt_in2 = Unicode(' .\\D.: ', config=True,
359 prompt_in2 = Unicode(' .\\D.: ', config=True,
360 help="Deprecated, use PromptManager.in2_template")
360 help="Deprecated, use PromptManager.in2_template")
361 prompt_out = Unicode('Out[\\#]: ', config=True,
361 prompt_out = Unicode('Out[\\#]: ', config=True,
362 help="Deprecated, use PromptManager.out_template")
362 help="Deprecated, use PromptManager.out_template")
363 prompts_pad_left = CBool(True, config=True,
363 prompts_pad_left = CBool(True, config=True,
364 help="Deprecated, use PromptManager.justify")
364 help="Deprecated, use PromptManager.justify")
365
365
366 def _prompt_trait_changed(self, name, old, new):
366 def _prompt_trait_changed(self, name, old, new):
367 table = {
367 table = {
368 'prompt_in1' : 'in_template',
368 'prompt_in1' : 'in_template',
369 'prompt_in2' : 'in2_template',
369 'prompt_in2' : 'in2_template',
370 'prompt_out' : 'out_template',
370 'prompt_out' : 'out_template',
371 'prompts_pad_left' : 'justify',
371 'prompts_pad_left' : 'justify',
372 }
372 }
373 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
373 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
374 name=name, newname=table[name])
374 name=name, newname=table[name])
375 )
375 )
376 # protect against weird cases where self.config may not exist:
376 # protect against weird cases where self.config may not exist:
377 if self.config is not None:
377 if self.config is not None:
378 # propagate to corresponding PromptManager trait
378 # propagate to corresponding PromptManager trait
379 setattr(self.config.PromptManager, table[name], new)
379 setattr(self.config.PromptManager, table[name], new)
380
380
381 _prompt_in1_changed = _prompt_trait_changed
381 _prompt_in1_changed = _prompt_trait_changed
382 _prompt_in2_changed = _prompt_trait_changed
382 _prompt_in2_changed = _prompt_trait_changed
383 _prompt_out_changed = _prompt_trait_changed
383 _prompt_out_changed = _prompt_trait_changed
384 _prompt_pad_left_changed = _prompt_trait_changed
384 _prompt_pad_left_changed = _prompt_trait_changed
385
385
386 show_rewritten_input = CBool(True, config=True,
386 show_rewritten_input = CBool(True, config=True,
387 help="Show rewritten input, e.g. for autocall."
387 help="Show rewritten input, e.g. for autocall."
388 )
388 )
389
389
390 quiet = CBool(False, config=True)
390 quiet = CBool(False, config=True)
391
391
392 history_length = Integer(10000, config=True)
392 history_length = Integer(10000, config=True)
393
393
394 # The readline stuff will eventually be moved to the terminal subclass
394 # The readline stuff will eventually be moved to the terminal subclass
395 # but for now, we can't do that as readline is welded in everywhere.
395 # but for now, we can't do that as readline is welded in everywhere.
396 readline_use = CBool(True, config=True)
396 readline_use = CBool(True, config=True)
397 readline_remove_delims = Unicode('-/~', config=True)
397 readline_remove_delims = Unicode('-/~', config=True)
398 readline_delims = Unicode() # set by init_readline()
398 readline_delims = Unicode() # set by init_readline()
399 # don't use \M- bindings by default, because they
399 # don't use \M- bindings by default, because they
400 # conflict with 8-bit encodings. See gh-58,gh-88
400 # conflict with 8-bit encodings. See gh-58,gh-88
401 readline_parse_and_bind = List([
401 readline_parse_and_bind = List([
402 'tab: complete',
402 'tab: complete',
403 '"\C-l": clear-screen',
403 '"\C-l": clear-screen',
404 'set show-all-if-ambiguous on',
404 'set show-all-if-ambiguous on',
405 '"\C-o": tab-insert',
405 '"\C-o": tab-insert',
406 '"\C-r": reverse-search-history',
406 '"\C-r": reverse-search-history',
407 '"\C-s": forward-search-history',
407 '"\C-s": forward-search-history',
408 '"\C-p": history-search-backward',
408 '"\C-p": history-search-backward',
409 '"\C-n": history-search-forward',
409 '"\C-n": history-search-forward',
410 '"\e[A": history-search-backward',
410 '"\e[A": history-search-backward',
411 '"\e[B": history-search-forward',
411 '"\e[B": history-search-forward',
412 '"\C-k": kill-line',
412 '"\C-k": kill-line',
413 '"\C-u": unix-line-discard',
413 '"\C-u": unix-line-discard',
414 ], config=True)
414 ], config=True)
415
415
416 _custom_readline_config = False
416 _custom_readline_config = False
417
417
418 def _readline_parse_and_bind_changed(self, name, old, new):
418 def _readline_parse_and_bind_changed(self, name, old, new):
419 # notice that readline config is customized
419 # notice that readline config is customized
420 # indicates that it should have higher priority than inputrc
420 # indicates that it should have higher priority than inputrc
421 self._custom_readline_config = True
421 self._custom_readline_config = True
422
422
423 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
423 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
424 default_value='last_expr', config=True,
424 default_value='last_expr', config=True,
425 help="""
425 help="""
426 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
426 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
427 run interactively (displaying output from expressions).""")
427 run interactively (displaying output from expressions).""")
428
428
429 # TODO: this part of prompt management should be moved to the frontends.
429 # TODO: this part of prompt management should be moved to the frontends.
430 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
430 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
431 separate_in = SeparateUnicode('\n', config=True)
431 separate_in = SeparateUnicode('\n', config=True)
432 separate_out = SeparateUnicode('', config=True)
432 separate_out = SeparateUnicode('', config=True)
433 separate_out2 = SeparateUnicode('', config=True)
433 separate_out2 = SeparateUnicode('', config=True)
434 wildcards_case_sensitive = CBool(True, config=True)
434 wildcards_case_sensitive = CBool(True, config=True)
435 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
435 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
436 default_value='Context', config=True)
436 default_value='Context', config=True)
437
437
438 # Subcomponents of InteractiveShell
438 # Subcomponents of InteractiveShell
439 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True)
439 alias_manager = Instance('IPython.core.alias.AliasManager', allow_none=True)
440 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True)
440 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager', allow_none=True)
441 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True)
441 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap', allow_none=True)
442 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True)
442 display_trap = Instance('IPython.core.display_trap.DisplayTrap', allow_none=True)
443 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True)
443 extension_manager = Instance('IPython.core.extensions.ExtensionManager', allow_none=True)
444 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True)
444 payload_manager = Instance('IPython.core.payload.PayloadManager', allow_none=True)
445 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True)
445 history_manager = Instance('IPython.core.history.HistoryAccessorBase', allow_none=True)
446 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True)
446 magics_manager = Instance('IPython.core.magic.MagicsManager', allow_none=True)
447
447
448 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
448 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
449 @property
449 @property
450 def profile(self):
450 def profile(self):
451 if self.profile_dir is not None:
451 if self.profile_dir is not None:
452 name = os.path.basename(self.profile_dir.location)
452 name = os.path.basename(self.profile_dir.location)
453 return name.replace('profile_','')
453 return name.replace('profile_','')
454
454
455
455
456 # Private interface
456 # Private interface
457 _post_execute = Dict()
457 _post_execute = Dict()
458
458
459 # Tracks any GUI loop loaded for pylab
459 # Tracks any GUI loop loaded for pylab
460 pylab_gui_select = None
460 pylab_gui_select = None
461
461
462 def __init__(self, ipython_dir=None, profile_dir=None,
462 def __init__(self, ipython_dir=None, profile_dir=None,
463 user_module=None, user_ns=None,
463 user_module=None, user_ns=None,
464 custom_exceptions=((), None), **kwargs):
464 custom_exceptions=((), None), **kwargs):
465
465
466 # This is where traits with a config_key argument are updated
466 # This is where traits with a config_key argument are updated
467 # from the values on config.
467 # from the values on config.
468 super(InteractiveShell, self).__init__(**kwargs)
468 super(InteractiveShell, self).__init__(**kwargs)
469 self.configurables = [self]
469 self.configurables = [self]
470
470
471 # These are relatively independent and stateless
471 # These are relatively independent and stateless
472 self.init_ipython_dir(ipython_dir)
472 self.init_ipython_dir(ipython_dir)
473 self.init_profile_dir(profile_dir)
473 self.init_profile_dir(profile_dir)
474 self.init_instance_attrs()
474 self.init_instance_attrs()
475 self.init_environment()
475 self.init_environment()
476
476
477 # Check if we're in a virtualenv, and set up sys.path.
477 # Check if we're in a virtualenv, and set up sys.path.
478 self.init_virtualenv()
478 self.init_virtualenv()
479
479
480 # Create namespaces (user_ns, user_global_ns, etc.)
480 # Create namespaces (user_ns, user_global_ns, etc.)
481 self.init_create_namespaces(user_module, user_ns)
481 self.init_create_namespaces(user_module, user_ns)
482 # This has to be done after init_create_namespaces because it uses
482 # This has to be done after init_create_namespaces because it uses
483 # something in self.user_ns, but before init_sys_modules, which
483 # something in self.user_ns, but before init_sys_modules, which
484 # is the first thing to modify sys.
484 # is the first thing to modify sys.
485 # TODO: When we override sys.stdout and sys.stderr before this class
485 # TODO: When we override sys.stdout and sys.stderr before this class
486 # is created, we are saving the overridden ones here. Not sure if this
486 # is created, we are saving the overridden ones here. Not sure if this
487 # is what we want to do.
487 # is what we want to do.
488 self.save_sys_module_state()
488 self.save_sys_module_state()
489 self.init_sys_modules()
489 self.init_sys_modules()
490
490
491 # While we're trying to have each part of the code directly access what
491 # While we're trying to have each part of the code directly access what
492 # it needs without keeping redundant references to objects, we have too
492 # it needs without keeping redundant references to objects, we have too
493 # much legacy code that expects ip.db to exist.
493 # much legacy code that expects ip.db to exist.
494 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
494 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
495
495
496 self.init_history()
496 self.init_history()
497 self.init_encoding()
497 self.init_encoding()
498 self.init_prefilter()
498 self.init_prefilter()
499
499
500 self.init_syntax_highlighting()
500 self.init_syntax_highlighting()
501 self.init_hooks()
501 self.init_hooks()
502 self.init_events()
502 self.init_events()
503 self.init_pushd_popd_magic()
503 self.init_pushd_popd_magic()
504 # self.init_traceback_handlers use to be here, but we moved it below
504 # self.init_traceback_handlers use to be here, but we moved it below
505 # because it and init_io have to come after init_readline.
505 # because it and init_io have to come after init_readline.
506 self.init_user_ns()
506 self.init_user_ns()
507 self.init_logger()
507 self.init_logger()
508 self.init_builtins()
508 self.init_builtins()
509
509
510 # The following was in post_config_initialization
510 # The following was in post_config_initialization
511 self.init_inspector()
511 self.init_inspector()
512 # init_readline() must come before init_io(), because init_io uses
512 # init_readline() must come before init_io(), because init_io uses
513 # readline related things.
513 # readline related things.
514 self.init_readline()
514 self.init_readline()
515 # We save this here in case user code replaces raw_input, but it needs
515 # We save this here in case user code replaces raw_input, but it needs
516 # to be after init_readline(), because PyPy's readline works by replacing
516 # to be after init_readline(), because PyPy's readline works by replacing
517 # raw_input.
517 # raw_input.
518 if py3compat.PY3:
518 if py3compat.PY3:
519 self.raw_input_original = input
519 self.raw_input_original = input
520 else:
520 else:
521 self.raw_input_original = raw_input
521 self.raw_input_original = raw_input
522 # init_completer must come after init_readline, because it needs to
522 # init_completer must come after init_readline, because it needs to
523 # know whether readline is present or not system-wide to configure the
523 # know whether readline is present or not system-wide to configure the
524 # completers, since the completion machinery can now operate
524 # completers, since the completion machinery can now operate
525 # independently of readline (e.g. over the network)
525 # independently of readline (e.g. over the network)
526 self.init_completer()
526 self.init_completer()
527 # TODO: init_io() needs to happen before init_traceback handlers
527 # TODO: init_io() needs to happen before init_traceback handlers
528 # because the traceback handlers hardcode the stdout/stderr streams.
528 # because the traceback handlers hardcode the stdout/stderr streams.
529 # This logic in in debugger.Pdb and should eventually be changed.
529 # This logic in in debugger.Pdb and should eventually be changed.
530 self.init_io()
530 self.init_io()
531 self.init_traceback_handlers(custom_exceptions)
531 self.init_traceback_handlers(custom_exceptions)
532 self.init_prompts()
532 self.init_prompts()
533 self.init_display_formatter()
533 self.init_display_formatter()
534 self.init_display_pub()
534 self.init_display_pub()
535 self.init_data_pub()
535 self.init_data_pub()
536 self.init_displayhook()
536 self.init_displayhook()
537 self.init_magics()
537 self.init_magics()
538 self.init_alias()
538 self.init_alias()
539 self.init_logstart()
539 self.init_logstart()
540 self.init_pdb()
540 self.init_pdb()
541 self.init_extension_manager()
541 self.init_extension_manager()
542 self.init_payload()
542 self.init_payload()
543 self.hooks.late_startup_hook()
543 self.hooks.late_startup_hook()
544 self.events.trigger('shell_initialized', self)
544 self.events.trigger('shell_initialized', self)
545 atexit.register(self.atexit_operations)
545 atexit.register(self.atexit_operations)
546
546
547 def get_ipython(self):
547 def get_ipython(self):
548 """Return the currently running IPython instance."""
548 """Return the currently running IPython instance."""
549 return self
549 return self
550
550
551 #-------------------------------------------------------------------------
551 #-------------------------------------------------------------------------
552 # Trait changed handlers
552 # Trait changed handlers
553 #-------------------------------------------------------------------------
553 #-------------------------------------------------------------------------
554
554
555 def _ipython_dir_changed(self, name, new):
555 def _ipython_dir_changed(self, name, new):
556 ensure_dir_exists(new)
556 ensure_dir_exists(new)
557
557
558 def set_autoindent(self,value=None):
558 def set_autoindent(self,value=None):
559 """Set the autoindent flag, checking for readline support.
559 """Set the autoindent flag, checking for readline support.
560
560
561 If called with no arguments, it acts as a toggle."""
561 If called with no arguments, it acts as a toggle."""
562
562
563 if value != 0 and not self.has_readline:
563 if value != 0 and not self.has_readline:
564 if os.name == 'posix':
564 if os.name == 'posix':
565 warn("The auto-indent feature requires the readline library")
565 warn("The auto-indent feature requires the readline library")
566 self.autoindent = 0
566 self.autoindent = 0
567 return
567 return
568 if value is None:
568 if value is None:
569 self.autoindent = not self.autoindent
569 self.autoindent = not self.autoindent
570 else:
570 else:
571 self.autoindent = value
571 self.autoindent = value
572
572
573 #-------------------------------------------------------------------------
573 #-------------------------------------------------------------------------
574 # init_* methods called by __init__
574 # init_* methods called by __init__
575 #-------------------------------------------------------------------------
575 #-------------------------------------------------------------------------
576
576
577 def init_ipython_dir(self, ipython_dir):
577 def init_ipython_dir(self, ipython_dir):
578 if ipython_dir is not None:
578 if ipython_dir is not None:
579 self.ipython_dir = ipython_dir
579 self.ipython_dir = ipython_dir
580 return
580 return
581
581
582 self.ipython_dir = get_ipython_dir()
582 self.ipython_dir = get_ipython_dir()
583
583
584 def init_profile_dir(self, profile_dir):
584 def init_profile_dir(self, profile_dir):
585 if profile_dir is not None:
585 if profile_dir is not None:
586 self.profile_dir = profile_dir
586 self.profile_dir = profile_dir
587 return
587 return
588 self.profile_dir =\
588 self.profile_dir =\
589 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
589 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
590
590
591 def init_instance_attrs(self):
591 def init_instance_attrs(self):
592 self.more = False
592 self.more = False
593
593
594 # command compiler
594 # command compiler
595 self.compile = CachingCompiler()
595 self.compile = CachingCompiler()
596
596
597 # Make an empty namespace, which extension writers can rely on both
597 # Make an empty namespace, which extension writers can rely on both
598 # 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
599 # convenient location for storing additional information and state
599 # convenient location for storing additional information and state
600 # their extensions may require, without fear of collisions with other
600 # their extensions may require, without fear of collisions with other
601 # ipython names that may develop later.
601 # ipython names that may develop later.
602 self.meta = Struct()
602 self.meta = Struct()
603
603
604 # Temporary files used for various purposes. Deleted at exit.
604 # Temporary files used for various purposes. Deleted at exit.
605 self.tempfiles = []
605 self.tempfiles = []
606 self.tempdirs = []
606 self.tempdirs = []
607
607
608 # Keep track of readline usage (later set by init_readline)
608 # Keep track of readline usage (later set by init_readline)
609 self.has_readline = False
609 self.has_readline = False
610
610
611 # 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)
612 # This is not being used anywhere currently.
612 # This is not being used anywhere currently.
613 self.starting_dir = py3compat.getcwd()
613 self.starting_dir = py3compat.getcwd()
614
614
615 # Indentation management
615 # Indentation management
616 self.indent_current_nsp = 0
616 self.indent_current_nsp = 0
617
617
618 # Dict to track post-execution functions that have been registered
618 # Dict to track post-execution functions that have been registered
619 self._post_execute = {}
619 self._post_execute = {}
620
620
621 def init_environment(self):
621 def init_environment(self):
622 """Any changes we need to make to the user's environment."""
622 """Any changes we need to make to the user's environment."""
623 pass
623 pass
624
624
625 def init_encoding(self):
625 def init_encoding(self):
626 # Get system encoding at startup time. Certain terminals (like Emacs
626 # Get system encoding at startup time. Certain terminals (like Emacs
627 # 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
628 # encoding to use in the raw_input() method
628 # encoding to use in the raw_input() method
629 try:
629 try:
630 self.stdin_encoding = sys.stdin.encoding or 'ascii'
630 self.stdin_encoding = sys.stdin.encoding or 'ascii'
631 except AttributeError:
631 except AttributeError:
632 self.stdin_encoding = 'ascii'
632 self.stdin_encoding = 'ascii'
633
633
634 def init_syntax_highlighting(self):
634 def init_syntax_highlighting(self):
635 # Python source parser/formatter for syntax highlighting
635 # Python source parser/formatter for syntax highlighting
636 pyformat = PyColorize.Parser().format
636 pyformat = PyColorize.Parser().format
637 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
637 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
638
638
639 def init_pushd_popd_magic(self):
639 def init_pushd_popd_magic(self):
640 # for pushd/popd management
640 # for pushd/popd management
641 self.home_dir = get_home_dir()
641 self.home_dir = get_home_dir()
642
642
643 self.dir_stack = []
643 self.dir_stack = []
644
644
645 def init_logger(self):
645 def init_logger(self):
646 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
646 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
647 logmode='rotate')
647 logmode='rotate')
648
648
649 def init_logstart(self):
649 def init_logstart(self):
650 """Initialize logging in case it was requested at the command line.
650 """Initialize logging in case it was requested at the command line.
651 """
651 """
652 if self.logappend:
652 if self.logappend:
653 self.magic('logstart %s append' % self.logappend)
653 self.magic('logstart %s append' % self.logappend)
654 elif self.logfile:
654 elif self.logfile:
655 self.magic('logstart %s' % self.logfile)
655 self.magic('logstart %s' % self.logfile)
656 elif self.logstart:
656 elif self.logstart:
657 self.magic('logstart')
657 self.magic('logstart')
658
658
659 def init_builtins(self):
659 def init_builtins(self):
660 # 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
661 # 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
662 # removing on exit or representing the existence of more than one
662 # removing on exit or representing the existence of more than one
663 # IPython at a time.
663 # IPython at a time.
664 builtin_mod.__dict__['__IPYTHON__'] = True
664 builtin_mod.__dict__['__IPYTHON__'] = True
665
665
666 # 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
667 # 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
668 # 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
669 # 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
670 # eventually remove it after a few more releases.
670 # eventually remove it after a few more releases.
671 builtin_mod.__dict__['__IPYTHON__active'] = \
671 builtin_mod.__dict__['__IPYTHON__active'] = \
672 'Deprecated, check for __IPYTHON__'
672 'Deprecated, check for __IPYTHON__'
673
673
674 self.builtin_trap = BuiltinTrap(shell=self)
674 self.builtin_trap = BuiltinTrap(shell=self)
675
675
676 def init_inspector(self):
676 def init_inspector(self):
677 # Object inspector
677 # Object inspector
678 self.inspector = oinspect.Inspector(oinspect.InspectColors,
678 self.inspector = oinspect.Inspector(oinspect.InspectColors,
679 PyColorize.ANSICodeColors,
679 PyColorize.ANSICodeColors,
680 'NoColor',
680 'NoColor',
681 self.object_info_string_level)
681 self.object_info_string_level)
682
682
683 def init_io(self):
683 def init_io(self):
684 # 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
685 # 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
686 # *before* instantiating this class, because io holds onto
686 # *before* instantiating this class, because io holds onto
687 # references to the underlying streams.
687 # references to the underlying streams.
688 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:
689 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
689 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
690 else:
690 else:
691 io.stdout = io.IOStream(sys.stdout)
691 io.stdout = io.IOStream(sys.stdout)
692 io.stderr = io.IOStream(sys.stderr)
692 io.stderr = io.IOStream(sys.stderr)
693
693
694 def init_prompts(self):
694 def init_prompts(self):
695 self.prompt_manager = PromptManager(shell=self, parent=self)
695 self.prompt_manager = PromptManager(shell=self, parent=self)
696 self.configurables.append(self.prompt_manager)
696 self.configurables.append(self.prompt_manager)
697 # 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
698 # interactively.
698 # interactively.
699 sys.ps1 = 'In : '
699 sys.ps1 = 'In : '
700 sys.ps2 = '...: '
700 sys.ps2 = '...: '
701 sys.ps3 = 'Out: '
701 sys.ps3 = 'Out: '
702
702
703 def init_display_formatter(self):
703 def init_display_formatter(self):
704 self.display_formatter = DisplayFormatter(parent=self)
704 self.display_formatter = DisplayFormatter(parent=self)
705 self.configurables.append(self.display_formatter)
705 self.configurables.append(self.display_formatter)
706
706
707 def init_display_pub(self):
707 def init_display_pub(self):
708 self.display_pub = self.display_pub_class(parent=self)
708 self.display_pub = self.display_pub_class(parent=self)
709 self.configurables.append(self.display_pub)
709 self.configurables.append(self.display_pub)
710
710
711 def init_data_pub(self):
711 def init_data_pub(self):
712 if not self.data_pub_class:
712 if not self.data_pub_class:
713 self.data_pub = None
713 self.data_pub = None
714 return
714 return
715 self.data_pub = self.data_pub_class(parent=self)
715 self.data_pub = self.data_pub_class(parent=self)
716 self.configurables.append(self.data_pub)
716 self.configurables.append(self.data_pub)
717
717
718 def init_displayhook(self):
718 def init_displayhook(self):
719 # Initialize displayhook, set in/out prompts and printing system
719 # Initialize displayhook, set in/out prompts and printing system
720 self.displayhook = self.displayhook_class(
720 self.displayhook = self.displayhook_class(
721 parent=self,
721 parent=self,
722 shell=self,
722 shell=self,
723 cache_size=self.cache_size,
723 cache_size=self.cache_size,
724 )
724 )
725 self.configurables.append(self.displayhook)
725 self.configurables.append(self.displayhook)
726 # This is a context manager that installs/revmoes the displayhook at
726 # This is a context manager that installs/revmoes the displayhook at
727 # the appropriate time.
727 # the appropriate time.
728 self.display_trap = DisplayTrap(hook=self.displayhook)
728 self.display_trap = DisplayTrap(hook=self.displayhook)
729
729
730 def init_virtualenv(self):
730 def init_virtualenv(self):
731 """Add a virtualenv to sys.path so the user can import modules from it.
731 """Add a virtualenv to sys.path so the user can import modules from it.
732 This isn't perfect: it doesn't use the Python interpreter with which the
732 This isn't perfect: it doesn't use the Python interpreter with which the
733 virtualenv was built, and it ignores the --no-site-packages option. A
733 virtualenv was built, and it ignores the --no-site-packages option. A
734 warning will appear suggesting the user installs IPython in the
734 warning will appear suggesting the user installs IPython in the
735 virtualenv, but for many cases, it probably works well enough.
735 virtualenv, but for many cases, it probably works well enough.
736
736
737 Adapted from code snippets online.
737 Adapted from code snippets online.
738
738
739 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
739 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
740 """
740 """
741 if 'VIRTUAL_ENV' not in os.environ:
741 if 'VIRTUAL_ENV' not in os.environ:
742 # Not in a virtualenv
742 # Not in a virtualenv
743 return
743 return
744
744
745 # venv detection:
745 # venv detection:
746 # stdlib venv may symlink sys.executable, so we can't use realpath.
746 # stdlib venv may symlink sys.executable, so we can't use realpath.
747 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
747 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
748 # So we just check every item in the symlink tree (generally <= 3)
748 # So we just check every item in the symlink tree (generally <= 3)
749 p = os.path.normcase(sys.executable)
749 p = os.path.normcase(sys.executable)
750 paths = [p]
750 paths = [p]
751 while os.path.islink(p):
751 while os.path.islink(p):
752 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
752 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
753 paths.append(p)
753 paths.append(p)
754 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
754 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
755 if any(p.startswith(p_venv) for p in paths):
755 if any(p.startswith(p_venv) for p in paths):
756 # Running properly in the virtualenv, don't need to do anything
756 # Running properly in the virtualenv, don't need to do anything
757 return
757 return
758
758
759 warn("Attempting to work in a virtualenv. If you encounter problems, please "
759 warn("Attempting to work in a virtualenv. If you encounter problems, please "
760 "install IPython inside the virtualenv.")
760 "install IPython inside the virtualenv.")
761 if sys.platform == "win32":
761 if sys.platform == "win32":
762 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
762 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
763 else:
763 else:
764 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
764 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
765 'python%d.%d' % sys.version_info[:2], 'site-packages')
765 'python%d.%d' % sys.version_info[:2], 'site-packages')
766
766
767 import site
767 import site
768 sys.path.insert(0, virtual_env)
768 sys.path.insert(0, virtual_env)
769 site.addsitedir(virtual_env)
769 site.addsitedir(virtual_env)
770
770
771 #-------------------------------------------------------------------------
771 #-------------------------------------------------------------------------
772 # Things related to injections into the sys module
772 # Things related to injections into the sys module
773 #-------------------------------------------------------------------------
773 #-------------------------------------------------------------------------
774
774
775 def save_sys_module_state(self):
775 def save_sys_module_state(self):
776 """Save the state of hooks in the sys module.
776 """Save the state of hooks in the sys module.
777
777
778 This has to be called after self.user_module is created.
778 This has to be called after self.user_module is created.
779 """
779 """
780 self._orig_sys_module_state = {}
780 self._orig_sys_module_state = {}
781 self._orig_sys_module_state['stdin'] = sys.stdin
781 self._orig_sys_module_state['stdin'] = sys.stdin
782 self._orig_sys_module_state['stdout'] = sys.stdout
782 self._orig_sys_module_state['stdout'] = sys.stdout
783 self._orig_sys_module_state['stderr'] = sys.stderr
783 self._orig_sys_module_state['stderr'] = sys.stderr
784 self._orig_sys_module_state['excepthook'] = sys.excepthook
784 self._orig_sys_module_state['excepthook'] = sys.excepthook
785 self._orig_sys_modules_main_name = self.user_module.__name__
785 self._orig_sys_modules_main_name = self.user_module.__name__
786 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
786 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
787
787
788 def restore_sys_module_state(self):
788 def restore_sys_module_state(self):
789 """Restore the state of the sys module."""
789 """Restore the state of the sys module."""
790 try:
790 try:
791 for k, v in iteritems(self._orig_sys_module_state):
791 for k, v in iteritems(self._orig_sys_module_state):
792 setattr(sys, k, v)
792 setattr(sys, k, v)
793 except AttributeError:
793 except AttributeError:
794 pass
794 pass
795 # Reset what what done in self.init_sys_modules
795 # Reset what what done in self.init_sys_modules
796 if self._orig_sys_modules_main_mod is not None:
796 if self._orig_sys_modules_main_mod is not None:
797 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
797 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
798
798
799 #-------------------------------------------------------------------------
799 #-------------------------------------------------------------------------
800 # Things related to the banner
800 # Things related to the banner
801 #-------------------------------------------------------------------------
801 #-------------------------------------------------------------------------
802
802
803 @property
803 @property
804 def banner(self):
804 def banner(self):
805 banner = self.banner1
805 banner = self.banner1
806 if self.profile and self.profile != 'default':
806 if self.profile and self.profile != 'default':
807 banner += '\nIPython profile: %s\n' % self.profile
807 banner += '\nIPython profile: %s\n' % self.profile
808 if self.banner2:
808 if self.banner2:
809 banner += '\n' + self.banner2
809 banner += '\n' + self.banner2
810 return banner
810 return banner
811
811
812 def show_banner(self, banner=None):
812 def show_banner(self, banner=None):
813 if banner is None:
813 if banner is None:
814 banner = self.banner
814 banner = self.banner
815 self.write(banner)
815 self.write(banner)
816
816
817 #-------------------------------------------------------------------------
817 #-------------------------------------------------------------------------
818 # Things related to hooks
818 # Things related to hooks
819 #-------------------------------------------------------------------------
819 #-------------------------------------------------------------------------
820
820
821 def init_hooks(self):
821 def init_hooks(self):
822 # hooks holds pointers used for user-side customizations
822 # hooks holds pointers used for user-side customizations
823 self.hooks = Struct()
823 self.hooks = Struct()
824
824
825 self.strdispatchers = {}
825 self.strdispatchers = {}
826
826
827 # Set all default hooks, defined in the IPython.hooks module.
827 # Set all default hooks, defined in the IPython.hooks module.
828 hooks = IPython.core.hooks
828 hooks = IPython.core.hooks
829 for hook_name in hooks.__all__:
829 for hook_name in hooks.__all__:
830 # default hooks have priority 100, i.e. low; user hooks should have
830 # default hooks have priority 100, i.e. low; user hooks should have
831 # 0-100 priority
831 # 0-100 priority
832 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
832 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
833
833
834 if self.display_page:
834 if self.display_page:
835 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
835 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
836
836
837 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
837 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
838 _warn_deprecated=True):
838 _warn_deprecated=True):
839 """set_hook(name,hook) -> sets an internal IPython hook.
839 """set_hook(name,hook) -> sets an internal IPython hook.
840
840
841 IPython exposes some of its internal API as user-modifiable hooks. By
841 IPython exposes some of its internal API as user-modifiable hooks. By
842 adding your function to one of these hooks, you can modify IPython's
842 adding your function to one of these hooks, you can modify IPython's
843 behavior to call at runtime your own routines."""
843 behavior to call at runtime your own routines."""
844
844
845 # At some point in the future, this should validate the hook before it
845 # At some point in the future, this should validate the hook before it
846 # accepts it. Probably at least check that the hook takes the number
846 # accepts it. Probably at least check that the hook takes the number
847 # of args it's supposed to.
847 # of args it's supposed to.
848
848
849 f = types.MethodType(hook,self)
849 f = types.MethodType(hook,self)
850
850
851 # check if the hook is for strdispatcher first
851 # check if the hook is for strdispatcher first
852 if str_key is not None:
852 if str_key is not None:
853 sdp = self.strdispatchers.get(name, StrDispatch())
853 sdp = self.strdispatchers.get(name, StrDispatch())
854 sdp.add_s(str_key, f, priority )
854 sdp.add_s(str_key, f, priority )
855 self.strdispatchers[name] = sdp
855 self.strdispatchers[name] = sdp
856 return
856 return
857 if re_key is not None:
857 if re_key is not None:
858 sdp = self.strdispatchers.get(name, StrDispatch())
858 sdp = self.strdispatchers.get(name, StrDispatch())
859 sdp.add_re(re.compile(re_key), f, priority )
859 sdp.add_re(re.compile(re_key), f, priority )
860 self.strdispatchers[name] = sdp
860 self.strdispatchers[name] = sdp
861 return
861 return
862
862
863 dp = getattr(self.hooks, name, None)
863 dp = getattr(self.hooks, name, None)
864 if name not in IPython.core.hooks.__all__:
864 if name not in IPython.core.hooks.__all__:
865 print("Warning! Hook '%s' is not one of %s" % \
865 print("Warning! Hook '%s' is not one of %s" % \
866 (name, IPython.core.hooks.__all__ ))
866 (name, IPython.core.hooks.__all__ ))
867
867
868 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
868 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
869 alternative = IPython.core.hooks.deprecated[name]
869 alternative = IPython.core.hooks.deprecated[name]
870 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative))
870 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative))
871
871
872 if not dp:
872 if not dp:
873 dp = IPython.core.hooks.CommandChainDispatcher()
873 dp = IPython.core.hooks.CommandChainDispatcher()
874
874
875 try:
875 try:
876 dp.add(f,priority)
876 dp.add(f,priority)
877 except AttributeError:
877 except AttributeError:
878 # it was not commandchain, plain old func - replace
878 # it was not commandchain, plain old func - replace
879 dp = f
879 dp = f
880
880
881 setattr(self.hooks,name, dp)
881 setattr(self.hooks,name, dp)
882
882
883 #-------------------------------------------------------------------------
883 #-------------------------------------------------------------------------
884 # Things related to events
884 # Things related to events
885 #-------------------------------------------------------------------------
885 #-------------------------------------------------------------------------
886
886
887 def init_events(self):
887 def init_events(self):
888 self.events = EventManager(self, available_events)
888 self.events = EventManager(self, available_events)
889
889
890 self.events.register("pre_execute", self._clear_warning_registry)
890 self.events.register("pre_execute", self._clear_warning_registry)
891
891
892 def register_post_execute(self, func):
892 def register_post_execute(self, func):
893 """DEPRECATED: Use ip.events.register('post_run_cell', func)
893 """DEPRECATED: Use ip.events.register('post_run_cell', func)
894
894
895 Register a function for calling after code execution.
895 Register a function for calling after code execution.
896 """
896 """
897 warn("ip.register_post_execute is deprecated, use "
897 warn("ip.register_post_execute is deprecated, use "
898 "ip.events.register('post_run_cell', func) instead.")
898 "ip.events.register('post_run_cell', func) instead.")
899 self.events.register('post_run_cell', func)
899 self.events.register('post_run_cell', func)
900
900
901 def _clear_warning_registry(self):
901 def _clear_warning_registry(self):
902 # clear the warning registry, so that different code blocks with
902 # clear the warning registry, so that different code blocks with
903 # overlapping line number ranges don't cause spurious suppression of
903 # overlapping line number ranges don't cause spurious suppression of
904 # warnings (see gh-6611 for details)
904 # warnings (see gh-6611 for details)
905 if "__warningregistry__" in self.user_global_ns:
905 if "__warningregistry__" in self.user_global_ns:
906 del self.user_global_ns["__warningregistry__"]
906 del self.user_global_ns["__warningregistry__"]
907
907
908 #-------------------------------------------------------------------------
908 #-------------------------------------------------------------------------
909 # Things related to the "main" module
909 # Things related to the "main" module
910 #-------------------------------------------------------------------------
910 #-------------------------------------------------------------------------
911
911
912 def new_main_mod(self, filename, modname):
912 def new_main_mod(self, filename, modname):
913 """Return a new 'main' module object for user code execution.
913 """Return a new 'main' module object for user code execution.
914
914
915 ``filename`` should be the path of the script which will be run in the
915 ``filename`` should be the path of the script which will be run in the
916 module. Requests with the same filename will get the same module, with
916 module. Requests with the same filename will get the same module, with
917 its namespace cleared.
917 its namespace cleared.
918
918
919 ``modname`` should be the module name - normally either '__main__' or
919 ``modname`` should be the module name - normally either '__main__' or
920 the basename of the file without the extension.
920 the basename of the file without the extension.
921
921
922 When scripts are executed via %run, we must keep a reference to their
922 When scripts are executed via %run, we must keep a reference to their
923 __main__ module around so that Python doesn't
923 __main__ module around so that Python doesn't
924 clear it, rendering references to module globals useless.
924 clear it, rendering references to module globals useless.
925
925
926 This method keeps said reference in a private dict, keyed by the
926 This method keeps said reference in a private dict, keyed by the
927 absolute path of the script. This way, for multiple executions of the
927 absolute path of the script. This way, for multiple executions of the
928 same script we only keep one copy of the namespace (the last one),
928 same script we only keep one copy of the namespace (the last one),
929 thus preventing memory leaks from old references while allowing the
929 thus preventing memory leaks from old references while allowing the
930 objects from the last execution to be accessible.
930 objects from the last execution to be accessible.
931 """
931 """
932 filename = os.path.abspath(filename)
932 filename = os.path.abspath(filename)
933 try:
933 try:
934 main_mod = self._main_mod_cache[filename]
934 main_mod = self._main_mod_cache[filename]
935 except KeyError:
935 except KeyError:
936 main_mod = self._main_mod_cache[filename] = types.ModuleType(
936 main_mod = self._main_mod_cache[filename] = types.ModuleType(
937 py3compat.cast_bytes_py2(modname),
937 py3compat.cast_bytes_py2(modname),
938 doc="Module created for script run in IPython")
938 doc="Module created for script run in IPython")
939 else:
939 else:
940 main_mod.__dict__.clear()
940 main_mod.__dict__.clear()
941 main_mod.__name__ = modname
941 main_mod.__name__ = modname
942
942
943 main_mod.__file__ = filename
943 main_mod.__file__ = filename
944 # It seems pydoc (and perhaps others) needs any module instance to
944 # It seems pydoc (and perhaps others) needs any module instance to
945 # implement a __nonzero__ method
945 # implement a __nonzero__ method
946 main_mod.__nonzero__ = lambda : True
946 main_mod.__nonzero__ = lambda : True
947
947
948 return main_mod
948 return main_mod
949
949
950 def clear_main_mod_cache(self):
950 def clear_main_mod_cache(self):
951 """Clear the cache of main modules.
951 """Clear the cache of main modules.
952
952
953 Mainly for use by utilities like %reset.
953 Mainly for use by utilities like %reset.
954
954
955 Examples
955 Examples
956 --------
956 --------
957
957
958 In [15]: import IPython
958 In [15]: import IPython
959
959
960 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
960 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
961
961
962 In [17]: len(_ip._main_mod_cache) > 0
962 In [17]: len(_ip._main_mod_cache) > 0
963 Out[17]: True
963 Out[17]: True
964
964
965 In [18]: _ip.clear_main_mod_cache()
965 In [18]: _ip.clear_main_mod_cache()
966
966
967 In [19]: len(_ip._main_mod_cache) == 0
967 In [19]: len(_ip._main_mod_cache) == 0
968 Out[19]: True
968 Out[19]: True
969 """
969 """
970 self._main_mod_cache.clear()
970 self._main_mod_cache.clear()
971
971
972 #-------------------------------------------------------------------------
972 #-------------------------------------------------------------------------
973 # Things related to debugging
973 # Things related to debugging
974 #-------------------------------------------------------------------------
974 #-------------------------------------------------------------------------
975
975
976 def init_pdb(self):
976 def init_pdb(self):
977 # Set calling of pdb on exceptions
977 # Set calling of pdb on exceptions
978 # self.call_pdb is a property
978 # self.call_pdb is a property
979 self.call_pdb = self.pdb
979 self.call_pdb = self.pdb
980
980
981 def _get_call_pdb(self):
981 def _get_call_pdb(self):
982 return self._call_pdb
982 return self._call_pdb
983
983
984 def _set_call_pdb(self,val):
984 def _set_call_pdb(self,val):
985
985
986 if val not in (0,1,False,True):
986 if val not in (0,1,False,True):
987 raise ValueError('new call_pdb value must be boolean')
987 raise ValueError('new call_pdb value must be boolean')
988
988
989 # store value in instance
989 # store value in instance
990 self._call_pdb = val
990 self._call_pdb = val
991
991
992 # notify the actual exception handlers
992 # notify the actual exception handlers
993 self.InteractiveTB.call_pdb = val
993 self.InteractiveTB.call_pdb = val
994
994
995 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
995 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
996 'Control auto-activation of pdb at exceptions')
996 'Control auto-activation of pdb at exceptions')
997
997
998 def debugger(self,force=False):
998 def debugger(self,force=False):
999 """Call the pydb/pdb debugger.
999 """Call the pydb/pdb debugger.
1000
1000
1001 Keywords:
1001 Keywords:
1002
1002
1003 - force(False): by default, this routine checks the instance call_pdb
1003 - force(False): by default, this routine checks the instance call_pdb
1004 flag and does not actually invoke the debugger if the flag is false.
1004 flag and does not actually invoke the debugger if the flag is false.
1005 The 'force' option forces the debugger to activate even if the flag
1005 The 'force' option forces the debugger to activate even if the flag
1006 is false.
1006 is false.
1007 """
1007 """
1008
1008
1009 if not (force or self.call_pdb):
1009 if not (force or self.call_pdb):
1010 return
1010 return
1011
1011
1012 if not hasattr(sys,'last_traceback'):
1012 if not hasattr(sys,'last_traceback'):
1013 error('No traceback has been produced, nothing to debug.')
1013 error('No traceback has been produced, nothing to debug.')
1014 return
1014 return
1015
1015
1016 # use pydb if available
1016 # use pydb if available
1017 if debugger.has_pydb:
1017 if debugger.has_pydb:
1018 from pydb import pm
1018 from pydb import pm
1019 else:
1019 else:
1020 # fallback to our internal debugger
1020 # fallback to our internal debugger
1021 pm = lambda : self.InteractiveTB.debugger(force=True)
1021 pm = lambda : self.InteractiveTB.debugger(force=True)
1022
1022
1023 with self.readline_no_record:
1023 with self.readline_no_record:
1024 pm()
1024 pm()
1025
1025
1026 #-------------------------------------------------------------------------
1026 #-------------------------------------------------------------------------
1027 # Things related to IPython's various namespaces
1027 # Things related to IPython's various namespaces
1028 #-------------------------------------------------------------------------
1028 #-------------------------------------------------------------------------
1029 default_user_namespaces = True
1029 default_user_namespaces = True
1030
1030
1031 def init_create_namespaces(self, user_module=None, user_ns=None):
1031 def init_create_namespaces(self, user_module=None, user_ns=None):
1032 # Create the namespace where the user will operate. user_ns is
1032 # Create the namespace where the user will operate. user_ns is
1033 # normally the only one used, and it is passed to the exec calls as
1033 # normally the only one used, and it is passed to the exec calls as
1034 # the locals argument. But we do carry a user_global_ns namespace
1034 # the locals argument. But we do carry a user_global_ns namespace
1035 # given as the exec 'globals' argument, This is useful in embedding
1035 # given as the exec 'globals' argument, This is useful in embedding
1036 # situations where the ipython shell opens in a context where the
1036 # situations where the ipython shell opens in a context where the
1037 # distinction between locals and globals is meaningful. For
1037 # distinction between locals and globals is meaningful. For
1038 # non-embedded contexts, it is just the same object as the user_ns dict.
1038 # non-embedded contexts, it is just the same object as the user_ns dict.
1039
1039
1040 # FIXME. For some strange reason, __builtins__ is showing up at user
1040 # FIXME. For some strange reason, __builtins__ is showing up at user
1041 # level as a dict instead of a module. This is a manual fix, but I
1041 # level as a dict instead of a module. This is a manual fix, but I
1042 # should really track down where the problem is coming from. Alex
1042 # should really track down where the problem is coming from. Alex
1043 # Schmolck reported this problem first.
1043 # Schmolck reported this problem first.
1044
1044
1045 # A useful post by Alex Martelli on this topic:
1045 # A useful post by Alex Martelli on this topic:
1046 # Re: inconsistent value from __builtins__
1046 # Re: inconsistent value from __builtins__
1047 # Von: Alex Martelli <aleaxit@yahoo.com>
1047 # Von: Alex Martelli <aleaxit@yahoo.com>
1048 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1048 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1049 # Gruppen: comp.lang.python
1049 # Gruppen: comp.lang.python
1050
1050
1051 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1051 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1052 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1052 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1053 # > <type 'dict'>
1053 # > <type 'dict'>
1054 # > >>> print type(__builtins__)
1054 # > >>> print type(__builtins__)
1055 # > <type 'module'>
1055 # > <type 'module'>
1056 # > Is this difference in return value intentional?
1056 # > Is this difference in return value intentional?
1057
1057
1058 # Well, it's documented that '__builtins__' can be either a dictionary
1058 # Well, it's documented that '__builtins__' can be either a dictionary
1059 # or a module, and it's been that way for a long time. Whether it's
1059 # or a module, and it's been that way for a long time. Whether it's
1060 # intentional (or sensible), I don't know. In any case, the idea is
1060 # intentional (or sensible), I don't know. In any case, the idea is
1061 # that if you need to access the built-in namespace directly, you
1061 # that if you need to access the built-in namespace directly, you
1062 # should start with "import __builtin__" (note, no 's') which will
1062 # should start with "import __builtin__" (note, no 's') which will
1063 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1063 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1064
1064
1065 # These routines return a properly built module and dict as needed by
1065 # These routines return a properly built module and dict as needed by
1066 # the rest of the code, and can also be used by extension writers to
1066 # the rest of the code, and can also be used by extension writers to
1067 # generate properly initialized namespaces.
1067 # generate properly initialized namespaces.
1068 if (user_ns is not None) or (user_module is not None):
1068 if (user_ns is not None) or (user_module is not None):
1069 self.default_user_namespaces = False
1069 self.default_user_namespaces = False
1070 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1070 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1071
1071
1072 # A record of hidden variables we have added to the user namespace, so
1072 # A record of hidden variables we have added to the user namespace, so
1073 # we can list later only variables defined in actual interactive use.
1073 # we can list later only variables defined in actual interactive use.
1074 self.user_ns_hidden = {}
1074 self.user_ns_hidden = {}
1075
1075
1076 # Now that FakeModule produces a real module, we've run into a nasty
1076 # Now that FakeModule produces a real module, we've run into a nasty
1077 # problem: after script execution (via %run), the module where the user
1077 # problem: after script execution (via %run), the module where the user
1078 # code ran is deleted. Now that this object is a true module (needed
1078 # code ran is deleted. Now that this object is a true module (needed
1079 # so docetst and other tools work correctly), the Python module
1079 # so docetst and other tools work correctly), the Python module
1080 # teardown mechanism runs over it, and sets to None every variable
1080 # teardown mechanism runs over it, and sets to None every variable
1081 # present in that module. Top-level references to objects from the
1081 # present in that module. Top-level references to objects from the
1082 # script survive, because the user_ns is updated with them. However,
1082 # script survive, because the user_ns is updated with them. However,
1083 # calling functions defined in the script that use other things from
1083 # calling functions defined in the script that use other things from
1084 # the script will fail, because the function's closure had references
1084 # the script will fail, because the function's closure had references
1085 # to the original objects, which are now all None. So we must protect
1085 # to the original objects, which are now all None. So we must protect
1086 # these modules from deletion by keeping a cache.
1086 # these modules from deletion by keeping a cache.
1087 #
1087 #
1088 # To avoid keeping stale modules around (we only need the one from the
1088 # To avoid keeping stale modules around (we only need the one from the
1089 # last run), we use a dict keyed with the full path to the script, so
1089 # last run), we use a dict keyed with the full path to the script, so
1090 # only the last version of the module is held in the cache. Note,
1090 # only the last version of the module is held in the cache. Note,
1091 # however, that we must cache the module *namespace contents* (their
1091 # however, that we must cache the module *namespace contents* (their
1092 # __dict__). Because if we try to cache the actual modules, old ones
1092 # __dict__). Because if we try to cache the actual modules, old ones
1093 # (uncached) could be destroyed while still holding references (such as
1093 # (uncached) could be destroyed while still holding references (such as
1094 # those held by GUI objects that tend to be long-lived)>
1094 # those held by GUI objects that tend to be long-lived)>
1095 #
1095 #
1096 # The %reset command will flush this cache. See the cache_main_mod()
1096 # The %reset command will flush this cache. See the cache_main_mod()
1097 # and clear_main_mod_cache() methods for details on use.
1097 # and clear_main_mod_cache() methods for details on use.
1098
1098
1099 # This is the cache used for 'main' namespaces
1099 # This is the cache used for 'main' namespaces
1100 self._main_mod_cache = {}
1100 self._main_mod_cache = {}
1101
1101
1102 # A table holding all the namespaces IPython deals with, so that
1102 # A table holding all the namespaces IPython deals with, so that
1103 # introspection facilities can search easily.
1103 # introspection facilities can search easily.
1104 self.ns_table = {'user_global':self.user_module.__dict__,
1104 self.ns_table = {'user_global':self.user_module.__dict__,
1105 'user_local':self.user_ns,
1105 'user_local':self.user_ns,
1106 'builtin':builtin_mod.__dict__
1106 'builtin':builtin_mod.__dict__
1107 }
1107 }
1108
1108
1109 @property
1109 @property
1110 def user_global_ns(self):
1110 def user_global_ns(self):
1111 return self.user_module.__dict__
1111 return self.user_module.__dict__
1112
1112
1113 def prepare_user_module(self, user_module=None, user_ns=None):
1113 def prepare_user_module(self, user_module=None, user_ns=None):
1114 """Prepare the module and namespace in which user code will be run.
1114 """Prepare the module and namespace in which user code will be run.
1115
1115
1116 When IPython is started normally, both parameters are None: a new module
1116 When IPython is started normally, both parameters are None: a new module
1117 is created automatically, and its __dict__ used as the namespace.
1117 is created automatically, and its __dict__ used as the namespace.
1118
1118
1119 If only user_module is provided, its __dict__ is used as the namespace.
1119 If only user_module is provided, its __dict__ is used as the namespace.
1120 If only user_ns is provided, a dummy module is created, and user_ns
1120 If only user_ns is provided, a dummy module is created, and user_ns
1121 becomes the global namespace. If both are provided (as they may be
1121 becomes the global namespace. If both are provided (as they may be
1122 when embedding), user_ns is the local namespace, and user_module
1122 when embedding), user_ns is the local namespace, and user_module
1123 provides the global namespace.
1123 provides the global namespace.
1124
1124
1125 Parameters
1125 Parameters
1126 ----------
1126 ----------
1127 user_module : module, optional
1127 user_module : module, optional
1128 The current user module in which IPython is being run. If None,
1128 The current user module in which IPython is being run. If None,
1129 a clean module will be created.
1129 a clean module will be created.
1130 user_ns : dict, optional
1130 user_ns : dict, optional
1131 A namespace in which to run interactive commands.
1131 A namespace in which to run interactive commands.
1132
1132
1133 Returns
1133 Returns
1134 -------
1134 -------
1135 A tuple of user_module and user_ns, each properly initialised.
1135 A tuple of user_module and user_ns, each properly initialised.
1136 """
1136 """
1137 if user_module is None and user_ns is not None:
1137 if user_module is None and user_ns is not None:
1138 user_ns.setdefault("__name__", "__main__")
1138 user_ns.setdefault("__name__", "__main__")
1139 user_module = DummyMod()
1139 user_module = DummyMod()
1140 user_module.__dict__ = user_ns
1140 user_module.__dict__ = user_ns
1141
1141
1142 if user_module is None:
1142 if user_module is None:
1143 user_module = types.ModuleType("__main__",
1143 user_module = types.ModuleType("__main__",
1144 doc="Automatically created module for IPython interactive environment")
1144 doc="Automatically created module for IPython interactive environment")
1145
1145
1146 # We must ensure that __builtin__ (without the final 's') is always
1146 # We must ensure that __builtin__ (without the final 's') is always
1147 # available and pointing to the __builtin__ *module*. For more details:
1147 # available and pointing to the __builtin__ *module*. For more details:
1148 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1148 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1149 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1149 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1150 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1150 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1151
1151
1152 if user_ns is None:
1152 if user_ns is None:
1153 user_ns = user_module.__dict__
1153 user_ns = user_module.__dict__
1154
1154
1155 return user_module, user_ns
1155 return user_module, user_ns
1156
1156
1157 def init_sys_modules(self):
1157 def init_sys_modules(self):
1158 # We need to insert into sys.modules something that looks like a
1158 # We need to insert into sys.modules something that looks like a
1159 # module but which accesses the IPython namespace, for shelve and
1159 # module but which accesses the IPython namespace, for shelve and
1160 # pickle to work interactively. Normally they rely on getting
1160 # pickle to work interactively. Normally they rely on getting
1161 # everything out of __main__, but for embedding purposes each IPython
1161 # everything out of __main__, but for embedding purposes each IPython
1162 # instance has its own private namespace, so we can't go shoving
1162 # instance has its own private namespace, so we can't go shoving
1163 # everything into __main__.
1163 # everything into __main__.
1164
1164
1165 # note, however, that we should only do this for non-embedded
1165 # note, however, that we should only do this for non-embedded
1166 # ipythons, which really mimic the __main__.__dict__ with their own
1166 # ipythons, which really mimic the __main__.__dict__ with their own
1167 # namespace. Embedded instances, on the other hand, should not do
1167 # namespace. Embedded instances, on the other hand, should not do
1168 # this because they need to manage the user local/global namespaces
1168 # this because they need to manage the user local/global namespaces
1169 # only, but they live within a 'normal' __main__ (meaning, they
1169 # only, but they live within a 'normal' __main__ (meaning, they
1170 # shouldn't overtake the execution environment of the script they're
1170 # shouldn't overtake the execution environment of the script they're
1171 # embedded in).
1171 # embedded in).
1172
1172
1173 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1173 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1174 main_name = self.user_module.__name__
1174 main_name = self.user_module.__name__
1175 sys.modules[main_name] = self.user_module
1175 sys.modules[main_name] = self.user_module
1176
1176
1177 def init_user_ns(self):
1177 def init_user_ns(self):
1178 """Initialize all user-visible namespaces to their minimum defaults.
1178 """Initialize all user-visible namespaces to their minimum defaults.
1179
1179
1180 Certain history lists are also initialized here, as they effectively
1180 Certain history lists are also initialized here, as they effectively
1181 act as user namespaces.
1181 act as user namespaces.
1182
1182
1183 Notes
1183 Notes
1184 -----
1184 -----
1185 All data structures here are only filled in, they are NOT reset by this
1185 All data structures here are only filled in, they are NOT reset by this
1186 method. If they were not empty before, data will simply be added to
1186 method. If they were not empty before, data will simply be added to
1187 therm.
1187 therm.
1188 """
1188 """
1189 # This function works in two parts: first we put a few things in
1189 # This function works in two parts: first we put a few things in
1190 # user_ns, and we sync that contents into user_ns_hidden so that these
1190 # user_ns, and we sync that contents into user_ns_hidden so that these
1191 # initial variables aren't shown by %who. After the sync, we add the
1191 # initial variables aren't shown by %who. After the sync, we add the
1192 # rest of what we *do* want the user to see with %who even on a new
1192 # rest of what we *do* want the user to see with %who even on a new
1193 # session (probably nothing, so theye really only see their own stuff)
1193 # session (probably nothing, so theye really only see their own stuff)
1194
1194
1195 # The user dict must *always* have a __builtin__ reference to the
1195 # The user dict must *always* have a __builtin__ reference to the
1196 # Python standard __builtin__ namespace, which must be imported.
1196 # Python standard __builtin__ namespace, which must be imported.
1197 # This is so that certain operations in prompt evaluation can be
1197 # This is so that certain operations in prompt evaluation can be
1198 # reliably executed with builtins. Note that we can NOT use
1198 # reliably executed with builtins. Note that we can NOT use
1199 # __builtins__ (note the 's'), because that can either be a dict or a
1199 # __builtins__ (note the 's'), because that can either be a dict or a
1200 # module, and can even mutate at runtime, depending on the context
1200 # module, and can even mutate at runtime, depending on the context
1201 # (Python makes no guarantees on it). In contrast, __builtin__ is
1201 # (Python makes no guarantees on it). In contrast, __builtin__ is
1202 # always a module object, though it must be explicitly imported.
1202 # always a module object, though it must be explicitly imported.
1203
1203
1204 # For more details:
1204 # For more details:
1205 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1205 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1206 ns = dict()
1206 ns = dict()
1207
1207
1208 # make global variables for user access to the histories
1208 # make global variables for user access to the histories
1209 ns['_ih'] = self.history_manager.input_hist_parsed
1209 ns['_ih'] = self.history_manager.input_hist_parsed
1210 ns['_oh'] = self.history_manager.output_hist
1210 ns['_oh'] = self.history_manager.output_hist
1211 ns['_dh'] = self.history_manager.dir_hist
1211 ns['_dh'] = self.history_manager.dir_hist
1212
1212
1213 ns['_sh'] = shadowns
1213 ns['_sh'] = shadowns
1214
1214
1215 # user aliases to input and output histories. These shouldn't show up
1215 # user aliases to input and output histories. These shouldn't show up
1216 # in %who, as they can have very large reprs.
1216 # in %who, as they can have very large reprs.
1217 ns['In'] = self.history_manager.input_hist_parsed
1217 ns['In'] = self.history_manager.input_hist_parsed
1218 ns['Out'] = self.history_manager.output_hist
1218 ns['Out'] = self.history_manager.output_hist
1219
1219
1220 # Store myself as the public api!!!
1220 # Store myself as the public api!!!
1221 ns['get_ipython'] = self.get_ipython
1221 ns['get_ipython'] = self.get_ipython
1222
1222
1223 ns['exit'] = self.exiter
1223 ns['exit'] = self.exiter
1224 ns['quit'] = self.exiter
1224 ns['quit'] = self.exiter
1225
1225
1226 # Sync what we've added so far to user_ns_hidden so these aren't seen
1226 # Sync what we've added so far to user_ns_hidden so these aren't seen
1227 # by %who
1227 # by %who
1228 self.user_ns_hidden.update(ns)
1228 self.user_ns_hidden.update(ns)
1229
1229
1230 # Anything put into ns now would show up in %who. Think twice before
1230 # Anything put into ns now would show up in %who. Think twice before
1231 # putting anything here, as we really want %who to show the user their
1231 # putting anything here, as we really want %who to show the user their
1232 # stuff, not our variables.
1232 # stuff, not our variables.
1233
1233
1234 # Finally, update the real user's namespace
1234 # Finally, update the real user's namespace
1235 self.user_ns.update(ns)
1235 self.user_ns.update(ns)
1236
1236
1237 @property
1237 @property
1238 def all_ns_refs(self):
1238 def all_ns_refs(self):
1239 """Get a list of references to all the namespace dictionaries in which
1239 """Get a list of references to all the namespace dictionaries in which
1240 IPython might store a user-created object.
1240 IPython might store a user-created object.
1241
1241
1242 Note that this does not include the displayhook, which also caches
1242 Note that this does not include the displayhook, which also caches
1243 objects from the output."""
1243 objects from the output."""
1244 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1244 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1245 [m.__dict__ for m in self._main_mod_cache.values()]
1245 [m.__dict__ for m in self._main_mod_cache.values()]
1246
1246
1247 def reset(self, new_session=True):
1247 def reset(self, new_session=True):
1248 """Clear all internal namespaces, and attempt to release references to
1248 """Clear all internal namespaces, and attempt to release references to
1249 user objects.
1249 user objects.
1250
1250
1251 If new_session is True, a new history session will be opened.
1251 If new_session is True, a new history session will be opened.
1252 """
1252 """
1253 # Clear histories
1253 # Clear histories
1254 self.history_manager.reset(new_session)
1254 self.history_manager.reset(new_session)
1255 # Reset counter used to index all histories
1255 # Reset counter used to index all histories
1256 if new_session:
1256 if new_session:
1257 self.execution_count = 1
1257 self.execution_count = 1
1258
1258
1259 # Flush cached output items
1259 # Flush cached output items
1260 if self.displayhook.do_full_cache:
1260 if self.displayhook.do_full_cache:
1261 self.displayhook.flush()
1261 self.displayhook.flush()
1262
1262
1263 # The main execution namespaces must be cleared very carefully,
1263 # The main execution namespaces must be cleared very carefully,
1264 # skipping the deletion of the builtin-related keys, because doing so
1264 # skipping the deletion of the builtin-related keys, because doing so
1265 # would cause errors in many object's __del__ methods.
1265 # would cause errors in many object's __del__ methods.
1266 if self.user_ns is not self.user_global_ns:
1266 if self.user_ns is not self.user_global_ns:
1267 self.user_ns.clear()
1267 self.user_ns.clear()
1268 ns = self.user_global_ns
1268 ns = self.user_global_ns
1269 drop_keys = set(ns.keys())
1269 drop_keys = set(ns.keys())
1270 drop_keys.discard('__builtin__')
1270 drop_keys.discard('__builtin__')
1271 drop_keys.discard('__builtins__')
1271 drop_keys.discard('__builtins__')
1272 drop_keys.discard('__name__')
1272 drop_keys.discard('__name__')
1273 for k in drop_keys:
1273 for k in drop_keys:
1274 del ns[k]
1274 del ns[k]
1275
1275
1276 self.user_ns_hidden.clear()
1276 self.user_ns_hidden.clear()
1277
1277
1278 # Restore the user namespaces to minimal usability
1278 # Restore the user namespaces to minimal usability
1279 self.init_user_ns()
1279 self.init_user_ns()
1280
1280
1281 # Restore the default and user aliases
1281 # Restore the default and user aliases
1282 self.alias_manager.clear_aliases()
1282 self.alias_manager.clear_aliases()
1283 self.alias_manager.init_aliases()
1283 self.alias_manager.init_aliases()
1284
1284
1285 # Flush the private list of module references kept for script
1285 # Flush the private list of module references kept for script
1286 # execution protection
1286 # execution protection
1287 self.clear_main_mod_cache()
1287 self.clear_main_mod_cache()
1288
1288
1289 def del_var(self, varname, by_name=False):
1289 def del_var(self, varname, by_name=False):
1290 """Delete a variable from the various namespaces, so that, as
1290 """Delete a variable from the various namespaces, so that, as
1291 far as possible, we're not keeping any hidden references to it.
1291 far as possible, we're not keeping any hidden references to it.
1292
1292
1293 Parameters
1293 Parameters
1294 ----------
1294 ----------
1295 varname : str
1295 varname : str
1296 The name of the variable to delete.
1296 The name of the variable to delete.
1297 by_name : bool
1297 by_name : bool
1298 If True, delete variables with the given name in each
1298 If True, delete variables with the given name in each
1299 namespace. If False (default), find the variable in the user
1299 namespace. If False (default), find the variable in the user
1300 namespace, and delete references to it.
1300 namespace, and delete references to it.
1301 """
1301 """
1302 if varname in ('__builtin__', '__builtins__'):
1302 if varname in ('__builtin__', '__builtins__'):
1303 raise ValueError("Refusing to delete %s" % varname)
1303 raise ValueError("Refusing to delete %s" % varname)
1304
1304
1305 ns_refs = self.all_ns_refs
1305 ns_refs = self.all_ns_refs
1306
1306
1307 if by_name: # Delete by name
1307 if by_name: # Delete by name
1308 for ns in ns_refs:
1308 for ns in ns_refs:
1309 try:
1309 try:
1310 del ns[varname]
1310 del ns[varname]
1311 except KeyError:
1311 except KeyError:
1312 pass
1312 pass
1313 else: # Delete by object
1313 else: # Delete by object
1314 try:
1314 try:
1315 obj = self.user_ns[varname]
1315 obj = self.user_ns[varname]
1316 except KeyError:
1316 except KeyError:
1317 raise NameError("name '%s' is not defined" % varname)
1317 raise NameError("name '%s' is not defined" % varname)
1318 # Also check in output history
1318 # Also check in output history
1319 ns_refs.append(self.history_manager.output_hist)
1319 ns_refs.append(self.history_manager.output_hist)
1320 for ns in ns_refs:
1320 for ns in ns_refs:
1321 to_delete = [n for n, o in iteritems(ns) if o is obj]
1321 to_delete = [n for n, o in iteritems(ns) if o is obj]
1322 for name in to_delete:
1322 for name in to_delete:
1323 del ns[name]
1323 del ns[name]
1324
1324
1325 # displayhook keeps extra references, but not in a dictionary
1325 # displayhook keeps extra references, but not in a dictionary
1326 for name in ('_', '__', '___'):
1326 for name in ('_', '__', '___'):
1327 if getattr(self.displayhook, name) is obj:
1327 if getattr(self.displayhook, name) is obj:
1328 setattr(self.displayhook, name, None)
1328 setattr(self.displayhook, name, None)
1329
1329
1330 def reset_selective(self, regex=None):
1330 def reset_selective(self, regex=None):
1331 """Clear selective variables from internal namespaces based on a
1331 """Clear selective variables from internal namespaces based on a
1332 specified regular expression.
1332 specified regular expression.
1333
1333
1334 Parameters
1334 Parameters
1335 ----------
1335 ----------
1336 regex : string or compiled pattern, optional
1336 regex : string or compiled pattern, optional
1337 A regular expression pattern that will be used in searching
1337 A regular expression pattern that will be used in searching
1338 variable names in the users namespaces.
1338 variable names in the users namespaces.
1339 """
1339 """
1340 if regex is not None:
1340 if regex is not None:
1341 try:
1341 try:
1342 m = re.compile(regex)
1342 m = re.compile(regex)
1343 except TypeError:
1343 except TypeError:
1344 raise TypeError('regex must be a string or compiled pattern')
1344 raise TypeError('regex must be a string or compiled pattern')
1345 # Search for keys in each namespace that match the given regex
1345 # Search for keys in each namespace that match the given regex
1346 # If a match is found, delete the key/value pair.
1346 # If a match is found, delete the key/value pair.
1347 for ns in self.all_ns_refs:
1347 for ns in self.all_ns_refs:
1348 for var in ns:
1348 for var in ns:
1349 if m.search(var):
1349 if m.search(var):
1350 del ns[var]
1350 del ns[var]
1351
1351
1352 def push(self, variables, interactive=True):
1352 def push(self, variables, interactive=True):
1353 """Inject a group of variables into the IPython user namespace.
1353 """Inject a group of variables into the IPython user namespace.
1354
1354
1355 Parameters
1355 Parameters
1356 ----------
1356 ----------
1357 variables : dict, str or list/tuple of str
1357 variables : dict, str or list/tuple of str
1358 The variables to inject into the user's namespace. If a dict, a
1358 The variables to inject into the user's namespace. If a dict, a
1359 simple update is done. If a str, the string is assumed to have
1359 simple update is done. If a str, the string is assumed to have
1360 variable names separated by spaces. A list/tuple of str can also
1360 variable names separated by spaces. A list/tuple of str can also
1361 be used to give the variable names. If just the variable names are
1361 be used to give the variable names. If just the variable names are
1362 give (list/tuple/str) then the variable values looked up in the
1362 give (list/tuple/str) then the variable values looked up in the
1363 callers frame.
1363 callers frame.
1364 interactive : bool
1364 interactive : bool
1365 If True (default), the variables will be listed with the ``who``
1365 If True (default), the variables will be listed with the ``who``
1366 magic.
1366 magic.
1367 """
1367 """
1368 vdict = None
1368 vdict = None
1369
1369
1370 # We need a dict of name/value pairs to do namespace updates.
1370 # We need a dict of name/value pairs to do namespace updates.
1371 if isinstance(variables, dict):
1371 if isinstance(variables, dict):
1372 vdict = variables
1372 vdict = variables
1373 elif isinstance(variables, string_types+(list, tuple)):
1373 elif isinstance(variables, string_types+(list, tuple)):
1374 if isinstance(variables, string_types):
1374 if isinstance(variables, string_types):
1375 vlist = variables.split()
1375 vlist = variables.split()
1376 else:
1376 else:
1377 vlist = variables
1377 vlist = variables
1378 vdict = {}
1378 vdict = {}
1379 cf = sys._getframe(1)
1379 cf = sys._getframe(1)
1380 for name in vlist:
1380 for name in vlist:
1381 try:
1381 try:
1382 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1382 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1383 except:
1383 except:
1384 print('Could not get variable %s from %s' %
1384 print('Could not get variable %s from %s' %
1385 (name,cf.f_code.co_name))
1385 (name,cf.f_code.co_name))
1386 else:
1386 else:
1387 raise ValueError('variables must be a dict/str/list/tuple')
1387 raise ValueError('variables must be a dict/str/list/tuple')
1388
1388
1389 # Propagate variables to user namespace
1389 # Propagate variables to user namespace
1390 self.user_ns.update(vdict)
1390 self.user_ns.update(vdict)
1391
1391
1392 # And configure interactive visibility
1392 # And configure interactive visibility
1393 user_ns_hidden = self.user_ns_hidden
1393 user_ns_hidden = self.user_ns_hidden
1394 if interactive:
1394 if interactive:
1395 for name in vdict:
1395 for name in vdict:
1396 user_ns_hidden.pop(name, None)
1396 user_ns_hidden.pop(name, None)
1397 else:
1397 else:
1398 user_ns_hidden.update(vdict)
1398 user_ns_hidden.update(vdict)
1399
1399
1400 def drop_by_id(self, variables):
1400 def drop_by_id(self, variables):
1401 """Remove a dict of variables from the user namespace, if they are the
1401 """Remove a dict of variables from the user namespace, if they are the
1402 same as the values in the dictionary.
1402 same as the values in the dictionary.
1403
1403
1404 This is intended for use by extensions: variables that they've added can
1404 This is intended for use by extensions: variables that they've added can
1405 be taken back out if they are unloaded, without removing any that the
1405 be taken back out if they are unloaded, without removing any that the
1406 user has overwritten.
1406 user has overwritten.
1407
1407
1408 Parameters
1408 Parameters
1409 ----------
1409 ----------
1410 variables : dict
1410 variables : dict
1411 A dictionary mapping object names (as strings) to the objects.
1411 A dictionary mapping object names (as strings) to the objects.
1412 """
1412 """
1413 for name, obj in iteritems(variables):
1413 for name, obj in iteritems(variables):
1414 if name in self.user_ns and self.user_ns[name] is obj:
1414 if name in self.user_ns and self.user_ns[name] is obj:
1415 del self.user_ns[name]
1415 del self.user_ns[name]
1416 self.user_ns_hidden.pop(name, None)
1416 self.user_ns_hidden.pop(name, None)
1417
1417
1418 #-------------------------------------------------------------------------
1418 #-------------------------------------------------------------------------
1419 # Things related to object introspection
1419 # Things related to object introspection
1420 #-------------------------------------------------------------------------
1420 #-------------------------------------------------------------------------
1421
1421
1422 def _ofind(self, oname, namespaces=None):
1422 def _ofind(self, oname, namespaces=None):
1423 """Find an object in the available namespaces.
1423 """Find an object in the available namespaces.
1424
1424
1425 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1425 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1426
1426
1427 Has special code to detect magic functions.
1427 Has special code to detect magic functions.
1428 """
1428 """
1429 oname = oname.strip()
1429 oname = oname.strip()
1430 #print '1- oname: <%r>' % oname # dbg
1430 #print '1- oname: <%r>' % oname # dbg
1431 if not oname.startswith(ESC_MAGIC) and \
1431 if not oname.startswith(ESC_MAGIC) and \
1432 not oname.startswith(ESC_MAGIC2) and \
1432 not oname.startswith(ESC_MAGIC2) and \
1433 not py3compat.isidentifier(oname, dotted=True):
1433 not py3compat.isidentifier(oname, dotted=True):
1434 return dict(found=False)
1434 return dict(found=False)
1435
1435
1436 alias_ns = None
1436 alias_ns = None
1437 if namespaces is None:
1437 if namespaces is None:
1438 # Namespaces to search in:
1438 # Namespaces to search in:
1439 # Put them in a list. The order is important so that we
1439 # Put them in a list. The order is important so that we
1440 # find things in the same order that Python finds them.
1440 # find things in the same order that Python finds them.
1441 namespaces = [ ('Interactive', self.user_ns),
1441 namespaces = [ ('Interactive', self.user_ns),
1442 ('Interactive (global)', self.user_global_ns),
1442 ('Interactive (global)', self.user_global_ns),
1443 ('Python builtin', builtin_mod.__dict__),
1443 ('Python builtin', builtin_mod.__dict__),
1444 ]
1444 ]
1445
1445
1446 # initialize results to 'null'
1446 # initialize results to 'null'
1447 found = False; obj = None; ospace = None; ds = None;
1447 found = False; obj = None; ospace = None; ds = None;
1448 ismagic = False; isalias = False; parent = None
1448 ismagic = False; isalias = False; parent = None
1449
1449
1450 # We need to special-case 'print', which as of python2.6 registers as a
1450 # We need to special-case 'print', which as of python2.6 registers as a
1451 # function but should only be treated as one if print_function was
1451 # function but should only be treated as one if print_function was
1452 # loaded with a future import. In this case, just bail.
1452 # loaded with a future import. In this case, just bail.
1453 if (oname == 'print' and not py3compat.PY3 and not \
1453 if (oname == 'print' and not py3compat.PY3 and not \
1454 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1454 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1455 return {'found':found, 'obj':obj, 'namespace':ospace,
1455 return {'found':found, 'obj':obj, 'namespace':ospace,
1456 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1456 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1457
1457
1458 # Look for the given name by splitting it in parts. If the head is
1458 # Look for the given name by splitting it in parts. If the head is
1459 # found, then we look for all the remaining parts as members, and only
1459 # found, then we look for all the remaining parts as members, and only
1460 # declare success if we can find them all.
1460 # declare success if we can find them all.
1461 oname_parts = oname.split('.')
1461 oname_parts = oname.split('.')
1462 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1462 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1463 for nsname,ns in namespaces:
1463 for nsname,ns in namespaces:
1464 try:
1464 try:
1465 obj = ns[oname_head]
1465 obj = ns[oname_head]
1466 except KeyError:
1466 except KeyError:
1467 continue
1467 continue
1468 else:
1468 else:
1469 #print 'oname_rest:', oname_rest # dbg
1469 #print 'oname_rest:', oname_rest # dbg
1470 for idx, part in enumerate(oname_rest):
1470 for idx, part in enumerate(oname_rest):
1471 try:
1471 try:
1472 parent = obj
1472 parent = obj
1473 # The last part is looked up in a special way to avoid
1473 # The last part is looked up in a special way to avoid
1474 # descriptor invocation as it may raise or have side
1474 # descriptor invocation as it may raise or have side
1475 # effects.
1475 # effects.
1476 if idx == len(oname_rest) - 1:
1476 if idx == len(oname_rest) - 1:
1477 obj = self._getattr_property(obj, part)
1477 obj = self._getattr_property(obj, part)
1478 else:
1478 else:
1479 obj = getattr(obj, part)
1479 obj = getattr(obj, part)
1480 except:
1480 except:
1481 # Blanket except b/c some badly implemented objects
1481 # Blanket except b/c some badly implemented objects
1482 # allow __getattr__ to raise exceptions other than
1482 # allow __getattr__ to raise exceptions other than
1483 # AttributeError, which then crashes IPython.
1483 # AttributeError, which then crashes IPython.
1484 break
1484 break
1485 else:
1485 else:
1486 # If we finish the for loop (no break), we got all members
1486 # If we finish the for loop (no break), we got all members
1487 found = True
1487 found = True
1488 ospace = nsname
1488 ospace = nsname
1489 break # namespace loop
1489 break # namespace loop
1490
1490
1491 # Try to see if it's magic
1491 # Try to see if it's magic
1492 if not found:
1492 if not found:
1493 obj = None
1493 obj = None
1494 if oname.startswith(ESC_MAGIC2):
1494 if oname.startswith(ESC_MAGIC2):
1495 oname = oname.lstrip(ESC_MAGIC2)
1495 oname = oname.lstrip(ESC_MAGIC2)
1496 obj = self.find_cell_magic(oname)
1496 obj = self.find_cell_magic(oname)
1497 elif oname.startswith(ESC_MAGIC):
1497 elif oname.startswith(ESC_MAGIC):
1498 oname = oname.lstrip(ESC_MAGIC)
1498 oname = oname.lstrip(ESC_MAGIC)
1499 obj = self.find_line_magic(oname)
1499 obj = self.find_line_magic(oname)
1500 else:
1500 else:
1501 # search without prefix, so run? will find %run?
1501 # search without prefix, so run? will find %run?
1502 obj = self.find_line_magic(oname)
1502 obj = self.find_line_magic(oname)
1503 if obj is None:
1503 if obj is None:
1504 obj = self.find_cell_magic(oname)
1504 obj = self.find_cell_magic(oname)
1505 if obj is not None:
1505 if obj is not None:
1506 found = True
1506 found = True
1507 ospace = 'IPython internal'
1507 ospace = 'IPython internal'
1508 ismagic = True
1508 ismagic = True
1509 isalias = isinstance(obj, Alias)
1509 isalias = isinstance(obj, Alias)
1510
1510
1511 # Last try: special-case some literals like '', [], {}, etc:
1511 # Last try: special-case some literals like '', [], {}, etc:
1512 if not found and oname_head in ["''",'""','[]','{}','()']:
1512 if not found and oname_head in ["''",'""','[]','{}','()']:
1513 obj = eval(oname_head)
1513 obj = eval(oname_head)
1514 found = True
1514 found = True
1515 ospace = 'Interactive'
1515 ospace = 'Interactive'
1516
1516
1517 return {'found':found, 'obj':obj, 'namespace':ospace,
1517 return {'found':found, 'obj':obj, 'namespace':ospace,
1518 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1518 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1519
1519
1520 @staticmethod
1520 @staticmethod
1521 def _getattr_property(obj, attrname):
1521 def _getattr_property(obj, attrname):
1522 """Property-aware getattr to use in object finding.
1522 """Property-aware getattr to use in object finding.
1523
1523
1524 If attrname represents a property, return it unevaluated (in case it has
1524 If attrname represents a property, return it unevaluated (in case it has
1525 side effects or raises an error.
1525 side effects or raises an error.
1526
1526
1527 """
1527 """
1528 if not isinstance(obj, type):
1528 if not isinstance(obj, type):
1529 try:
1529 try:
1530 # `getattr(type(obj), attrname)` is not guaranteed to return
1530 # `getattr(type(obj), attrname)` is not guaranteed to return
1531 # `obj`, but does so for property:
1531 # `obj`, but does so for property:
1532 #
1532 #
1533 # property.__get__(self, None, cls) -> self
1533 # property.__get__(self, None, cls) -> self
1534 #
1534 #
1535 # The universal alternative is to traverse the mro manually
1535 # The universal alternative is to traverse the mro manually
1536 # searching for attrname in class dicts.
1536 # searching for attrname in class dicts.
1537 attr = getattr(type(obj), attrname)
1537 attr = getattr(type(obj), attrname)
1538 except AttributeError:
1538 except AttributeError:
1539 pass
1539 pass
1540 else:
1540 else:
1541 # This relies on the fact that data descriptors (with both
1541 # This relies on the fact that data descriptors (with both
1542 # __get__ & __set__ magic methods) take precedence over
1542 # __get__ & __set__ magic methods) take precedence over
1543 # instance-level attributes:
1543 # instance-level attributes:
1544 #
1544 #
1545 # class A(object):
1545 # class A(object):
1546 # @property
1546 # @property
1547 # def foobar(self): return 123
1547 # def foobar(self): return 123
1548 # a = A()
1548 # a = A()
1549 # a.__dict__['foobar'] = 345
1549 # a.__dict__['foobar'] = 345
1550 # a.foobar # == 123
1550 # a.foobar # == 123
1551 #
1551 #
1552 # So, a property may be returned right away.
1552 # So, a property may be returned right away.
1553 if isinstance(attr, property):
1553 if isinstance(attr, property):
1554 return attr
1554 return attr
1555
1555
1556 # Nothing helped, fall back.
1556 # Nothing helped, fall back.
1557 return getattr(obj, attrname)
1557 return getattr(obj, attrname)
1558
1558
1559 def _object_find(self, oname, namespaces=None):
1559 def _object_find(self, oname, namespaces=None):
1560 """Find an object and return a struct with info about it."""
1560 """Find an object and return a struct with info about it."""
1561 return Struct(self._ofind(oname, namespaces))
1561 return Struct(self._ofind(oname, namespaces))
1562
1562
1563 def _inspect(self, meth, oname, namespaces=None, **kw):
1563 def _inspect(self, meth, oname, namespaces=None, **kw):
1564 """Generic interface to the inspector system.
1564 """Generic interface to the inspector system.
1565
1565
1566 This function is meant to be called by pdef, pdoc & friends."""
1566 This function is meant to be called by pdef, pdoc & friends."""
1567 info = self._object_find(oname, namespaces)
1567 info = self._object_find(oname, namespaces)
1568 if info.found:
1568 if info.found:
1569 pmethod = getattr(self.inspector, meth)
1569 pmethod = getattr(self.inspector, meth)
1570 formatter = format_screen if info.ismagic else None
1570 formatter = format_screen if info.ismagic else None
1571 if meth == 'pdoc':
1571 if meth == 'pdoc':
1572 pmethod(info.obj, oname, formatter)
1572 pmethod(info.obj, oname, formatter)
1573 elif meth == 'pinfo':
1573 elif meth == 'pinfo':
1574 pmethod(info.obj, oname, formatter, info, **kw)
1574 pmethod(info.obj, oname, formatter, info, **kw)
1575 else:
1575 else:
1576 pmethod(info.obj, oname)
1576 pmethod(info.obj, oname)
1577 else:
1577 else:
1578 print('Object `%s` not found.' % oname)
1578 print('Object `%s` not found.' % oname)
1579 return 'not found' # so callers can take other action
1579 return 'not found' # so callers can take other action
1580
1580
1581 def object_inspect(self, oname, detail_level=0):
1581 def object_inspect(self, oname, detail_level=0):
1582 """Get object info about oname"""
1582 """Get object info about oname"""
1583 with self.builtin_trap:
1583 with self.builtin_trap:
1584 info = self._object_find(oname)
1584 info = self._object_find(oname)
1585 if info.found:
1585 if info.found:
1586 return self.inspector.info(info.obj, oname, info=info,
1586 return self.inspector.info(info.obj, oname, info=info,
1587 detail_level=detail_level
1587 detail_level=detail_level
1588 )
1588 )
1589 else:
1589 else:
1590 return oinspect.object_info(name=oname, found=False)
1590 return oinspect.object_info(name=oname, found=False)
1591
1591
1592 def object_inspect_text(self, oname, detail_level=0):
1592 def object_inspect_text(self, oname, detail_level=0):
1593 """Get object info as formatted text"""
1593 """Get object info as formatted text"""
1594 with self.builtin_trap:
1594 with self.builtin_trap:
1595 info = self._object_find(oname)
1595 info = self._object_find(oname)
1596 if info.found:
1596 if info.found:
1597 return self.inspector._format_info(info.obj, oname, info=info,
1597 return self.inspector._format_info(info.obj, oname, info=info,
1598 detail_level=detail_level
1598 detail_level=detail_level
1599 )
1599 )
1600 else:
1600 else:
1601 raise KeyError(oname)
1601 raise KeyError(oname)
1602
1602
1603 #-------------------------------------------------------------------------
1603 #-------------------------------------------------------------------------
1604 # Things related to history management
1604 # Things related to history management
1605 #-------------------------------------------------------------------------
1605 #-------------------------------------------------------------------------
1606
1606
1607 def init_history(self):
1607 def init_history(self):
1608 """Sets up the command history, and starts regular autosaves."""
1608 """Sets up the command history, and starts regular autosaves."""
1609 self.history_manager = HistoryManager(shell=self, parent=self)
1609 self.history_manager = HistoryManager(shell=self, parent=self)
1610 self.configurables.append(self.history_manager)
1610 self.configurables.append(self.history_manager)
1611
1611
1612 #-------------------------------------------------------------------------
1612 #-------------------------------------------------------------------------
1613 # Things related to exception handling and tracebacks (not debugging)
1613 # Things related to exception handling and tracebacks (not debugging)
1614 #-------------------------------------------------------------------------
1614 #-------------------------------------------------------------------------
1615
1615
1616 def init_traceback_handlers(self, custom_exceptions):
1616 def init_traceback_handlers(self, custom_exceptions):
1617 # Syntax error handler.
1617 # Syntax error handler.
1618 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1618 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1619
1619
1620 # The interactive one is initialized with an offset, meaning we always
1620 # The interactive one is initialized with an offset, meaning we always
1621 # want to remove the topmost item in the traceback, which is our own
1621 # want to remove the topmost item in the traceback, which is our own
1622 # internal code. Valid modes: ['Plain','Context','Verbose']
1622 # internal code. Valid modes: ['Plain','Context','Verbose']
1623 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1623 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1624 color_scheme='NoColor',
1624 color_scheme='NoColor',
1625 tb_offset = 1,
1625 tb_offset = 1,
1626 check_cache=check_linecache_ipython)
1626 check_cache=check_linecache_ipython)
1627
1627
1628 # The instance will store a pointer to the system-wide exception hook,
1628 # The instance will store a pointer to the system-wide exception hook,
1629 # so that runtime code (such as magics) can access it. This is because
1629 # so that runtime code (such as magics) can access it. This is because
1630 # during the read-eval loop, it may get temporarily overwritten.
1630 # during the read-eval loop, it may get temporarily overwritten.
1631 self.sys_excepthook = sys.excepthook
1631 self.sys_excepthook = sys.excepthook
1632
1632
1633 # and add any custom exception handlers the user may have specified
1633 # and add any custom exception handlers the user may have specified
1634 self.set_custom_exc(*custom_exceptions)
1634 self.set_custom_exc(*custom_exceptions)
1635
1635
1636 # Set the exception mode
1636 # Set the exception mode
1637 self.InteractiveTB.set_mode(mode=self.xmode)
1637 self.InteractiveTB.set_mode(mode=self.xmode)
1638
1638
1639 def set_custom_exc(self, exc_tuple, handler):
1639 def set_custom_exc(self, exc_tuple, handler):
1640 """set_custom_exc(exc_tuple,handler)
1640 """set_custom_exc(exc_tuple,handler)
1641
1641
1642 Set a custom exception handler, which will be called if any of the
1642 Set a custom exception handler, which will be called if any of the
1643 exceptions in exc_tuple occur in the mainloop (specifically, in the
1643 exceptions in exc_tuple occur in the mainloop (specifically, in the
1644 run_code() method).
1644 run_code() method).
1645
1645
1646 Parameters
1646 Parameters
1647 ----------
1647 ----------
1648
1648
1649 exc_tuple : tuple of exception classes
1649 exc_tuple : tuple of exception classes
1650 A *tuple* of exception classes, for which to call the defined
1650 A *tuple* of exception classes, for which to call the defined
1651 handler. It is very important that you use a tuple, and NOT A
1651 handler. It is very important that you use a tuple, and NOT A
1652 LIST here, because of the way Python's except statement works. If
1652 LIST here, because of the way Python's except statement works. If
1653 you only want to trap a single exception, use a singleton tuple::
1653 you only want to trap a single exception, use a singleton tuple::
1654
1654
1655 exc_tuple == (MyCustomException,)
1655 exc_tuple == (MyCustomException,)
1656
1656
1657 handler : callable
1657 handler : callable
1658 handler must have the following signature::
1658 handler must have the following signature::
1659
1659
1660 def my_handler(self, etype, value, tb, tb_offset=None):
1660 def my_handler(self, etype, value, tb, tb_offset=None):
1661 ...
1661 ...
1662 return structured_traceback
1662 return structured_traceback
1663
1663
1664 Your handler must return a structured traceback (a list of strings),
1664 Your handler must return a structured traceback (a list of strings),
1665 or None.
1665 or None.
1666
1666
1667 This will be made into an instance method (via types.MethodType)
1667 This will be made into an instance method (via types.MethodType)
1668 of IPython itself, and it will be called if any of the exceptions
1668 of IPython itself, and it will be called if any of the exceptions
1669 listed in the exc_tuple are caught. If the handler is None, an
1669 listed in the exc_tuple are caught. If the handler is None, an
1670 internal basic one is used, which just prints basic info.
1670 internal basic one is used, which just prints basic info.
1671
1671
1672 To protect IPython from crashes, if your handler ever raises an
1672 To protect IPython from crashes, if your handler ever raises an
1673 exception or returns an invalid result, it will be immediately
1673 exception or returns an invalid result, it will be immediately
1674 disabled.
1674 disabled.
1675
1675
1676 WARNING: by putting in your own exception handler into IPython's main
1676 WARNING: by putting in your own exception handler into IPython's main
1677 execution loop, you run a very good chance of nasty crashes. This
1677 execution loop, you run a very good chance of nasty crashes. This
1678 facility should only be used if you really know what you are doing."""
1678 facility should only be used if you really know what you are doing."""
1679
1679
1680 assert type(exc_tuple)==type(()) , \
1680 assert type(exc_tuple)==type(()) , \
1681 "The custom exceptions must be given AS A TUPLE."
1681 "The custom exceptions must be given AS A TUPLE."
1682
1682
1683 def dummy_handler(self,etype,value,tb,tb_offset=None):
1683 def dummy_handler(self,etype,value,tb,tb_offset=None):
1684 print('*** Simple custom exception handler ***')
1684 print('*** Simple custom exception handler ***')
1685 print('Exception type :',etype)
1685 print('Exception type :',etype)
1686 print('Exception value:',value)
1686 print('Exception value:',value)
1687 print('Traceback :',tb)
1687 print('Traceback :',tb)
1688 #print 'Source code :','\n'.join(self.buffer)
1688 #print 'Source code :','\n'.join(self.buffer)
1689
1689
1690 def validate_stb(stb):
1690 def validate_stb(stb):
1691 """validate structured traceback return type
1691 """validate structured traceback return type
1692
1692
1693 return type of CustomTB *should* be a list of strings, but allow
1693 return type of CustomTB *should* be a list of strings, but allow
1694 single strings or None, which are harmless.
1694 single strings or None, which are harmless.
1695
1695
1696 This function will *always* return a list of strings,
1696 This function will *always* return a list of strings,
1697 and will raise a TypeError if stb is inappropriate.
1697 and will raise a TypeError if stb is inappropriate.
1698 """
1698 """
1699 msg = "CustomTB must return list of strings, not %r" % stb
1699 msg = "CustomTB must return list of strings, not %r" % stb
1700 if stb is None:
1700 if stb is None:
1701 return []
1701 return []
1702 elif isinstance(stb, string_types):
1702 elif isinstance(stb, string_types):
1703 return [stb]
1703 return [stb]
1704 elif not isinstance(stb, list):
1704 elif not isinstance(stb, list):
1705 raise TypeError(msg)
1705 raise TypeError(msg)
1706 # it's a list
1706 # it's a list
1707 for line in stb:
1707 for line in stb:
1708 # check every element
1708 # check every element
1709 if not isinstance(line, string_types):
1709 if not isinstance(line, string_types):
1710 raise TypeError(msg)
1710 raise TypeError(msg)
1711 return stb
1711 return stb
1712
1712
1713 if handler is None:
1713 if handler is None:
1714 wrapped = dummy_handler
1714 wrapped = dummy_handler
1715 else:
1715 else:
1716 def wrapped(self,etype,value,tb,tb_offset=None):
1716 def wrapped(self,etype,value,tb,tb_offset=None):
1717 """wrap CustomTB handler, to protect IPython from user code
1717 """wrap CustomTB handler, to protect IPython from user code
1718
1718
1719 This makes it harder (but not impossible) for custom exception
1719 This makes it harder (but not impossible) for custom exception
1720 handlers to crash IPython.
1720 handlers to crash IPython.
1721 """
1721 """
1722 try:
1722 try:
1723 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1723 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1724 return validate_stb(stb)
1724 return validate_stb(stb)
1725 except:
1725 except:
1726 # clear custom handler immediately
1726 # clear custom handler immediately
1727 self.set_custom_exc((), None)
1727 self.set_custom_exc((), None)
1728 print("Custom TB Handler failed, unregistering", file=io.stderr)
1728 print("Custom TB Handler failed, unregistering", file=io.stderr)
1729 # show the exception in handler first
1729 # show the exception in handler first
1730 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1730 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1731 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1731 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1732 print("The original exception:", file=io.stdout)
1732 print("The original exception:", file=io.stdout)
1733 stb = self.InteractiveTB.structured_traceback(
1733 stb = self.InteractiveTB.structured_traceback(
1734 (etype,value,tb), tb_offset=tb_offset
1734 (etype,value,tb), tb_offset=tb_offset
1735 )
1735 )
1736 return stb
1736 return stb
1737
1737
1738 self.CustomTB = types.MethodType(wrapped,self)
1738 self.CustomTB = types.MethodType(wrapped,self)
1739 self.custom_exceptions = exc_tuple
1739 self.custom_exceptions = exc_tuple
1740
1740
1741 def excepthook(self, etype, value, tb):
1741 def excepthook(self, etype, value, tb):
1742 """One more defense for GUI apps that call sys.excepthook.
1742 """One more defense for GUI apps that call sys.excepthook.
1743
1743
1744 GUI frameworks like wxPython trap exceptions and call
1744 GUI frameworks like wxPython trap exceptions and call
1745 sys.excepthook themselves. I guess this is a feature that
1745 sys.excepthook themselves. I guess this is a feature that
1746 enables them to keep running after exceptions that would
1746 enables them to keep running after exceptions that would
1747 otherwise kill their mainloop. This is a bother for IPython
1747 otherwise kill their mainloop. This is a bother for IPython
1748 which excepts to catch all of the program exceptions with a try:
1748 which excepts to catch all of the program exceptions with a try:
1749 except: statement.
1749 except: statement.
1750
1750
1751 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1751 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1752 any app directly invokes sys.excepthook, it will look to the user like
1752 any app directly invokes sys.excepthook, it will look to the user like
1753 IPython crashed. In order to work around this, we can disable the
1753 IPython crashed. In order to work around this, we can disable the
1754 CrashHandler and replace it with this excepthook instead, which prints a
1754 CrashHandler and replace it with this excepthook instead, which prints a
1755 regular traceback using our InteractiveTB. In this fashion, apps which
1755 regular traceback using our InteractiveTB. In this fashion, apps which
1756 call sys.excepthook will generate a regular-looking exception from
1756 call sys.excepthook will generate a regular-looking exception from
1757 IPython, and the CrashHandler will only be triggered by real IPython
1757 IPython, and the CrashHandler will only be triggered by real IPython
1758 crashes.
1758 crashes.
1759
1759
1760 This hook should be used sparingly, only in places which are not likely
1760 This hook should be used sparingly, only in places which are not likely
1761 to be true IPython errors.
1761 to be true IPython errors.
1762 """
1762 """
1763 self.showtraceback((etype, value, tb), tb_offset=0)
1763 self.showtraceback((etype, value, tb), tb_offset=0)
1764
1764
1765 def _get_exc_info(self, exc_tuple=None):
1765 def _get_exc_info(self, exc_tuple=None):
1766 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1766 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1767
1767
1768 Ensures sys.last_type,value,traceback hold the exc_info we found,
1768 Ensures sys.last_type,value,traceback hold the exc_info we found,
1769 from whichever source.
1769 from whichever source.
1770
1770
1771 raises ValueError if none of these contain any information
1771 raises ValueError if none of these contain any information
1772 """
1772 """
1773 if exc_tuple is None:
1773 if exc_tuple is None:
1774 etype, value, tb = sys.exc_info()
1774 etype, value, tb = sys.exc_info()
1775 else:
1775 else:
1776 etype, value, tb = exc_tuple
1776 etype, value, tb = exc_tuple
1777
1777
1778 if etype is None:
1778 if etype is None:
1779 if hasattr(sys, 'last_type'):
1779 if hasattr(sys, 'last_type'):
1780 etype, value, tb = sys.last_type, sys.last_value, \
1780 etype, value, tb = sys.last_type, sys.last_value, \
1781 sys.last_traceback
1781 sys.last_traceback
1782
1782
1783 if etype is None:
1783 if etype is None:
1784 raise ValueError("No exception to find")
1784 raise ValueError("No exception to find")
1785
1785
1786 # Now store the exception info in sys.last_type etc.
1786 # Now store the exception info in sys.last_type etc.
1787 # WARNING: these variables are somewhat deprecated and not
1787 # WARNING: these variables are somewhat deprecated and not
1788 # necessarily safe to use in a threaded environment, but tools
1788 # necessarily safe to use in a threaded environment, but tools
1789 # like pdb depend on their existence, so let's set them. If we
1789 # like pdb depend on their existence, so let's set them. If we
1790 # find problems in the field, we'll need to revisit their use.
1790 # find problems in the field, we'll need to revisit their use.
1791 sys.last_type = etype
1791 sys.last_type = etype
1792 sys.last_value = value
1792 sys.last_value = value
1793 sys.last_traceback = tb
1793 sys.last_traceback = tb
1794
1794
1795 return etype, value, tb
1795 return etype, value, tb
1796
1796
1797 def show_usage_error(self, exc):
1797 def show_usage_error(self, exc):
1798 """Show a short message for UsageErrors
1798 """Show a short message for UsageErrors
1799
1799
1800 These are special exceptions that shouldn't show a traceback.
1800 These are special exceptions that shouldn't show a traceback.
1801 """
1801 """
1802 self.write_err("UsageError: %s" % exc)
1802 self.write_err("UsageError: %s" % exc)
1803
1803
1804 def get_exception_only(self, exc_tuple=None):
1804 def get_exception_only(self, exc_tuple=None):
1805 """
1805 """
1806 Return as a string (ending with a newline) the exception that
1806 Return as a string (ending with a newline) the exception that
1807 just occurred, without any traceback.
1807 just occurred, without any traceback.
1808 """
1808 """
1809 etype, value, tb = self._get_exc_info(exc_tuple)
1809 etype, value, tb = self._get_exc_info(exc_tuple)
1810 msg = traceback.format_exception_only(etype, value)
1810 msg = traceback.format_exception_only(etype, value)
1811 return ''.join(msg)
1811 return ''.join(msg)
1812
1812
1813 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
1813 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
1814 exception_only=False):
1814 exception_only=False):
1815 """Display the exception that just occurred.
1815 """Display the exception that just occurred.
1816
1816
1817 If nothing is known about the exception, this is the method which
1817 If nothing is known about the exception, this is the method which
1818 should be used throughout the code for presenting user tracebacks,
1818 should be used throughout the code for presenting user tracebacks,
1819 rather than directly invoking the InteractiveTB object.
1819 rather than directly invoking the InteractiveTB object.
1820
1820
1821 A specific showsyntaxerror() also exists, but this method can take
1821 A specific showsyntaxerror() also exists, but this method can take
1822 care of calling it if needed, so unless you are explicitly catching a
1822 care of calling it if needed, so unless you are explicitly catching a
1823 SyntaxError exception, don't try to analyze the stack manually and
1823 SyntaxError exception, don't try to analyze the stack manually and
1824 simply call this method."""
1824 simply call this method."""
1825
1825
1826 try:
1826 try:
1827 try:
1827 try:
1828 etype, value, tb = self._get_exc_info(exc_tuple)
1828 etype, value, tb = self._get_exc_info(exc_tuple)
1829 except ValueError:
1829 except ValueError:
1830 self.write_err('No traceback available to show.\n')
1830 self.write_err('No traceback available to show.\n')
1831 return
1831 return
1832
1832
1833 if issubclass(etype, SyntaxError):
1833 if issubclass(etype, SyntaxError):
1834 # Though this won't be called by syntax errors in the input
1834 # Though this won't be called by syntax errors in the input
1835 # line, there may be SyntaxError cases with imported code.
1835 # line, there may be SyntaxError cases with imported code.
1836 self.showsyntaxerror(filename)
1836 self.showsyntaxerror(filename)
1837 elif etype is UsageError:
1837 elif etype is UsageError:
1838 self.show_usage_error(value)
1838 self.show_usage_error(value)
1839 else:
1839 else:
1840 if exception_only:
1840 if exception_only:
1841 stb = ['An exception has occurred, use %tb to see '
1841 stb = ['An exception has occurred, use %tb to see '
1842 'the full traceback.\n']
1842 'the full traceback.\n']
1843 stb.extend(self.InteractiveTB.get_exception_only(etype,
1843 stb.extend(self.InteractiveTB.get_exception_only(etype,
1844 value))
1844 value))
1845 else:
1845 else:
1846 try:
1846 try:
1847 # Exception classes can customise their traceback - we
1847 # Exception classes can customise their traceback - we
1848 # use this in IPython.parallel for exceptions occurring
1848 # use this in IPython.parallel for exceptions occurring
1849 # in the engines. This should return a list of strings.
1849 # in the engines. This should return a list of strings.
1850 stb = value._render_traceback_()
1850 stb = value._render_traceback_()
1851 except Exception:
1851 except Exception:
1852 stb = self.InteractiveTB.structured_traceback(etype,
1852 stb = self.InteractiveTB.structured_traceback(etype,
1853 value, tb, tb_offset=tb_offset)
1853 value, tb, tb_offset=tb_offset)
1854
1854
1855 self._showtraceback(etype, value, stb)
1855 self._showtraceback(etype, value, stb)
1856 if self.call_pdb:
1856 if self.call_pdb:
1857 # drop into debugger
1857 # drop into debugger
1858 self.debugger(force=True)
1858 self.debugger(force=True)
1859 return
1859 return
1860
1860
1861 # Actually show the traceback
1861 # Actually show the traceback
1862 self._showtraceback(etype, value, stb)
1862 self._showtraceback(etype, value, stb)
1863
1863
1864 except KeyboardInterrupt:
1864 except KeyboardInterrupt:
1865 self.write_err('\n' + self.get_exception_only())
1865 self.write_err('\n' + self.get_exception_only())
1866
1866
1867 def _showtraceback(self, etype, evalue, stb):
1867 def _showtraceback(self, etype, evalue, stb):
1868 """Actually show a traceback.
1868 """Actually show a traceback.
1869
1869
1870 Subclasses may override this method to put the traceback on a different
1870 Subclasses may override this method to put the traceback on a different
1871 place, like a side channel.
1871 place, like a side channel.
1872 """
1872 """
1873 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1873 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1874
1874
1875 def showsyntaxerror(self, filename=None):
1875 def showsyntaxerror(self, filename=None):
1876 """Display the syntax error that just occurred.
1876 """Display the syntax error that just occurred.
1877
1877
1878 This doesn't display a stack trace because there isn't one.
1878 This doesn't display a stack trace because there isn't one.
1879
1879
1880 If a filename is given, it is stuffed in the exception instead
1880 If a filename is given, it is stuffed in the exception instead
1881 of what was there before (because Python's parser always uses
1881 of what was there before (because Python's parser always uses
1882 "<string>" when reading from a string).
1882 "<string>" when reading from a string).
1883 """
1883 """
1884 etype, value, last_traceback = self._get_exc_info()
1884 etype, value, last_traceback = self._get_exc_info()
1885
1885
1886 if filename and issubclass(etype, SyntaxError):
1886 if filename and issubclass(etype, SyntaxError):
1887 try:
1887 try:
1888 value.filename = filename
1888 value.filename = filename
1889 except:
1889 except:
1890 # Not the format we expect; leave it alone
1890 # Not the format we expect; leave it alone
1891 pass
1891 pass
1892
1892
1893 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1893 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1894 self._showtraceback(etype, value, stb)
1894 self._showtraceback(etype, value, stb)
1895
1895
1896 # This is overridden in TerminalInteractiveShell to show a message about
1896 # This is overridden in TerminalInteractiveShell to show a message about
1897 # the %paste magic.
1897 # the %paste magic.
1898 def showindentationerror(self):
1898 def showindentationerror(self):
1899 """Called by run_cell when there's an IndentationError in code entered
1899 """Called by run_cell when there's an IndentationError in code entered
1900 at the prompt.
1900 at the prompt.
1901
1901
1902 This is overridden in TerminalInteractiveShell to show a message about
1902 This is overridden in TerminalInteractiveShell to show a message about
1903 the %paste magic."""
1903 the %paste magic."""
1904 self.showsyntaxerror()
1904 self.showsyntaxerror()
1905
1905
1906 #-------------------------------------------------------------------------
1906 #-------------------------------------------------------------------------
1907 # Things related to readline
1907 # Things related to readline
1908 #-------------------------------------------------------------------------
1908 #-------------------------------------------------------------------------
1909
1909
1910 def init_readline(self):
1910 def init_readline(self):
1911 """Command history completion/saving/reloading."""
1911 """Command history completion/saving/reloading."""
1912
1912
1913 if self.readline_use:
1913 if self.readline_use:
1914 import IPython.utils.rlineimpl as readline
1914 import IPython.utils.rlineimpl as readline
1915
1915
1916 self.rl_next_input = None
1916 self.rl_next_input = None
1917 self.rl_do_indent = False
1917 self.rl_do_indent = False
1918
1918
1919 if not self.readline_use or not readline.have_readline:
1919 if not self.readline_use or not readline.have_readline:
1920 self.has_readline = False
1920 self.has_readline = False
1921 self.readline = None
1921 self.readline = None
1922 # Set a number of methods that depend on readline to be no-op
1922 # Set a number of methods that depend on readline to be no-op
1923 self.readline_no_record = no_op_context
1923 self.readline_no_record = no_op_context
1924 self.set_readline_completer = no_op
1924 self.set_readline_completer = no_op
1925 self.set_custom_completer = no_op
1925 self.set_custom_completer = no_op
1926 if self.readline_use:
1926 if self.readline_use:
1927 warn('Readline services not available or not loaded.')
1927 warn('Readline services not available or not loaded.')
1928 else:
1928 else:
1929 self.has_readline = True
1929 self.has_readline = True
1930 self.readline = readline
1930 self.readline = readline
1931 sys.modules['readline'] = readline
1931 sys.modules['readline'] = readline
1932
1932
1933 # Platform-specific configuration
1933 # Platform-specific configuration
1934 if os.name == 'nt':
1934 if os.name == 'nt':
1935 # FIXME - check with Frederick to see if we can harmonize
1935 # FIXME - check with Frederick to see if we can harmonize
1936 # naming conventions with pyreadline to avoid this
1936 # naming conventions with pyreadline to avoid this
1937 # platform-dependent check
1937 # platform-dependent check
1938 self.readline_startup_hook = readline.set_pre_input_hook
1938 self.readline_startup_hook = readline.set_pre_input_hook
1939 else:
1939 else:
1940 self.readline_startup_hook = readline.set_startup_hook
1940 self.readline_startup_hook = readline.set_startup_hook
1941
1941
1942 # Readline config order:
1942 # Readline config order:
1943 # - IPython config (default value)
1943 # - IPython config (default value)
1944 # - custom inputrc
1944 # - custom inputrc
1945 # - IPython config (user customized)
1945 # - IPython config (user customized)
1946
1946
1947 # load IPython config before inputrc if default
1947 # load IPython config before inputrc if default
1948 # skip if libedit because parse_and_bind syntax is different
1948 # skip if libedit because parse_and_bind syntax is different
1949 if not self._custom_readline_config and not readline.uses_libedit:
1949 if not self._custom_readline_config and not readline.uses_libedit:
1950 for rlcommand in self.readline_parse_and_bind:
1950 for rlcommand in self.readline_parse_and_bind:
1951 readline.parse_and_bind(rlcommand)
1951 readline.parse_and_bind(rlcommand)
1952
1952
1953 # Load user's initrc file (readline config)
1953 # Load user's initrc file (readline config)
1954 # Or if libedit is used, load editrc.
1954 # Or if libedit is used, load editrc.
1955 inputrc_name = os.environ.get('INPUTRC')
1955 inputrc_name = os.environ.get('INPUTRC')
1956 if inputrc_name is None:
1956 if inputrc_name is None:
1957 inputrc_name = '.inputrc'
1957 inputrc_name = '.inputrc'
1958 if readline.uses_libedit:
1958 if readline.uses_libedit:
1959 inputrc_name = '.editrc'
1959 inputrc_name = '.editrc'
1960 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1960 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1961 if os.path.isfile(inputrc_name):
1961 if os.path.isfile(inputrc_name):
1962 try:
1962 try:
1963 readline.read_init_file(inputrc_name)
1963 readline.read_init_file(inputrc_name)
1964 except:
1964 except:
1965 warn('Problems reading readline initialization file <%s>'
1965 warn('Problems reading readline initialization file <%s>'
1966 % inputrc_name)
1966 % inputrc_name)
1967
1967
1968 # load IPython config after inputrc if user has customized
1968 # load IPython config after inputrc if user has customized
1969 if self._custom_readline_config:
1969 if self._custom_readline_config:
1970 for rlcommand in self.readline_parse_and_bind:
1970 for rlcommand in self.readline_parse_and_bind:
1971 readline.parse_and_bind(rlcommand)
1971 readline.parse_and_bind(rlcommand)
1972
1972
1973 # Remove some chars from the delimiters list. If we encounter
1973 # Remove some chars from the delimiters list. If we encounter
1974 # unicode chars, discard them.
1974 # unicode chars, discard them.
1975 delims = readline.get_completer_delims()
1975 delims = readline.get_completer_delims()
1976 if not py3compat.PY3:
1976 if not py3compat.PY3:
1977 delims = delims.encode("ascii", "ignore")
1977 delims = delims.encode("ascii", "ignore")
1978 for d in self.readline_remove_delims:
1978 for d in self.readline_remove_delims:
1979 delims = delims.replace(d, "")
1979 delims = delims.replace(d, "")
1980 delims = delims.replace(ESC_MAGIC, '')
1980 delims = delims.replace(ESC_MAGIC, '')
1981 readline.set_completer_delims(delims)
1981 readline.set_completer_delims(delims)
1982 # Store these so we can restore them if something like rpy2 modifies
1982 # Store these so we can restore them if something like rpy2 modifies
1983 # them.
1983 # them.
1984 self.readline_delims = delims
1984 self.readline_delims = delims
1985 # otherwise we end up with a monster history after a while:
1985 # otherwise we end up with a monster history after a while:
1986 readline.set_history_length(self.history_length)
1986 readline.set_history_length(self.history_length)
1987
1987
1988 self.refill_readline_hist()
1988 self.refill_readline_hist()
1989 self.readline_no_record = ReadlineNoRecord(self)
1989 self.readline_no_record = ReadlineNoRecord(self)
1990
1990
1991 # Configure auto-indent for all platforms
1991 # Configure auto-indent for all platforms
1992 self.set_autoindent(self.autoindent)
1992 self.set_autoindent(self.autoindent)
1993
1993
1994 def refill_readline_hist(self):
1994 def refill_readline_hist(self):
1995 # Load the last 1000 lines from history
1995 # Load the last 1000 lines from history
1996 self.readline.clear_history()
1996 self.readline.clear_history()
1997 stdin_encoding = sys.stdin.encoding or "utf-8"
1997 stdin_encoding = sys.stdin.encoding or "utf-8"
1998 last_cell = u""
1998 last_cell = u""
1999 for _, _, cell in self.history_manager.get_tail(1000,
1999 for _, _, cell in self.history_manager.get_tail(1000,
2000 include_latest=True):
2000 include_latest=True):
2001 # Ignore blank lines and consecutive duplicates
2001 # Ignore blank lines and consecutive duplicates
2002 cell = cell.rstrip()
2002 cell = cell.rstrip()
2003 if cell and (cell != last_cell):
2003 if cell and (cell != last_cell):
2004 try:
2004 try:
2005 if self.multiline_history:
2005 if self.multiline_history:
2006 self.readline.add_history(py3compat.unicode_to_str(cell,
2006 self.readline.add_history(py3compat.unicode_to_str(cell,
2007 stdin_encoding))
2007 stdin_encoding))
2008 else:
2008 else:
2009 for line in cell.splitlines():
2009 for line in cell.splitlines():
2010 self.readline.add_history(py3compat.unicode_to_str(line,
2010 self.readline.add_history(py3compat.unicode_to_str(line,
2011 stdin_encoding))
2011 stdin_encoding))
2012 last_cell = cell
2012 last_cell = cell
2013
2013
2014 except TypeError:
2014 except TypeError:
2015 # The history DB can get corrupted so it returns strings
2015 # The history DB can get corrupted so it returns strings
2016 # containing null bytes, which readline objects to.
2016 # containing null bytes, which readline objects to.
2017 continue
2017 continue
2018
2018
2019 @skip_doctest
2019 @skip_doctest
2020 def set_next_input(self, s, replace=False):
2020 def set_next_input(self, s, replace=False):
2021 """ Sets the 'default' input string for the next command line.
2021 """ Sets the 'default' input string for the next command line.
2022
2022
2023 Requires readline.
2023 Requires readline.
2024
2024
2025 Example::
2025 Example::
2026
2026
2027 In [1]: _ip.set_next_input("Hello Word")
2027 In [1]: _ip.set_next_input("Hello Word")
2028 In [2]: Hello Word_ # cursor is here
2028 In [2]: Hello Word_ # cursor is here
2029 """
2029 """
2030 self.rl_next_input = py3compat.cast_bytes_py2(s)
2030 self.rl_next_input = py3compat.cast_bytes_py2(s)
2031
2031
2032 # Maybe move this to the terminal subclass?
2032 # Maybe move this to the terminal subclass?
2033 def pre_readline(self):
2033 def pre_readline(self):
2034 """readline hook to be used at the start of each line.
2034 """readline hook to be used at the start of each line.
2035
2035
2036 Currently it handles auto-indent only."""
2036 Currently it handles auto-indent only."""
2037
2037
2038 if self.rl_do_indent:
2038 if self.rl_do_indent:
2039 self.readline.insert_text(self._indent_current_str())
2039 self.readline.insert_text(self._indent_current_str())
2040 if self.rl_next_input is not None:
2040 if self.rl_next_input is not None:
2041 self.readline.insert_text(self.rl_next_input)
2041 self.readline.insert_text(self.rl_next_input)
2042 self.rl_next_input = None
2042 self.rl_next_input = None
2043
2043
2044 def _indent_current_str(self):
2044 def _indent_current_str(self):
2045 """return the current level of indentation as a string"""
2045 """return the current level of indentation as a string"""
2046 return self.input_splitter.indent_spaces * ' '
2046 return self.input_splitter.indent_spaces * ' '
2047
2047
2048 #-------------------------------------------------------------------------
2048 #-------------------------------------------------------------------------
2049 # Things related to text completion
2049 # Things related to text completion
2050 #-------------------------------------------------------------------------
2050 #-------------------------------------------------------------------------
2051
2051
2052 def init_completer(self):
2052 def init_completer(self):
2053 """Initialize the completion machinery.
2053 """Initialize the completion machinery.
2054
2054
2055 This creates completion machinery that can be used by client code,
2055 This creates completion machinery that can be used by client code,
2056 either interactively in-process (typically triggered by the readline
2056 either interactively in-process (typically triggered by the readline
2057 library), programatically (such as in test suites) or out-of-prcess
2057 library), programatically (such as in test suites) or out-of-prcess
2058 (typically over the network by remote frontends).
2058 (typically over the network by remote frontends).
2059 """
2059 """
2060 from IPython.core.completer import IPCompleter
2060 from IPython.core.completer import IPCompleter
2061 from IPython.core.completerlib import (module_completer,
2061 from IPython.core.completerlib import (module_completer,
2062 magic_run_completer, cd_completer, reset_completer)
2062 magic_run_completer, cd_completer, reset_completer)
2063
2063
2064 self.Completer = IPCompleter(shell=self,
2064 self.Completer = IPCompleter(shell=self,
2065 namespace=self.user_ns,
2065 namespace=self.user_ns,
2066 global_namespace=self.user_global_ns,
2066 global_namespace=self.user_global_ns,
2067 use_readline=self.has_readline,
2067 use_readline=self.has_readline,
2068 parent=self,
2068 parent=self,
2069 )
2069 )
2070 self.configurables.append(self.Completer)
2070 self.configurables.append(self.Completer)
2071
2071
2072 # Add custom completers to the basic ones built into IPCompleter
2072 # Add custom completers to the basic ones built into IPCompleter
2073 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2073 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2074 self.strdispatchers['complete_command'] = sdisp
2074 self.strdispatchers['complete_command'] = sdisp
2075 self.Completer.custom_completers = sdisp
2075 self.Completer.custom_completers = sdisp
2076
2076
2077 self.set_hook('complete_command', module_completer, str_key = 'import')
2077 self.set_hook('complete_command', module_completer, str_key = 'import')
2078 self.set_hook('complete_command', module_completer, str_key = 'from')
2078 self.set_hook('complete_command', module_completer, str_key = 'from')
2079 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2079 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2080 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2080 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2081 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2081 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2082
2082
2083 # Only configure readline if we truly are using readline. IPython can
2083 # Only configure readline if we truly are using readline. IPython can
2084 # do tab-completion over the network, in GUIs, etc, where readline
2084 # do tab-completion over the network, in GUIs, etc, where readline
2085 # itself may be absent
2085 # itself may be absent
2086 if self.has_readline:
2086 if self.has_readline:
2087 self.set_readline_completer()
2087 self.set_readline_completer()
2088
2088
2089 def complete(self, text, line=None, cursor_pos=None):
2089 def complete(self, text, line=None, cursor_pos=None):
2090 """Return the completed text and a list of completions.
2090 """Return the completed text and a list of completions.
2091
2091
2092 Parameters
2092 Parameters
2093 ----------
2093 ----------
2094
2094
2095 text : string
2095 text : string
2096 A string of text to be completed on. It can be given as empty and
2096 A string of text to be completed on. It can be given as empty and
2097 instead a line/position pair are given. In this case, the
2097 instead a line/position pair are given. In this case, the
2098 completer itself will split the line like readline does.
2098 completer itself will split the line like readline does.
2099
2099
2100 line : string, optional
2100 line : string, optional
2101 The complete line that text is part of.
2101 The complete line that text is part of.
2102
2102
2103 cursor_pos : int, optional
2103 cursor_pos : int, optional
2104 The position of the cursor on the input line.
2104 The position of the cursor on the input line.
2105
2105
2106 Returns
2106 Returns
2107 -------
2107 -------
2108 text : string
2108 text : string
2109 The actual text that was completed.
2109 The actual text that was completed.
2110
2110
2111 matches : list
2111 matches : list
2112 A sorted list with all possible completions.
2112 A sorted list with all possible completions.
2113
2113
2114 The optional arguments allow the completion to take more context into
2114 The optional arguments allow the completion to take more context into
2115 account, and are part of the low-level completion API.
2115 account, and are part of the low-level completion API.
2116
2116
2117 This is a wrapper around the completion mechanism, similar to what
2117 This is a wrapper around the completion mechanism, similar to what
2118 readline does at the command line when the TAB key is hit. By
2118 readline does at the command line when the TAB key is hit. By
2119 exposing it as a method, it can be used by other non-readline
2119 exposing it as a method, it can be used by other non-readline
2120 environments (such as GUIs) for text completion.
2120 environments (such as GUIs) for text completion.
2121
2121
2122 Simple usage example:
2122 Simple usage example:
2123
2123
2124 In [1]: x = 'hello'
2124 In [1]: x = 'hello'
2125
2125
2126 In [2]: _ip.complete('x.l')
2126 In [2]: _ip.complete('x.l')
2127 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2127 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2128 """
2128 """
2129
2129
2130 # Inject names into __builtin__ so we can complete on the added names.
2130 # Inject names into __builtin__ so we can complete on the added names.
2131 with self.builtin_trap:
2131 with self.builtin_trap:
2132 return self.Completer.complete(text, line, cursor_pos)
2132 return self.Completer.complete(text, line, cursor_pos)
2133
2133
2134 def set_custom_completer(self, completer, pos=0):
2134 def set_custom_completer(self, completer, pos=0):
2135 """Adds a new custom completer function.
2135 """Adds a new custom completer function.
2136
2136
2137 The position argument (defaults to 0) is the index in the completers
2137 The position argument (defaults to 0) is the index in the completers
2138 list where you want the completer to be inserted."""
2138 list where you want the completer to be inserted."""
2139
2139
2140 newcomp = types.MethodType(completer,self.Completer)
2140 newcomp = types.MethodType(completer,self.Completer)
2141 self.Completer.matchers.insert(pos,newcomp)
2141 self.Completer.matchers.insert(pos,newcomp)
2142
2142
2143 def set_readline_completer(self):
2143 def set_readline_completer(self):
2144 """Reset readline's completer to be our own."""
2144 """Reset readline's completer to be our own."""
2145 self.readline.set_completer(self.Completer.rlcomplete)
2145 self.readline.set_completer(self.Completer.rlcomplete)
2146
2146
2147 def set_completer_frame(self, frame=None):
2147 def set_completer_frame(self, frame=None):
2148 """Set the frame of the completer."""
2148 """Set the frame of the completer."""
2149 if frame:
2149 if frame:
2150 self.Completer.namespace = frame.f_locals
2150 self.Completer.namespace = frame.f_locals
2151 self.Completer.global_namespace = frame.f_globals
2151 self.Completer.global_namespace = frame.f_globals
2152 else:
2152 else:
2153 self.Completer.namespace = self.user_ns
2153 self.Completer.namespace = self.user_ns
2154 self.Completer.global_namespace = self.user_global_ns
2154 self.Completer.global_namespace = self.user_global_ns
2155
2155
2156 #-------------------------------------------------------------------------
2156 #-------------------------------------------------------------------------
2157 # Things related to magics
2157 # Things related to magics
2158 #-------------------------------------------------------------------------
2158 #-------------------------------------------------------------------------
2159
2159
2160 def init_magics(self):
2160 def init_magics(self):
2161 from IPython.core import magics as m
2161 from IPython.core import magics as m
2162 self.magics_manager = magic.MagicsManager(shell=self,
2162 self.magics_manager = magic.MagicsManager(shell=self,
2163 parent=self,
2163 parent=self,
2164 user_magics=m.UserMagics(self))
2164 user_magics=m.UserMagics(self))
2165 self.configurables.append(self.magics_manager)
2165 self.configurables.append(self.magics_manager)
2166
2166
2167 # Expose as public API from the magics manager
2167 # Expose as public API from the magics manager
2168 self.register_magics = self.magics_manager.register
2168 self.register_magics = self.magics_manager.register
2169 self.define_magic = self.magics_manager.define_magic
2169 self.define_magic = self.magics_manager.define_magic
2170
2170
2171 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2171 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2172 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2172 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2173 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2173 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2174 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2174 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2175 )
2175 )
2176
2176
2177 # Register Magic Aliases
2177 # Register Magic Aliases
2178 mman = self.magics_manager
2178 mman = self.magics_manager
2179 # FIXME: magic aliases should be defined by the Magics classes
2179 # FIXME: magic aliases should be defined by the Magics classes
2180 # or in MagicsManager, not here
2180 # or in MagicsManager, not here
2181 mman.register_alias('ed', 'edit')
2181 mman.register_alias('ed', 'edit')
2182 mman.register_alias('hist', 'history')
2182 mman.register_alias('hist', 'history')
2183 mman.register_alias('rep', 'recall')
2183 mman.register_alias('rep', 'recall')
2184 mman.register_alias('SVG', 'svg', 'cell')
2184 mman.register_alias('SVG', 'svg', 'cell')
2185 mman.register_alias('HTML', 'html', 'cell')
2185 mman.register_alias('HTML', 'html', 'cell')
2186 mman.register_alias('file', 'writefile', 'cell')
2186 mman.register_alias('file', 'writefile', 'cell')
2187
2187
2188 # FIXME: Move the color initialization to the DisplayHook, which
2188 # FIXME: Move the color initialization to the DisplayHook, which
2189 # should be split into a prompt manager and displayhook. We probably
2189 # should be split into a prompt manager and displayhook. We probably
2190 # even need a centralize colors management object.
2190 # even need a centralize colors management object.
2191 self.magic('colors %s' % self.colors)
2191 self.magic('colors %s' % self.colors)
2192
2192
2193 # Defined here so that it's included in the documentation
2193 # Defined here so that it's included in the documentation
2194 @functools.wraps(magic.MagicsManager.register_function)
2194 @functools.wraps(magic.MagicsManager.register_function)
2195 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2195 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2196 self.magics_manager.register_function(func,
2196 self.magics_manager.register_function(func,
2197 magic_kind=magic_kind, magic_name=magic_name)
2197 magic_kind=magic_kind, magic_name=magic_name)
2198
2198
2199 def run_line_magic(self, magic_name, line):
2199 def run_line_magic(self, magic_name, line):
2200 """Execute the given line magic.
2200 """Execute the given line magic.
2201
2201
2202 Parameters
2202 Parameters
2203 ----------
2203 ----------
2204 magic_name : str
2204 magic_name : str
2205 Name of the desired magic function, without '%' prefix.
2205 Name of the desired magic function, without '%' prefix.
2206
2206
2207 line : str
2207 line : str
2208 The rest of the input line as a single string.
2208 The rest of the input line as a single string.
2209 """
2209 """
2210 fn = self.find_line_magic(magic_name)
2210 fn = self.find_line_magic(magic_name)
2211 if fn is None:
2211 if fn is None:
2212 cm = self.find_cell_magic(magic_name)
2212 cm = self.find_cell_magic(magic_name)
2213 etpl = "Line magic function `%%%s` not found%s."
2213 etpl = "Line magic function `%%%s` not found%s."
2214 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2214 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2215 'did you mean that instead?)' % magic_name )
2215 'did you mean that instead?)' % magic_name )
2216 error(etpl % (magic_name, extra))
2216 error(etpl % (magic_name, extra))
2217 else:
2217 else:
2218 # Note: this is the distance in the stack to the user's frame.
2218 # Note: this is the distance in the stack to the user's frame.
2219 # This will need to be updated if the internal calling logic gets
2219 # This will need to be updated if the internal calling logic gets
2220 # refactored, or else we'll be expanding the wrong variables.
2220 # refactored, or else we'll be expanding the wrong variables.
2221 stack_depth = 2
2221 stack_depth = 2
2222 magic_arg_s = self.var_expand(line, stack_depth)
2222 magic_arg_s = self.var_expand(line, stack_depth)
2223 # Put magic args in a list so we can call with f(*a) syntax
2223 # Put magic args in a list so we can call with f(*a) syntax
2224 args = [magic_arg_s]
2224 args = [magic_arg_s]
2225 kwargs = {}
2225 kwargs = {}
2226 # Grab local namespace if we need it:
2226 # Grab local namespace if we need it:
2227 if getattr(fn, "needs_local_scope", False):
2227 if getattr(fn, "needs_local_scope", False):
2228 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2228 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2229 with self.builtin_trap:
2229 with self.builtin_trap:
2230 result = fn(*args,**kwargs)
2230 result = fn(*args,**kwargs)
2231 return result
2231 return result
2232
2232
2233 def run_cell_magic(self, magic_name, line, cell):
2233 def run_cell_magic(self, magic_name, line, cell):
2234 """Execute the given cell magic.
2234 """Execute the given cell magic.
2235
2235
2236 Parameters
2236 Parameters
2237 ----------
2237 ----------
2238 magic_name : str
2238 magic_name : str
2239 Name of the desired magic function, without '%' prefix.
2239 Name of the desired magic function, without '%' prefix.
2240
2240
2241 line : str
2241 line : str
2242 The rest of the first input line as a single string.
2242 The rest of the first input line as a single string.
2243
2243
2244 cell : str
2244 cell : str
2245 The body of the cell as a (possibly multiline) string.
2245 The body of the cell as a (possibly multiline) string.
2246 """
2246 """
2247 fn = self.find_cell_magic(magic_name)
2247 fn = self.find_cell_magic(magic_name)
2248 if fn is None:
2248 if fn is None:
2249 lm = self.find_line_magic(magic_name)
2249 lm = self.find_line_magic(magic_name)
2250 etpl = "Cell magic `%%{0}` not found{1}."
2250 etpl = "Cell magic `%%{0}` not found{1}."
2251 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2251 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2252 'did you mean that instead?)'.format(magic_name))
2252 'did you mean that instead?)'.format(magic_name))
2253 error(etpl.format(magic_name, extra))
2253 error(etpl.format(magic_name, extra))
2254 elif cell == '':
2254 elif cell == '':
2255 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2255 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2256 if self.find_line_magic(magic_name) is not None:
2256 if self.find_line_magic(magic_name) is not None:
2257 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2257 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2258 raise UsageError(message)
2258 raise UsageError(message)
2259 else:
2259 else:
2260 # Note: this is the distance in the stack to the user's frame.
2260 # Note: this is the distance in the stack to the user's frame.
2261 # This will need to be updated if the internal calling logic gets
2261 # This will need to be updated if the internal calling logic gets
2262 # refactored, or else we'll be expanding the wrong variables.
2262 # refactored, or else we'll be expanding the wrong variables.
2263 stack_depth = 2
2263 stack_depth = 2
2264 magic_arg_s = self.var_expand(line, stack_depth)
2264 magic_arg_s = self.var_expand(line, stack_depth)
2265 with self.builtin_trap:
2265 with self.builtin_trap:
2266 result = fn(magic_arg_s, cell)
2266 result = fn(magic_arg_s, cell)
2267 return result
2267 return result
2268
2268
2269 def find_line_magic(self, magic_name):
2269 def find_line_magic(self, magic_name):
2270 """Find and return a line magic by name.
2270 """Find and return a line magic by name.
2271
2271
2272 Returns None if the magic isn't found."""
2272 Returns None if the magic isn't found."""
2273 return self.magics_manager.magics['line'].get(magic_name)
2273 return self.magics_manager.magics['line'].get(magic_name)
2274
2274
2275 def find_cell_magic(self, magic_name):
2275 def find_cell_magic(self, magic_name):
2276 """Find and return a cell magic by name.
2276 """Find and return a cell magic by name.
2277
2277
2278 Returns None if the magic isn't found."""
2278 Returns None if the magic isn't found."""
2279 return self.magics_manager.magics['cell'].get(magic_name)
2279 return self.magics_manager.magics['cell'].get(magic_name)
2280
2280
2281 def find_magic(self, magic_name, magic_kind='line'):
2281 def find_magic(self, magic_name, magic_kind='line'):
2282 """Find and return a magic of the given type by name.
2282 """Find and return a magic of the given type by name.
2283
2283
2284 Returns None if the magic isn't found."""
2284 Returns None if the magic isn't found."""
2285 return self.magics_manager.magics[magic_kind].get(magic_name)
2285 return self.magics_manager.magics[magic_kind].get(magic_name)
2286
2286
2287 def magic(self, arg_s):
2287 def magic(self, arg_s):
2288 """DEPRECATED. Use run_line_magic() instead.
2288 """DEPRECATED. Use run_line_magic() instead.
2289
2289
2290 Call a magic function by name.
2290 Call a magic function by name.
2291
2291
2292 Input: a string containing the name of the magic function to call and
2292 Input: a string containing the name of the magic function to call and
2293 any additional arguments to be passed to the magic.
2293 any additional arguments to be passed to the magic.
2294
2294
2295 magic('name -opt foo bar') is equivalent to typing at the ipython
2295 magic('name -opt foo bar') is equivalent to typing at the ipython
2296 prompt:
2296 prompt:
2297
2297
2298 In[1]: %name -opt foo bar
2298 In[1]: %name -opt foo bar
2299
2299
2300 To call a magic without arguments, simply use magic('name').
2300 To call a magic without arguments, simply use magic('name').
2301
2301
2302 This provides a proper Python function to call IPython's magics in any
2302 This provides a proper Python function to call IPython's magics in any
2303 valid Python code you can type at the interpreter, including loops and
2303 valid Python code you can type at the interpreter, including loops and
2304 compound statements.
2304 compound statements.
2305 """
2305 """
2306 # TODO: should we issue a loud deprecation warning here?
2306 # TODO: should we issue a loud deprecation warning here?
2307 magic_name, _, magic_arg_s = arg_s.partition(' ')
2307 magic_name, _, magic_arg_s = arg_s.partition(' ')
2308 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2308 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2309 return self.run_line_magic(magic_name, magic_arg_s)
2309 return self.run_line_magic(magic_name, magic_arg_s)
2310
2310
2311 #-------------------------------------------------------------------------
2311 #-------------------------------------------------------------------------
2312 # Things related to macros
2312 # Things related to macros
2313 #-------------------------------------------------------------------------
2313 #-------------------------------------------------------------------------
2314
2314
2315 def define_macro(self, name, themacro):
2315 def define_macro(self, name, themacro):
2316 """Define a new macro
2316 """Define a new macro
2317
2317
2318 Parameters
2318 Parameters
2319 ----------
2319 ----------
2320 name : str
2320 name : str
2321 The name of the macro.
2321 The name of the macro.
2322 themacro : str or Macro
2322 themacro : str or Macro
2323 The action to do upon invoking the macro. If a string, a new
2323 The action to do upon invoking the macro. If a string, a new
2324 Macro object is created by passing the string to it.
2324 Macro object is created by passing the string to it.
2325 """
2325 """
2326
2326
2327 from IPython.core import macro
2327 from IPython.core import macro
2328
2328
2329 if isinstance(themacro, string_types):
2329 if isinstance(themacro, string_types):
2330 themacro = macro.Macro(themacro)
2330 themacro = macro.Macro(themacro)
2331 if not isinstance(themacro, macro.Macro):
2331 if not isinstance(themacro, macro.Macro):
2332 raise ValueError('A macro must be a string or a Macro instance.')
2332 raise ValueError('A macro must be a string or a Macro instance.')
2333 self.user_ns[name] = themacro
2333 self.user_ns[name] = themacro
2334
2334
2335 #-------------------------------------------------------------------------
2335 #-------------------------------------------------------------------------
2336 # Things related to the running of system commands
2336 # Things related to the running of system commands
2337 #-------------------------------------------------------------------------
2337 #-------------------------------------------------------------------------
2338
2338
2339 def system_piped(self, cmd):
2339 def system_piped(self, cmd):
2340 """Call the given cmd in a subprocess, piping stdout/err
2340 """Call the given cmd in a subprocess, piping stdout/err
2341
2341
2342 Parameters
2342 Parameters
2343 ----------
2343 ----------
2344 cmd : str
2344 cmd : str
2345 Command to execute (can not end in '&', as background processes are
2345 Command to execute (can not end in '&', as background processes are
2346 not supported. Should not be a command that expects input
2346 not supported. Should not be a command that expects input
2347 other than simple text.
2347 other than simple text.
2348 """
2348 """
2349 if cmd.rstrip().endswith('&'):
2349 if cmd.rstrip().endswith('&'):
2350 # this is *far* from a rigorous test
2350 # this is *far* from a rigorous test
2351 # We do not support backgrounding processes because we either use
2351 # We do not support backgrounding processes because we either use
2352 # pexpect or pipes to read from. Users can always just call
2352 # pexpect or pipes to read from. Users can always just call
2353 # os.system() or use ip.system=ip.system_raw
2353 # os.system() or use ip.system=ip.system_raw
2354 # if they really want a background process.
2354 # if they really want a background process.
2355 raise OSError("Background processes not supported.")
2355 raise OSError("Background processes not supported.")
2356
2356
2357 # we explicitly do NOT return the subprocess status code, because
2357 # we explicitly do NOT return the subprocess status code, because
2358 # a non-None value would trigger :func:`sys.displayhook` calls.
2358 # a non-None value would trigger :func:`sys.displayhook` calls.
2359 # Instead, we store the exit_code in user_ns.
2359 # Instead, we store the exit_code in user_ns.
2360 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2360 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2361
2361
2362 def system_raw(self, cmd):
2362 def system_raw(self, cmd):
2363 """Call the given cmd in a subprocess using os.system on Windows or
2363 """Call the given cmd in a subprocess using os.system on Windows or
2364 subprocess.call using the system shell on other platforms.
2364 subprocess.call using the system shell on other platforms.
2365
2365
2366 Parameters
2366 Parameters
2367 ----------
2367 ----------
2368 cmd : str
2368 cmd : str
2369 Command to execute.
2369 Command to execute.
2370 """
2370 """
2371 cmd = self.var_expand(cmd, depth=1)
2371 cmd = self.var_expand(cmd, depth=1)
2372 # protect os.system from UNC paths on Windows, which it can't handle:
2372 # protect os.system from UNC paths on Windows, which it can't handle:
2373 if sys.platform == 'win32':
2373 if sys.platform == 'win32':
2374 from IPython.utils._process_win32 import AvoidUNCPath
2374 from IPython.utils._process_win32 import AvoidUNCPath
2375 with AvoidUNCPath() as path:
2375 with AvoidUNCPath() as path:
2376 if path is not None:
2376 if path is not None:
2377 cmd = '"pushd %s &&"%s' % (path, cmd)
2377 cmd = '"pushd %s &&"%s' % (path, cmd)
2378 cmd = py3compat.unicode_to_str(cmd)
2378 cmd = py3compat.unicode_to_str(cmd)
2379 try:
2379 try:
2380 ec = os.system(cmd)
2380 ec = os.system(cmd)
2381 except KeyboardInterrupt:
2381 except KeyboardInterrupt:
2382 self.write_err('\n' + self.get_exception_only())
2382 self.write_err('\n' + self.get_exception_only())
2383 ec = -2
2383 ec = -2
2384 else:
2384 else:
2385 cmd = py3compat.unicode_to_str(cmd)
2385 cmd = py3compat.unicode_to_str(cmd)
2386 # For posix the result of the subprocess.call() below is an exit
2386 # For posix the result of the subprocess.call() below is an exit
2387 # code, which by convention is zero for success, positive for
2387 # code, which by convention is zero for success, positive for
2388 # program failure. Exit codes above 128 are reserved for signals,
2388 # program failure. Exit codes above 128 are reserved for signals,
2389 # and the formula for converting a signal to an exit code is usually
2389 # and the formula for converting a signal to an exit code is usually
2390 # signal_number+128. To more easily differentiate between exit
2390 # signal_number+128. To more easily differentiate between exit
2391 # codes and signals, ipython uses negative numbers. For instance
2391 # codes and signals, ipython uses negative numbers. For instance
2392 # since control-c is signal 2 but exit code 130, ipython's
2392 # since control-c is signal 2 but exit code 130, ipython's
2393 # _exit_code variable will read -2. Note that some shells like
2393 # _exit_code variable will read -2. Note that some shells like
2394 # csh and fish don't follow sh/bash conventions for exit codes.
2394 # csh and fish don't follow sh/bash conventions for exit codes.
2395 executable = os.environ.get('SHELL', None)
2395 executable = os.environ.get('SHELL', None)
2396 try:
2396 try:
2397 # Use env shell instead of default /bin/sh
2397 # Use env shell instead of default /bin/sh
2398 ec = subprocess.call(cmd, shell=True, executable=executable)
2398 ec = subprocess.call(cmd, shell=True, executable=executable)
2399 except KeyboardInterrupt:
2399 except KeyboardInterrupt:
2400 # intercept control-C; a long traceback is not useful here
2400 # intercept control-C; a long traceback is not useful here
2401 self.write_err('\n' + self.get_exception_only())
2401 self.write_err('\n' + self.get_exception_only())
2402 ec = 130
2402 ec = 130
2403 if ec > 128:
2403 if ec > 128:
2404 ec = -(ec - 128)
2404 ec = -(ec - 128)
2405
2405
2406 # We explicitly do NOT return the subprocess status code, because
2406 # We explicitly do NOT return the subprocess status code, because
2407 # a non-None value would trigger :func:`sys.displayhook` calls.
2407 # a non-None value would trigger :func:`sys.displayhook` calls.
2408 # Instead, we store the exit_code in user_ns. Note the semantics
2408 # Instead, we store the exit_code in user_ns. Note the semantics
2409 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2409 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2410 # but raising SystemExit(_exit_code) will give status 254!
2410 # but raising SystemExit(_exit_code) will give status 254!
2411 self.user_ns['_exit_code'] = ec
2411 self.user_ns['_exit_code'] = ec
2412
2412
2413 # use piped system by default, because it is better behaved
2413 # use piped system by default, because it is better behaved
2414 system = system_piped
2414 system = system_piped
2415
2415
2416 def getoutput(self, cmd, split=True, depth=0):
2416 def getoutput(self, cmd, split=True, depth=0):
2417 """Get output (possibly including stderr) from a subprocess.
2417 """Get output (possibly including stderr) from a subprocess.
2418
2418
2419 Parameters
2419 Parameters
2420 ----------
2420 ----------
2421 cmd : str
2421 cmd : str
2422 Command to execute (can not end in '&', as background processes are
2422 Command to execute (can not end in '&', as background processes are
2423 not supported.
2423 not supported.
2424 split : bool, optional
2424 split : bool, optional
2425 If True, split the output into an IPython SList. Otherwise, an
2425 If True, split the output into an IPython SList. Otherwise, an
2426 IPython LSString is returned. These are objects similar to normal
2426 IPython LSString is returned. These are objects similar to normal
2427 lists and strings, with a few convenience attributes for easier
2427 lists and strings, with a few convenience attributes for easier
2428 manipulation of line-based output. You can use '?' on them for
2428 manipulation of line-based output. You can use '?' on them for
2429 details.
2429 details.
2430 depth : int, optional
2430 depth : int, optional
2431 How many frames above the caller are the local variables which should
2431 How many frames above the caller are the local variables which should
2432 be expanded in the command string? The default (0) assumes that the
2432 be expanded in the command string? The default (0) assumes that the
2433 expansion variables are in the stack frame calling this function.
2433 expansion variables are in the stack frame calling this function.
2434 """
2434 """
2435 if cmd.rstrip().endswith('&'):
2435 if cmd.rstrip().endswith('&'):
2436 # this is *far* from a rigorous test
2436 # this is *far* from a rigorous test
2437 raise OSError("Background processes not supported.")
2437 raise OSError("Background processes not supported.")
2438 out = getoutput(self.var_expand(cmd, depth=depth+1))
2438 out = getoutput(self.var_expand(cmd, depth=depth+1))
2439 if split:
2439 if split:
2440 out = SList(out.splitlines())
2440 out = SList(out.splitlines())
2441 else:
2441 else:
2442 out = LSString(out)
2442 out = LSString(out)
2443 return out
2443 return out
2444
2444
2445 #-------------------------------------------------------------------------
2445 #-------------------------------------------------------------------------
2446 # Things related to aliases
2446 # Things related to aliases
2447 #-------------------------------------------------------------------------
2447 #-------------------------------------------------------------------------
2448
2448
2449 def init_alias(self):
2449 def init_alias(self):
2450 self.alias_manager = AliasManager(shell=self, parent=self)
2450 self.alias_manager = AliasManager(shell=self, parent=self)
2451 self.configurables.append(self.alias_manager)
2451 self.configurables.append(self.alias_manager)
2452
2452
2453 #-------------------------------------------------------------------------
2453 #-------------------------------------------------------------------------
2454 # Things related to extensions
2454 # Things related to extensions
2455 #-------------------------------------------------------------------------
2455 #-------------------------------------------------------------------------
2456
2456
2457 def init_extension_manager(self):
2457 def init_extension_manager(self):
2458 self.extension_manager = ExtensionManager(shell=self, parent=self)
2458 self.extension_manager = ExtensionManager(shell=self, parent=self)
2459 self.configurables.append(self.extension_manager)
2459 self.configurables.append(self.extension_manager)
2460
2460
2461 #-------------------------------------------------------------------------
2461 #-------------------------------------------------------------------------
2462 # Things related to payloads
2462 # Things related to payloads
2463 #-------------------------------------------------------------------------
2463 #-------------------------------------------------------------------------
2464
2464
2465 def init_payload(self):
2465 def init_payload(self):
2466 self.payload_manager = PayloadManager(parent=self)
2466 self.payload_manager = PayloadManager(parent=self)
2467 self.configurables.append(self.payload_manager)
2467 self.configurables.append(self.payload_manager)
2468
2468
2469 #-------------------------------------------------------------------------
2469 #-------------------------------------------------------------------------
2470 # Things related to the prefilter
2470 # Things related to the prefilter
2471 #-------------------------------------------------------------------------
2471 #-------------------------------------------------------------------------
2472
2472
2473 def init_prefilter(self):
2473 def init_prefilter(self):
2474 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2474 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2475 self.configurables.append(self.prefilter_manager)
2475 self.configurables.append(self.prefilter_manager)
2476 # Ultimately this will be refactored in the new interpreter code, but
2476 # Ultimately this will be refactored in the new interpreter code, but
2477 # for now, we should expose the main prefilter method (there's legacy
2477 # for now, we should expose the main prefilter method (there's legacy
2478 # code out there that may rely on this).
2478 # code out there that may rely on this).
2479 self.prefilter = self.prefilter_manager.prefilter_lines
2479 self.prefilter = self.prefilter_manager.prefilter_lines
2480
2480
2481 def auto_rewrite_input(self, cmd):
2481 def auto_rewrite_input(self, cmd):
2482 """Print to the screen the rewritten form of the user's command.
2482 """Print to the screen the rewritten form of the user's command.
2483
2483
2484 This shows visual feedback by rewriting input lines that cause
2484 This shows visual feedback by rewriting input lines that cause
2485 automatic calling to kick in, like::
2485 automatic calling to kick in, like::
2486
2486
2487 /f x
2487 /f x
2488
2488
2489 into::
2489 into::
2490
2490
2491 ------> f(x)
2491 ------> f(x)
2492
2492
2493 after the user's input prompt. This helps the user understand that the
2493 after the user's input prompt. This helps the user understand that the
2494 input line was transformed automatically by IPython.
2494 input line was transformed automatically by IPython.
2495 """
2495 """
2496 if not self.show_rewritten_input:
2496 if not self.show_rewritten_input:
2497 return
2497 return
2498
2498
2499 rw = self.prompt_manager.render('rewrite') + cmd
2499 rw = self.prompt_manager.render('rewrite') + cmd
2500
2500
2501 try:
2501 try:
2502 # plain ascii works better w/ pyreadline, on some machines, so
2502 # plain ascii works better w/ pyreadline, on some machines, so
2503 # we use it and only print uncolored rewrite if we have unicode
2503 # we use it and only print uncolored rewrite if we have unicode
2504 rw = str(rw)
2504 rw = str(rw)
2505 print(rw, file=io.stdout)
2505 print(rw, file=io.stdout)
2506 except UnicodeEncodeError:
2506 except UnicodeEncodeError:
2507 print("------> " + cmd)
2507 print("------> " + cmd)
2508
2508
2509 #-------------------------------------------------------------------------
2509 #-------------------------------------------------------------------------
2510 # Things related to extracting values/expressions from kernel and user_ns
2510 # Things related to extracting values/expressions from kernel and user_ns
2511 #-------------------------------------------------------------------------
2511 #-------------------------------------------------------------------------
2512
2512
2513 def _user_obj_error(self):
2513 def _user_obj_error(self):
2514 """return simple exception dict
2514 """return simple exception dict
2515
2515
2516 for use in user_expressions
2516 for use in user_expressions
2517 """
2517 """
2518
2518
2519 etype, evalue, tb = self._get_exc_info()
2519 etype, evalue, tb = self._get_exc_info()
2520 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2520 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2521
2521
2522 exc_info = {
2522 exc_info = {
2523 u'status' : 'error',
2523 u'status' : 'error',
2524 u'traceback' : stb,
2524 u'traceback' : stb,
2525 u'ename' : unicode_type(etype.__name__),
2525 u'ename' : unicode_type(etype.__name__),
2526 u'evalue' : py3compat.safe_unicode(evalue),
2526 u'evalue' : py3compat.safe_unicode(evalue),
2527 }
2527 }
2528
2528
2529 return exc_info
2529 return exc_info
2530
2530
2531 def _format_user_obj(self, obj):
2531 def _format_user_obj(self, obj):
2532 """format a user object to display dict
2532 """format a user object to display dict
2533
2533
2534 for use in user_expressions
2534 for use in user_expressions
2535 """
2535 """
2536
2536
2537 data, md = self.display_formatter.format(obj)
2537 data, md = self.display_formatter.format(obj)
2538 value = {
2538 value = {
2539 'status' : 'ok',
2539 'status' : 'ok',
2540 'data' : data,
2540 'data' : data,
2541 'metadata' : md,
2541 'metadata' : md,
2542 }
2542 }
2543 return value
2543 return value
2544
2544
2545 def user_expressions(self, expressions):
2545 def user_expressions(self, expressions):
2546 """Evaluate a dict of expressions in the user's namespace.
2546 """Evaluate a dict of expressions in the user's namespace.
2547
2547
2548 Parameters
2548 Parameters
2549 ----------
2549 ----------
2550 expressions : dict
2550 expressions : dict
2551 A dict with string keys and string values. The expression values
2551 A dict with string keys and string values. The expression values
2552 should be valid Python expressions, each of which will be evaluated
2552 should be valid Python expressions, each of which will be evaluated
2553 in the user namespace.
2553 in the user namespace.
2554
2554
2555 Returns
2555 Returns
2556 -------
2556 -------
2557 A dict, keyed like the input expressions dict, with the rich mime-typed
2557 A dict, keyed like the input expressions dict, with the rich mime-typed
2558 display_data of each value.
2558 display_data of each value.
2559 """
2559 """
2560 out = {}
2560 out = {}
2561 user_ns = self.user_ns
2561 user_ns = self.user_ns
2562 global_ns = self.user_global_ns
2562 global_ns = self.user_global_ns
2563
2563
2564 for key, expr in iteritems(expressions):
2564 for key, expr in iteritems(expressions):
2565 try:
2565 try:
2566 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2566 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2567 except:
2567 except:
2568 value = self._user_obj_error()
2568 value = self._user_obj_error()
2569 out[key] = value
2569 out[key] = value
2570 return out
2570 return out
2571
2571
2572 #-------------------------------------------------------------------------
2572 #-------------------------------------------------------------------------
2573 # Things related to the running of code
2573 # Things related to the running of code
2574 #-------------------------------------------------------------------------
2574 #-------------------------------------------------------------------------
2575
2575
2576 def ex(self, cmd):
2576 def ex(self, cmd):
2577 """Execute a normal python statement in user namespace."""
2577 """Execute a normal python statement in user namespace."""
2578 with self.builtin_trap:
2578 with self.builtin_trap:
2579 exec(cmd, self.user_global_ns, self.user_ns)
2579 exec(cmd, self.user_global_ns, self.user_ns)
2580
2580
2581 def ev(self, expr):
2581 def ev(self, expr):
2582 """Evaluate python expression expr in user namespace.
2582 """Evaluate python expression expr in user namespace.
2583
2583
2584 Returns the result of evaluation
2584 Returns the result of evaluation
2585 """
2585 """
2586 with self.builtin_trap:
2586 with self.builtin_trap:
2587 return eval(expr, self.user_global_ns, self.user_ns)
2587 return eval(expr, self.user_global_ns, self.user_ns)
2588
2588
2589 def safe_execfile(self, fname, *where, **kw):
2589 def safe_execfile(self, fname, *where, **kw):
2590 """A safe version of the builtin execfile().
2590 """A safe version of the builtin execfile().
2591
2591
2592 This version will never throw an exception, but instead print
2592 This version will never throw an exception, but instead print
2593 helpful error messages to the screen. This only works on pure
2593 helpful error messages to the screen. This only works on pure
2594 Python files with the .py extension.
2594 Python files with the .py extension.
2595
2595
2596 Parameters
2596 Parameters
2597 ----------
2597 ----------
2598 fname : string
2598 fname : string
2599 The name of the file to be executed.
2599 The name of the file to be executed.
2600 where : tuple
2600 where : tuple
2601 One or two namespaces, passed to execfile() as (globals,locals).
2601 One or two namespaces, passed to execfile() as (globals,locals).
2602 If only one is given, it is passed as both.
2602 If only one is given, it is passed as both.
2603 exit_ignore : bool (False)
2603 exit_ignore : bool (False)
2604 If True, then silence SystemExit for non-zero status (it is always
2604 If True, then silence SystemExit for non-zero status (it is always
2605 silenced for zero status, as it is so common).
2605 silenced for zero status, as it is so common).
2606 raise_exceptions : bool (False)
2606 raise_exceptions : bool (False)
2607 If True raise exceptions everywhere. Meant for testing.
2607 If True raise exceptions everywhere. Meant for testing.
2608 shell_futures : bool (False)
2608 shell_futures : bool (False)
2609 If True, the code will share future statements with the interactive
2609 If True, the code will share future statements with the interactive
2610 shell. It will both be affected by previous __future__ imports, and
2610 shell. It will both be affected by previous __future__ imports, and
2611 any __future__ imports in the code will affect the shell. If False,
2611 any __future__ imports in the code will affect the shell. If False,
2612 __future__ imports are not shared in either direction.
2612 __future__ imports are not shared in either direction.
2613
2613
2614 """
2614 """
2615 kw.setdefault('exit_ignore', False)
2615 kw.setdefault('exit_ignore', False)
2616 kw.setdefault('raise_exceptions', False)
2616 kw.setdefault('raise_exceptions', False)
2617 kw.setdefault('shell_futures', False)
2617 kw.setdefault('shell_futures', False)
2618
2618
2619 fname = os.path.abspath(os.path.expanduser(fname))
2619 fname = os.path.abspath(os.path.expanduser(fname))
2620
2620
2621 # Make sure we can open the file
2621 # Make sure we can open the file
2622 try:
2622 try:
2623 with open(fname) as thefile:
2623 with open(fname) as thefile:
2624 pass
2624 pass
2625 except:
2625 except:
2626 warn('Could not open file <%s> for safe execution.' % fname)
2626 warn('Could not open file <%s> for safe execution.' % fname)
2627 return
2627 return
2628
2628
2629 # Find things also in current directory. This is needed to mimic the
2629 # Find things also in current directory. This is needed to mimic the
2630 # behavior of running a script from the system command line, where
2630 # behavior of running a script from the system command line, where
2631 # Python inserts the script's directory into sys.path
2631 # Python inserts the script's directory into sys.path
2632 dname = os.path.dirname(fname)
2632 dname = os.path.dirname(fname)
2633
2633
2634 with prepended_to_syspath(dname):
2634 with prepended_to_syspath(dname):
2635 try:
2635 try:
2636 glob, loc = (where + (None, ))[:2]
2636 glob, loc = (where + (None, ))[:2]
2637 py3compat.execfile(
2637 py3compat.execfile(
2638 fname, glob, loc,
2638 fname, glob, loc,
2639 self.compile if kw['shell_futures'] else None)
2639 self.compile if kw['shell_futures'] else None)
2640 except SystemExit as status:
2640 except SystemExit as status:
2641 # If the call was made with 0 or None exit status (sys.exit(0)
2641 # If the call was made with 0 or None exit status (sys.exit(0)
2642 # or sys.exit() ), don't bother showing a traceback, as both of
2642 # or sys.exit() ), don't bother showing a traceback, as both of
2643 # these are considered normal by the OS:
2643 # these are considered normal by the OS:
2644 # > python -c'import sys;sys.exit(0)'; echo $?
2644 # > python -c'import sys;sys.exit(0)'; echo $?
2645 # 0
2645 # 0
2646 # > python -c'import sys;sys.exit()'; echo $?
2646 # > python -c'import sys;sys.exit()'; echo $?
2647 # 0
2647 # 0
2648 # For other exit status, we show the exception unless
2648 # For other exit status, we show the exception unless
2649 # explicitly silenced, but only in short form.
2649 # explicitly silenced, but only in short form.
2650 if kw['raise_exceptions']:
2650 if kw['raise_exceptions']:
2651 raise
2651 raise
2652 if status.code and not kw['exit_ignore']:
2652 if status.code and not kw['exit_ignore']:
2653 self.showtraceback(exception_only=True)
2653 self.showtraceback(exception_only=True)
2654 except:
2654 except:
2655 if kw['raise_exceptions']:
2655 if kw['raise_exceptions']:
2656 raise
2656 raise
2657 # tb offset is 2 because we wrap execfile
2657 # tb offset is 2 because we wrap execfile
2658 self.showtraceback(tb_offset=2)
2658 self.showtraceback(tb_offset=2)
2659
2659
2660 def safe_execfile_ipy(self, fname, shell_futures=False):
2660 def safe_execfile_ipy(self, fname, shell_futures=False):
2661 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2661 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2662
2662
2663 Parameters
2663 Parameters
2664 ----------
2664 ----------
2665 fname : str
2665 fname : str
2666 The name of the file to execute. The filename must have a
2666 The name of the file to execute. The filename must have a
2667 .ipy or .ipynb extension.
2667 .ipy or .ipynb extension.
2668 shell_futures : bool (False)
2668 shell_futures : bool (False)
2669 If True, the code will share future statements with the interactive
2669 If True, the code will share future statements with the interactive
2670 shell. It will both be affected by previous __future__ imports, and
2670 shell. It will both be affected by previous __future__ imports, and
2671 any __future__ imports in the code will affect the shell. If False,
2671 any __future__ imports in the code will affect the shell. If False,
2672 __future__ imports are not shared in either direction.
2672 __future__ imports are not shared in either direction.
2673 """
2673 """
2674 fname = os.path.abspath(os.path.expanduser(fname))
2674 fname = os.path.abspath(os.path.expanduser(fname))
2675
2675
2676 # Make sure we can open the file
2676 # Make sure we can open the file
2677 try:
2677 try:
2678 with open(fname) as thefile:
2678 with open(fname) as thefile:
2679 pass
2679 pass
2680 except:
2680 except:
2681 warn('Could not open file <%s> for safe execution.' % fname)
2681 warn('Could not open file <%s> for safe execution.' % fname)
2682 return
2682 return
2683
2683
2684 # Find things also in current directory. This is needed to mimic the
2684 # Find things also in current directory. This is needed to mimic the
2685 # behavior of running a script from the system command line, where
2685 # behavior of running a script from the system command line, where
2686 # Python inserts the script's directory into sys.path
2686 # Python inserts the script's directory into sys.path
2687 dname = os.path.dirname(fname)
2687 dname = os.path.dirname(fname)
2688
2688
2689 def get_cells():
2689 def get_cells():
2690 """generator for sequence of code blocks to run"""
2690 """generator for sequence of code blocks to run"""
2691 if fname.endswith('.ipynb'):
2691 if fname.endswith('.ipynb'):
2692 from jupyter_nbformat import read
2692 from nbformat import read
2693 with io_open(fname) as f:
2693 with io_open(fname) as f:
2694 nb = read(f, as_version=4)
2694 nb = read(f, as_version=4)
2695 if not nb.cells:
2695 if not nb.cells:
2696 return
2696 return
2697 for cell in nb.cells:
2697 for cell in nb.cells:
2698 if cell.cell_type == 'code':
2698 if cell.cell_type == 'code':
2699 yield cell.source
2699 yield cell.source
2700 else:
2700 else:
2701 with open(fname) as f:
2701 with open(fname) as f:
2702 yield f.read()
2702 yield f.read()
2703
2703
2704 with prepended_to_syspath(dname):
2704 with prepended_to_syspath(dname):
2705 try:
2705 try:
2706 for cell in get_cells():
2706 for cell in get_cells():
2707 # self.run_cell currently captures all exceptions
2707 # self.run_cell currently captures all exceptions
2708 # raised in user code. It would be nice if there were
2708 # raised in user code. It would be nice if there were
2709 # versions of run_cell that did raise, so
2709 # versions of run_cell that did raise, so
2710 # we could catch the errors.
2710 # we could catch the errors.
2711 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2711 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2712 if not result.success:
2712 if not result.success:
2713 break
2713 break
2714 except:
2714 except:
2715 self.showtraceback()
2715 self.showtraceback()
2716 warn('Unknown failure executing file: <%s>' % fname)
2716 warn('Unknown failure executing file: <%s>' % fname)
2717
2717
2718 def safe_run_module(self, mod_name, where):
2718 def safe_run_module(self, mod_name, where):
2719 """A safe version of runpy.run_module().
2719 """A safe version of runpy.run_module().
2720
2720
2721 This version will never throw an exception, but instead print
2721 This version will never throw an exception, but instead print
2722 helpful error messages to the screen.
2722 helpful error messages to the screen.
2723
2723
2724 `SystemExit` exceptions with status code 0 or None are ignored.
2724 `SystemExit` exceptions with status code 0 or None are ignored.
2725
2725
2726 Parameters
2726 Parameters
2727 ----------
2727 ----------
2728 mod_name : string
2728 mod_name : string
2729 The name of the module to be executed.
2729 The name of the module to be executed.
2730 where : dict
2730 where : dict
2731 The globals namespace.
2731 The globals namespace.
2732 """
2732 """
2733 try:
2733 try:
2734 try:
2734 try:
2735 where.update(
2735 where.update(
2736 runpy.run_module(str(mod_name), run_name="__main__",
2736 runpy.run_module(str(mod_name), run_name="__main__",
2737 alter_sys=True)
2737 alter_sys=True)
2738 )
2738 )
2739 except SystemExit as status:
2739 except SystemExit as status:
2740 if status.code:
2740 if status.code:
2741 raise
2741 raise
2742 except:
2742 except:
2743 self.showtraceback()
2743 self.showtraceback()
2744 warn('Unknown failure executing module: <%s>' % mod_name)
2744 warn('Unknown failure executing module: <%s>' % mod_name)
2745
2745
2746 def _run_cached_cell_magic(self, magic_name, line):
2746 def _run_cached_cell_magic(self, magic_name, line):
2747 """Special method to call a cell magic with the data stored in self.
2747 """Special method to call a cell magic with the data stored in self.
2748 """
2748 """
2749 cell = self._current_cell_magic_body
2749 cell = self._current_cell_magic_body
2750 self._current_cell_magic_body = None
2750 self._current_cell_magic_body = None
2751 return self.run_cell_magic(magic_name, line, cell)
2751 return self.run_cell_magic(magic_name, line, cell)
2752
2752
2753 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2753 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2754 """Run a complete IPython cell.
2754 """Run a complete IPython cell.
2755
2755
2756 Parameters
2756 Parameters
2757 ----------
2757 ----------
2758 raw_cell : str
2758 raw_cell : str
2759 The code (including IPython code such as %magic functions) to run.
2759 The code (including IPython code such as %magic functions) to run.
2760 store_history : bool
2760 store_history : bool
2761 If True, the raw and translated cell will be stored in IPython's
2761 If True, the raw and translated cell will be stored in IPython's
2762 history. For user code calling back into IPython's machinery, this
2762 history. For user code calling back into IPython's machinery, this
2763 should be set to False.
2763 should be set to False.
2764 silent : bool
2764 silent : bool
2765 If True, avoid side-effects, such as implicit displayhooks and
2765 If True, avoid side-effects, such as implicit displayhooks and
2766 and logging. silent=True forces store_history=False.
2766 and logging. silent=True forces store_history=False.
2767 shell_futures : bool
2767 shell_futures : bool
2768 If True, the code will share future statements with the interactive
2768 If True, the code will share future statements with the interactive
2769 shell. It will both be affected by previous __future__ imports, and
2769 shell. It will both be affected by previous __future__ imports, and
2770 any __future__ imports in the code will affect the shell. If False,
2770 any __future__ imports in the code will affect the shell. If False,
2771 __future__ imports are not shared in either direction.
2771 __future__ imports are not shared in either direction.
2772
2772
2773 Returns
2773 Returns
2774 -------
2774 -------
2775 result : :class:`ExecutionResult`
2775 result : :class:`ExecutionResult`
2776 """
2776 """
2777 result = ExecutionResult()
2777 result = ExecutionResult()
2778
2778
2779 if (not raw_cell) or raw_cell.isspace():
2779 if (not raw_cell) or raw_cell.isspace():
2780 return result
2780 return result
2781
2781
2782 if silent:
2782 if silent:
2783 store_history = False
2783 store_history = False
2784
2784
2785 if store_history:
2785 if store_history:
2786 result.execution_count = self.execution_count
2786 result.execution_count = self.execution_count
2787
2787
2788 def error_before_exec(value):
2788 def error_before_exec(value):
2789 result.error_before_exec = value
2789 result.error_before_exec = value
2790 return result
2790 return result
2791
2791
2792 self.events.trigger('pre_execute')
2792 self.events.trigger('pre_execute')
2793 if not silent:
2793 if not silent:
2794 self.events.trigger('pre_run_cell')
2794 self.events.trigger('pre_run_cell')
2795
2795
2796 # If any of our input transformation (input_transformer_manager or
2796 # If any of our input transformation (input_transformer_manager or
2797 # prefilter_manager) raises an exception, we store it in this variable
2797 # prefilter_manager) raises an exception, we store it in this variable
2798 # so that we can display the error after logging the input and storing
2798 # so that we can display the error after logging the input and storing
2799 # it in the history.
2799 # it in the history.
2800 preprocessing_exc_tuple = None
2800 preprocessing_exc_tuple = None
2801 try:
2801 try:
2802 # Static input transformations
2802 # Static input transformations
2803 cell = self.input_transformer_manager.transform_cell(raw_cell)
2803 cell = self.input_transformer_manager.transform_cell(raw_cell)
2804 except SyntaxError:
2804 except SyntaxError:
2805 preprocessing_exc_tuple = sys.exc_info()
2805 preprocessing_exc_tuple = sys.exc_info()
2806 cell = raw_cell # cell has to exist so it can be stored/logged
2806 cell = raw_cell # cell has to exist so it can be stored/logged
2807 else:
2807 else:
2808 if len(cell.splitlines()) == 1:
2808 if len(cell.splitlines()) == 1:
2809 # Dynamic transformations - only applied for single line commands
2809 # Dynamic transformations - only applied for single line commands
2810 with self.builtin_trap:
2810 with self.builtin_trap:
2811 try:
2811 try:
2812 # use prefilter_lines to handle trailing newlines
2812 # use prefilter_lines to handle trailing newlines
2813 # restore trailing newline for ast.parse
2813 # restore trailing newline for ast.parse
2814 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2814 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2815 except Exception:
2815 except Exception:
2816 # don't allow prefilter errors to crash IPython
2816 # don't allow prefilter errors to crash IPython
2817 preprocessing_exc_tuple = sys.exc_info()
2817 preprocessing_exc_tuple = sys.exc_info()
2818
2818
2819 # Store raw and processed history
2819 # Store raw and processed history
2820 if store_history:
2820 if store_history:
2821 self.history_manager.store_inputs(self.execution_count,
2821 self.history_manager.store_inputs(self.execution_count,
2822 cell, raw_cell)
2822 cell, raw_cell)
2823 if not silent:
2823 if not silent:
2824 self.logger.log(cell, raw_cell)
2824 self.logger.log(cell, raw_cell)
2825
2825
2826 # Display the exception if input processing failed.
2826 # Display the exception if input processing failed.
2827 if preprocessing_exc_tuple is not None:
2827 if preprocessing_exc_tuple is not None:
2828 self.showtraceback(preprocessing_exc_tuple)
2828 self.showtraceback(preprocessing_exc_tuple)
2829 if store_history:
2829 if store_history:
2830 self.execution_count += 1
2830 self.execution_count += 1
2831 return error_before_exec(preprocessing_exc_tuple[2])
2831 return error_before_exec(preprocessing_exc_tuple[2])
2832
2832
2833 # Our own compiler remembers the __future__ environment. If we want to
2833 # Our own compiler remembers the __future__ environment. If we want to
2834 # run code with a separate __future__ environment, use the default
2834 # run code with a separate __future__ environment, use the default
2835 # compiler
2835 # compiler
2836 compiler = self.compile if shell_futures else CachingCompiler()
2836 compiler = self.compile if shell_futures else CachingCompiler()
2837
2837
2838 with self.builtin_trap:
2838 with self.builtin_trap:
2839 cell_name = self.compile.cache(cell, self.execution_count)
2839 cell_name = self.compile.cache(cell, self.execution_count)
2840
2840
2841 with self.display_trap:
2841 with self.display_trap:
2842 # Compile to bytecode
2842 # Compile to bytecode
2843 try:
2843 try:
2844 code_ast = compiler.ast_parse(cell, filename=cell_name)
2844 code_ast = compiler.ast_parse(cell, filename=cell_name)
2845 except IndentationError as e:
2845 except IndentationError as e:
2846 self.showindentationerror()
2846 self.showindentationerror()
2847 if store_history:
2847 if store_history:
2848 self.execution_count += 1
2848 self.execution_count += 1
2849 return error_before_exec(e)
2849 return error_before_exec(e)
2850 except (OverflowError, SyntaxError, ValueError, TypeError,
2850 except (OverflowError, SyntaxError, ValueError, TypeError,
2851 MemoryError) as e:
2851 MemoryError) as e:
2852 self.showsyntaxerror()
2852 self.showsyntaxerror()
2853 if store_history:
2853 if store_history:
2854 self.execution_count += 1
2854 self.execution_count += 1
2855 return error_before_exec(e)
2855 return error_before_exec(e)
2856
2856
2857 # Apply AST transformations
2857 # Apply AST transformations
2858 try:
2858 try:
2859 code_ast = self.transform_ast(code_ast)
2859 code_ast = self.transform_ast(code_ast)
2860 except InputRejected as e:
2860 except InputRejected as e:
2861 self.showtraceback()
2861 self.showtraceback()
2862 if store_history:
2862 if store_history:
2863 self.execution_count += 1
2863 self.execution_count += 1
2864 return error_before_exec(e)
2864 return error_before_exec(e)
2865
2865
2866 # Give the displayhook a reference to our ExecutionResult so it
2866 # Give the displayhook a reference to our ExecutionResult so it
2867 # can fill in the output value.
2867 # can fill in the output value.
2868 self.displayhook.exec_result = result
2868 self.displayhook.exec_result = result
2869
2869
2870 # Execute the user code
2870 # Execute the user code
2871 interactivity = "none" if silent else self.ast_node_interactivity
2871 interactivity = "none" if silent else self.ast_node_interactivity
2872 self.run_ast_nodes(code_ast.body, cell_name,
2872 self.run_ast_nodes(code_ast.body, cell_name,
2873 interactivity=interactivity, compiler=compiler, result=result)
2873 interactivity=interactivity, compiler=compiler, result=result)
2874
2874
2875 # Reset this so later displayed values do not modify the
2875 # Reset this so later displayed values do not modify the
2876 # ExecutionResult
2876 # ExecutionResult
2877 self.displayhook.exec_result = None
2877 self.displayhook.exec_result = None
2878
2878
2879 self.events.trigger('post_execute')
2879 self.events.trigger('post_execute')
2880 if not silent:
2880 if not silent:
2881 self.events.trigger('post_run_cell')
2881 self.events.trigger('post_run_cell')
2882
2882
2883 if store_history:
2883 if store_history:
2884 # Write output to the database. Does nothing unless
2884 # Write output to the database. Does nothing unless
2885 # history output logging is enabled.
2885 # history output logging is enabled.
2886 self.history_manager.store_output(self.execution_count)
2886 self.history_manager.store_output(self.execution_count)
2887 # Each cell is a *single* input, regardless of how many lines it has
2887 # Each cell is a *single* input, regardless of how many lines it has
2888 self.execution_count += 1
2888 self.execution_count += 1
2889
2889
2890 return result
2890 return result
2891
2891
2892 def transform_ast(self, node):
2892 def transform_ast(self, node):
2893 """Apply the AST transformations from self.ast_transformers
2893 """Apply the AST transformations from self.ast_transformers
2894
2894
2895 Parameters
2895 Parameters
2896 ----------
2896 ----------
2897 node : ast.Node
2897 node : ast.Node
2898 The root node to be transformed. Typically called with the ast.Module
2898 The root node to be transformed. Typically called with the ast.Module
2899 produced by parsing user input.
2899 produced by parsing user input.
2900
2900
2901 Returns
2901 Returns
2902 -------
2902 -------
2903 An ast.Node corresponding to the node it was called with. Note that it
2903 An ast.Node corresponding to the node it was called with. Note that it
2904 may also modify the passed object, so don't rely on references to the
2904 may also modify the passed object, so don't rely on references to the
2905 original AST.
2905 original AST.
2906 """
2906 """
2907 for transformer in self.ast_transformers:
2907 for transformer in self.ast_transformers:
2908 try:
2908 try:
2909 node = transformer.visit(node)
2909 node = transformer.visit(node)
2910 except InputRejected:
2910 except InputRejected:
2911 # User-supplied AST transformers can reject an input by raising
2911 # User-supplied AST transformers can reject an input by raising
2912 # an InputRejected. Short-circuit in this case so that we
2912 # an InputRejected. Short-circuit in this case so that we
2913 # don't unregister the transform.
2913 # don't unregister the transform.
2914 raise
2914 raise
2915 except Exception:
2915 except Exception:
2916 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2916 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2917 self.ast_transformers.remove(transformer)
2917 self.ast_transformers.remove(transformer)
2918
2918
2919 if self.ast_transformers:
2919 if self.ast_transformers:
2920 ast.fix_missing_locations(node)
2920 ast.fix_missing_locations(node)
2921 return node
2921 return node
2922
2922
2923
2923
2924 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2924 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2925 compiler=compile, result=None):
2925 compiler=compile, result=None):
2926 """Run a sequence of AST nodes. The execution mode depends on the
2926 """Run a sequence of AST nodes. The execution mode depends on the
2927 interactivity parameter.
2927 interactivity parameter.
2928
2928
2929 Parameters
2929 Parameters
2930 ----------
2930 ----------
2931 nodelist : list
2931 nodelist : list
2932 A sequence of AST nodes to run.
2932 A sequence of AST nodes to run.
2933 cell_name : str
2933 cell_name : str
2934 Will be passed to the compiler as the filename of the cell. Typically
2934 Will be passed to the compiler as the filename of the cell. Typically
2935 the value returned by ip.compile.cache(cell).
2935 the value returned by ip.compile.cache(cell).
2936 interactivity : str
2936 interactivity : str
2937 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2937 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2938 run interactively (displaying output from expressions). 'last_expr'
2938 run interactively (displaying output from expressions). 'last_expr'
2939 will run the last node interactively only if it is an expression (i.e.
2939 will run the last node interactively only if it is an expression (i.e.
2940 expressions in loops or other blocks are not displayed. Other values
2940 expressions in loops or other blocks are not displayed. Other values
2941 for this parameter will raise a ValueError.
2941 for this parameter will raise a ValueError.
2942 compiler : callable
2942 compiler : callable
2943 A function with the same interface as the built-in compile(), to turn
2943 A function with the same interface as the built-in compile(), to turn
2944 the AST nodes into code objects. Default is the built-in compile().
2944 the AST nodes into code objects. Default is the built-in compile().
2945 result : ExecutionResult, optional
2945 result : ExecutionResult, optional
2946 An object to store exceptions that occur during execution.
2946 An object to store exceptions that occur during execution.
2947
2947
2948 Returns
2948 Returns
2949 -------
2949 -------
2950 True if an exception occurred while running code, False if it finished
2950 True if an exception occurred while running code, False if it finished
2951 running.
2951 running.
2952 """
2952 """
2953 if not nodelist:
2953 if not nodelist:
2954 return
2954 return
2955
2955
2956 if interactivity == 'last_expr':
2956 if interactivity == 'last_expr':
2957 if isinstance(nodelist[-1], ast.Expr):
2957 if isinstance(nodelist[-1], ast.Expr):
2958 interactivity = "last"
2958 interactivity = "last"
2959 else:
2959 else:
2960 interactivity = "none"
2960 interactivity = "none"
2961
2961
2962 if interactivity == 'none':
2962 if interactivity == 'none':
2963 to_run_exec, to_run_interactive = nodelist, []
2963 to_run_exec, to_run_interactive = nodelist, []
2964 elif interactivity == 'last':
2964 elif interactivity == 'last':
2965 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2965 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2966 elif interactivity == 'all':
2966 elif interactivity == 'all':
2967 to_run_exec, to_run_interactive = [], nodelist
2967 to_run_exec, to_run_interactive = [], nodelist
2968 else:
2968 else:
2969 raise ValueError("Interactivity was %r" % interactivity)
2969 raise ValueError("Interactivity was %r" % interactivity)
2970
2970
2971 exec_count = self.execution_count
2971 exec_count = self.execution_count
2972
2972
2973 try:
2973 try:
2974 for i, node in enumerate(to_run_exec):
2974 for i, node in enumerate(to_run_exec):
2975 mod = ast.Module([node])
2975 mod = ast.Module([node])
2976 code = compiler(mod, cell_name, "exec")
2976 code = compiler(mod, cell_name, "exec")
2977 if self.run_code(code, result):
2977 if self.run_code(code, result):
2978 return True
2978 return True
2979
2979
2980 for i, node in enumerate(to_run_interactive):
2980 for i, node in enumerate(to_run_interactive):
2981 mod = ast.Interactive([node])
2981 mod = ast.Interactive([node])
2982 code = compiler(mod, cell_name, "single")
2982 code = compiler(mod, cell_name, "single")
2983 if self.run_code(code, result):
2983 if self.run_code(code, result):
2984 return True
2984 return True
2985
2985
2986 # Flush softspace
2986 # Flush softspace
2987 if softspace(sys.stdout, 0):
2987 if softspace(sys.stdout, 0):
2988 print()
2988 print()
2989
2989
2990 except:
2990 except:
2991 # It's possible to have exceptions raised here, typically by
2991 # It's possible to have exceptions raised here, typically by
2992 # compilation of odd code (such as a naked 'return' outside a
2992 # compilation of odd code (such as a naked 'return' outside a
2993 # function) that did parse but isn't valid. Typically the exception
2993 # function) that did parse but isn't valid. Typically the exception
2994 # is a SyntaxError, but it's safest just to catch anything and show
2994 # is a SyntaxError, but it's safest just to catch anything and show
2995 # the user a traceback.
2995 # the user a traceback.
2996
2996
2997 # We do only one try/except outside the loop to minimize the impact
2997 # We do only one try/except outside the loop to minimize the impact
2998 # on runtime, and also because if any node in the node list is
2998 # on runtime, and also because if any node in the node list is
2999 # broken, we should stop execution completely.
2999 # broken, we should stop execution completely.
3000 if result:
3000 if result:
3001 result.error_before_exec = sys.exc_info()[1]
3001 result.error_before_exec = sys.exc_info()[1]
3002 self.showtraceback()
3002 self.showtraceback()
3003 return True
3003 return True
3004
3004
3005 return False
3005 return False
3006
3006
3007 def run_code(self, code_obj, result=None):
3007 def run_code(self, code_obj, result=None):
3008 """Execute a code object.
3008 """Execute a code object.
3009
3009
3010 When an exception occurs, self.showtraceback() is called to display a
3010 When an exception occurs, self.showtraceback() is called to display a
3011 traceback.
3011 traceback.
3012
3012
3013 Parameters
3013 Parameters
3014 ----------
3014 ----------
3015 code_obj : code object
3015 code_obj : code object
3016 A compiled code object, to be executed
3016 A compiled code object, to be executed
3017 result : ExecutionResult, optional
3017 result : ExecutionResult, optional
3018 An object to store exceptions that occur during execution.
3018 An object to store exceptions that occur during execution.
3019
3019
3020 Returns
3020 Returns
3021 -------
3021 -------
3022 False : successful execution.
3022 False : successful execution.
3023 True : an error occurred.
3023 True : an error occurred.
3024 """
3024 """
3025 # Set our own excepthook in case the user code tries to call it
3025 # Set our own excepthook in case the user code tries to call it
3026 # directly, so that the IPython crash handler doesn't get triggered
3026 # directly, so that the IPython crash handler doesn't get triggered
3027 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3027 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3028
3028
3029 # we save the original sys.excepthook in the instance, in case config
3029 # we save the original sys.excepthook in the instance, in case config
3030 # code (such as magics) needs access to it.
3030 # code (such as magics) needs access to it.
3031 self.sys_excepthook = old_excepthook
3031 self.sys_excepthook = old_excepthook
3032 outflag = 1 # happens in more places, so it's easier as default
3032 outflag = 1 # happens in more places, so it's easier as default
3033 try:
3033 try:
3034 try:
3034 try:
3035 self.hooks.pre_run_code_hook()
3035 self.hooks.pre_run_code_hook()
3036 #rprint('Running code', repr(code_obj)) # dbg
3036 #rprint('Running code', repr(code_obj)) # dbg
3037 exec(code_obj, self.user_global_ns, self.user_ns)
3037 exec(code_obj, self.user_global_ns, self.user_ns)
3038 finally:
3038 finally:
3039 # Reset our crash handler in place
3039 # Reset our crash handler in place
3040 sys.excepthook = old_excepthook
3040 sys.excepthook = old_excepthook
3041 except SystemExit as e:
3041 except SystemExit as e:
3042 if result is not None:
3042 if result is not None:
3043 result.error_in_exec = e
3043 result.error_in_exec = e
3044 self.showtraceback(exception_only=True)
3044 self.showtraceback(exception_only=True)
3045 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
3045 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
3046 except self.custom_exceptions:
3046 except self.custom_exceptions:
3047 etype, value, tb = sys.exc_info()
3047 etype, value, tb = sys.exc_info()
3048 if result is not None:
3048 if result is not None:
3049 result.error_in_exec = value
3049 result.error_in_exec = value
3050 self.CustomTB(etype, value, tb)
3050 self.CustomTB(etype, value, tb)
3051 except:
3051 except:
3052 if result is not None:
3052 if result is not None:
3053 result.error_in_exec = sys.exc_info()[1]
3053 result.error_in_exec = sys.exc_info()[1]
3054 self.showtraceback()
3054 self.showtraceback()
3055 else:
3055 else:
3056 outflag = 0
3056 outflag = 0
3057 return outflag
3057 return outflag
3058
3058
3059 # For backwards compatibility
3059 # For backwards compatibility
3060 runcode = run_code
3060 runcode = run_code
3061
3061
3062 #-------------------------------------------------------------------------
3062 #-------------------------------------------------------------------------
3063 # Things related to GUI support and pylab
3063 # Things related to GUI support and pylab
3064 #-------------------------------------------------------------------------
3064 #-------------------------------------------------------------------------
3065
3065
3066 def enable_gui(self, gui=None):
3066 def enable_gui(self, gui=None):
3067 raise NotImplementedError('Implement enable_gui in a subclass')
3067 raise NotImplementedError('Implement enable_gui in a subclass')
3068
3068
3069 def enable_matplotlib(self, gui=None):
3069 def enable_matplotlib(self, gui=None):
3070 """Enable interactive matplotlib and inline figure support.
3070 """Enable interactive matplotlib and inline figure support.
3071
3071
3072 This takes the following steps:
3072 This takes the following steps:
3073
3073
3074 1. select the appropriate eventloop and matplotlib backend
3074 1. select the appropriate eventloop and matplotlib backend
3075 2. set up matplotlib for interactive use with that backend
3075 2. set up matplotlib for interactive use with that backend
3076 3. configure formatters for inline figure display
3076 3. configure formatters for inline figure display
3077 4. enable the selected gui eventloop
3077 4. enable the selected gui eventloop
3078
3078
3079 Parameters
3079 Parameters
3080 ----------
3080 ----------
3081 gui : optional, string
3081 gui : optional, string
3082 If given, dictates the choice of matplotlib GUI backend to use
3082 If given, dictates the choice of matplotlib GUI backend to use
3083 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3083 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3084 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3084 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3085 matplotlib (as dictated by the matplotlib build-time options plus the
3085 matplotlib (as dictated by the matplotlib build-time options plus the
3086 user's matplotlibrc configuration file). Note that not all backends
3086 user's matplotlibrc configuration file). Note that not all backends
3087 make sense in all contexts, for example a terminal ipython can't
3087 make sense in all contexts, for example a terminal ipython can't
3088 display figures inline.
3088 display figures inline.
3089 """
3089 """
3090 from IPython.core import pylabtools as pt
3090 from IPython.core import pylabtools as pt
3091 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3091 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3092
3092
3093 if gui != 'inline':
3093 if gui != 'inline':
3094 # If we have our first gui selection, store it
3094 # If we have our first gui selection, store it
3095 if self.pylab_gui_select is None:
3095 if self.pylab_gui_select is None:
3096 self.pylab_gui_select = gui
3096 self.pylab_gui_select = gui
3097 # Otherwise if they are different
3097 # Otherwise if they are different
3098 elif gui != self.pylab_gui_select:
3098 elif gui != self.pylab_gui_select:
3099 print ('Warning: Cannot change to a different GUI toolkit: %s.'
3099 print ('Warning: Cannot change to a different GUI toolkit: %s.'
3100 ' Using %s instead.' % (gui, self.pylab_gui_select))
3100 ' Using %s instead.' % (gui, self.pylab_gui_select))
3101 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3101 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3102
3102
3103 pt.activate_matplotlib(backend)
3103 pt.activate_matplotlib(backend)
3104 pt.configure_inline_support(self, backend)
3104 pt.configure_inline_support(self, backend)
3105
3105
3106 # Now we must activate the gui pylab wants to use, and fix %run to take
3106 # Now we must activate the gui pylab wants to use, and fix %run to take
3107 # plot updates into account
3107 # plot updates into account
3108 self.enable_gui(gui)
3108 self.enable_gui(gui)
3109 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3109 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3110 pt.mpl_runner(self.safe_execfile)
3110 pt.mpl_runner(self.safe_execfile)
3111
3111
3112 return gui, backend
3112 return gui, backend
3113
3113
3114 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3114 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3115 """Activate pylab support at runtime.
3115 """Activate pylab support at runtime.
3116
3116
3117 This turns on support for matplotlib, preloads into the interactive
3117 This turns on support for matplotlib, preloads into the interactive
3118 namespace all of numpy and pylab, and configures IPython to correctly
3118 namespace all of numpy and pylab, and configures IPython to correctly
3119 interact with the GUI event loop. The GUI backend to be used can be
3119 interact with the GUI event loop. The GUI backend to be used can be
3120 optionally selected with the optional ``gui`` argument.
3120 optionally selected with the optional ``gui`` argument.
3121
3121
3122 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3122 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3123
3123
3124 Parameters
3124 Parameters
3125 ----------
3125 ----------
3126 gui : optional, string
3126 gui : optional, string
3127 If given, dictates the choice of matplotlib GUI backend to use
3127 If given, dictates the choice of matplotlib GUI backend to use
3128 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3128 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3129 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3129 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3130 matplotlib (as dictated by the matplotlib build-time options plus the
3130 matplotlib (as dictated by the matplotlib build-time options plus the
3131 user's matplotlibrc configuration file). Note that not all backends
3131 user's matplotlibrc configuration file). Note that not all backends
3132 make sense in all contexts, for example a terminal ipython can't
3132 make sense in all contexts, for example a terminal ipython can't
3133 display figures inline.
3133 display figures inline.
3134 import_all : optional, bool, default: True
3134 import_all : optional, bool, default: True
3135 Whether to do `from numpy import *` and `from pylab import *`
3135 Whether to do `from numpy import *` and `from pylab import *`
3136 in addition to module imports.
3136 in addition to module imports.
3137 welcome_message : deprecated
3137 welcome_message : deprecated
3138 This argument is ignored, no welcome message will be displayed.
3138 This argument is ignored, no welcome message will be displayed.
3139 """
3139 """
3140 from IPython.core.pylabtools import import_pylab
3140 from IPython.core.pylabtools import import_pylab
3141
3141
3142 gui, backend = self.enable_matplotlib(gui)
3142 gui, backend = self.enable_matplotlib(gui)
3143
3143
3144 # We want to prevent the loading of pylab to pollute the user's
3144 # We want to prevent the loading of pylab to pollute the user's
3145 # namespace as shown by the %who* magics, so we execute the activation
3145 # namespace as shown by the %who* magics, so we execute the activation
3146 # code in an empty namespace, and we update *both* user_ns and
3146 # code in an empty namespace, and we update *both* user_ns and
3147 # user_ns_hidden with this information.
3147 # user_ns_hidden with this information.
3148 ns = {}
3148 ns = {}
3149 import_pylab(ns, import_all)
3149 import_pylab(ns, import_all)
3150 # warn about clobbered names
3150 # warn about clobbered names
3151 ignored = set(["__builtins__"])
3151 ignored = set(["__builtins__"])
3152 both = set(ns).intersection(self.user_ns).difference(ignored)
3152 both = set(ns).intersection(self.user_ns).difference(ignored)
3153 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3153 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3154 self.user_ns.update(ns)
3154 self.user_ns.update(ns)
3155 self.user_ns_hidden.update(ns)
3155 self.user_ns_hidden.update(ns)
3156 return gui, backend, clobbered
3156 return gui, backend, clobbered
3157
3157
3158 #-------------------------------------------------------------------------
3158 #-------------------------------------------------------------------------
3159 # Utilities
3159 # Utilities
3160 #-------------------------------------------------------------------------
3160 #-------------------------------------------------------------------------
3161
3161
3162 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3162 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3163 """Expand python variables in a string.
3163 """Expand python variables in a string.
3164
3164
3165 The depth argument indicates how many frames above the caller should
3165 The depth argument indicates how many frames above the caller should
3166 be walked to look for the local namespace where to expand variables.
3166 be walked to look for the local namespace where to expand variables.
3167
3167
3168 The global namespace for expansion is always the user's interactive
3168 The global namespace for expansion is always the user's interactive
3169 namespace.
3169 namespace.
3170 """
3170 """
3171 ns = self.user_ns.copy()
3171 ns = self.user_ns.copy()
3172 try:
3172 try:
3173 frame = sys._getframe(depth+1)
3173 frame = sys._getframe(depth+1)
3174 except ValueError:
3174 except ValueError:
3175 # This is thrown if there aren't that many frames on the stack,
3175 # This is thrown if there aren't that many frames on the stack,
3176 # e.g. if a script called run_line_magic() directly.
3176 # e.g. if a script called run_line_magic() directly.
3177 pass
3177 pass
3178 else:
3178 else:
3179 ns.update(frame.f_locals)
3179 ns.update(frame.f_locals)
3180
3180
3181 try:
3181 try:
3182 # We have to use .vformat() here, because 'self' is a valid and common
3182 # We have to use .vformat() here, because 'self' is a valid and common
3183 # name, and expanding **ns for .format() would make it collide with
3183 # name, and expanding **ns for .format() would make it collide with
3184 # the 'self' argument of the method.
3184 # the 'self' argument of the method.
3185 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3185 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3186 except Exception:
3186 except Exception:
3187 # if formatter couldn't format, just let it go untransformed
3187 # if formatter couldn't format, just let it go untransformed
3188 pass
3188 pass
3189 return cmd
3189 return cmd
3190
3190
3191 def mktempfile(self, data=None, prefix='ipython_edit_'):
3191 def mktempfile(self, data=None, prefix='ipython_edit_'):
3192 """Make a new tempfile and return its filename.
3192 """Make a new tempfile and return its filename.
3193
3193
3194 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3194 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3195 but it registers the created filename internally so ipython cleans it up
3195 but it registers the created filename internally so ipython cleans it up
3196 at exit time.
3196 at exit time.
3197
3197
3198 Optional inputs:
3198 Optional inputs:
3199
3199
3200 - data(None): if data is given, it gets written out to the temp file
3200 - data(None): if data is given, it gets written out to the temp file
3201 immediately, and the file is closed again."""
3201 immediately, and the file is closed again."""
3202
3202
3203 dirname = tempfile.mkdtemp(prefix=prefix)
3203 dirname = tempfile.mkdtemp(prefix=prefix)
3204 self.tempdirs.append(dirname)
3204 self.tempdirs.append(dirname)
3205
3205
3206 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3206 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3207 os.close(handle) # On Windows, there can only be one open handle on a file
3207 os.close(handle) # On Windows, there can only be one open handle on a file
3208 self.tempfiles.append(filename)
3208 self.tempfiles.append(filename)
3209
3209
3210 if data:
3210 if data:
3211 tmp_file = open(filename,'w')
3211 tmp_file = open(filename,'w')
3212 tmp_file.write(data)
3212 tmp_file.write(data)
3213 tmp_file.close()
3213 tmp_file.close()
3214 return filename
3214 return filename
3215
3215
3216 # TODO: This should be removed when Term is refactored.
3216 # TODO: This should be removed when Term is refactored.
3217 def write(self,data):
3217 def write(self,data):
3218 """Write a string to the default output"""
3218 """Write a string to the default output"""
3219 io.stdout.write(data)
3219 io.stdout.write(data)
3220
3220
3221 # TODO: This should be removed when Term is refactored.
3221 # TODO: This should be removed when Term is refactored.
3222 def write_err(self,data):
3222 def write_err(self,data):
3223 """Write a string to the default error output"""
3223 """Write a string to the default error output"""
3224 io.stderr.write(data)
3224 io.stderr.write(data)
3225
3225
3226 def ask_yes_no(self, prompt, default=None):
3226 def ask_yes_no(self, prompt, default=None):
3227 if self.quiet:
3227 if self.quiet:
3228 return True
3228 return True
3229 return ask_yes_no(prompt,default)
3229 return ask_yes_no(prompt,default)
3230
3230
3231 def show_usage(self):
3231 def show_usage(self):
3232 """Show a usage message"""
3232 """Show a usage message"""
3233 page.page(IPython.core.usage.interactive_usage)
3233 page.page(IPython.core.usage.interactive_usage)
3234
3234
3235 def extract_input_lines(self, range_str, raw=False):
3235 def extract_input_lines(self, range_str, raw=False):
3236 """Return as a string a set of input history slices.
3236 """Return as a string a set of input history slices.
3237
3237
3238 Parameters
3238 Parameters
3239 ----------
3239 ----------
3240 range_str : string
3240 range_str : string
3241 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3241 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3242 since this function is for use by magic functions which get their
3242 since this function is for use by magic functions which get their
3243 arguments as strings. The number before the / is the session
3243 arguments as strings. The number before the / is the session
3244 number: ~n goes n back from the current session.
3244 number: ~n goes n back from the current session.
3245
3245
3246 raw : bool, optional
3246 raw : bool, optional
3247 By default, the processed input is used. If this is true, the raw
3247 By default, the processed input is used. If this is true, the raw
3248 input history is used instead.
3248 input history is used instead.
3249
3249
3250 Notes
3250 Notes
3251 -----
3251 -----
3252
3252
3253 Slices can be described with two notations:
3253 Slices can be described with two notations:
3254
3254
3255 * ``N:M`` -> standard python form, means including items N...(M-1).
3255 * ``N:M`` -> standard python form, means including items N...(M-1).
3256 * ``N-M`` -> include items N..M (closed endpoint).
3256 * ``N-M`` -> include items N..M (closed endpoint).
3257 """
3257 """
3258 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3258 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3259 return "\n".join(x for _, _, x in lines)
3259 return "\n".join(x for _, _, x in lines)
3260
3260
3261 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3261 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3262 """Get a code string from history, file, url, or a string or macro.
3262 """Get a code string from history, file, url, or a string or macro.
3263
3263
3264 This is mainly used by magic functions.
3264 This is mainly used by magic functions.
3265
3265
3266 Parameters
3266 Parameters
3267 ----------
3267 ----------
3268
3268
3269 target : str
3269 target : str
3270
3270
3271 A string specifying code to retrieve. This will be tried respectively
3271 A string specifying code to retrieve. This will be tried respectively
3272 as: ranges of input history (see %history for syntax), url,
3272 as: ranges of input history (see %history for syntax), url,
3273 correspnding .py file, filename, or an expression evaluating to a
3273 correspnding .py file, filename, or an expression evaluating to a
3274 string or Macro in the user namespace.
3274 string or Macro in the user namespace.
3275
3275
3276 raw : bool
3276 raw : bool
3277 If true (default), retrieve raw history. Has no effect on the other
3277 If true (default), retrieve raw history. Has no effect on the other
3278 retrieval mechanisms.
3278 retrieval mechanisms.
3279
3279
3280 py_only : bool (default False)
3280 py_only : bool (default False)
3281 Only try to fetch python code, do not try alternative methods to decode file
3281 Only try to fetch python code, do not try alternative methods to decode file
3282 if unicode fails.
3282 if unicode fails.
3283
3283
3284 Returns
3284 Returns
3285 -------
3285 -------
3286 A string of code.
3286 A string of code.
3287
3287
3288 ValueError is raised if nothing is found, and TypeError if it evaluates
3288 ValueError is raised if nothing is found, and TypeError if it evaluates
3289 to an object of another type. In each case, .args[0] is a printable
3289 to an object of another type. In each case, .args[0] is a printable
3290 message.
3290 message.
3291 """
3291 """
3292 code = self.extract_input_lines(target, raw=raw) # Grab history
3292 code = self.extract_input_lines(target, raw=raw) # Grab history
3293 if code:
3293 if code:
3294 return code
3294 return code
3295 utarget = unquote_filename(target)
3295 utarget = unquote_filename(target)
3296 try:
3296 try:
3297 if utarget.startswith(('http://', 'https://')):
3297 if utarget.startswith(('http://', 'https://')):
3298 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3298 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3299 except UnicodeDecodeError:
3299 except UnicodeDecodeError:
3300 if not py_only :
3300 if not py_only :
3301 # Deferred import
3301 # Deferred import
3302 try:
3302 try:
3303 from urllib.request import urlopen # Py3
3303 from urllib.request import urlopen # Py3
3304 except ImportError:
3304 except ImportError:
3305 from urllib import urlopen
3305 from urllib import urlopen
3306 response = urlopen(target)
3306 response = urlopen(target)
3307 return response.read().decode('latin1')
3307 return response.read().decode('latin1')
3308 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3308 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3309
3309
3310 potential_target = [target]
3310 potential_target = [target]
3311 try :
3311 try :
3312 potential_target.insert(0,get_py_filename(target))
3312 potential_target.insert(0,get_py_filename(target))
3313 except IOError:
3313 except IOError:
3314 pass
3314 pass
3315
3315
3316 for tgt in potential_target :
3316 for tgt in potential_target :
3317 if os.path.isfile(tgt): # Read file
3317 if os.path.isfile(tgt): # Read file
3318 try :
3318 try :
3319 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3319 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3320 except UnicodeDecodeError :
3320 except UnicodeDecodeError :
3321 if not py_only :
3321 if not py_only :
3322 with io_open(tgt,'r', encoding='latin1') as f :
3322 with io_open(tgt,'r', encoding='latin1') as f :
3323 return f.read()
3323 return f.read()
3324 raise ValueError(("'%s' seem to be unreadable.") % target)
3324 raise ValueError(("'%s' seem to be unreadable.") % target)
3325 elif os.path.isdir(os.path.expanduser(tgt)):
3325 elif os.path.isdir(os.path.expanduser(tgt)):
3326 raise ValueError("'%s' is a directory, not a regular file." % target)
3326 raise ValueError("'%s' is a directory, not a regular file." % target)
3327
3327
3328 if search_ns:
3328 if search_ns:
3329 # Inspect namespace to load object source
3329 # Inspect namespace to load object source
3330 object_info = self.object_inspect(target, detail_level=1)
3330 object_info = self.object_inspect(target, detail_level=1)
3331 if object_info['found'] and object_info['source']:
3331 if object_info['found'] and object_info['source']:
3332 return object_info['source']
3332 return object_info['source']
3333
3333
3334 try: # User namespace
3334 try: # User namespace
3335 codeobj = eval(target, self.user_ns)
3335 codeobj = eval(target, self.user_ns)
3336 except Exception:
3336 except Exception:
3337 raise ValueError(("'%s' was not found in history, as a file, url, "
3337 raise ValueError(("'%s' was not found in history, as a file, url, "
3338 "nor in the user namespace.") % target)
3338 "nor in the user namespace.") % target)
3339
3339
3340 if isinstance(codeobj, string_types):
3340 if isinstance(codeobj, string_types):
3341 return codeobj
3341 return codeobj
3342 elif isinstance(codeobj, Macro):
3342 elif isinstance(codeobj, Macro):
3343 return codeobj.value
3343 return codeobj.value
3344
3344
3345 raise TypeError("%s is neither a string nor a macro." % target,
3345 raise TypeError("%s is neither a string nor a macro." % target,
3346 codeobj)
3346 codeobj)
3347
3347
3348 #-------------------------------------------------------------------------
3348 #-------------------------------------------------------------------------
3349 # Things related to IPython exiting
3349 # Things related to IPython exiting
3350 #-------------------------------------------------------------------------
3350 #-------------------------------------------------------------------------
3351 def atexit_operations(self):
3351 def atexit_operations(self):
3352 """This will be executed at the time of exit.
3352 """This will be executed at the time of exit.
3353
3353
3354 Cleanup operations and saving of persistent data that is done
3354 Cleanup operations and saving of persistent data that is done
3355 unconditionally by IPython should be performed here.
3355 unconditionally by IPython should be performed here.
3356
3356
3357 For things that may depend on startup flags or platform specifics (such
3357 For things that may depend on startup flags or platform specifics (such
3358 as having readline or not), register a separate atexit function in the
3358 as having readline or not), register a separate atexit function in the
3359 code that has the appropriate information, rather than trying to
3359 code that has the appropriate information, rather than trying to
3360 clutter
3360 clutter
3361 """
3361 """
3362 # Close the history session (this stores the end time and line count)
3362 # Close the history session (this stores the end time and line count)
3363 # this must be *before* the tempfile cleanup, in case of temporary
3363 # this must be *before* the tempfile cleanup, in case of temporary
3364 # history db
3364 # history db
3365 self.history_manager.end_session()
3365 self.history_manager.end_session()
3366
3366
3367 # Cleanup all tempfiles and folders left around
3367 # Cleanup all tempfiles and folders left around
3368 for tfile in self.tempfiles:
3368 for tfile in self.tempfiles:
3369 try:
3369 try:
3370 os.unlink(tfile)
3370 os.unlink(tfile)
3371 except OSError:
3371 except OSError:
3372 pass
3372 pass
3373
3373
3374 for tdir in self.tempdirs:
3374 for tdir in self.tempdirs:
3375 try:
3375 try:
3376 os.rmdir(tdir)
3376 os.rmdir(tdir)
3377 except OSError:
3377 except OSError:
3378 pass
3378 pass
3379
3379
3380 # Clear all user namespaces to release all references cleanly.
3380 # Clear all user namespaces to release all references cleanly.
3381 self.reset(new_session=False)
3381 self.reset(new_session=False)
3382
3382
3383 # Run user hooks
3383 # Run user hooks
3384 self.hooks.shutdown_hook()
3384 self.hooks.shutdown_hook()
3385
3385
3386 def cleanup(self):
3386 def cleanup(self):
3387 self.restore_sys_module_state()
3387 self.restore_sys_module_state()
3388
3388
3389
3389
3390 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3390 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3391 """An abstract base class for InteractiveShell."""
3391 """An abstract base class for InteractiveShell."""
3392
3392
3393 InteractiveShellABC.register(InteractiveShell)
3393 InteractiveShellABC.register(InteractiveShell)
@@ -1,613 +1,613 b''
1 """Implementation of basic magic functions."""
1 """Implementation of basic magic functions."""
2
2
3 from __future__ import print_function
3 from __future__ import print_function
4
4
5 import io
5 import io
6 import json
6 import json
7 import sys
7 import sys
8 from pprint import pformat
8 from pprint import pformat
9
9
10 from IPython.core import magic_arguments, page
10 from IPython.core import magic_arguments, page
11 from IPython.core.error import UsageError
11 from IPython.core.error import UsageError
12 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
12 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
13 from IPython.utils.text import format_screen, dedent, indent
13 from IPython.utils.text import format_screen, dedent, indent
14 from IPython.testing.skipdoctest import skip_doctest
14 from IPython.testing.skipdoctest import skip_doctest
15 from IPython.utils.ipstruct import Struct
15 from IPython.utils.ipstruct import Struct
16 from IPython.utils.path import unquote_filename
16 from IPython.utils.path import unquote_filename
17 from IPython.utils.py3compat import unicode_type
17 from IPython.utils.py3compat import unicode_type
18 from IPython.utils.warn import warn, error
18 from IPython.utils.warn import warn, error
19
19
20
20
21 class MagicsDisplay(object):
21 class MagicsDisplay(object):
22 def __init__(self, magics_manager):
22 def __init__(self, magics_manager):
23 self.magics_manager = magics_manager
23 self.magics_manager = magics_manager
24
24
25 def _lsmagic(self):
25 def _lsmagic(self):
26 """The main implementation of the %lsmagic"""
26 """The main implementation of the %lsmagic"""
27 mesc = magic_escapes['line']
27 mesc = magic_escapes['line']
28 cesc = magic_escapes['cell']
28 cesc = magic_escapes['cell']
29 mman = self.magics_manager
29 mman = self.magics_manager
30 magics = mman.lsmagic()
30 magics = mman.lsmagic()
31 out = ['Available line magics:',
31 out = ['Available line magics:',
32 mesc + (' '+mesc).join(sorted(magics['line'])),
32 mesc + (' '+mesc).join(sorted(magics['line'])),
33 '',
33 '',
34 'Available cell magics:',
34 'Available cell magics:',
35 cesc + (' '+cesc).join(sorted(magics['cell'])),
35 cesc + (' '+cesc).join(sorted(magics['cell'])),
36 '',
36 '',
37 mman.auto_status()]
37 mman.auto_status()]
38 return '\n'.join(out)
38 return '\n'.join(out)
39
39
40 def _repr_pretty_(self, p, cycle):
40 def _repr_pretty_(self, p, cycle):
41 p.text(self._lsmagic())
41 p.text(self._lsmagic())
42
42
43 def __str__(self):
43 def __str__(self):
44 return self._lsmagic()
44 return self._lsmagic()
45
45
46 def _jsonable(self):
46 def _jsonable(self):
47 """turn magics dict into jsonable dict of the same structure
47 """turn magics dict into jsonable dict of the same structure
48
48
49 replaces object instances with their class names as strings
49 replaces object instances with their class names as strings
50 """
50 """
51 magic_dict = {}
51 magic_dict = {}
52 mman = self.magics_manager
52 mman = self.magics_manager
53 magics = mman.lsmagic()
53 magics = mman.lsmagic()
54 for key, subdict in magics.items():
54 for key, subdict in magics.items():
55 d = {}
55 d = {}
56 magic_dict[key] = d
56 magic_dict[key] = d
57 for name, obj in subdict.items():
57 for name, obj in subdict.items():
58 try:
58 try:
59 classname = obj.__self__.__class__.__name__
59 classname = obj.__self__.__class__.__name__
60 except AttributeError:
60 except AttributeError:
61 classname = 'Other'
61 classname = 'Other'
62
62
63 d[name] = classname
63 d[name] = classname
64 return magic_dict
64 return magic_dict
65
65
66 def _repr_json_(self):
66 def _repr_json_(self):
67 return self._jsonable()
67 return self._jsonable()
68
68
69
69
70 @magics_class
70 @magics_class
71 class BasicMagics(Magics):
71 class BasicMagics(Magics):
72 """Magics that provide central IPython functionality.
72 """Magics that provide central IPython functionality.
73
73
74 These are various magics that don't fit into specific categories but that
74 These are various magics that don't fit into specific categories but that
75 are all part of the base 'IPython experience'."""
75 are all part of the base 'IPython experience'."""
76
76
77 @magic_arguments.magic_arguments()
77 @magic_arguments.magic_arguments()
78 @magic_arguments.argument(
78 @magic_arguments.argument(
79 '-l', '--line', action='store_true',
79 '-l', '--line', action='store_true',
80 help="""Create a line magic alias."""
80 help="""Create a line magic alias."""
81 )
81 )
82 @magic_arguments.argument(
82 @magic_arguments.argument(
83 '-c', '--cell', action='store_true',
83 '-c', '--cell', action='store_true',
84 help="""Create a cell magic alias."""
84 help="""Create a cell magic alias."""
85 )
85 )
86 @magic_arguments.argument(
86 @magic_arguments.argument(
87 'name',
87 'name',
88 help="""Name of the magic to be created."""
88 help="""Name of the magic to be created."""
89 )
89 )
90 @magic_arguments.argument(
90 @magic_arguments.argument(
91 'target',
91 'target',
92 help="""Name of the existing line or cell magic."""
92 help="""Name of the existing line or cell magic."""
93 )
93 )
94 @line_magic
94 @line_magic
95 def alias_magic(self, line=''):
95 def alias_magic(self, line=''):
96 """Create an alias for an existing line or cell magic.
96 """Create an alias for an existing line or cell magic.
97
97
98 Examples
98 Examples
99 --------
99 --------
100 ::
100 ::
101
101
102 In [1]: %alias_magic t timeit
102 In [1]: %alias_magic t timeit
103 Created `%t` as an alias for `%timeit`.
103 Created `%t` as an alias for `%timeit`.
104 Created `%%t` as an alias for `%%timeit`.
104 Created `%%t` as an alias for `%%timeit`.
105
105
106 In [2]: %t -n1 pass
106 In [2]: %t -n1 pass
107 1 loops, best of 3: 954 ns per loop
107 1 loops, best of 3: 954 ns per loop
108
108
109 In [3]: %%t -n1
109 In [3]: %%t -n1
110 ...: pass
110 ...: pass
111 ...:
111 ...:
112 1 loops, best of 3: 954 ns per loop
112 1 loops, best of 3: 954 ns per loop
113
113
114 In [4]: %alias_magic --cell whereami pwd
114 In [4]: %alias_magic --cell whereami pwd
115 UsageError: Cell magic function `%%pwd` not found.
115 UsageError: Cell magic function `%%pwd` not found.
116 In [5]: %alias_magic --line whereami pwd
116 In [5]: %alias_magic --line whereami pwd
117 Created `%whereami` as an alias for `%pwd`.
117 Created `%whereami` as an alias for `%pwd`.
118
118
119 In [6]: %whereami
119 In [6]: %whereami
120 Out[6]: u'/home/testuser'
120 Out[6]: u'/home/testuser'
121 """
121 """
122 args = magic_arguments.parse_argstring(self.alias_magic, line)
122 args = magic_arguments.parse_argstring(self.alias_magic, line)
123 shell = self.shell
123 shell = self.shell
124 mman = self.shell.magics_manager
124 mman = self.shell.magics_manager
125 escs = ''.join(magic_escapes.values())
125 escs = ''.join(magic_escapes.values())
126
126
127 target = args.target.lstrip(escs)
127 target = args.target.lstrip(escs)
128 name = args.name.lstrip(escs)
128 name = args.name.lstrip(escs)
129
129
130 # Find the requested magics.
130 # Find the requested magics.
131 m_line = shell.find_magic(target, 'line')
131 m_line = shell.find_magic(target, 'line')
132 m_cell = shell.find_magic(target, 'cell')
132 m_cell = shell.find_magic(target, 'cell')
133 if args.line and m_line is None:
133 if args.line and m_line is None:
134 raise UsageError('Line magic function `%s%s` not found.' %
134 raise UsageError('Line magic function `%s%s` not found.' %
135 (magic_escapes['line'], target))
135 (magic_escapes['line'], target))
136 if args.cell and m_cell is None:
136 if args.cell and m_cell is None:
137 raise UsageError('Cell magic function `%s%s` not found.' %
137 raise UsageError('Cell magic function `%s%s` not found.' %
138 (magic_escapes['cell'], target))
138 (magic_escapes['cell'], target))
139
139
140 # If --line and --cell are not specified, default to the ones
140 # If --line and --cell are not specified, default to the ones
141 # that are available.
141 # that are available.
142 if not args.line and not args.cell:
142 if not args.line and not args.cell:
143 if not m_line and not m_cell:
143 if not m_line and not m_cell:
144 raise UsageError(
144 raise UsageError(
145 'No line or cell magic with name `%s` found.' % target
145 'No line or cell magic with name `%s` found.' % target
146 )
146 )
147 args.line = bool(m_line)
147 args.line = bool(m_line)
148 args.cell = bool(m_cell)
148 args.cell = bool(m_cell)
149
149
150 if args.line:
150 if args.line:
151 mman.register_alias(name, target, 'line')
151 mman.register_alias(name, target, 'line')
152 print('Created `%s%s` as an alias for `%s%s`.' % (
152 print('Created `%s%s` as an alias for `%s%s`.' % (
153 magic_escapes['line'], name,
153 magic_escapes['line'], name,
154 magic_escapes['line'], target))
154 magic_escapes['line'], target))
155
155
156 if args.cell:
156 if args.cell:
157 mman.register_alias(name, target, 'cell')
157 mman.register_alias(name, target, 'cell')
158 print('Created `%s%s` as an alias for `%s%s`.' % (
158 print('Created `%s%s` as an alias for `%s%s`.' % (
159 magic_escapes['cell'], name,
159 magic_escapes['cell'], name,
160 magic_escapes['cell'], target))
160 magic_escapes['cell'], target))
161
161
162 @line_magic
162 @line_magic
163 def lsmagic(self, parameter_s=''):
163 def lsmagic(self, parameter_s=''):
164 """List currently available magic functions."""
164 """List currently available magic functions."""
165 return MagicsDisplay(self.shell.magics_manager)
165 return MagicsDisplay(self.shell.magics_manager)
166
166
167 def _magic_docs(self, brief=False, rest=False):
167 def _magic_docs(self, brief=False, rest=False):
168 """Return docstrings from magic functions."""
168 """Return docstrings from magic functions."""
169 mman = self.shell.magics_manager
169 mman = self.shell.magics_manager
170 docs = mman.lsmagic_docs(brief, missing='No documentation')
170 docs = mman.lsmagic_docs(brief, missing='No documentation')
171
171
172 if rest:
172 if rest:
173 format_string = '**%s%s**::\n\n%s\n\n'
173 format_string = '**%s%s**::\n\n%s\n\n'
174 else:
174 else:
175 format_string = '%s%s:\n%s\n'
175 format_string = '%s%s:\n%s\n'
176
176
177 return ''.join(
177 return ''.join(
178 [format_string % (magic_escapes['line'], fname,
178 [format_string % (magic_escapes['line'], fname,
179 indent(dedent(fndoc)))
179 indent(dedent(fndoc)))
180 for fname, fndoc in sorted(docs['line'].items())]
180 for fname, fndoc in sorted(docs['line'].items())]
181 +
181 +
182 [format_string % (magic_escapes['cell'], fname,
182 [format_string % (magic_escapes['cell'], fname,
183 indent(dedent(fndoc)))
183 indent(dedent(fndoc)))
184 for fname, fndoc in sorted(docs['cell'].items())]
184 for fname, fndoc in sorted(docs['cell'].items())]
185 )
185 )
186
186
187 @line_magic
187 @line_magic
188 def magic(self, parameter_s=''):
188 def magic(self, parameter_s=''):
189 """Print information about the magic function system.
189 """Print information about the magic function system.
190
190
191 Supported formats: -latex, -brief, -rest
191 Supported formats: -latex, -brief, -rest
192 """
192 """
193
193
194 mode = ''
194 mode = ''
195 try:
195 try:
196 mode = parameter_s.split()[0][1:]
196 mode = parameter_s.split()[0][1:]
197 if mode == 'rest':
197 if mode == 'rest':
198 rest_docs = []
198 rest_docs = []
199 except IndexError:
199 except IndexError:
200 pass
200 pass
201
201
202 brief = (mode == 'brief')
202 brief = (mode == 'brief')
203 rest = (mode == 'rest')
203 rest = (mode == 'rest')
204 magic_docs = self._magic_docs(brief, rest)
204 magic_docs = self._magic_docs(brief, rest)
205
205
206 if mode == 'latex':
206 if mode == 'latex':
207 print(self.format_latex(magic_docs))
207 print(self.format_latex(magic_docs))
208 return
208 return
209 else:
209 else:
210 magic_docs = format_screen(magic_docs)
210 magic_docs = format_screen(magic_docs)
211
211
212 out = ["""
212 out = ["""
213 IPython's 'magic' functions
213 IPython's 'magic' functions
214 ===========================
214 ===========================
215
215
216 The magic function system provides a series of functions which allow you to
216 The magic function system provides a series of functions which allow you to
217 control the behavior of IPython itself, plus a lot of system-type
217 control the behavior of IPython itself, plus a lot of system-type
218 features. There are two kinds of magics, line-oriented and cell-oriented.
218 features. There are two kinds of magics, line-oriented and cell-oriented.
219
219
220 Line magics are prefixed with the % character and work much like OS
220 Line magics are prefixed with the % character and work much like OS
221 command-line calls: they get as an argument the rest of the line, where
221 command-line calls: they get as an argument the rest of the line, where
222 arguments are passed without parentheses or quotes. For example, this will
222 arguments are passed without parentheses or quotes. For example, this will
223 time the given statement::
223 time the given statement::
224
224
225 %timeit range(1000)
225 %timeit range(1000)
226
226
227 Cell magics are prefixed with a double %%, and they are functions that get as
227 Cell magics are prefixed with a double %%, and they are functions that get as
228 an argument not only the rest of the line, but also the lines below it in a
228 an argument not only the rest of the line, but also the lines below it in a
229 separate argument. These magics are called with two arguments: the rest of the
229 separate argument. These magics are called with two arguments: the rest of the
230 call line and the body of the cell, consisting of the lines below the first.
230 call line and the body of the cell, consisting of the lines below the first.
231 For example::
231 For example::
232
232
233 %%timeit x = numpy.random.randn((100, 100))
233 %%timeit x = numpy.random.randn((100, 100))
234 numpy.linalg.svd(x)
234 numpy.linalg.svd(x)
235
235
236 will time the execution of the numpy svd routine, running the assignment of x
236 will time the execution of the numpy svd routine, running the assignment of x
237 as part of the setup phase, which is not timed.
237 as part of the setup phase, which is not timed.
238
238
239 In a line-oriented client (the terminal or Qt console IPython), starting a new
239 In a line-oriented client (the terminal or Qt console IPython), starting a new
240 input with %% will automatically enter cell mode, and IPython will continue
240 input with %% will automatically enter cell mode, and IPython will continue
241 reading input until a blank line is given. In the notebook, simply type the
241 reading input until a blank line is given. In the notebook, simply type the
242 whole cell as one entity, but keep in mind that the %% escape can only be at
242 whole cell as one entity, but keep in mind that the %% escape can only be at
243 the very start of the cell.
243 the very start of the cell.
244
244
245 NOTE: If you have 'automagic' enabled (via the command line option or with the
245 NOTE: If you have 'automagic' enabled (via the command line option or with the
246 %automagic function), you don't need to type in the % explicitly for line
246 %automagic function), you don't need to type in the % explicitly for line
247 magics; cell magics always require an explicit '%%' escape. By default,
247 magics; cell magics always require an explicit '%%' escape. By default,
248 IPython ships with automagic on, so you should only rarely need the % escape.
248 IPython ships with automagic on, so you should only rarely need the % escape.
249
249
250 Example: typing '%cd mydir' (without the quotes) changes you working directory
250 Example: typing '%cd mydir' (without the quotes) changes you working directory
251 to 'mydir', if it exists.
251 to 'mydir', if it exists.
252
252
253 For a list of the available magic functions, use %lsmagic. For a description
253 For a list of the available magic functions, use %lsmagic. For a description
254 of any of them, type %magic_name?, e.g. '%cd?'.
254 of any of them, type %magic_name?, e.g. '%cd?'.
255
255
256 Currently the magic system has the following functions:""",
256 Currently the magic system has the following functions:""",
257 magic_docs,
257 magic_docs,
258 "Summary of magic functions (from %slsmagic):" % magic_escapes['line'],
258 "Summary of magic functions (from %slsmagic):" % magic_escapes['line'],
259 str(self.lsmagic()),
259 str(self.lsmagic()),
260 ]
260 ]
261 page.page('\n'.join(out))
261 page.page('\n'.join(out))
262
262
263
263
264 @line_magic
264 @line_magic
265 def page(self, parameter_s=''):
265 def page(self, parameter_s=''):
266 """Pretty print the object and display it through a pager.
266 """Pretty print the object and display it through a pager.
267
267
268 %page [options] OBJECT
268 %page [options] OBJECT
269
269
270 If no object is given, use _ (last output).
270 If no object is given, use _ (last output).
271
271
272 Options:
272 Options:
273
273
274 -r: page str(object), don't pretty-print it."""
274 -r: page str(object), don't pretty-print it."""
275
275
276 # After a function contributed by Olivier Aubert, slightly modified.
276 # After a function contributed by Olivier Aubert, slightly modified.
277
277
278 # Process options/args
278 # Process options/args
279 opts, args = self.parse_options(parameter_s, 'r')
279 opts, args = self.parse_options(parameter_s, 'r')
280 raw = 'r' in opts
280 raw = 'r' in opts
281
281
282 oname = args and args or '_'
282 oname = args and args or '_'
283 info = self.shell._ofind(oname)
283 info = self.shell._ofind(oname)
284 if info['found']:
284 if info['found']:
285 txt = (raw and str or pformat)( info['obj'] )
285 txt = (raw and str or pformat)( info['obj'] )
286 page.page(txt)
286 page.page(txt)
287 else:
287 else:
288 print('Object `%s` not found' % oname)
288 print('Object `%s` not found' % oname)
289
289
290 @line_magic
290 @line_magic
291 def profile(self, parameter_s=''):
291 def profile(self, parameter_s=''):
292 """Print your currently active IPython profile.
292 """Print your currently active IPython profile.
293
293
294 See Also
294 See Also
295 --------
295 --------
296 prun : run code using the Python profiler
296 prun : run code using the Python profiler
297 (:meth:`~IPython.core.magics.execution.ExecutionMagics.prun`)
297 (:meth:`~IPython.core.magics.execution.ExecutionMagics.prun`)
298 """
298 """
299 warn("%profile is now deprecated. Please use get_ipython().profile instead.")
299 warn("%profile is now deprecated. Please use get_ipython().profile instead.")
300 from IPython.core.application import BaseIPythonApplication
300 from IPython.core.application import BaseIPythonApplication
301 if BaseIPythonApplication.initialized():
301 if BaseIPythonApplication.initialized():
302 print(BaseIPythonApplication.instance().profile)
302 print(BaseIPythonApplication.instance().profile)
303 else:
303 else:
304 error("profile is an application-level value, but you don't appear to be in an IPython application")
304 error("profile is an application-level value, but you don't appear to be in an IPython application")
305
305
306 @line_magic
306 @line_magic
307 def pprint(self, parameter_s=''):
307 def pprint(self, parameter_s=''):
308 """Toggle pretty printing on/off."""
308 """Toggle pretty printing on/off."""
309 ptformatter = self.shell.display_formatter.formatters['text/plain']
309 ptformatter = self.shell.display_formatter.formatters['text/plain']
310 ptformatter.pprint = bool(1 - ptformatter.pprint)
310 ptformatter.pprint = bool(1 - ptformatter.pprint)
311 print('Pretty printing has been turned',
311 print('Pretty printing has been turned',
312 ['OFF','ON'][ptformatter.pprint])
312 ['OFF','ON'][ptformatter.pprint])
313
313
314 @line_magic
314 @line_magic
315 def colors(self, parameter_s=''):
315 def colors(self, parameter_s=''):
316 """Switch color scheme for prompts, info system and exception handlers.
316 """Switch color scheme for prompts, info system and exception handlers.
317
317
318 Currently implemented schemes: NoColor, Linux, LightBG.
318 Currently implemented schemes: NoColor, Linux, LightBG.
319
319
320 Color scheme names are not case-sensitive.
320 Color scheme names are not case-sensitive.
321
321
322 Examples
322 Examples
323 --------
323 --------
324 To get a plain black and white terminal::
324 To get a plain black and white terminal::
325
325
326 %colors nocolor
326 %colors nocolor
327 """
327 """
328 def color_switch_err(name):
328 def color_switch_err(name):
329 warn('Error changing %s color schemes.\n%s' %
329 warn('Error changing %s color schemes.\n%s' %
330 (name, sys.exc_info()[1]))
330 (name, sys.exc_info()[1]))
331
331
332
332
333 new_scheme = parameter_s.strip()
333 new_scheme = parameter_s.strip()
334 if not new_scheme:
334 if not new_scheme:
335 raise UsageError(
335 raise UsageError(
336 "%colors: you must specify a color scheme. See '%colors?'")
336 "%colors: you must specify a color scheme. See '%colors?'")
337 # local shortcut
337 # local shortcut
338 shell = self.shell
338 shell = self.shell
339
339
340 import IPython.utils.rlineimpl as readline
340 import IPython.utils.rlineimpl as readline
341
341
342 if not shell.colors_force and \
342 if not shell.colors_force and \
343 not readline.have_readline and \
343 not readline.have_readline and \
344 (sys.platform == "win32" or sys.platform == "cli"):
344 (sys.platform == "win32" or sys.platform == "cli"):
345 msg = """\
345 msg = """\
346 Proper color support under MS Windows requires the pyreadline library.
346 Proper color support under MS Windows requires the pyreadline library.
347 You can find it at:
347 You can find it at:
348 http://ipython.org/pyreadline.html
348 http://ipython.org/pyreadline.html
349
349
350 Defaulting color scheme to 'NoColor'"""
350 Defaulting color scheme to 'NoColor'"""
351 new_scheme = 'NoColor'
351 new_scheme = 'NoColor'
352 warn(msg)
352 warn(msg)
353
353
354 # readline option is 0
354 # readline option is 0
355 if not shell.colors_force and not shell.has_readline:
355 if not shell.colors_force and not shell.has_readline:
356 new_scheme = 'NoColor'
356 new_scheme = 'NoColor'
357
357
358 # Set prompt colors
358 # Set prompt colors
359 try:
359 try:
360 shell.prompt_manager.color_scheme = new_scheme
360 shell.prompt_manager.color_scheme = new_scheme
361 except:
361 except:
362 color_switch_err('prompt')
362 color_switch_err('prompt')
363 else:
363 else:
364 shell.colors = \
364 shell.colors = \
365 shell.prompt_manager.color_scheme_table.active_scheme_name
365 shell.prompt_manager.color_scheme_table.active_scheme_name
366 # Set exception colors
366 # Set exception colors
367 try:
367 try:
368 shell.InteractiveTB.set_colors(scheme = new_scheme)
368 shell.InteractiveTB.set_colors(scheme = new_scheme)
369 shell.SyntaxTB.set_colors(scheme = new_scheme)
369 shell.SyntaxTB.set_colors(scheme = new_scheme)
370 except:
370 except:
371 color_switch_err('exception')
371 color_switch_err('exception')
372
372
373 # Set info (for 'object?') colors
373 # Set info (for 'object?') colors
374 if shell.color_info:
374 if shell.color_info:
375 try:
375 try:
376 shell.inspector.set_active_scheme(new_scheme)
376 shell.inspector.set_active_scheme(new_scheme)
377 except:
377 except:
378 color_switch_err('object inspector')
378 color_switch_err('object inspector')
379 else:
379 else:
380 shell.inspector.set_active_scheme('NoColor')
380 shell.inspector.set_active_scheme('NoColor')
381
381
382 @line_magic
382 @line_magic
383 def xmode(self, parameter_s=''):
383 def xmode(self, parameter_s=''):
384 """Switch modes for the exception handlers.
384 """Switch modes for the exception handlers.
385
385
386 Valid modes: Plain, Context and Verbose.
386 Valid modes: Plain, Context and Verbose.
387
387
388 If called without arguments, acts as a toggle."""
388 If called without arguments, acts as a toggle."""
389
389
390 def xmode_switch_err(name):
390 def xmode_switch_err(name):
391 warn('Error changing %s exception modes.\n%s' %
391 warn('Error changing %s exception modes.\n%s' %
392 (name,sys.exc_info()[1]))
392 (name,sys.exc_info()[1]))
393
393
394 shell = self.shell
394 shell = self.shell
395 new_mode = parameter_s.strip().capitalize()
395 new_mode = parameter_s.strip().capitalize()
396 try:
396 try:
397 shell.InteractiveTB.set_mode(mode=new_mode)
397 shell.InteractiveTB.set_mode(mode=new_mode)
398 print('Exception reporting mode:',shell.InteractiveTB.mode)
398 print('Exception reporting mode:',shell.InteractiveTB.mode)
399 except:
399 except:
400 xmode_switch_err('user')
400 xmode_switch_err('user')
401
401
402 @line_magic
402 @line_magic
403 def quickref(self,arg):
403 def quickref(self,arg):
404 """ Show a quick reference sheet """
404 """ Show a quick reference sheet """
405 from IPython.core.usage import quick_reference
405 from IPython.core.usage import quick_reference
406 qr = quick_reference + self._magic_docs(brief=True)
406 qr = quick_reference + self._magic_docs(brief=True)
407 page.page(qr)
407 page.page(qr)
408
408
409 @line_magic
409 @line_magic
410 def doctest_mode(self, parameter_s=''):
410 def doctest_mode(self, parameter_s=''):
411 """Toggle doctest mode on and off.
411 """Toggle doctest mode on and off.
412
412
413 This mode is intended to make IPython behave as much as possible like a
413 This mode is intended to make IPython behave as much as possible like a
414 plain Python shell, from the perspective of how its prompts, exceptions
414 plain Python shell, from the perspective of how its prompts, exceptions
415 and output look. This makes it easy to copy and paste parts of a
415 and output look. This makes it easy to copy and paste parts of a
416 session into doctests. It does so by:
416 session into doctests. It does so by:
417
417
418 - Changing the prompts to the classic ``>>>`` ones.
418 - Changing the prompts to the classic ``>>>`` ones.
419 - Changing the exception reporting mode to 'Plain'.
419 - Changing the exception reporting mode to 'Plain'.
420 - Disabling pretty-printing of output.
420 - Disabling pretty-printing of output.
421
421
422 Note that IPython also supports the pasting of code snippets that have
422 Note that IPython also supports the pasting of code snippets that have
423 leading '>>>' and '...' prompts in them. This means that you can paste
423 leading '>>>' and '...' prompts in them. This means that you can paste
424 doctests from files or docstrings (even if they have leading
424 doctests from files or docstrings (even if they have leading
425 whitespace), and the code will execute correctly. You can then use
425 whitespace), and the code will execute correctly. You can then use
426 '%history -t' to see the translated history; this will give you the
426 '%history -t' to see the translated history; this will give you the
427 input after removal of all the leading prompts and whitespace, which
427 input after removal of all the leading prompts and whitespace, which
428 can be pasted back into an editor.
428 can be pasted back into an editor.
429
429
430 With these features, you can switch into this mode easily whenever you
430 With these features, you can switch into this mode easily whenever you
431 need to do testing and changes to doctests, without having to leave
431 need to do testing and changes to doctests, without having to leave
432 your existing IPython session.
432 your existing IPython session.
433 """
433 """
434
434
435 # Shorthands
435 # Shorthands
436 shell = self.shell
436 shell = self.shell
437 pm = shell.prompt_manager
437 pm = shell.prompt_manager
438 meta = shell.meta
438 meta = shell.meta
439 disp_formatter = self.shell.display_formatter
439 disp_formatter = self.shell.display_formatter
440 ptformatter = disp_formatter.formatters['text/plain']
440 ptformatter = disp_formatter.formatters['text/plain']
441 # dstore is a data store kept in the instance metadata bag to track any
441 # dstore is a data store kept in the instance metadata bag to track any
442 # changes we make, so we can undo them later.
442 # changes we make, so we can undo them later.
443 dstore = meta.setdefault('doctest_mode',Struct())
443 dstore = meta.setdefault('doctest_mode',Struct())
444 save_dstore = dstore.setdefault
444 save_dstore = dstore.setdefault
445
445
446 # save a few values we'll need to recover later
446 # save a few values we'll need to recover later
447 mode = save_dstore('mode',False)
447 mode = save_dstore('mode',False)
448 save_dstore('rc_pprint',ptformatter.pprint)
448 save_dstore('rc_pprint',ptformatter.pprint)
449 save_dstore('xmode',shell.InteractiveTB.mode)
449 save_dstore('xmode',shell.InteractiveTB.mode)
450 save_dstore('rc_separate_out',shell.separate_out)
450 save_dstore('rc_separate_out',shell.separate_out)
451 save_dstore('rc_separate_out2',shell.separate_out2)
451 save_dstore('rc_separate_out2',shell.separate_out2)
452 save_dstore('rc_prompts_pad_left',pm.justify)
452 save_dstore('rc_prompts_pad_left',pm.justify)
453 save_dstore('rc_separate_in',shell.separate_in)
453 save_dstore('rc_separate_in',shell.separate_in)
454 save_dstore('rc_active_types',disp_formatter.active_types)
454 save_dstore('rc_active_types',disp_formatter.active_types)
455 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
455 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
456
456
457 if mode == False:
457 if mode == False:
458 # turn on
458 # turn on
459 pm.in_template = '>>> '
459 pm.in_template = '>>> '
460 pm.in2_template = '... '
460 pm.in2_template = '... '
461 pm.out_template = ''
461 pm.out_template = ''
462
462
463 # Prompt separators like plain python
463 # Prompt separators like plain python
464 shell.separate_in = ''
464 shell.separate_in = ''
465 shell.separate_out = ''
465 shell.separate_out = ''
466 shell.separate_out2 = ''
466 shell.separate_out2 = ''
467
467
468 pm.justify = False
468 pm.justify = False
469
469
470 ptformatter.pprint = False
470 ptformatter.pprint = False
471 disp_formatter.active_types = ['text/plain']
471 disp_formatter.active_types = ['text/plain']
472
472
473 shell.magic('xmode Plain')
473 shell.magic('xmode Plain')
474 else:
474 else:
475 # turn off
475 # turn off
476 pm.in_template, pm.in2_template, pm.out_template = dstore.prompt_templates
476 pm.in_template, pm.in2_template, pm.out_template = dstore.prompt_templates
477
477
478 shell.separate_in = dstore.rc_separate_in
478 shell.separate_in = dstore.rc_separate_in
479
479
480 shell.separate_out = dstore.rc_separate_out
480 shell.separate_out = dstore.rc_separate_out
481 shell.separate_out2 = dstore.rc_separate_out2
481 shell.separate_out2 = dstore.rc_separate_out2
482
482
483 pm.justify = dstore.rc_prompts_pad_left
483 pm.justify = dstore.rc_prompts_pad_left
484
484
485 ptformatter.pprint = dstore.rc_pprint
485 ptformatter.pprint = dstore.rc_pprint
486 disp_formatter.active_types = dstore.rc_active_types
486 disp_formatter.active_types = dstore.rc_active_types
487
487
488 shell.magic('xmode ' + dstore.xmode)
488 shell.magic('xmode ' + dstore.xmode)
489
489
490 # Store new mode and inform
490 # Store new mode and inform
491 dstore.mode = bool(1-int(mode))
491 dstore.mode = bool(1-int(mode))
492 mode_label = ['OFF','ON'][dstore.mode]
492 mode_label = ['OFF','ON'][dstore.mode]
493 print('Doctest mode is:', mode_label)
493 print('Doctest mode is:', mode_label)
494
494
495 @line_magic
495 @line_magic
496 def gui(self, parameter_s=''):
496 def gui(self, parameter_s=''):
497 """Enable or disable IPython GUI event loop integration.
497 """Enable or disable IPython GUI event loop integration.
498
498
499 %gui [GUINAME]
499 %gui [GUINAME]
500
500
501 This magic replaces IPython's threaded shells that were activated
501 This magic replaces IPython's threaded shells that were activated
502 using the (pylab/wthread/etc.) command line flags. GUI toolkits
502 using the (pylab/wthread/etc.) command line flags. GUI toolkits
503 can now be enabled at runtime and keyboard
503 can now be enabled at runtime and keyboard
504 interrupts should work without any problems. The following toolkits
504 interrupts should work without any problems. The following toolkits
505 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
505 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
506
506
507 %gui wx # enable wxPython event loop integration
507 %gui wx # enable wxPython event loop integration
508 %gui qt4|qt # enable PyQt4 event loop integration
508 %gui qt4|qt # enable PyQt4 event loop integration
509 %gui qt5 # enable PyQt5 event loop integration
509 %gui qt5 # enable PyQt5 event loop integration
510 %gui gtk # enable PyGTK event loop integration
510 %gui gtk # enable PyGTK event loop integration
511 %gui gtk3 # enable Gtk3 event loop integration
511 %gui gtk3 # enable Gtk3 event loop integration
512 %gui tk # enable Tk event loop integration
512 %gui tk # enable Tk event loop integration
513 %gui osx # enable Cocoa event loop integration
513 %gui osx # enable Cocoa event loop integration
514 # (requires %matplotlib 1.1)
514 # (requires %matplotlib 1.1)
515 %gui # disable all event loop integration
515 %gui # disable all event loop integration
516
516
517 WARNING: after any of these has been called you can simply create
517 WARNING: after any of these has been called you can simply create
518 an application object, but DO NOT start the event loop yourself, as
518 an application object, but DO NOT start the event loop yourself, as
519 we have already handled that.
519 we have already handled that.
520 """
520 """
521 opts, arg = self.parse_options(parameter_s, '')
521 opts, arg = self.parse_options(parameter_s, '')
522 if arg=='': arg = None
522 if arg=='': arg = None
523 try:
523 try:
524 return self.shell.enable_gui(arg)
524 return self.shell.enable_gui(arg)
525 except Exception as e:
525 except Exception as e:
526 # print simple error message, rather than traceback if we can't
526 # print simple error message, rather than traceback if we can't
527 # hook up the GUI
527 # hook up the GUI
528 error(str(e))
528 error(str(e))
529
529
530 @skip_doctest
530 @skip_doctest
531 @line_magic
531 @line_magic
532 def precision(self, s=''):
532 def precision(self, s=''):
533 """Set floating point precision for pretty printing.
533 """Set floating point precision for pretty printing.
534
534
535 Can set either integer precision or a format string.
535 Can set either integer precision or a format string.
536
536
537 If numpy has been imported and precision is an int,
537 If numpy has been imported and precision is an int,
538 numpy display precision will also be set, via ``numpy.set_printoptions``.
538 numpy display precision will also be set, via ``numpy.set_printoptions``.
539
539
540 If no argument is given, defaults will be restored.
540 If no argument is given, defaults will be restored.
541
541
542 Examples
542 Examples
543 --------
543 --------
544 ::
544 ::
545
545
546 In [1]: from math import pi
546 In [1]: from math import pi
547
547
548 In [2]: %precision 3
548 In [2]: %precision 3
549 Out[2]: u'%.3f'
549 Out[2]: u'%.3f'
550
550
551 In [3]: pi
551 In [3]: pi
552 Out[3]: 3.142
552 Out[3]: 3.142
553
553
554 In [4]: %precision %i
554 In [4]: %precision %i
555 Out[4]: u'%i'
555 Out[4]: u'%i'
556
556
557 In [5]: pi
557 In [5]: pi
558 Out[5]: 3
558 Out[5]: 3
559
559
560 In [6]: %precision %e
560 In [6]: %precision %e
561 Out[6]: u'%e'
561 Out[6]: u'%e'
562
562
563 In [7]: pi**10
563 In [7]: pi**10
564 Out[7]: 9.364805e+04
564 Out[7]: 9.364805e+04
565
565
566 In [8]: %precision
566 In [8]: %precision
567 Out[8]: u'%r'
567 Out[8]: u'%r'
568
568
569 In [9]: pi**10
569 In [9]: pi**10
570 Out[9]: 93648.047476082982
570 Out[9]: 93648.047476082982
571 """
571 """
572 ptformatter = self.shell.display_formatter.formatters['text/plain']
572 ptformatter = self.shell.display_formatter.formatters['text/plain']
573 ptformatter.float_precision = s
573 ptformatter.float_precision = s
574 return ptformatter.float_format
574 return ptformatter.float_format
575
575
576 @magic_arguments.magic_arguments()
576 @magic_arguments.magic_arguments()
577 @magic_arguments.argument(
577 @magic_arguments.argument(
578 '-e', '--export', action='store_true', default=False,
578 '-e', '--export', action='store_true', default=False,
579 help='Export IPython history as a notebook. The filename argument '
579 help='Export IPython history as a notebook. The filename argument '
580 'is used to specify the notebook name and format. For example '
580 'is used to specify the notebook name and format. For example '
581 'a filename of notebook.ipynb will result in a notebook name '
581 'a filename of notebook.ipynb will result in a notebook name '
582 'of "notebook" and a format of "json". Likewise using a ".py" '
582 'of "notebook" and a format of "json". Likewise using a ".py" '
583 'file extension will write the notebook as a Python script'
583 'file extension will write the notebook as a Python script'
584 )
584 )
585 @magic_arguments.argument(
585 @magic_arguments.argument(
586 'filename', type=unicode_type,
586 'filename', type=unicode_type,
587 help='Notebook name or filename'
587 help='Notebook name or filename'
588 )
588 )
589 @line_magic
589 @line_magic
590 def notebook(self, s):
590 def notebook(self, s):
591 """Export and convert IPython notebooks.
591 """Export and convert IPython notebooks.
592
592
593 This function can export the current IPython history to a notebook file.
593 This function can export the current IPython history to a notebook file.
594 For example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
594 For example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
595 To export the history to "foo.py" do "%notebook -e foo.py".
595 To export the history to "foo.py" do "%notebook -e foo.py".
596 """
596 """
597 args = magic_arguments.parse_argstring(self.notebook, s)
597 args = magic_arguments.parse_argstring(self.notebook, s)
598
598
599 from jupyter_nbformat import write, v4
599 from nbformat import write, v4
600 args.filename = unquote_filename(args.filename)
600 args.filename = unquote_filename(args.filename)
601 if args.export:
601 if args.export:
602 cells = []
602 cells = []
603 hist = list(self.shell.history_manager.get_range())
603 hist = list(self.shell.history_manager.get_range())
604 if(len(hist)<=1):
604 if(len(hist)<=1):
605 raise ValueError('History is empty, cannot export')
605 raise ValueError('History is empty, cannot export')
606 for session, execution_count, source in hist[:-1]:
606 for session, execution_count, source in hist[:-1]:
607 cells.append(v4.new_code_cell(
607 cells.append(v4.new_code_cell(
608 execution_count=execution_count,
608 execution_count=execution_count,
609 source=source
609 source=source
610 ))
610 ))
611 nb = v4.new_notebook(cells=cells)
611 nb = v4.new_notebook(cells=cells)
612 with io.open(args.filename, 'w', encoding='utf-8') as f:
612 with io.open(args.filename, 'w', encoding='utf-8') as f:
613 write(nb, f, version=4)
613 write(nb, f, version=4)
@@ -1,996 +1,996 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Tests for various magic functions.
2 """Tests for various magic functions.
3
3
4 Needs to be run by nose (to make ipython session available).
4 Needs to be run by nose (to make ipython session available).
5 """
5 """
6 from __future__ import absolute_import
6 from __future__ import absolute_import
7
7
8 import io
8 import io
9 import os
9 import os
10 import sys
10 import sys
11 import warnings
11 import warnings
12 from unittest import TestCase, skipIf
12 from unittest import TestCase, skipIf
13
13
14 try:
14 try:
15 from importlib import invalidate_caches # Required from Python 3.3
15 from importlib import invalidate_caches # Required from Python 3.3
16 except ImportError:
16 except ImportError:
17 def invalidate_caches():
17 def invalidate_caches():
18 pass
18 pass
19
19
20 import nose.tools as nt
20 import nose.tools as nt
21
21
22 from IPython import get_ipython
22 from IPython import get_ipython
23 from IPython.core import magic
23 from IPython.core import magic
24 from IPython.core.error import UsageError
24 from IPython.core.error import UsageError
25 from IPython.core.magic import (Magics, magics_class, line_magic,
25 from IPython.core.magic import (Magics, magics_class, line_magic,
26 cell_magic, line_cell_magic,
26 cell_magic, line_cell_magic,
27 register_line_magic, register_cell_magic,
27 register_line_magic, register_cell_magic,
28 register_line_cell_magic)
28 register_line_cell_magic)
29 from IPython.core.magics import execution, script, code
29 from IPython.core.magics import execution, script, code
30 from IPython.testing import decorators as dec
30 from IPython.testing import decorators as dec
31 from IPython.testing import tools as tt
31 from IPython.testing import tools as tt
32 from IPython.utils import py3compat
32 from IPython.utils import py3compat
33 from IPython.utils.io import capture_output
33 from IPython.utils.io import capture_output
34 from IPython.utils.tempdir import TemporaryDirectory
34 from IPython.utils.tempdir import TemporaryDirectory
35 from IPython.utils.process import find_cmd
35 from IPython.utils.process import find_cmd
36
36
37 if py3compat.PY3:
37 if py3compat.PY3:
38 from io import StringIO
38 from io import StringIO
39 else:
39 else:
40 from StringIO import StringIO
40 from StringIO import StringIO
41
41
42
42
43 @magic.magics_class
43 @magic.magics_class
44 class DummyMagics(magic.Magics): pass
44 class DummyMagics(magic.Magics): pass
45
45
46 def test_extract_code_ranges():
46 def test_extract_code_ranges():
47 instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :"
47 instr = "1 3 5-6 7-9 10:15 17: :10 10- -13 :"
48 expected = [(0, 1),
48 expected = [(0, 1),
49 (2, 3),
49 (2, 3),
50 (4, 6),
50 (4, 6),
51 (6, 9),
51 (6, 9),
52 (9, 14),
52 (9, 14),
53 (16, None),
53 (16, None),
54 (None, 9),
54 (None, 9),
55 (9, None),
55 (9, None),
56 (None, 13),
56 (None, 13),
57 (None, None)]
57 (None, None)]
58 actual = list(code.extract_code_ranges(instr))
58 actual = list(code.extract_code_ranges(instr))
59 nt.assert_equal(actual, expected)
59 nt.assert_equal(actual, expected)
60
60
61 def test_extract_symbols():
61 def test_extract_symbols():
62 source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n"""
62 source = """import foo\na = 10\ndef b():\n return 42\n\n\nclass A: pass\n\n\n"""
63 symbols_args = ["a", "b", "A", "A,b", "A,a", "z"]
63 symbols_args = ["a", "b", "A", "A,b", "A,a", "z"]
64 expected = [([], ['a']),
64 expected = [([], ['a']),
65 (["def b():\n return 42\n"], []),
65 (["def b():\n return 42\n"], []),
66 (["class A: pass\n"], []),
66 (["class A: pass\n"], []),
67 (["class A: pass\n", "def b():\n return 42\n"], []),
67 (["class A: pass\n", "def b():\n return 42\n"], []),
68 (["class A: pass\n"], ['a']),
68 (["class A: pass\n"], ['a']),
69 ([], ['z'])]
69 ([], ['z'])]
70 for symbols, exp in zip(symbols_args, expected):
70 for symbols, exp in zip(symbols_args, expected):
71 nt.assert_equal(code.extract_symbols(source, symbols), exp)
71 nt.assert_equal(code.extract_symbols(source, symbols), exp)
72
72
73
73
74 def test_extract_symbols_raises_exception_with_non_python_code():
74 def test_extract_symbols_raises_exception_with_non_python_code():
75 source = ("=begin A Ruby program :)=end\n"
75 source = ("=begin A Ruby program :)=end\n"
76 "def hello\n"
76 "def hello\n"
77 "puts 'Hello world'\n"
77 "puts 'Hello world'\n"
78 "end")
78 "end")
79 with nt.assert_raises(SyntaxError):
79 with nt.assert_raises(SyntaxError):
80 code.extract_symbols(source, "hello")
80 code.extract_symbols(source, "hello")
81
81
82 def test_config():
82 def test_config():
83 """ test that config magic does not raise
83 """ test that config magic does not raise
84 can happen if Configurable init is moved too early into
84 can happen if Configurable init is moved too early into
85 Magics.__init__ as then a Config object will be registerd as a
85 Magics.__init__ as then a Config object will be registerd as a
86 magic.
86 magic.
87 """
87 """
88 ## should not raise.
88 ## should not raise.
89 _ip.magic('config')
89 _ip.magic('config')
90
90
91 def test_rehashx():
91 def test_rehashx():
92 # clear up everything
92 # clear up everything
93 _ip = get_ipython()
93 _ip = get_ipython()
94 _ip.alias_manager.clear_aliases()
94 _ip.alias_manager.clear_aliases()
95 del _ip.db['syscmdlist']
95 del _ip.db['syscmdlist']
96
96
97 _ip.magic('rehashx')
97 _ip.magic('rehashx')
98 # Practically ALL ipython development systems will have more than 10 aliases
98 # Practically ALL ipython development systems will have more than 10 aliases
99
99
100 nt.assert_true(len(_ip.alias_manager.aliases) > 10)
100 nt.assert_true(len(_ip.alias_manager.aliases) > 10)
101 for name, cmd in _ip.alias_manager.aliases:
101 for name, cmd in _ip.alias_manager.aliases:
102 # we must strip dots from alias names
102 # we must strip dots from alias names
103 nt.assert_not_in('.', name)
103 nt.assert_not_in('.', name)
104
104
105 # rehashx must fill up syscmdlist
105 # rehashx must fill up syscmdlist
106 scoms = _ip.db['syscmdlist']
106 scoms = _ip.db['syscmdlist']
107 nt.assert_true(len(scoms) > 10)
107 nt.assert_true(len(scoms) > 10)
108
108
109
109
110 def test_magic_parse_options():
110 def test_magic_parse_options():
111 """Test that we don't mangle paths when parsing magic options."""
111 """Test that we don't mangle paths when parsing magic options."""
112 ip = get_ipython()
112 ip = get_ipython()
113 path = 'c:\\x'
113 path = 'c:\\x'
114 m = DummyMagics(ip)
114 m = DummyMagics(ip)
115 opts = m.parse_options('-f %s' % path,'f:')[0]
115 opts = m.parse_options('-f %s' % path,'f:')[0]
116 # argv splitting is os-dependent
116 # argv splitting is os-dependent
117 if os.name == 'posix':
117 if os.name == 'posix':
118 expected = 'c:x'
118 expected = 'c:x'
119 else:
119 else:
120 expected = path
120 expected = path
121 nt.assert_equal(opts['f'], expected)
121 nt.assert_equal(opts['f'], expected)
122
122
123 def test_magic_parse_long_options():
123 def test_magic_parse_long_options():
124 """Magic.parse_options can handle --foo=bar long options"""
124 """Magic.parse_options can handle --foo=bar long options"""
125 ip = get_ipython()
125 ip = get_ipython()
126 m = DummyMagics(ip)
126 m = DummyMagics(ip)
127 opts, _ = m.parse_options('--foo --bar=bubble', 'a', 'foo', 'bar=')
127 opts, _ = m.parse_options('--foo --bar=bubble', 'a', 'foo', 'bar=')
128 nt.assert_in('foo', opts)
128 nt.assert_in('foo', opts)
129 nt.assert_in('bar', opts)
129 nt.assert_in('bar', opts)
130 nt.assert_equal(opts['bar'], "bubble")
130 nt.assert_equal(opts['bar'], "bubble")
131
131
132
132
133 @dec.skip_without('sqlite3')
133 @dec.skip_without('sqlite3')
134 def doctest_hist_f():
134 def doctest_hist_f():
135 """Test %hist -f with temporary filename.
135 """Test %hist -f with temporary filename.
136
136
137 In [9]: import tempfile
137 In [9]: import tempfile
138
138
139 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
139 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
140
140
141 In [11]: %hist -nl -f $tfile 3
141 In [11]: %hist -nl -f $tfile 3
142
142
143 In [13]: import os; os.unlink(tfile)
143 In [13]: import os; os.unlink(tfile)
144 """
144 """
145
145
146
146
147 @dec.skip_without('sqlite3')
147 @dec.skip_without('sqlite3')
148 def doctest_hist_r():
148 def doctest_hist_r():
149 """Test %hist -r
149 """Test %hist -r
150
150
151 XXX - This test is not recording the output correctly. For some reason, in
151 XXX - This test is not recording the output correctly. For some reason, in
152 testing mode the raw history isn't getting populated. No idea why.
152 testing mode the raw history isn't getting populated. No idea why.
153 Disabling the output checking for now, though at least we do run it.
153 Disabling the output checking for now, though at least we do run it.
154
154
155 In [1]: 'hist' in _ip.lsmagic()
155 In [1]: 'hist' in _ip.lsmagic()
156 Out[1]: True
156 Out[1]: True
157
157
158 In [2]: x=1
158 In [2]: x=1
159
159
160 In [3]: %hist -rl 2
160 In [3]: %hist -rl 2
161 x=1 # random
161 x=1 # random
162 %hist -r 2
162 %hist -r 2
163 """
163 """
164
164
165
165
166 @dec.skip_without('sqlite3')
166 @dec.skip_without('sqlite3')
167 def doctest_hist_op():
167 def doctest_hist_op():
168 """Test %hist -op
168 """Test %hist -op
169
169
170 In [1]: class b(float):
170 In [1]: class b(float):
171 ...: pass
171 ...: pass
172 ...:
172 ...:
173
173
174 In [2]: class s(object):
174 In [2]: class s(object):
175 ...: def __str__(self):
175 ...: def __str__(self):
176 ...: return 's'
176 ...: return 's'
177 ...:
177 ...:
178
178
179 In [3]:
179 In [3]:
180
180
181 In [4]: class r(b):
181 In [4]: class r(b):
182 ...: def __repr__(self):
182 ...: def __repr__(self):
183 ...: return 'r'
183 ...: return 'r'
184 ...:
184 ...:
185
185
186 In [5]: class sr(s,r): pass
186 In [5]: class sr(s,r): pass
187 ...:
187 ...:
188
188
189 In [6]:
189 In [6]:
190
190
191 In [7]: bb=b()
191 In [7]: bb=b()
192
192
193 In [8]: ss=s()
193 In [8]: ss=s()
194
194
195 In [9]: rr=r()
195 In [9]: rr=r()
196
196
197 In [10]: ssrr=sr()
197 In [10]: ssrr=sr()
198
198
199 In [11]: 4.5
199 In [11]: 4.5
200 Out[11]: 4.5
200 Out[11]: 4.5
201
201
202 In [12]: str(ss)
202 In [12]: str(ss)
203 Out[12]: 's'
203 Out[12]: 's'
204
204
205 In [13]:
205 In [13]:
206
206
207 In [14]: %hist -op
207 In [14]: %hist -op
208 >>> class b:
208 >>> class b:
209 ... pass
209 ... pass
210 ...
210 ...
211 >>> class s(b):
211 >>> class s(b):
212 ... def __str__(self):
212 ... def __str__(self):
213 ... return 's'
213 ... return 's'
214 ...
214 ...
215 >>>
215 >>>
216 >>> class r(b):
216 >>> class r(b):
217 ... def __repr__(self):
217 ... def __repr__(self):
218 ... return 'r'
218 ... return 'r'
219 ...
219 ...
220 >>> class sr(s,r): pass
220 >>> class sr(s,r): pass
221 >>>
221 >>>
222 >>> bb=b()
222 >>> bb=b()
223 >>> ss=s()
223 >>> ss=s()
224 >>> rr=r()
224 >>> rr=r()
225 >>> ssrr=sr()
225 >>> ssrr=sr()
226 >>> 4.5
226 >>> 4.5
227 4.5
227 4.5
228 >>> str(ss)
228 >>> str(ss)
229 's'
229 's'
230 >>>
230 >>>
231 """
231 """
232
232
233 def test_hist_pof():
233 def test_hist_pof():
234 ip = get_ipython()
234 ip = get_ipython()
235 ip.run_cell(u"1+2", store_history=True)
235 ip.run_cell(u"1+2", store_history=True)
236 #raise Exception(ip.history_manager.session_number)
236 #raise Exception(ip.history_manager.session_number)
237 #raise Exception(list(ip.history_manager._get_range_session()))
237 #raise Exception(list(ip.history_manager._get_range_session()))
238 with TemporaryDirectory() as td:
238 with TemporaryDirectory() as td:
239 tf = os.path.join(td, 'hist.py')
239 tf = os.path.join(td, 'hist.py')
240 ip.run_line_magic('history', '-pof %s' % tf)
240 ip.run_line_magic('history', '-pof %s' % tf)
241 assert os.path.isfile(tf)
241 assert os.path.isfile(tf)
242
242
243
243
244 @dec.skip_without('sqlite3')
244 @dec.skip_without('sqlite3')
245 def test_macro():
245 def test_macro():
246 ip = get_ipython()
246 ip = get_ipython()
247 ip.history_manager.reset() # Clear any existing history.
247 ip.history_manager.reset() # Clear any existing history.
248 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
248 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
249 for i, cmd in enumerate(cmds, start=1):
249 for i, cmd in enumerate(cmds, start=1):
250 ip.history_manager.store_inputs(i, cmd)
250 ip.history_manager.store_inputs(i, cmd)
251 ip.magic("macro test 1-3")
251 ip.magic("macro test 1-3")
252 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
252 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
253
253
254 # List macros
254 # List macros
255 nt.assert_in("test", ip.magic("macro"))
255 nt.assert_in("test", ip.magic("macro"))
256
256
257
257
258 @dec.skip_without('sqlite3')
258 @dec.skip_without('sqlite3')
259 def test_macro_run():
259 def test_macro_run():
260 """Test that we can run a multi-line macro successfully."""
260 """Test that we can run a multi-line macro successfully."""
261 ip = get_ipython()
261 ip = get_ipython()
262 ip.history_manager.reset()
262 ip.history_manager.reset()
263 cmds = ["a=10", "a+=1", py3compat.doctest_refactor_print("print a"),
263 cmds = ["a=10", "a+=1", py3compat.doctest_refactor_print("print a"),
264 "%macro test 2-3"]
264 "%macro test 2-3"]
265 for cmd in cmds:
265 for cmd in cmds:
266 ip.run_cell(cmd, store_history=True)
266 ip.run_cell(cmd, store_history=True)
267 nt.assert_equal(ip.user_ns["test"].value,
267 nt.assert_equal(ip.user_ns["test"].value,
268 py3compat.doctest_refactor_print("a+=1\nprint a\n"))
268 py3compat.doctest_refactor_print("a+=1\nprint a\n"))
269 with tt.AssertPrints("12"):
269 with tt.AssertPrints("12"):
270 ip.run_cell("test")
270 ip.run_cell("test")
271 with tt.AssertPrints("13"):
271 with tt.AssertPrints("13"):
272 ip.run_cell("test")
272 ip.run_cell("test")
273
273
274
274
275 def test_magic_magic():
275 def test_magic_magic():
276 """Test %magic"""
276 """Test %magic"""
277 ip = get_ipython()
277 ip = get_ipython()
278 with capture_output() as captured:
278 with capture_output() as captured:
279 ip.magic("magic")
279 ip.magic("magic")
280
280
281 stdout = captured.stdout
281 stdout = captured.stdout
282 nt.assert_in('%magic', stdout)
282 nt.assert_in('%magic', stdout)
283 nt.assert_in('IPython', stdout)
283 nt.assert_in('IPython', stdout)
284 nt.assert_in('Available', stdout)
284 nt.assert_in('Available', stdout)
285
285
286
286
287 @dec.skipif_not_numpy
287 @dec.skipif_not_numpy
288 def test_numpy_reset_array_undec():
288 def test_numpy_reset_array_undec():
289 "Test '%reset array' functionality"
289 "Test '%reset array' functionality"
290 _ip.ex('import numpy as np')
290 _ip.ex('import numpy as np')
291 _ip.ex('a = np.empty(2)')
291 _ip.ex('a = np.empty(2)')
292 nt.assert_in('a', _ip.user_ns)
292 nt.assert_in('a', _ip.user_ns)
293 _ip.magic('reset -f array')
293 _ip.magic('reset -f array')
294 nt.assert_not_in('a', _ip.user_ns)
294 nt.assert_not_in('a', _ip.user_ns)
295
295
296 def test_reset_out():
296 def test_reset_out():
297 "Test '%reset out' magic"
297 "Test '%reset out' magic"
298 _ip.run_cell("parrot = 'dead'", store_history=True)
298 _ip.run_cell("parrot = 'dead'", store_history=True)
299 # test '%reset -f out', make an Out prompt
299 # test '%reset -f out', make an Out prompt
300 _ip.run_cell("parrot", store_history=True)
300 _ip.run_cell("parrot", store_history=True)
301 nt.assert_true('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
301 nt.assert_true('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
302 _ip.magic('reset -f out')
302 _ip.magic('reset -f out')
303 nt.assert_false('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
303 nt.assert_false('dead' in [_ip.user_ns[x] for x in ('_','__','___')])
304 nt.assert_equal(len(_ip.user_ns['Out']), 0)
304 nt.assert_equal(len(_ip.user_ns['Out']), 0)
305
305
306 def test_reset_in():
306 def test_reset_in():
307 "Test '%reset in' magic"
307 "Test '%reset in' magic"
308 # test '%reset -f in'
308 # test '%reset -f in'
309 _ip.run_cell("parrot", store_history=True)
309 _ip.run_cell("parrot", store_history=True)
310 nt.assert_true('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
310 nt.assert_true('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
311 _ip.magic('%reset -f in')
311 _ip.magic('%reset -f in')
312 nt.assert_false('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
312 nt.assert_false('parrot' in [_ip.user_ns[x] for x in ('_i','_ii','_iii')])
313 nt.assert_equal(len(set(_ip.user_ns['In'])), 1)
313 nt.assert_equal(len(set(_ip.user_ns['In'])), 1)
314
314
315 def test_reset_dhist():
315 def test_reset_dhist():
316 "Test '%reset dhist' magic"
316 "Test '%reset dhist' magic"
317 _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing
317 _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing
318 _ip.magic('cd ' + os.path.dirname(nt.__file__))
318 _ip.magic('cd ' + os.path.dirname(nt.__file__))
319 _ip.magic('cd -')
319 _ip.magic('cd -')
320 nt.assert_true(len(_ip.user_ns['_dh']) > 0)
320 nt.assert_true(len(_ip.user_ns['_dh']) > 0)
321 _ip.magic('reset -f dhist')
321 _ip.magic('reset -f dhist')
322 nt.assert_equal(len(_ip.user_ns['_dh']), 0)
322 nt.assert_equal(len(_ip.user_ns['_dh']), 0)
323 _ip.run_cell("_dh = [d for d in tmp]") #restore
323 _ip.run_cell("_dh = [d for d in tmp]") #restore
324
324
325 def test_reset_in_length():
325 def test_reset_in_length():
326 "Test that '%reset in' preserves In[] length"
326 "Test that '%reset in' preserves In[] length"
327 _ip.run_cell("print 'foo'")
327 _ip.run_cell("print 'foo'")
328 _ip.run_cell("reset -f in")
328 _ip.run_cell("reset -f in")
329 nt.assert_equal(len(_ip.user_ns['In']), _ip.displayhook.prompt_count+1)
329 nt.assert_equal(len(_ip.user_ns['In']), _ip.displayhook.prompt_count+1)
330
330
331 def test_tb_syntaxerror():
331 def test_tb_syntaxerror():
332 """test %tb after a SyntaxError"""
332 """test %tb after a SyntaxError"""
333 ip = get_ipython()
333 ip = get_ipython()
334 ip.run_cell("for")
334 ip.run_cell("for")
335
335
336 # trap and validate stdout
336 # trap and validate stdout
337 save_stdout = sys.stdout
337 save_stdout = sys.stdout
338 try:
338 try:
339 sys.stdout = StringIO()
339 sys.stdout = StringIO()
340 ip.run_cell("%tb")
340 ip.run_cell("%tb")
341 out = sys.stdout.getvalue()
341 out = sys.stdout.getvalue()
342 finally:
342 finally:
343 sys.stdout = save_stdout
343 sys.stdout = save_stdout
344 # trim output, and only check the last line
344 # trim output, and only check the last line
345 last_line = out.rstrip().splitlines()[-1].strip()
345 last_line = out.rstrip().splitlines()[-1].strip()
346 nt.assert_equal(last_line, "SyntaxError: invalid syntax")
346 nt.assert_equal(last_line, "SyntaxError: invalid syntax")
347
347
348
348
349 def test_time():
349 def test_time():
350 ip = get_ipython()
350 ip = get_ipython()
351
351
352 with tt.AssertPrints("Wall time: "):
352 with tt.AssertPrints("Wall time: "):
353 ip.run_cell("%time None")
353 ip.run_cell("%time None")
354
354
355 ip.run_cell("def f(kmjy):\n"
355 ip.run_cell("def f(kmjy):\n"
356 " %time print (2*kmjy)")
356 " %time print (2*kmjy)")
357
357
358 with tt.AssertPrints("Wall time: "):
358 with tt.AssertPrints("Wall time: "):
359 with tt.AssertPrints("hihi", suppress=False):
359 with tt.AssertPrints("hihi", suppress=False):
360 ip.run_cell("f('hi')")
360 ip.run_cell("f('hi')")
361
361
362
362
363 @dec.skip_win32
363 @dec.skip_win32
364 def test_time2():
364 def test_time2():
365 ip = get_ipython()
365 ip = get_ipython()
366
366
367 with tt.AssertPrints("CPU times: user "):
367 with tt.AssertPrints("CPU times: user "):
368 ip.run_cell("%time None")
368 ip.run_cell("%time None")
369
369
370 def test_time3():
370 def test_time3():
371 """Erroneous magic function calls, issue gh-3334"""
371 """Erroneous magic function calls, issue gh-3334"""
372 ip = get_ipython()
372 ip = get_ipython()
373 ip.user_ns.pop('run', None)
373 ip.user_ns.pop('run', None)
374
374
375 with tt.AssertNotPrints("not found", channel='stderr'):
375 with tt.AssertNotPrints("not found", channel='stderr'):
376 ip.run_cell("%%time\n"
376 ip.run_cell("%%time\n"
377 "run = 0\n"
377 "run = 0\n"
378 "run += 1")
378 "run += 1")
379
379
380 @dec.skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
380 @dec.skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
381 def test_time_futures():
381 def test_time_futures():
382 "Test %time with __future__ environments"
382 "Test %time with __future__ environments"
383 ip = get_ipython()
383 ip = get_ipython()
384 ip.autocall = 0
384 ip.autocall = 0
385 ip.run_cell("from __future__ import division")
385 ip.run_cell("from __future__ import division")
386 with tt.AssertPrints('0.25'):
386 with tt.AssertPrints('0.25'):
387 ip.run_line_magic('time', 'print(1/4)')
387 ip.run_line_magic('time', 'print(1/4)')
388 ip.compile.reset_compiler_flags()
388 ip.compile.reset_compiler_flags()
389 with tt.AssertNotPrints('0.25'):
389 with tt.AssertNotPrints('0.25'):
390 ip.run_line_magic('time', 'print(1/4)')
390 ip.run_line_magic('time', 'print(1/4)')
391
391
392 def test_doctest_mode():
392 def test_doctest_mode():
393 "Toggle doctest_mode twice, it should be a no-op and run without error"
393 "Toggle doctest_mode twice, it should be a no-op and run without error"
394 _ip.magic('doctest_mode')
394 _ip.magic('doctest_mode')
395 _ip.magic('doctest_mode')
395 _ip.magic('doctest_mode')
396
396
397
397
398 def test_parse_options():
398 def test_parse_options():
399 """Tests for basic options parsing in magics."""
399 """Tests for basic options parsing in magics."""
400 # These are only the most minimal of tests, more should be added later. At
400 # These are only the most minimal of tests, more should be added later. At
401 # the very least we check that basic text/unicode calls work OK.
401 # the very least we check that basic text/unicode calls work OK.
402 m = DummyMagics(_ip)
402 m = DummyMagics(_ip)
403 nt.assert_equal(m.parse_options('foo', '')[1], 'foo')
403 nt.assert_equal(m.parse_options('foo', '')[1], 'foo')
404 nt.assert_equal(m.parse_options(u'foo', '')[1], u'foo')
404 nt.assert_equal(m.parse_options(u'foo', '')[1], u'foo')
405
405
406
406
407 def test_dirops():
407 def test_dirops():
408 """Test various directory handling operations."""
408 """Test various directory handling operations."""
409 # curpath = lambda :os.path.splitdrive(py3compat.getcwd())[1].replace('\\','/')
409 # curpath = lambda :os.path.splitdrive(py3compat.getcwd())[1].replace('\\','/')
410 curpath = py3compat.getcwd
410 curpath = py3compat.getcwd
411 startdir = py3compat.getcwd()
411 startdir = py3compat.getcwd()
412 ipdir = os.path.realpath(_ip.ipython_dir)
412 ipdir = os.path.realpath(_ip.ipython_dir)
413 try:
413 try:
414 _ip.magic('cd "%s"' % ipdir)
414 _ip.magic('cd "%s"' % ipdir)
415 nt.assert_equal(curpath(), ipdir)
415 nt.assert_equal(curpath(), ipdir)
416 _ip.magic('cd -')
416 _ip.magic('cd -')
417 nt.assert_equal(curpath(), startdir)
417 nt.assert_equal(curpath(), startdir)
418 _ip.magic('pushd "%s"' % ipdir)
418 _ip.magic('pushd "%s"' % ipdir)
419 nt.assert_equal(curpath(), ipdir)
419 nt.assert_equal(curpath(), ipdir)
420 _ip.magic('popd')
420 _ip.magic('popd')
421 nt.assert_equal(curpath(), startdir)
421 nt.assert_equal(curpath(), startdir)
422 finally:
422 finally:
423 os.chdir(startdir)
423 os.chdir(startdir)
424
424
425
425
426 def test_xmode():
426 def test_xmode():
427 # Calling xmode three times should be a no-op
427 # Calling xmode three times should be a no-op
428 xmode = _ip.InteractiveTB.mode
428 xmode = _ip.InteractiveTB.mode
429 for i in range(3):
429 for i in range(3):
430 _ip.magic("xmode")
430 _ip.magic("xmode")
431 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
431 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
432
432
433 def test_reset_hard():
433 def test_reset_hard():
434 monitor = []
434 monitor = []
435 class A(object):
435 class A(object):
436 def __del__(self):
436 def __del__(self):
437 monitor.append(1)
437 monitor.append(1)
438 def __repr__(self):
438 def __repr__(self):
439 return "<A instance>"
439 return "<A instance>"
440
440
441 _ip.user_ns["a"] = A()
441 _ip.user_ns["a"] = A()
442 _ip.run_cell("a")
442 _ip.run_cell("a")
443
443
444 nt.assert_equal(monitor, [])
444 nt.assert_equal(monitor, [])
445 _ip.magic("reset -f")
445 _ip.magic("reset -f")
446 nt.assert_equal(monitor, [1])
446 nt.assert_equal(monitor, [1])
447
447
448 class TestXdel(tt.TempFileMixin):
448 class TestXdel(tt.TempFileMixin):
449 def test_xdel(self):
449 def test_xdel(self):
450 """Test that references from %run are cleared by xdel."""
450 """Test that references from %run are cleared by xdel."""
451 src = ("class A(object):\n"
451 src = ("class A(object):\n"
452 " monitor = []\n"
452 " monitor = []\n"
453 " def __del__(self):\n"
453 " def __del__(self):\n"
454 " self.monitor.append(1)\n"
454 " self.monitor.append(1)\n"
455 "a = A()\n")
455 "a = A()\n")
456 self.mktmp(src)
456 self.mktmp(src)
457 # %run creates some hidden references...
457 # %run creates some hidden references...
458 _ip.magic("run %s" % self.fname)
458 _ip.magic("run %s" % self.fname)
459 # ... as does the displayhook.
459 # ... as does the displayhook.
460 _ip.run_cell("a")
460 _ip.run_cell("a")
461
461
462 monitor = _ip.user_ns["A"].monitor
462 monitor = _ip.user_ns["A"].monitor
463 nt.assert_equal(monitor, [])
463 nt.assert_equal(monitor, [])
464
464
465 _ip.magic("xdel a")
465 _ip.magic("xdel a")
466
466
467 # Check that a's __del__ method has been called.
467 # Check that a's __del__ method has been called.
468 nt.assert_equal(monitor, [1])
468 nt.assert_equal(monitor, [1])
469
469
470 def doctest_who():
470 def doctest_who():
471 """doctest for %who
471 """doctest for %who
472
472
473 In [1]: %reset -f
473 In [1]: %reset -f
474
474
475 In [2]: alpha = 123
475 In [2]: alpha = 123
476
476
477 In [3]: beta = 'beta'
477 In [3]: beta = 'beta'
478
478
479 In [4]: %who int
479 In [4]: %who int
480 alpha
480 alpha
481
481
482 In [5]: %who str
482 In [5]: %who str
483 beta
483 beta
484
484
485 In [6]: %whos
485 In [6]: %whos
486 Variable Type Data/Info
486 Variable Type Data/Info
487 ----------------------------
487 ----------------------------
488 alpha int 123
488 alpha int 123
489 beta str beta
489 beta str beta
490
490
491 In [7]: %who_ls
491 In [7]: %who_ls
492 Out[7]: ['alpha', 'beta']
492 Out[7]: ['alpha', 'beta']
493 """
493 """
494
494
495 def test_whos():
495 def test_whos():
496 """Check that whos is protected against objects where repr() fails."""
496 """Check that whos is protected against objects where repr() fails."""
497 class A(object):
497 class A(object):
498 def __repr__(self):
498 def __repr__(self):
499 raise Exception()
499 raise Exception()
500 _ip.user_ns['a'] = A()
500 _ip.user_ns['a'] = A()
501 _ip.magic("whos")
501 _ip.magic("whos")
502
502
503 @py3compat.u_format
503 @py3compat.u_format
504 def doctest_precision():
504 def doctest_precision():
505 """doctest for %precision
505 """doctest for %precision
506
506
507 In [1]: f = get_ipython().display_formatter.formatters['text/plain']
507 In [1]: f = get_ipython().display_formatter.formatters['text/plain']
508
508
509 In [2]: %precision 5
509 In [2]: %precision 5
510 Out[2]: {u}'%.5f'
510 Out[2]: {u}'%.5f'
511
511
512 In [3]: f.float_format
512 In [3]: f.float_format
513 Out[3]: {u}'%.5f'
513 Out[3]: {u}'%.5f'
514
514
515 In [4]: %precision %e
515 In [4]: %precision %e
516 Out[4]: {u}'%e'
516 Out[4]: {u}'%e'
517
517
518 In [5]: f(3.1415927)
518 In [5]: f(3.1415927)
519 Out[5]: {u}'3.141593e+00'
519 Out[5]: {u}'3.141593e+00'
520 """
520 """
521
521
522 def test_psearch():
522 def test_psearch():
523 with tt.AssertPrints("dict.fromkeys"):
523 with tt.AssertPrints("dict.fromkeys"):
524 _ip.run_cell("dict.fr*?")
524 _ip.run_cell("dict.fr*?")
525
525
526 def test_timeit_shlex():
526 def test_timeit_shlex():
527 """test shlex issues with timeit (#1109)"""
527 """test shlex issues with timeit (#1109)"""
528 _ip.ex("def f(*a,**kw): pass")
528 _ip.ex("def f(*a,**kw): pass")
529 _ip.magic('timeit -n1 "this is a bug".count(" ")')
529 _ip.magic('timeit -n1 "this is a bug".count(" ")')
530 _ip.magic('timeit -r1 -n1 f(" ", 1)')
530 _ip.magic('timeit -r1 -n1 f(" ", 1)')
531 _ip.magic('timeit -r1 -n1 f(" ", 1, " ", 2, " ")')
531 _ip.magic('timeit -r1 -n1 f(" ", 1, " ", 2, " ")')
532 _ip.magic('timeit -r1 -n1 ("a " + "b")')
532 _ip.magic('timeit -r1 -n1 ("a " + "b")')
533 _ip.magic('timeit -r1 -n1 f("a " + "b")')
533 _ip.magic('timeit -r1 -n1 f("a " + "b")')
534 _ip.magic('timeit -r1 -n1 f("a " + "b ")')
534 _ip.magic('timeit -r1 -n1 f("a " + "b ")')
535
535
536
536
537 def test_timeit_arguments():
537 def test_timeit_arguments():
538 "Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
538 "Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
539 _ip.magic("timeit ('#')")
539 _ip.magic("timeit ('#')")
540
540
541
541
542 def test_timeit_special_syntax():
542 def test_timeit_special_syntax():
543 "Test %%timeit with IPython special syntax"
543 "Test %%timeit with IPython special syntax"
544 @register_line_magic
544 @register_line_magic
545 def lmagic(line):
545 def lmagic(line):
546 ip = get_ipython()
546 ip = get_ipython()
547 ip.user_ns['lmagic_out'] = line
547 ip.user_ns['lmagic_out'] = line
548
548
549 # line mode test
549 # line mode test
550 _ip.run_line_magic('timeit', '-n1 -r1 %lmagic my line')
550 _ip.run_line_magic('timeit', '-n1 -r1 %lmagic my line')
551 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
551 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
552 # cell mode test
552 # cell mode test
553 _ip.run_cell_magic('timeit', '-n1 -r1', '%lmagic my line2')
553 _ip.run_cell_magic('timeit', '-n1 -r1', '%lmagic my line2')
554 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
554 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
555
555
556 def test_timeit_return():
556 def test_timeit_return():
557 """
557 """
558 test wether timeit -o return object
558 test wether timeit -o return object
559 """
559 """
560
560
561 res = _ip.run_line_magic('timeit','-n10 -r10 -o 1')
561 res = _ip.run_line_magic('timeit','-n10 -r10 -o 1')
562 assert(res is not None)
562 assert(res is not None)
563
563
564 def test_timeit_quiet():
564 def test_timeit_quiet():
565 """
565 """
566 test quiet option of timeit magic
566 test quiet option of timeit magic
567 """
567 """
568 with tt.AssertNotPrints("loops"):
568 with tt.AssertNotPrints("loops"):
569 _ip.run_cell("%timeit -n1 -r1 -q 1")
569 _ip.run_cell("%timeit -n1 -r1 -q 1")
570
570
571 @dec.skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
571 @dec.skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
572 def test_timeit_futures():
572 def test_timeit_futures():
573 "Test %timeit with __future__ environments"
573 "Test %timeit with __future__ environments"
574 ip = get_ipython()
574 ip = get_ipython()
575 ip.run_cell("from __future__ import division")
575 ip.run_cell("from __future__ import division")
576 with tt.AssertPrints('0.25'):
576 with tt.AssertPrints('0.25'):
577 ip.run_line_magic('timeit', '-n1 -r1 print(1/4)')
577 ip.run_line_magic('timeit', '-n1 -r1 print(1/4)')
578 ip.compile.reset_compiler_flags()
578 ip.compile.reset_compiler_flags()
579 with tt.AssertNotPrints('0.25'):
579 with tt.AssertNotPrints('0.25'):
580 ip.run_line_magic('timeit', '-n1 -r1 print(1/4)')
580 ip.run_line_magic('timeit', '-n1 -r1 print(1/4)')
581
581
582 @dec.skipif(execution.profile is None)
582 @dec.skipif(execution.profile is None)
583 def test_prun_special_syntax():
583 def test_prun_special_syntax():
584 "Test %%prun with IPython special syntax"
584 "Test %%prun with IPython special syntax"
585 @register_line_magic
585 @register_line_magic
586 def lmagic(line):
586 def lmagic(line):
587 ip = get_ipython()
587 ip = get_ipython()
588 ip.user_ns['lmagic_out'] = line
588 ip.user_ns['lmagic_out'] = line
589
589
590 # line mode test
590 # line mode test
591 _ip.run_line_magic('prun', '-q %lmagic my line')
591 _ip.run_line_magic('prun', '-q %lmagic my line')
592 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
592 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line')
593 # cell mode test
593 # cell mode test
594 _ip.run_cell_magic('prun', '-q', '%lmagic my line2')
594 _ip.run_cell_magic('prun', '-q', '%lmagic my line2')
595 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
595 nt.assert_equal(_ip.user_ns['lmagic_out'], 'my line2')
596
596
597 @dec.skipif(execution.profile is None)
597 @dec.skipif(execution.profile is None)
598 def test_prun_quotes():
598 def test_prun_quotes():
599 "Test that prun does not clobber string escapes (GH #1302)"
599 "Test that prun does not clobber string escapes (GH #1302)"
600 _ip.magic(r"prun -q x = '\t'")
600 _ip.magic(r"prun -q x = '\t'")
601 nt.assert_equal(_ip.user_ns['x'], '\t')
601 nt.assert_equal(_ip.user_ns['x'], '\t')
602
602
603 def test_extension():
603 def test_extension():
604 tmpdir = TemporaryDirectory()
604 tmpdir = TemporaryDirectory()
605 orig_ipython_dir = _ip.ipython_dir
605 orig_ipython_dir = _ip.ipython_dir
606 try:
606 try:
607 _ip.ipython_dir = tmpdir.name
607 _ip.ipython_dir = tmpdir.name
608 nt.assert_raises(ImportError, _ip.magic, "load_ext daft_extension")
608 nt.assert_raises(ImportError, _ip.magic, "load_ext daft_extension")
609 url = os.path.join(os.path.dirname(__file__), "daft_extension.py")
609 url = os.path.join(os.path.dirname(__file__), "daft_extension.py")
610 _ip.magic("install_ext %s" % url)
610 _ip.magic("install_ext %s" % url)
611 _ip.user_ns.pop('arq', None)
611 _ip.user_ns.pop('arq', None)
612 invalidate_caches() # Clear import caches
612 invalidate_caches() # Clear import caches
613 _ip.magic("load_ext daft_extension")
613 _ip.magic("load_ext daft_extension")
614 nt.assert_equal(_ip.user_ns['arq'], 185)
614 nt.assert_equal(_ip.user_ns['arq'], 185)
615 _ip.magic("unload_ext daft_extension")
615 _ip.magic("unload_ext daft_extension")
616 assert 'arq' not in _ip.user_ns
616 assert 'arq' not in _ip.user_ns
617 finally:
617 finally:
618 _ip.ipython_dir = orig_ipython_dir
618 _ip.ipython_dir = orig_ipython_dir
619 tmpdir.cleanup()
619 tmpdir.cleanup()
620
620
621
621
622 @dec.skip_without('jupyter_nbformat')
622 @dec.skip_without('nbformat')
623 def test_notebook_export_json():
623 def test_notebook_export_json():
624 _ip = get_ipython()
624 _ip = get_ipython()
625 _ip.history_manager.reset() # Clear any existing history.
625 _ip.history_manager.reset() # Clear any existing history.
626 cmds = [u"a=1", u"def b():\n return a**2", u"print('noΓ«l, Γ©tΓ©', b())"]
626 cmds = [u"a=1", u"def b():\n return a**2", u"print('noΓ«l, Γ©tΓ©', b())"]
627 for i, cmd in enumerate(cmds, start=1):
627 for i, cmd in enumerate(cmds, start=1):
628 _ip.history_manager.store_inputs(i, cmd)
628 _ip.history_manager.store_inputs(i, cmd)
629 with TemporaryDirectory() as td:
629 with TemporaryDirectory() as td:
630 outfile = os.path.join(td, "nb.ipynb")
630 outfile = os.path.join(td, "nb.ipynb")
631 _ip.magic("notebook -e %s" % outfile)
631 _ip.magic("notebook -e %s" % outfile)
632
632
633
633
634 class TestEnv(TestCase):
634 class TestEnv(TestCase):
635
635
636 def test_env(self):
636 def test_env(self):
637 env = _ip.magic("env")
637 env = _ip.magic("env")
638 self.assertTrue(isinstance(env, dict))
638 self.assertTrue(isinstance(env, dict))
639
639
640 def test_env_get_set_simple(self):
640 def test_env_get_set_simple(self):
641 env = _ip.magic("env var val1")
641 env = _ip.magic("env var val1")
642 self.assertEqual(env, None)
642 self.assertEqual(env, None)
643 self.assertEqual(os.environ['var'], 'val1')
643 self.assertEqual(os.environ['var'], 'val1')
644 self.assertEqual(_ip.magic("env var"), 'val1')
644 self.assertEqual(_ip.magic("env var"), 'val1')
645 env = _ip.magic("env var=val2")
645 env = _ip.magic("env var=val2")
646 self.assertEqual(env, None)
646 self.assertEqual(env, None)
647 self.assertEqual(os.environ['var'], 'val2')
647 self.assertEqual(os.environ['var'], 'val2')
648
648
649 def test_env_get_set_complex(self):
649 def test_env_get_set_complex(self):
650 env = _ip.magic("env var 'val1 '' 'val2")
650 env = _ip.magic("env var 'val1 '' 'val2")
651 self.assertEqual(env, None)
651 self.assertEqual(env, None)
652 self.assertEqual(os.environ['var'], "'val1 '' 'val2")
652 self.assertEqual(os.environ['var'], "'val1 '' 'val2")
653 self.assertEqual(_ip.magic("env var"), "'val1 '' 'val2")
653 self.assertEqual(_ip.magic("env var"), "'val1 '' 'val2")
654 env = _ip.magic('env var=val2 val3="val4')
654 env = _ip.magic('env var=val2 val3="val4')
655 self.assertEqual(env, None)
655 self.assertEqual(env, None)
656 self.assertEqual(os.environ['var'], 'val2 val3="val4')
656 self.assertEqual(os.environ['var'], 'val2 val3="val4')
657
657
658 def test_env_set_bad_input(self):
658 def test_env_set_bad_input(self):
659 self.assertRaises(UsageError, lambda: _ip.magic("set_env var"))
659 self.assertRaises(UsageError, lambda: _ip.magic("set_env var"))
660
660
661 def test_env_set_whitespace(self):
661 def test_env_set_whitespace(self):
662 self.assertRaises(UsageError, lambda: _ip.magic("env var A=B"))
662 self.assertRaises(UsageError, lambda: _ip.magic("env var A=B"))
663
663
664
664
665 class CellMagicTestCase(TestCase):
665 class CellMagicTestCase(TestCase):
666
666
667 def check_ident(self, magic):
667 def check_ident(self, magic):
668 # Manually called, we get the result
668 # Manually called, we get the result
669 out = _ip.run_cell_magic(magic, 'a', 'b')
669 out = _ip.run_cell_magic(magic, 'a', 'b')
670 nt.assert_equal(out, ('a','b'))
670 nt.assert_equal(out, ('a','b'))
671 # Via run_cell, it goes into the user's namespace via displayhook
671 # Via run_cell, it goes into the user's namespace via displayhook
672 _ip.run_cell('%%' + magic +' c\nd')
672 _ip.run_cell('%%' + magic +' c\nd')
673 nt.assert_equal(_ip.user_ns['_'], ('c','d'))
673 nt.assert_equal(_ip.user_ns['_'], ('c','d'))
674
674
675 def test_cell_magic_func_deco(self):
675 def test_cell_magic_func_deco(self):
676 "Cell magic using simple decorator"
676 "Cell magic using simple decorator"
677 @register_cell_magic
677 @register_cell_magic
678 def cellm(line, cell):
678 def cellm(line, cell):
679 return line, cell
679 return line, cell
680
680
681 self.check_ident('cellm')
681 self.check_ident('cellm')
682
682
683 def test_cell_magic_reg(self):
683 def test_cell_magic_reg(self):
684 "Cell magic manually registered"
684 "Cell magic manually registered"
685 def cellm(line, cell):
685 def cellm(line, cell):
686 return line, cell
686 return line, cell
687
687
688 _ip.register_magic_function(cellm, 'cell', 'cellm2')
688 _ip.register_magic_function(cellm, 'cell', 'cellm2')
689 self.check_ident('cellm2')
689 self.check_ident('cellm2')
690
690
691 def test_cell_magic_class(self):
691 def test_cell_magic_class(self):
692 "Cell magics declared via a class"
692 "Cell magics declared via a class"
693 @magics_class
693 @magics_class
694 class MyMagics(Magics):
694 class MyMagics(Magics):
695
695
696 @cell_magic
696 @cell_magic
697 def cellm3(self, line, cell):
697 def cellm3(self, line, cell):
698 return line, cell
698 return line, cell
699
699
700 _ip.register_magics(MyMagics)
700 _ip.register_magics(MyMagics)
701 self.check_ident('cellm3')
701 self.check_ident('cellm3')
702
702
703 def test_cell_magic_class2(self):
703 def test_cell_magic_class2(self):
704 "Cell magics declared via a class, #2"
704 "Cell magics declared via a class, #2"
705 @magics_class
705 @magics_class
706 class MyMagics2(Magics):
706 class MyMagics2(Magics):
707
707
708 @cell_magic('cellm4')
708 @cell_magic('cellm4')
709 def cellm33(self, line, cell):
709 def cellm33(self, line, cell):
710 return line, cell
710 return line, cell
711
711
712 _ip.register_magics(MyMagics2)
712 _ip.register_magics(MyMagics2)
713 self.check_ident('cellm4')
713 self.check_ident('cellm4')
714 # Check that nothing is registered as 'cellm33'
714 # Check that nothing is registered as 'cellm33'
715 c33 = _ip.find_cell_magic('cellm33')
715 c33 = _ip.find_cell_magic('cellm33')
716 nt.assert_equal(c33, None)
716 nt.assert_equal(c33, None)
717
717
718 def test_file():
718 def test_file():
719 """Basic %%file"""
719 """Basic %%file"""
720 ip = get_ipython()
720 ip = get_ipython()
721 with TemporaryDirectory() as td:
721 with TemporaryDirectory() as td:
722 fname = os.path.join(td, 'file1')
722 fname = os.path.join(td, 'file1')
723 ip.run_cell_magic("file", fname, u'\n'.join([
723 ip.run_cell_magic("file", fname, u'\n'.join([
724 'line1',
724 'line1',
725 'line2',
725 'line2',
726 ]))
726 ]))
727 with open(fname) as f:
727 with open(fname) as f:
728 s = f.read()
728 s = f.read()
729 nt.assert_in('line1\n', s)
729 nt.assert_in('line1\n', s)
730 nt.assert_in('line2', s)
730 nt.assert_in('line2', s)
731
731
732 def test_file_var_expand():
732 def test_file_var_expand():
733 """%%file $filename"""
733 """%%file $filename"""
734 ip = get_ipython()
734 ip = get_ipython()
735 with TemporaryDirectory() as td:
735 with TemporaryDirectory() as td:
736 fname = os.path.join(td, 'file1')
736 fname = os.path.join(td, 'file1')
737 ip.user_ns['filename'] = fname
737 ip.user_ns['filename'] = fname
738 ip.run_cell_magic("file", '$filename', u'\n'.join([
738 ip.run_cell_magic("file", '$filename', u'\n'.join([
739 'line1',
739 'line1',
740 'line2',
740 'line2',
741 ]))
741 ]))
742 with open(fname) as f:
742 with open(fname) as f:
743 s = f.read()
743 s = f.read()
744 nt.assert_in('line1\n', s)
744 nt.assert_in('line1\n', s)
745 nt.assert_in('line2', s)
745 nt.assert_in('line2', s)
746
746
747 def test_file_unicode():
747 def test_file_unicode():
748 """%%file with unicode cell"""
748 """%%file with unicode cell"""
749 ip = get_ipython()
749 ip = get_ipython()
750 with TemporaryDirectory() as td:
750 with TemporaryDirectory() as td:
751 fname = os.path.join(td, 'file1')
751 fname = os.path.join(td, 'file1')
752 ip.run_cell_magic("file", fname, u'\n'.join([
752 ip.run_cell_magic("file", fname, u'\n'.join([
753 u'linΓ©1',
753 u'linΓ©1',
754 u'linΓ©2',
754 u'linΓ©2',
755 ]))
755 ]))
756 with io.open(fname, encoding='utf-8') as f:
756 with io.open(fname, encoding='utf-8') as f:
757 s = f.read()
757 s = f.read()
758 nt.assert_in(u'linΓ©1\n', s)
758 nt.assert_in(u'linΓ©1\n', s)
759 nt.assert_in(u'linΓ©2', s)
759 nt.assert_in(u'linΓ©2', s)
760
760
761 def test_file_amend():
761 def test_file_amend():
762 """%%file -a amends files"""
762 """%%file -a amends files"""
763 ip = get_ipython()
763 ip = get_ipython()
764 with TemporaryDirectory() as td:
764 with TemporaryDirectory() as td:
765 fname = os.path.join(td, 'file2')
765 fname = os.path.join(td, 'file2')
766 ip.run_cell_magic("file", fname, u'\n'.join([
766 ip.run_cell_magic("file", fname, u'\n'.join([
767 'line1',
767 'line1',
768 'line2',
768 'line2',
769 ]))
769 ]))
770 ip.run_cell_magic("file", "-a %s" % fname, u'\n'.join([
770 ip.run_cell_magic("file", "-a %s" % fname, u'\n'.join([
771 'line3',
771 'line3',
772 'line4',
772 'line4',
773 ]))
773 ]))
774 with open(fname) as f:
774 with open(fname) as f:
775 s = f.read()
775 s = f.read()
776 nt.assert_in('line1\n', s)
776 nt.assert_in('line1\n', s)
777 nt.assert_in('line3\n', s)
777 nt.assert_in('line3\n', s)
778
778
779
779
780 def test_script_config():
780 def test_script_config():
781 ip = get_ipython()
781 ip = get_ipython()
782 ip.config.ScriptMagics.script_magics = ['whoda']
782 ip.config.ScriptMagics.script_magics = ['whoda']
783 sm = script.ScriptMagics(shell=ip)
783 sm = script.ScriptMagics(shell=ip)
784 nt.assert_in('whoda', sm.magics['cell'])
784 nt.assert_in('whoda', sm.magics['cell'])
785
785
786 @dec.skip_win32
786 @dec.skip_win32
787 def test_script_out():
787 def test_script_out():
788 ip = get_ipython()
788 ip = get_ipython()
789 ip.run_cell_magic("script", "--out output sh", "echo 'hi'")
789 ip.run_cell_magic("script", "--out output sh", "echo 'hi'")
790 nt.assert_equal(ip.user_ns['output'], 'hi\n')
790 nt.assert_equal(ip.user_ns['output'], 'hi\n')
791
791
792 @dec.skip_win32
792 @dec.skip_win32
793 def test_script_err():
793 def test_script_err():
794 ip = get_ipython()
794 ip = get_ipython()
795 ip.run_cell_magic("script", "--err error sh", "echo 'hello' >&2")
795 ip.run_cell_magic("script", "--err error sh", "echo 'hello' >&2")
796 nt.assert_equal(ip.user_ns['error'], 'hello\n')
796 nt.assert_equal(ip.user_ns['error'], 'hello\n')
797
797
798 @dec.skip_win32
798 @dec.skip_win32
799 def test_script_out_err():
799 def test_script_out_err():
800 ip = get_ipython()
800 ip = get_ipython()
801 ip.run_cell_magic("script", "--out output --err error sh", "echo 'hi'\necho 'hello' >&2")
801 ip.run_cell_magic("script", "--out output --err error sh", "echo 'hi'\necho 'hello' >&2")
802 nt.assert_equal(ip.user_ns['output'], 'hi\n')
802 nt.assert_equal(ip.user_ns['output'], 'hi\n')
803 nt.assert_equal(ip.user_ns['error'], 'hello\n')
803 nt.assert_equal(ip.user_ns['error'], 'hello\n')
804
804
805 @dec.skip_win32
805 @dec.skip_win32
806 def test_script_bg_out():
806 def test_script_bg_out():
807 ip = get_ipython()
807 ip = get_ipython()
808 ip.run_cell_magic("script", "--bg --out output sh", "echo 'hi'")
808 ip.run_cell_magic("script", "--bg --out output sh", "echo 'hi'")
809 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
809 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
810
810
811 @dec.skip_win32
811 @dec.skip_win32
812 def test_script_bg_err():
812 def test_script_bg_err():
813 ip = get_ipython()
813 ip = get_ipython()
814 ip.run_cell_magic("script", "--bg --err error sh", "echo 'hello' >&2")
814 ip.run_cell_magic("script", "--bg --err error sh", "echo 'hello' >&2")
815 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
815 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
816
816
817 @dec.skip_win32
817 @dec.skip_win32
818 def test_script_bg_out_err():
818 def test_script_bg_out_err():
819 ip = get_ipython()
819 ip = get_ipython()
820 ip.run_cell_magic("script", "--bg --out output --err error sh", "echo 'hi'\necho 'hello' >&2")
820 ip.run_cell_magic("script", "--bg --out output --err error sh", "echo 'hi'\necho 'hello' >&2")
821 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
821 nt.assert_equal(ip.user_ns['output'].read(), b'hi\n')
822 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
822 nt.assert_equal(ip.user_ns['error'].read(), b'hello\n')
823
823
824 def test_script_defaults():
824 def test_script_defaults():
825 ip = get_ipython()
825 ip = get_ipython()
826 for cmd in ['sh', 'bash', 'perl', 'ruby']:
826 for cmd in ['sh', 'bash', 'perl', 'ruby']:
827 try:
827 try:
828 find_cmd(cmd)
828 find_cmd(cmd)
829 except Exception:
829 except Exception:
830 pass
830 pass
831 else:
831 else:
832 nt.assert_in(cmd, ip.magics_manager.magics['cell'])
832 nt.assert_in(cmd, ip.magics_manager.magics['cell'])
833
833
834
834
835 @magics_class
835 @magics_class
836 class FooFoo(Magics):
836 class FooFoo(Magics):
837 """class with both %foo and %%foo magics"""
837 """class with both %foo and %%foo magics"""
838 @line_magic('foo')
838 @line_magic('foo')
839 def line_foo(self, line):
839 def line_foo(self, line):
840 "I am line foo"
840 "I am line foo"
841 pass
841 pass
842
842
843 @cell_magic("foo")
843 @cell_magic("foo")
844 def cell_foo(self, line, cell):
844 def cell_foo(self, line, cell):
845 "I am cell foo, not line foo"
845 "I am cell foo, not line foo"
846 pass
846 pass
847
847
848 def test_line_cell_info():
848 def test_line_cell_info():
849 """%%foo and %foo magics are distinguishable to inspect"""
849 """%%foo and %foo magics are distinguishable to inspect"""
850 ip = get_ipython()
850 ip = get_ipython()
851 ip.magics_manager.register(FooFoo)
851 ip.magics_manager.register(FooFoo)
852 oinfo = ip.object_inspect('foo')
852 oinfo = ip.object_inspect('foo')
853 nt.assert_true(oinfo['found'])
853 nt.assert_true(oinfo['found'])
854 nt.assert_true(oinfo['ismagic'])
854 nt.assert_true(oinfo['ismagic'])
855
855
856 oinfo = ip.object_inspect('%%foo')
856 oinfo = ip.object_inspect('%%foo')
857 nt.assert_true(oinfo['found'])
857 nt.assert_true(oinfo['found'])
858 nt.assert_true(oinfo['ismagic'])
858 nt.assert_true(oinfo['ismagic'])
859 nt.assert_equal(oinfo['docstring'], FooFoo.cell_foo.__doc__)
859 nt.assert_equal(oinfo['docstring'], FooFoo.cell_foo.__doc__)
860
860
861 oinfo = ip.object_inspect('%foo')
861 oinfo = ip.object_inspect('%foo')
862 nt.assert_true(oinfo['found'])
862 nt.assert_true(oinfo['found'])
863 nt.assert_true(oinfo['ismagic'])
863 nt.assert_true(oinfo['ismagic'])
864 nt.assert_equal(oinfo['docstring'], FooFoo.line_foo.__doc__)
864 nt.assert_equal(oinfo['docstring'], FooFoo.line_foo.__doc__)
865
865
866 def test_multiple_magics():
866 def test_multiple_magics():
867 ip = get_ipython()
867 ip = get_ipython()
868 foo1 = FooFoo(ip)
868 foo1 = FooFoo(ip)
869 foo2 = FooFoo(ip)
869 foo2 = FooFoo(ip)
870 mm = ip.magics_manager
870 mm = ip.magics_manager
871 mm.register(foo1)
871 mm.register(foo1)
872 nt.assert_true(mm.magics['line']['foo'].__self__ is foo1)
872 nt.assert_true(mm.magics['line']['foo'].__self__ is foo1)
873 mm.register(foo2)
873 mm.register(foo2)
874 nt.assert_true(mm.magics['line']['foo'].__self__ is foo2)
874 nt.assert_true(mm.magics['line']['foo'].__self__ is foo2)
875
875
876 def test_alias_magic():
876 def test_alias_magic():
877 """Test %alias_magic."""
877 """Test %alias_magic."""
878 ip = get_ipython()
878 ip = get_ipython()
879 mm = ip.magics_manager
879 mm = ip.magics_manager
880
880
881 # Basic operation: both cell and line magics are created, if possible.
881 # Basic operation: both cell and line magics are created, if possible.
882 ip.run_line_magic('alias_magic', 'timeit_alias timeit')
882 ip.run_line_magic('alias_magic', 'timeit_alias timeit')
883 nt.assert_in('timeit_alias', mm.magics['line'])
883 nt.assert_in('timeit_alias', mm.magics['line'])
884 nt.assert_in('timeit_alias', mm.magics['cell'])
884 nt.assert_in('timeit_alias', mm.magics['cell'])
885
885
886 # --cell is specified, line magic not created.
886 # --cell is specified, line magic not created.
887 ip.run_line_magic('alias_magic', '--cell timeit_cell_alias timeit')
887 ip.run_line_magic('alias_magic', '--cell timeit_cell_alias timeit')
888 nt.assert_not_in('timeit_cell_alias', mm.magics['line'])
888 nt.assert_not_in('timeit_cell_alias', mm.magics['line'])
889 nt.assert_in('timeit_cell_alias', mm.magics['cell'])
889 nt.assert_in('timeit_cell_alias', mm.magics['cell'])
890
890
891 # Test that line alias is created successfully.
891 # Test that line alias is created successfully.
892 ip.run_line_magic('alias_magic', '--line env_alias env')
892 ip.run_line_magic('alias_magic', '--line env_alias env')
893 nt.assert_equal(ip.run_line_magic('env', ''),
893 nt.assert_equal(ip.run_line_magic('env', ''),
894 ip.run_line_magic('env_alias', ''))
894 ip.run_line_magic('env_alias', ''))
895
895
896 def test_save():
896 def test_save():
897 """Test %save."""
897 """Test %save."""
898 ip = get_ipython()
898 ip = get_ipython()
899 ip.history_manager.reset() # Clear any existing history.
899 ip.history_manager.reset() # Clear any existing history.
900 cmds = [u"a=1", u"def b():\n return a**2", u"print(a, b())"]
900 cmds = [u"a=1", u"def b():\n return a**2", u"print(a, b())"]
901 for i, cmd in enumerate(cmds, start=1):
901 for i, cmd in enumerate(cmds, start=1):
902 ip.history_manager.store_inputs(i, cmd)
902 ip.history_manager.store_inputs(i, cmd)
903 with TemporaryDirectory() as tmpdir:
903 with TemporaryDirectory() as tmpdir:
904 file = os.path.join(tmpdir, "testsave.py")
904 file = os.path.join(tmpdir, "testsave.py")
905 ip.run_line_magic("save", "%s 1-10" % file)
905 ip.run_line_magic("save", "%s 1-10" % file)
906 with open(file) as f:
906 with open(file) as f:
907 content = f.read()
907 content = f.read()
908 nt.assert_equal(content.count(cmds[0]), 1)
908 nt.assert_equal(content.count(cmds[0]), 1)
909 nt.assert_in('coding: utf-8', content)
909 nt.assert_in('coding: utf-8', content)
910 ip.run_line_magic("save", "-a %s 1-10" % file)
910 ip.run_line_magic("save", "-a %s 1-10" % file)
911 with open(file) as f:
911 with open(file) as f:
912 content = f.read()
912 content = f.read()
913 nt.assert_equal(content.count(cmds[0]), 2)
913 nt.assert_equal(content.count(cmds[0]), 2)
914 nt.assert_in('coding: utf-8', content)
914 nt.assert_in('coding: utf-8', content)
915
915
916
916
917 def test_store():
917 def test_store():
918 """Test %store."""
918 """Test %store."""
919 ip = get_ipython()
919 ip = get_ipython()
920 ip.run_line_magic('load_ext', 'storemagic')
920 ip.run_line_magic('load_ext', 'storemagic')
921
921
922 # make sure the storage is empty
922 # make sure the storage is empty
923 ip.run_line_magic('store', '-z')
923 ip.run_line_magic('store', '-z')
924 ip.user_ns['var'] = 42
924 ip.user_ns['var'] = 42
925 ip.run_line_magic('store', 'var')
925 ip.run_line_magic('store', 'var')
926 ip.user_ns['var'] = 39
926 ip.user_ns['var'] = 39
927 ip.run_line_magic('store', '-r')
927 ip.run_line_magic('store', '-r')
928 nt.assert_equal(ip.user_ns['var'], 42)
928 nt.assert_equal(ip.user_ns['var'], 42)
929
929
930 ip.run_line_magic('store', '-d var')
930 ip.run_line_magic('store', '-d var')
931 ip.user_ns['var'] = 39
931 ip.user_ns['var'] = 39
932 ip.run_line_magic('store' , '-r')
932 ip.run_line_magic('store' , '-r')
933 nt.assert_equal(ip.user_ns['var'], 39)
933 nt.assert_equal(ip.user_ns['var'], 39)
934
934
935
935
936 def _run_edit_test(arg_s, exp_filename=None,
936 def _run_edit_test(arg_s, exp_filename=None,
937 exp_lineno=-1,
937 exp_lineno=-1,
938 exp_contents=None,
938 exp_contents=None,
939 exp_is_temp=None):
939 exp_is_temp=None):
940 ip = get_ipython()
940 ip = get_ipython()
941 M = code.CodeMagics(ip)
941 M = code.CodeMagics(ip)
942 last_call = ['','']
942 last_call = ['','']
943 opts,args = M.parse_options(arg_s,'prxn:')
943 opts,args = M.parse_options(arg_s,'prxn:')
944 filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call)
944 filename, lineno, is_temp = M._find_edit_target(ip, args, opts, last_call)
945
945
946 if exp_filename is not None:
946 if exp_filename is not None:
947 nt.assert_equal(exp_filename, filename)
947 nt.assert_equal(exp_filename, filename)
948 if exp_contents is not None:
948 if exp_contents is not None:
949 with io.open(filename, 'r', encoding='utf-8') as f:
949 with io.open(filename, 'r', encoding='utf-8') as f:
950 contents = f.read()
950 contents = f.read()
951 nt.assert_equal(exp_contents, contents)
951 nt.assert_equal(exp_contents, contents)
952 if exp_lineno != -1:
952 if exp_lineno != -1:
953 nt.assert_equal(exp_lineno, lineno)
953 nt.assert_equal(exp_lineno, lineno)
954 if exp_is_temp is not None:
954 if exp_is_temp is not None:
955 nt.assert_equal(exp_is_temp, is_temp)
955 nt.assert_equal(exp_is_temp, is_temp)
956
956
957
957
958 def test_edit_interactive():
958 def test_edit_interactive():
959 """%edit on interactively defined objects"""
959 """%edit on interactively defined objects"""
960 ip = get_ipython()
960 ip = get_ipython()
961 n = ip.execution_count
961 n = ip.execution_count
962 ip.run_cell(u"def foo(): return 1", store_history=True)
962 ip.run_cell(u"def foo(): return 1", store_history=True)
963
963
964 try:
964 try:
965 _run_edit_test("foo")
965 _run_edit_test("foo")
966 except code.InteractivelyDefined as e:
966 except code.InteractivelyDefined as e:
967 nt.assert_equal(e.index, n)
967 nt.assert_equal(e.index, n)
968 else:
968 else:
969 raise AssertionError("Should have raised InteractivelyDefined")
969 raise AssertionError("Should have raised InteractivelyDefined")
970
970
971
971
972 def test_edit_cell():
972 def test_edit_cell():
973 """%edit [cell id]"""
973 """%edit [cell id]"""
974 ip = get_ipython()
974 ip = get_ipython()
975
975
976 ip.run_cell(u"def foo(): return 1", store_history=True)
976 ip.run_cell(u"def foo(): return 1", store_history=True)
977
977
978 # test
978 # test
979 _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True)
979 _run_edit_test("1", exp_contents=ip.user_ns['In'][1], exp_is_temp=True)
980
980
981 def test_bookmark():
981 def test_bookmark():
982 ip = get_ipython()
982 ip = get_ipython()
983 ip.run_line_magic('bookmark', 'bmname')
983 ip.run_line_magic('bookmark', 'bmname')
984 with tt.AssertPrints('bmname'):
984 with tt.AssertPrints('bmname'):
985 ip.run_line_magic('bookmark', '-l')
985 ip.run_line_magic('bookmark', '-l')
986 ip.run_line_magic('bookmark', '-d bmname')
986 ip.run_line_magic('bookmark', '-d bmname')
987
987
988 def test_ls_magic():
988 def test_ls_magic():
989 ip = get_ipython()
989 ip = get_ipython()
990 json_formatter = ip.display_formatter.formatters['application/json']
990 json_formatter = ip.display_formatter.formatters['application/json']
991 json_formatter.enabled = True
991 json_formatter.enabled = True
992 lsmagic = ip.magic('lsmagic')
992 lsmagic = ip.magic('lsmagic')
993 with warnings.catch_warnings(record=True) as w:
993 with warnings.catch_warnings(record=True) as w:
994 j = json_formatter(lsmagic)
994 j = json_formatter(lsmagic)
995 nt.assert_equal(sorted(j), ['cell', 'line'])
995 nt.assert_equal(sorted(j), ['cell', 'line'])
996 nt.assert_equal(w, []) # no warnings
996 nt.assert_equal(w, []) # no warnings
@@ -1,517 +1,517 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Tests for code execution (%run and related), which is particularly tricky.
2 """Tests for code execution (%run and related), which is particularly tricky.
3
3
4 Because of how %run manages namespaces, and the fact that we are trying here to
4 Because of how %run manages namespaces, and the fact that we are trying here to
5 verify subtle object deletion and reference counting issues, the %run tests
5 verify subtle object deletion and reference counting issues, the %run tests
6 will be kept in this separate file. This makes it easier to aggregate in one
6 will be kept in this separate file. This makes it easier to aggregate in one
7 place the tricks needed to handle it; most other magics are much easier to test
7 place the tricks needed to handle it; most other magics are much easier to test
8 and we do so in a common test_magic file.
8 and we do so in a common test_magic file.
9 """
9 """
10
10
11 # Copyright (c) IPython Development Team.
11 # Copyright (c) IPython Development Team.
12 # Distributed under the terms of the Modified BSD License.
12 # Distributed under the terms of the Modified BSD License.
13
13
14 from __future__ import absolute_import
14 from __future__ import absolute_import
15
15
16
16
17 import functools
17 import functools
18 import os
18 import os
19 from os.path import join as pjoin
19 from os.path import join as pjoin
20 import random
20 import random
21 import sys
21 import sys
22 import tempfile
22 import tempfile
23 import textwrap
23 import textwrap
24 import unittest
24 import unittest
25
25
26 try:
26 try:
27 from unittest.mock import patch
27 from unittest.mock import patch
28 except ImportError:
28 except ImportError:
29 from mock import patch
29 from mock import patch
30
30
31 import nose.tools as nt
31 import nose.tools as nt
32 from nose import SkipTest
32 from nose import SkipTest
33
33
34 from IPython.testing import decorators as dec
34 from IPython.testing import decorators as dec
35 from IPython.testing import tools as tt
35 from IPython.testing import tools as tt
36 from IPython.utils import py3compat
36 from IPython.utils import py3compat
37 from IPython.utils.io import capture_output
37 from IPython.utils.io import capture_output
38 from IPython.utils.tempdir import TemporaryDirectory
38 from IPython.utils.tempdir import TemporaryDirectory
39 from IPython.core import debugger
39 from IPython.core import debugger
40
40
41
41
42 def doctest_refbug():
42 def doctest_refbug():
43 """Very nasty problem with references held by multiple runs of a script.
43 """Very nasty problem with references held by multiple runs of a script.
44 See: https://github.com/ipython/ipython/issues/141
44 See: https://github.com/ipython/ipython/issues/141
45
45
46 In [1]: _ip.clear_main_mod_cache()
46 In [1]: _ip.clear_main_mod_cache()
47 # random
47 # random
48
48
49 In [2]: %run refbug
49 In [2]: %run refbug
50
50
51 In [3]: call_f()
51 In [3]: call_f()
52 lowercased: hello
52 lowercased: hello
53
53
54 In [4]: %run refbug
54 In [4]: %run refbug
55
55
56 In [5]: call_f()
56 In [5]: call_f()
57 lowercased: hello
57 lowercased: hello
58 lowercased: hello
58 lowercased: hello
59 """
59 """
60
60
61
61
62 def doctest_run_builtins():
62 def doctest_run_builtins():
63 r"""Check that %run doesn't damage __builtins__.
63 r"""Check that %run doesn't damage __builtins__.
64
64
65 In [1]: import tempfile
65 In [1]: import tempfile
66
66
67 In [2]: bid1 = id(__builtins__)
67 In [2]: bid1 = id(__builtins__)
68
68
69 In [3]: fname = tempfile.mkstemp('.py')[1]
69 In [3]: fname = tempfile.mkstemp('.py')[1]
70
70
71 In [3]: f = open(fname,'w')
71 In [3]: f = open(fname,'w')
72
72
73 In [4]: dummy= f.write('pass\n')
73 In [4]: dummy= f.write('pass\n')
74
74
75 In [5]: f.flush()
75 In [5]: f.flush()
76
76
77 In [6]: t1 = type(__builtins__)
77 In [6]: t1 = type(__builtins__)
78
78
79 In [7]: %run $fname
79 In [7]: %run $fname
80
80
81 In [7]: f.close()
81 In [7]: f.close()
82
82
83 In [8]: bid2 = id(__builtins__)
83 In [8]: bid2 = id(__builtins__)
84
84
85 In [9]: t2 = type(__builtins__)
85 In [9]: t2 = type(__builtins__)
86
86
87 In [10]: t1 == t2
87 In [10]: t1 == t2
88 Out[10]: True
88 Out[10]: True
89
89
90 In [10]: bid1 == bid2
90 In [10]: bid1 == bid2
91 Out[10]: True
91 Out[10]: True
92
92
93 In [12]: try:
93 In [12]: try:
94 ....: os.unlink(fname)
94 ....: os.unlink(fname)
95 ....: except:
95 ....: except:
96 ....: pass
96 ....: pass
97 ....:
97 ....:
98 """
98 """
99
99
100
100
101 def doctest_run_option_parser():
101 def doctest_run_option_parser():
102 r"""Test option parser in %run.
102 r"""Test option parser in %run.
103
103
104 In [1]: %run print_argv.py
104 In [1]: %run print_argv.py
105 []
105 []
106
106
107 In [2]: %run print_argv.py print*.py
107 In [2]: %run print_argv.py print*.py
108 ['print_argv.py']
108 ['print_argv.py']
109
109
110 In [3]: %run -G print_argv.py print*.py
110 In [3]: %run -G print_argv.py print*.py
111 ['print*.py']
111 ['print*.py']
112
112
113 """
113 """
114
114
115
115
116 @dec.skip_win32
116 @dec.skip_win32
117 def doctest_run_option_parser_for_posix():
117 def doctest_run_option_parser_for_posix():
118 r"""Test option parser in %run (Linux/OSX specific).
118 r"""Test option parser in %run (Linux/OSX specific).
119
119
120 You need double quote to escape glob in POSIX systems:
120 You need double quote to escape glob in POSIX systems:
121
121
122 In [1]: %run print_argv.py print\\*.py
122 In [1]: %run print_argv.py print\\*.py
123 ['print*.py']
123 ['print*.py']
124
124
125 You can't use quote to escape glob in POSIX systems:
125 You can't use quote to escape glob in POSIX systems:
126
126
127 In [2]: %run print_argv.py 'print*.py'
127 In [2]: %run print_argv.py 'print*.py'
128 ['print_argv.py']
128 ['print_argv.py']
129
129
130 """
130 """
131
131
132
132
133 @dec.skip_if_not_win32
133 @dec.skip_if_not_win32
134 def doctest_run_option_parser_for_windows():
134 def doctest_run_option_parser_for_windows():
135 r"""Test option parser in %run (Windows specific).
135 r"""Test option parser in %run (Windows specific).
136
136
137 In Windows, you can't escape ``*` `by backslash:
137 In Windows, you can't escape ``*` `by backslash:
138
138
139 In [1]: %run print_argv.py print\\*.py
139 In [1]: %run print_argv.py print\\*.py
140 ['print\\*.py']
140 ['print\\*.py']
141
141
142 You can use quote to escape glob:
142 You can use quote to escape glob:
143
143
144 In [2]: %run print_argv.py 'print*.py'
144 In [2]: %run print_argv.py 'print*.py'
145 ['print*.py']
145 ['print*.py']
146
146
147 """
147 """
148
148
149
149
150 @py3compat.doctest_refactor_print
150 @py3compat.doctest_refactor_print
151 def doctest_reset_del():
151 def doctest_reset_del():
152 """Test that resetting doesn't cause errors in __del__ methods.
152 """Test that resetting doesn't cause errors in __del__ methods.
153
153
154 In [2]: class A(object):
154 In [2]: class A(object):
155 ...: def __del__(self):
155 ...: def __del__(self):
156 ...: print str("Hi")
156 ...: print str("Hi")
157 ...:
157 ...:
158
158
159 In [3]: a = A()
159 In [3]: a = A()
160
160
161 In [4]: get_ipython().reset()
161 In [4]: get_ipython().reset()
162 Hi
162 Hi
163
163
164 In [5]: 1+1
164 In [5]: 1+1
165 Out[5]: 2
165 Out[5]: 2
166 """
166 """
167
167
168 # For some tests, it will be handy to organize them in a class with a common
168 # For some tests, it will be handy to organize them in a class with a common
169 # setup that makes a temp file
169 # setup that makes a temp file
170
170
171 class TestMagicRunPass(tt.TempFileMixin):
171 class TestMagicRunPass(tt.TempFileMixin):
172
172
173 def setup(self):
173 def setup(self):
174 """Make a valid python temp file."""
174 """Make a valid python temp file."""
175 self.mktmp('pass\n')
175 self.mktmp('pass\n')
176
176
177 def run_tmpfile(self):
177 def run_tmpfile(self):
178 _ip = get_ipython()
178 _ip = get_ipython()
179 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
179 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
180 # See below and ticket https://bugs.launchpad.net/bugs/366353
180 # See below and ticket https://bugs.launchpad.net/bugs/366353
181 _ip.magic('run %s' % self.fname)
181 _ip.magic('run %s' % self.fname)
182
182
183 def run_tmpfile_p(self):
183 def run_tmpfile_p(self):
184 _ip = get_ipython()
184 _ip = get_ipython()
185 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
185 # This fails on Windows if self.tmpfile.name has spaces or "~" in it.
186 # See below and ticket https://bugs.launchpad.net/bugs/366353
186 # See below and ticket https://bugs.launchpad.net/bugs/366353
187 _ip.magic('run -p %s' % self.fname)
187 _ip.magic('run -p %s' % self.fname)
188
188
189 def test_builtins_id(self):
189 def test_builtins_id(self):
190 """Check that %run doesn't damage __builtins__ """
190 """Check that %run doesn't damage __builtins__ """
191 _ip = get_ipython()
191 _ip = get_ipython()
192 # Test that the id of __builtins__ is not modified by %run
192 # Test that the id of __builtins__ is not modified by %run
193 bid1 = id(_ip.user_ns['__builtins__'])
193 bid1 = id(_ip.user_ns['__builtins__'])
194 self.run_tmpfile()
194 self.run_tmpfile()
195 bid2 = id(_ip.user_ns['__builtins__'])
195 bid2 = id(_ip.user_ns['__builtins__'])
196 nt.assert_equal(bid1, bid2)
196 nt.assert_equal(bid1, bid2)
197
197
198 def test_builtins_type(self):
198 def test_builtins_type(self):
199 """Check that the type of __builtins__ doesn't change with %run.
199 """Check that the type of __builtins__ doesn't change with %run.
200
200
201 However, the above could pass if __builtins__ was already modified to
201 However, the above could pass if __builtins__ was already modified to
202 be a dict (it should be a module) by a previous use of %run. So we
202 be a dict (it should be a module) by a previous use of %run. So we
203 also check explicitly that it really is a module:
203 also check explicitly that it really is a module:
204 """
204 """
205 _ip = get_ipython()
205 _ip = get_ipython()
206 self.run_tmpfile()
206 self.run_tmpfile()
207 nt.assert_equal(type(_ip.user_ns['__builtins__']),type(sys))
207 nt.assert_equal(type(_ip.user_ns['__builtins__']),type(sys))
208
208
209 def test_prompts(self):
209 def test_prompts(self):
210 """Test that prompts correctly generate after %run"""
210 """Test that prompts correctly generate after %run"""
211 self.run_tmpfile()
211 self.run_tmpfile()
212 _ip = get_ipython()
212 _ip = get_ipython()
213 p2 = _ip.prompt_manager.render('in2').strip()
213 p2 = _ip.prompt_manager.render('in2').strip()
214 nt.assert_equal(p2[:3], '...')
214 nt.assert_equal(p2[:3], '...')
215
215
216 def test_run_profile( self ):
216 def test_run_profile( self ):
217 """Test that the option -p, which invokes the profiler, do not
217 """Test that the option -p, which invokes the profiler, do not
218 crash by invoking execfile"""
218 crash by invoking execfile"""
219 _ip = get_ipython()
219 _ip = get_ipython()
220 self.run_tmpfile_p()
220 self.run_tmpfile_p()
221
221
222
222
223 class TestMagicRunSimple(tt.TempFileMixin):
223 class TestMagicRunSimple(tt.TempFileMixin):
224
224
225 def test_simpledef(self):
225 def test_simpledef(self):
226 """Test that simple class definitions work."""
226 """Test that simple class definitions work."""
227 src = ("class foo: pass\n"
227 src = ("class foo: pass\n"
228 "def f(): return foo()")
228 "def f(): return foo()")
229 self.mktmp(src)
229 self.mktmp(src)
230 _ip.magic('run %s' % self.fname)
230 _ip.magic('run %s' % self.fname)
231 _ip.run_cell('t = isinstance(f(), foo)')
231 _ip.run_cell('t = isinstance(f(), foo)')
232 nt.assert_true(_ip.user_ns['t'])
232 nt.assert_true(_ip.user_ns['t'])
233
233
234 def test_obj_del(self):
234 def test_obj_del(self):
235 """Test that object's __del__ methods are called on exit."""
235 """Test that object's __del__ methods are called on exit."""
236 if sys.platform == 'win32':
236 if sys.platform == 'win32':
237 try:
237 try:
238 import win32api
238 import win32api
239 except ImportError:
239 except ImportError:
240 raise SkipTest("Test requires pywin32")
240 raise SkipTest("Test requires pywin32")
241 src = ("class A(object):\n"
241 src = ("class A(object):\n"
242 " def __del__(self):\n"
242 " def __del__(self):\n"
243 " print 'object A deleted'\n"
243 " print 'object A deleted'\n"
244 "a = A()\n")
244 "a = A()\n")
245 self.mktmp(py3compat.doctest_refactor_print(src))
245 self.mktmp(py3compat.doctest_refactor_print(src))
246 if dec.module_not_available('sqlite3'):
246 if dec.module_not_available('sqlite3'):
247 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
247 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
248 else:
248 else:
249 err = None
249 err = None
250 tt.ipexec_validate(self.fname, 'object A deleted', err)
250 tt.ipexec_validate(self.fname, 'object A deleted', err)
251
251
252 def test_aggressive_namespace_cleanup(self):
252 def test_aggressive_namespace_cleanup(self):
253 """Test that namespace cleanup is not too aggressive GH-238
253 """Test that namespace cleanup is not too aggressive GH-238
254
254
255 Returning from another run magic deletes the namespace"""
255 Returning from another run magic deletes the namespace"""
256 # see ticket https://github.com/ipython/ipython/issues/238
256 # see ticket https://github.com/ipython/ipython/issues/238
257 class secondtmp(tt.TempFileMixin): pass
257 class secondtmp(tt.TempFileMixin): pass
258 empty = secondtmp()
258 empty = secondtmp()
259 empty.mktmp('')
259 empty.mktmp('')
260 # On Windows, the filename will have \users in it, so we need to use the
260 # On Windows, the filename will have \users in it, so we need to use the
261 # repr so that the \u becomes \\u.
261 # repr so that the \u becomes \\u.
262 src = ("ip = get_ipython()\n"
262 src = ("ip = get_ipython()\n"
263 "for i in range(5):\n"
263 "for i in range(5):\n"
264 " try:\n"
264 " try:\n"
265 " ip.magic(%r)\n"
265 " ip.magic(%r)\n"
266 " except NameError as e:\n"
266 " except NameError as e:\n"
267 " print(i)\n"
267 " print(i)\n"
268 " break\n" % ('run ' + empty.fname))
268 " break\n" % ('run ' + empty.fname))
269 self.mktmp(src)
269 self.mktmp(src)
270 _ip.magic('run %s' % self.fname)
270 _ip.magic('run %s' % self.fname)
271 _ip.run_cell('ip == get_ipython()')
271 _ip.run_cell('ip == get_ipython()')
272 nt.assert_equal(_ip.user_ns['i'], 4)
272 nt.assert_equal(_ip.user_ns['i'], 4)
273
273
274 def test_run_second(self):
274 def test_run_second(self):
275 """Test that running a second file doesn't clobber the first, gh-3547
275 """Test that running a second file doesn't clobber the first, gh-3547
276 """
276 """
277 self.mktmp("avar = 1\n"
277 self.mktmp("avar = 1\n"
278 "def afunc():\n"
278 "def afunc():\n"
279 " return avar\n")
279 " return avar\n")
280
280
281 empty = tt.TempFileMixin()
281 empty = tt.TempFileMixin()
282 empty.mktmp("")
282 empty.mktmp("")
283
283
284 _ip.magic('run %s' % self.fname)
284 _ip.magic('run %s' % self.fname)
285 _ip.magic('run %s' % empty.fname)
285 _ip.magic('run %s' % empty.fname)
286 nt.assert_equal(_ip.user_ns['afunc'](), 1)
286 nt.assert_equal(_ip.user_ns['afunc'](), 1)
287
287
288 @dec.skip_win32
288 @dec.skip_win32
289 def test_tclass(self):
289 def test_tclass(self):
290 mydir = os.path.dirname(__file__)
290 mydir = os.path.dirname(__file__)
291 tc = os.path.join(mydir, 'tclass')
291 tc = os.path.join(mydir, 'tclass')
292 src = ("%%run '%s' C-first\n"
292 src = ("%%run '%s' C-first\n"
293 "%%run '%s' C-second\n"
293 "%%run '%s' C-second\n"
294 "%%run '%s' C-third\n") % (tc, tc, tc)
294 "%%run '%s' C-third\n") % (tc, tc, tc)
295 self.mktmp(src, '.ipy')
295 self.mktmp(src, '.ipy')
296 out = """\
296 out = """\
297 ARGV 1-: ['C-first']
297 ARGV 1-: ['C-first']
298 ARGV 1-: ['C-second']
298 ARGV 1-: ['C-second']
299 tclass.py: deleting object: C-first
299 tclass.py: deleting object: C-first
300 ARGV 1-: ['C-third']
300 ARGV 1-: ['C-third']
301 tclass.py: deleting object: C-second
301 tclass.py: deleting object: C-second
302 tclass.py: deleting object: C-third
302 tclass.py: deleting object: C-third
303 """
303 """
304 if dec.module_not_available('sqlite3'):
304 if dec.module_not_available('sqlite3'):
305 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
305 err = 'WARNING: IPython History requires SQLite, your history will not be saved\n'
306 else:
306 else:
307 err = None
307 err = None
308 tt.ipexec_validate(self.fname, out, err)
308 tt.ipexec_validate(self.fname, out, err)
309
309
310 def test_run_i_after_reset(self):
310 def test_run_i_after_reset(self):
311 """Check that %run -i still works after %reset (gh-693)"""
311 """Check that %run -i still works after %reset (gh-693)"""
312 src = "yy = zz\n"
312 src = "yy = zz\n"
313 self.mktmp(src)
313 self.mktmp(src)
314 _ip.run_cell("zz = 23")
314 _ip.run_cell("zz = 23")
315 _ip.magic('run -i %s' % self.fname)
315 _ip.magic('run -i %s' % self.fname)
316 nt.assert_equal(_ip.user_ns['yy'], 23)
316 nt.assert_equal(_ip.user_ns['yy'], 23)
317 _ip.magic('reset -f')
317 _ip.magic('reset -f')
318 _ip.run_cell("zz = 23")
318 _ip.run_cell("zz = 23")
319 _ip.magic('run -i %s' % self.fname)
319 _ip.magic('run -i %s' % self.fname)
320 nt.assert_equal(_ip.user_ns['yy'], 23)
320 nt.assert_equal(_ip.user_ns['yy'], 23)
321
321
322 def test_unicode(self):
322 def test_unicode(self):
323 """Check that files in odd encodings are accepted."""
323 """Check that files in odd encodings are accepted."""
324 mydir = os.path.dirname(__file__)
324 mydir = os.path.dirname(__file__)
325 na = os.path.join(mydir, 'nonascii.py')
325 na = os.path.join(mydir, 'nonascii.py')
326 _ip.magic('run "%s"' % na)
326 _ip.magic('run "%s"' % na)
327 nt.assert_equal(_ip.user_ns['u'], u'ΠŽΡ‚β„–Π€')
327 nt.assert_equal(_ip.user_ns['u'], u'ΠŽΡ‚β„–Π€')
328
328
329 def test_run_py_file_attribute(self):
329 def test_run_py_file_attribute(self):
330 """Test handling of `__file__` attribute in `%run <file>.py`."""
330 """Test handling of `__file__` attribute in `%run <file>.py`."""
331 src = "t = __file__\n"
331 src = "t = __file__\n"
332 self.mktmp(src)
332 self.mktmp(src)
333 _missing = object()
333 _missing = object()
334 file1 = _ip.user_ns.get('__file__', _missing)
334 file1 = _ip.user_ns.get('__file__', _missing)
335 _ip.magic('run %s' % self.fname)
335 _ip.magic('run %s' % self.fname)
336 file2 = _ip.user_ns.get('__file__', _missing)
336 file2 = _ip.user_ns.get('__file__', _missing)
337
337
338 # Check that __file__ was equal to the filename in the script's
338 # Check that __file__ was equal to the filename in the script's
339 # namespace.
339 # namespace.
340 nt.assert_equal(_ip.user_ns['t'], self.fname)
340 nt.assert_equal(_ip.user_ns['t'], self.fname)
341
341
342 # Check that __file__ was not leaked back into user_ns.
342 # Check that __file__ was not leaked back into user_ns.
343 nt.assert_equal(file1, file2)
343 nt.assert_equal(file1, file2)
344
344
345 def test_run_ipy_file_attribute(self):
345 def test_run_ipy_file_attribute(self):
346 """Test handling of `__file__` attribute in `%run <file.ipy>`."""
346 """Test handling of `__file__` attribute in `%run <file.ipy>`."""
347 src = "t = __file__\n"
347 src = "t = __file__\n"
348 self.mktmp(src, ext='.ipy')
348 self.mktmp(src, ext='.ipy')
349 _missing = object()
349 _missing = object()
350 file1 = _ip.user_ns.get('__file__', _missing)
350 file1 = _ip.user_ns.get('__file__', _missing)
351 _ip.magic('run %s' % self.fname)
351 _ip.magic('run %s' % self.fname)
352 file2 = _ip.user_ns.get('__file__', _missing)
352 file2 = _ip.user_ns.get('__file__', _missing)
353
353
354 # Check that __file__ was equal to the filename in the script's
354 # Check that __file__ was equal to the filename in the script's
355 # namespace.
355 # namespace.
356 nt.assert_equal(_ip.user_ns['t'], self.fname)
356 nt.assert_equal(_ip.user_ns['t'], self.fname)
357
357
358 # Check that __file__ was not leaked back into user_ns.
358 # Check that __file__ was not leaked back into user_ns.
359 nt.assert_equal(file1, file2)
359 nt.assert_equal(file1, file2)
360
360
361 def test_run_formatting(self):
361 def test_run_formatting(self):
362 """ Test that %run -t -N<N> does not raise a TypeError for N > 1."""
362 """ Test that %run -t -N<N> does not raise a TypeError for N > 1."""
363 src = "pass"
363 src = "pass"
364 self.mktmp(src)
364 self.mktmp(src)
365 _ip.magic('run -t -N 1 %s' % self.fname)
365 _ip.magic('run -t -N 1 %s' % self.fname)
366 _ip.magic('run -t -N 10 %s' % self.fname)
366 _ip.magic('run -t -N 10 %s' % self.fname)
367
367
368 def test_ignore_sys_exit(self):
368 def test_ignore_sys_exit(self):
369 """Test the -e option to ignore sys.exit()"""
369 """Test the -e option to ignore sys.exit()"""
370 src = "import sys; sys.exit(1)"
370 src = "import sys; sys.exit(1)"
371 self.mktmp(src)
371 self.mktmp(src)
372 with tt.AssertPrints('SystemExit'):
372 with tt.AssertPrints('SystemExit'):
373 _ip.magic('run %s' % self.fname)
373 _ip.magic('run %s' % self.fname)
374
374
375 with tt.AssertNotPrints('SystemExit'):
375 with tt.AssertNotPrints('SystemExit'):
376 _ip.magic('run -e %s' % self.fname)
376 _ip.magic('run -e %s' % self.fname)
377
377
378 @dec.skip_without('jupyter_nbformat') # Requires jsonschema
378 @dec.skip_without('nbformat') # Requires jsonschema
379 def test_run_nb(self):
379 def test_run_nb(self):
380 """Test %run notebook.ipynb"""
380 """Test %run notebook.ipynb"""
381 from jupyter_nbformat import v4, writes
381 from nbformat import v4, writes
382 nb = v4.new_notebook(
382 nb = v4.new_notebook(
383 cells=[
383 cells=[
384 v4.new_markdown_cell("The Ultimate Question of Everything"),
384 v4.new_markdown_cell("The Ultimate Question of Everything"),
385 v4.new_code_cell("answer=42")
385 v4.new_code_cell("answer=42")
386 ]
386 ]
387 )
387 )
388 src = writes(nb, version=4)
388 src = writes(nb, version=4)
389 self.mktmp(src, ext='.ipynb')
389 self.mktmp(src, ext='.ipynb')
390
390
391 _ip.magic("run %s" % self.fname)
391 _ip.magic("run %s" % self.fname)
392
392
393 nt.assert_equal(_ip.user_ns['answer'], 42)
393 nt.assert_equal(_ip.user_ns['answer'], 42)
394
394
395
395
396
396
397 class TestMagicRunWithPackage(unittest.TestCase):
397 class TestMagicRunWithPackage(unittest.TestCase):
398
398
399 def writefile(self, name, content):
399 def writefile(self, name, content):
400 path = os.path.join(self.tempdir.name, name)
400 path = os.path.join(self.tempdir.name, name)
401 d = os.path.dirname(path)
401 d = os.path.dirname(path)
402 if not os.path.isdir(d):
402 if not os.path.isdir(d):
403 os.makedirs(d)
403 os.makedirs(d)
404 with open(path, 'w') as f:
404 with open(path, 'w') as f:
405 f.write(textwrap.dedent(content))
405 f.write(textwrap.dedent(content))
406
406
407 def setUp(self):
407 def setUp(self):
408 self.package = package = 'tmp{0}'.format(repr(random.random())[2:])
408 self.package = package = 'tmp{0}'.format(repr(random.random())[2:])
409 """Temporary valid python package name."""
409 """Temporary valid python package name."""
410
410
411 self.value = int(random.random() * 10000)
411 self.value = int(random.random() * 10000)
412
412
413 self.tempdir = TemporaryDirectory()
413 self.tempdir = TemporaryDirectory()
414 self.__orig_cwd = py3compat.getcwd()
414 self.__orig_cwd = py3compat.getcwd()
415 sys.path.insert(0, self.tempdir.name)
415 sys.path.insert(0, self.tempdir.name)
416
416
417 self.writefile(os.path.join(package, '__init__.py'), '')
417 self.writefile(os.path.join(package, '__init__.py'), '')
418 self.writefile(os.path.join(package, 'sub.py'), """
418 self.writefile(os.path.join(package, 'sub.py'), """
419 x = {0!r}
419 x = {0!r}
420 """.format(self.value))
420 """.format(self.value))
421 self.writefile(os.path.join(package, 'relative.py'), """
421 self.writefile(os.path.join(package, 'relative.py'), """
422 from .sub import x
422 from .sub import x
423 """)
423 """)
424 self.writefile(os.path.join(package, 'absolute.py'), """
424 self.writefile(os.path.join(package, 'absolute.py'), """
425 from {0}.sub import x
425 from {0}.sub import x
426 """.format(package))
426 """.format(package))
427
427
428 def tearDown(self):
428 def tearDown(self):
429 os.chdir(self.__orig_cwd)
429 os.chdir(self.__orig_cwd)
430 sys.path[:] = [p for p in sys.path if p != self.tempdir.name]
430 sys.path[:] = [p for p in sys.path if p != self.tempdir.name]
431 self.tempdir.cleanup()
431 self.tempdir.cleanup()
432
432
433 def check_run_submodule(self, submodule, opts=''):
433 def check_run_submodule(self, submodule, opts=''):
434 _ip.user_ns.pop('x', None)
434 _ip.user_ns.pop('x', None)
435 _ip.magic('run {2} -m {0}.{1}'.format(self.package, submodule, opts))
435 _ip.magic('run {2} -m {0}.{1}'.format(self.package, submodule, opts))
436 self.assertEqual(_ip.user_ns['x'], self.value,
436 self.assertEqual(_ip.user_ns['x'], self.value,
437 'Variable `x` is not loaded from module `{0}`.'
437 'Variable `x` is not loaded from module `{0}`.'
438 .format(submodule))
438 .format(submodule))
439
439
440 def test_run_submodule_with_absolute_import(self):
440 def test_run_submodule_with_absolute_import(self):
441 self.check_run_submodule('absolute')
441 self.check_run_submodule('absolute')
442
442
443 def test_run_submodule_with_relative_import(self):
443 def test_run_submodule_with_relative_import(self):
444 """Run submodule that has a relative import statement (#2727)."""
444 """Run submodule that has a relative import statement (#2727)."""
445 self.check_run_submodule('relative')
445 self.check_run_submodule('relative')
446
446
447 def test_prun_submodule_with_absolute_import(self):
447 def test_prun_submodule_with_absolute_import(self):
448 self.check_run_submodule('absolute', '-p')
448 self.check_run_submodule('absolute', '-p')
449
449
450 def test_prun_submodule_with_relative_import(self):
450 def test_prun_submodule_with_relative_import(self):
451 self.check_run_submodule('relative', '-p')
451 self.check_run_submodule('relative', '-p')
452
452
453 def with_fake_debugger(func):
453 def with_fake_debugger(func):
454 @functools.wraps(func)
454 @functools.wraps(func)
455 def wrapper(*args, **kwds):
455 def wrapper(*args, **kwds):
456 with patch.object(debugger.Pdb, 'run', staticmethod(eval)):
456 with patch.object(debugger.Pdb, 'run', staticmethod(eval)):
457 return func(*args, **kwds)
457 return func(*args, **kwds)
458 return wrapper
458 return wrapper
459
459
460 @with_fake_debugger
460 @with_fake_debugger
461 def test_debug_run_submodule_with_absolute_import(self):
461 def test_debug_run_submodule_with_absolute_import(self):
462 self.check_run_submodule('absolute', '-d')
462 self.check_run_submodule('absolute', '-d')
463
463
464 @with_fake_debugger
464 @with_fake_debugger
465 def test_debug_run_submodule_with_relative_import(self):
465 def test_debug_run_submodule_with_relative_import(self):
466 self.check_run_submodule('relative', '-d')
466 self.check_run_submodule('relative', '-d')
467
467
468 def test_run__name__():
468 def test_run__name__():
469 with TemporaryDirectory() as td:
469 with TemporaryDirectory() as td:
470 path = pjoin(td, 'foo.py')
470 path = pjoin(td, 'foo.py')
471 with open(path, 'w') as f:
471 with open(path, 'w') as f:
472 f.write("q = __name__")
472 f.write("q = __name__")
473
473
474 _ip.user_ns.pop('q', None)
474 _ip.user_ns.pop('q', None)
475 _ip.magic('run {}'.format(path))
475 _ip.magic('run {}'.format(path))
476 nt.assert_equal(_ip.user_ns.pop('q'), '__main__')
476 nt.assert_equal(_ip.user_ns.pop('q'), '__main__')
477
477
478 _ip.magic('run -n {}'.format(path))
478 _ip.magic('run -n {}'.format(path))
479 nt.assert_equal(_ip.user_ns.pop('q'), 'foo')
479 nt.assert_equal(_ip.user_ns.pop('q'), 'foo')
480
480
481 def test_run_tb():
481 def test_run_tb():
482 """Test traceback offset in %run"""
482 """Test traceback offset in %run"""
483 with TemporaryDirectory() as td:
483 with TemporaryDirectory() as td:
484 path = pjoin(td, 'foo.py')
484 path = pjoin(td, 'foo.py')
485 with open(path, 'w') as f:
485 with open(path, 'w') as f:
486 f.write('\n'.join([
486 f.write('\n'.join([
487 "def foo():",
487 "def foo():",
488 " return bar()",
488 " return bar()",
489 "def bar():",
489 "def bar():",
490 " raise RuntimeError('hello!')",
490 " raise RuntimeError('hello!')",
491 "foo()",
491 "foo()",
492 ]))
492 ]))
493 with capture_output() as io:
493 with capture_output() as io:
494 _ip.magic('run {}'.format(path))
494 _ip.magic('run {}'.format(path))
495 out = io.stdout
495 out = io.stdout
496 nt.assert_not_in("execfile", out)
496 nt.assert_not_in("execfile", out)
497 nt.assert_in("RuntimeError", out)
497 nt.assert_in("RuntimeError", out)
498 nt.assert_equal(out.count("---->"), 3)
498 nt.assert_equal(out.count("---->"), 3)
499
499
500 @dec.knownfailureif(sys.platform == 'win32', "writes to io.stdout aren't captured on Windows")
500 @dec.knownfailureif(sys.platform == 'win32', "writes to io.stdout aren't captured on Windows")
501 def test_script_tb():
501 def test_script_tb():
502 """Test traceback offset in `ipython script.py`"""
502 """Test traceback offset in `ipython script.py`"""
503 with TemporaryDirectory() as td:
503 with TemporaryDirectory() as td:
504 path = pjoin(td, 'foo.py')
504 path = pjoin(td, 'foo.py')
505 with open(path, 'w') as f:
505 with open(path, 'w') as f:
506 f.write('\n'.join([
506 f.write('\n'.join([
507 "def foo():",
507 "def foo():",
508 " return bar()",
508 " return bar()",
509 "def bar():",
509 "def bar():",
510 " raise RuntimeError('hello!')",
510 " raise RuntimeError('hello!')",
511 "foo()",
511 "foo()",
512 ]))
512 ]))
513 out, err = tt.ipexec(path)
513 out, err = tt.ipexec(path)
514 nt.assert_not_in("execfile", out)
514 nt.assert_not_in("execfile", out)
515 nt.assert_in("RuntimeError", out)
515 nt.assert_in("RuntimeError", out)
516 nt.assert_equal(out.count("---->"), 3)
516 nt.assert_equal(out.count("---->"), 3)
517
517
@@ -1,19 +1,19 b''
1 """
1 """
2 Shim to maintain backwards compatibility with old IPython.nbformat imports.
2 Shim to maintain backwards compatibility with old IPython.nbformat imports.
3 """
3 """
4 # Copyright (c) IPython Development Team.
4 # Copyright (c) IPython Development Team.
5 # Distributed under the terms of the Modified BSD License.
5 # Distributed under the terms of the Modified BSD License.
6
6
7 import sys
7 import sys
8 from warnings import warn
8 from warnings import warn
9
9
10 warn("The `IPython.nbformat` package has been deprecated. "
10 warn("The `IPython.nbformat` package has been deprecated. "
11 "You should import from jupyter_nbformat instead.")
11 "You should import from nbformat instead.")
12
12
13 from IPython.utils.shimmodule import ShimModule
13 from IPython.utils.shimmodule import ShimModule
14
14
15 # Unconditionally insert the shim into sys.modules so that further import calls
15 # Unconditionally insert the shim into sys.modules so that further import calls
16 # trigger the custom attribute access above
16 # trigger the custom attribute access above
17
17
18 sys.modules['IPython.nbformat'] = ShimModule(
18 sys.modules['IPython.nbformat'] = ShimModule(
19 src='IPython.nbformat', mirror='jupyter_nbformat')
19 src='IPython.nbformat', mirror='nbformat')
@@ -1,374 +1,374 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # encoding: utf-8
2 # encoding: utf-8
3 """
3 """
4 The :class:`~IPython.core.application.Application` object for the command
4 The :class:`~IPython.core.application.Application` object for the command
5 line :command:`ipython` program.
5 line :command:`ipython` program.
6 """
6 """
7
7
8 # Copyright (c) IPython Development Team.
8 # Copyright (c) IPython Development Team.
9 # Distributed under the terms of the Modified BSD License.
9 # Distributed under the terms of the Modified BSD License.
10
10
11 from __future__ import absolute_import
11 from __future__ import absolute_import
12 from __future__ import print_function
12 from __future__ import print_function
13
13
14 import logging
14 import logging
15 import os
15 import os
16 import sys
16 import sys
17
17
18 from traitlets.config.loader import Config
18 from traitlets.config.loader import Config
19 from traitlets.config.application import boolean_flag, catch_config_error, Application
19 from traitlets.config.application import boolean_flag, catch_config_error, Application
20 from IPython.core import release
20 from IPython.core import release
21 from IPython.core import usage
21 from IPython.core import usage
22 from IPython.core.completer import IPCompleter
22 from IPython.core.completer import IPCompleter
23 from IPython.core.crashhandler import CrashHandler
23 from IPython.core.crashhandler import CrashHandler
24 from IPython.core.formatters import PlainTextFormatter
24 from IPython.core.formatters import PlainTextFormatter
25 from IPython.core.history import HistoryManager
25 from IPython.core.history import HistoryManager
26 from IPython.core.prompts import PromptManager
26 from IPython.core.prompts import PromptManager
27 from IPython.core.application import (
27 from IPython.core.application import (
28 ProfileDir, BaseIPythonApplication, base_flags, base_aliases
28 ProfileDir, BaseIPythonApplication, base_flags, base_aliases
29 )
29 )
30 from IPython.core.magics import ScriptMagics
30 from IPython.core.magics import ScriptMagics
31 from IPython.core.shellapp import (
31 from IPython.core.shellapp import (
32 InteractiveShellApp, shell_flags, shell_aliases
32 InteractiveShellApp, shell_flags, shell_aliases
33 )
33 )
34 from IPython.extensions.storemagic import StoreMagics
34 from IPython.extensions.storemagic import StoreMagics
35 from IPython.terminal.interactiveshell import TerminalInteractiveShell
35 from IPython.terminal.interactiveshell import TerminalInteractiveShell
36 from IPython.utils import warn
36 from IPython.utils import warn
37 from IPython.paths import get_ipython_dir
37 from IPython.paths import get_ipython_dir
38 from traitlets import (
38 from traitlets import (
39 Bool, List, Dict,
39 Bool, List, Dict,
40 )
40 )
41
41
42 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
43 # Globals, utilities and helpers
43 # Globals, utilities and helpers
44 #-----------------------------------------------------------------------------
44 #-----------------------------------------------------------------------------
45
45
46 _examples = """
46 _examples = """
47 ipython --matplotlib # enable matplotlib integration
47 ipython --matplotlib # enable matplotlib integration
48 ipython --matplotlib=qt # enable matplotlib integration with qt4 backend
48 ipython --matplotlib=qt # enable matplotlib integration with qt4 backend
49
49
50 ipython --log-level=DEBUG # set logging to DEBUG
50 ipython --log-level=DEBUG # set logging to DEBUG
51 ipython --profile=foo # start with profile foo
51 ipython --profile=foo # start with profile foo
52
52
53 ipython qtconsole # start the qtconsole GUI application
53 ipython qtconsole # start the qtconsole GUI application
54 ipython help qtconsole # show the help for the qtconsole subcmd
54 ipython help qtconsole # show the help for the qtconsole subcmd
55
55
56 ipython console # start the terminal-based console application
56 ipython console # start the terminal-based console application
57 ipython help console # show the help for the console subcmd
57 ipython help console # show the help for the console subcmd
58
58
59 ipython notebook # start the IPython notebook
59 ipython notebook # start the IPython notebook
60 ipython help notebook # show the help for the notebook subcmd
60 ipython help notebook # show the help for the notebook subcmd
61
61
62 ipython profile create foo # create profile foo w/ default config files
62 ipython profile create foo # create profile foo w/ default config files
63 ipython help profile # show the help for the profile subcmd
63 ipython help profile # show the help for the profile subcmd
64
64
65 ipython locate # print the path to the IPython directory
65 ipython locate # print the path to the IPython directory
66 ipython locate profile foo # print the path to the directory for profile `foo`
66 ipython locate profile foo # print the path to the directory for profile `foo`
67
67
68 ipython nbconvert # convert notebooks to/from other formats
68 ipython nbconvert # convert notebooks to/from other formats
69 """
69 """
70
70
71 #-----------------------------------------------------------------------------
71 #-----------------------------------------------------------------------------
72 # Crash handler for this application
72 # Crash handler for this application
73 #-----------------------------------------------------------------------------
73 #-----------------------------------------------------------------------------
74
74
75 class IPAppCrashHandler(CrashHandler):
75 class IPAppCrashHandler(CrashHandler):
76 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
76 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
77
77
78 def __init__(self, app):
78 def __init__(self, app):
79 contact_name = release.author
79 contact_name = release.author
80 contact_email = release.author_email
80 contact_email = release.author_email
81 bug_tracker = 'https://github.com/ipython/ipython/issues'
81 bug_tracker = 'https://github.com/ipython/ipython/issues'
82 super(IPAppCrashHandler,self).__init__(
82 super(IPAppCrashHandler,self).__init__(
83 app, contact_name, contact_email, bug_tracker
83 app, contact_name, contact_email, bug_tracker
84 )
84 )
85
85
86 def make_report(self,traceback):
86 def make_report(self,traceback):
87 """Return a string containing a crash report."""
87 """Return a string containing a crash report."""
88
88
89 sec_sep = self.section_sep
89 sec_sep = self.section_sep
90 # Start with parent report
90 # Start with parent report
91 report = [super(IPAppCrashHandler, self).make_report(traceback)]
91 report = [super(IPAppCrashHandler, self).make_report(traceback)]
92 # Add interactive-specific info we may have
92 # Add interactive-specific info we may have
93 rpt_add = report.append
93 rpt_add = report.append
94 try:
94 try:
95 rpt_add(sec_sep+"History of session input:")
95 rpt_add(sec_sep+"History of session input:")
96 for line in self.app.shell.user_ns['_ih']:
96 for line in self.app.shell.user_ns['_ih']:
97 rpt_add(line)
97 rpt_add(line)
98 rpt_add('\n*** Last line of input (may not be in above history):\n')
98 rpt_add('\n*** Last line of input (may not be in above history):\n')
99 rpt_add(self.app.shell._last_input_line+'\n')
99 rpt_add(self.app.shell._last_input_line+'\n')
100 except:
100 except:
101 pass
101 pass
102
102
103 return ''.join(report)
103 return ''.join(report)
104
104
105 #-----------------------------------------------------------------------------
105 #-----------------------------------------------------------------------------
106 # Aliases and Flags
106 # Aliases and Flags
107 #-----------------------------------------------------------------------------
107 #-----------------------------------------------------------------------------
108 flags = dict(base_flags)
108 flags = dict(base_flags)
109 flags.update(shell_flags)
109 flags.update(shell_flags)
110 frontend_flags = {}
110 frontend_flags = {}
111 addflag = lambda *args: frontend_flags.update(boolean_flag(*args))
111 addflag = lambda *args: frontend_flags.update(boolean_flag(*args))
112 addflag('autoedit-syntax', 'TerminalInteractiveShell.autoedit_syntax',
112 addflag('autoedit-syntax', 'TerminalInteractiveShell.autoedit_syntax',
113 'Turn on auto editing of files with syntax errors.',
113 'Turn on auto editing of files with syntax errors.',
114 'Turn off auto editing of files with syntax errors.'
114 'Turn off auto editing of files with syntax errors.'
115 )
115 )
116 addflag('banner', 'TerminalIPythonApp.display_banner',
116 addflag('banner', 'TerminalIPythonApp.display_banner',
117 "Display a banner upon starting IPython.",
117 "Display a banner upon starting IPython.",
118 "Don't display a banner upon starting IPython."
118 "Don't display a banner upon starting IPython."
119 )
119 )
120 addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
120 addflag('confirm-exit', 'TerminalInteractiveShell.confirm_exit',
121 """Set to confirm when you try to exit IPython with an EOF (Control-D
121 """Set to confirm when you try to exit IPython with an EOF (Control-D
122 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
122 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
123 you can force a direct exit without any confirmation.""",
123 you can force a direct exit without any confirmation.""",
124 "Don't prompt the user when exiting."
124 "Don't prompt the user when exiting."
125 )
125 )
126 addflag('term-title', 'TerminalInteractiveShell.term_title',
126 addflag('term-title', 'TerminalInteractiveShell.term_title',
127 "Enable auto setting the terminal title.",
127 "Enable auto setting the terminal title.",
128 "Disable auto setting the terminal title."
128 "Disable auto setting the terminal title."
129 )
129 )
130 classic_config = Config()
130 classic_config = Config()
131 classic_config.InteractiveShell.cache_size = 0
131 classic_config.InteractiveShell.cache_size = 0
132 classic_config.PlainTextFormatter.pprint = False
132 classic_config.PlainTextFormatter.pprint = False
133 classic_config.PromptManager.in_template = '>>> '
133 classic_config.PromptManager.in_template = '>>> '
134 classic_config.PromptManager.in2_template = '... '
134 classic_config.PromptManager.in2_template = '... '
135 classic_config.PromptManager.out_template = ''
135 classic_config.PromptManager.out_template = ''
136 classic_config.InteractiveShell.separate_in = ''
136 classic_config.InteractiveShell.separate_in = ''
137 classic_config.InteractiveShell.separate_out = ''
137 classic_config.InteractiveShell.separate_out = ''
138 classic_config.InteractiveShell.separate_out2 = ''
138 classic_config.InteractiveShell.separate_out2 = ''
139 classic_config.InteractiveShell.colors = 'NoColor'
139 classic_config.InteractiveShell.colors = 'NoColor'
140 classic_config.InteractiveShell.xmode = 'Plain'
140 classic_config.InteractiveShell.xmode = 'Plain'
141
141
142 frontend_flags['classic']=(
142 frontend_flags['classic']=(
143 classic_config,
143 classic_config,
144 "Gives IPython a similar feel to the classic Python prompt."
144 "Gives IPython a similar feel to the classic Python prompt."
145 )
145 )
146 # # log doesn't make so much sense this way anymore
146 # # log doesn't make so much sense this way anymore
147 # paa('--log','-l',
147 # paa('--log','-l',
148 # action='store_true', dest='InteractiveShell.logstart',
148 # action='store_true', dest='InteractiveShell.logstart',
149 # help="Start logging to the default log file (./ipython_log.py).")
149 # help="Start logging to the default log file (./ipython_log.py).")
150 #
150 #
151 # # quick is harder to implement
151 # # quick is harder to implement
152 frontend_flags['quick']=(
152 frontend_flags['quick']=(
153 {'TerminalIPythonApp' : {'quick' : True}},
153 {'TerminalIPythonApp' : {'quick' : True}},
154 "Enable quick startup with no config files."
154 "Enable quick startup with no config files."
155 )
155 )
156
156
157 frontend_flags['i'] = (
157 frontend_flags['i'] = (
158 {'TerminalIPythonApp' : {'force_interact' : True}},
158 {'TerminalIPythonApp' : {'force_interact' : True}},
159 """If running code from the command line, become interactive afterwards."""
159 """If running code from the command line, become interactive afterwards."""
160 )
160 )
161 flags.update(frontend_flags)
161 flags.update(frontend_flags)
162
162
163 aliases = dict(base_aliases)
163 aliases = dict(base_aliases)
164 aliases.update(shell_aliases)
164 aliases.update(shell_aliases)
165
165
166 #-----------------------------------------------------------------------------
166 #-----------------------------------------------------------------------------
167 # Main classes and functions
167 # Main classes and functions
168 #-----------------------------------------------------------------------------
168 #-----------------------------------------------------------------------------
169
169
170
170
171 class LocateIPythonApp(BaseIPythonApplication):
171 class LocateIPythonApp(BaseIPythonApplication):
172 description = """print the path to the IPython dir"""
172 description = """print the path to the IPython dir"""
173 subcommands = Dict(dict(
173 subcommands = Dict(dict(
174 profile=('IPython.core.profileapp.ProfileLocate',
174 profile=('IPython.core.profileapp.ProfileLocate',
175 "print the path to an IPython profile directory",
175 "print the path to an IPython profile directory",
176 ),
176 ),
177 ))
177 ))
178 def start(self):
178 def start(self):
179 if self.subapp is not None:
179 if self.subapp is not None:
180 return self.subapp.start()
180 return self.subapp.start()
181 else:
181 else:
182 print(self.ipython_dir)
182 print(self.ipython_dir)
183
183
184
184
185 class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
185 class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):
186 name = u'ipython'
186 name = u'ipython'
187 description = usage.cl_usage
187 description = usage.cl_usage
188 crash_handler_class = IPAppCrashHandler
188 crash_handler_class = IPAppCrashHandler
189 examples = _examples
189 examples = _examples
190
190
191 flags = Dict(flags)
191 flags = Dict(flags)
192 aliases = Dict(aliases)
192 aliases = Dict(aliases)
193 classes = List()
193 classes = List()
194 def _classes_default(self):
194 def _classes_default(self):
195 """This has to be in a method, for TerminalIPythonApp to be available."""
195 """This has to be in a method, for TerminalIPythonApp to be available."""
196 return [
196 return [
197 InteractiveShellApp, # ShellApp comes before TerminalApp, because
197 InteractiveShellApp, # ShellApp comes before TerminalApp, because
198 self.__class__, # it will also affect subclasses (e.g. QtConsole)
198 self.__class__, # it will also affect subclasses (e.g. QtConsole)
199 TerminalInteractiveShell,
199 TerminalInteractiveShell,
200 PromptManager,
200 PromptManager,
201 HistoryManager,
201 HistoryManager,
202 ProfileDir,
202 ProfileDir,
203 PlainTextFormatter,
203 PlainTextFormatter,
204 IPCompleter,
204 IPCompleter,
205 ScriptMagics,
205 ScriptMagics,
206 StoreMagics,
206 StoreMagics,
207 ]
207 ]
208
208
209 subcommands = dict(
209 subcommands = dict(
210 qtconsole=('qtconsole.console.qtconsoleapp.JupyterQtConsoleApp',
210 qtconsole=('qtconsole.console.qtconsoleapp.JupyterQtConsoleApp',
211 """DEPRECATD: Launch the Jupyter Qt Console."""
211 """DEPRECATD: Launch the Jupyter Qt Console."""
212 ),
212 ),
213 notebook=('jupyter_notebook.notebookapp.NotebookApp',
213 notebook=('jupyter_notebook.notebookapp.NotebookApp',
214 """DEPRECATED: Launch the IPython HTML Notebook Server."""
214 """DEPRECATED: Launch the IPython HTML Notebook Server."""
215 ),
215 ),
216 profile = ("IPython.core.profileapp.ProfileApp",
216 profile = ("IPython.core.profileapp.ProfileApp",
217 "Create and manage IPython profiles."
217 "Create and manage IPython profiles."
218 ),
218 ),
219 kernel = ("ipykernel.kernelapp.IPKernelApp",
219 kernel = ("ipykernel.kernelapp.IPKernelApp",
220 "Start a kernel without an attached frontend."
220 "Start a kernel without an attached frontend."
221 ),
221 ),
222 console=('jupyter_console.app.ZMQTerminalIPythonApp',
222 console=('jupyter_console.app.ZMQTerminalIPythonApp',
223 """DEPRECATED: Launch the Jupyter terminal-based Console."""
223 """DEPRECATED: Launch the Jupyter terminal-based Console."""
224 ),
224 ),
225 locate=('IPython.terminal.ipapp.LocateIPythonApp',
225 locate=('IPython.terminal.ipapp.LocateIPythonApp',
226 LocateIPythonApp.description
226 LocateIPythonApp.description
227 ),
227 ),
228 history=('IPython.core.historyapp.HistoryApp',
228 history=('IPython.core.historyapp.HistoryApp',
229 "Manage the IPython history database."
229 "Manage the IPython history database."
230 ),
230 ),
231 nbconvert=('nbconvert.nbconvertapp.NbConvertApp',
231 nbconvert=('nbconvert.nbconvertapp.NbConvertApp',
232 "DEPRECATED: Convert notebooks to/from other formats."
232 "DEPRECATED: Convert notebooks to/from other formats."
233 ),
233 ),
234 trust=('jupyter_nbformat.sign.TrustNotebookApp',
234 trust=('nbformat.sign.TrustNotebookApp',
235 "DEPRECATED: Sign notebooks to trust their potentially unsafe contents at load."
235 "DEPRECATED: Sign notebooks to trust their potentially unsafe contents at load."
236 ),
236 ),
237 kernelspec=('jupyter_client.kernelspecapp.KernelSpecApp',
237 kernelspec=('jupyter_client.kernelspecapp.KernelSpecApp',
238 "DEPRECATED: Manage Jupyter kernel specifications."
238 "DEPRECATED: Manage Jupyter kernel specifications."
239 ),
239 ),
240 )
240 )
241 subcommands['install-nbextension'] = (
241 subcommands['install-nbextension'] = (
242 "jupyter_notebook.nbextensions.NBExtensionApp",
242 "jupyter_notebook.nbextensions.NBExtensionApp",
243 "DEPRECATED: Install Jupyter notebook extension files"
243 "DEPRECATED: Install Jupyter notebook extension files"
244 )
244 )
245
245
246 # *do* autocreate requested profile, but don't create the config file.
246 # *do* autocreate requested profile, but don't create the config file.
247 auto_create=Bool(True)
247 auto_create=Bool(True)
248 # configurables
248 # configurables
249 quick = Bool(False, config=True,
249 quick = Bool(False, config=True,
250 help="""Start IPython quickly by skipping the loading of config files."""
250 help="""Start IPython quickly by skipping the loading of config files."""
251 )
251 )
252 def _quick_changed(self, name, old, new):
252 def _quick_changed(self, name, old, new):
253 if new:
253 if new:
254 self.load_config_file = lambda *a, **kw: None
254 self.load_config_file = lambda *a, **kw: None
255
255
256 display_banner = Bool(True, config=True,
256 display_banner = Bool(True, config=True,
257 help="Whether to display a banner upon starting IPython."
257 help="Whether to display a banner upon starting IPython."
258 )
258 )
259
259
260 # if there is code of files to run from the cmd line, don't interact
260 # if there is code of files to run from the cmd line, don't interact
261 # unless the --i flag (App.force_interact) is true.
261 # unless the --i flag (App.force_interact) is true.
262 force_interact = Bool(False, config=True,
262 force_interact = Bool(False, config=True,
263 help="""If a command or file is given via the command-line,
263 help="""If a command or file is given via the command-line,
264 e.g. 'ipython foo.py', start an interactive shell after executing the
264 e.g. 'ipython foo.py', start an interactive shell after executing the
265 file or command."""
265 file or command."""
266 )
266 )
267 def _force_interact_changed(self, name, old, new):
267 def _force_interact_changed(self, name, old, new):
268 if new:
268 if new:
269 self.interact = True
269 self.interact = True
270
270
271 def _file_to_run_changed(self, name, old, new):
271 def _file_to_run_changed(self, name, old, new):
272 if new:
272 if new:
273 self.something_to_run = True
273 self.something_to_run = True
274 if new and not self.force_interact:
274 if new and not self.force_interact:
275 self.interact = False
275 self.interact = False
276 _code_to_run_changed = _file_to_run_changed
276 _code_to_run_changed = _file_to_run_changed
277 _module_to_run_changed = _file_to_run_changed
277 _module_to_run_changed = _file_to_run_changed
278
278
279 # internal, not-configurable
279 # internal, not-configurable
280 interact=Bool(True)
280 interact=Bool(True)
281 something_to_run=Bool(False)
281 something_to_run=Bool(False)
282
282
283 def parse_command_line(self, argv=None):
283 def parse_command_line(self, argv=None):
284 """override to allow old '-pylab' flag with deprecation warning"""
284 """override to allow old '-pylab' flag with deprecation warning"""
285
285
286 argv = sys.argv[1:] if argv is None else argv
286 argv = sys.argv[1:] if argv is None else argv
287
287
288 if '-pylab' in argv:
288 if '-pylab' in argv:
289 # deprecated `-pylab` given,
289 # deprecated `-pylab` given,
290 # warn and transform into current syntax
290 # warn and transform into current syntax
291 argv = argv[:] # copy, don't clobber
291 argv = argv[:] # copy, don't clobber
292 idx = argv.index('-pylab')
292 idx = argv.index('-pylab')
293 warn.warn("`-pylab` flag has been deprecated.\n"
293 warn.warn("`-pylab` flag has been deprecated.\n"
294 " Use `--matplotlib <backend>` and import pylab manually.")
294 " Use `--matplotlib <backend>` and import pylab manually.")
295 argv[idx] = '--pylab'
295 argv[idx] = '--pylab'
296
296
297 return super(TerminalIPythonApp, self).parse_command_line(argv)
297 return super(TerminalIPythonApp, self).parse_command_line(argv)
298
298
299 @catch_config_error
299 @catch_config_error
300 def initialize(self, argv=None):
300 def initialize(self, argv=None):
301 """Do actions after construct, but before starting the app."""
301 """Do actions after construct, but before starting the app."""
302 super(TerminalIPythonApp, self).initialize(argv)
302 super(TerminalIPythonApp, self).initialize(argv)
303 if self.subapp is not None:
303 if self.subapp is not None:
304 # don't bother initializing further, starting subapp
304 # don't bother initializing further, starting subapp
305 return
305 return
306 # print self.extra_args
306 # print self.extra_args
307 if self.extra_args and not self.something_to_run:
307 if self.extra_args and not self.something_to_run:
308 self.file_to_run = self.extra_args[0]
308 self.file_to_run = self.extra_args[0]
309 self.init_path()
309 self.init_path()
310 # create the shell
310 # create the shell
311 self.init_shell()
311 self.init_shell()
312 # and draw the banner
312 # and draw the banner
313 self.init_banner()
313 self.init_banner()
314 # Now a variety of things that happen after the banner is printed.
314 # Now a variety of things that happen after the banner is printed.
315 self.init_gui_pylab()
315 self.init_gui_pylab()
316 self.init_extensions()
316 self.init_extensions()
317 self.init_code()
317 self.init_code()
318
318
319 def init_shell(self):
319 def init_shell(self):
320 """initialize the InteractiveShell instance"""
320 """initialize the InteractiveShell instance"""
321 # Create an InteractiveShell instance.
321 # Create an InteractiveShell instance.
322 # shell.display_banner should always be False for the terminal
322 # shell.display_banner should always be False for the terminal
323 # based app, because we call shell.show_banner() by hand below
323 # based app, because we call shell.show_banner() by hand below
324 # so the banner shows *before* all extension loading stuff.
324 # so the banner shows *before* all extension loading stuff.
325 self.shell = TerminalInteractiveShell.instance(parent=self,
325 self.shell = TerminalInteractiveShell.instance(parent=self,
326 display_banner=False, profile_dir=self.profile_dir,
326 display_banner=False, profile_dir=self.profile_dir,
327 ipython_dir=self.ipython_dir, user_ns=self.user_ns)
327 ipython_dir=self.ipython_dir, user_ns=self.user_ns)
328 self.shell.configurables.append(self)
328 self.shell.configurables.append(self)
329
329
330 def init_banner(self):
330 def init_banner(self):
331 """optionally display the banner"""
331 """optionally display the banner"""
332 if self.display_banner and self.interact:
332 if self.display_banner and self.interact:
333 self.shell.show_banner()
333 self.shell.show_banner()
334 # Make sure there is a space below the banner.
334 # Make sure there is a space below the banner.
335 if self.log_level <= logging.INFO: print()
335 if self.log_level <= logging.INFO: print()
336
336
337 def _pylab_changed(self, name, old, new):
337 def _pylab_changed(self, name, old, new):
338 """Replace --pylab='inline' with --pylab='auto'"""
338 """Replace --pylab='inline' with --pylab='auto'"""
339 if new == 'inline':
339 if new == 'inline':
340 warn.warn("'inline' not available as pylab backend, "
340 warn.warn("'inline' not available as pylab backend, "
341 "using 'auto' instead.")
341 "using 'auto' instead.")
342 self.pylab = 'auto'
342 self.pylab = 'auto'
343
343
344 def start(self):
344 def start(self):
345 if self.subapp is not None:
345 if self.subapp is not None:
346 return self.subapp.start()
346 return self.subapp.start()
347 # perform any prexec steps:
347 # perform any prexec steps:
348 if self.interact:
348 if self.interact:
349 self.log.debug("Starting IPython's mainloop...")
349 self.log.debug("Starting IPython's mainloop...")
350 self.shell.mainloop()
350 self.shell.mainloop()
351 else:
351 else:
352 self.log.debug("IPython not interactive...")
352 self.log.debug("IPython not interactive...")
353
353
354 def load_default_config(ipython_dir=None):
354 def load_default_config(ipython_dir=None):
355 """Load the default config file from the default ipython_dir.
355 """Load the default config file from the default ipython_dir.
356
356
357 This is useful for embedded shells.
357 This is useful for embedded shells.
358 """
358 """
359 if ipython_dir is None:
359 if ipython_dir is None:
360 ipython_dir = get_ipython_dir()
360 ipython_dir = get_ipython_dir()
361
361
362 profile_dir = os.path.join(ipython_dir, 'profile_default')
362 profile_dir = os.path.join(ipython_dir, 'profile_default')
363
363
364 config = Config()
364 config = Config()
365 for cf in Application._load_config_files("ipython_config", path=profile_dir):
365 for cf in Application._load_config_files("ipython_config", path=profile_dir):
366 config.update(cf)
366 config.update(cf)
367
367
368 return config
368 return config
369
369
370 launch_new_instance = TerminalIPythonApp.launch_instance
370 launch_new_instance = TerminalIPythonApp.launch_instance
371
371
372
372
373 if __name__ == '__main__':
373 if __name__ == '__main__':
374 launch_new_instance()
374 launch_new_instance()
@@ -1,30 +1,30 b''
1 """Test help output of various IPython entry points"""
1 """Test help output of various IPython entry points"""
2
2
3 # Copyright (c) IPython Development Team.
3 # Copyright (c) IPython Development Team.
4 # Distributed under the terms of the Modified BSD License.
4 # Distributed under the terms of the Modified BSD License.
5
5
6 import IPython.testing.tools as tt
6 import IPython.testing.tools as tt
7 from IPython.testing.decorators import skip_without
7 from IPython.testing.decorators import skip_without
8
8
9
9
10 def test_ipython_help():
10 def test_ipython_help():
11 tt.help_all_output_test()
11 tt.help_all_output_test()
12
12
13 def test_profile_help():
13 def test_profile_help():
14 tt.help_all_output_test("profile")
14 tt.help_all_output_test("profile")
15
15
16 def test_profile_list_help():
16 def test_profile_list_help():
17 tt.help_all_output_test("profile list")
17 tt.help_all_output_test("profile list")
18
18
19 def test_profile_create_help():
19 def test_profile_create_help():
20 tt.help_all_output_test("profile create")
20 tt.help_all_output_test("profile create")
21
21
22 def test_locate_help():
22 def test_locate_help():
23 tt.help_all_output_test("locate")
23 tt.help_all_output_test("locate")
24
24
25 def test_locate_profile_help():
25 def test_locate_profile_help():
26 tt.help_all_output_test("locate profile")
26 tt.help_all_output_test("locate profile")
27
27
28 @skip_without('jupyter_nbformat') # Requires jsonschema to be installed
28 @skip_without('nbformat') # Requires jsonschema to be installed
29 def test_trust_help():
29 def test_trust_help():
30 tt.help_all_output_test("trust")
30 tt.help_all_output_test("trust")
@@ -1,288 +1,288 b''
1 #!/usr/bin/env python
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
2 # -*- coding: utf-8 -*-
3 """Setup script for IPython.
3 """Setup script for IPython.
4
4
5 Under Posix environments it works like a typical setup.py script.
5 Under Posix environments it works like a typical setup.py script.
6 Under Windows, the command sdist is not supported, since IPython
6 Under Windows, the command sdist is not supported, since IPython
7 requires utilities which are not available under Windows."""
7 requires utilities which are not available under Windows."""
8
8
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10 # Copyright (c) 2008-2011, IPython Development Team.
10 # Copyright (c) 2008-2011, IPython Development Team.
11 # Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
11 # Copyright (c) 2001-2007, Fernando Perez <fernando.perez@colorado.edu>
12 # Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
12 # Copyright (c) 2001, Janko Hauser <jhauser@zscout.de>
13 # Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>
13 # Copyright (c) 2001, Nathaniel Gray <n8gray@caltech.edu>
14 #
14 #
15 # Distributed under the terms of the Modified BSD License.
15 # Distributed under the terms of the Modified BSD License.
16 #
16 #
17 # The full license is in the file COPYING.rst, distributed with this software.
17 # The full license is in the file COPYING.rst, distributed with this software.
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19
19
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21 # Minimal Python version sanity check
21 # Minimal Python version sanity check
22 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
23 from __future__ import print_function
23 from __future__ import print_function
24
24
25 import sys
25 import sys
26
26
27 # This check is also made in IPython/__init__, don't forget to update both when
27 # This check is also made in IPython/__init__, don't forget to update both when
28 # changing Python version requirements.
28 # changing Python version requirements.
29 v = sys.version_info
29 v = sys.version_info
30 if v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)):
30 if v[:2] < (2,7) or (v[0] >= 3 and v[:2] < (3,3)):
31 error = "ERROR: IPython requires Python version 2.7 or 3.3 or above."
31 error = "ERROR: IPython requires Python version 2.7 or 3.3 or above."
32 print(error, file=sys.stderr)
32 print(error, file=sys.stderr)
33 sys.exit(1)
33 sys.exit(1)
34
34
35 PY3 = (sys.version_info[0] >= 3)
35 PY3 = (sys.version_info[0] >= 3)
36
36
37 # At least we're on the python version we need, move on.
37 # At least we're on the python version we need, move on.
38
38
39 #-------------------------------------------------------------------------------
39 #-------------------------------------------------------------------------------
40 # Imports
40 # Imports
41 #-------------------------------------------------------------------------------
41 #-------------------------------------------------------------------------------
42
42
43 # Stdlib imports
43 # Stdlib imports
44 import os
44 import os
45 import shutil
45 import shutil
46
46
47 from glob import glob
47 from glob import glob
48
48
49 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
49 # BEFORE importing distutils, remove MANIFEST. distutils doesn't properly
50 # update it when the contents of directories change.
50 # update it when the contents of directories change.
51 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
51 if os.path.exists('MANIFEST'): os.remove('MANIFEST')
52
52
53 from distutils.core import setup
53 from distutils.core import setup
54
54
55 # Our own imports
55 # Our own imports
56 from setupbase import target_update
56 from setupbase import target_update
57
57
58 from setupbase import (
58 from setupbase import (
59 setup_args,
59 setup_args,
60 find_packages,
60 find_packages,
61 find_package_data,
61 find_package_data,
62 check_package_data_first,
62 check_package_data_first,
63 find_entry_points,
63 find_entry_points,
64 build_scripts_entrypt,
64 build_scripts_entrypt,
65 find_data_files,
65 find_data_files,
66 check_for_readline,
66 check_for_readline,
67 git_prebuild,
67 git_prebuild,
68 get_bdist_wheel,
68 get_bdist_wheel,
69 install_symlinked,
69 install_symlinked,
70 install_lib_symlink,
70 install_lib_symlink,
71 install_scripts_for_symlink,
71 install_scripts_for_symlink,
72 unsymlink,
72 unsymlink,
73 )
73 )
74
74
75 isfile = os.path.isfile
75 isfile = os.path.isfile
76 pjoin = os.path.join
76 pjoin = os.path.join
77
77
78 #-------------------------------------------------------------------------------
78 #-------------------------------------------------------------------------------
79 # Handle OS specific things
79 # Handle OS specific things
80 #-------------------------------------------------------------------------------
80 #-------------------------------------------------------------------------------
81
81
82 if os.name in ('nt','dos'):
82 if os.name in ('nt','dos'):
83 os_name = 'windows'
83 os_name = 'windows'
84 else:
84 else:
85 os_name = os.name
85 os_name = os.name
86
86
87 # Under Windows, 'sdist' has not been supported. Now that the docs build with
87 # Under Windows, 'sdist' has not been supported. Now that the docs build with
88 # Sphinx it might work, but let's not turn it on until someone confirms that it
88 # Sphinx it might work, but let's not turn it on until someone confirms that it
89 # actually works.
89 # actually works.
90 if os_name == 'windows' and 'sdist' in sys.argv:
90 if os_name == 'windows' and 'sdist' in sys.argv:
91 print('The sdist command is not available under Windows. Exiting.')
91 print('The sdist command is not available under Windows. Exiting.')
92 sys.exit(1)
92 sys.exit(1)
93
93
94
94
95 #-------------------------------------------------------------------------------
95 #-------------------------------------------------------------------------------
96 # Things related to the IPython documentation
96 # Things related to the IPython documentation
97 #-------------------------------------------------------------------------------
97 #-------------------------------------------------------------------------------
98
98
99 # update the manuals when building a source dist
99 # update the manuals when building a source dist
100 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
100 if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'):
101
101
102 # List of things to be updated. Each entry is a triplet of args for
102 # List of things to be updated. Each entry is a triplet of args for
103 # target_update()
103 # target_update()
104 to_update = [
104 to_update = [
105 ('docs/man/ipython.1.gz',
105 ('docs/man/ipython.1.gz',
106 ['docs/man/ipython.1'],
106 ['docs/man/ipython.1'],
107 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
107 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'),
108 ]
108 ]
109
109
110
110
111 [ target_update(*t) for t in to_update ]
111 [ target_update(*t) for t in to_update ]
112
112
113 #---------------------------------------------------------------------------
113 #---------------------------------------------------------------------------
114 # Find all the packages, package data, and data_files
114 # Find all the packages, package data, and data_files
115 #---------------------------------------------------------------------------
115 #---------------------------------------------------------------------------
116
116
117 packages = find_packages()
117 packages = find_packages()
118 package_data = find_package_data()
118 package_data = find_package_data()
119
119
120 data_files = find_data_files()
120 data_files = find_data_files()
121
121
122 setup_args['packages'] = packages
122 setup_args['packages'] = packages
123 setup_args['package_data'] = package_data
123 setup_args['package_data'] = package_data
124 setup_args['data_files'] = data_files
124 setup_args['data_files'] = data_files
125
125
126 #---------------------------------------------------------------------------
126 #---------------------------------------------------------------------------
127 # custom distutils commands
127 # custom distutils commands
128 #---------------------------------------------------------------------------
128 #---------------------------------------------------------------------------
129 # imports here, so they are after setuptools import if there was one
129 # imports here, so they are after setuptools import if there was one
130 from distutils.command.sdist import sdist
130 from distutils.command.sdist import sdist
131 from distutils.command.upload import upload
131 from distutils.command.upload import upload
132
132
133 class UploadWindowsInstallers(upload):
133 class UploadWindowsInstallers(upload):
134
134
135 description = "Upload Windows installers to PyPI (only used from tools/release_windows.py)"
135 description = "Upload Windows installers to PyPI (only used from tools/release_windows.py)"
136 user_options = upload.user_options + [
136 user_options = upload.user_options + [
137 ('files=', 'f', 'exe file (or glob) to upload')
137 ('files=', 'f', 'exe file (or glob) to upload')
138 ]
138 ]
139 def initialize_options(self):
139 def initialize_options(self):
140 upload.initialize_options(self)
140 upload.initialize_options(self)
141 meta = self.distribution.metadata
141 meta = self.distribution.metadata
142 base = '{name}-{version}'.format(
142 base = '{name}-{version}'.format(
143 name=meta.get_name(),
143 name=meta.get_name(),
144 version=meta.get_version()
144 version=meta.get_version()
145 )
145 )
146 self.files = os.path.join('dist', '%s.*.exe' % base)
146 self.files = os.path.join('dist', '%s.*.exe' % base)
147
147
148 def run(self):
148 def run(self):
149 for dist_file in glob(self.files):
149 for dist_file in glob(self.files):
150 self.upload_file('bdist_wininst', 'any', dist_file)
150 self.upload_file('bdist_wininst', 'any', dist_file)
151
151
152 setup_args['cmdclass'] = {
152 setup_args['cmdclass'] = {
153 'build_py': \
153 'build_py': \
154 check_package_data_first(git_prebuild('IPython')),
154 check_package_data_first(git_prebuild('IPython')),
155 'sdist' : git_prebuild('IPython', sdist),
155 'sdist' : git_prebuild('IPython', sdist),
156 'upload_wininst' : UploadWindowsInstallers,
156 'upload_wininst' : UploadWindowsInstallers,
157 'symlink': install_symlinked,
157 'symlink': install_symlinked,
158 'install_lib_symlink': install_lib_symlink,
158 'install_lib_symlink': install_lib_symlink,
159 'install_scripts_sym': install_scripts_for_symlink,
159 'install_scripts_sym': install_scripts_for_symlink,
160 'unsymlink': unsymlink,
160 'unsymlink': unsymlink,
161 }
161 }
162
162
163 ### Temporarily disable install while it's broken during the big split
163 ### Temporarily disable install while it's broken during the big split
164 from textwrap import dedent
164 from textwrap import dedent
165 from distutils.command.install import install
165 from distutils.command.install import install
166
166
167 class DisabledInstall(install):
167 class DisabledInstall(install):
168 def run(self):
168 def run(self):
169 msg = dedent("""
169 msg = dedent("""
170 While we are in the midst of The Big Split,
170 While we are in the midst of The Big Split,
171 IPython cannot be installed from master.
171 IPython cannot be installed from master.
172 You can use `pip install -e .` for an editable install,
172 You can use `pip install -e .` for an editable install,
173 which still works.
173 which still works.
174 """)
174 """)
175 print(msg, file=sys.stderr)
175 print(msg, file=sys.stderr)
176 raise SystemExit(1)
176 raise SystemExit(1)
177
177
178 setup_args['cmdclass']['install'] = DisabledInstall
178 setup_args['cmdclass']['install'] = DisabledInstall
179
179
180
180
181 #---------------------------------------------------------------------------
181 #---------------------------------------------------------------------------
182 # Handle scripts, dependencies, and setuptools specific things
182 # Handle scripts, dependencies, and setuptools specific things
183 #---------------------------------------------------------------------------
183 #---------------------------------------------------------------------------
184
184
185 # For some commands, use setuptools. Note that we do NOT list install here!
185 # For some commands, use setuptools. Note that we do NOT list install here!
186 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
186 # If you want a setuptools-enhanced install, just run 'setupegg.py install'
187 needs_setuptools = set(('develop', 'release', 'bdist_egg', 'bdist_rpm',
187 needs_setuptools = set(('develop', 'release', 'bdist_egg', 'bdist_rpm',
188 'bdist', 'bdist_dumb', 'bdist_wininst', 'bdist_wheel',
188 'bdist', 'bdist_dumb', 'bdist_wininst', 'bdist_wheel',
189 'egg_info', 'easy_install', 'upload', 'install_egg_info',
189 'egg_info', 'easy_install', 'upload', 'install_egg_info',
190 ))
190 ))
191
191
192 if len(needs_setuptools.intersection(sys.argv)) > 0:
192 if len(needs_setuptools.intersection(sys.argv)) > 0:
193 import setuptools
193 import setuptools
194
194
195 # This dict is used for passing extra arguments that are setuptools
195 # This dict is used for passing extra arguments that are setuptools
196 # specific to setup
196 # specific to setup
197 setuptools_extra_args = {}
197 setuptools_extra_args = {}
198
198
199 # setuptools requirements
199 # setuptools requirements
200
200
201 pyzmq = 'pyzmq>=13'
201 pyzmq = 'pyzmq>=13'
202
202
203 extras_require = dict(
203 extras_require = dict(
204 parallel = ['ipyparallel'],
204 parallel = ['ipyparallel'],
205 qtconsole = ['qtconsole'],
205 qtconsole = ['qtconsole'],
206 doc = ['Sphinx>=1.1', 'numpydoc'],
206 doc = ['Sphinx>=1.1', 'numpydoc'],
207 test = ['nose>=0.10.1', 'requests', 'testpath'],
207 test = ['nose>=0.10.1', 'requests', 'testpath'],
208 terminal = [],
208 terminal = [],
209 kernel = ['ipykernel'],
209 kernel = ['ipykernel'],
210 nbformat = ['jupyter_nbformat'],
210 nbformat = ['nbformat'],
211 notebook = ['jupyter_notebook'],
211 notebook = ['jupyter_notebook'],
212 nbconvert = ['nbconvert'],
212 nbconvert = ['nbconvert'],
213 )
213 )
214
214
215 if sys.version_info < (3, 3):
215 if sys.version_info < (3, 3):
216 extras_require['test'].append('mock')
216 extras_require['test'].append('mock')
217
217
218 install_requires = [
218 install_requires = [
219 'decorator',
219 'decorator',
220 'pickleshare',
220 'pickleshare',
221 'simplegeneric>0.8',
221 'simplegeneric>0.8',
222 'traitlets',
222 'traitlets',
223 ]
223 ]
224
224
225 # add platform-specific dependencies
225 # add platform-specific dependencies
226 if sys.platform == 'darwin':
226 if sys.platform == 'darwin':
227 install_requires.append('appnope')
227 install_requires.append('appnope')
228 if 'bdist_wheel' in sys.argv[1:] or not check_for_readline():
228 if 'bdist_wheel' in sys.argv[1:] or not check_for_readline():
229 install_requires.append('gnureadline')
229 install_requires.append('gnureadline')
230
230
231 if sys.platform.startswith('win'):
231 if sys.platform.startswith('win'):
232 extras_require['terminal'].append('pyreadline>=2.0')
232 extras_require['terminal'].append('pyreadline>=2.0')
233 else:
233 else:
234 install_requires.append('pexpect')
234 install_requires.append('pexpect')
235
235
236 everything = set()
236 everything = set()
237 for deps in extras_require.values():
237 for deps in extras_require.values():
238 everything.update(deps)
238 everything.update(deps)
239 extras_require['all'] = everything
239 extras_require['all'] = everything
240
240
241 if 'setuptools' in sys.modules:
241 if 'setuptools' in sys.modules:
242 setup_args['cmdclass']['bdist_wheel'] = get_bdist_wheel()
242 setup_args['cmdclass']['bdist_wheel'] = get_bdist_wheel()
243
243
244 setuptools_extra_args['zip_safe'] = False
244 setuptools_extra_args['zip_safe'] = False
245 setuptools_extra_args['entry_points'] = {
245 setuptools_extra_args['entry_points'] = {
246 'console_scripts': find_entry_points(),
246 'console_scripts': find_entry_points(),
247 'pygments.lexers': [
247 'pygments.lexers': [
248 'ipythonconsole = IPython.lib.lexers:IPythonConsoleLexer',
248 'ipythonconsole = IPython.lib.lexers:IPythonConsoleLexer',
249 'ipython = IPython.lib.lexers:IPythonLexer',
249 'ipython = IPython.lib.lexers:IPythonLexer',
250 'ipython3 = IPython.lib.lexers:IPython3Lexer',
250 'ipython3 = IPython.lib.lexers:IPython3Lexer',
251 ],
251 ],
252 }
252 }
253 setup_args['extras_require'] = extras_require
253 setup_args['extras_require'] = extras_require
254 requires = setup_args['install_requires'] = install_requires
254 requires = setup_args['install_requires'] = install_requires
255
255
256 # Script to be run by the windows binary installer after the default setup
256 # Script to be run by the windows binary installer after the default setup
257 # routine, to add shortcuts and similar windows-only things. Windows
257 # routine, to add shortcuts and similar windows-only things. Windows
258 # post-install scripts MUST reside in the scripts/ dir, otherwise distutils
258 # post-install scripts MUST reside in the scripts/ dir, otherwise distutils
259 # doesn't find them.
259 # doesn't find them.
260 if 'bdist_wininst' in sys.argv:
260 if 'bdist_wininst' in sys.argv:
261 if len(sys.argv) > 2 and \
261 if len(sys.argv) > 2 and \
262 ('sdist' in sys.argv or 'bdist_rpm' in sys.argv):
262 ('sdist' in sys.argv or 'bdist_rpm' in sys.argv):
263 print("ERROR: bdist_wininst must be run alone. Exiting.", file=sys.stderr)
263 print("ERROR: bdist_wininst must be run alone. Exiting.", file=sys.stderr)
264 sys.exit(1)
264 sys.exit(1)
265 setup_args['data_files'].append(
265 setup_args['data_files'].append(
266 ['Scripts', ('scripts/ipython.ico', 'scripts/ipython_nb.ico')])
266 ['Scripts', ('scripts/ipython.ico', 'scripts/ipython_nb.ico')])
267 setup_args['scripts'] = [pjoin('scripts','ipython_win_post_install.py')]
267 setup_args['scripts'] = [pjoin('scripts','ipython_win_post_install.py')]
268 setup_args['options'] = {"bdist_wininst":
268 setup_args['options'] = {"bdist_wininst":
269 {"install_script":
269 {"install_script":
270 "ipython_win_post_install.py"}}
270 "ipython_win_post_install.py"}}
271
271
272 else:
272 else:
273 # scripts has to be a non-empty list, or install_scripts isn't called
273 # scripts has to be a non-empty list, or install_scripts isn't called
274 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
274 setup_args['scripts'] = [e.split('=')[0].strip() for e in find_entry_points()]
275
275
276 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
276 setup_args['cmdclass']['build_scripts'] = build_scripts_entrypt
277
277
278 #---------------------------------------------------------------------------
278 #---------------------------------------------------------------------------
279 # Do the actual setup now
279 # Do the actual setup now
280 #---------------------------------------------------------------------------
280 #---------------------------------------------------------------------------
281
281
282 setup_args.update(setuptools_extra_args)
282 setup_args.update(setuptools_extra_args)
283
283
284 def main():
284 def main():
285 setup(**setup_args)
285 setup(**setup_args)
286
286
287 if __name__ == '__main__':
287 if __name__ == '__main__':
288 main()
288 main()
General Comments 0
You need to be logged in to leave comments. Login now