##// END OF EJS Templates
Merge pull request #3319 from minrk/user-expressions...
Min RK -
r10828:2c614f32 merge
parent child Browse files
Show More
@@ -1,3077 +1,3108 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Main IPython class."""
2 """Main IPython class."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Copyright (C) 2008-2011 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 from __future__ import absolute_import
17 from __future__ import absolute_import
18 from __future__ import print_function
18 from __future__ import print_function
19
19
20 import __builtin__ as builtin_mod
20 import __builtin__ as builtin_mod
21 import __future__
21 import __future__
22 import abc
22 import abc
23 import ast
23 import ast
24 import atexit
24 import atexit
25 import os
25 import os
26 import re
26 import re
27 import runpy
27 import runpy
28 import sys
28 import sys
29 import tempfile
29 import tempfile
30 import types
30 import types
31 from io import open as io_open
31 from io import open as io_open
32
32
33 from IPython.config.configurable import SingletonConfigurable
33 from IPython.config.configurable import SingletonConfigurable
34 from IPython.core import debugger, oinspect
34 from IPython.core import debugger, oinspect
35 from IPython.core import magic
35 from IPython.core import magic
36 from IPython.core import page
36 from IPython.core import page
37 from IPython.core import prefilter
37 from IPython.core import prefilter
38 from IPython.core import shadowns
38 from IPython.core import shadowns
39 from IPython.core import ultratb
39 from IPython.core import ultratb
40 from IPython.core.alias import AliasManager, AliasError
40 from IPython.core.alias import AliasManager, AliasError
41 from IPython.core.autocall import ExitAutocall
41 from IPython.core.autocall import ExitAutocall
42 from IPython.core.builtin_trap import BuiltinTrap
42 from IPython.core.builtin_trap import BuiltinTrap
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 UsageError
47 from IPython.core.error import UsageError
48 from IPython.core.extensions import ExtensionManager
48 from IPython.core.extensions import ExtensionManager
49 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
49 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
50 from IPython.core.formatters import DisplayFormatter
50 from IPython.core.formatters import DisplayFormatter
51 from IPython.core.history import HistoryManager
51 from IPython.core.history import HistoryManager
52 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
52 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
53 from IPython.core.logger import Logger
53 from IPython.core.logger import Logger
54 from IPython.core.macro import Macro
54 from IPython.core.macro import Macro
55 from IPython.core.payload import PayloadManager
55 from IPython.core.payload import PayloadManager
56 from IPython.core.prefilter import PrefilterManager
56 from IPython.core.prefilter import PrefilterManager
57 from IPython.core.profiledir import ProfileDir
57 from IPython.core.profiledir import ProfileDir
58 from IPython.core.pylabtools import pylab_activate
58 from IPython.core.pylabtools import pylab_activate
59 from IPython.core.prompts import PromptManager
59 from IPython.core.prompts import PromptManager
60 from IPython.lib.latextools import LaTeXTool
60 from IPython.lib.latextools import LaTeXTool
61 from IPython.testing.skipdoctest import skip_doctest
61 from IPython.testing.skipdoctest import skip_doctest
62 from IPython.utils import PyColorize
62 from IPython.utils import PyColorize
63 from IPython.utils import io
63 from IPython.utils import io
64 from IPython.utils import py3compat
64 from IPython.utils import py3compat
65 from IPython.utils import openpy
65 from IPython.utils import openpy
66 from IPython.utils.decorators import undoc
66 from IPython.utils.decorators import undoc
67 from IPython.utils.io import ask_yes_no
67 from IPython.utils.io import ask_yes_no
68 from IPython.utils.ipstruct import Struct
68 from IPython.utils.ipstruct import Struct
69 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
69 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename
70 from IPython.utils.pickleshare import PickleShareDB
70 from IPython.utils.pickleshare import PickleShareDB
71 from IPython.utils.process import system, getoutput
71 from IPython.utils.process import system, getoutput
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 IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
76 from IPython.utils.traitlets import (Integer, CBool, CaselessStrEnum, Enum,
77 List, Unicode, Instance, Type)
77 List, 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 """A Unicode subclass to validate separate_in, separate_out, etc.
133 """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 # Main IPython class
190 # Main IPython class
191 #-----------------------------------------------------------------------------
191 #-----------------------------------------------------------------------------
192
192
193 class InteractiveShell(SingletonConfigurable):
193 class InteractiveShell(SingletonConfigurable):
194 """An enhanced, interactive shell for Python."""
194 """An enhanced, interactive shell for Python."""
195
195
196 _instance = None
196 _instance = None
197
197
198 ast_transformers = List([], config=True, help=
198 ast_transformers = List([], config=True, help=
199 """
199 """
200 A list of ast.NodeTransformer subclass instances, which will be applied
200 A list of ast.NodeTransformer subclass instances, which will be applied
201 to user input before code is run.
201 to user input before code is run.
202 """
202 """
203 )
203 )
204
204
205 autocall = Enum((0,1,2), default_value=0, config=True, help=
205 autocall = Enum((0,1,2), default_value=0, config=True, help=
206 """
206 """
207 Make IPython automatically call any callable object even if you didn't
207 Make IPython automatically call any callable object even if you didn't
208 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
208 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
209 automatically. The value can be '0' to disable the feature, '1' for
209 automatically. The value can be '0' to disable the feature, '1' for
210 'smart' autocall, where it is not applied if there are no more
210 'smart' autocall, where it is not applied if there are no more
211 arguments on the line, and '2' for 'full' autocall, where all callable
211 arguments on the line, and '2' for 'full' autocall, where all callable
212 objects are automatically called (even if no arguments are present).
212 objects are automatically called (even if no arguments are present).
213 """
213 """
214 )
214 )
215 # TODO: remove all autoindent logic and put into frontends.
215 # TODO: remove all autoindent logic and put into frontends.
216 # We can't do this yet because even runlines uses the autoindent.
216 # We can't do this yet because even runlines uses the autoindent.
217 autoindent = CBool(True, config=True, help=
217 autoindent = CBool(True, config=True, help=
218 """
218 """
219 Autoindent IPython code entered interactively.
219 Autoindent IPython code entered interactively.
220 """
220 """
221 )
221 )
222 automagic = CBool(True, config=True, help=
222 automagic = CBool(True, config=True, help=
223 """
223 """
224 Enable magic commands to be called without the leading %.
224 Enable magic commands to be called without the leading %.
225 """
225 """
226 )
226 )
227 cache_size = Integer(1000, config=True, help=
227 cache_size = Integer(1000, config=True, help=
228 """
228 """
229 Set the size of the output cache. The default is 1000, you can
229 Set the size of the output cache. The default is 1000, you can
230 change it permanently in your config file. Setting it to 0 completely
230 change it permanently in your config file. Setting it to 0 completely
231 disables the caching system, and the minimum value accepted is 20 (if
231 disables the caching system, and the minimum value accepted is 20 (if
232 you provide a value less than 20, it is reset to 0 and a warning is
232 you provide a value less than 20, it is reset to 0 and a warning is
233 issued). This limit is defined because otherwise you'll spend more
233 issued). This limit is defined because otherwise you'll spend more
234 time re-flushing a too small cache than working
234 time re-flushing a too small cache than working
235 """
235 """
236 )
236 )
237 color_info = CBool(True, config=True, help=
237 color_info = CBool(True, config=True, help=
238 """
238 """
239 Use colors for displaying information about objects. Because this
239 Use colors for displaying information about objects. Because this
240 information is passed through a pager (like 'less'), and some pagers
240 information is passed through a pager (like 'less'), and some pagers
241 get confused with color codes, this capability can be turned off.
241 get confused with color codes, this capability can be turned off.
242 """
242 """
243 )
243 )
244 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
244 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
245 default_value=get_default_colors(), config=True,
245 default_value=get_default_colors(), config=True,
246 help="Set the color scheme (NoColor, Linux, or LightBG)."
246 help="Set the color scheme (NoColor, Linux, or LightBG)."
247 )
247 )
248 colors_force = CBool(False, help=
248 colors_force = CBool(False, help=
249 """
249 """
250 Force use of ANSI color codes, regardless of OS and readline
250 Force use of ANSI color codes, regardless of OS and readline
251 availability.
251 availability.
252 """
252 """
253 # FIXME: This is essentially a hack to allow ZMQShell to show colors
253 # FIXME: This is essentially a hack to allow ZMQShell to show colors
254 # without readline on Win32. When the ZMQ formatting system is
254 # without readline on Win32. When the ZMQ formatting system is
255 # refactored, this should be removed.
255 # refactored, this should be removed.
256 )
256 )
257 debug = CBool(False, config=True)
257 debug = CBool(False, config=True)
258 deep_reload = CBool(False, config=True, help=
258 deep_reload = CBool(False, config=True, help=
259 """
259 """
260 Enable deep (recursive) reloading by default. IPython can use the
260 Enable deep (recursive) reloading by default. IPython can use the
261 deep_reload module which reloads changes in modules recursively (it
261 deep_reload module which reloads changes in modules recursively (it
262 replaces the reload() function, so you don't need to change anything to
262 replaces the reload() function, so you don't need to change anything to
263 use it). deep_reload() forces a full reload of modules whose code may
263 use it). deep_reload() forces a full reload of modules whose code may
264 have changed, which the default reload() function does not. When
264 have changed, which the default reload() function does not. When
265 deep_reload is off, IPython will use the normal reload(), but
265 deep_reload is off, IPython will use the normal reload(), but
266 deep_reload will still be available as dreload().
266 deep_reload will still be available as dreload().
267 """
267 """
268 )
268 )
269 disable_failing_post_execute = CBool(False, config=True,
269 disable_failing_post_execute = CBool(False, config=True,
270 help="Don't call post-execute functions that have failed in the past."
270 help="Don't call post-execute functions that have failed in the past."
271 )
271 )
272 display_formatter = Instance(DisplayFormatter)
272 display_formatter = Instance(DisplayFormatter)
273 displayhook_class = Type(DisplayHook)
273 displayhook_class = Type(DisplayHook)
274 display_pub_class = Type(DisplayPublisher)
274 display_pub_class = Type(DisplayPublisher)
275 data_pub_class = None
275 data_pub_class = None
276
276
277 exit_now = CBool(False)
277 exit_now = CBool(False)
278 exiter = Instance(ExitAutocall)
278 exiter = Instance(ExitAutocall)
279 def _exiter_default(self):
279 def _exiter_default(self):
280 return ExitAutocall(self)
280 return ExitAutocall(self)
281 # Monotonically increasing execution counter
281 # Monotonically increasing execution counter
282 execution_count = Integer(1)
282 execution_count = Integer(1)
283 filename = Unicode("<ipython console>")
283 filename = Unicode("<ipython console>")
284 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
284 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
285
285
286 # Input splitter, to transform input line by line and detect when a block
286 # Input splitter, to transform input line by line and detect when a block
287 # is ready to be executed.
287 # is ready to be executed.
288 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
288 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
289 (), {'line_input_checker': True})
289 (), {'line_input_checker': True})
290
290
291 # This InputSplitter instance is used to transform completed cells before
291 # This InputSplitter instance is used to transform completed cells before
292 # running them. It allows cell magics to contain blank lines.
292 # running them. It allows cell magics to contain blank lines.
293 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
293 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
294 (), {'line_input_checker': False})
294 (), {'line_input_checker': False})
295
295
296 logstart = CBool(False, config=True, help=
296 logstart = CBool(False, config=True, help=
297 """
297 """
298 Start logging to the default log file.
298 Start logging to the default log file.
299 """
299 """
300 )
300 )
301 logfile = Unicode('', config=True, help=
301 logfile = Unicode('', config=True, help=
302 """
302 """
303 The name of the logfile to use.
303 The name of the logfile to use.
304 """
304 """
305 )
305 )
306 logappend = Unicode('', config=True, help=
306 logappend = Unicode('', config=True, help=
307 """
307 """
308 Start logging to the given file in append mode.
308 Start logging to the given file in append mode.
309 """
309 """
310 )
310 )
311 object_info_string_level = Enum((0,1,2), default_value=0,
311 object_info_string_level = Enum((0,1,2), default_value=0,
312 config=True)
312 config=True)
313 pdb = CBool(False, config=True, help=
313 pdb = CBool(False, config=True, help=
314 """
314 """
315 Automatically call the pdb debugger after every exception.
315 Automatically call the pdb debugger after every exception.
316 """
316 """
317 )
317 )
318 multiline_history = CBool(sys.platform != 'win32', config=True,
318 multiline_history = CBool(sys.platform != 'win32', config=True,
319 help="Save multi-line entries as one entry in readline history"
319 help="Save multi-line entries as one entry in readline history"
320 )
320 )
321
321
322 # deprecated prompt traits:
322 # deprecated prompt traits:
323
323
324 prompt_in1 = Unicode('In [\\#]: ', config=True,
324 prompt_in1 = Unicode('In [\\#]: ', config=True,
325 help="Deprecated, use PromptManager.in_template")
325 help="Deprecated, use PromptManager.in_template")
326 prompt_in2 = Unicode(' .\\D.: ', config=True,
326 prompt_in2 = Unicode(' .\\D.: ', config=True,
327 help="Deprecated, use PromptManager.in2_template")
327 help="Deprecated, use PromptManager.in2_template")
328 prompt_out = Unicode('Out[\\#]: ', config=True,
328 prompt_out = Unicode('Out[\\#]: ', config=True,
329 help="Deprecated, use PromptManager.out_template")
329 help="Deprecated, use PromptManager.out_template")
330 prompts_pad_left = CBool(True, config=True,
330 prompts_pad_left = CBool(True, config=True,
331 help="Deprecated, use PromptManager.justify")
331 help="Deprecated, use PromptManager.justify")
332
332
333 def _prompt_trait_changed(self, name, old, new):
333 def _prompt_trait_changed(self, name, old, new):
334 table = {
334 table = {
335 'prompt_in1' : 'in_template',
335 'prompt_in1' : 'in_template',
336 'prompt_in2' : 'in2_template',
336 'prompt_in2' : 'in2_template',
337 'prompt_out' : 'out_template',
337 'prompt_out' : 'out_template',
338 'prompts_pad_left' : 'justify',
338 'prompts_pad_left' : 'justify',
339 }
339 }
340 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
340 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
341 name=name, newname=table[name])
341 name=name, newname=table[name])
342 )
342 )
343 # protect against weird cases where self.config may not exist:
343 # protect against weird cases where self.config may not exist:
344 if self.config is not None:
344 if self.config is not None:
345 # propagate to corresponding PromptManager trait
345 # propagate to corresponding PromptManager trait
346 setattr(self.config.PromptManager, table[name], new)
346 setattr(self.config.PromptManager, table[name], new)
347
347
348 _prompt_in1_changed = _prompt_trait_changed
348 _prompt_in1_changed = _prompt_trait_changed
349 _prompt_in2_changed = _prompt_trait_changed
349 _prompt_in2_changed = _prompt_trait_changed
350 _prompt_out_changed = _prompt_trait_changed
350 _prompt_out_changed = _prompt_trait_changed
351 _prompt_pad_left_changed = _prompt_trait_changed
351 _prompt_pad_left_changed = _prompt_trait_changed
352
352
353 show_rewritten_input = CBool(True, config=True,
353 show_rewritten_input = CBool(True, config=True,
354 help="Show rewritten input, e.g. for autocall."
354 help="Show rewritten input, e.g. for autocall."
355 )
355 )
356
356
357 quiet = CBool(False, config=True)
357 quiet = CBool(False, config=True)
358
358
359 history_length = Integer(10000, config=True)
359 history_length = Integer(10000, config=True)
360
360
361 # The readline stuff will eventually be moved to the terminal subclass
361 # The readline stuff will eventually be moved to the terminal subclass
362 # but for now, we can't do that as readline is welded in everywhere.
362 # but for now, we can't do that as readline is welded in everywhere.
363 readline_use = CBool(True, config=True)
363 readline_use = CBool(True, config=True)
364 readline_remove_delims = Unicode('-/~', config=True)
364 readline_remove_delims = Unicode('-/~', config=True)
365 readline_delims = Unicode() # set by init_readline()
365 readline_delims = Unicode() # set by init_readline()
366 # don't use \M- bindings by default, because they
366 # don't use \M- bindings by default, because they
367 # conflict with 8-bit encodings. See gh-58,gh-88
367 # conflict with 8-bit encodings. See gh-58,gh-88
368 readline_parse_and_bind = List([
368 readline_parse_and_bind = List([
369 'tab: complete',
369 'tab: complete',
370 '"\C-l": clear-screen',
370 '"\C-l": clear-screen',
371 'set show-all-if-ambiguous on',
371 'set show-all-if-ambiguous on',
372 '"\C-o": tab-insert',
372 '"\C-o": tab-insert',
373 '"\C-r": reverse-search-history',
373 '"\C-r": reverse-search-history',
374 '"\C-s": forward-search-history',
374 '"\C-s": forward-search-history',
375 '"\C-p": history-search-backward',
375 '"\C-p": history-search-backward',
376 '"\C-n": history-search-forward',
376 '"\C-n": history-search-forward',
377 '"\e[A": history-search-backward',
377 '"\e[A": history-search-backward',
378 '"\e[B": history-search-forward',
378 '"\e[B": history-search-forward',
379 '"\C-k": kill-line',
379 '"\C-k": kill-line',
380 '"\C-u": unix-line-discard',
380 '"\C-u": unix-line-discard',
381 ], allow_none=False, config=True)
381 ], allow_none=False, config=True)
382
382
383 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
383 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
384 default_value='last_expr', config=True,
384 default_value='last_expr', config=True,
385 help="""
385 help="""
386 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
386 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
387 run interactively (displaying output from expressions).""")
387 run interactively (displaying output from expressions).""")
388
388
389 # TODO: this part of prompt management should be moved to the frontends.
389 # TODO: this part of prompt management should be moved to the frontends.
390 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
390 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
391 separate_in = SeparateUnicode('\n', config=True)
391 separate_in = SeparateUnicode('\n', config=True)
392 separate_out = SeparateUnicode('', config=True)
392 separate_out = SeparateUnicode('', config=True)
393 separate_out2 = SeparateUnicode('', config=True)
393 separate_out2 = SeparateUnicode('', config=True)
394 wildcards_case_sensitive = CBool(True, config=True)
394 wildcards_case_sensitive = CBool(True, config=True)
395 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
395 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
396 default_value='Context', config=True)
396 default_value='Context', config=True)
397
397
398 # Subcomponents of InteractiveShell
398 # Subcomponents of InteractiveShell
399 alias_manager = Instance('IPython.core.alias.AliasManager')
399 alias_manager = Instance('IPython.core.alias.AliasManager')
400 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
400 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
401 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
401 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
402 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
402 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
403 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
403 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
404 payload_manager = Instance('IPython.core.payload.PayloadManager')
404 payload_manager = Instance('IPython.core.payload.PayloadManager')
405 history_manager = Instance('IPython.core.history.HistoryManager')
405 history_manager = Instance('IPython.core.history.HistoryManager')
406 magics_manager = Instance('IPython.core.magic.MagicsManager')
406 magics_manager = Instance('IPython.core.magic.MagicsManager')
407
407
408 profile_dir = Instance('IPython.core.application.ProfileDir')
408 profile_dir = Instance('IPython.core.application.ProfileDir')
409 @property
409 @property
410 def profile(self):
410 def profile(self):
411 if self.profile_dir is not None:
411 if self.profile_dir is not None:
412 name = os.path.basename(self.profile_dir.location)
412 name = os.path.basename(self.profile_dir.location)
413 return name.replace('profile_','')
413 return name.replace('profile_','')
414
414
415
415
416 # Private interface
416 # Private interface
417 _post_execute = Instance(dict)
417 _post_execute = Instance(dict)
418
418
419 # Tracks any GUI loop loaded for pylab
419 # Tracks any GUI loop loaded for pylab
420 pylab_gui_select = None
420 pylab_gui_select = None
421
421
422 def __init__(self, config=None, ipython_dir=None, profile_dir=None,
422 def __init__(self, config=None, ipython_dir=None, profile_dir=None,
423 user_module=None, user_ns=None,
423 user_module=None, user_ns=None,
424 custom_exceptions=((), None), **kwargs):
424 custom_exceptions=((), None), **kwargs):
425
425
426 # This is where traits with a config_key argument are updated
426 # This is where traits with a config_key argument are updated
427 # from the values on config.
427 # from the values on config.
428 super(InteractiveShell, self).__init__(config=config, **kwargs)
428 super(InteractiveShell, self).__init__(config=config, **kwargs)
429 self.configurables = [self]
429 self.configurables = [self]
430
430
431 # These are relatively independent and stateless
431 # These are relatively independent and stateless
432 self.init_ipython_dir(ipython_dir)
432 self.init_ipython_dir(ipython_dir)
433 self.init_profile_dir(profile_dir)
433 self.init_profile_dir(profile_dir)
434 self.init_instance_attrs()
434 self.init_instance_attrs()
435 self.init_environment()
435 self.init_environment()
436
436
437 # Check if we're in a virtualenv, and set up sys.path.
437 # Check if we're in a virtualenv, and set up sys.path.
438 self.init_virtualenv()
438 self.init_virtualenv()
439
439
440 # Create namespaces (user_ns, user_global_ns, etc.)
440 # Create namespaces (user_ns, user_global_ns, etc.)
441 self.init_create_namespaces(user_module, user_ns)
441 self.init_create_namespaces(user_module, user_ns)
442 # This has to be done after init_create_namespaces because it uses
442 # This has to be done after init_create_namespaces because it uses
443 # something in self.user_ns, but before init_sys_modules, which
443 # something in self.user_ns, but before init_sys_modules, which
444 # is the first thing to modify sys.
444 # is the first thing to modify sys.
445 # TODO: When we override sys.stdout and sys.stderr before this class
445 # TODO: When we override sys.stdout and sys.stderr before this class
446 # is created, we are saving the overridden ones here. Not sure if this
446 # is created, we are saving the overridden ones here. Not sure if this
447 # is what we want to do.
447 # is what we want to do.
448 self.save_sys_module_state()
448 self.save_sys_module_state()
449 self.init_sys_modules()
449 self.init_sys_modules()
450
450
451 # While we're trying to have each part of the code directly access what
451 # While we're trying to have each part of the code directly access what
452 # it needs without keeping redundant references to objects, we have too
452 # it needs without keeping redundant references to objects, we have too
453 # much legacy code that expects ip.db to exist.
453 # much legacy code that expects ip.db to exist.
454 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
454 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
455
455
456 self.init_history()
456 self.init_history()
457 self.init_encoding()
457 self.init_encoding()
458 self.init_prefilter()
458 self.init_prefilter()
459
459
460 self.init_syntax_highlighting()
460 self.init_syntax_highlighting()
461 self.init_hooks()
461 self.init_hooks()
462 self.init_pushd_popd_magic()
462 self.init_pushd_popd_magic()
463 # self.init_traceback_handlers use to be here, but we moved it below
463 # self.init_traceback_handlers use to be here, but we moved it below
464 # because it and init_io have to come after init_readline.
464 # because it and init_io have to come after init_readline.
465 self.init_user_ns()
465 self.init_user_ns()
466 self.init_logger()
466 self.init_logger()
467 self.init_alias()
467 self.init_alias()
468 self.init_builtins()
468 self.init_builtins()
469
469
470 # The following was in post_config_initialization
470 # The following was in post_config_initialization
471 self.init_inspector()
471 self.init_inspector()
472 # init_readline() must come before init_io(), because init_io uses
472 # init_readline() must come before init_io(), because init_io uses
473 # readline related things.
473 # readline related things.
474 self.init_readline()
474 self.init_readline()
475 # We save this here in case user code replaces raw_input, but it needs
475 # We save this here in case user code replaces raw_input, but it needs
476 # to be after init_readline(), because PyPy's readline works by replacing
476 # to be after init_readline(), because PyPy's readline works by replacing
477 # raw_input.
477 # raw_input.
478 if py3compat.PY3:
478 if py3compat.PY3:
479 self.raw_input_original = input
479 self.raw_input_original = input
480 else:
480 else:
481 self.raw_input_original = raw_input
481 self.raw_input_original = raw_input
482 # init_completer must come after init_readline, because it needs to
482 # init_completer must come after init_readline, because it needs to
483 # know whether readline is present or not system-wide to configure the
483 # know whether readline is present or not system-wide to configure the
484 # completers, since the completion machinery can now operate
484 # completers, since the completion machinery can now operate
485 # independently of readline (e.g. over the network)
485 # independently of readline (e.g. over the network)
486 self.init_completer()
486 self.init_completer()
487 # TODO: init_io() needs to happen before init_traceback handlers
487 # TODO: init_io() needs to happen before init_traceback handlers
488 # because the traceback handlers hardcode the stdout/stderr streams.
488 # because the traceback handlers hardcode the stdout/stderr streams.
489 # This logic in in debugger.Pdb and should eventually be changed.
489 # This logic in in debugger.Pdb and should eventually be changed.
490 self.init_io()
490 self.init_io()
491 self.init_traceback_handlers(custom_exceptions)
491 self.init_traceback_handlers(custom_exceptions)
492 self.init_prompts()
492 self.init_prompts()
493 self.init_display_formatter()
493 self.init_display_formatter()
494 self.init_display_pub()
494 self.init_display_pub()
495 self.init_data_pub()
495 self.init_data_pub()
496 self.init_displayhook()
496 self.init_displayhook()
497 self.init_latextool()
497 self.init_latextool()
498 self.init_magics()
498 self.init_magics()
499 self.init_logstart()
499 self.init_logstart()
500 self.init_pdb()
500 self.init_pdb()
501 self.init_extension_manager()
501 self.init_extension_manager()
502 self.init_payload()
502 self.init_payload()
503 self.hooks.late_startup_hook()
503 self.hooks.late_startup_hook()
504 atexit.register(self.atexit_operations)
504 atexit.register(self.atexit_operations)
505
505
506 def get_ipython(self):
506 def get_ipython(self):
507 """Return the currently running IPython instance."""
507 """Return the currently running IPython instance."""
508 return self
508 return self
509
509
510 #-------------------------------------------------------------------------
510 #-------------------------------------------------------------------------
511 # Trait changed handlers
511 # Trait changed handlers
512 #-------------------------------------------------------------------------
512 #-------------------------------------------------------------------------
513
513
514 def _ipython_dir_changed(self, name, new):
514 def _ipython_dir_changed(self, name, new):
515 if not os.path.isdir(new):
515 if not os.path.isdir(new):
516 os.makedirs(new, mode = 0o777)
516 os.makedirs(new, mode = 0o777)
517
517
518 def set_autoindent(self,value=None):
518 def set_autoindent(self,value=None):
519 """Set the autoindent flag, checking for readline support.
519 """Set the autoindent flag, checking for readline support.
520
520
521 If called with no arguments, it acts as a toggle."""
521 If called with no arguments, it acts as a toggle."""
522
522
523 if value != 0 and not self.has_readline:
523 if value != 0 and not self.has_readline:
524 if os.name == 'posix':
524 if os.name == 'posix':
525 warn("The auto-indent feature requires the readline library")
525 warn("The auto-indent feature requires the readline library")
526 self.autoindent = 0
526 self.autoindent = 0
527 return
527 return
528 if value is None:
528 if value is None:
529 self.autoindent = not self.autoindent
529 self.autoindent = not self.autoindent
530 else:
530 else:
531 self.autoindent = value
531 self.autoindent = value
532
532
533 #-------------------------------------------------------------------------
533 #-------------------------------------------------------------------------
534 # init_* methods called by __init__
534 # init_* methods called by __init__
535 #-------------------------------------------------------------------------
535 #-------------------------------------------------------------------------
536
536
537 def init_ipython_dir(self, ipython_dir):
537 def init_ipython_dir(self, ipython_dir):
538 if ipython_dir is not None:
538 if ipython_dir is not None:
539 self.ipython_dir = ipython_dir
539 self.ipython_dir = ipython_dir
540 return
540 return
541
541
542 self.ipython_dir = get_ipython_dir()
542 self.ipython_dir = get_ipython_dir()
543
543
544 def init_profile_dir(self, profile_dir):
544 def init_profile_dir(self, profile_dir):
545 if profile_dir is not None:
545 if profile_dir is not None:
546 self.profile_dir = profile_dir
546 self.profile_dir = profile_dir
547 return
547 return
548 self.profile_dir =\
548 self.profile_dir =\
549 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
549 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
550
550
551 def init_instance_attrs(self):
551 def init_instance_attrs(self):
552 self.more = False
552 self.more = False
553
553
554 # command compiler
554 # command compiler
555 self.compile = CachingCompiler()
555 self.compile = CachingCompiler()
556
556
557 # Make an empty namespace, which extension writers can rely on both
557 # Make an empty namespace, which extension writers can rely on both
558 # existing and NEVER being used by ipython itself. This gives them a
558 # existing and NEVER being used by ipython itself. This gives them a
559 # convenient location for storing additional information and state
559 # convenient location for storing additional information and state
560 # their extensions may require, without fear of collisions with other
560 # their extensions may require, without fear of collisions with other
561 # ipython names that may develop later.
561 # ipython names that may develop later.
562 self.meta = Struct()
562 self.meta = Struct()
563
563
564 # Temporary files used for various purposes. Deleted at exit.
564 # Temporary files used for various purposes. Deleted at exit.
565 self.tempfiles = []
565 self.tempfiles = []
566
566
567 # Keep track of readline usage (later set by init_readline)
567 # Keep track of readline usage (later set by init_readline)
568 self.has_readline = False
568 self.has_readline = False
569
569
570 # keep track of where we started running (mainly for crash post-mortem)
570 # keep track of where we started running (mainly for crash post-mortem)
571 # This is not being used anywhere currently.
571 # This is not being used anywhere currently.
572 self.starting_dir = os.getcwdu()
572 self.starting_dir = os.getcwdu()
573
573
574 # Indentation management
574 # Indentation management
575 self.indent_current_nsp = 0
575 self.indent_current_nsp = 0
576
576
577 # Dict to track post-execution functions that have been registered
577 # Dict to track post-execution functions that have been registered
578 self._post_execute = {}
578 self._post_execute = {}
579
579
580 def init_environment(self):
580 def init_environment(self):
581 """Any changes we need to make to the user's environment."""
581 """Any changes we need to make to the user's environment."""
582 pass
582 pass
583
583
584 def init_encoding(self):
584 def init_encoding(self):
585 # Get system encoding at startup time. Certain terminals (like Emacs
585 # Get system encoding at startup time. Certain terminals (like Emacs
586 # under Win32 have it set to None, and we need to have a known valid
586 # under Win32 have it set to None, and we need to have a known valid
587 # encoding to use in the raw_input() method
587 # encoding to use in the raw_input() method
588 try:
588 try:
589 self.stdin_encoding = sys.stdin.encoding or 'ascii'
589 self.stdin_encoding = sys.stdin.encoding or 'ascii'
590 except AttributeError:
590 except AttributeError:
591 self.stdin_encoding = 'ascii'
591 self.stdin_encoding = 'ascii'
592
592
593 def init_syntax_highlighting(self):
593 def init_syntax_highlighting(self):
594 # Python source parser/formatter for syntax highlighting
594 # Python source parser/formatter for syntax highlighting
595 pyformat = PyColorize.Parser().format
595 pyformat = PyColorize.Parser().format
596 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
596 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
597
597
598 def init_pushd_popd_magic(self):
598 def init_pushd_popd_magic(self):
599 # for pushd/popd management
599 # for pushd/popd management
600 self.home_dir = get_home_dir()
600 self.home_dir = get_home_dir()
601
601
602 self.dir_stack = []
602 self.dir_stack = []
603
603
604 def init_logger(self):
604 def init_logger(self):
605 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
605 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
606 logmode='rotate')
606 logmode='rotate')
607
607
608 def init_logstart(self):
608 def init_logstart(self):
609 """Initialize logging in case it was requested at the command line.
609 """Initialize logging in case it was requested at the command line.
610 """
610 """
611 if self.logappend:
611 if self.logappend:
612 self.magic('logstart %s append' % self.logappend)
612 self.magic('logstart %s append' % self.logappend)
613 elif self.logfile:
613 elif self.logfile:
614 self.magic('logstart %s' % self.logfile)
614 self.magic('logstart %s' % self.logfile)
615 elif self.logstart:
615 elif self.logstart:
616 self.magic('logstart')
616 self.magic('logstart')
617
617
618 def init_builtins(self):
618 def init_builtins(self):
619 # A single, static flag that we set to True. Its presence indicates
619 # A single, static flag that we set to True. Its presence indicates
620 # that an IPython shell has been created, and we make no attempts at
620 # that an IPython shell has been created, and we make no attempts at
621 # removing on exit or representing the existence of more than one
621 # removing on exit or representing the existence of more than one
622 # IPython at a time.
622 # IPython at a time.
623 builtin_mod.__dict__['__IPYTHON__'] = True
623 builtin_mod.__dict__['__IPYTHON__'] = True
624
624
625 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
625 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
626 # manage on enter/exit, but with all our shells it's virtually
626 # manage on enter/exit, but with all our shells it's virtually
627 # impossible to get all the cases right. We're leaving the name in for
627 # impossible to get all the cases right. We're leaving the name in for
628 # those who adapted their codes to check for this flag, but will
628 # those who adapted their codes to check for this flag, but will
629 # eventually remove it after a few more releases.
629 # eventually remove it after a few more releases.
630 builtin_mod.__dict__['__IPYTHON__active'] = \
630 builtin_mod.__dict__['__IPYTHON__active'] = \
631 'Deprecated, check for __IPYTHON__'
631 'Deprecated, check for __IPYTHON__'
632
632
633 self.builtin_trap = BuiltinTrap(shell=self)
633 self.builtin_trap = BuiltinTrap(shell=self)
634
634
635 def init_inspector(self):
635 def init_inspector(self):
636 # Object inspector
636 # Object inspector
637 self.inspector = oinspect.Inspector(oinspect.InspectColors,
637 self.inspector = oinspect.Inspector(oinspect.InspectColors,
638 PyColorize.ANSICodeColors,
638 PyColorize.ANSICodeColors,
639 'NoColor',
639 'NoColor',
640 self.object_info_string_level)
640 self.object_info_string_level)
641
641
642 def init_io(self):
642 def init_io(self):
643 # This will just use sys.stdout and sys.stderr. If you want to
643 # This will just use sys.stdout and sys.stderr. If you want to
644 # override sys.stdout and sys.stderr themselves, you need to do that
644 # override sys.stdout and sys.stderr themselves, you need to do that
645 # *before* instantiating this class, because io holds onto
645 # *before* instantiating this class, because io holds onto
646 # references to the underlying streams.
646 # references to the underlying streams.
647 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
647 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
648 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
648 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
649 else:
649 else:
650 io.stdout = io.IOStream(sys.stdout)
650 io.stdout = io.IOStream(sys.stdout)
651 io.stderr = io.IOStream(sys.stderr)
651 io.stderr = io.IOStream(sys.stderr)
652
652
653 def init_prompts(self):
653 def init_prompts(self):
654 self.prompt_manager = PromptManager(shell=self, config=self.config)
654 self.prompt_manager = PromptManager(shell=self, config=self.config)
655 self.configurables.append(self.prompt_manager)
655 self.configurables.append(self.prompt_manager)
656 # Set system prompts, so that scripts can decide if they are running
656 # Set system prompts, so that scripts can decide if they are running
657 # interactively.
657 # interactively.
658 sys.ps1 = 'In : '
658 sys.ps1 = 'In : '
659 sys.ps2 = '...: '
659 sys.ps2 = '...: '
660 sys.ps3 = 'Out: '
660 sys.ps3 = 'Out: '
661
661
662 def init_display_formatter(self):
662 def init_display_formatter(self):
663 self.display_formatter = DisplayFormatter(config=self.config)
663 self.display_formatter = DisplayFormatter(config=self.config)
664 self.configurables.append(self.display_formatter)
664 self.configurables.append(self.display_formatter)
665
665
666 def init_display_pub(self):
666 def init_display_pub(self):
667 self.display_pub = self.display_pub_class(config=self.config)
667 self.display_pub = self.display_pub_class(config=self.config)
668 self.configurables.append(self.display_pub)
668 self.configurables.append(self.display_pub)
669
669
670 def init_data_pub(self):
670 def init_data_pub(self):
671 if not self.data_pub_class:
671 if not self.data_pub_class:
672 self.data_pub = None
672 self.data_pub = None
673 return
673 return
674 self.data_pub = self.data_pub_class(config=self.config)
674 self.data_pub = self.data_pub_class(config=self.config)
675 self.configurables.append(self.data_pub)
675 self.configurables.append(self.data_pub)
676
676
677 def init_displayhook(self):
677 def init_displayhook(self):
678 # Initialize displayhook, set in/out prompts and printing system
678 # Initialize displayhook, set in/out prompts and printing system
679 self.displayhook = self.displayhook_class(
679 self.displayhook = self.displayhook_class(
680 config=self.config,
680 config=self.config,
681 shell=self,
681 shell=self,
682 cache_size=self.cache_size,
682 cache_size=self.cache_size,
683 )
683 )
684 self.configurables.append(self.displayhook)
684 self.configurables.append(self.displayhook)
685 # This is a context manager that installs/revmoes the displayhook at
685 # This is a context manager that installs/revmoes the displayhook at
686 # the appropriate time.
686 # the appropriate time.
687 self.display_trap = DisplayTrap(hook=self.displayhook)
687 self.display_trap = DisplayTrap(hook=self.displayhook)
688
688
689 def init_latextool(self):
689 def init_latextool(self):
690 """Configure LaTeXTool."""
690 """Configure LaTeXTool."""
691 cfg = LaTeXTool.instance(config=self.config)
691 cfg = LaTeXTool.instance(config=self.config)
692 if cfg not in self.configurables:
692 if cfg not in self.configurables:
693 self.configurables.append(cfg)
693 self.configurables.append(cfg)
694
694
695 def init_virtualenv(self):
695 def init_virtualenv(self):
696 """Add a virtualenv to sys.path so the user can import modules from it.
696 """Add a virtualenv to sys.path so the user can import modules from it.
697 This isn't perfect: it doesn't use the Python interpreter with which the
697 This isn't perfect: it doesn't use the Python interpreter with which the
698 virtualenv was built, and it ignores the --no-site-packages option. A
698 virtualenv was built, and it ignores the --no-site-packages option. A
699 warning will appear suggesting the user installs IPython in the
699 warning will appear suggesting the user installs IPython in the
700 virtualenv, but for many cases, it probably works well enough.
700 virtualenv, but for many cases, it probably works well enough.
701
701
702 Adapted from code snippets online.
702 Adapted from code snippets online.
703
703
704 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
704 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
705 """
705 """
706 if 'VIRTUAL_ENV' not in os.environ:
706 if 'VIRTUAL_ENV' not in os.environ:
707 # Not in a virtualenv
707 # Not in a virtualenv
708 return
708 return
709
709
710 if sys.executable.startswith(os.environ['VIRTUAL_ENV']):
710 if sys.executable.startswith(os.environ['VIRTUAL_ENV']):
711 # Running properly in the virtualenv, don't need to do anything
711 # Running properly in the virtualenv, don't need to do anything
712 return
712 return
713
713
714 warn("Attempting to work in a virtualenv. If you encounter problems, please "
714 warn("Attempting to work in a virtualenv. If you encounter problems, please "
715 "install IPython inside the virtualenv.")
715 "install IPython inside the virtualenv.")
716 if sys.platform == "win32":
716 if sys.platform == "win32":
717 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
717 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
718 else:
718 else:
719 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
719 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
720 'python%d.%d' % sys.version_info[:2], 'site-packages')
720 'python%d.%d' % sys.version_info[:2], 'site-packages')
721
721
722 import site
722 import site
723 sys.path.insert(0, virtual_env)
723 sys.path.insert(0, virtual_env)
724 site.addsitedir(virtual_env)
724 site.addsitedir(virtual_env)
725
725
726 #-------------------------------------------------------------------------
726 #-------------------------------------------------------------------------
727 # Things related to injections into the sys module
727 # Things related to injections into the sys module
728 #-------------------------------------------------------------------------
728 #-------------------------------------------------------------------------
729
729
730 def save_sys_module_state(self):
730 def save_sys_module_state(self):
731 """Save the state of hooks in the sys module.
731 """Save the state of hooks in the sys module.
732
732
733 This has to be called after self.user_module is created.
733 This has to be called after self.user_module is created.
734 """
734 """
735 self._orig_sys_module_state = {}
735 self._orig_sys_module_state = {}
736 self._orig_sys_module_state['stdin'] = sys.stdin
736 self._orig_sys_module_state['stdin'] = sys.stdin
737 self._orig_sys_module_state['stdout'] = sys.stdout
737 self._orig_sys_module_state['stdout'] = sys.stdout
738 self._orig_sys_module_state['stderr'] = sys.stderr
738 self._orig_sys_module_state['stderr'] = sys.stderr
739 self._orig_sys_module_state['excepthook'] = sys.excepthook
739 self._orig_sys_module_state['excepthook'] = sys.excepthook
740 self._orig_sys_modules_main_name = self.user_module.__name__
740 self._orig_sys_modules_main_name = self.user_module.__name__
741 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
741 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
742
742
743 def restore_sys_module_state(self):
743 def restore_sys_module_state(self):
744 """Restore the state of the sys module."""
744 """Restore the state of the sys module."""
745 try:
745 try:
746 for k, v in self._orig_sys_module_state.iteritems():
746 for k, v in self._orig_sys_module_state.iteritems():
747 setattr(sys, k, v)
747 setattr(sys, k, v)
748 except AttributeError:
748 except AttributeError:
749 pass
749 pass
750 # Reset what what done in self.init_sys_modules
750 # Reset what what done in self.init_sys_modules
751 if self._orig_sys_modules_main_mod is not None:
751 if self._orig_sys_modules_main_mod is not None:
752 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
752 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
753
753
754 #-------------------------------------------------------------------------
754 #-------------------------------------------------------------------------
755 # Things related to hooks
755 # Things related to hooks
756 #-------------------------------------------------------------------------
756 #-------------------------------------------------------------------------
757
757
758 def init_hooks(self):
758 def init_hooks(self):
759 # hooks holds pointers used for user-side customizations
759 # hooks holds pointers used for user-side customizations
760 self.hooks = Struct()
760 self.hooks = Struct()
761
761
762 self.strdispatchers = {}
762 self.strdispatchers = {}
763
763
764 # Set all default hooks, defined in the IPython.hooks module.
764 # Set all default hooks, defined in the IPython.hooks module.
765 hooks = IPython.core.hooks
765 hooks = IPython.core.hooks
766 for hook_name in hooks.__all__:
766 for hook_name in hooks.__all__:
767 # default hooks have priority 100, i.e. low; user hooks should have
767 # default hooks have priority 100, i.e. low; user hooks should have
768 # 0-100 priority
768 # 0-100 priority
769 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
769 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
770
770
771 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
771 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
772 """set_hook(name,hook) -> sets an internal IPython hook.
772 """set_hook(name,hook) -> sets an internal IPython hook.
773
773
774 IPython exposes some of its internal API as user-modifiable hooks. By
774 IPython exposes some of its internal API as user-modifiable hooks. By
775 adding your function to one of these hooks, you can modify IPython's
775 adding your function to one of these hooks, you can modify IPython's
776 behavior to call at runtime your own routines."""
776 behavior to call at runtime your own routines."""
777
777
778 # At some point in the future, this should validate the hook before it
778 # At some point in the future, this should validate the hook before it
779 # accepts it. Probably at least check that the hook takes the number
779 # accepts it. Probably at least check that the hook takes the number
780 # of args it's supposed to.
780 # of args it's supposed to.
781
781
782 f = types.MethodType(hook,self)
782 f = types.MethodType(hook,self)
783
783
784 # check if the hook is for strdispatcher first
784 # check if the hook is for strdispatcher first
785 if str_key is not None:
785 if str_key is not None:
786 sdp = self.strdispatchers.get(name, StrDispatch())
786 sdp = self.strdispatchers.get(name, StrDispatch())
787 sdp.add_s(str_key, f, priority )
787 sdp.add_s(str_key, f, priority )
788 self.strdispatchers[name] = sdp
788 self.strdispatchers[name] = sdp
789 return
789 return
790 if re_key is not None:
790 if re_key is not None:
791 sdp = self.strdispatchers.get(name, StrDispatch())
791 sdp = self.strdispatchers.get(name, StrDispatch())
792 sdp.add_re(re.compile(re_key), f, priority )
792 sdp.add_re(re.compile(re_key), f, priority )
793 self.strdispatchers[name] = sdp
793 self.strdispatchers[name] = sdp
794 return
794 return
795
795
796 dp = getattr(self.hooks, name, None)
796 dp = getattr(self.hooks, name, None)
797 if name not in IPython.core.hooks.__all__:
797 if name not in IPython.core.hooks.__all__:
798 print("Warning! Hook '%s' is not one of %s" % \
798 print("Warning! Hook '%s' is not one of %s" % \
799 (name, IPython.core.hooks.__all__ ))
799 (name, IPython.core.hooks.__all__ ))
800 if not dp:
800 if not dp:
801 dp = IPython.core.hooks.CommandChainDispatcher()
801 dp = IPython.core.hooks.CommandChainDispatcher()
802
802
803 try:
803 try:
804 dp.add(f,priority)
804 dp.add(f,priority)
805 except AttributeError:
805 except AttributeError:
806 # it was not commandchain, plain old func - replace
806 # it was not commandchain, plain old func - replace
807 dp = f
807 dp = f
808
808
809 setattr(self.hooks,name, dp)
809 setattr(self.hooks,name, dp)
810
810
811 def register_post_execute(self, func):
811 def register_post_execute(self, func):
812 """Register a function for calling after code execution.
812 """Register a function for calling after code execution.
813 """
813 """
814 if not callable(func):
814 if not callable(func):
815 raise ValueError('argument %s must be callable' % func)
815 raise ValueError('argument %s must be callable' % func)
816 self._post_execute[func] = True
816 self._post_execute[func] = True
817
817
818 #-------------------------------------------------------------------------
818 #-------------------------------------------------------------------------
819 # Things related to the "main" module
819 # Things related to the "main" module
820 #-------------------------------------------------------------------------
820 #-------------------------------------------------------------------------
821
821
822 def new_main_mod(self,ns=None):
822 def new_main_mod(self,ns=None):
823 """Return a new 'main' module object for user code execution.
823 """Return a new 'main' module object for user code execution.
824 """
824 """
825 main_mod = self._user_main_module
825 main_mod = self._user_main_module
826 init_fakemod_dict(main_mod,ns)
826 init_fakemod_dict(main_mod,ns)
827 return main_mod
827 return main_mod
828
828
829 def cache_main_mod(self,ns,fname):
829 def cache_main_mod(self,ns,fname):
830 """Cache a main module's namespace.
830 """Cache a main module's namespace.
831
831
832 When scripts are executed via %run, we must keep a reference to the
832 When scripts are executed via %run, we must keep a reference to the
833 namespace of their __main__ module (a FakeModule instance) around so
833 namespace of their __main__ module (a FakeModule instance) around so
834 that Python doesn't clear it, rendering objects defined therein
834 that Python doesn't clear it, rendering objects defined therein
835 useless.
835 useless.
836
836
837 This method keeps said reference in a private dict, keyed by the
837 This method keeps said reference in a private dict, keyed by the
838 absolute path of the module object (which corresponds to the script
838 absolute path of the module object (which corresponds to the script
839 path). This way, for multiple executions of the same script we only
839 path). This way, for multiple executions of the same script we only
840 keep one copy of the namespace (the last one), thus preventing memory
840 keep one copy of the namespace (the last one), thus preventing memory
841 leaks from old references while allowing the objects from the last
841 leaks from old references while allowing the objects from the last
842 execution to be accessible.
842 execution to be accessible.
843
843
844 Note: we can not allow the actual FakeModule instances to be deleted,
844 Note: we can not allow the actual FakeModule instances to be deleted,
845 because of how Python tears down modules (it hard-sets all their
845 because of how Python tears down modules (it hard-sets all their
846 references to None without regard for reference counts). This method
846 references to None without regard for reference counts). This method
847 must therefore make a *copy* of the given namespace, to allow the
847 must therefore make a *copy* of the given namespace, to allow the
848 original module's __dict__ to be cleared and reused.
848 original module's __dict__ to be cleared and reused.
849
849
850
850
851 Parameters
851 Parameters
852 ----------
852 ----------
853 ns : a namespace (a dict, typically)
853 ns : a namespace (a dict, typically)
854
854
855 fname : str
855 fname : str
856 Filename associated with the namespace.
856 Filename associated with the namespace.
857
857
858 Examples
858 Examples
859 --------
859 --------
860
860
861 In [10]: import IPython
861 In [10]: import IPython
862
862
863 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
863 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
864
864
865 In [12]: IPython.__file__ in _ip._main_ns_cache
865 In [12]: IPython.__file__ in _ip._main_ns_cache
866 Out[12]: True
866 Out[12]: True
867 """
867 """
868 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
868 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
869
869
870 def clear_main_mod_cache(self):
870 def clear_main_mod_cache(self):
871 """Clear the cache of main modules.
871 """Clear the cache of main modules.
872
872
873 Mainly for use by utilities like %reset.
873 Mainly for use by utilities like %reset.
874
874
875 Examples
875 Examples
876 --------
876 --------
877
877
878 In [15]: import IPython
878 In [15]: import IPython
879
879
880 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
880 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
881
881
882 In [17]: len(_ip._main_ns_cache) > 0
882 In [17]: len(_ip._main_ns_cache) > 0
883 Out[17]: True
883 Out[17]: True
884
884
885 In [18]: _ip.clear_main_mod_cache()
885 In [18]: _ip.clear_main_mod_cache()
886
886
887 In [19]: len(_ip._main_ns_cache) == 0
887 In [19]: len(_ip._main_ns_cache) == 0
888 Out[19]: True
888 Out[19]: True
889 """
889 """
890 self._main_ns_cache.clear()
890 self._main_ns_cache.clear()
891
891
892 #-------------------------------------------------------------------------
892 #-------------------------------------------------------------------------
893 # Things related to debugging
893 # Things related to debugging
894 #-------------------------------------------------------------------------
894 #-------------------------------------------------------------------------
895
895
896 def init_pdb(self):
896 def init_pdb(self):
897 # Set calling of pdb on exceptions
897 # Set calling of pdb on exceptions
898 # self.call_pdb is a property
898 # self.call_pdb is a property
899 self.call_pdb = self.pdb
899 self.call_pdb = self.pdb
900
900
901 def _get_call_pdb(self):
901 def _get_call_pdb(self):
902 return self._call_pdb
902 return self._call_pdb
903
903
904 def _set_call_pdb(self,val):
904 def _set_call_pdb(self,val):
905
905
906 if val not in (0,1,False,True):
906 if val not in (0,1,False,True):
907 raise ValueError('new call_pdb value must be boolean')
907 raise ValueError('new call_pdb value must be boolean')
908
908
909 # store value in instance
909 # store value in instance
910 self._call_pdb = val
910 self._call_pdb = val
911
911
912 # notify the actual exception handlers
912 # notify the actual exception handlers
913 self.InteractiveTB.call_pdb = val
913 self.InteractiveTB.call_pdb = val
914
914
915 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
915 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
916 'Control auto-activation of pdb at exceptions')
916 'Control auto-activation of pdb at exceptions')
917
917
918 def debugger(self,force=False):
918 def debugger(self,force=False):
919 """Call the pydb/pdb debugger.
919 """Call the pydb/pdb debugger.
920
920
921 Keywords:
921 Keywords:
922
922
923 - force(False): by default, this routine checks the instance call_pdb
923 - force(False): by default, this routine checks the instance call_pdb
924 flag and does not actually invoke the debugger if the flag is false.
924 flag and does not actually invoke the debugger if the flag is false.
925 The 'force' option forces the debugger to activate even if the flag
925 The 'force' option forces the debugger to activate even if the flag
926 is false.
926 is false.
927 """
927 """
928
928
929 if not (force or self.call_pdb):
929 if not (force or self.call_pdb):
930 return
930 return
931
931
932 if not hasattr(sys,'last_traceback'):
932 if not hasattr(sys,'last_traceback'):
933 error('No traceback has been produced, nothing to debug.')
933 error('No traceback has been produced, nothing to debug.')
934 return
934 return
935
935
936 # use pydb if available
936 # use pydb if available
937 if debugger.has_pydb:
937 if debugger.has_pydb:
938 from pydb import pm
938 from pydb import pm
939 else:
939 else:
940 # fallback to our internal debugger
940 # fallback to our internal debugger
941 pm = lambda : self.InteractiveTB.debugger(force=True)
941 pm = lambda : self.InteractiveTB.debugger(force=True)
942
942
943 with self.readline_no_record:
943 with self.readline_no_record:
944 pm()
944 pm()
945
945
946 #-------------------------------------------------------------------------
946 #-------------------------------------------------------------------------
947 # Things related to IPython's various namespaces
947 # Things related to IPython's various namespaces
948 #-------------------------------------------------------------------------
948 #-------------------------------------------------------------------------
949 default_user_namespaces = True
949 default_user_namespaces = True
950
950
951 def init_create_namespaces(self, user_module=None, user_ns=None):
951 def init_create_namespaces(self, user_module=None, user_ns=None):
952 # Create the namespace where the user will operate. user_ns is
952 # Create the namespace where the user will operate. user_ns is
953 # normally the only one used, and it is passed to the exec calls as
953 # normally the only one used, and it is passed to the exec calls as
954 # the locals argument. But we do carry a user_global_ns namespace
954 # the locals argument. But we do carry a user_global_ns namespace
955 # given as the exec 'globals' argument, This is useful in embedding
955 # given as the exec 'globals' argument, This is useful in embedding
956 # situations where the ipython shell opens in a context where the
956 # situations where the ipython shell opens in a context where the
957 # distinction between locals and globals is meaningful. For
957 # distinction between locals and globals is meaningful. For
958 # non-embedded contexts, it is just the same object as the user_ns dict.
958 # non-embedded contexts, it is just the same object as the user_ns dict.
959
959
960 # FIXME. For some strange reason, __builtins__ is showing up at user
960 # FIXME. For some strange reason, __builtins__ is showing up at user
961 # level as a dict instead of a module. This is a manual fix, but I
961 # level as a dict instead of a module. This is a manual fix, but I
962 # should really track down where the problem is coming from. Alex
962 # should really track down where the problem is coming from. Alex
963 # Schmolck reported this problem first.
963 # Schmolck reported this problem first.
964
964
965 # A useful post by Alex Martelli on this topic:
965 # A useful post by Alex Martelli on this topic:
966 # Re: inconsistent value from __builtins__
966 # Re: inconsistent value from __builtins__
967 # Von: Alex Martelli <aleaxit@yahoo.com>
967 # Von: Alex Martelli <aleaxit@yahoo.com>
968 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
968 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
969 # Gruppen: comp.lang.python
969 # Gruppen: comp.lang.python
970
970
971 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
971 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
972 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
972 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
973 # > <type 'dict'>
973 # > <type 'dict'>
974 # > >>> print type(__builtins__)
974 # > >>> print type(__builtins__)
975 # > <type 'module'>
975 # > <type 'module'>
976 # > Is this difference in return value intentional?
976 # > Is this difference in return value intentional?
977
977
978 # Well, it's documented that '__builtins__' can be either a dictionary
978 # Well, it's documented that '__builtins__' can be either a dictionary
979 # or a module, and it's been that way for a long time. Whether it's
979 # or a module, and it's been that way for a long time. Whether it's
980 # intentional (or sensible), I don't know. In any case, the idea is
980 # intentional (or sensible), I don't know. In any case, the idea is
981 # that if you need to access the built-in namespace directly, you
981 # that if you need to access the built-in namespace directly, you
982 # should start with "import __builtin__" (note, no 's') which will
982 # should start with "import __builtin__" (note, no 's') which will
983 # definitely give you a module. Yeah, it's somewhat confusing:-(.
983 # definitely give you a module. Yeah, it's somewhat confusing:-(.
984
984
985 # These routines return a properly built module and dict as needed by
985 # These routines return a properly built module and dict as needed by
986 # the rest of the code, and can also be used by extension writers to
986 # the rest of the code, and can also be used by extension writers to
987 # generate properly initialized namespaces.
987 # generate properly initialized namespaces.
988 if (user_ns is not None) or (user_module is not None):
988 if (user_ns is not None) or (user_module is not None):
989 self.default_user_namespaces = False
989 self.default_user_namespaces = False
990 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
990 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
991
991
992 # A record of hidden variables we have added to the user namespace, so
992 # A record of hidden variables we have added to the user namespace, so
993 # we can list later only variables defined in actual interactive use.
993 # we can list later only variables defined in actual interactive use.
994 self.user_ns_hidden = set()
994 self.user_ns_hidden = set()
995
995
996 # Now that FakeModule produces a real module, we've run into a nasty
996 # Now that FakeModule produces a real module, we've run into a nasty
997 # problem: after script execution (via %run), the module where the user
997 # problem: after script execution (via %run), the module where the user
998 # code ran is deleted. Now that this object is a true module (needed
998 # code ran is deleted. Now that this object is a true module (needed
999 # so docetst and other tools work correctly), the Python module
999 # so docetst and other tools work correctly), the Python module
1000 # teardown mechanism runs over it, and sets to None every variable
1000 # teardown mechanism runs over it, and sets to None every variable
1001 # present in that module. Top-level references to objects from the
1001 # present in that module. Top-level references to objects from the
1002 # script survive, because the user_ns is updated with them. However,
1002 # script survive, because the user_ns is updated with them. However,
1003 # calling functions defined in the script that use other things from
1003 # calling functions defined in the script that use other things from
1004 # the script will fail, because the function's closure had references
1004 # the script will fail, because the function's closure had references
1005 # to the original objects, which are now all None. So we must protect
1005 # to the original objects, which are now all None. So we must protect
1006 # these modules from deletion by keeping a cache.
1006 # these modules from deletion by keeping a cache.
1007 #
1007 #
1008 # To avoid keeping stale modules around (we only need the one from the
1008 # To avoid keeping stale modules around (we only need the one from the
1009 # last run), we use a dict keyed with the full path to the script, so
1009 # last run), we use a dict keyed with the full path to the script, so
1010 # only the last version of the module is held in the cache. Note,
1010 # only the last version of the module is held in the cache. Note,
1011 # however, that we must cache the module *namespace contents* (their
1011 # however, that we must cache the module *namespace contents* (their
1012 # __dict__). Because if we try to cache the actual modules, old ones
1012 # __dict__). Because if we try to cache the actual modules, old ones
1013 # (uncached) could be destroyed while still holding references (such as
1013 # (uncached) could be destroyed while still holding references (such as
1014 # those held by GUI objects that tend to be long-lived)>
1014 # those held by GUI objects that tend to be long-lived)>
1015 #
1015 #
1016 # The %reset command will flush this cache. See the cache_main_mod()
1016 # The %reset command will flush this cache. See the cache_main_mod()
1017 # and clear_main_mod_cache() methods for details on use.
1017 # and clear_main_mod_cache() methods for details on use.
1018
1018
1019 # This is the cache used for 'main' namespaces
1019 # This is the cache used for 'main' namespaces
1020 self._main_ns_cache = {}
1020 self._main_ns_cache = {}
1021 # And this is the single instance of FakeModule whose __dict__ we keep
1021 # And this is the single instance of FakeModule whose __dict__ we keep
1022 # copying and clearing for reuse on each %run
1022 # copying and clearing for reuse on each %run
1023 self._user_main_module = FakeModule()
1023 self._user_main_module = FakeModule()
1024
1024
1025 # A table holding all the namespaces IPython deals with, so that
1025 # A table holding all the namespaces IPython deals with, so that
1026 # introspection facilities can search easily.
1026 # introspection facilities can search easily.
1027 self.ns_table = {'user_global':self.user_module.__dict__,
1027 self.ns_table = {'user_global':self.user_module.__dict__,
1028 'user_local':self.user_ns,
1028 'user_local':self.user_ns,
1029 'builtin':builtin_mod.__dict__
1029 'builtin':builtin_mod.__dict__
1030 }
1030 }
1031
1031
1032 @property
1032 @property
1033 def user_global_ns(self):
1033 def user_global_ns(self):
1034 return self.user_module.__dict__
1034 return self.user_module.__dict__
1035
1035
1036 def prepare_user_module(self, user_module=None, user_ns=None):
1036 def prepare_user_module(self, user_module=None, user_ns=None):
1037 """Prepare the module and namespace in which user code will be run.
1037 """Prepare the module and namespace in which user code will be run.
1038
1038
1039 When IPython is started normally, both parameters are None: a new module
1039 When IPython is started normally, both parameters are None: a new module
1040 is created automatically, and its __dict__ used as the namespace.
1040 is created automatically, and its __dict__ used as the namespace.
1041
1041
1042 If only user_module is provided, its __dict__ is used as the namespace.
1042 If only user_module is provided, its __dict__ is used as the namespace.
1043 If only user_ns is provided, a dummy module is created, and user_ns
1043 If only user_ns is provided, a dummy module is created, and user_ns
1044 becomes the global namespace. If both are provided (as they may be
1044 becomes the global namespace. If both are provided (as they may be
1045 when embedding), user_ns is the local namespace, and user_module
1045 when embedding), user_ns is the local namespace, and user_module
1046 provides the global namespace.
1046 provides the global namespace.
1047
1047
1048 Parameters
1048 Parameters
1049 ----------
1049 ----------
1050 user_module : module, optional
1050 user_module : module, optional
1051 The current user module in which IPython is being run. If None,
1051 The current user module in which IPython is being run. If None,
1052 a clean module will be created.
1052 a clean module will be created.
1053 user_ns : dict, optional
1053 user_ns : dict, optional
1054 A namespace in which to run interactive commands.
1054 A namespace in which to run interactive commands.
1055
1055
1056 Returns
1056 Returns
1057 -------
1057 -------
1058 A tuple of user_module and user_ns, each properly initialised.
1058 A tuple of user_module and user_ns, each properly initialised.
1059 """
1059 """
1060 if user_module is None and user_ns is not None:
1060 if user_module is None and user_ns is not None:
1061 user_ns.setdefault("__name__", "__main__")
1061 user_ns.setdefault("__name__", "__main__")
1062 class DummyMod(object):
1062 class DummyMod(object):
1063 "A dummy module used for IPython's interactive namespace."
1063 "A dummy module used for IPython's interactive namespace."
1064 pass
1064 pass
1065 user_module = DummyMod()
1065 user_module = DummyMod()
1066 user_module.__dict__ = user_ns
1066 user_module.__dict__ = user_ns
1067
1067
1068 if user_module is None:
1068 if user_module is None:
1069 user_module = types.ModuleType("__main__",
1069 user_module = types.ModuleType("__main__",
1070 doc="Automatically created module for IPython interactive environment")
1070 doc="Automatically created module for IPython interactive environment")
1071
1071
1072 # We must ensure that __builtin__ (without the final 's') is always
1072 # We must ensure that __builtin__ (without the final 's') is always
1073 # available and pointing to the __builtin__ *module*. For more details:
1073 # available and pointing to the __builtin__ *module*. For more details:
1074 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1074 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1075 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1075 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1076 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1076 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1077
1077
1078 if user_ns is None:
1078 if user_ns is None:
1079 user_ns = user_module.__dict__
1079 user_ns = user_module.__dict__
1080
1080
1081 return user_module, user_ns
1081 return user_module, user_ns
1082
1082
1083 def init_sys_modules(self):
1083 def init_sys_modules(self):
1084 # We need to insert into sys.modules something that looks like a
1084 # We need to insert into sys.modules something that looks like a
1085 # module but which accesses the IPython namespace, for shelve and
1085 # module but which accesses the IPython namespace, for shelve and
1086 # pickle to work interactively. Normally they rely on getting
1086 # pickle to work interactively. Normally they rely on getting
1087 # everything out of __main__, but for embedding purposes each IPython
1087 # everything out of __main__, but for embedding purposes each IPython
1088 # instance has its own private namespace, so we can't go shoving
1088 # instance has its own private namespace, so we can't go shoving
1089 # everything into __main__.
1089 # everything into __main__.
1090
1090
1091 # note, however, that we should only do this for non-embedded
1091 # note, however, that we should only do this for non-embedded
1092 # ipythons, which really mimic the __main__.__dict__ with their own
1092 # ipythons, which really mimic the __main__.__dict__ with their own
1093 # namespace. Embedded instances, on the other hand, should not do
1093 # namespace. Embedded instances, on the other hand, should not do
1094 # this because they need to manage the user local/global namespaces
1094 # this because they need to manage the user local/global namespaces
1095 # only, but they live within a 'normal' __main__ (meaning, they
1095 # only, but they live within a 'normal' __main__ (meaning, they
1096 # shouldn't overtake the execution environment of the script they're
1096 # shouldn't overtake the execution environment of the script they're
1097 # embedded in).
1097 # embedded in).
1098
1098
1099 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1099 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1100 main_name = self.user_module.__name__
1100 main_name = self.user_module.__name__
1101 sys.modules[main_name] = self.user_module
1101 sys.modules[main_name] = self.user_module
1102
1102
1103 def init_user_ns(self):
1103 def init_user_ns(self):
1104 """Initialize all user-visible namespaces to their minimum defaults.
1104 """Initialize all user-visible namespaces to their minimum defaults.
1105
1105
1106 Certain history lists are also initialized here, as they effectively
1106 Certain history lists are also initialized here, as they effectively
1107 act as user namespaces.
1107 act as user namespaces.
1108
1108
1109 Notes
1109 Notes
1110 -----
1110 -----
1111 All data structures here are only filled in, they are NOT reset by this
1111 All data structures here are only filled in, they are NOT reset by this
1112 method. If they were not empty before, data will simply be added to
1112 method. If they were not empty before, data will simply be added to
1113 therm.
1113 therm.
1114 """
1114 """
1115 # This function works in two parts: first we put a few things in
1115 # This function works in two parts: first we put a few things in
1116 # user_ns, and we sync that contents into user_ns_hidden so that these
1116 # user_ns, and we sync that contents into user_ns_hidden so that these
1117 # initial variables aren't shown by %who. After the sync, we add the
1117 # initial variables aren't shown by %who. After the sync, we add the
1118 # rest of what we *do* want the user to see with %who even on a new
1118 # rest of what we *do* want the user to see with %who even on a new
1119 # session (probably nothing, so theye really only see their own stuff)
1119 # session (probably nothing, so theye really only see their own stuff)
1120
1120
1121 # The user dict must *always* have a __builtin__ reference to the
1121 # The user dict must *always* have a __builtin__ reference to the
1122 # Python standard __builtin__ namespace, which must be imported.
1122 # Python standard __builtin__ namespace, which must be imported.
1123 # This is so that certain operations in prompt evaluation can be
1123 # This is so that certain operations in prompt evaluation can be
1124 # reliably executed with builtins. Note that we can NOT use
1124 # reliably executed with builtins. Note that we can NOT use
1125 # __builtins__ (note the 's'), because that can either be a dict or a
1125 # __builtins__ (note the 's'), because that can either be a dict or a
1126 # module, and can even mutate at runtime, depending on the context
1126 # module, and can even mutate at runtime, depending on the context
1127 # (Python makes no guarantees on it). In contrast, __builtin__ is
1127 # (Python makes no guarantees on it). In contrast, __builtin__ is
1128 # always a module object, though it must be explicitly imported.
1128 # always a module object, though it must be explicitly imported.
1129
1129
1130 # For more details:
1130 # For more details:
1131 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1131 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1132 ns = dict()
1132 ns = dict()
1133
1133
1134 # Put 'help' in the user namespace
1134 # Put 'help' in the user namespace
1135 try:
1135 try:
1136 from site import _Helper
1136 from site import _Helper
1137 ns['help'] = _Helper()
1137 ns['help'] = _Helper()
1138 except ImportError:
1138 except ImportError:
1139 warn('help() not available - check site.py')
1139 warn('help() not available - check site.py')
1140
1140
1141 # make global variables for user access to the histories
1141 # make global variables for user access to the histories
1142 ns['_ih'] = self.history_manager.input_hist_parsed
1142 ns['_ih'] = self.history_manager.input_hist_parsed
1143 ns['_oh'] = self.history_manager.output_hist
1143 ns['_oh'] = self.history_manager.output_hist
1144 ns['_dh'] = self.history_manager.dir_hist
1144 ns['_dh'] = self.history_manager.dir_hist
1145
1145
1146 ns['_sh'] = shadowns
1146 ns['_sh'] = shadowns
1147
1147
1148 # user aliases to input and output histories. These shouldn't show up
1148 # user aliases to input and output histories. These shouldn't show up
1149 # in %who, as they can have very large reprs.
1149 # in %who, as they can have very large reprs.
1150 ns['In'] = self.history_manager.input_hist_parsed
1150 ns['In'] = self.history_manager.input_hist_parsed
1151 ns['Out'] = self.history_manager.output_hist
1151 ns['Out'] = self.history_manager.output_hist
1152
1152
1153 # Store myself as the public api!!!
1153 # Store myself as the public api!!!
1154 ns['get_ipython'] = self.get_ipython
1154 ns['get_ipython'] = self.get_ipython
1155
1155
1156 ns['exit'] = self.exiter
1156 ns['exit'] = self.exiter
1157 ns['quit'] = self.exiter
1157 ns['quit'] = self.exiter
1158
1158
1159 # Sync what we've added so far to user_ns_hidden so these aren't seen
1159 # Sync what we've added so far to user_ns_hidden so these aren't seen
1160 # by %who
1160 # by %who
1161 self.user_ns_hidden.update(ns)
1161 self.user_ns_hidden.update(ns)
1162
1162
1163 # Anything put into ns now would show up in %who. Think twice before
1163 # Anything put into ns now would show up in %who. Think twice before
1164 # putting anything here, as we really want %who to show the user their
1164 # putting anything here, as we really want %who to show the user their
1165 # stuff, not our variables.
1165 # stuff, not our variables.
1166
1166
1167 # Finally, update the real user's namespace
1167 # Finally, update the real user's namespace
1168 self.user_ns.update(ns)
1168 self.user_ns.update(ns)
1169
1169
1170 @property
1170 @property
1171 def all_ns_refs(self):
1171 def all_ns_refs(self):
1172 """Get a list of references to all the namespace dictionaries in which
1172 """Get a list of references to all the namespace dictionaries in which
1173 IPython might store a user-created object.
1173 IPython might store a user-created object.
1174
1174
1175 Note that this does not include the displayhook, which also caches
1175 Note that this does not include the displayhook, which also caches
1176 objects from the output."""
1176 objects from the output."""
1177 return [self.user_ns, self.user_global_ns,
1177 return [self.user_ns, self.user_global_ns,
1178 self._user_main_module.__dict__] + self._main_ns_cache.values()
1178 self._user_main_module.__dict__] + self._main_ns_cache.values()
1179
1179
1180 def reset(self, new_session=True):
1180 def reset(self, new_session=True):
1181 """Clear all internal namespaces, and attempt to release references to
1181 """Clear all internal namespaces, and attempt to release references to
1182 user objects.
1182 user objects.
1183
1183
1184 If new_session is True, a new history session will be opened.
1184 If new_session is True, a new history session will be opened.
1185 """
1185 """
1186 # Clear histories
1186 # Clear histories
1187 self.history_manager.reset(new_session)
1187 self.history_manager.reset(new_session)
1188 # Reset counter used to index all histories
1188 # Reset counter used to index all histories
1189 if new_session:
1189 if new_session:
1190 self.execution_count = 1
1190 self.execution_count = 1
1191
1191
1192 # Flush cached output items
1192 # Flush cached output items
1193 if self.displayhook.do_full_cache:
1193 if self.displayhook.do_full_cache:
1194 self.displayhook.flush()
1194 self.displayhook.flush()
1195
1195
1196 # The main execution namespaces must be cleared very carefully,
1196 # The main execution namespaces must be cleared very carefully,
1197 # skipping the deletion of the builtin-related keys, because doing so
1197 # skipping the deletion of the builtin-related keys, because doing so
1198 # would cause errors in many object's __del__ methods.
1198 # would cause errors in many object's __del__ methods.
1199 if self.user_ns is not self.user_global_ns:
1199 if self.user_ns is not self.user_global_ns:
1200 self.user_ns.clear()
1200 self.user_ns.clear()
1201 ns = self.user_global_ns
1201 ns = self.user_global_ns
1202 drop_keys = set(ns.keys())
1202 drop_keys = set(ns.keys())
1203 drop_keys.discard('__builtin__')
1203 drop_keys.discard('__builtin__')
1204 drop_keys.discard('__builtins__')
1204 drop_keys.discard('__builtins__')
1205 drop_keys.discard('__name__')
1205 drop_keys.discard('__name__')
1206 for k in drop_keys:
1206 for k in drop_keys:
1207 del ns[k]
1207 del ns[k]
1208
1208
1209 self.user_ns_hidden.clear()
1209 self.user_ns_hidden.clear()
1210
1210
1211 # Restore the user namespaces to minimal usability
1211 # Restore the user namespaces to minimal usability
1212 self.init_user_ns()
1212 self.init_user_ns()
1213
1213
1214 # Restore the default and user aliases
1214 # Restore the default and user aliases
1215 self.alias_manager.clear_aliases()
1215 self.alias_manager.clear_aliases()
1216 self.alias_manager.init_aliases()
1216 self.alias_manager.init_aliases()
1217
1217
1218 # Flush the private list of module references kept for script
1218 # Flush the private list of module references kept for script
1219 # execution protection
1219 # execution protection
1220 self.clear_main_mod_cache()
1220 self.clear_main_mod_cache()
1221
1221
1222 # Clear out the namespace from the last %run
1222 # Clear out the namespace from the last %run
1223 self.new_main_mod()
1223 self.new_main_mod()
1224
1224
1225 def del_var(self, varname, by_name=False):
1225 def del_var(self, varname, by_name=False):
1226 """Delete a variable from the various namespaces, so that, as
1226 """Delete a variable from the various namespaces, so that, as
1227 far as possible, we're not keeping any hidden references to it.
1227 far as possible, we're not keeping any hidden references to it.
1228
1228
1229 Parameters
1229 Parameters
1230 ----------
1230 ----------
1231 varname : str
1231 varname : str
1232 The name of the variable to delete.
1232 The name of the variable to delete.
1233 by_name : bool
1233 by_name : bool
1234 If True, delete variables with the given name in each
1234 If True, delete variables with the given name in each
1235 namespace. If False (default), find the variable in the user
1235 namespace. If False (default), find the variable in the user
1236 namespace, and delete references to it.
1236 namespace, and delete references to it.
1237 """
1237 """
1238 if varname in ('__builtin__', '__builtins__'):
1238 if varname in ('__builtin__', '__builtins__'):
1239 raise ValueError("Refusing to delete %s" % varname)
1239 raise ValueError("Refusing to delete %s" % varname)
1240
1240
1241 ns_refs = self.all_ns_refs
1241 ns_refs = self.all_ns_refs
1242
1242
1243 if by_name: # Delete by name
1243 if by_name: # Delete by name
1244 for ns in ns_refs:
1244 for ns in ns_refs:
1245 try:
1245 try:
1246 del ns[varname]
1246 del ns[varname]
1247 except KeyError:
1247 except KeyError:
1248 pass
1248 pass
1249 else: # Delete by object
1249 else: # Delete by object
1250 try:
1250 try:
1251 obj = self.user_ns[varname]
1251 obj = self.user_ns[varname]
1252 except KeyError:
1252 except KeyError:
1253 raise NameError("name '%s' is not defined" % varname)
1253 raise NameError("name '%s' is not defined" % varname)
1254 # Also check in output history
1254 # Also check in output history
1255 ns_refs.append(self.history_manager.output_hist)
1255 ns_refs.append(self.history_manager.output_hist)
1256 for ns in ns_refs:
1256 for ns in ns_refs:
1257 to_delete = [n for n, o in ns.iteritems() if o is obj]
1257 to_delete = [n for n, o in ns.iteritems() if o is obj]
1258 for name in to_delete:
1258 for name in to_delete:
1259 del ns[name]
1259 del ns[name]
1260
1260
1261 # displayhook keeps extra references, but not in a dictionary
1261 # displayhook keeps extra references, but not in a dictionary
1262 for name in ('_', '__', '___'):
1262 for name in ('_', '__', '___'):
1263 if getattr(self.displayhook, name) is obj:
1263 if getattr(self.displayhook, name) is obj:
1264 setattr(self.displayhook, name, None)
1264 setattr(self.displayhook, name, None)
1265
1265
1266 def reset_selective(self, regex=None):
1266 def reset_selective(self, regex=None):
1267 """Clear selective variables from internal namespaces based on a
1267 """Clear selective variables from internal namespaces based on a
1268 specified regular expression.
1268 specified regular expression.
1269
1269
1270 Parameters
1270 Parameters
1271 ----------
1271 ----------
1272 regex : string or compiled pattern, optional
1272 regex : string or compiled pattern, optional
1273 A regular expression pattern that will be used in searching
1273 A regular expression pattern that will be used in searching
1274 variable names in the users namespaces.
1274 variable names in the users namespaces.
1275 """
1275 """
1276 if regex is not None:
1276 if regex is not None:
1277 try:
1277 try:
1278 m = re.compile(regex)
1278 m = re.compile(regex)
1279 except TypeError:
1279 except TypeError:
1280 raise TypeError('regex must be a string or compiled pattern')
1280 raise TypeError('regex must be a string or compiled pattern')
1281 # Search for keys in each namespace that match the given regex
1281 # Search for keys in each namespace that match the given regex
1282 # If a match is found, delete the key/value pair.
1282 # If a match is found, delete the key/value pair.
1283 for ns in self.all_ns_refs:
1283 for ns in self.all_ns_refs:
1284 for var in ns:
1284 for var in ns:
1285 if m.search(var):
1285 if m.search(var):
1286 del ns[var]
1286 del ns[var]
1287
1287
1288 def push(self, variables, interactive=True):
1288 def push(self, variables, interactive=True):
1289 """Inject a group of variables into the IPython user namespace.
1289 """Inject a group of variables into the IPython user namespace.
1290
1290
1291 Parameters
1291 Parameters
1292 ----------
1292 ----------
1293 variables : dict, str or list/tuple of str
1293 variables : dict, str or list/tuple of str
1294 The variables to inject into the user's namespace. If a dict, a
1294 The variables to inject into the user's namespace. If a dict, a
1295 simple update is done. If a str, the string is assumed to have
1295 simple update is done. If a str, the string is assumed to have
1296 variable names separated by spaces. A list/tuple of str can also
1296 variable names separated by spaces. A list/tuple of str can also
1297 be used to give the variable names. If just the variable names are
1297 be used to give the variable names. If just the variable names are
1298 give (list/tuple/str) then the variable values looked up in the
1298 give (list/tuple/str) then the variable values looked up in the
1299 callers frame.
1299 callers frame.
1300 interactive : bool
1300 interactive : bool
1301 If True (default), the variables will be listed with the ``who``
1301 If True (default), the variables will be listed with the ``who``
1302 magic.
1302 magic.
1303 """
1303 """
1304 vdict = None
1304 vdict = None
1305
1305
1306 # We need a dict of name/value pairs to do namespace updates.
1306 # We need a dict of name/value pairs to do namespace updates.
1307 if isinstance(variables, dict):
1307 if isinstance(variables, dict):
1308 vdict = variables
1308 vdict = variables
1309 elif isinstance(variables, (basestring, list, tuple)):
1309 elif isinstance(variables, (basestring, list, tuple)):
1310 if isinstance(variables, basestring):
1310 if isinstance(variables, basestring):
1311 vlist = variables.split()
1311 vlist = variables.split()
1312 else:
1312 else:
1313 vlist = variables
1313 vlist = variables
1314 vdict = {}
1314 vdict = {}
1315 cf = sys._getframe(1)
1315 cf = sys._getframe(1)
1316 for name in vlist:
1316 for name in vlist:
1317 try:
1317 try:
1318 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1318 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1319 except:
1319 except:
1320 print('Could not get variable %s from %s' %
1320 print('Could not get variable %s from %s' %
1321 (name,cf.f_code.co_name))
1321 (name,cf.f_code.co_name))
1322 else:
1322 else:
1323 raise ValueError('variables must be a dict/str/list/tuple')
1323 raise ValueError('variables must be a dict/str/list/tuple')
1324
1324
1325 # Propagate variables to user namespace
1325 # Propagate variables to user namespace
1326 self.user_ns.update(vdict)
1326 self.user_ns.update(vdict)
1327
1327
1328 # And configure interactive visibility
1328 # And configure interactive visibility
1329 user_ns_hidden = self.user_ns_hidden
1329 user_ns_hidden = self.user_ns_hidden
1330 if interactive:
1330 if interactive:
1331 user_ns_hidden.difference_update(vdict)
1331 user_ns_hidden.difference_update(vdict)
1332 else:
1332 else:
1333 user_ns_hidden.update(vdict)
1333 user_ns_hidden.update(vdict)
1334
1334
1335 def drop_by_id(self, variables):
1335 def drop_by_id(self, variables):
1336 """Remove a dict of variables from the user namespace, if they are the
1336 """Remove a dict of variables from the user namespace, if they are the
1337 same as the values in the dictionary.
1337 same as the values in the dictionary.
1338
1338
1339 This is intended for use by extensions: variables that they've added can
1339 This is intended for use by extensions: variables that they've added can
1340 be taken back out if they are unloaded, without removing any that the
1340 be taken back out if they are unloaded, without removing any that the
1341 user has overwritten.
1341 user has overwritten.
1342
1342
1343 Parameters
1343 Parameters
1344 ----------
1344 ----------
1345 variables : dict
1345 variables : dict
1346 A dictionary mapping object names (as strings) to the objects.
1346 A dictionary mapping object names (as strings) to the objects.
1347 """
1347 """
1348 for name, obj in variables.iteritems():
1348 for name, obj in variables.iteritems():
1349 if name in self.user_ns and self.user_ns[name] is obj:
1349 if name in self.user_ns and self.user_ns[name] is obj:
1350 del self.user_ns[name]
1350 del self.user_ns[name]
1351 self.user_ns_hidden.discard(name)
1351 self.user_ns_hidden.discard(name)
1352
1352
1353 #-------------------------------------------------------------------------
1353 #-------------------------------------------------------------------------
1354 # Things related to object introspection
1354 # Things related to object introspection
1355 #-------------------------------------------------------------------------
1355 #-------------------------------------------------------------------------
1356
1356
1357 def _ofind(self, oname, namespaces=None):
1357 def _ofind(self, oname, namespaces=None):
1358 """Find an object in the available namespaces.
1358 """Find an object in the available namespaces.
1359
1359
1360 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1360 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1361
1361
1362 Has special code to detect magic functions.
1362 Has special code to detect magic functions.
1363 """
1363 """
1364 oname = oname.strip()
1364 oname = oname.strip()
1365 #print '1- oname: <%r>' % oname # dbg
1365 #print '1- oname: <%r>' % oname # dbg
1366 if not oname.startswith(ESC_MAGIC) and \
1366 if not oname.startswith(ESC_MAGIC) and \
1367 not oname.startswith(ESC_MAGIC2) and \
1367 not oname.startswith(ESC_MAGIC2) and \
1368 not py3compat.isidentifier(oname, dotted=True):
1368 not py3compat.isidentifier(oname, dotted=True):
1369 return dict(found=False)
1369 return dict(found=False)
1370
1370
1371 alias_ns = None
1371 alias_ns = None
1372 if namespaces is None:
1372 if namespaces is None:
1373 # Namespaces to search in:
1373 # Namespaces to search in:
1374 # Put them in a list. The order is important so that we
1374 # Put them in a list. The order is important so that we
1375 # find things in the same order that Python finds them.
1375 # find things in the same order that Python finds them.
1376 namespaces = [ ('Interactive', self.user_ns),
1376 namespaces = [ ('Interactive', self.user_ns),
1377 ('Interactive (global)', self.user_global_ns),
1377 ('Interactive (global)', self.user_global_ns),
1378 ('Python builtin', builtin_mod.__dict__),
1378 ('Python builtin', builtin_mod.__dict__),
1379 ('Alias', self.alias_manager.alias_table),
1379 ('Alias', self.alias_manager.alias_table),
1380 ]
1380 ]
1381 alias_ns = self.alias_manager.alias_table
1381 alias_ns = self.alias_manager.alias_table
1382
1382
1383 # initialize results to 'null'
1383 # initialize results to 'null'
1384 found = False; obj = None; ospace = None; ds = None;
1384 found = False; obj = None; ospace = None; ds = None;
1385 ismagic = False; isalias = False; parent = None
1385 ismagic = False; isalias = False; parent = None
1386
1386
1387 # We need to special-case 'print', which as of python2.6 registers as a
1387 # We need to special-case 'print', which as of python2.6 registers as a
1388 # function but should only be treated as one if print_function was
1388 # function but should only be treated as one if print_function was
1389 # loaded with a future import. In this case, just bail.
1389 # loaded with a future import. In this case, just bail.
1390 if (oname == 'print' and not py3compat.PY3 and not \
1390 if (oname == 'print' and not py3compat.PY3 and not \
1391 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1391 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1392 return {'found':found, 'obj':obj, 'namespace':ospace,
1392 return {'found':found, 'obj':obj, 'namespace':ospace,
1393 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1393 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1394
1394
1395 # Look for the given name by splitting it in parts. If the head is
1395 # Look for the given name by splitting it in parts. If the head is
1396 # found, then we look for all the remaining parts as members, and only
1396 # found, then we look for all the remaining parts as members, and only
1397 # declare success if we can find them all.
1397 # declare success if we can find them all.
1398 oname_parts = oname.split('.')
1398 oname_parts = oname.split('.')
1399 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1399 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1400 for nsname,ns in namespaces:
1400 for nsname,ns in namespaces:
1401 try:
1401 try:
1402 obj = ns[oname_head]
1402 obj = ns[oname_head]
1403 except KeyError:
1403 except KeyError:
1404 continue
1404 continue
1405 else:
1405 else:
1406 #print 'oname_rest:', oname_rest # dbg
1406 #print 'oname_rest:', oname_rest # dbg
1407 for part in oname_rest:
1407 for part in oname_rest:
1408 try:
1408 try:
1409 parent = obj
1409 parent = obj
1410 obj = getattr(obj,part)
1410 obj = getattr(obj,part)
1411 except:
1411 except:
1412 # Blanket except b/c some badly implemented objects
1412 # Blanket except b/c some badly implemented objects
1413 # allow __getattr__ to raise exceptions other than
1413 # allow __getattr__ to raise exceptions other than
1414 # AttributeError, which then crashes IPython.
1414 # AttributeError, which then crashes IPython.
1415 break
1415 break
1416 else:
1416 else:
1417 # If we finish the for loop (no break), we got all members
1417 # If we finish the for loop (no break), we got all members
1418 found = True
1418 found = True
1419 ospace = nsname
1419 ospace = nsname
1420 if ns == alias_ns:
1420 if ns == alias_ns:
1421 isalias = True
1421 isalias = True
1422 break # namespace loop
1422 break # namespace loop
1423
1423
1424 # Try to see if it's magic
1424 # Try to see if it's magic
1425 if not found:
1425 if not found:
1426 obj = None
1426 obj = None
1427 if oname.startswith(ESC_MAGIC2):
1427 if oname.startswith(ESC_MAGIC2):
1428 oname = oname.lstrip(ESC_MAGIC2)
1428 oname = oname.lstrip(ESC_MAGIC2)
1429 obj = self.find_cell_magic(oname)
1429 obj = self.find_cell_magic(oname)
1430 elif oname.startswith(ESC_MAGIC):
1430 elif oname.startswith(ESC_MAGIC):
1431 oname = oname.lstrip(ESC_MAGIC)
1431 oname = oname.lstrip(ESC_MAGIC)
1432 obj = self.find_line_magic(oname)
1432 obj = self.find_line_magic(oname)
1433 else:
1433 else:
1434 # search without prefix, so run? will find %run?
1434 # search without prefix, so run? will find %run?
1435 obj = self.find_line_magic(oname)
1435 obj = self.find_line_magic(oname)
1436 if obj is None:
1436 if obj is None:
1437 obj = self.find_cell_magic(oname)
1437 obj = self.find_cell_magic(oname)
1438 if obj is not None:
1438 if obj is not None:
1439 found = True
1439 found = True
1440 ospace = 'IPython internal'
1440 ospace = 'IPython internal'
1441 ismagic = True
1441 ismagic = True
1442
1442
1443 # Last try: special-case some literals like '', [], {}, etc:
1443 # Last try: special-case some literals like '', [], {}, etc:
1444 if not found and oname_head in ["''",'""','[]','{}','()']:
1444 if not found and oname_head in ["''",'""','[]','{}','()']:
1445 obj = eval(oname_head)
1445 obj = eval(oname_head)
1446 found = True
1446 found = True
1447 ospace = 'Interactive'
1447 ospace = 'Interactive'
1448
1448
1449 return {'found':found, 'obj':obj, 'namespace':ospace,
1449 return {'found':found, 'obj':obj, 'namespace':ospace,
1450 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1450 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1451
1451
1452 def _ofind_property(self, oname, info):
1452 def _ofind_property(self, oname, info):
1453 """Second part of object finding, to look for property details."""
1453 """Second part of object finding, to look for property details."""
1454 if info.found:
1454 if info.found:
1455 # Get the docstring of the class property if it exists.
1455 # Get the docstring of the class property if it exists.
1456 path = oname.split('.')
1456 path = oname.split('.')
1457 root = '.'.join(path[:-1])
1457 root = '.'.join(path[:-1])
1458 if info.parent is not None:
1458 if info.parent is not None:
1459 try:
1459 try:
1460 target = getattr(info.parent, '__class__')
1460 target = getattr(info.parent, '__class__')
1461 # The object belongs to a class instance.
1461 # The object belongs to a class instance.
1462 try:
1462 try:
1463 target = getattr(target, path[-1])
1463 target = getattr(target, path[-1])
1464 # The class defines the object.
1464 # The class defines the object.
1465 if isinstance(target, property):
1465 if isinstance(target, property):
1466 oname = root + '.__class__.' + path[-1]
1466 oname = root + '.__class__.' + path[-1]
1467 info = Struct(self._ofind(oname))
1467 info = Struct(self._ofind(oname))
1468 except AttributeError: pass
1468 except AttributeError: pass
1469 except AttributeError: pass
1469 except AttributeError: pass
1470
1470
1471 # We return either the new info or the unmodified input if the object
1471 # We return either the new info or the unmodified input if the object
1472 # hadn't been found
1472 # hadn't been found
1473 return info
1473 return info
1474
1474
1475 def _object_find(self, oname, namespaces=None):
1475 def _object_find(self, oname, namespaces=None):
1476 """Find an object and return a struct with info about it."""
1476 """Find an object and return a struct with info about it."""
1477 inf = Struct(self._ofind(oname, namespaces))
1477 inf = Struct(self._ofind(oname, namespaces))
1478 return Struct(self._ofind_property(oname, inf))
1478 return Struct(self._ofind_property(oname, inf))
1479
1479
1480 def _inspect(self, meth, oname, namespaces=None, **kw):
1480 def _inspect(self, meth, oname, namespaces=None, **kw):
1481 """Generic interface to the inspector system.
1481 """Generic interface to the inspector system.
1482
1482
1483 This function is meant to be called by pdef, pdoc & friends."""
1483 This function is meant to be called by pdef, pdoc & friends."""
1484 info = self._object_find(oname, namespaces)
1484 info = self._object_find(oname, namespaces)
1485 if info.found:
1485 if info.found:
1486 pmethod = getattr(self.inspector, meth)
1486 pmethod = getattr(self.inspector, meth)
1487 formatter = format_screen if info.ismagic else None
1487 formatter = format_screen if info.ismagic else None
1488 if meth == 'pdoc':
1488 if meth == 'pdoc':
1489 pmethod(info.obj, oname, formatter)
1489 pmethod(info.obj, oname, formatter)
1490 elif meth == 'pinfo':
1490 elif meth == 'pinfo':
1491 pmethod(info.obj, oname, formatter, info, **kw)
1491 pmethod(info.obj, oname, formatter, info, **kw)
1492 else:
1492 else:
1493 pmethod(info.obj, oname)
1493 pmethod(info.obj, oname)
1494 else:
1494 else:
1495 print('Object `%s` not found.' % oname)
1495 print('Object `%s` not found.' % oname)
1496 return 'not found' # so callers can take other action
1496 return 'not found' # so callers can take other action
1497
1497
1498 def object_inspect(self, oname, detail_level=0):
1498 def object_inspect(self, oname, detail_level=0):
1499 with self.builtin_trap:
1499 with self.builtin_trap:
1500 info = self._object_find(oname)
1500 info = self._object_find(oname)
1501 if info.found:
1501 if info.found:
1502 return self.inspector.info(info.obj, oname, info=info,
1502 return self.inspector.info(info.obj, oname, info=info,
1503 detail_level=detail_level
1503 detail_level=detail_level
1504 )
1504 )
1505 else:
1505 else:
1506 return oinspect.object_info(name=oname, found=False)
1506 return oinspect.object_info(name=oname, found=False)
1507
1507
1508 #-------------------------------------------------------------------------
1508 #-------------------------------------------------------------------------
1509 # Things related to history management
1509 # Things related to history management
1510 #-------------------------------------------------------------------------
1510 #-------------------------------------------------------------------------
1511
1511
1512 def init_history(self):
1512 def init_history(self):
1513 """Sets up the command history, and starts regular autosaves."""
1513 """Sets up the command history, and starts regular autosaves."""
1514 self.history_manager = HistoryManager(shell=self, config=self.config)
1514 self.history_manager = HistoryManager(shell=self, config=self.config)
1515 self.configurables.append(self.history_manager)
1515 self.configurables.append(self.history_manager)
1516
1516
1517 #-------------------------------------------------------------------------
1517 #-------------------------------------------------------------------------
1518 # Things related to exception handling and tracebacks (not debugging)
1518 # Things related to exception handling and tracebacks (not debugging)
1519 #-------------------------------------------------------------------------
1519 #-------------------------------------------------------------------------
1520
1520
1521 def init_traceback_handlers(self, custom_exceptions):
1521 def init_traceback_handlers(self, custom_exceptions):
1522 # Syntax error handler.
1522 # Syntax error handler.
1523 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1523 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1524
1524
1525 # The interactive one is initialized with an offset, meaning we always
1525 # The interactive one is initialized with an offset, meaning we always
1526 # want to remove the topmost item in the traceback, which is our own
1526 # want to remove the topmost item in the traceback, which is our own
1527 # internal code. Valid modes: ['Plain','Context','Verbose']
1527 # internal code. Valid modes: ['Plain','Context','Verbose']
1528 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1528 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1529 color_scheme='NoColor',
1529 color_scheme='NoColor',
1530 tb_offset = 1,
1530 tb_offset = 1,
1531 check_cache=check_linecache_ipython)
1531 check_cache=check_linecache_ipython)
1532
1532
1533 # The instance will store a pointer to the system-wide exception hook,
1533 # The instance will store a pointer to the system-wide exception hook,
1534 # so that runtime code (such as magics) can access it. This is because
1534 # so that runtime code (such as magics) can access it. This is because
1535 # during the read-eval loop, it may get temporarily overwritten.
1535 # during the read-eval loop, it may get temporarily overwritten.
1536 self.sys_excepthook = sys.excepthook
1536 self.sys_excepthook = sys.excepthook
1537
1537
1538 # and add any custom exception handlers the user may have specified
1538 # and add any custom exception handlers the user may have specified
1539 self.set_custom_exc(*custom_exceptions)
1539 self.set_custom_exc(*custom_exceptions)
1540
1540
1541 # Set the exception mode
1541 # Set the exception mode
1542 self.InteractiveTB.set_mode(mode=self.xmode)
1542 self.InteractiveTB.set_mode(mode=self.xmode)
1543
1543
1544 def set_custom_exc(self, exc_tuple, handler):
1544 def set_custom_exc(self, exc_tuple, handler):
1545 """set_custom_exc(exc_tuple,handler)
1545 """set_custom_exc(exc_tuple,handler)
1546
1546
1547 Set a custom exception handler, which will be called if any of the
1547 Set a custom exception handler, which will be called if any of the
1548 exceptions in exc_tuple occur in the mainloop (specifically, in the
1548 exceptions in exc_tuple occur in the mainloop (specifically, in the
1549 run_code() method).
1549 run_code() method).
1550
1550
1551 Parameters
1551 Parameters
1552 ----------
1552 ----------
1553
1553
1554 exc_tuple : tuple of exception classes
1554 exc_tuple : tuple of exception classes
1555 A *tuple* of exception classes, for which to call the defined
1555 A *tuple* of exception classes, for which to call the defined
1556 handler. It is very important that you use a tuple, and NOT A
1556 handler. It is very important that you use a tuple, and NOT A
1557 LIST here, because of the way Python's except statement works. If
1557 LIST here, because of the way Python's except statement works. If
1558 you only want to trap a single exception, use a singleton tuple::
1558 you only want to trap a single exception, use a singleton tuple::
1559
1559
1560 exc_tuple == (MyCustomException,)
1560 exc_tuple == (MyCustomException,)
1561
1561
1562 handler : callable
1562 handler : callable
1563 handler must have the following signature::
1563 handler must have the following signature::
1564
1564
1565 def my_handler(self, etype, value, tb, tb_offset=None):
1565 def my_handler(self, etype, value, tb, tb_offset=None):
1566 ...
1566 ...
1567 return structured_traceback
1567 return structured_traceback
1568
1568
1569 Your handler must return a structured traceback (a list of strings),
1569 Your handler must return a structured traceback (a list of strings),
1570 or None.
1570 or None.
1571
1571
1572 This will be made into an instance method (via types.MethodType)
1572 This will be made into an instance method (via types.MethodType)
1573 of IPython itself, and it will be called if any of the exceptions
1573 of IPython itself, and it will be called if any of the exceptions
1574 listed in the exc_tuple are caught. If the handler is None, an
1574 listed in the exc_tuple are caught. If the handler is None, an
1575 internal basic one is used, which just prints basic info.
1575 internal basic one is used, which just prints basic info.
1576
1576
1577 To protect IPython from crashes, if your handler ever raises an
1577 To protect IPython from crashes, if your handler ever raises an
1578 exception or returns an invalid result, it will be immediately
1578 exception or returns an invalid result, it will be immediately
1579 disabled.
1579 disabled.
1580
1580
1581 WARNING: by putting in your own exception handler into IPython's main
1581 WARNING: by putting in your own exception handler into IPython's main
1582 execution loop, you run a very good chance of nasty crashes. This
1582 execution loop, you run a very good chance of nasty crashes. This
1583 facility should only be used if you really know what you are doing."""
1583 facility should only be used if you really know what you are doing."""
1584
1584
1585 assert type(exc_tuple)==type(()) , \
1585 assert type(exc_tuple)==type(()) , \
1586 "The custom exceptions must be given AS A TUPLE."
1586 "The custom exceptions must be given AS A TUPLE."
1587
1587
1588 def dummy_handler(self,etype,value,tb,tb_offset=None):
1588 def dummy_handler(self,etype,value,tb,tb_offset=None):
1589 print('*** Simple custom exception handler ***')
1589 print('*** Simple custom exception handler ***')
1590 print('Exception type :',etype)
1590 print('Exception type :',etype)
1591 print('Exception value:',value)
1591 print('Exception value:',value)
1592 print('Traceback :',tb)
1592 print('Traceback :',tb)
1593 #print 'Source code :','\n'.join(self.buffer)
1593 #print 'Source code :','\n'.join(self.buffer)
1594
1594
1595 def validate_stb(stb):
1595 def validate_stb(stb):
1596 """validate structured traceback return type
1596 """validate structured traceback return type
1597
1597
1598 return type of CustomTB *should* be a list of strings, but allow
1598 return type of CustomTB *should* be a list of strings, but allow
1599 single strings or None, which are harmless.
1599 single strings or None, which are harmless.
1600
1600
1601 This function will *always* return a list of strings,
1601 This function will *always* return a list of strings,
1602 and will raise a TypeError if stb is inappropriate.
1602 and will raise a TypeError if stb is inappropriate.
1603 """
1603 """
1604 msg = "CustomTB must return list of strings, not %r" % stb
1604 msg = "CustomTB must return list of strings, not %r" % stb
1605 if stb is None:
1605 if stb is None:
1606 return []
1606 return []
1607 elif isinstance(stb, basestring):
1607 elif isinstance(stb, basestring):
1608 return [stb]
1608 return [stb]
1609 elif not isinstance(stb, list):
1609 elif not isinstance(stb, list):
1610 raise TypeError(msg)
1610 raise TypeError(msg)
1611 # it's a list
1611 # it's a list
1612 for line in stb:
1612 for line in stb:
1613 # check every element
1613 # check every element
1614 if not isinstance(line, basestring):
1614 if not isinstance(line, basestring):
1615 raise TypeError(msg)
1615 raise TypeError(msg)
1616 return stb
1616 return stb
1617
1617
1618 if handler is None:
1618 if handler is None:
1619 wrapped = dummy_handler
1619 wrapped = dummy_handler
1620 else:
1620 else:
1621 def wrapped(self,etype,value,tb,tb_offset=None):
1621 def wrapped(self,etype,value,tb,tb_offset=None):
1622 """wrap CustomTB handler, to protect IPython from user code
1622 """wrap CustomTB handler, to protect IPython from user code
1623
1623
1624 This makes it harder (but not impossible) for custom exception
1624 This makes it harder (but not impossible) for custom exception
1625 handlers to crash IPython.
1625 handlers to crash IPython.
1626 """
1626 """
1627 try:
1627 try:
1628 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1628 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1629 return validate_stb(stb)
1629 return validate_stb(stb)
1630 except:
1630 except:
1631 # clear custom handler immediately
1631 # clear custom handler immediately
1632 self.set_custom_exc((), None)
1632 self.set_custom_exc((), None)
1633 print("Custom TB Handler failed, unregistering", file=io.stderr)
1633 print("Custom TB Handler failed, unregistering", file=io.stderr)
1634 # show the exception in handler first
1634 # show the exception in handler first
1635 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1635 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1636 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1636 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1637 print("The original exception:", file=io.stdout)
1637 print("The original exception:", file=io.stdout)
1638 stb = self.InteractiveTB.structured_traceback(
1638 stb = self.InteractiveTB.structured_traceback(
1639 (etype,value,tb), tb_offset=tb_offset
1639 (etype,value,tb), tb_offset=tb_offset
1640 )
1640 )
1641 return stb
1641 return stb
1642
1642
1643 self.CustomTB = types.MethodType(wrapped,self)
1643 self.CustomTB = types.MethodType(wrapped,self)
1644 self.custom_exceptions = exc_tuple
1644 self.custom_exceptions = exc_tuple
1645
1645
1646 def excepthook(self, etype, value, tb):
1646 def excepthook(self, etype, value, tb):
1647 """One more defense for GUI apps that call sys.excepthook.
1647 """One more defense for GUI apps that call sys.excepthook.
1648
1648
1649 GUI frameworks like wxPython trap exceptions and call
1649 GUI frameworks like wxPython trap exceptions and call
1650 sys.excepthook themselves. I guess this is a feature that
1650 sys.excepthook themselves. I guess this is a feature that
1651 enables them to keep running after exceptions that would
1651 enables them to keep running after exceptions that would
1652 otherwise kill their mainloop. This is a bother for IPython
1652 otherwise kill their mainloop. This is a bother for IPython
1653 which excepts to catch all of the program exceptions with a try:
1653 which excepts to catch all of the program exceptions with a try:
1654 except: statement.
1654 except: statement.
1655
1655
1656 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1656 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1657 any app directly invokes sys.excepthook, it will look to the user like
1657 any app directly invokes sys.excepthook, it will look to the user like
1658 IPython crashed. In order to work around this, we can disable the
1658 IPython crashed. In order to work around this, we can disable the
1659 CrashHandler and replace it with this excepthook instead, which prints a
1659 CrashHandler and replace it with this excepthook instead, which prints a
1660 regular traceback using our InteractiveTB. In this fashion, apps which
1660 regular traceback using our InteractiveTB. In this fashion, apps which
1661 call sys.excepthook will generate a regular-looking exception from
1661 call sys.excepthook will generate a regular-looking exception from
1662 IPython, and the CrashHandler will only be triggered by real IPython
1662 IPython, and the CrashHandler will only be triggered by real IPython
1663 crashes.
1663 crashes.
1664
1664
1665 This hook should be used sparingly, only in places which are not likely
1665 This hook should be used sparingly, only in places which are not likely
1666 to be true IPython errors.
1666 to be true IPython errors.
1667 """
1667 """
1668 self.showtraceback((etype,value,tb),tb_offset=0)
1668 self.showtraceback((etype,value,tb),tb_offset=0)
1669
1669
1670 def _get_exc_info(self, exc_tuple=None):
1670 def _get_exc_info(self, exc_tuple=None):
1671 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1671 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1672
1672
1673 Ensures sys.last_type,value,traceback hold the exc_info we found,
1673 Ensures sys.last_type,value,traceback hold the exc_info we found,
1674 from whichever source.
1674 from whichever source.
1675
1675
1676 raises ValueError if none of these contain any information
1676 raises ValueError if none of these contain any information
1677 """
1677 """
1678 if exc_tuple is None:
1678 if exc_tuple is None:
1679 etype, value, tb = sys.exc_info()
1679 etype, value, tb = sys.exc_info()
1680 else:
1680 else:
1681 etype, value, tb = exc_tuple
1681 etype, value, tb = exc_tuple
1682
1682
1683 if etype is None:
1683 if etype is None:
1684 if hasattr(sys, 'last_type'):
1684 if hasattr(sys, 'last_type'):
1685 etype, value, tb = sys.last_type, sys.last_value, \
1685 etype, value, tb = sys.last_type, sys.last_value, \
1686 sys.last_traceback
1686 sys.last_traceback
1687
1687
1688 if etype is None:
1688 if etype is None:
1689 raise ValueError("No exception to find")
1689 raise ValueError("No exception to find")
1690
1690
1691 # Now store the exception info in sys.last_type etc.
1691 # Now store the exception info in sys.last_type etc.
1692 # WARNING: these variables are somewhat deprecated and not
1692 # WARNING: these variables are somewhat deprecated and not
1693 # necessarily safe to use in a threaded environment, but tools
1693 # necessarily safe to use in a threaded environment, but tools
1694 # like pdb depend on their existence, so let's set them. If we
1694 # like pdb depend on their existence, so let's set them. If we
1695 # find problems in the field, we'll need to revisit their use.
1695 # find problems in the field, we'll need to revisit their use.
1696 sys.last_type = etype
1696 sys.last_type = etype
1697 sys.last_value = value
1697 sys.last_value = value
1698 sys.last_traceback = tb
1698 sys.last_traceback = tb
1699
1699
1700 return etype, value, tb
1700 return etype, value, tb
1701
1701
1702
1702
1703 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1703 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1704 exception_only=False):
1704 exception_only=False):
1705 """Display the exception that just occurred.
1705 """Display the exception that just occurred.
1706
1706
1707 If nothing is known about the exception, this is the method which
1707 If nothing is known about the exception, this is the method which
1708 should be used throughout the code for presenting user tracebacks,
1708 should be used throughout the code for presenting user tracebacks,
1709 rather than directly invoking the InteractiveTB object.
1709 rather than directly invoking the InteractiveTB object.
1710
1710
1711 A specific showsyntaxerror() also exists, but this method can take
1711 A specific showsyntaxerror() also exists, but this method can take
1712 care of calling it if needed, so unless you are explicitly catching a
1712 care of calling it if needed, so unless you are explicitly catching a
1713 SyntaxError exception, don't try to analyze the stack manually and
1713 SyntaxError exception, don't try to analyze the stack manually and
1714 simply call this method."""
1714 simply call this method."""
1715
1715
1716 try:
1716 try:
1717 try:
1717 try:
1718 etype, value, tb = self._get_exc_info(exc_tuple)
1718 etype, value, tb = self._get_exc_info(exc_tuple)
1719 except ValueError:
1719 except ValueError:
1720 self.write_err('No traceback available to show.\n')
1720 self.write_err('No traceback available to show.\n')
1721 return
1721 return
1722
1722
1723 if issubclass(etype, SyntaxError):
1723 if issubclass(etype, SyntaxError):
1724 # Though this won't be called by syntax errors in the input
1724 # Though this won't be called by syntax errors in the input
1725 # line, there may be SyntaxError cases with imported code.
1725 # line, there may be SyntaxError cases with imported code.
1726 self.showsyntaxerror(filename)
1726 self.showsyntaxerror(filename)
1727 elif etype is UsageError:
1727 elif etype is UsageError:
1728 self.write_err("UsageError: %s" % value)
1728 self.write_err("UsageError: %s" % value)
1729 else:
1729 else:
1730 if exception_only:
1730 if exception_only:
1731 stb = ['An exception has occurred, use %tb to see '
1731 stb = ['An exception has occurred, use %tb to see '
1732 'the full traceback.\n']
1732 'the full traceback.\n']
1733 stb.extend(self.InteractiveTB.get_exception_only(etype,
1733 stb.extend(self.InteractiveTB.get_exception_only(etype,
1734 value))
1734 value))
1735 else:
1735 else:
1736 try:
1736 try:
1737 # Exception classes can customise their traceback - we
1737 # Exception classes can customise their traceback - we
1738 # use this in IPython.parallel for exceptions occurring
1738 # use this in IPython.parallel for exceptions occurring
1739 # in the engines. This should return a list of strings.
1739 # in the engines. This should return a list of strings.
1740 stb = value._render_traceback_()
1740 stb = value._render_traceback_()
1741 except Exception:
1741 except Exception:
1742 stb = self.InteractiveTB.structured_traceback(etype,
1742 stb = self.InteractiveTB.structured_traceback(etype,
1743 value, tb, tb_offset=tb_offset)
1743 value, tb, tb_offset=tb_offset)
1744
1744
1745 self._showtraceback(etype, value, stb)
1745 self._showtraceback(etype, value, stb)
1746 if self.call_pdb:
1746 if self.call_pdb:
1747 # drop into debugger
1747 # drop into debugger
1748 self.debugger(force=True)
1748 self.debugger(force=True)
1749 return
1749 return
1750
1750
1751 # Actually show the traceback
1751 # Actually show the traceback
1752 self._showtraceback(etype, value, stb)
1752 self._showtraceback(etype, value, stb)
1753
1753
1754 except KeyboardInterrupt:
1754 except KeyboardInterrupt:
1755 self.write_err("\nKeyboardInterrupt\n")
1755 self.write_err("\nKeyboardInterrupt\n")
1756
1756
1757 def _showtraceback(self, etype, evalue, stb):
1757 def _showtraceback(self, etype, evalue, stb):
1758 """Actually show a traceback.
1758 """Actually show a traceback.
1759
1759
1760 Subclasses may override this method to put the traceback on a different
1760 Subclasses may override this method to put the traceback on a different
1761 place, like a side channel.
1761 place, like a side channel.
1762 """
1762 """
1763 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1763 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1764
1764
1765 def showsyntaxerror(self, filename=None):
1765 def showsyntaxerror(self, filename=None):
1766 """Display the syntax error that just occurred.
1766 """Display the syntax error that just occurred.
1767
1767
1768 This doesn't display a stack trace because there isn't one.
1768 This doesn't display a stack trace because there isn't one.
1769
1769
1770 If a filename is given, it is stuffed in the exception instead
1770 If a filename is given, it is stuffed in the exception instead
1771 of what was there before (because Python's parser always uses
1771 of what was there before (because Python's parser always uses
1772 "<string>" when reading from a string).
1772 "<string>" when reading from a string).
1773 """
1773 """
1774 etype, value, last_traceback = self._get_exc_info()
1774 etype, value, last_traceback = self._get_exc_info()
1775
1775
1776 if filename and issubclass(etype, SyntaxError):
1776 if filename and issubclass(etype, SyntaxError):
1777 try:
1777 try:
1778 value.filename = filename
1778 value.filename = filename
1779 except:
1779 except:
1780 # Not the format we expect; leave it alone
1780 # Not the format we expect; leave it alone
1781 pass
1781 pass
1782
1782
1783 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1783 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1784 self._showtraceback(etype, value, stb)
1784 self._showtraceback(etype, value, stb)
1785
1785
1786 # This is overridden in TerminalInteractiveShell to show a message about
1786 # This is overridden in TerminalInteractiveShell to show a message about
1787 # the %paste magic.
1787 # the %paste magic.
1788 def showindentationerror(self):
1788 def showindentationerror(self):
1789 """Called by run_cell when there's an IndentationError in code entered
1789 """Called by run_cell when there's an IndentationError in code entered
1790 at the prompt.
1790 at the prompt.
1791
1791
1792 This is overridden in TerminalInteractiveShell to show a message about
1792 This is overridden in TerminalInteractiveShell to show a message about
1793 the %paste magic."""
1793 the %paste magic."""
1794 self.showsyntaxerror()
1794 self.showsyntaxerror()
1795
1795
1796 #-------------------------------------------------------------------------
1796 #-------------------------------------------------------------------------
1797 # Things related to readline
1797 # Things related to readline
1798 #-------------------------------------------------------------------------
1798 #-------------------------------------------------------------------------
1799
1799
1800 def init_readline(self):
1800 def init_readline(self):
1801 """Command history completion/saving/reloading."""
1801 """Command history completion/saving/reloading."""
1802
1802
1803 if self.readline_use:
1803 if self.readline_use:
1804 import IPython.utils.rlineimpl as readline
1804 import IPython.utils.rlineimpl as readline
1805
1805
1806 self.rl_next_input = None
1806 self.rl_next_input = None
1807 self.rl_do_indent = False
1807 self.rl_do_indent = False
1808
1808
1809 if not self.readline_use or not readline.have_readline:
1809 if not self.readline_use or not readline.have_readline:
1810 self.has_readline = False
1810 self.has_readline = False
1811 self.readline = None
1811 self.readline = None
1812 # Set a number of methods that depend on readline to be no-op
1812 # Set a number of methods that depend on readline to be no-op
1813 self.readline_no_record = no_op_context
1813 self.readline_no_record = no_op_context
1814 self.set_readline_completer = no_op
1814 self.set_readline_completer = no_op
1815 self.set_custom_completer = no_op
1815 self.set_custom_completer = no_op
1816 if self.readline_use:
1816 if self.readline_use:
1817 warn('Readline services not available or not loaded.')
1817 warn('Readline services not available or not loaded.')
1818 else:
1818 else:
1819 self.has_readline = True
1819 self.has_readline = True
1820 self.readline = readline
1820 self.readline = readline
1821 sys.modules['readline'] = readline
1821 sys.modules['readline'] = readline
1822
1822
1823 # Platform-specific configuration
1823 # Platform-specific configuration
1824 if os.name == 'nt':
1824 if os.name == 'nt':
1825 # FIXME - check with Frederick to see if we can harmonize
1825 # FIXME - check with Frederick to see if we can harmonize
1826 # naming conventions with pyreadline to avoid this
1826 # naming conventions with pyreadline to avoid this
1827 # platform-dependent check
1827 # platform-dependent check
1828 self.readline_startup_hook = readline.set_pre_input_hook
1828 self.readline_startup_hook = readline.set_pre_input_hook
1829 else:
1829 else:
1830 self.readline_startup_hook = readline.set_startup_hook
1830 self.readline_startup_hook = readline.set_startup_hook
1831
1831
1832 # Load user's initrc file (readline config)
1832 # Load user's initrc file (readline config)
1833 # Or if libedit is used, load editrc.
1833 # Or if libedit is used, load editrc.
1834 inputrc_name = os.environ.get('INPUTRC')
1834 inputrc_name = os.environ.get('INPUTRC')
1835 if inputrc_name is None:
1835 if inputrc_name is None:
1836 inputrc_name = '.inputrc'
1836 inputrc_name = '.inputrc'
1837 if readline.uses_libedit:
1837 if readline.uses_libedit:
1838 inputrc_name = '.editrc'
1838 inputrc_name = '.editrc'
1839 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1839 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1840 if os.path.isfile(inputrc_name):
1840 if os.path.isfile(inputrc_name):
1841 try:
1841 try:
1842 readline.read_init_file(inputrc_name)
1842 readline.read_init_file(inputrc_name)
1843 except:
1843 except:
1844 warn('Problems reading readline initialization file <%s>'
1844 warn('Problems reading readline initialization file <%s>'
1845 % inputrc_name)
1845 % inputrc_name)
1846
1846
1847 # Configure readline according to user's prefs
1847 # Configure readline according to user's prefs
1848 # This is only done if GNU readline is being used. If libedit
1848 # This is only done if GNU readline is being used. If libedit
1849 # is being used (as on Leopard) the readline config is
1849 # is being used (as on Leopard) the readline config is
1850 # not run as the syntax for libedit is different.
1850 # not run as the syntax for libedit is different.
1851 if not readline.uses_libedit:
1851 if not readline.uses_libedit:
1852 for rlcommand in self.readline_parse_and_bind:
1852 for rlcommand in self.readline_parse_and_bind:
1853 #print "loading rl:",rlcommand # dbg
1853 #print "loading rl:",rlcommand # dbg
1854 readline.parse_and_bind(rlcommand)
1854 readline.parse_and_bind(rlcommand)
1855
1855
1856 # Remove some chars from the delimiters list. If we encounter
1856 # Remove some chars from the delimiters list. If we encounter
1857 # unicode chars, discard them.
1857 # unicode chars, discard them.
1858 delims = readline.get_completer_delims()
1858 delims = readline.get_completer_delims()
1859 if not py3compat.PY3:
1859 if not py3compat.PY3:
1860 delims = delims.encode("ascii", "ignore")
1860 delims = delims.encode("ascii", "ignore")
1861 for d in self.readline_remove_delims:
1861 for d in self.readline_remove_delims:
1862 delims = delims.replace(d, "")
1862 delims = delims.replace(d, "")
1863 delims = delims.replace(ESC_MAGIC, '')
1863 delims = delims.replace(ESC_MAGIC, '')
1864 readline.set_completer_delims(delims)
1864 readline.set_completer_delims(delims)
1865 # Store these so we can restore them if something like rpy2 modifies
1865 # Store these so we can restore them if something like rpy2 modifies
1866 # them.
1866 # them.
1867 self.readline_delims = delims
1867 self.readline_delims = delims
1868 # otherwise we end up with a monster history after a while:
1868 # otherwise we end up with a monster history after a while:
1869 readline.set_history_length(self.history_length)
1869 readline.set_history_length(self.history_length)
1870
1870
1871 self.refill_readline_hist()
1871 self.refill_readline_hist()
1872 self.readline_no_record = ReadlineNoRecord(self)
1872 self.readline_no_record = ReadlineNoRecord(self)
1873
1873
1874 # Configure auto-indent for all platforms
1874 # Configure auto-indent for all platforms
1875 self.set_autoindent(self.autoindent)
1875 self.set_autoindent(self.autoindent)
1876
1876
1877 def refill_readline_hist(self):
1877 def refill_readline_hist(self):
1878 # Load the last 1000 lines from history
1878 # Load the last 1000 lines from history
1879 self.readline.clear_history()
1879 self.readline.clear_history()
1880 stdin_encoding = sys.stdin.encoding or "utf-8"
1880 stdin_encoding = sys.stdin.encoding or "utf-8"
1881 last_cell = u""
1881 last_cell = u""
1882 for _, _, cell in self.history_manager.get_tail(1000,
1882 for _, _, cell in self.history_manager.get_tail(1000,
1883 include_latest=True):
1883 include_latest=True):
1884 # Ignore blank lines and consecutive duplicates
1884 # Ignore blank lines and consecutive duplicates
1885 cell = cell.rstrip()
1885 cell = cell.rstrip()
1886 if cell and (cell != last_cell):
1886 if cell and (cell != last_cell):
1887 if self.multiline_history:
1887 if self.multiline_history:
1888 self.readline.add_history(py3compat.unicode_to_str(cell,
1888 self.readline.add_history(py3compat.unicode_to_str(cell,
1889 stdin_encoding))
1889 stdin_encoding))
1890 else:
1890 else:
1891 for line in cell.splitlines():
1891 for line in cell.splitlines():
1892 self.readline.add_history(py3compat.unicode_to_str(line,
1892 self.readline.add_history(py3compat.unicode_to_str(line,
1893 stdin_encoding))
1893 stdin_encoding))
1894 last_cell = cell
1894 last_cell = cell
1895
1895
1896 @skip_doctest
1896 @skip_doctest
1897 def set_next_input(self, s):
1897 def set_next_input(self, s):
1898 """ Sets the 'default' input string for the next command line.
1898 """ Sets the 'default' input string for the next command line.
1899
1899
1900 Requires readline.
1900 Requires readline.
1901
1901
1902 Example::
1902 Example::
1903
1903
1904 In [1]: _ip.set_next_input("Hello Word")
1904 In [1]: _ip.set_next_input("Hello Word")
1905 In [2]: Hello Word_ # cursor is here
1905 In [2]: Hello Word_ # cursor is here
1906 """
1906 """
1907 self.rl_next_input = py3compat.cast_bytes_py2(s)
1907 self.rl_next_input = py3compat.cast_bytes_py2(s)
1908
1908
1909 # Maybe move this to the terminal subclass?
1909 # Maybe move this to the terminal subclass?
1910 def pre_readline(self):
1910 def pre_readline(self):
1911 """readline hook to be used at the start of each line.
1911 """readline hook to be used at the start of each line.
1912
1912
1913 Currently it handles auto-indent only."""
1913 Currently it handles auto-indent only."""
1914
1914
1915 if self.rl_do_indent:
1915 if self.rl_do_indent:
1916 self.readline.insert_text(self._indent_current_str())
1916 self.readline.insert_text(self._indent_current_str())
1917 if self.rl_next_input is not None:
1917 if self.rl_next_input is not None:
1918 self.readline.insert_text(self.rl_next_input)
1918 self.readline.insert_text(self.rl_next_input)
1919 self.rl_next_input = None
1919 self.rl_next_input = None
1920
1920
1921 def _indent_current_str(self):
1921 def _indent_current_str(self):
1922 """return the current level of indentation as a string"""
1922 """return the current level of indentation as a string"""
1923 return self.input_splitter.indent_spaces * ' '
1923 return self.input_splitter.indent_spaces * ' '
1924
1924
1925 #-------------------------------------------------------------------------
1925 #-------------------------------------------------------------------------
1926 # Things related to text completion
1926 # Things related to text completion
1927 #-------------------------------------------------------------------------
1927 #-------------------------------------------------------------------------
1928
1928
1929 def init_completer(self):
1929 def init_completer(self):
1930 """Initialize the completion machinery.
1930 """Initialize the completion machinery.
1931
1931
1932 This creates completion machinery that can be used by client code,
1932 This creates completion machinery that can be used by client code,
1933 either interactively in-process (typically triggered by the readline
1933 either interactively in-process (typically triggered by the readline
1934 library), programatically (such as in test suites) or out-of-prcess
1934 library), programatically (such as in test suites) or out-of-prcess
1935 (typically over the network by remote frontends).
1935 (typically over the network by remote frontends).
1936 """
1936 """
1937 from IPython.core.completer import IPCompleter
1937 from IPython.core.completer import IPCompleter
1938 from IPython.core.completerlib import (module_completer,
1938 from IPython.core.completerlib import (module_completer,
1939 magic_run_completer, cd_completer, reset_completer)
1939 magic_run_completer, cd_completer, reset_completer)
1940
1940
1941 self.Completer = IPCompleter(shell=self,
1941 self.Completer = IPCompleter(shell=self,
1942 namespace=self.user_ns,
1942 namespace=self.user_ns,
1943 global_namespace=self.user_global_ns,
1943 global_namespace=self.user_global_ns,
1944 alias_table=self.alias_manager.alias_table,
1944 alias_table=self.alias_manager.alias_table,
1945 use_readline=self.has_readline,
1945 use_readline=self.has_readline,
1946 config=self.config,
1946 config=self.config,
1947 )
1947 )
1948 self.configurables.append(self.Completer)
1948 self.configurables.append(self.Completer)
1949
1949
1950 # Add custom completers to the basic ones built into IPCompleter
1950 # Add custom completers to the basic ones built into IPCompleter
1951 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1951 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1952 self.strdispatchers['complete_command'] = sdisp
1952 self.strdispatchers['complete_command'] = sdisp
1953 self.Completer.custom_completers = sdisp
1953 self.Completer.custom_completers = sdisp
1954
1954
1955 self.set_hook('complete_command', module_completer, str_key = 'import')
1955 self.set_hook('complete_command', module_completer, str_key = 'import')
1956 self.set_hook('complete_command', module_completer, str_key = 'from')
1956 self.set_hook('complete_command', module_completer, str_key = 'from')
1957 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1957 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1958 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1958 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1959 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1959 self.set_hook('complete_command', reset_completer, str_key = '%reset')
1960
1960
1961 # Only configure readline if we truly are using readline. IPython can
1961 # Only configure readline if we truly are using readline. IPython can
1962 # do tab-completion over the network, in GUIs, etc, where readline
1962 # do tab-completion over the network, in GUIs, etc, where readline
1963 # itself may be absent
1963 # itself may be absent
1964 if self.has_readline:
1964 if self.has_readline:
1965 self.set_readline_completer()
1965 self.set_readline_completer()
1966
1966
1967 def complete(self, text, line=None, cursor_pos=None):
1967 def complete(self, text, line=None, cursor_pos=None):
1968 """Return the completed text and a list of completions.
1968 """Return the completed text and a list of completions.
1969
1969
1970 Parameters
1970 Parameters
1971 ----------
1971 ----------
1972
1972
1973 text : string
1973 text : string
1974 A string of text to be completed on. It can be given as empty and
1974 A string of text to be completed on. It can be given as empty and
1975 instead a line/position pair are given. In this case, the
1975 instead a line/position pair are given. In this case, the
1976 completer itself will split the line like readline does.
1976 completer itself will split the line like readline does.
1977
1977
1978 line : string, optional
1978 line : string, optional
1979 The complete line that text is part of.
1979 The complete line that text is part of.
1980
1980
1981 cursor_pos : int, optional
1981 cursor_pos : int, optional
1982 The position of the cursor on the input line.
1982 The position of the cursor on the input line.
1983
1983
1984 Returns
1984 Returns
1985 -------
1985 -------
1986 text : string
1986 text : string
1987 The actual text that was completed.
1987 The actual text that was completed.
1988
1988
1989 matches : list
1989 matches : list
1990 A sorted list with all possible completions.
1990 A sorted list with all possible completions.
1991
1991
1992 The optional arguments allow the completion to take more context into
1992 The optional arguments allow the completion to take more context into
1993 account, and are part of the low-level completion API.
1993 account, and are part of the low-level completion API.
1994
1994
1995 This is a wrapper around the completion mechanism, similar to what
1995 This is a wrapper around the completion mechanism, similar to what
1996 readline does at the command line when the TAB key is hit. By
1996 readline does at the command line when the TAB key is hit. By
1997 exposing it as a method, it can be used by other non-readline
1997 exposing it as a method, it can be used by other non-readline
1998 environments (such as GUIs) for text completion.
1998 environments (such as GUIs) for text completion.
1999
1999
2000 Simple usage example:
2000 Simple usage example:
2001
2001
2002 In [1]: x = 'hello'
2002 In [1]: x = 'hello'
2003
2003
2004 In [2]: _ip.complete('x.l')
2004 In [2]: _ip.complete('x.l')
2005 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2005 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2006 """
2006 """
2007
2007
2008 # Inject names into __builtin__ so we can complete on the added names.
2008 # Inject names into __builtin__ so we can complete on the added names.
2009 with self.builtin_trap:
2009 with self.builtin_trap:
2010 return self.Completer.complete(text, line, cursor_pos)
2010 return self.Completer.complete(text, line, cursor_pos)
2011
2011
2012 def set_custom_completer(self, completer, pos=0):
2012 def set_custom_completer(self, completer, pos=0):
2013 """Adds a new custom completer function.
2013 """Adds a new custom completer function.
2014
2014
2015 The position argument (defaults to 0) is the index in the completers
2015 The position argument (defaults to 0) is the index in the completers
2016 list where you want the completer to be inserted."""
2016 list where you want the completer to be inserted."""
2017
2017
2018 newcomp = types.MethodType(completer,self.Completer)
2018 newcomp = types.MethodType(completer,self.Completer)
2019 self.Completer.matchers.insert(pos,newcomp)
2019 self.Completer.matchers.insert(pos,newcomp)
2020
2020
2021 def set_readline_completer(self):
2021 def set_readline_completer(self):
2022 """Reset readline's completer to be our own."""
2022 """Reset readline's completer to be our own."""
2023 self.readline.set_completer(self.Completer.rlcomplete)
2023 self.readline.set_completer(self.Completer.rlcomplete)
2024
2024
2025 def set_completer_frame(self, frame=None):
2025 def set_completer_frame(self, frame=None):
2026 """Set the frame of the completer."""
2026 """Set the frame of the completer."""
2027 if frame:
2027 if frame:
2028 self.Completer.namespace = frame.f_locals
2028 self.Completer.namespace = frame.f_locals
2029 self.Completer.global_namespace = frame.f_globals
2029 self.Completer.global_namespace = frame.f_globals
2030 else:
2030 else:
2031 self.Completer.namespace = self.user_ns
2031 self.Completer.namespace = self.user_ns
2032 self.Completer.global_namespace = self.user_global_ns
2032 self.Completer.global_namespace = self.user_global_ns
2033
2033
2034 #-------------------------------------------------------------------------
2034 #-------------------------------------------------------------------------
2035 # Things related to magics
2035 # Things related to magics
2036 #-------------------------------------------------------------------------
2036 #-------------------------------------------------------------------------
2037
2037
2038 def init_magics(self):
2038 def init_magics(self):
2039 from IPython.core import magics as m
2039 from IPython.core import magics as m
2040 self.magics_manager = magic.MagicsManager(shell=self,
2040 self.magics_manager = magic.MagicsManager(shell=self,
2041 config=self.config,
2041 config=self.config,
2042 user_magics=m.UserMagics(self))
2042 user_magics=m.UserMagics(self))
2043 self.configurables.append(self.magics_manager)
2043 self.configurables.append(self.magics_manager)
2044
2044
2045 # Expose as public API from the magics manager
2045 # Expose as public API from the magics manager
2046 self.register_magics = self.magics_manager.register
2046 self.register_magics = self.magics_manager.register
2047 self.register_magic_function = self.magics_manager.register_function
2047 self.register_magic_function = self.magics_manager.register_function
2048 self.define_magic = self.magics_manager.define_magic
2048 self.define_magic = self.magics_manager.define_magic
2049
2049
2050 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2050 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2051 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2051 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2052 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2052 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2053 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2053 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2054 )
2054 )
2055
2055
2056 # Register Magic Aliases
2056 # Register Magic Aliases
2057 mman = self.magics_manager
2057 mman = self.magics_manager
2058 # FIXME: magic aliases should be defined by the Magics classes
2058 # FIXME: magic aliases should be defined by the Magics classes
2059 # or in MagicsManager, not here
2059 # or in MagicsManager, not here
2060 mman.register_alias('ed', 'edit')
2060 mman.register_alias('ed', 'edit')
2061 mman.register_alias('hist', 'history')
2061 mman.register_alias('hist', 'history')
2062 mman.register_alias('rep', 'recall')
2062 mman.register_alias('rep', 'recall')
2063 mman.register_alias('SVG', 'svg', 'cell')
2063 mman.register_alias('SVG', 'svg', 'cell')
2064 mman.register_alias('HTML', 'html', 'cell')
2064 mman.register_alias('HTML', 'html', 'cell')
2065 mman.register_alias('file', 'writefile', 'cell')
2065 mman.register_alias('file', 'writefile', 'cell')
2066
2066
2067 # FIXME: Move the color initialization to the DisplayHook, which
2067 # FIXME: Move the color initialization to the DisplayHook, which
2068 # should be split into a prompt manager and displayhook. We probably
2068 # should be split into a prompt manager and displayhook. We probably
2069 # even need a centralize colors management object.
2069 # even need a centralize colors management object.
2070 self.magic('colors %s' % self.colors)
2070 self.magic('colors %s' % self.colors)
2071
2071
2072 def run_line_magic(self, magic_name, line):
2072 def run_line_magic(self, magic_name, line):
2073 """Execute the given line magic.
2073 """Execute the given line magic.
2074
2074
2075 Parameters
2075 Parameters
2076 ----------
2076 ----------
2077 magic_name : str
2077 magic_name : str
2078 Name of the desired magic function, without '%' prefix.
2078 Name of the desired magic function, without '%' prefix.
2079
2079
2080 line : str
2080 line : str
2081 The rest of the input line as a single string.
2081 The rest of the input line as a single string.
2082 """
2082 """
2083 fn = self.find_line_magic(magic_name)
2083 fn = self.find_line_magic(magic_name)
2084 if fn is None:
2084 if fn is None:
2085 cm = self.find_cell_magic(magic_name)
2085 cm = self.find_cell_magic(magic_name)
2086 etpl = "Line magic function `%%%s` not found%s."
2086 etpl = "Line magic function `%%%s` not found%s."
2087 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2087 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2088 'did you mean that instead?)' % magic_name )
2088 'did you mean that instead?)' % magic_name )
2089 error(etpl % (magic_name, extra))
2089 error(etpl % (magic_name, extra))
2090 else:
2090 else:
2091 # Note: this is the distance in the stack to the user's frame.
2091 # Note: this is the distance in the stack to the user's frame.
2092 # This will need to be updated if the internal calling logic gets
2092 # This will need to be updated if the internal calling logic gets
2093 # refactored, or else we'll be expanding the wrong variables.
2093 # refactored, or else we'll be expanding the wrong variables.
2094 stack_depth = 2
2094 stack_depth = 2
2095 magic_arg_s = self.var_expand(line, stack_depth)
2095 magic_arg_s = self.var_expand(line, stack_depth)
2096 # Put magic args in a list so we can call with f(*a) syntax
2096 # Put magic args in a list so we can call with f(*a) syntax
2097 args = [magic_arg_s]
2097 args = [magic_arg_s]
2098 kwargs = {}
2098 kwargs = {}
2099 # Grab local namespace if we need it:
2099 # Grab local namespace if we need it:
2100 if getattr(fn, "needs_local_scope", False):
2100 if getattr(fn, "needs_local_scope", False):
2101 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2101 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2102 with self.builtin_trap:
2102 with self.builtin_trap:
2103 result = fn(*args,**kwargs)
2103 result = fn(*args,**kwargs)
2104 return result
2104 return result
2105
2105
2106 def run_cell_magic(self, magic_name, line, cell):
2106 def run_cell_magic(self, magic_name, line, cell):
2107 """Execute the given cell magic.
2107 """Execute the given cell magic.
2108
2108
2109 Parameters
2109 Parameters
2110 ----------
2110 ----------
2111 magic_name : str
2111 magic_name : str
2112 Name of the desired magic function, without '%' prefix.
2112 Name of the desired magic function, without '%' prefix.
2113
2113
2114 line : str
2114 line : str
2115 The rest of the first input line as a single string.
2115 The rest of the first input line as a single string.
2116
2116
2117 cell : str
2117 cell : str
2118 The body of the cell as a (possibly multiline) string.
2118 The body of the cell as a (possibly multiline) string.
2119 """
2119 """
2120 fn = self.find_cell_magic(magic_name)
2120 fn = self.find_cell_magic(magic_name)
2121 if fn is None:
2121 if fn is None:
2122 lm = self.find_line_magic(magic_name)
2122 lm = self.find_line_magic(magic_name)
2123 etpl = "Cell magic `%%{0}` not found{1}."
2123 etpl = "Cell magic `%%{0}` not found{1}."
2124 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2124 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2125 'did you mean that instead?)'.format(magic_name))
2125 'did you mean that instead?)'.format(magic_name))
2126 error(etpl.format(magic_name, extra))
2126 error(etpl.format(magic_name, extra))
2127 elif cell == '':
2127 elif cell == '':
2128 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2128 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2129 if self.find_line_magic(magic_name) is not None:
2129 if self.find_line_magic(magic_name) is not None:
2130 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2130 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2131 raise UsageError(message)
2131 raise UsageError(message)
2132 else:
2132 else:
2133 # Note: this is the distance in the stack to the user's frame.
2133 # Note: this is the distance in the stack to the user's frame.
2134 # This will need to be updated if the internal calling logic gets
2134 # This will need to be updated if the internal calling logic gets
2135 # refactored, or else we'll be expanding the wrong variables.
2135 # refactored, or else we'll be expanding the wrong variables.
2136 stack_depth = 2
2136 stack_depth = 2
2137 magic_arg_s = self.var_expand(line, stack_depth)
2137 magic_arg_s = self.var_expand(line, stack_depth)
2138 with self.builtin_trap:
2138 with self.builtin_trap:
2139 result = fn(magic_arg_s, cell)
2139 result = fn(magic_arg_s, cell)
2140 return result
2140 return result
2141
2141
2142 def find_line_magic(self, magic_name):
2142 def find_line_magic(self, magic_name):
2143 """Find and return a line magic by name.
2143 """Find and return a line magic by name.
2144
2144
2145 Returns None if the magic isn't found."""
2145 Returns None if the magic isn't found."""
2146 return self.magics_manager.magics['line'].get(magic_name)
2146 return self.magics_manager.magics['line'].get(magic_name)
2147
2147
2148 def find_cell_magic(self, magic_name):
2148 def find_cell_magic(self, magic_name):
2149 """Find and return a cell magic by name.
2149 """Find and return a cell magic by name.
2150
2150
2151 Returns None if the magic isn't found."""
2151 Returns None if the magic isn't found."""
2152 return self.magics_manager.magics['cell'].get(magic_name)
2152 return self.magics_manager.magics['cell'].get(magic_name)
2153
2153
2154 def find_magic(self, magic_name, magic_kind='line'):
2154 def find_magic(self, magic_name, magic_kind='line'):
2155 """Find and return a magic of the given type by name.
2155 """Find and return a magic of the given type by name.
2156
2156
2157 Returns None if the magic isn't found."""
2157 Returns None if the magic isn't found."""
2158 return self.magics_manager.magics[magic_kind].get(magic_name)
2158 return self.magics_manager.magics[magic_kind].get(magic_name)
2159
2159
2160 def magic(self, arg_s):
2160 def magic(self, arg_s):
2161 """DEPRECATED. Use run_line_magic() instead.
2161 """DEPRECATED. Use run_line_magic() instead.
2162
2162
2163 Call a magic function by name.
2163 Call a magic function by name.
2164
2164
2165 Input: a string containing the name of the magic function to call and
2165 Input: a string containing the name of the magic function to call and
2166 any additional arguments to be passed to the magic.
2166 any additional arguments to be passed to the magic.
2167
2167
2168 magic('name -opt foo bar') is equivalent to typing at the ipython
2168 magic('name -opt foo bar') is equivalent to typing at the ipython
2169 prompt:
2169 prompt:
2170
2170
2171 In[1]: %name -opt foo bar
2171 In[1]: %name -opt foo bar
2172
2172
2173 To call a magic without arguments, simply use magic('name').
2173 To call a magic without arguments, simply use magic('name').
2174
2174
2175 This provides a proper Python function to call IPython's magics in any
2175 This provides a proper Python function to call IPython's magics in any
2176 valid Python code you can type at the interpreter, including loops and
2176 valid Python code you can type at the interpreter, including loops and
2177 compound statements.
2177 compound statements.
2178 """
2178 """
2179 # TODO: should we issue a loud deprecation warning here?
2179 # TODO: should we issue a loud deprecation warning here?
2180 magic_name, _, magic_arg_s = arg_s.partition(' ')
2180 magic_name, _, magic_arg_s = arg_s.partition(' ')
2181 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2181 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2182 return self.run_line_magic(magic_name, magic_arg_s)
2182 return self.run_line_magic(magic_name, magic_arg_s)
2183
2183
2184 #-------------------------------------------------------------------------
2184 #-------------------------------------------------------------------------
2185 # Things related to macros
2185 # Things related to macros
2186 #-------------------------------------------------------------------------
2186 #-------------------------------------------------------------------------
2187
2187
2188 def define_macro(self, name, themacro):
2188 def define_macro(self, name, themacro):
2189 """Define a new macro
2189 """Define a new macro
2190
2190
2191 Parameters
2191 Parameters
2192 ----------
2192 ----------
2193 name : str
2193 name : str
2194 The name of the macro.
2194 The name of the macro.
2195 themacro : str or Macro
2195 themacro : str or Macro
2196 The action to do upon invoking the macro. If a string, a new
2196 The action to do upon invoking the macro. If a string, a new
2197 Macro object is created by passing the string to it.
2197 Macro object is created by passing the string to it.
2198 """
2198 """
2199
2199
2200 from IPython.core import macro
2200 from IPython.core import macro
2201
2201
2202 if isinstance(themacro, basestring):
2202 if isinstance(themacro, basestring):
2203 themacro = macro.Macro(themacro)
2203 themacro = macro.Macro(themacro)
2204 if not isinstance(themacro, macro.Macro):
2204 if not isinstance(themacro, macro.Macro):
2205 raise ValueError('A macro must be a string or a Macro instance.')
2205 raise ValueError('A macro must be a string or a Macro instance.')
2206 self.user_ns[name] = themacro
2206 self.user_ns[name] = themacro
2207
2207
2208 #-------------------------------------------------------------------------
2208 #-------------------------------------------------------------------------
2209 # Things related to the running of system commands
2209 # Things related to the running of system commands
2210 #-------------------------------------------------------------------------
2210 #-------------------------------------------------------------------------
2211
2211
2212 def system_piped(self, cmd):
2212 def system_piped(self, cmd):
2213 """Call the given cmd in a subprocess, piping stdout/err
2213 """Call the given cmd in a subprocess, piping stdout/err
2214
2214
2215 Parameters
2215 Parameters
2216 ----------
2216 ----------
2217 cmd : str
2217 cmd : str
2218 Command to execute (can not end in '&', as background processes are
2218 Command to execute (can not end in '&', as background processes are
2219 not supported. Should not be a command that expects input
2219 not supported. Should not be a command that expects input
2220 other than simple text.
2220 other than simple text.
2221 """
2221 """
2222 if cmd.rstrip().endswith('&'):
2222 if cmd.rstrip().endswith('&'):
2223 # this is *far* from a rigorous test
2223 # this is *far* from a rigorous test
2224 # We do not support backgrounding processes because we either use
2224 # We do not support backgrounding processes because we either use
2225 # pexpect or pipes to read from. Users can always just call
2225 # pexpect or pipes to read from. Users can always just call
2226 # os.system() or use ip.system=ip.system_raw
2226 # os.system() or use ip.system=ip.system_raw
2227 # if they really want a background process.
2227 # if they really want a background process.
2228 raise OSError("Background processes not supported.")
2228 raise OSError("Background processes not supported.")
2229
2229
2230 # we explicitly do NOT return the subprocess status code, because
2230 # we explicitly do NOT return the subprocess status code, because
2231 # a non-None value would trigger :func:`sys.displayhook` calls.
2231 # a non-None value would trigger :func:`sys.displayhook` calls.
2232 # Instead, we store the exit_code in user_ns.
2232 # Instead, we store the exit_code in user_ns.
2233 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2233 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2234
2234
2235 def system_raw(self, cmd):
2235 def system_raw(self, cmd):
2236 """Call the given cmd in a subprocess using os.system
2236 """Call the given cmd in a subprocess using os.system
2237
2237
2238 Parameters
2238 Parameters
2239 ----------
2239 ----------
2240 cmd : str
2240 cmd : str
2241 Command to execute.
2241 Command to execute.
2242 """
2242 """
2243 cmd = self.var_expand(cmd, depth=1)
2243 cmd = self.var_expand(cmd, depth=1)
2244 # protect os.system from UNC paths on Windows, which it can't handle:
2244 # protect os.system from UNC paths on Windows, which it can't handle:
2245 if sys.platform == 'win32':
2245 if sys.platform == 'win32':
2246 from IPython.utils._process_win32 import AvoidUNCPath
2246 from IPython.utils._process_win32 import AvoidUNCPath
2247 with AvoidUNCPath() as path:
2247 with AvoidUNCPath() as path:
2248 if path is not None:
2248 if path is not None:
2249 cmd = '"pushd %s &&"%s' % (path, cmd)
2249 cmd = '"pushd %s &&"%s' % (path, cmd)
2250 cmd = py3compat.unicode_to_str(cmd)
2250 cmd = py3compat.unicode_to_str(cmd)
2251 ec = os.system(cmd)
2251 ec = os.system(cmd)
2252 else:
2252 else:
2253 cmd = py3compat.unicode_to_str(cmd)
2253 cmd = py3compat.unicode_to_str(cmd)
2254 ec = os.system(cmd)
2254 ec = os.system(cmd)
2255 # The high byte is the exit code, the low byte is a signal number
2255 # The high byte is the exit code, the low byte is a signal number
2256 # that we discard for now. See the docs for os.wait()
2256 # that we discard for now. See the docs for os.wait()
2257 if ec > 255:
2257 if ec > 255:
2258 ec >>= 8
2258 ec >>= 8
2259
2259
2260 # We explicitly do NOT return the subprocess status code, because
2260 # We explicitly do NOT return the subprocess status code, because
2261 # a non-None value would trigger :func:`sys.displayhook` calls.
2261 # a non-None value would trigger :func:`sys.displayhook` calls.
2262 # Instead, we store the exit_code in user_ns.
2262 # Instead, we store the exit_code in user_ns.
2263 self.user_ns['_exit_code'] = ec
2263 self.user_ns['_exit_code'] = ec
2264
2264
2265 # use piped system by default, because it is better behaved
2265 # use piped system by default, because it is better behaved
2266 system = system_piped
2266 system = system_piped
2267
2267
2268 def getoutput(self, cmd, split=True, depth=0):
2268 def getoutput(self, cmd, split=True, depth=0):
2269 """Get output (possibly including stderr) from a subprocess.
2269 """Get output (possibly including stderr) from a subprocess.
2270
2270
2271 Parameters
2271 Parameters
2272 ----------
2272 ----------
2273 cmd : str
2273 cmd : str
2274 Command to execute (can not end in '&', as background processes are
2274 Command to execute (can not end in '&', as background processes are
2275 not supported.
2275 not supported.
2276 split : bool, optional
2276 split : bool, optional
2277 If True, split the output into an IPython SList. Otherwise, an
2277 If True, split the output into an IPython SList. Otherwise, an
2278 IPython LSString is returned. These are objects similar to normal
2278 IPython LSString is returned. These are objects similar to normal
2279 lists and strings, with a few convenience attributes for easier
2279 lists and strings, with a few convenience attributes for easier
2280 manipulation of line-based output. You can use '?' on them for
2280 manipulation of line-based output. You can use '?' on them for
2281 details.
2281 details.
2282 depth : int, optional
2282 depth : int, optional
2283 How many frames above the caller are the local variables which should
2283 How many frames above the caller are the local variables which should
2284 be expanded in the command string? The default (0) assumes that the
2284 be expanded in the command string? The default (0) assumes that the
2285 expansion variables are in the stack frame calling this function.
2285 expansion variables are in the stack frame calling this function.
2286 """
2286 """
2287 if cmd.rstrip().endswith('&'):
2287 if cmd.rstrip().endswith('&'):
2288 # this is *far* from a rigorous test
2288 # this is *far* from a rigorous test
2289 raise OSError("Background processes not supported.")
2289 raise OSError("Background processes not supported.")
2290 out = getoutput(self.var_expand(cmd, depth=depth+1))
2290 out = getoutput(self.var_expand(cmd, depth=depth+1))
2291 if split:
2291 if split:
2292 out = SList(out.splitlines())
2292 out = SList(out.splitlines())
2293 else:
2293 else:
2294 out = LSString(out)
2294 out = LSString(out)
2295 return out
2295 return out
2296
2296
2297 #-------------------------------------------------------------------------
2297 #-------------------------------------------------------------------------
2298 # Things related to aliases
2298 # Things related to aliases
2299 #-------------------------------------------------------------------------
2299 #-------------------------------------------------------------------------
2300
2300
2301 def init_alias(self):
2301 def init_alias(self):
2302 self.alias_manager = AliasManager(shell=self, config=self.config)
2302 self.alias_manager = AliasManager(shell=self, config=self.config)
2303 self.configurables.append(self.alias_manager)
2303 self.configurables.append(self.alias_manager)
2304 self.ns_table['alias'] = self.alias_manager.alias_table,
2304 self.ns_table['alias'] = self.alias_manager.alias_table,
2305
2305
2306 #-------------------------------------------------------------------------
2306 #-------------------------------------------------------------------------
2307 # Things related to extensions
2307 # Things related to extensions
2308 #-------------------------------------------------------------------------
2308 #-------------------------------------------------------------------------
2309
2309
2310 def init_extension_manager(self):
2310 def init_extension_manager(self):
2311 self.extension_manager = ExtensionManager(shell=self, config=self.config)
2311 self.extension_manager = ExtensionManager(shell=self, config=self.config)
2312 self.configurables.append(self.extension_manager)
2312 self.configurables.append(self.extension_manager)
2313
2313
2314 #-------------------------------------------------------------------------
2314 #-------------------------------------------------------------------------
2315 # Things related to payloads
2315 # Things related to payloads
2316 #-------------------------------------------------------------------------
2316 #-------------------------------------------------------------------------
2317
2317
2318 def init_payload(self):
2318 def init_payload(self):
2319 self.payload_manager = PayloadManager(config=self.config)
2319 self.payload_manager = PayloadManager(config=self.config)
2320 self.configurables.append(self.payload_manager)
2320 self.configurables.append(self.payload_manager)
2321
2321
2322 #-------------------------------------------------------------------------
2322 #-------------------------------------------------------------------------
2323 # Things related to the prefilter
2323 # Things related to the prefilter
2324 #-------------------------------------------------------------------------
2324 #-------------------------------------------------------------------------
2325
2325
2326 def init_prefilter(self):
2326 def init_prefilter(self):
2327 self.prefilter_manager = PrefilterManager(shell=self, config=self.config)
2327 self.prefilter_manager = PrefilterManager(shell=self, config=self.config)
2328 self.configurables.append(self.prefilter_manager)
2328 self.configurables.append(self.prefilter_manager)
2329 # Ultimately this will be refactored in the new interpreter code, but
2329 # Ultimately this will be refactored in the new interpreter code, but
2330 # for now, we should expose the main prefilter method (there's legacy
2330 # for now, we should expose the main prefilter method (there's legacy
2331 # code out there that may rely on this).
2331 # code out there that may rely on this).
2332 self.prefilter = self.prefilter_manager.prefilter_lines
2332 self.prefilter = self.prefilter_manager.prefilter_lines
2333
2333
2334 def auto_rewrite_input(self, cmd):
2334 def auto_rewrite_input(self, cmd):
2335 """Print to the screen the rewritten form of the user's command.
2335 """Print to the screen the rewritten form of the user's command.
2336
2336
2337 This shows visual feedback by rewriting input lines that cause
2337 This shows visual feedback by rewriting input lines that cause
2338 automatic calling to kick in, like::
2338 automatic calling to kick in, like::
2339
2339
2340 /f x
2340 /f x
2341
2341
2342 into::
2342 into::
2343
2343
2344 ------> f(x)
2344 ------> f(x)
2345
2345
2346 after the user's input prompt. This helps the user understand that the
2346 after the user's input prompt. This helps the user understand that the
2347 input line was transformed automatically by IPython.
2347 input line was transformed automatically by IPython.
2348 """
2348 """
2349 if not self.show_rewritten_input:
2349 if not self.show_rewritten_input:
2350 return
2350 return
2351
2351
2352 rw = self.prompt_manager.render('rewrite') + cmd
2352 rw = self.prompt_manager.render('rewrite') + cmd
2353
2353
2354 try:
2354 try:
2355 # plain ascii works better w/ pyreadline, on some machines, so
2355 # plain ascii works better w/ pyreadline, on some machines, so
2356 # we use it and only print uncolored rewrite if we have unicode
2356 # we use it and only print uncolored rewrite if we have unicode
2357 rw = str(rw)
2357 rw = str(rw)
2358 print(rw, file=io.stdout)
2358 print(rw, file=io.stdout)
2359 except UnicodeEncodeError:
2359 except UnicodeEncodeError:
2360 print("------> " + cmd)
2360 print("------> " + cmd)
2361
2361
2362 #-------------------------------------------------------------------------
2362 #-------------------------------------------------------------------------
2363 # Things related to extracting values/expressions from kernel and user_ns
2363 # Things related to extracting values/expressions from kernel and user_ns
2364 #-------------------------------------------------------------------------
2364 #-------------------------------------------------------------------------
2365
2365
2366 def _simple_error(self):
2366 def _user_obj_error(self):
2367 etype, value = sys.exc_info()[:2]
2367 """return simple exception dict
2368 return u'[ERROR] {e.__name__}: {v}'.format(e=etype, v=value)
2368
2369 for use in user_variables / expressions
2370 """
2371
2372 etype, evalue, tb = self._get_exc_info()
2373 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2374
2375 exc_info = {
2376 u'status' : 'error',
2377 u'traceback' : stb,
2378 u'ename' : unicode(etype.__name__),
2379 u'evalue' : py3compat.safe_unicode(evalue),
2380 }
2369
2381
2382 return exc_info
2383
2384 def _format_user_obj(self, obj):
2385 """format a user object to display dict
2386
2387 for use in user_expressions / variables
2388 """
2389
2390 data, md = self.display_formatter.format(obj)
2391 value = {
2392 'status' : 'ok',
2393 'data' : data,
2394 'metadata' : md,
2395 }
2396 return value
2397
2370 def user_variables(self, names):
2398 def user_variables(self, names):
2371 """Get a list of variable names from the user's namespace.
2399 """Get a list of variable names from the user's namespace.
2372
2400
2373 Parameters
2401 Parameters
2374 ----------
2402 ----------
2375 names : list of strings
2403 names : list of strings
2376 A list of names of variables to be read from the user namespace.
2404 A list of names of variables to be read from the user namespace.
2377
2405
2378 Returns
2406 Returns
2379 -------
2407 -------
2380 A dict, keyed by the input names and with the repr() of each value.
2408 A dict, keyed by the input names and with the rich mime-type repr(s) of each value.
2409 Each element will be a sub-dict of the same form as a display_data message.
2381 """
2410 """
2382 out = {}
2411 out = {}
2383 user_ns = self.user_ns
2412 user_ns = self.user_ns
2413
2384 for varname in names:
2414 for varname in names:
2385 try:
2415 try:
2386 value = repr(user_ns[varname])
2416 value = self._format_user_obj(user_ns[varname])
2387 except:
2417 except:
2388 value = self._simple_error()
2418 value = self._user_obj_error()
2389 out[varname] = value
2419 out[varname] = value
2390 return out
2420 return out
2391
2421
2392 def user_expressions(self, expressions):
2422 def user_expressions(self, expressions):
2393 """Evaluate a dict of expressions in the user's namespace.
2423 """Evaluate a dict of expressions in the user's namespace.
2394
2424
2395 Parameters
2425 Parameters
2396 ----------
2426 ----------
2397 expressions : dict
2427 expressions : dict
2398 A dict with string keys and string values. The expression values
2428 A dict with string keys and string values. The expression values
2399 should be valid Python expressions, each of which will be evaluated
2429 should be valid Python expressions, each of which will be evaluated
2400 in the user namespace.
2430 in the user namespace.
2401
2431
2402 Returns
2432 Returns
2403 -------
2433 -------
2404 A dict, keyed like the input expressions dict, with the repr() of each
2434 A dict, keyed like the input expressions dict, with the rich mime-typed
2405 value.
2435 display_data of each value.
2406 """
2436 """
2407 out = {}
2437 out = {}
2408 user_ns = self.user_ns
2438 user_ns = self.user_ns
2409 global_ns = self.user_global_ns
2439 global_ns = self.user_global_ns
2440
2410 for key, expr in expressions.iteritems():
2441 for key, expr in expressions.iteritems():
2411 try:
2442 try:
2412 value = repr(eval(expr, global_ns, user_ns))
2443 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2413 except:
2444 except:
2414 value = self._simple_error()
2445 value = self._user_obj_error()
2415 out[key] = value
2446 out[key] = value
2416 return out
2447 return out
2417
2448
2418 #-------------------------------------------------------------------------
2449 #-------------------------------------------------------------------------
2419 # Things related to the running of code
2450 # Things related to the running of code
2420 #-------------------------------------------------------------------------
2451 #-------------------------------------------------------------------------
2421
2452
2422 def ex(self, cmd):
2453 def ex(self, cmd):
2423 """Execute a normal python statement in user namespace."""
2454 """Execute a normal python statement in user namespace."""
2424 with self.builtin_trap:
2455 with self.builtin_trap:
2425 exec cmd in self.user_global_ns, self.user_ns
2456 exec cmd in self.user_global_ns, self.user_ns
2426
2457
2427 def ev(self, expr):
2458 def ev(self, expr):
2428 """Evaluate python expression expr in user namespace.
2459 """Evaluate python expression expr in user namespace.
2429
2460
2430 Returns the result of evaluation
2461 Returns the result of evaluation
2431 """
2462 """
2432 with self.builtin_trap:
2463 with self.builtin_trap:
2433 return eval(expr, self.user_global_ns, self.user_ns)
2464 return eval(expr, self.user_global_ns, self.user_ns)
2434
2465
2435 def safe_execfile(self, fname, *where, **kw):
2466 def safe_execfile(self, fname, *where, **kw):
2436 """A safe version of the builtin execfile().
2467 """A safe version of the builtin execfile().
2437
2468
2438 This version will never throw an exception, but instead print
2469 This version will never throw an exception, but instead print
2439 helpful error messages to the screen. This only works on pure
2470 helpful error messages to the screen. This only works on pure
2440 Python files with the .py extension.
2471 Python files with the .py extension.
2441
2472
2442 Parameters
2473 Parameters
2443 ----------
2474 ----------
2444 fname : string
2475 fname : string
2445 The name of the file to be executed.
2476 The name of the file to be executed.
2446 where : tuple
2477 where : tuple
2447 One or two namespaces, passed to execfile() as (globals,locals).
2478 One or two namespaces, passed to execfile() as (globals,locals).
2448 If only one is given, it is passed as both.
2479 If only one is given, it is passed as both.
2449 exit_ignore : bool (False)
2480 exit_ignore : bool (False)
2450 If True, then silence SystemExit for non-zero status (it is always
2481 If True, then silence SystemExit for non-zero status (it is always
2451 silenced for zero status, as it is so common).
2482 silenced for zero status, as it is so common).
2452 raise_exceptions : bool (False)
2483 raise_exceptions : bool (False)
2453 If True raise exceptions everywhere. Meant for testing.
2484 If True raise exceptions everywhere. Meant for testing.
2454
2485
2455 """
2486 """
2456 kw.setdefault('exit_ignore', False)
2487 kw.setdefault('exit_ignore', False)
2457 kw.setdefault('raise_exceptions', False)
2488 kw.setdefault('raise_exceptions', False)
2458
2489
2459 fname = os.path.abspath(os.path.expanduser(fname))
2490 fname = os.path.abspath(os.path.expanduser(fname))
2460
2491
2461 # Make sure we can open the file
2492 # Make sure we can open the file
2462 try:
2493 try:
2463 with open(fname) as thefile:
2494 with open(fname) as thefile:
2464 pass
2495 pass
2465 except:
2496 except:
2466 warn('Could not open file <%s> for safe execution.' % fname)
2497 warn('Could not open file <%s> for safe execution.' % fname)
2467 return
2498 return
2468
2499
2469 # Find things also in current directory. This is needed to mimic the
2500 # Find things also in current directory. This is needed to mimic the
2470 # behavior of running a script from the system command line, where
2501 # behavior of running a script from the system command line, where
2471 # Python inserts the script's directory into sys.path
2502 # Python inserts the script's directory into sys.path
2472 dname = os.path.dirname(fname)
2503 dname = os.path.dirname(fname)
2473
2504
2474 with prepended_to_syspath(dname):
2505 with prepended_to_syspath(dname):
2475 try:
2506 try:
2476 py3compat.execfile(fname,*where)
2507 py3compat.execfile(fname,*where)
2477 except SystemExit as status:
2508 except SystemExit as status:
2478 # If the call was made with 0 or None exit status (sys.exit(0)
2509 # If the call was made with 0 or None exit status (sys.exit(0)
2479 # or sys.exit() ), don't bother showing a traceback, as both of
2510 # or sys.exit() ), don't bother showing a traceback, as both of
2480 # these are considered normal by the OS:
2511 # these are considered normal by the OS:
2481 # > python -c'import sys;sys.exit(0)'; echo $?
2512 # > python -c'import sys;sys.exit(0)'; echo $?
2482 # 0
2513 # 0
2483 # > python -c'import sys;sys.exit()'; echo $?
2514 # > python -c'import sys;sys.exit()'; echo $?
2484 # 0
2515 # 0
2485 # For other exit status, we show the exception unless
2516 # For other exit status, we show the exception unless
2486 # explicitly silenced, but only in short form.
2517 # explicitly silenced, but only in short form.
2487 if kw['raise_exceptions']:
2518 if kw['raise_exceptions']:
2488 raise
2519 raise
2489 if status.code and not kw['exit_ignore']:
2520 if status.code and not kw['exit_ignore']:
2490 self.showtraceback(exception_only=True)
2521 self.showtraceback(exception_only=True)
2491 except:
2522 except:
2492 if kw['raise_exceptions']:
2523 if kw['raise_exceptions']:
2493 raise
2524 raise
2494 self.showtraceback()
2525 self.showtraceback()
2495
2526
2496 def safe_execfile_ipy(self, fname):
2527 def safe_execfile_ipy(self, fname):
2497 """Like safe_execfile, but for .ipy files with IPython syntax.
2528 """Like safe_execfile, but for .ipy files with IPython syntax.
2498
2529
2499 Parameters
2530 Parameters
2500 ----------
2531 ----------
2501 fname : str
2532 fname : str
2502 The name of the file to execute. The filename must have a
2533 The name of the file to execute. The filename must have a
2503 .ipy extension.
2534 .ipy extension.
2504 """
2535 """
2505 fname = os.path.abspath(os.path.expanduser(fname))
2536 fname = os.path.abspath(os.path.expanduser(fname))
2506
2537
2507 # Make sure we can open the file
2538 # Make sure we can open the file
2508 try:
2539 try:
2509 with open(fname) as thefile:
2540 with open(fname) as thefile:
2510 pass
2541 pass
2511 except:
2542 except:
2512 warn('Could not open file <%s> for safe execution.' % fname)
2543 warn('Could not open file <%s> for safe execution.' % fname)
2513 return
2544 return
2514
2545
2515 # Find things also in current directory. This is needed to mimic the
2546 # Find things also in current directory. This is needed to mimic the
2516 # behavior of running a script from the system command line, where
2547 # behavior of running a script from the system command line, where
2517 # Python inserts the script's directory into sys.path
2548 # Python inserts the script's directory into sys.path
2518 dname = os.path.dirname(fname)
2549 dname = os.path.dirname(fname)
2519
2550
2520 with prepended_to_syspath(dname):
2551 with prepended_to_syspath(dname):
2521 try:
2552 try:
2522 with open(fname) as thefile:
2553 with open(fname) as thefile:
2523 # self.run_cell currently captures all exceptions
2554 # self.run_cell currently captures all exceptions
2524 # raised in user code. It would be nice if there were
2555 # raised in user code. It would be nice if there were
2525 # versions of runlines, execfile that did raise, so
2556 # versions of runlines, execfile that did raise, so
2526 # we could catch the errors.
2557 # we could catch the errors.
2527 self.run_cell(thefile.read(), store_history=False, shell_futures=False)
2558 self.run_cell(thefile.read(), store_history=False, shell_futures=False)
2528 except:
2559 except:
2529 self.showtraceback()
2560 self.showtraceback()
2530 warn('Unknown failure executing file: <%s>' % fname)
2561 warn('Unknown failure executing file: <%s>' % fname)
2531
2562
2532 def safe_run_module(self, mod_name, where):
2563 def safe_run_module(self, mod_name, where):
2533 """A safe version of runpy.run_module().
2564 """A safe version of runpy.run_module().
2534
2565
2535 This version will never throw an exception, but instead print
2566 This version will never throw an exception, but instead print
2536 helpful error messages to the screen.
2567 helpful error messages to the screen.
2537
2568
2538 `SystemExit` exceptions with status code 0 or None are ignored.
2569 `SystemExit` exceptions with status code 0 or None are ignored.
2539
2570
2540 Parameters
2571 Parameters
2541 ----------
2572 ----------
2542 mod_name : string
2573 mod_name : string
2543 The name of the module to be executed.
2574 The name of the module to be executed.
2544 where : dict
2575 where : dict
2545 The globals namespace.
2576 The globals namespace.
2546 """
2577 """
2547 try:
2578 try:
2548 try:
2579 try:
2549 where.update(
2580 where.update(
2550 runpy.run_module(str(mod_name), run_name="__main__",
2581 runpy.run_module(str(mod_name), run_name="__main__",
2551 alter_sys=True)
2582 alter_sys=True)
2552 )
2583 )
2553 except SystemExit as status:
2584 except SystemExit as status:
2554 if status.code:
2585 if status.code:
2555 raise
2586 raise
2556 except:
2587 except:
2557 self.showtraceback()
2588 self.showtraceback()
2558 warn('Unknown failure executing module: <%s>' % mod_name)
2589 warn('Unknown failure executing module: <%s>' % mod_name)
2559
2590
2560 def _run_cached_cell_magic(self, magic_name, line):
2591 def _run_cached_cell_magic(self, magic_name, line):
2561 """Special method to call a cell magic with the data stored in self.
2592 """Special method to call a cell magic with the data stored in self.
2562 """
2593 """
2563 cell = self._current_cell_magic_body
2594 cell = self._current_cell_magic_body
2564 self._current_cell_magic_body = None
2595 self._current_cell_magic_body = None
2565 return self.run_cell_magic(magic_name, line, cell)
2596 return self.run_cell_magic(magic_name, line, cell)
2566
2597
2567 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2598 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2568 """Run a complete IPython cell.
2599 """Run a complete IPython cell.
2569
2600
2570 Parameters
2601 Parameters
2571 ----------
2602 ----------
2572 raw_cell : str
2603 raw_cell : str
2573 The code (including IPython code such as %magic functions) to run.
2604 The code (including IPython code such as %magic functions) to run.
2574 store_history : bool
2605 store_history : bool
2575 If True, the raw and translated cell will be stored in IPython's
2606 If True, the raw and translated cell will be stored in IPython's
2576 history. For user code calling back into IPython's machinery, this
2607 history. For user code calling back into IPython's machinery, this
2577 should be set to False.
2608 should be set to False.
2578 silent : bool
2609 silent : bool
2579 If True, avoid side-effects, such as implicit displayhooks and
2610 If True, avoid side-effects, such as implicit displayhooks and
2580 and logging. silent=True forces store_history=False.
2611 and logging. silent=True forces store_history=False.
2581 shell_futures : bool
2612 shell_futures : bool
2582 If True, the code will share future statements with the interactive
2613 If True, the code will share future statements with the interactive
2583 shell. It will both be affected by previous __future__ imports, and
2614 shell. It will both be affected by previous __future__ imports, and
2584 any __future__ imports in the code will affect the shell. If False,
2615 any __future__ imports in the code will affect the shell. If False,
2585 __future__ imports are not shared in either direction.
2616 __future__ imports are not shared in either direction.
2586 """
2617 """
2587 if (not raw_cell) or raw_cell.isspace():
2618 if (not raw_cell) or raw_cell.isspace():
2588 return
2619 return
2589
2620
2590 if silent:
2621 if silent:
2591 store_history = False
2622 store_history = False
2592
2623
2593 self.input_transformer_manager.push(raw_cell)
2624 self.input_transformer_manager.push(raw_cell)
2594 cell = self.input_transformer_manager.source_reset()
2625 cell = self.input_transformer_manager.source_reset()
2595
2626
2596 # Our own compiler remembers the __future__ environment. If we want to
2627 # Our own compiler remembers the __future__ environment. If we want to
2597 # run code with a separate __future__ environment, use the default
2628 # run code with a separate __future__ environment, use the default
2598 # compiler
2629 # compiler
2599 compiler = self.compile if shell_futures else CachingCompiler()
2630 compiler = self.compile if shell_futures else CachingCompiler()
2600
2631
2601 with self.builtin_trap:
2632 with self.builtin_trap:
2602 prefilter_failed = False
2633 prefilter_failed = False
2603 if len(cell.splitlines()) == 1:
2634 if len(cell.splitlines()) == 1:
2604 try:
2635 try:
2605 # use prefilter_lines to handle trailing newlines
2636 # use prefilter_lines to handle trailing newlines
2606 # restore trailing newline for ast.parse
2637 # restore trailing newline for ast.parse
2607 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2638 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2608 except AliasError as e:
2639 except AliasError as e:
2609 error(e)
2640 error(e)
2610 prefilter_failed = True
2641 prefilter_failed = True
2611 except Exception:
2642 except Exception:
2612 # don't allow prefilter errors to crash IPython
2643 # don't allow prefilter errors to crash IPython
2613 self.showtraceback()
2644 self.showtraceback()
2614 prefilter_failed = True
2645 prefilter_failed = True
2615
2646
2616 # Store raw and processed history
2647 # Store raw and processed history
2617 if store_history:
2648 if store_history:
2618 self.history_manager.store_inputs(self.execution_count,
2649 self.history_manager.store_inputs(self.execution_count,
2619 cell, raw_cell)
2650 cell, raw_cell)
2620 if not silent:
2651 if not silent:
2621 self.logger.log(cell, raw_cell)
2652 self.logger.log(cell, raw_cell)
2622
2653
2623 if not prefilter_failed:
2654 if not prefilter_failed:
2624 # don't run if prefilter failed
2655 # don't run if prefilter failed
2625 cell_name = self.compile.cache(cell, self.execution_count)
2656 cell_name = self.compile.cache(cell, self.execution_count)
2626
2657
2627 with self.display_trap:
2658 with self.display_trap:
2628 try:
2659 try:
2629 code_ast = compiler.ast_parse(cell, filename=cell_name)
2660 code_ast = compiler.ast_parse(cell, filename=cell_name)
2630 except IndentationError:
2661 except IndentationError:
2631 self.showindentationerror()
2662 self.showindentationerror()
2632 if store_history:
2663 if store_history:
2633 self.execution_count += 1
2664 self.execution_count += 1
2634 return None
2665 return None
2635 except (OverflowError, SyntaxError, ValueError, TypeError,
2666 except (OverflowError, SyntaxError, ValueError, TypeError,
2636 MemoryError):
2667 MemoryError):
2637 self.showsyntaxerror()
2668 self.showsyntaxerror()
2638 if store_history:
2669 if store_history:
2639 self.execution_count += 1
2670 self.execution_count += 1
2640 return None
2671 return None
2641
2672
2642 code_ast = self.transform_ast(code_ast)
2673 code_ast = self.transform_ast(code_ast)
2643
2674
2644 interactivity = "none" if silent else self.ast_node_interactivity
2675 interactivity = "none" if silent else self.ast_node_interactivity
2645 self.run_ast_nodes(code_ast.body, cell_name,
2676 self.run_ast_nodes(code_ast.body, cell_name,
2646 interactivity=interactivity, compiler=compiler)
2677 interactivity=interactivity, compiler=compiler)
2647
2678
2648 # Execute any registered post-execution functions.
2679 # Execute any registered post-execution functions.
2649 # unless we are silent
2680 # unless we are silent
2650 post_exec = [] if silent else self._post_execute.iteritems()
2681 post_exec = [] if silent else self._post_execute.iteritems()
2651
2682
2652 for func, status in post_exec:
2683 for func, status in post_exec:
2653 if self.disable_failing_post_execute and not status:
2684 if self.disable_failing_post_execute and not status:
2654 continue
2685 continue
2655 try:
2686 try:
2656 func()
2687 func()
2657 except KeyboardInterrupt:
2688 except KeyboardInterrupt:
2658 print("\nKeyboardInterrupt", file=io.stderr)
2689 print("\nKeyboardInterrupt", file=io.stderr)
2659 except Exception:
2690 except Exception:
2660 # register as failing:
2691 # register as failing:
2661 self._post_execute[func] = False
2692 self._post_execute[func] = False
2662 self.showtraceback()
2693 self.showtraceback()
2663 print('\n'.join([
2694 print('\n'.join([
2664 "post-execution function %r produced an error." % func,
2695 "post-execution function %r produced an error." % func,
2665 "If this problem persists, you can disable failing post-exec functions with:",
2696 "If this problem persists, you can disable failing post-exec functions with:",
2666 "",
2697 "",
2667 " get_ipython().disable_failing_post_execute = True"
2698 " get_ipython().disable_failing_post_execute = True"
2668 ]), file=io.stderr)
2699 ]), file=io.stderr)
2669
2700
2670 if store_history:
2701 if store_history:
2671 # Write output to the database. Does nothing unless
2702 # Write output to the database. Does nothing unless
2672 # history output logging is enabled.
2703 # history output logging is enabled.
2673 self.history_manager.store_output(self.execution_count)
2704 self.history_manager.store_output(self.execution_count)
2674 # Each cell is a *single* input, regardless of how many lines it has
2705 # Each cell is a *single* input, regardless of how many lines it has
2675 self.execution_count += 1
2706 self.execution_count += 1
2676
2707
2677 def transform_ast(self, node):
2708 def transform_ast(self, node):
2678 """Apply the AST transformations from self.ast_transformers
2709 """Apply the AST transformations from self.ast_transformers
2679
2710
2680 Parameters
2711 Parameters
2681 ----------
2712 ----------
2682 node : ast.Node
2713 node : ast.Node
2683 The root node to be transformed. Typically called with the ast.Module
2714 The root node to be transformed. Typically called with the ast.Module
2684 produced by parsing user input.
2715 produced by parsing user input.
2685
2716
2686 Returns
2717 Returns
2687 -------
2718 -------
2688 An ast.Node corresponding to the node it was called with. Note that it
2719 An ast.Node corresponding to the node it was called with. Note that it
2689 may also modify the passed object, so don't rely on references to the
2720 may also modify the passed object, so don't rely on references to the
2690 original AST.
2721 original AST.
2691 """
2722 """
2692 for transformer in self.ast_transformers:
2723 for transformer in self.ast_transformers:
2693 try:
2724 try:
2694 node = transformer.visit(node)
2725 node = transformer.visit(node)
2695 except Exception:
2726 except Exception:
2696 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2727 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2697 self.ast_transformers.remove(transformer)
2728 self.ast_transformers.remove(transformer)
2698
2729
2699 if self.ast_transformers:
2730 if self.ast_transformers:
2700 ast.fix_missing_locations(node)
2731 ast.fix_missing_locations(node)
2701 return node
2732 return node
2702
2733
2703
2734
2704 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2735 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2705 compiler=compile):
2736 compiler=compile):
2706 """Run a sequence of AST nodes. The execution mode depends on the
2737 """Run a sequence of AST nodes. The execution mode depends on the
2707 interactivity parameter.
2738 interactivity parameter.
2708
2739
2709 Parameters
2740 Parameters
2710 ----------
2741 ----------
2711 nodelist : list
2742 nodelist : list
2712 A sequence of AST nodes to run.
2743 A sequence of AST nodes to run.
2713 cell_name : str
2744 cell_name : str
2714 Will be passed to the compiler as the filename of the cell. Typically
2745 Will be passed to the compiler as the filename of the cell. Typically
2715 the value returned by ip.compile.cache(cell).
2746 the value returned by ip.compile.cache(cell).
2716 interactivity : str
2747 interactivity : str
2717 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2748 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2718 run interactively (displaying output from expressions). 'last_expr'
2749 run interactively (displaying output from expressions). 'last_expr'
2719 will run the last node interactively only if it is an expression (i.e.
2750 will run the last node interactively only if it is an expression (i.e.
2720 expressions in loops or other blocks are not displayed. Other values
2751 expressions in loops or other blocks are not displayed. Other values
2721 for this parameter will raise a ValueError.
2752 for this parameter will raise a ValueError.
2722 compiler : callable
2753 compiler : callable
2723 A function with the same interface as the built-in compile(), to turn
2754 A function with the same interface as the built-in compile(), to turn
2724 the AST nodes into code objects. Default is the built-in compile().
2755 the AST nodes into code objects. Default is the built-in compile().
2725 """
2756 """
2726 if not nodelist:
2757 if not nodelist:
2727 return
2758 return
2728
2759
2729 if interactivity == 'last_expr':
2760 if interactivity == 'last_expr':
2730 if isinstance(nodelist[-1], ast.Expr):
2761 if isinstance(nodelist[-1], ast.Expr):
2731 interactivity = "last"
2762 interactivity = "last"
2732 else:
2763 else:
2733 interactivity = "none"
2764 interactivity = "none"
2734
2765
2735 if interactivity == 'none':
2766 if interactivity == 'none':
2736 to_run_exec, to_run_interactive = nodelist, []
2767 to_run_exec, to_run_interactive = nodelist, []
2737 elif interactivity == 'last':
2768 elif interactivity == 'last':
2738 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2769 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2739 elif interactivity == 'all':
2770 elif interactivity == 'all':
2740 to_run_exec, to_run_interactive = [], nodelist
2771 to_run_exec, to_run_interactive = [], nodelist
2741 else:
2772 else:
2742 raise ValueError("Interactivity was %r" % interactivity)
2773 raise ValueError("Interactivity was %r" % interactivity)
2743
2774
2744 exec_count = self.execution_count
2775 exec_count = self.execution_count
2745
2776
2746 try:
2777 try:
2747 for i, node in enumerate(to_run_exec):
2778 for i, node in enumerate(to_run_exec):
2748 mod = ast.Module([node])
2779 mod = ast.Module([node])
2749 code = compiler(mod, cell_name, "exec")
2780 code = compiler(mod, cell_name, "exec")
2750 if self.run_code(code):
2781 if self.run_code(code):
2751 return True
2782 return True
2752
2783
2753 for i, node in enumerate(to_run_interactive):
2784 for i, node in enumerate(to_run_interactive):
2754 mod = ast.Interactive([node])
2785 mod = ast.Interactive([node])
2755 code = compiler(mod, cell_name, "single")
2786 code = compiler(mod, cell_name, "single")
2756 if self.run_code(code):
2787 if self.run_code(code):
2757 return True
2788 return True
2758
2789
2759 # Flush softspace
2790 # Flush softspace
2760 if softspace(sys.stdout, 0):
2791 if softspace(sys.stdout, 0):
2761 print()
2792 print()
2762
2793
2763 except:
2794 except:
2764 # It's possible to have exceptions raised here, typically by
2795 # It's possible to have exceptions raised here, typically by
2765 # compilation of odd code (such as a naked 'return' outside a
2796 # compilation of odd code (such as a naked 'return' outside a
2766 # function) that did parse but isn't valid. Typically the exception
2797 # function) that did parse but isn't valid. Typically the exception
2767 # is a SyntaxError, but it's safest just to catch anything and show
2798 # is a SyntaxError, but it's safest just to catch anything and show
2768 # the user a traceback.
2799 # the user a traceback.
2769
2800
2770 # We do only one try/except outside the loop to minimize the impact
2801 # We do only one try/except outside the loop to minimize the impact
2771 # on runtime, and also because if any node in the node list is
2802 # on runtime, and also because if any node in the node list is
2772 # broken, we should stop execution completely.
2803 # broken, we should stop execution completely.
2773 self.showtraceback()
2804 self.showtraceback()
2774
2805
2775 return False
2806 return False
2776
2807
2777 def run_code(self, code_obj):
2808 def run_code(self, code_obj):
2778 """Execute a code object.
2809 """Execute a code object.
2779
2810
2780 When an exception occurs, self.showtraceback() is called to display a
2811 When an exception occurs, self.showtraceback() is called to display a
2781 traceback.
2812 traceback.
2782
2813
2783 Parameters
2814 Parameters
2784 ----------
2815 ----------
2785 code_obj : code object
2816 code_obj : code object
2786 A compiled code object, to be executed
2817 A compiled code object, to be executed
2787
2818
2788 Returns
2819 Returns
2789 -------
2820 -------
2790 False : successful execution.
2821 False : successful execution.
2791 True : an error occurred.
2822 True : an error occurred.
2792 """
2823 """
2793
2824
2794 # Set our own excepthook in case the user code tries to call it
2825 # Set our own excepthook in case the user code tries to call it
2795 # directly, so that the IPython crash handler doesn't get triggered
2826 # directly, so that the IPython crash handler doesn't get triggered
2796 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2827 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2797
2828
2798 # we save the original sys.excepthook in the instance, in case config
2829 # we save the original sys.excepthook in the instance, in case config
2799 # code (such as magics) needs access to it.
2830 # code (such as magics) needs access to it.
2800 self.sys_excepthook = old_excepthook
2831 self.sys_excepthook = old_excepthook
2801 outflag = 1 # happens in more places, so it's easier as default
2832 outflag = 1 # happens in more places, so it's easier as default
2802 try:
2833 try:
2803 try:
2834 try:
2804 self.hooks.pre_run_code_hook()
2835 self.hooks.pre_run_code_hook()
2805 #rprint('Running code', repr(code_obj)) # dbg
2836 #rprint('Running code', repr(code_obj)) # dbg
2806 exec code_obj in self.user_global_ns, self.user_ns
2837 exec code_obj in self.user_global_ns, self.user_ns
2807 finally:
2838 finally:
2808 # Reset our crash handler in place
2839 # Reset our crash handler in place
2809 sys.excepthook = old_excepthook
2840 sys.excepthook = old_excepthook
2810 except SystemExit:
2841 except SystemExit:
2811 self.showtraceback(exception_only=True)
2842 self.showtraceback(exception_only=True)
2812 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2843 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2813 except self.custom_exceptions:
2844 except self.custom_exceptions:
2814 etype,value,tb = sys.exc_info()
2845 etype,value,tb = sys.exc_info()
2815 self.CustomTB(etype,value,tb)
2846 self.CustomTB(etype,value,tb)
2816 except:
2847 except:
2817 self.showtraceback()
2848 self.showtraceback()
2818 else:
2849 else:
2819 outflag = 0
2850 outflag = 0
2820 return outflag
2851 return outflag
2821
2852
2822 # For backwards compatibility
2853 # For backwards compatibility
2823 runcode = run_code
2854 runcode = run_code
2824
2855
2825 #-------------------------------------------------------------------------
2856 #-------------------------------------------------------------------------
2826 # Things related to GUI support and pylab
2857 # Things related to GUI support and pylab
2827 #-------------------------------------------------------------------------
2858 #-------------------------------------------------------------------------
2828
2859
2829 def enable_gui(self, gui=None):
2860 def enable_gui(self, gui=None):
2830 raise NotImplementedError('Implement enable_gui in a subclass')
2861 raise NotImplementedError('Implement enable_gui in a subclass')
2831
2862
2832 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2863 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
2833 """Activate pylab support at runtime.
2864 """Activate pylab support at runtime.
2834
2865
2835 This turns on support for matplotlib, preloads into the interactive
2866 This turns on support for matplotlib, preloads into the interactive
2836 namespace all of numpy and pylab, and configures IPython to correctly
2867 namespace all of numpy and pylab, and configures IPython to correctly
2837 interact with the GUI event loop. The GUI backend to be used can be
2868 interact with the GUI event loop. The GUI backend to be used can be
2838 optionally selected with the optional ``gui`` argument.
2869 optionally selected with the optional ``gui`` argument.
2839
2870
2840 Parameters
2871 Parameters
2841 ----------
2872 ----------
2842 gui : optional, string
2873 gui : optional, string
2843 If given, dictates the choice of matplotlib GUI backend to use
2874 If given, dictates the choice of matplotlib GUI backend to use
2844 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2875 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
2845 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2876 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
2846 matplotlib (as dictated by the matplotlib build-time options plus the
2877 matplotlib (as dictated by the matplotlib build-time options plus the
2847 user's matplotlibrc configuration file). Note that not all backends
2878 user's matplotlibrc configuration file). Note that not all backends
2848 make sense in all contexts, for example a terminal ipython can't
2879 make sense in all contexts, for example a terminal ipython can't
2849 display figures inline.
2880 display figures inline.
2850 """
2881 """
2851 from IPython.core.pylabtools import mpl_runner
2882 from IPython.core.pylabtools import mpl_runner
2852 # We want to prevent the loading of pylab to pollute the user's
2883 # We want to prevent the loading of pylab to pollute the user's
2853 # namespace as shown by the %who* magics, so we execute the activation
2884 # namespace as shown by the %who* magics, so we execute the activation
2854 # code in an empty namespace, and we update *both* user_ns and
2885 # code in an empty namespace, and we update *both* user_ns and
2855 # user_ns_hidden with this information.
2886 # user_ns_hidden with this information.
2856 ns = {}
2887 ns = {}
2857 try:
2888 try:
2858 gui = pylab_activate(ns, gui, import_all, self, welcome_message=welcome_message)
2889 gui = pylab_activate(ns, gui, import_all, self, welcome_message=welcome_message)
2859 except KeyError:
2890 except KeyError:
2860 error("Backend %r not supported" % gui)
2891 error("Backend %r not supported" % gui)
2861 return
2892 return
2862 except ImportError:
2893 except ImportError:
2863 error("pylab mode doesn't work as matplotlib could not be found." + \
2894 error("pylab mode doesn't work as matplotlib could not be found." + \
2864 "\nIs it installed on the system?")
2895 "\nIs it installed on the system?")
2865 return
2896 return
2866 self.user_ns.update(ns)
2897 self.user_ns.update(ns)
2867 self.user_ns_hidden.update(ns)
2898 self.user_ns_hidden.update(ns)
2868 # Now we must activate the gui pylab wants to use, and fix %run to take
2899 # Now we must activate the gui pylab wants to use, and fix %run to take
2869 # plot updates into account
2900 # plot updates into account
2870 self.enable_gui(gui)
2901 self.enable_gui(gui)
2871 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2902 self.magics_manager.registry['ExecutionMagics'].default_runner = \
2872 mpl_runner(self.safe_execfile)
2903 mpl_runner(self.safe_execfile)
2873
2904
2874 #-------------------------------------------------------------------------
2905 #-------------------------------------------------------------------------
2875 # Utilities
2906 # Utilities
2876 #-------------------------------------------------------------------------
2907 #-------------------------------------------------------------------------
2877
2908
2878 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2909 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
2879 """Expand python variables in a string.
2910 """Expand python variables in a string.
2880
2911
2881 The depth argument indicates how many frames above the caller should
2912 The depth argument indicates how many frames above the caller should
2882 be walked to look for the local namespace where to expand variables.
2913 be walked to look for the local namespace where to expand variables.
2883
2914
2884 The global namespace for expansion is always the user's interactive
2915 The global namespace for expansion is always the user's interactive
2885 namespace.
2916 namespace.
2886 """
2917 """
2887 ns = self.user_ns.copy()
2918 ns = self.user_ns.copy()
2888 ns.update(sys._getframe(depth+1).f_locals)
2919 ns.update(sys._getframe(depth+1).f_locals)
2889 try:
2920 try:
2890 # We have to use .vformat() here, because 'self' is a valid and common
2921 # We have to use .vformat() here, because 'self' is a valid and common
2891 # name, and expanding **ns for .format() would make it collide with
2922 # name, and expanding **ns for .format() would make it collide with
2892 # the 'self' argument of the method.
2923 # the 'self' argument of the method.
2893 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
2924 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
2894 except Exception:
2925 except Exception:
2895 # if formatter couldn't format, just let it go untransformed
2926 # if formatter couldn't format, just let it go untransformed
2896 pass
2927 pass
2897 return cmd
2928 return cmd
2898
2929
2899 def mktempfile(self, data=None, prefix='ipython_edit_'):
2930 def mktempfile(self, data=None, prefix='ipython_edit_'):
2900 """Make a new tempfile and return its filename.
2931 """Make a new tempfile and return its filename.
2901
2932
2902 This makes a call to tempfile.mktemp, but it registers the created
2933 This makes a call to tempfile.mktemp, but it registers the created
2903 filename internally so ipython cleans it up at exit time.
2934 filename internally so ipython cleans it up at exit time.
2904
2935
2905 Optional inputs:
2936 Optional inputs:
2906
2937
2907 - data(None): if data is given, it gets written out to the temp file
2938 - data(None): if data is given, it gets written out to the temp file
2908 immediately, and the file is closed again."""
2939 immediately, and the file is closed again."""
2909
2940
2910 filename = tempfile.mktemp('.py', prefix)
2941 filename = tempfile.mktemp('.py', prefix)
2911 self.tempfiles.append(filename)
2942 self.tempfiles.append(filename)
2912
2943
2913 if data:
2944 if data:
2914 tmp_file = open(filename,'w')
2945 tmp_file = open(filename,'w')
2915 tmp_file.write(data)
2946 tmp_file.write(data)
2916 tmp_file.close()
2947 tmp_file.close()
2917 return filename
2948 return filename
2918
2949
2919 # TODO: This should be removed when Term is refactored.
2950 # TODO: This should be removed when Term is refactored.
2920 def write(self,data):
2951 def write(self,data):
2921 """Write a string to the default output"""
2952 """Write a string to the default output"""
2922 io.stdout.write(data)
2953 io.stdout.write(data)
2923
2954
2924 # TODO: This should be removed when Term is refactored.
2955 # TODO: This should be removed when Term is refactored.
2925 def write_err(self,data):
2956 def write_err(self,data):
2926 """Write a string to the default error output"""
2957 """Write a string to the default error output"""
2927 io.stderr.write(data)
2958 io.stderr.write(data)
2928
2959
2929 def ask_yes_no(self, prompt, default=None):
2960 def ask_yes_no(self, prompt, default=None):
2930 if self.quiet:
2961 if self.quiet:
2931 return True
2962 return True
2932 return ask_yes_no(prompt,default)
2963 return ask_yes_no(prompt,default)
2933
2964
2934 def show_usage(self):
2965 def show_usage(self):
2935 """Show a usage message"""
2966 """Show a usage message"""
2936 page.page(IPython.core.usage.interactive_usage)
2967 page.page(IPython.core.usage.interactive_usage)
2937
2968
2938 def extract_input_lines(self, range_str, raw=False):
2969 def extract_input_lines(self, range_str, raw=False):
2939 """Return as a string a set of input history slices.
2970 """Return as a string a set of input history slices.
2940
2971
2941 Parameters
2972 Parameters
2942 ----------
2973 ----------
2943 range_str : string
2974 range_str : string
2944 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
2975 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
2945 since this function is for use by magic functions which get their
2976 since this function is for use by magic functions which get their
2946 arguments as strings. The number before the / is the session
2977 arguments as strings. The number before the / is the session
2947 number: ~n goes n back from the current session.
2978 number: ~n goes n back from the current session.
2948
2979
2949 Optional Parameters:
2980 Optional Parameters:
2950 - raw(False): by default, the processed input is used. If this is
2981 - raw(False): by default, the processed input is used. If this is
2951 true, the raw input history is used instead.
2982 true, the raw input history is used instead.
2952
2983
2953 Note that slices can be called with two notations:
2984 Note that slices can be called with two notations:
2954
2985
2955 N:M -> standard python form, means including items N...(M-1).
2986 N:M -> standard python form, means including items N...(M-1).
2956
2987
2957 N-M -> include items N..M (closed endpoint)."""
2988 N-M -> include items N..M (closed endpoint)."""
2958 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
2989 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
2959 return "\n".join(x for _, _, x in lines)
2990 return "\n".join(x for _, _, x in lines)
2960
2991
2961 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
2992 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True):
2962 """Get a code string from history, file, url, or a string or macro.
2993 """Get a code string from history, file, url, or a string or macro.
2963
2994
2964 This is mainly used by magic functions.
2995 This is mainly used by magic functions.
2965
2996
2966 Parameters
2997 Parameters
2967 ----------
2998 ----------
2968
2999
2969 target : str
3000 target : str
2970
3001
2971 A string specifying code to retrieve. This will be tried respectively
3002 A string specifying code to retrieve. This will be tried respectively
2972 as: ranges of input history (see %history for syntax), url,
3003 as: ranges of input history (see %history for syntax), url,
2973 correspnding .py file, filename, or an expression evaluating to a
3004 correspnding .py file, filename, or an expression evaluating to a
2974 string or Macro in the user namespace.
3005 string or Macro in the user namespace.
2975
3006
2976 raw : bool
3007 raw : bool
2977 If true (default), retrieve raw history. Has no effect on the other
3008 If true (default), retrieve raw history. Has no effect on the other
2978 retrieval mechanisms.
3009 retrieval mechanisms.
2979
3010
2980 py_only : bool (default False)
3011 py_only : bool (default False)
2981 Only try to fetch python code, do not try alternative methods to decode file
3012 Only try to fetch python code, do not try alternative methods to decode file
2982 if unicode fails.
3013 if unicode fails.
2983
3014
2984 Returns
3015 Returns
2985 -------
3016 -------
2986 A string of code.
3017 A string of code.
2987
3018
2988 ValueError is raised if nothing is found, and TypeError if it evaluates
3019 ValueError is raised if nothing is found, and TypeError if it evaluates
2989 to an object of another type. In each case, .args[0] is a printable
3020 to an object of another type. In each case, .args[0] is a printable
2990 message.
3021 message.
2991 """
3022 """
2992 code = self.extract_input_lines(target, raw=raw) # Grab history
3023 code = self.extract_input_lines(target, raw=raw) # Grab history
2993 if code:
3024 if code:
2994 return code
3025 return code
2995 utarget = unquote_filename(target)
3026 utarget = unquote_filename(target)
2996 try:
3027 try:
2997 if utarget.startswith(('http://', 'https://')):
3028 if utarget.startswith(('http://', 'https://')):
2998 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3029 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
2999 except UnicodeDecodeError:
3030 except UnicodeDecodeError:
3000 if not py_only :
3031 if not py_only :
3001 from urllib import urlopen # Deferred import
3032 from urllib import urlopen # Deferred import
3002 response = urlopen(target)
3033 response = urlopen(target)
3003 return response.read().decode('latin1')
3034 return response.read().decode('latin1')
3004 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3035 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3005
3036
3006 potential_target = [target]
3037 potential_target = [target]
3007 try :
3038 try :
3008 potential_target.insert(0,get_py_filename(target))
3039 potential_target.insert(0,get_py_filename(target))
3009 except IOError:
3040 except IOError:
3010 pass
3041 pass
3011
3042
3012 for tgt in potential_target :
3043 for tgt in potential_target :
3013 if os.path.isfile(tgt): # Read file
3044 if os.path.isfile(tgt): # Read file
3014 try :
3045 try :
3015 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3046 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3016 except UnicodeDecodeError :
3047 except UnicodeDecodeError :
3017 if not py_only :
3048 if not py_only :
3018 with io_open(tgt,'r', encoding='latin1') as f :
3049 with io_open(tgt,'r', encoding='latin1') as f :
3019 return f.read()
3050 return f.read()
3020 raise ValueError(("'%s' seem to be unreadable.") % target)
3051 raise ValueError(("'%s' seem to be unreadable.") % target)
3021 elif os.path.isdir(os.path.expanduser(tgt)):
3052 elif os.path.isdir(os.path.expanduser(tgt)):
3022 raise ValueError("'%s' is a directory, not a regular file." % target)
3053 raise ValueError("'%s' is a directory, not a regular file." % target)
3023
3054
3024 try: # User namespace
3055 try: # User namespace
3025 codeobj = eval(target, self.user_ns)
3056 codeobj = eval(target, self.user_ns)
3026 except Exception:
3057 except Exception:
3027 raise ValueError(("'%s' was not found in history, as a file, url, "
3058 raise ValueError(("'%s' was not found in history, as a file, url, "
3028 "nor in the user namespace.") % target)
3059 "nor in the user namespace.") % target)
3029 if isinstance(codeobj, basestring):
3060 if isinstance(codeobj, basestring):
3030 return codeobj
3061 return codeobj
3031 elif isinstance(codeobj, Macro):
3062 elif isinstance(codeobj, Macro):
3032 return codeobj.value
3063 return codeobj.value
3033
3064
3034 raise TypeError("%s is neither a string nor a macro." % target,
3065 raise TypeError("%s is neither a string nor a macro." % target,
3035 codeobj)
3066 codeobj)
3036
3067
3037 #-------------------------------------------------------------------------
3068 #-------------------------------------------------------------------------
3038 # Things related to IPython exiting
3069 # Things related to IPython exiting
3039 #-------------------------------------------------------------------------
3070 #-------------------------------------------------------------------------
3040 def atexit_operations(self):
3071 def atexit_operations(self):
3041 """This will be executed at the time of exit.
3072 """This will be executed at the time of exit.
3042
3073
3043 Cleanup operations and saving of persistent data that is done
3074 Cleanup operations and saving of persistent data that is done
3044 unconditionally by IPython should be performed here.
3075 unconditionally by IPython should be performed here.
3045
3076
3046 For things that may depend on startup flags or platform specifics (such
3077 For things that may depend on startup flags or platform specifics (such
3047 as having readline or not), register a separate atexit function in the
3078 as having readline or not), register a separate atexit function in the
3048 code that has the appropriate information, rather than trying to
3079 code that has the appropriate information, rather than trying to
3049 clutter
3080 clutter
3050 """
3081 """
3051 # Close the history session (this stores the end time and line count)
3082 # Close the history session (this stores the end time and line count)
3052 # this must be *before* the tempfile cleanup, in case of temporary
3083 # this must be *before* the tempfile cleanup, in case of temporary
3053 # history db
3084 # history db
3054 self.history_manager.end_session()
3085 self.history_manager.end_session()
3055
3086
3056 # Cleanup all tempfiles left around
3087 # Cleanup all tempfiles left around
3057 for tfile in self.tempfiles:
3088 for tfile in self.tempfiles:
3058 try:
3089 try:
3059 os.unlink(tfile)
3090 os.unlink(tfile)
3060 except OSError:
3091 except OSError:
3061 pass
3092 pass
3062
3093
3063 # Clear all user namespaces to release all references cleanly.
3094 # Clear all user namespaces to release all references cleanly.
3064 self.reset(new_session=False)
3095 self.reset(new_session=False)
3065
3096
3066 # Run user hooks
3097 # Run user hooks
3067 self.hooks.shutdown_hook()
3098 self.hooks.shutdown_hook()
3068
3099
3069 def cleanup(self):
3100 def cleanup(self):
3070 self.restore_sys_module_state()
3101 self.restore_sys_module_state()
3071
3102
3072
3103
3073 class InteractiveShellABC(object):
3104 class InteractiveShellABC(object):
3074 """An abstract base class for InteractiveShell."""
3105 """An abstract base class for InteractiveShell."""
3075 __metaclass__ = abc.ABCMeta
3106 __metaclass__ = abc.ABCMeta
3076
3107
3077 InteractiveShellABC.register(InteractiveShell)
3108 InteractiveShellABC.register(InteractiveShell)
@@ -1,686 +1,677 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3 """
3 """
4
4
5 #-----------------------------------------------------------------------------
5 #-----------------------------------------------------------------------------
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
6 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Fernando Perez <fperez@colorado.edu>
7 # Copyright (C) 2001 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2008 The IPython Development Team
8 # Copyright (C) 2008 The IPython Development Team
9
9
10 # Distributed under the terms of the BSD License. The full license is in
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
11 # the file COPYING, distributed as part of this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17 # Stdlib
17 # Stdlib
18 import json
18 import os
19 import os
19 import re
20 import re
20 import sys
21 import sys
21 import types
22 import types
22 from getopt import getopt, GetoptError
23 from getopt import getopt, GetoptError
23
24
24 # Our own
25 # Our own
25 from IPython.config.configurable import Configurable
26 from IPython.config.configurable import Configurable
26 from IPython.core import oinspect
27 from IPython.core import oinspect
27 from IPython.core.error import UsageError
28 from IPython.core.error import UsageError
28 from IPython.core.inputsplitter import ESC_MAGIC, ESC_MAGIC2
29 from IPython.core.inputsplitter import ESC_MAGIC, ESC_MAGIC2
29 from IPython.external.decorator import decorator
30 from IPython.external.decorator import decorator
30 from IPython.utils.ipstruct import Struct
31 from IPython.utils.ipstruct import Struct
31 from IPython.utils.process import arg_split
32 from IPython.utils.process import arg_split
32 from IPython.utils.text import dedent
33 from IPython.utils.text import dedent
33 from IPython.utils.traitlets import Bool, Dict, Instance, MetaHasTraits
34 from IPython.utils.traitlets import Bool, Dict, Instance, MetaHasTraits
34 from IPython.utils.warn import error
35 from IPython.utils.warn import error
35
36
36 #-----------------------------------------------------------------------------
37 #-----------------------------------------------------------------------------
37 # Globals
38 # Globals
38 #-----------------------------------------------------------------------------
39 #-----------------------------------------------------------------------------
39
40
40 # A dict we'll use for each class that has magics, used as temporary storage to
41 # A dict we'll use for each class that has magics, used as temporary storage to
41 # pass information between the @line/cell_magic method decorators and the
42 # pass information between the @line/cell_magic method decorators and the
42 # @magics_class class decorator, because the method decorators have no
43 # @magics_class class decorator, because the method decorators have no
43 # access to the class when they run. See for more details:
44 # access to the class when they run. See for more details:
44 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
45 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
45
46
46 magics = dict(line={}, cell={})
47 magics = dict(line={}, cell={})
47
48
48 magic_kinds = ('line', 'cell')
49 magic_kinds = ('line', 'cell')
49 magic_spec = ('line', 'cell', 'line_cell')
50 magic_spec = ('line', 'cell', 'line_cell')
50 magic_escapes = dict(line=ESC_MAGIC, cell=ESC_MAGIC2)
51 magic_escapes = dict(line=ESC_MAGIC, cell=ESC_MAGIC2)
51
52
52 #-----------------------------------------------------------------------------
53 #-----------------------------------------------------------------------------
53 # Utility classes and functions
54 # Utility classes and functions
54 #-----------------------------------------------------------------------------
55 #-----------------------------------------------------------------------------
55
56
56 class Bunch: pass
57 class Bunch: pass
57
58
58
59
59 def on_off(tag):
60 def on_off(tag):
60 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
61 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
61 return ['OFF','ON'][tag]
62 return ['OFF','ON'][tag]
62
63
63
64
64 def compress_dhist(dh):
65 def compress_dhist(dh):
65 """Compress a directory history into a new one with at most 20 entries.
66 """Compress a directory history into a new one with at most 20 entries.
66
67
67 Return a new list made from the first and last 10 elements of dhist after
68 Return a new list made from the first and last 10 elements of dhist after
68 removal of duplicates.
69 removal of duplicates.
69 """
70 """
70 head, tail = dh[:-10], dh[-10:]
71 head, tail = dh[:-10], dh[-10:]
71
72
72 newhead = []
73 newhead = []
73 done = set()
74 done = set()
74 for h in head:
75 for h in head:
75 if h in done:
76 if h in done:
76 continue
77 continue
77 newhead.append(h)
78 newhead.append(h)
78 done.add(h)
79 done.add(h)
79
80
80 return newhead + tail
81 return newhead + tail
81
82
82
83
83 def needs_local_scope(func):
84 def needs_local_scope(func):
84 """Decorator to mark magic functions which need to local scope to run."""
85 """Decorator to mark magic functions which need to local scope to run."""
85 func.needs_local_scope = True
86 func.needs_local_scope = True
86 return func
87 return func
87
88
88 #-----------------------------------------------------------------------------
89 #-----------------------------------------------------------------------------
89 # Class and method decorators for registering magics
90 # Class and method decorators for registering magics
90 #-----------------------------------------------------------------------------
91 #-----------------------------------------------------------------------------
91
92
92 def magics_class(cls):
93 def magics_class(cls):
93 """Class decorator for all subclasses of the main Magics class.
94 """Class decorator for all subclasses of the main Magics class.
94
95
95 Any class that subclasses Magics *must* also apply this decorator, to
96 Any class that subclasses Magics *must* also apply this decorator, to
96 ensure that all the methods that have been decorated as line/cell magics
97 ensure that all the methods that have been decorated as line/cell magics
97 get correctly registered in the class instance. This is necessary because
98 get correctly registered in the class instance. This is necessary because
98 when method decorators run, the class does not exist yet, so they
99 when method decorators run, the class does not exist yet, so they
99 temporarily store their information into a module global. Application of
100 temporarily store their information into a module global. Application of
100 this class decorator copies that global data to the class instance and
101 this class decorator copies that global data to the class instance and
101 clears the global.
102 clears the global.
102
103
103 Obviously, this mechanism is not thread-safe, which means that the
104 Obviously, this mechanism is not thread-safe, which means that the
104 *creation* of subclasses of Magic should only be done in a single-thread
105 *creation* of subclasses of Magic should only be done in a single-thread
105 context. Instantiation of the classes has no restrictions. Given that
106 context. Instantiation of the classes has no restrictions. Given that
106 these classes are typically created at IPython startup time and before user
107 these classes are typically created at IPython startup time and before user
107 application code becomes active, in practice this should not pose any
108 application code becomes active, in practice this should not pose any
108 problems.
109 problems.
109 """
110 """
110 cls.registered = True
111 cls.registered = True
111 cls.magics = dict(line = magics['line'],
112 cls.magics = dict(line = magics['line'],
112 cell = magics['cell'])
113 cell = magics['cell'])
113 magics['line'] = {}
114 magics['line'] = {}
114 magics['cell'] = {}
115 magics['cell'] = {}
115 return cls
116 return cls
116
117
117
118
118 def record_magic(dct, magic_kind, magic_name, func):
119 def record_magic(dct, magic_kind, magic_name, func):
119 """Utility function to store a function as a magic of a specific kind.
120 """Utility function to store a function as a magic of a specific kind.
120
121
121 Parameters
122 Parameters
122 ----------
123 ----------
123 dct : dict
124 dct : dict
124 A dictionary with 'line' and 'cell' subdicts.
125 A dictionary with 'line' and 'cell' subdicts.
125
126
126 magic_kind : str
127 magic_kind : str
127 Kind of magic to be stored.
128 Kind of magic to be stored.
128
129
129 magic_name : str
130 magic_name : str
130 Key to store the magic as.
131 Key to store the magic as.
131
132
132 func : function
133 func : function
133 Callable object to store.
134 Callable object to store.
134 """
135 """
135 if magic_kind == 'line_cell':
136 if magic_kind == 'line_cell':
136 dct['line'][magic_name] = dct['cell'][magic_name] = func
137 dct['line'][magic_name] = dct['cell'][magic_name] = func
137 else:
138 else:
138 dct[magic_kind][magic_name] = func
139 dct[magic_kind][magic_name] = func
139
140
140
141
141 def validate_type(magic_kind):
142 def validate_type(magic_kind):
142 """Ensure that the given magic_kind is valid.
143 """Ensure that the given magic_kind is valid.
143
144
144 Check that the given magic_kind is one of the accepted spec types (stored
145 Check that the given magic_kind is one of the accepted spec types (stored
145 in the global `magic_spec`), raise ValueError otherwise.
146 in the global `magic_spec`), raise ValueError otherwise.
146 """
147 """
147 if magic_kind not in magic_spec:
148 if magic_kind not in magic_spec:
148 raise ValueError('magic_kind must be one of %s, %s given' %
149 raise ValueError('magic_kind must be one of %s, %s given' %
149 magic_kinds, magic_kind)
150 magic_kinds, magic_kind)
150
151
151
152
152 # The docstrings for the decorator below will be fairly similar for the two
153 # The docstrings for the decorator below will be fairly similar for the two
153 # types (method and function), so we generate them here once and reuse the
154 # types (method and function), so we generate them here once and reuse the
154 # templates below.
155 # templates below.
155 _docstring_template = \
156 _docstring_template = \
156 """Decorate the given {0} as {1} magic.
157 """Decorate the given {0} as {1} magic.
157
158
158 The decorator can be used with or without arguments, as follows.
159 The decorator can be used with or without arguments, as follows.
159
160
160 i) without arguments: it will create a {1} magic named as the {0} being
161 i) without arguments: it will create a {1} magic named as the {0} being
161 decorated::
162 decorated::
162
163
163 @deco
164 @deco
164 def foo(...)
165 def foo(...)
165
166
166 will create a {1} magic named `foo`.
167 will create a {1} magic named `foo`.
167
168
168 ii) with one string argument: which will be used as the actual name of the
169 ii) with one string argument: which will be used as the actual name of the
169 resulting magic::
170 resulting magic::
170
171
171 @deco('bar')
172 @deco('bar')
172 def foo(...)
173 def foo(...)
173
174
174 will create a {1} magic named `bar`.
175 will create a {1} magic named `bar`.
175 """
176 """
176
177
177 # These two are decorator factories. While they are conceptually very similar,
178 # These two are decorator factories. While they are conceptually very similar,
178 # there are enough differences in the details that it's simpler to have them
179 # there are enough differences in the details that it's simpler to have them
179 # written as completely standalone functions rather than trying to share code
180 # written as completely standalone functions rather than trying to share code
180 # and make a single one with convoluted logic.
181 # and make a single one with convoluted logic.
181
182
182 def _method_magic_marker(magic_kind):
183 def _method_magic_marker(magic_kind):
183 """Decorator factory for methods in Magics subclasses.
184 """Decorator factory for methods in Magics subclasses.
184 """
185 """
185
186
186 validate_type(magic_kind)
187 validate_type(magic_kind)
187
188
188 # This is a closure to capture the magic_kind. We could also use a class,
189 # This is a closure to capture the magic_kind. We could also use a class,
189 # but it's overkill for just that one bit of state.
190 # but it's overkill for just that one bit of state.
190 def magic_deco(arg):
191 def magic_deco(arg):
191 call = lambda f, *a, **k: f(*a, **k)
192 call = lambda f, *a, **k: f(*a, **k)
192
193
193 if callable(arg):
194 if callable(arg):
194 # "Naked" decorator call (just @foo, no args)
195 # "Naked" decorator call (just @foo, no args)
195 func = arg
196 func = arg
196 name = func.func_name
197 name = func.func_name
197 retval = decorator(call, func)
198 retval = decorator(call, func)
198 record_magic(magics, magic_kind, name, name)
199 record_magic(magics, magic_kind, name, name)
199 elif isinstance(arg, basestring):
200 elif isinstance(arg, basestring):
200 # Decorator called with arguments (@foo('bar'))
201 # Decorator called with arguments (@foo('bar'))
201 name = arg
202 name = arg
202 def mark(func, *a, **kw):
203 def mark(func, *a, **kw):
203 record_magic(magics, magic_kind, name, func.func_name)
204 record_magic(magics, magic_kind, name, func.func_name)
204 return decorator(call, func)
205 return decorator(call, func)
205 retval = mark
206 retval = mark
206 else:
207 else:
207 raise TypeError("Decorator can only be called with "
208 raise TypeError("Decorator can only be called with "
208 "string or function")
209 "string or function")
209 return retval
210 return retval
210
211
211 # Ensure the resulting decorator has a usable docstring
212 # Ensure the resulting decorator has a usable docstring
212 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
213 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
213 return magic_deco
214 return magic_deco
214
215
215
216
216 def _function_magic_marker(magic_kind):
217 def _function_magic_marker(magic_kind):
217 """Decorator factory for standalone functions.
218 """Decorator factory for standalone functions.
218 """
219 """
219 validate_type(magic_kind)
220 validate_type(magic_kind)
220
221
221 # This is a closure to capture the magic_kind. We could also use a class,
222 # This is a closure to capture the magic_kind. We could also use a class,
222 # but it's overkill for just that one bit of state.
223 # but it's overkill for just that one bit of state.
223 def magic_deco(arg):
224 def magic_deco(arg):
224 call = lambda f, *a, **k: f(*a, **k)
225 call = lambda f, *a, **k: f(*a, **k)
225
226
226 # Find get_ipython() in the caller's namespace
227 # Find get_ipython() in the caller's namespace
227 caller = sys._getframe(1)
228 caller = sys._getframe(1)
228 for ns in ['f_locals', 'f_globals', 'f_builtins']:
229 for ns in ['f_locals', 'f_globals', 'f_builtins']:
229 get_ipython = getattr(caller, ns).get('get_ipython')
230 get_ipython = getattr(caller, ns).get('get_ipython')
230 if get_ipython is not None:
231 if get_ipython is not None:
231 break
232 break
232 else:
233 else:
233 raise NameError('Decorator can only run in context where '
234 raise NameError('Decorator can only run in context where '
234 '`get_ipython` exists')
235 '`get_ipython` exists')
235
236
236 ip = get_ipython()
237 ip = get_ipython()
237
238
238 if callable(arg):
239 if callable(arg):
239 # "Naked" decorator call (just @foo, no args)
240 # "Naked" decorator call (just @foo, no args)
240 func = arg
241 func = arg
241 name = func.func_name
242 name = func.func_name
242 ip.register_magic_function(func, magic_kind, name)
243 ip.register_magic_function(func, magic_kind, name)
243 retval = decorator(call, func)
244 retval = decorator(call, func)
244 elif isinstance(arg, basestring):
245 elif isinstance(arg, basestring):
245 # Decorator called with arguments (@foo('bar'))
246 # Decorator called with arguments (@foo('bar'))
246 name = arg
247 name = arg
247 def mark(func, *a, **kw):
248 def mark(func, *a, **kw):
248 ip.register_magic_function(func, magic_kind, name)
249 ip.register_magic_function(func, magic_kind, name)
249 return decorator(call, func)
250 return decorator(call, func)
250 retval = mark
251 retval = mark
251 else:
252 else:
252 raise TypeError("Decorator can only be called with "
253 raise TypeError("Decorator can only be called with "
253 "string or function")
254 "string or function")
254 return retval
255 return retval
255
256
256 # Ensure the resulting decorator has a usable docstring
257 # Ensure the resulting decorator has a usable docstring
257 ds = _docstring_template.format('function', magic_kind)
258 ds = _docstring_template.format('function', magic_kind)
258
259
259 ds += dedent("""
260 ds += dedent("""
260 Note: this decorator can only be used in a context where IPython is already
261 Note: this decorator can only be used in a context where IPython is already
261 active, so that the `get_ipython()` call succeeds. You can therefore use
262 active, so that the `get_ipython()` call succeeds. You can therefore use
262 it in your startup files loaded after IPython initializes, but *not* in the
263 it in your startup files loaded after IPython initializes, but *not* in the
263 IPython configuration file itself, which is executed before IPython is
264 IPython configuration file itself, which is executed before IPython is
264 fully up and running. Any file located in the `startup` subdirectory of
265 fully up and running. Any file located in the `startup` subdirectory of
265 your configuration profile will be OK in this sense.
266 your configuration profile will be OK in this sense.
266 """)
267 """)
267
268
268 magic_deco.__doc__ = ds
269 magic_deco.__doc__ = ds
269 return magic_deco
270 return magic_deco
270
271
271
272
272 # Create the actual decorators for public use
273 # Create the actual decorators for public use
273
274
274 # These three are used to decorate methods in class definitions
275 # These three are used to decorate methods in class definitions
275 line_magic = _method_magic_marker('line')
276 line_magic = _method_magic_marker('line')
276 cell_magic = _method_magic_marker('cell')
277 cell_magic = _method_magic_marker('cell')
277 line_cell_magic = _method_magic_marker('line_cell')
278 line_cell_magic = _method_magic_marker('line_cell')
278
279
279 # These three decorate standalone functions and perform the decoration
280 # These three decorate standalone functions and perform the decoration
280 # immediately. They can only run where get_ipython() works
281 # immediately. They can only run where get_ipython() works
281 register_line_magic = _function_magic_marker('line')
282 register_line_magic = _function_magic_marker('line')
282 register_cell_magic = _function_magic_marker('cell')
283 register_cell_magic = _function_magic_marker('cell')
283 register_line_cell_magic = _function_magic_marker('line_cell')
284 register_line_cell_magic = _function_magic_marker('line_cell')
284
285
285 #-----------------------------------------------------------------------------
286 #-----------------------------------------------------------------------------
286 # Core Magic classes
287 # Core Magic classes
287 #-----------------------------------------------------------------------------
288 #-----------------------------------------------------------------------------
288
289
289 class MagicsManager(Configurable):
290 class MagicsManager(Configurable):
290 """Object that handles all magic-related functionality for IPython.
291 """Object that handles all magic-related functionality for IPython.
291 """
292 """
292 # Non-configurable class attributes
293 # Non-configurable class attributes
293
294
294 # A two-level dict, first keyed by magic type, then by magic function, and
295 # A two-level dict, first keyed by magic type, then by magic function, and
295 # holding the actual callable object as value. This is the dict used for
296 # holding the actual callable object as value. This is the dict used for
296 # magic function dispatch
297 # magic function dispatch
297 magics = Dict
298 magics = Dict
298
299
299 # A registry of the original objects that we've been given holding magics.
300 # A registry of the original objects that we've been given holding magics.
300 registry = Dict
301 registry = Dict
301
302
302 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
303 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
303
304
304 auto_magic = Bool(True, config=True, help=
305 auto_magic = Bool(True, config=True, help=
305 "Automatically call line magics without requiring explicit % prefix")
306 "Automatically call line magics without requiring explicit % prefix")
306
307
307 def _auto_magic_changed(self, name, value):
308 def _auto_magic_changed(self, name, value):
308 self.shell.automagic = value
309 self.shell.automagic = value
309
310
310 _auto_status = [
311 _auto_status = [
311 'Automagic is OFF, % prefix IS needed for line magics.',
312 'Automagic is OFF, % prefix IS needed for line magics.',
312 'Automagic is ON, % prefix IS NOT needed for line magics.']
313 'Automagic is ON, % prefix IS NOT needed for line magics.']
313
314
314 user_magics = Instance('IPython.core.magics.UserMagics')
315 user_magics = Instance('IPython.core.magics.UserMagics')
315
316
316 def __init__(self, shell=None, config=None, user_magics=None, **traits):
317 def __init__(self, shell=None, config=None, user_magics=None, **traits):
317
318
318 super(MagicsManager, self).__init__(shell=shell, config=config,
319 super(MagicsManager, self).__init__(shell=shell, config=config,
319 user_magics=user_magics, **traits)
320 user_magics=user_magics, **traits)
320 self.magics = dict(line={}, cell={})
321 self.magics = dict(line={}, cell={})
321 # Let's add the user_magics to the registry for uniformity, so *all*
322 # Let's add the user_magics to the registry for uniformity, so *all*
322 # registered magic containers can be found there.
323 # registered magic containers can be found there.
323 self.registry[user_magics.__class__.__name__] = user_magics
324 self.registry[user_magics.__class__.__name__] = user_magics
324
325
325 def auto_status(self):
326 def auto_status(self):
326 """Return descriptive string with automagic status."""
327 """Return descriptive string with automagic status."""
327 return self._auto_status[self.auto_magic]
328 return self._auto_status[self.auto_magic]
328
329
329 def lsmagic_info(self):
330 magic_list = []
331 for m_type in self.magics :
332 for m_name,mgc in self.magics[m_type].items():
333 try :
334 magic_list.append({'name':m_name,'type':m_type,'class':mgc.im_class.__name__})
335 except AttributeError :
336 magic_list.append({'name':m_name,'type':m_type,'class':'Other'})
337 return magic_list
338
339 def lsmagic(self):
330 def lsmagic(self):
340 """Return a dict of currently available magic functions.
331 """Return a dict of currently available magic functions.
341
332
342 The return dict has the keys 'line' and 'cell', corresponding to the
333 The return dict has the keys 'line' and 'cell', corresponding to the
343 two types of magics we support. Each value is a list of names.
334 two types of magics we support. Each value is a list of names.
344 """
335 """
345 return self.magics
336 return self.magics
346
337
347 def lsmagic_docs(self, brief=False, missing=''):
338 def lsmagic_docs(self, brief=False, missing=''):
348 """Return dict of documentation of magic functions.
339 """Return dict of documentation of magic functions.
349
340
350 The return dict has the keys 'line' and 'cell', corresponding to the
341 The return dict has the keys 'line' and 'cell', corresponding to the
351 two types of magics we support. Each value is a dict keyed by magic
342 two types of magics we support. Each value is a dict keyed by magic
352 name whose value is the function docstring. If a docstring is
343 name whose value is the function docstring. If a docstring is
353 unavailable, the value of `missing` is used instead.
344 unavailable, the value of `missing` is used instead.
354
345
355 If brief is True, only the first line of each docstring will be returned.
346 If brief is True, only the first line of each docstring will be returned.
356 """
347 """
357 docs = {}
348 docs = {}
358 for m_type in self.magics:
349 for m_type in self.magics:
359 m_docs = {}
350 m_docs = {}
360 for m_name, m_func in self.magics[m_type].iteritems():
351 for m_name, m_func in self.magics[m_type].iteritems():
361 if m_func.__doc__:
352 if m_func.__doc__:
362 if brief:
353 if brief:
363 m_docs[m_name] = m_func.__doc__.split('\n', 1)[0]
354 m_docs[m_name] = m_func.__doc__.split('\n', 1)[0]
364 else:
355 else:
365 m_docs[m_name] = m_func.__doc__.rstrip()
356 m_docs[m_name] = m_func.__doc__.rstrip()
366 else:
357 else:
367 m_docs[m_name] = missing
358 m_docs[m_name] = missing
368 docs[m_type] = m_docs
359 docs[m_type] = m_docs
369 return docs
360 return docs
370
361
371 def register(self, *magic_objects):
362 def register(self, *magic_objects):
372 """Register one or more instances of Magics.
363 """Register one or more instances of Magics.
373
364
374 Take one or more classes or instances of classes that subclass the main
365 Take one or more classes or instances of classes that subclass the main
375 `core.Magic` class, and register them with IPython to use the magic
366 `core.Magic` class, and register them with IPython to use the magic
376 functions they provide. The registration process will then ensure that
367 functions they provide. The registration process will then ensure that
377 any methods that have decorated to provide line and/or cell magics will
368 any methods that have decorated to provide line and/or cell magics will
378 be recognized with the `%x`/`%%x` syntax as a line/cell magic
369 be recognized with the `%x`/`%%x` syntax as a line/cell magic
379 respectively.
370 respectively.
380
371
381 If classes are given, they will be instantiated with the default
372 If classes are given, they will be instantiated with the default
382 constructor. If your classes need a custom constructor, you should
373 constructor. If your classes need a custom constructor, you should
383 instanitate them first and pass the instance.
374 instanitate them first and pass the instance.
384
375
385 The provided arguments can be an arbitrary mix of classes and instances.
376 The provided arguments can be an arbitrary mix of classes and instances.
386
377
387 Parameters
378 Parameters
388 ----------
379 ----------
389 magic_objects : one or more classes or instances
380 magic_objects : one or more classes or instances
390 """
381 """
391 # Start by validating them to ensure they have all had their magic
382 # Start by validating them to ensure they have all had their magic
392 # methods registered at the instance level
383 # methods registered at the instance level
393 for m in magic_objects:
384 for m in magic_objects:
394 if not m.registered:
385 if not m.registered:
395 raise ValueError("Class of magics %r was constructed without "
386 raise ValueError("Class of magics %r was constructed without "
396 "the @register_magics class decorator")
387 "the @register_magics class decorator")
397 if type(m) in (type, MetaHasTraits):
388 if type(m) in (type, MetaHasTraits):
398 # If we're given an uninstantiated class
389 # If we're given an uninstantiated class
399 m = m(shell=self.shell)
390 m = m(shell=self.shell)
400
391
401 # Now that we have an instance, we can register it and update the
392 # Now that we have an instance, we can register it and update the
402 # table of callables
393 # table of callables
403 self.registry[m.__class__.__name__] = m
394 self.registry[m.__class__.__name__] = m
404 for mtype in magic_kinds:
395 for mtype in magic_kinds:
405 self.magics[mtype].update(m.magics[mtype])
396 self.magics[mtype].update(m.magics[mtype])
406
397
407 def register_function(self, func, magic_kind='line', magic_name=None):
398 def register_function(self, func, magic_kind='line', magic_name=None):
408 """Expose a standalone function as magic function for IPython.
399 """Expose a standalone function as magic function for IPython.
409
400
410 This will create an IPython magic (line, cell or both) from a
401 This will create an IPython magic (line, cell or both) from a
411 standalone function. The functions should have the following
402 standalone function. The functions should have the following
412 signatures:
403 signatures:
413
404
414 * For line magics: `def f(line)`
405 * For line magics: `def f(line)`
415 * For cell magics: `def f(line, cell)`
406 * For cell magics: `def f(line, cell)`
416 * For a function that does both: `def f(line, cell=None)`
407 * For a function that does both: `def f(line, cell=None)`
417
408
418 In the latter case, the function will be called with `cell==None` when
409 In the latter case, the function will be called with `cell==None` when
419 invoked as `%f`, and with cell as a string when invoked as `%%f`.
410 invoked as `%f`, and with cell as a string when invoked as `%%f`.
420
411
421 Parameters
412 Parameters
422 ----------
413 ----------
423 func : callable
414 func : callable
424 Function to be registered as a magic.
415 Function to be registered as a magic.
425
416
426 magic_kind : str
417 magic_kind : str
427 Kind of magic, one of 'line', 'cell' or 'line_cell'
418 Kind of magic, one of 'line', 'cell' or 'line_cell'
428
419
429 magic_name : optional str
420 magic_name : optional str
430 If given, the name the magic will have in the IPython namespace. By
421 If given, the name the magic will have in the IPython namespace. By
431 default, the name of the function itself is used.
422 default, the name of the function itself is used.
432 """
423 """
433
424
434 # Create the new method in the user_magics and register it in the
425 # Create the new method in the user_magics and register it in the
435 # global table
426 # global table
436 validate_type(magic_kind)
427 validate_type(magic_kind)
437 magic_name = func.func_name if magic_name is None else magic_name
428 magic_name = func.func_name if magic_name is None else magic_name
438 setattr(self.user_magics, magic_name, func)
429 setattr(self.user_magics, magic_name, func)
439 record_magic(self.magics, magic_kind, magic_name, func)
430 record_magic(self.magics, magic_kind, magic_name, func)
440
431
441 def define_magic(self, name, func):
432 def define_magic(self, name, func):
442 """[Deprecated] Expose own function as magic function for IPython.
433 """[Deprecated] Expose own function as magic function for IPython.
443
434
444 Example::
435 Example::
445
436
446 def foo_impl(self, parameter_s=''):
437 def foo_impl(self, parameter_s=''):
447 'My very own magic!. (Use docstrings, IPython reads them).'
438 'My very own magic!. (Use docstrings, IPython reads them).'
448 print 'Magic function. Passed parameter is between < >:'
439 print 'Magic function. Passed parameter is between < >:'
449 print '<%s>' % parameter_s
440 print '<%s>' % parameter_s
450 print 'The self object is:', self
441 print 'The self object is:', self
451
442
452 ip.define_magic('foo',foo_impl)
443 ip.define_magic('foo',foo_impl)
453 """
444 """
454 meth = types.MethodType(func, self.user_magics)
445 meth = types.MethodType(func, self.user_magics)
455 setattr(self.user_magics, name, meth)
446 setattr(self.user_magics, name, meth)
456 record_magic(self.magics, 'line', name, meth)
447 record_magic(self.magics, 'line', name, meth)
457
448
458 def register_alias(self, alias_name, magic_name, magic_kind='line'):
449 def register_alias(self, alias_name, magic_name, magic_kind='line'):
459 """Register an alias to a magic function.
450 """Register an alias to a magic function.
460
451
461 The alias is an instance of :class:`MagicAlias`, which holds the
452 The alias is an instance of :class:`MagicAlias`, which holds the
462 name and kind of the magic it should call. Binding is done at
453 name and kind of the magic it should call. Binding is done at
463 call time, so if the underlying magic function is changed the alias
454 call time, so if the underlying magic function is changed the alias
464 will call the new function.
455 will call the new function.
465
456
466 Parameters
457 Parameters
467 ----------
458 ----------
468 alias_name : str
459 alias_name : str
469 The name of the magic to be registered.
460 The name of the magic to be registered.
470
461
471 magic_name : str
462 magic_name : str
472 The name of an existing magic.
463 The name of an existing magic.
473
464
474 magic_kind : str
465 magic_kind : str
475 Kind of magic, one of 'line' or 'cell'
466 Kind of magic, one of 'line' or 'cell'
476 """
467 """
477
468
478 # `validate_type` is too permissive, as it allows 'line_cell'
469 # `validate_type` is too permissive, as it allows 'line_cell'
479 # which we do not handle.
470 # which we do not handle.
480 if magic_kind not in magic_kinds:
471 if magic_kind not in magic_kinds:
481 raise ValueError('magic_kind must be one of %s, %s given' %
472 raise ValueError('magic_kind must be one of %s, %s given' %
482 magic_kinds, magic_kind)
473 magic_kinds, magic_kind)
483
474
484 alias = MagicAlias(self.shell, magic_name, magic_kind)
475 alias = MagicAlias(self.shell, magic_name, magic_kind)
485 setattr(self.user_magics, alias_name, alias)
476 setattr(self.user_magics, alias_name, alias)
486 record_magic(self.magics, magic_kind, alias_name, alias)
477 record_magic(self.magics, magic_kind, alias_name, alias)
487
478
488 # Key base class that provides the central functionality for magics.
479 # Key base class that provides the central functionality for magics.
489
480
490 class Magics(object):
481 class Magics(object):
491 """Base class for implementing magic functions.
482 """Base class for implementing magic functions.
492
483
493 Shell functions which can be reached as %function_name. All magic
484 Shell functions which can be reached as %function_name. All magic
494 functions should accept a string, which they can parse for their own
485 functions should accept a string, which they can parse for their own
495 needs. This can make some functions easier to type, eg `%cd ../`
486 needs. This can make some functions easier to type, eg `%cd ../`
496 vs. `%cd("../")`
487 vs. `%cd("../")`
497
488
498 Classes providing magic functions need to subclass this class, and they
489 Classes providing magic functions need to subclass this class, and they
499 MUST:
490 MUST:
500
491
501 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
492 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
502 individual methods as magic functions, AND
493 individual methods as magic functions, AND
503
494
504 - Use the class decorator `@magics_class` to ensure that the magic
495 - Use the class decorator `@magics_class` to ensure that the magic
505 methods are properly registered at the instance level upon instance
496 methods are properly registered at the instance level upon instance
506 initialization.
497 initialization.
507
498
508 See :mod:`magic_functions` for examples of actual implementation classes.
499 See :mod:`magic_functions` for examples of actual implementation classes.
509 """
500 """
510 # Dict holding all command-line options for each magic.
501 # Dict holding all command-line options for each magic.
511 options_table = None
502 options_table = None
512 # Dict for the mapping of magic names to methods, set by class decorator
503 # Dict for the mapping of magic names to methods, set by class decorator
513 magics = None
504 magics = None
514 # Flag to check that the class decorator was properly applied
505 # Flag to check that the class decorator was properly applied
515 registered = False
506 registered = False
516 # Instance of IPython shell
507 # Instance of IPython shell
517 shell = None
508 shell = None
518
509
519 def __init__(self, shell):
510 def __init__(self, shell):
520 if not(self.__class__.registered):
511 if not(self.__class__.registered):
521 raise ValueError('Magics subclass without registration - '
512 raise ValueError('Magics subclass without registration - '
522 'did you forget to apply @magics_class?')
513 'did you forget to apply @magics_class?')
523 self.shell = shell
514 self.shell = shell
524 self.options_table = {}
515 self.options_table = {}
525 # The method decorators are run when the instance doesn't exist yet, so
516 # The method decorators are run when the instance doesn't exist yet, so
526 # they can only record the names of the methods they are supposed to
517 # they can only record the names of the methods they are supposed to
527 # grab. Only now, that the instance exists, can we create the proper
518 # grab. Only now, that the instance exists, can we create the proper
528 # mapping to bound methods. So we read the info off the original names
519 # mapping to bound methods. So we read the info off the original names
529 # table and replace each method name by the actual bound method.
520 # table and replace each method name by the actual bound method.
530 # But we mustn't clobber the *class* mapping, in case of multiple instances.
521 # But we mustn't clobber the *class* mapping, in case of multiple instances.
531 class_magics = self.magics
522 class_magics = self.magics
532 self.magics = {}
523 self.magics = {}
533 for mtype in magic_kinds:
524 for mtype in magic_kinds:
534 tab = self.magics[mtype] = {}
525 tab = self.magics[mtype] = {}
535 cls_tab = class_magics[mtype]
526 cls_tab = class_magics[mtype]
536 for magic_name, meth_name in cls_tab.iteritems():
527 for magic_name, meth_name in cls_tab.iteritems():
537 if isinstance(meth_name, basestring):
528 if isinstance(meth_name, basestring):
538 # it's a method name, grab it
529 # it's a method name, grab it
539 tab[magic_name] = getattr(self, meth_name)
530 tab[magic_name] = getattr(self, meth_name)
540 else:
531 else:
541 # it's the real thing
532 # it's the real thing
542 tab[magic_name] = meth_name
533 tab[magic_name] = meth_name
543
534
544 def arg_err(self,func):
535 def arg_err(self,func):
545 """Print docstring if incorrect arguments were passed"""
536 """Print docstring if incorrect arguments were passed"""
546 print 'Error in arguments:'
537 print 'Error in arguments:'
547 print oinspect.getdoc(func)
538 print oinspect.getdoc(func)
548
539
549 def format_latex(self, strng):
540 def format_latex(self, strng):
550 """Format a string for latex inclusion."""
541 """Format a string for latex inclusion."""
551
542
552 # Characters that need to be escaped for latex:
543 # Characters that need to be escaped for latex:
553 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
544 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
554 # Magic command names as headers:
545 # Magic command names as headers:
555 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
546 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
556 re.MULTILINE)
547 re.MULTILINE)
557 # Magic commands
548 # Magic commands
558 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
549 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
559 re.MULTILINE)
550 re.MULTILINE)
560 # Paragraph continue
551 # Paragraph continue
561 par_re = re.compile(r'\\$',re.MULTILINE)
552 par_re = re.compile(r'\\$',re.MULTILINE)
562
553
563 # The "\n" symbol
554 # The "\n" symbol
564 newline_re = re.compile(r'\\n')
555 newline_re = re.compile(r'\\n')
565
556
566 # Now build the string for output:
557 # Now build the string for output:
567 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
558 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
568 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
559 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
569 strng)
560 strng)
570 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
561 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
571 strng = par_re.sub(r'\\\\',strng)
562 strng = par_re.sub(r'\\\\',strng)
572 strng = escape_re.sub(r'\\\1',strng)
563 strng = escape_re.sub(r'\\\1',strng)
573 strng = newline_re.sub(r'\\textbackslash{}n',strng)
564 strng = newline_re.sub(r'\\textbackslash{}n',strng)
574 return strng
565 return strng
575
566
576 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
567 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
577 """Parse options passed to an argument string.
568 """Parse options passed to an argument string.
578
569
579 The interface is similar to that of getopt(), but it returns back a
570 The interface is similar to that of getopt(), but it returns back a
580 Struct with the options as keys and the stripped argument string still
571 Struct with the options as keys and the stripped argument string still
581 as a string.
572 as a string.
582
573
583 arg_str is quoted as a true sys.argv vector by using shlex.split.
574 arg_str is quoted as a true sys.argv vector by using shlex.split.
584 This allows us to easily expand variables, glob files, quote
575 This allows us to easily expand variables, glob files, quote
585 arguments, etc.
576 arguments, etc.
586
577
587 Options:
578 Options:
588 -mode: default 'string'. If given as 'list', the argument string is
579 -mode: default 'string'. If given as 'list', the argument string is
589 returned as a list (split on whitespace) instead of a string.
580 returned as a list (split on whitespace) instead of a string.
590
581
591 -list_all: put all option values in lists. Normally only options
582 -list_all: put all option values in lists. Normally only options
592 appearing more than once are put in a list.
583 appearing more than once are put in a list.
593
584
594 -posix (True): whether to split the input line in POSIX mode or not,
585 -posix (True): whether to split the input line in POSIX mode or not,
595 as per the conventions outlined in the shlex module from the
586 as per the conventions outlined in the shlex module from the
596 standard library."""
587 standard library."""
597
588
598 # inject default options at the beginning of the input line
589 # inject default options at the beginning of the input line
599 caller = sys._getframe(1).f_code.co_name
590 caller = sys._getframe(1).f_code.co_name
600 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
591 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
601
592
602 mode = kw.get('mode','string')
593 mode = kw.get('mode','string')
603 if mode not in ['string','list']:
594 if mode not in ['string','list']:
604 raise ValueError('incorrect mode given: %s' % mode)
595 raise ValueError('incorrect mode given: %s' % mode)
605 # Get options
596 # Get options
606 list_all = kw.get('list_all',0)
597 list_all = kw.get('list_all',0)
607 posix = kw.get('posix', os.name == 'posix')
598 posix = kw.get('posix', os.name == 'posix')
608 strict = kw.get('strict', True)
599 strict = kw.get('strict', True)
609
600
610 # Check if we have more than one argument to warrant extra processing:
601 # Check if we have more than one argument to warrant extra processing:
611 odict = {} # Dictionary with options
602 odict = {} # Dictionary with options
612 args = arg_str.split()
603 args = arg_str.split()
613 if len(args) >= 1:
604 if len(args) >= 1:
614 # If the list of inputs only has 0 or 1 thing in it, there's no
605 # If the list of inputs only has 0 or 1 thing in it, there's no
615 # need to look for options
606 # need to look for options
616 argv = arg_split(arg_str, posix, strict)
607 argv = arg_split(arg_str, posix, strict)
617 # Do regular option processing
608 # Do regular option processing
618 try:
609 try:
619 opts,args = getopt(argv, opt_str, long_opts)
610 opts,args = getopt(argv, opt_str, long_opts)
620 except GetoptError as e:
611 except GetoptError as e:
621 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
612 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
622 " ".join(long_opts)))
613 " ".join(long_opts)))
623 for o,a in opts:
614 for o,a in opts:
624 if o.startswith('--'):
615 if o.startswith('--'):
625 o = o[2:]
616 o = o[2:]
626 else:
617 else:
627 o = o[1:]
618 o = o[1:]
628 try:
619 try:
629 odict[o].append(a)
620 odict[o].append(a)
630 except AttributeError:
621 except AttributeError:
631 odict[o] = [odict[o],a]
622 odict[o] = [odict[o],a]
632 except KeyError:
623 except KeyError:
633 if list_all:
624 if list_all:
634 odict[o] = [a]
625 odict[o] = [a]
635 else:
626 else:
636 odict[o] = a
627 odict[o] = a
637
628
638 # Prepare opts,args for return
629 # Prepare opts,args for return
639 opts = Struct(odict)
630 opts = Struct(odict)
640 if mode == 'string':
631 if mode == 'string':
641 args = ' '.join(args)
632 args = ' '.join(args)
642
633
643 return opts,args
634 return opts,args
644
635
645 def default_option(self, fn, optstr):
636 def default_option(self, fn, optstr):
646 """Make an entry in the options_table for fn, with value optstr"""
637 """Make an entry in the options_table for fn, with value optstr"""
647
638
648 if fn not in self.lsmagic():
639 if fn not in self.lsmagic():
649 error("%s is not a magic function" % fn)
640 error("%s is not a magic function" % fn)
650 self.options_table[fn] = optstr
641 self.options_table[fn] = optstr
651
642
652 class MagicAlias(object):
643 class MagicAlias(object):
653 """An alias to another magic function.
644 """An alias to another magic function.
654
645
655 An alias is determined by its magic name and magic kind. Lookup
646 An alias is determined by its magic name and magic kind. Lookup
656 is done at call time, so if the underlying magic changes the alias
647 is done at call time, so if the underlying magic changes the alias
657 will call the new function.
648 will call the new function.
658
649
659 Use the :meth:`MagicsManager.register_alias` method or the
650 Use the :meth:`MagicsManager.register_alias` method or the
660 `%alias_magic` magic function to create and register a new alias.
651 `%alias_magic` magic function to create and register a new alias.
661 """
652 """
662 def __init__(self, shell, magic_name, magic_kind):
653 def __init__(self, shell, magic_name, magic_kind):
663 self.shell = shell
654 self.shell = shell
664 self.magic_name = magic_name
655 self.magic_name = magic_name
665 self.magic_kind = magic_kind
656 self.magic_kind = magic_kind
666
657
667 self.pretty_target = '%s%s' % (magic_escapes[self.magic_kind], self.magic_name)
658 self.pretty_target = '%s%s' % (magic_escapes[self.magic_kind], self.magic_name)
668 self.__doc__ = "Alias for `%s`." % self.pretty_target
659 self.__doc__ = "Alias for `%s`." % self.pretty_target
669
660
670 self._in_call = False
661 self._in_call = False
671
662
672 def __call__(self, *args, **kwargs):
663 def __call__(self, *args, **kwargs):
673 """Call the magic alias."""
664 """Call the magic alias."""
674 fn = self.shell.find_magic(self.magic_name, self.magic_kind)
665 fn = self.shell.find_magic(self.magic_name, self.magic_kind)
675 if fn is None:
666 if fn is None:
676 raise UsageError("Magic `%s` not found." % self.pretty_target)
667 raise UsageError("Magic `%s` not found." % self.pretty_target)
677
668
678 # Protect against infinite recursion.
669 # Protect against infinite recursion.
679 if self._in_call:
670 if self._in_call:
680 raise UsageError("Infinite recursion detected; "
671 raise UsageError("Infinite recursion detected; "
681 "magic aliases cannot call themselves.")
672 "magic aliases cannot call themselves.")
682 self._in_call = True
673 self._in_call = True
683 try:
674 try:
684 return fn(*args, **kwargs)
675 return fn(*args, **kwargs)
685 finally:
676 finally:
686 self._in_call = False
677 self._in_call = False
@@ -1,612 +1,648 b''
1 """Implementation of basic magic functions.
1 """Implementation of basic magic functions.
2 """
2 """
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (c) 2012 The IPython Development Team.
4 # Copyright (c) 2012 The IPython Development Team.
5 #
5 #
6 # Distributed under the terms of the Modified BSD License.
6 # Distributed under the terms of the Modified BSD License.
7 #
7 #
8 # The full license is in the file COPYING.txt, distributed with this software.
8 # The full license is in the file COPYING.txt, distributed with this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 from __future__ import print_function
14 from __future__ import print_function
15
15
16 # Stdlib
16 # Stdlib
17 import io
17 import io
18 import json
18 import sys
19 import sys
19 from pprint import pformat
20 from pprint import pformat
20
21
21 # Our own packages
22 # Our own packages
22 from IPython.core import magic_arguments
23 from IPython.core import magic_arguments
23 from IPython.core.error import UsageError
24 from IPython.core.error import UsageError
24 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
25 from IPython.core.magic import Magics, magics_class, line_magic, magic_escapes
25 from IPython.utils.text import format_screen, dedent, indent
26 from IPython.utils.text import format_screen, dedent, indent
26 from IPython.core import magic_arguments, page
27 from IPython.core import magic_arguments, page
27 from IPython.testing.skipdoctest import skip_doctest
28 from IPython.testing.skipdoctest import skip_doctest
28 from IPython.utils.ipstruct import Struct
29 from IPython.utils.ipstruct import Struct
29 from IPython.utils.path import unquote_filename
30 from IPython.utils.path import unquote_filename
30 from IPython.utils.warn import warn, error
31 from IPython.utils.warn import warn, error
31
32
32 #-----------------------------------------------------------------------------
33 #-----------------------------------------------------------------------------
33 # Magics class implementation
34 # Magics class implementation
34 #-----------------------------------------------------------------------------
35 #-----------------------------------------------------------------------------
35
36
37 class MagicsDisplay(object):
38 def __init__(self, magics_manager):
39 self.magics_manager = magics_manager
40
41 def _lsmagic(self):
42 """The main implementation of the %lsmagic"""
43 mesc = magic_escapes['line']
44 cesc = magic_escapes['cell']
45 mman = self.magics_manager
46 magics = mman.lsmagic()
47 out = ['Available line magics:',
48 mesc + (' '+mesc).join(sorted(magics['line'])),
49 '',
50 'Available cell magics:',
51 cesc + (' '+cesc).join(sorted(magics['cell'])),
52 '',
53 mman.auto_status()]
54 return '\n'.join(out)
55
56 def _repr_pretty_(self, p, cycle):
57 p.text(self._lsmagic())
58
59 def __str__(self):
60 return self._lsmagic()
61
62 def _jsonable(self):
63 """turn magics dict into jsonable dict of the same structure
64
65 replaces object instances with their class names as strings
66 """
67 magic_dict = {}
68 mman = self.magics_manager
69 magics = mman.lsmagic()
70 for key, subdict in magics.items():
71 d = {}
72 magic_dict[key] = d
73 for name, obj in subdict.items():
74 try:
75 classname = obj.im_class.__name__
76 except AttributeError:
77 classname = 'Other'
78
79 d[name] = classname
80 return magic_dict
81
82 def _repr_json_(self):
83 return json.dumps(self._jsonable())
84
85
36 @magics_class
86 @magics_class
37 class BasicMagics(Magics):
87 class BasicMagics(Magics):
38 """Magics that provide central IPython functionality.
88 """Magics that provide central IPython functionality.
39
89
40 These are various magics that don't fit into specific categories but that
90 These are various magics that don't fit into specific categories but that
41 are all part of the base 'IPython experience'."""
91 are all part of the base 'IPython experience'."""
42
92
43 @magic_arguments.magic_arguments()
93 @magic_arguments.magic_arguments()
44 @magic_arguments.argument(
94 @magic_arguments.argument(
45 '-l', '--line', action='store_true',
95 '-l', '--line', action='store_true',
46 help="""Create a line magic alias."""
96 help="""Create a line magic alias."""
47 )
97 )
48 @magic_arguments.argument(
98 @magic_arguments.argument(
49 '-c', '--cell', action='store_true',
99 '-c', '--cell', action='store_true',
50 help="""Create a cell magic alias."""
100 help="""Create a cell magic alias."""
51 )
101 )
52 @magic_arguments.argument(
102 @magic_arguments.argument(
53 'name',
103 'name',
54 help="""Name of the magic to be created."""
104 help="""Name of the magic to be created."""
55 )
105 )
56 @magic_arguments.argument(
106 @magic_arguments.argument(
57 'target',
107 'target',
58 help="""Name of the existing line or cell magic."""
108 help="""Name of the existing line or cell magic."""
59 )
109 )
60 @line_magic
110 @line_magic
61 def alias_magic(self, line=''):
111 def alias_magic(self, line=''):
62 """Create an alias for an existing line or cell magic.
112 """Create an alias for an existing line or cell magic.
63
113
64 Examples
114 Examples
65 --------
115 --------
66 ::
116 ::
67 In [1]: %alias_magic t timeit
117 In [1]: %alias_magic t timeit
68 Created `%t` as an alias for `%timeit`.
118 Created `%t` as an alias for `%timeit`.
69 Created `%%t` as an alias for `%%timeit`.
119 Created `%%t` as an alias for `%%timeit`.
70
120
71 In [2]: %t -n1 pass
121 In [2]: %t -n1 pass
72 1 loops, best of 3: 954 ns per loop
122 1 loops, best of 3: 954 ns per loop
73
123
74 In [3]: %%t -n1
124 In [3]: %%t -n1
75 ...: pass
125 ...: pass
76 ...:
126 ...:
77 1 loops, best of 3: 954 ns per loop
127 1 loops, best of 3: 954 ns per loop
78
128
79 In [4]: %alias_magic --cell whereami pwd
129 In [4]: %alias_magic --cell whereami pwd
80 UsageError: Cell magic function `%%pwd` not found.
130 UsageError: Cell magic function `%%pwd` not found.
81 In [5]: %alias_magic --line whereami pwd
131 In [5]: %alias_magic --line whereami pwd
82 Created `%whereami` as an alias for `%pwd`.
132 Created `%whereami` as an alias for `%pwd`.
83
133
84 In [6]: %whereami
134 In [6]: %whereami
85 Out[6]: u'/home/testuser'
135 Out[6]: u'/home/testuser'
86 """
136 """
87 args = magic_arguments.parse_argstring(self.alias_magic, line)
137 args = magic_arguments.parse_argstring(self.alias_magic, line)
88 shell = self.shell
138 shell = self.shell
89 mman = self.shell.magics_manager
139 mman = self.shell.magics_manager
90 escs = ''.join(magic_escapes.values())
140 escs = ''.join(magic_escapes.values())
91
141
92 target = args.target.lstrip(escs)
142 target = args.target.lstrip(escs)
93 name = args.name.lstrip(escs)
143 name = args.name.lstrip(escs)
94
144
95 # Find the requested magics.
145 # Find the requested magics.
96 m_line = shell.find_magic(target, 'line')
146 m_line = shell.find_magic(target, 'line')
97 m_cell = shell.find_magic(target, 'cell')
147 m_cell = shell.find_magic(target, 'cell')
98 if args.line and m_line is None:
148 if args.line and m_line is None:
99 raise UsageError('Line magic function `%s%s` not found.' %
149 raise UsageError('Line magic function `%s%s` not found.' %
100 (magic_escapes['line'], target))
150 (magic_escapes['line'], target))
101 if args.cell and m_cell is None:
151 if args.cell and m_cell is None:
102 raise UsageError('Cell magic function `%s%s` not found.' %
152 raise UsageError('Cell magic function `%s%s` not found.' %
103 (magic_escapes['cell'], target))
153 (magic_escapes['cell'], target))
104
154
105 # If --line and --cell are not specified, default to the ones
155 # If --line and --cell are not specified, default to the ones
106 # that are available.
156 # that are available.
107 if not args.line and not args.cell:
157 if not args.line and not args.cell:
108 if not m_line and not m_cell:
158 if not m_line and not m_cell:
109 raise UsageError(
159 raise UsageError(
110 'No line or cell magic with name `%s` found.' % target
160 'No line or cell magic with name `%s` found.' % target
111 )
161 )
112 args.line = bool(m_line)
162 args.line = bool(m_line)
113 args.cell = bool(m_cell)
163 args.cell = bool(m_cell)
114
164
115 if args.line:
165 if args.line:
116 mman.register_alias(name, target, 'line')
166 mman.register_alias(name, target, 'line')
117 print('Created `%s%s` as an alias for `%s%s`.' % (
167 print('Created `%s%s` as an alias for `%s%s`.' % (
118 magic_escapes['line'], name,
168 magic_escapes['line'], name,
119 magic_escapes['line'], target))
169 magic_escapes['line'], target))
120
170
121 if args.cell:
171 if args.cell:
122 mman.register_alias(name, target, 'cell')
172 mman.register_alias(name, target, 'cell')
123 print('Created `%s%s` as an alias for `%s%s`.' % (
173 print('Created `%s%s` as an alias for `%s%s`.' % (
124 magic_escapes['cell'], name,
174 magic_escapes['cell'], name,
125 magic_escapes['cell'], target))
175 magic_escapes['cell'], target))
126
176
127 def _lsmagic(self):
128 mesc = magic_escapes['line']
129 cesc = magic_escapes['cell']
130 mman = self.shell.magics_manager
131 magics = mman.lsmagic()
132 out = ['Available line magics:',
133 mesc + (' '+mesc).join(sorted(magics['line'])),
134 '',
135 'Available cell magics:',
136 cesc + (' '+cesc).join(sorted(magics['cell'])),
137 '',
138 mman.auto_status()]
139 return '\n'.join(out)
140
141 @line_magic
177 @line_magic
142 def lsmagic(self, parameter_s=''):
178 def lsmagic(self, parameter_s=''):
143 """List currently available magic functions."""
179 """List currently available magic functions."""
144 print(self._lsmagic())
180 return MagicsDisplay(self.shell.magics_manager)
145
181
146 def _magic_docs(self, brief=False, rest=False):
182 def _magic_docs(self, brief=False, rest=False):
147 """Return docstrings from magic functions."""
183 """Return docstrings from magic functions."""
148 mman = self.shell.magics_manager
184 mman = self.shell.magics_manager
149 docs = mman.lsmagic_docs(brief, missing='No documentation')
185 docs = mman.lsmagic_docs(brief, missing='No documentation')
150
186
151 if rest:
187 if rest:
152 format_string = '**%s%s**::\n\n%s\n\n'
188 format_string = '**%s%s**::\n\n%s\n\n'
153 else:
189 else:
154 format_string = '%s%s:\n%s\n'
190 format_string = '%s%s:\n%s\n'
155
191
156 return ''.join(
192 return ''.join(
157 [format_string % (magic_escapes['line'], fname,
193 [format_string % (magic_escapes['line'], fname,
158 indent(dedent(fndoc)))
194 indent(dedent(fndoc)))
159 for fname, fndoc in sorted(docs['line'].items())]
195 for fname, fndoc in sorted(docs['line'].items())]
160 +
196 +
161 [format_string % (magic_escapes['cell'], fname,
197 [format_string % (magic_escapes['cell'], fname,
162 indent(dedent(fndoc)))
198 indent(dedent(fndoc)))
163 for fname, fndoc in sorted(docs['cell'].items())]
199 for fname, fndoc in sorted(docs['cell'].items())]
164 )
200 )
165
201
166 @line_magic
202 @line_magic
167 def magic(self, parameter_s=''):
203 def magic(self, parameter_s=''):
168 """Print information about the magic function system.
204 """Print information about the magic function system.
169
205
170 Supported formats: -latex, -brief, -rest
206 Supported formats: -latex, -brief, -rest
171 """
207 """
172
208
173 mode = ''
209 mode = ''
174 try:
210 try:
175 mode = parameter_s.split()[0][1:]
211 mode = parameter_s.split()[0][1:]
176 if mode == 'rest':
212 if mode == 'rest':
177 rest_docs = []
213 rest_docs = []
178 except IndexError:
214 except IndexError:
179 pass
215 pass
180
216
181 brief = (mode == 'brief')
217 brief = (mode == 'brief')
182 rest = (mode == 'rest')
218 rest = (mode == 'rest')
183 magic_docs = self._magic_docs(brief, rest)
219 magic_docs = self._magic_docs(brief, rest)
184
220
185 if mode == 'latex':
221 if mode == 'latex':
186 print(self.format_latex(magic_docs))
222 print(self.format_latex(magic_docs))
187 return
223 return
188 else:
224 else:
189 magic_docs = format_screen(magic_docs)
225 magic_docs = format_screen(magic_docs)
190
226
191 out = ["""
227 out = ["""
192 IPython's 'magic' functions
228 IPython's 'magic' functions
193 ===========================
229 ===========================
194
230
195 The magic function system provides a series of functions which allow you to
231 The magic function system provides a series of functions which allow you to
196 control the behavior of IPython itself, plus a lot of system-type
232 control the behavior of IPython itself, plus a lot of system-type
197 features. There are two kinds of magics, line-oriented and cell-oriented.
233 features. There are two kinds of magics, line-oriented and cell-oriented.
198
234
199 Line magics are prefixed with the % character and work much like OS
235 Line magics are prefixed with the % character and work much like OS
200 command-line calls: they get as an argument the rest of the line, where
236 command-line calls: they get as an argument the rest of the line, where
201 arguments are passed without parentheses or quotes. For example, this will
237 arguments are passed without parentheses or quotes. For example, this will
202 time the given statement::
238 time the given statement::
203
239
204 %timeit range(1000)
240 %timeit range(1000)
205
241
206 Cell magics are prefixed with a double %%, and they are functions that get as
242 Cell magics are prefixed with a double %%, and they are functions that get as
207 an argument not only the rest of the line, but also the lines below it in a
243 an argument not only the rest of the line, but also the lines below it in a
208 separate argument. These magics are called with two arguments: the rest of the
244 separate argument. These magics are called with two arguments: the rest of the
209 call line and the body of the cell, consisting of the lines below the first.
245 call line and the body of the cell, consisting of the lines below the first.
210 For example::
246 For example::
211
247
212 %%timeit x = numpy.random.randn((100, 100))
248 %%timeit x = numpy.random.randn((100, 100))
213 numpy.linalg.svd(x)
249 numpy.linalg.svd(x)
214
250
215 will time the execution of the numpy svd routine, running the assignment of x
251 will time the execution of the numpy svd routine, running the assignment of x
216 as part of the setup phase, which is not timed.
252 as part of the setup phase, which is not timed.
217
253
218 In a line-oriented client (the terminal or Qt console IPython), starting a new
254 In a line-oriented client (the terminal or Qt console IPython), starting a new
219 input with %% will automatically enter cell mode, and IPython will continue
255 input with %% will automatically enter cell mode, and IPython will continue
220 reading input until a blank line is given. In the notebook, simply type the
256 reading input until a blank line is given. In the notebook, simply type the
221 whole cell as one entity, but keep in mind that the %% escape can only be at
257 whole cell as one entity, but keep in mind that the %% escape can only be at
222 the very start of the cell.
258 the very start of the cell.
223
259
224 NOTE: If you have 'automagic' enabled (via the command line option or with the
260 NOTE: If you have 'automagic' enabled (via the command line option or with the
225 %automagic function), you don't need to type in the % explicitly for line
261 %automagic function), you don't need to type in the % explicitly for line
226 magics; cell magics always require an explicit '%%' escape. By default,
262 magics; cell magics always require an explicit '%%' escape. By default,
227 IPython ships with automagic on, so you should only rarely need the % escape.
263 IPython ships with automagic on, so you should only rarely need the % escape.
228
264
229 Example: typing '%cd mydir' (without the quotes) changes you working directory
265 Example: typing '%cd mydir' (without the quotes) changes you working directory
230 to 'mydir', if it exists.
266 to 'mydir', if it exists.
231
267
232 For a list of the available magic functions, use %lsmagic. For a description
268 For a list of the available magic functions, use %lsmagic. For a description
233 of any of them, type %magic_name?, e.g. '%cd?'.
269 of any of them, type %magic_name?, e.g. '%cd?'.
234
270
235 Currently the magic system has the following functions:""",
271 Currently the magic system has the following functions:""",
236 magic_docs,
272 magic_docs,
237 "Summary of magic functions (from %slsmagic):" % magic_escapes['line'],
273 "Summary of magic functions (from %slsmagic):" % magic_escapes['line'],
238 self._lsmagic(),
274 self._lsmagic(),
239 ]
275 ]
240 page.page('\n'.join(out))
276 page.page('\n'.join(out))
241
277
242
278
243 @line_magic
279 @line_magic
244 def page(self, parameter_s=''):
280 def page(self, parameter_s=''):
245 """Pretty print the object and display it through a pager.
281 """Pretty print the object and display it through a pager.
246
282
247 %page [options] OBJECT
283 %page [options] OBJECT
248
284
249 If no object is given, use _ (last output).
285 If no object is given, use _ (last output).
250
286
251 Options:
287 Options:
252
288
253 -r: page str(object), don't pretty-print it."""
289 -r: page str(object), don't pretty-print it."""
254
290
255 # After a function contributed by Olivier Aubert, slightly modified.
291 # After a function contributed by Olivier Aubert, slightly modified.
256
292
257 # Process options/args
293 # Process options/args
258 opts, args = self.parse_options(parameter_s, 'r')
294 opts, args = self.parse_options(parameter_s, 'r')
259 raw = 'r' in opts
295 raw = 'r' in opts
260
296
261 oname = args and args or '_'
297 oname = args and args or '_'
262 info = self.shell._ofind(oname)
298 info = self.shell._ofind(oname)
263 if info['found']:
299 if info['found']:
264 txt = (raw and str or pformat)( info['obj'] )
300 txt = (raw and str or pformat)( info['obj'] )
265 page.page(txt)
301 page.page(txt)
266 else:
302 else:
267 print('Object `%s` not found' % oname)
303 print('Object `%s` not found' % oname)
268
304
269 @line_magic
305 @line_magic
270 def profile(self, parameter_s=''):
306 def profile(self, parameter_s=''):
271 """Print your currently active IPython profile."""
307 """Print your currently active IPython profile."""
272 from IPython.core.application import BaseIPythonApplication
308 from IPython.core.application import BaseIPythonApplication
273 if BaseIPythonApplication.initialized():
309 if BaseIPythonApplication.initialized():
274 print(BaseIPythonApplication.instance().profile)
310 print(BaseIPythonApplication.instance().profile)
275 else:
311 else:
276 error("profile is an application-level value, but you don't appear to be in an IPython application")
312 error("profile is an application-level value, but you don't appear to be in an IPython application")
277
313
278 @line_magic
314 @line_magic
279 def pprint(self, parameter_s=''):
315 def pprint(self, parameter_s=''):
280 """Toggle pretty printing on/off."""
316 """Toggle pretty printing on/off."""
281 ptformatter = self.shell.display_formatter.formatters['text/plain']
317 ptformatter = self.shell.display_formatter.formatters['text/plain']
282 ptformatter.pprint = bool(1 - ptformatter.pprint)
318 ptformatter.pprint = bool(1 - ptformatter.pprint)
283 print('Pretty printing has been turned',
319 print('Pretty printing has been turned',
284 ['OFF','ON'][ptformatter.pprint])
320 ['OFF','ON'][ptformatter.pprint])
285
321
286 @line_magic
322 @line_magic
287 def colors(self, parameter_s=''):
323 def colors(self, parameter_s=''):
288 """Switch color scheme for prompts, info system and exception handlers.
324 """Switch color scheme for prompts, info system and exception handlers.
289
325
290 Currently implemented schemes: NoColor, Linux, LightBG.
326 Currently implemented schemes: NoColor, Linux, LightBG.
291
327
292 Color scheme names are not case-sensitive.
328 Color scheme names are not case-sensitive.
293
329
294 Examples
330 Examples
295 --------
331 --------
296 To get a plain black and white terminal::
332 To get a plain black and white terminal::
297
333
298 %colors nocolor
334 %colors nocolor
299 """
335 """
300 def color_switch_err(name):
336 def color_switch_err(name):
301 warn('Error changing %s color schemes.\n%s' %
337 warn('Error changing %s color schemes.\n%s' %
302 (name, sys.exc_info()[1]))
338 (name, sys.exc_info()[1]))
303
339
304
340
305 new_scheme = parameter_s.strip()
341 new_scheme = parameter_s.strip()
306 if not new_scheme:
342 if not new_scheme:
307 raise UsageError(
343 raise UsageError(
308 "%colors: you must specify a color scheme. See '%colors?'")
344 "%colors: you must specify a color scheme. See '%colors?'")
309 return
345 return
310 # local shortcut
346 # local shortcut
311 shell = self.shell
347 shell = self.shell
312
348
313 import IPython.utils.rlineimpl as readline
349 import IPython.utils.rlineimpl as readline
314
350
315 if not shell.colors_force and \
351 if not shell.colors_force and \
316 not readline.have_readline and \
352 not readline.have_readline and \
317 (sys.platform == "win32" or sys.platform == "cli"):
353 (sys.platform == "win32" or sys.platform == "cli"):
318 msg = """\
354 msg = """\
319 Proper color support under MS Windows requires the pyreadline library.
355 Proper color support under MS Windows requires the pyreadline library.
320 You can find it at:
356 You can find it at:
321 http://ipython.org/pyreadline.html
357 http://ipython.org/pyreadline.html
322 Gary's readline needs the ctypes module, from:
358 Gary's readline needs the ctypes module, from:
323 http://starship.python.net/crew/theller/ctypes
359 http://starship.python.net/crew/theller/ctypes
324 (Note that ctypes is already part of Python versions 2.5 and newer).
360 (Note that ctypes is already part of Python versions 2.5 and newer).
325
361
326 Defaulting color scheme to 'NoColor'"""
362 Defaulting color scheme to 'NoColor'"""
327 new_scheme = 'NoColor'
363 new_scheme = 'NoColor'
328 warn(msg)
364 warn(msg)
329
365
330 # readline option is 0
366 # readline option is 0
331 if not shell.colors_force and not shell.has_readline:
367 if not shell.colors_force and not shell.has_readline:
332 new_scheme = 'NoColor'
368 new_scheme = 'NoColor'
333
369
334 # Set prompt colors
370 # Set prompt colors
335 try:
371 try:
336 shell.prompt_manager.color_scheme = new_scheme
372 shell.prompt_manager.color_scheme = new_scheme
337 except:
373 except:
338 color_switch_err('prompt')
374 color_switch_err('prompt')
339 else:
375 else:
340 shell.colors = \
376 shell.colors = \
341 shell.prompt_manager.color_scheme_table.active_scheme_name
377 shell.prompt_manager.color_scheme_table.active_scheme_name
342 # Set exception colors
378 # Set exception colors
343 try:
379 try:
344 shell.InteractiveTB.set_colors(scheme = new_scheme)
380 shell.InteractiveTB.set_colors(scheme = new_scheme)
345 shell.SyntaxTB.set_colors(scheme = new_scheme)
381 shell.SyntaxTB.set_colors(scheme = new_scheme)
346 except:
382 except:
347 color_switch_err('exception')
383 color_switch_err('exception')
348
384
349 # Set info (for 'object?') colors
385 # Set info (for 'object?') colors
350 if shell.color_info:
386 if shell.color_info:
351 try:
387 try:
352 shell.inspector.set_active_scheme(new_scheme)
388 shell.inspector.set_active_scheme(new_scheme)
353 except:
389 except:
354 color_switch_err('object inspector')
390 color_switch_err('object inspector')
355 else:
391 else:
356 shell.inspector.set_active_scheme('NoColor')
392 shell.inspector.set_active_scheme('NoColor')
357
393
358 @line_magic
394 @line_magic
359 def xmode(self, parameter_s=''):
395 def xmode(self, parameter_s=''):
360 """Switch modes for the exception handlers.
396 """Switch modes for the exception handlers.
361
397
362 Valid modes: Plain, Context and Verbose.
398 Valid modes: Plain, Context and Verbose.
363
399
364 If called without arguments, acts as a toggle."""
400 If called without arguments, acts as a toggle."""
365
401
366 def xmode_switch_err(name):
402 def xmode_switch_err(name):
367 warn('Error changing %s exception modes.\n%s' %
403 warn('Error changing %s exception modes.\n%s' %
368 (name,sys.exc_info()[1]))
404 (name,sys.exc_info()[1]))
369
405
370 shell = self.shell
406 shell = self.shell
371 new_mode = parameter_s.strip().capitalize()
407 new_mode = parameter_s.strip().capitalize()
372 try:
408 try:
373 shell.InteractiveTB.set_mode(mode=new_mode)
409 shell.InteractiveTB.set_mode(mode=new_mode)
374 print('Exception reporting mode:',shell.InteractiveTB.mode)
410 print('Exception reporting mode:',shell.InteractiveTB.mode)
375 except:
411 except:
376 xmode_switch_err('user')
412 xmode_switch_err('user')
377
413
378 @line_magic
414 @line_magic
379 def quickref(self,arg):
415 def quickref(self,arg):
380 """ Show a quick reference sheet """
416 """ Show a quick reference sheet """
381 from IPython.core.usage import quick_reference
417 from IPython.core.usage import quick_reference
382 qr = quick_reference + self._magic_docs(brief=True)
418 qr = quick_reference + self._magic_docs(brief=True)
383 page.page(qr)
419 page.page(qr)
384
420
385 @line_magic
421 @line_magic
386 def doctest_mode(self, parameter_s=''):
422 def doctest_mode(self, parameter_s=''):
387 """Toggle doctest mode on and off.
423 """Toggle doctest mode on and off.
388
424
389 This mode is intended to make IPython behave as much as possible like a
425 This mode is intended to make IPython behave as much as possible like a
390 plain Python shell, from the perspective of how its prompts, exceptions
426 plain Python shell, from the perspective of how its prompts, exceptions
391 and output look. This makes it easy to copy and paste parts of a
427 and output look. This makes it easy to copy and paste parts of a
392 session into doctests. It does so by:
428 session into doctests. It does so by:
393
429
394 - Changing the prompts to the classic ``>>>`` ones.
430 - Changing the prompts to the classic ``>>>`` ones.
395 - Changing the exception reporting mode to 'Plain'.
431 - Changing the exception reporting mode to 'Plain'.
396 - Disabling pretty-printing of output.
432 - Disabling pretty-printing of output.
397
433
398 Note that IPython also supports the pasting of code snippets that have
434 Note that IPython also supports the pasting of code snippets that have
399 leading '>>>' and '...' prompts in them. This means that you can paste
435 leading '>>>' and '...' prompts in them. This means that you can paste
400 doctests from files or docstrings (even if they have leading
436 doctests from files or docstrings (even if they have leading
401 whitespace), and the code will execute correctly. You can then use
437 whitespace), and the code will execute correctly. You can then use
402 '%history -t' to see the translated history; this will give you the
438 '%history -t' to see the translated history; this will give you the
403 input after removal of all the leading prompts and whitespace, which
439 input after removal of all the leading prompts and whitespace, which
404 can be pasted back into an editor.
440 can be pasted back into an editor.
405
441
406 With these features, you can switch into this mode easily whenever you
442 With these features, you can switch into this mode easily whenever you
407 need to do testing and changes to doctests, without having to leave
443 need to do testing and changes to doctests, without having to leave
408 your existing IPython session.
444 your existing IPython session.
409 """
445 """
410
446
411 # Shorthands
447 # Shorthands
412 shell = self.shell
448 shell = self.shell
413 pm = shell.prompt_manager
449 pm = shell.prompt_manager
414 meta = shell.meta
450 meta = shell.meta
415 disp_formatter = self.shell.display_formatter
451 disp_formatter = self.shell.display_formatter
416 ptformatter = disp_formatter.formatters['text/plain']
452 ptformatter = disp_formatter.formatters['text/plain']
417 # dstore is a data store kept in the instance metadata bag to track any
453 # dstore is a data store kept in the instance metadata bag to track any
418 # changes we make, so we can undo them later.
454 # changes we make, so we can undo them later.
419 dstore = meta.setdefault('doctest_mode',Struct())
455 dstore = meta.setdefault('doctest_mode',Struct())
420 save_dstore = dstore.setdefault
456 save_dstore = dstore.setdefault
421
457
422 # save a few values we'll need to recover later
458 # save a few values we'll need to recover later
423 mode = save_dstore('mode',False)
459 mode = save_dstore('mode',False)
424 save_dstore('rc_pprint',ptformatter.pprint)
460 save_dstore('rc_pprint',ptformatter.pprint)
425 save_dstore('xmode',shell.InteractiveTB.mode)
461 save_dstore('xmode',shell.InteractiveTB.mode)
426 save_dstore('rc_separate_out',shell.separate_out)
462 save_dstore('rc_separate_out',shell.separate_out)
427 save_dstore('rc_separate_out2',shell.separate_out2)
463 save_dstore('rc_separate_out2',shell.separate_out2)
428 save_dstore('rc_prompts_pad_left',pm.justify)
464 save_dstore('rc_prompts_pad_left',pm.justify)
429 save_dstore('rc_separate_in',shell.separate_in)
465 save_dstore('rc_separate_in',shell.separate_in)
430 save_dstore('rc_active_types',disp_formatter.active_types)
466 save_dstore('rc_active_types',disp_formatter.active_types)
431 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
467 save_dstore('prompt_templates',(pm.in_template, pm.in2_template, pm.out_template))
432
468
433 if mode == False:
469 if mode == False:
434 # turn on
470 # turn on
435 pm.in_template = '>>> '
471 pm.in_template = '>>> '
436 pm.in2_template = '... '
472 pm.in2_template = '... '
437 pm.out_template = ''
473 pm.out_template = ''
438
474
439 # Prompt separators like plain python
475 # Prompt separators like plain python
440 shell.separate_in = ''
476 shell.separate_in = ''
441 shell.separate_out = ''
477 shell.separate_out = ''
442 shell.separate_out2 = ''
478 shell.separate_out2 = ''
443
479
444 pm.justify = False
480 pm.justify = False
445
481
446 ptformatter.pprint = False
482 ptformatter.pprint = False
447 disp_formatter.active_types = ['text/plain']
483 disp_formatter.active_types = ['text/plain']
448
484
449 shell.magic('xmode Plain')
485 shell.magic('xmode Plain')
450 else:
486 else:
451 # turn off
487 # turn off
452 pm.in_template, pm.in2_template, pm.out_template = dstore.prompt_templates
488 pm.in_template, pm.in2_template, pm.out_template = dstore.prompt_templates
453
489
454 shell.separate_in = dstore.rc_separate_in
490 shell.separate_in = dstore.rc_separate_in
455
491
456 shell.separate_out = dstore.rc_separate_out
492 shell.separate_out = dstore.rc_separate_out
457 shell.separate_out2 = dstore.rc_separate_out2
493 shell.separate_out2 = dstore.rc_separate_out2
458
494
459 pm.justify = dstore.rc_prompts_pad_left
495 pm.justify = dstore.rc_prompts_pad_left
460
496
461 ptformatter.pprint = dstore.rc_pprint
497 ptformatter.pprint = dstore.rc_pprint
462 disp_formatter.active_types = dstore.rc_active_types
498 disp_formatter.active_types = dstore.rc_active_types
463
499
464 shell.magic('xmode ' + dstore.xmode)
500 shell.magic('xmode ' + dstore.xmode)
465
501
466 # Store new mode and inform
502 # Store new mode and inform
467 dstore.mode = bool(1-int(mode))
503 dstore.mode = bool(1-int(mode))
468 mode_label = ['OFF','ON'][dstore.mode]
504 mode_label = ['OFF','ON'][dstore.mode]
469 print('Doctest mode is:', mode_label)
505 print('Doctest mode is:', mode_label)
470
506
471 @line_magic
507 @line_magic
472 def gui(self, parameter_s=''):
508 def gui(self, parameter_s=''):
473 """Enable or disable IPython GUI event loop integration.
509 """Enable or disable IPython GUI event loop integration.
474
510
475 %gui [GUINAME]
511 %gui [GUINAME]
476
512
477 This magic replaces IPython's threaded shells that were activated
513 This magic replaces IPython's threaded shells that were activated
478 using the (pylab/wthread/etc.) command line flags. GUI toolkits
514 using the (pylab/wthread/etc.) command line flags. GUI toolkits
479 can now be enabled at runtime and keyboard
515 can now be enabled at runtime and keyboard
480 interrupts should work without any problems. The following toolkits
516 interrupts should work without any problems. The following toolkits
481 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
517 are supported: wxPython, PyQt4, PyGTK, Tk and Cocoa (OSX)::
482
518
483 %gui wx # enable wxPython event loop integration
519 %gui wx # enable wxPython event loop integration
484 %gui qt4|qt # enable PyQt4 event loop integration
520 %gui qt4|qt # enable PyQt4 event loop integration
485 %gui gtk # enable PyGTK event loop integration
521 %gui gtk # enable PyGTK event loop integration
486 %gui gtk3 # enable Gtk3 event loop integration
522 %gui gtk3 # enable Gtk3 event loop integration
487 %gui tk # enable Tk event loop integration
523 %gui tk # enable Tk event loop integration
488 %gui osx # enable Cocoa event loop integration
524 %gui osx # enable Cocoa event loop integration
489 # (requires %matplotlib 1.1)
525 # (requires %matplotlib 1.1)
490 %gui # disable all event loop integration
526 %gui # disable all event loop integration
491
527
492 WARNING: after any of these has been called you can simply create
528 WARNING: after any of these has been called you can simply create
493 an application object, but DO NOT start the event loop yourself, as
529 an application object, but DO NOT start the event loop yourself, as
494 we have already handled that.
530 we have already handled that.
495 """
531 """
496 opts, arg = self.parse_options(parameter_s, '')
532 opts, arg = self.parse_options(parameter_s, '')
497 if arg=='': arg = None
533 if arg=='': arg = None
498 try:
534 try:
499 return self.shell.enable_gui(arg)
535 return self.shell.enable_gui(arg)
500 except Exception as e:
536 except Exception as e:
501 # print simple error message, rather than traceback if we can't
537 # print simple error message, rather than traceback if we can't
502 # hook up the GUI
538 # hook up the GUI
503 error(str(e))
539 error(str(e))
504
540
505 @skip_doctest
541 @skip_doctest
506 @line_magic
542 @line_magic
507 def precision(self, s=''):
543 def precision(self, s=''):
508 """Set floating point precision for pretty printing.
544 """Set floating point precision for pretty printing.
509
545
510 Can set either integer precision or a format string.
546 Can set either integer precision or a format string.
511
547
512 If numpy has been imported and precision is an int,
548 If numpy has been imported and precision is an int,
513 numpy display precision will also be set, via ``numpy.set_printoptions``.
549 numpy display precision will also be set, via ``numpy.set_printoptions``.
514
550
515 If no argument is given, defaults will be restored.
551 If no argument is given, defaults will be restored.
516
552
517 Examples
553 Examples
518 --------
554 --------
519 ::
555 ::
520
556
521 In [1]: from math import pi
557 In [1]: from math import pi
522
558
523 In [2]: %precision 3
559 In [2]: %precision 3
524 Out[2]: u'%.3f'
560 Out[2]: u'%.3f'
525
561
526 In [3]: pi
562 In [3]: pi
527 Out[3]: 3.142
563 Out[3]: 3.142
528
564
529 In [4]: %precision %i
565 In [4]: %precision %i
530 Out[4]: u'%i'
566 Out[4]: u'%i'
531
567
532 In [5]: pi
568 In [5]: pi
533 Out[5]: 3
569 Out[5]: 3
534
570
535 In [6]: %precision %e
571 In [6]: %precision %e
536 Out[6]: u'%e'
572 Out[6]: u'%e'
537
573
538 In [7]: pi**10
574 In [7]: pi**10
539 Out[7]: 9.364805e+04
575 Out[7]: 9.364805e+04
540
576
541 In [8]: %precision
577 In [8]: %precision
542 Out[8]: u'%r'
578 Out[8]: u'%r'
543
579
544 In [9]: pi**10
580 In [9]: pi**10
545 Out[9]: 93648.047476082982
581 Out[9]: 93648.047476082982
546 """
582 """
547 ptformatter = self.shell.display_formatter.formatters['text/plain']
583 ptformatter = self.shell.display_formatter.formatters['text/plain']
548 ptformatter.float_precision = s
584 ptformatter.float_precision = s
549 return ptformatter.float_format
585 return ptformatter.float_format
550
586
551 @magic_arguments.magic_arguments()
587 @magic_arguments.magic_arguments()
552 @magic_arguments.argument(
588 @magic_arguments.argument(
553 '-e', '--export', action='store_true', default=False,
589 '-e', '--export', action='store_true', default=False,
554 help='Export IPython history as a notebook. The filename argument '
590 help='Export IPython history as a notebook. The filename argument '
555 'is used to specify the notebook name and format. For example '
591 'is used to specify the notebook name and format. For example '
556 'a filename of notebook.ipynb will result in a notebook name '
592 'a filename of notebook.ipynb will result in a notebook name '
557 'of "notebook" and a format of "json". Likewise using a ".py" '
593 'of "notebook" and a format of "json". Likewise using a ".py" '
558 'file extension will write the notebook as a Python script'
594 'file extension will write the notebook as a Python script'
559 )
595 )
560 @magic_arguments.argument(
596 @magic_arguments.argument(
561 '-f', '--format',
597 '-f', '--format',
562 help='Convert an existing IPython notebook to a new format. This option '
598 help='Convert an existing IPython notebook to a new format. This option '
563 'specifies the new format and can have the values: json, py. '
599 'specifies the new format and can have the values: json, py. '
564 'The target filename is chosen automatically based on the new '
600 'The target filename is chosen automatically based on the new '
565 'format. The filename argument gives the name of the source file.'
601 'format. The filename argument gives the name of the source file.'
566 )
602 )
567 @magic_arguments.argument(
603 @magic_arguments.argument(
568 'filename', type=unicode,
604 'filename', type=unicode,
569 help='Notebook name or filename'
605 help='Notebook name or filename'
570 )
606 )
571 @line_magic
607 @line_magic
572 def notebook(self, s):
608 def notebook(self, s):
573 """Export and convert IPython notebooks.
609 """Export and convert IPython notebooks.
574
610
575 This function can export the current IPython history to a notebook file
611 This function can export the current IPython history to a notebook file
576 or can convert an existing notebook file into a different format. For
612 or can convert an existing notebook file into a different format. For
577 example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
613 example, to export the history to "foo.ipynb" do "%notebook -e foo.ipynb".
578 To export the history to "foo.py" do "%notebook -e foo.py". To convert
614 To export the history to "foo.py" do "%notebook -e foo.py". To convert
579 "foo.ipynb" to "foo.json" do "%notebook -f json foo.ipynb". Possible
615 "foo.ipynb" to "foo.json" do "%notebook -f json foo.ipynb". Possible
580 formats include (json/ipynb, py).
616 formats include (json/ipynb, py).
581 """
617 """
582 args = magic_arguments.parse_argstring(self.notebook, s)
618 args = magic_arguments.parse_argstring(self.notebook, s)
583
619
584 from IPython.nbformat import current
620 from IPython.nbformat import current
585 args.filename = unquote_filename(args.filename)
621 args.filename = unquote_filename(args.filename)
586 if args.export:
622 if args.export:
587 fname, name, format = current.parse_filename(args.filename)
623 fname, name, format = current.parse_filename(args.filename)
588 cells = []
624 cells = []
589 hist = list(self.shell.history_manager.get_range())
625 hist = list(self.shell.history_manager.get_range())
590 for session, prompt_number, input in hist[:-1]:
626 for session, prompt_number, input in hist[:-1]:
591 cells.append(current.new_code_cell(prompt_number=prompt_number,
627 cells.append(current.new_code_cell(prompt_number=prompt_number,
592 input=input))
628 input=input))
593 worksheet = current.new_worksheet(cells=cells)
629 worksheet = current.new_worksheet(cells=cells)
594 nb = current.new_notebook(name=name,worksheets=[worksheet])
630 nb = current.new_notebook(name=name,worksheets=[worksheet])
595 with io.open(fname, 'w', encoding='utf-8') as f:
631 with io.open(fname, 'w', encoding='utf-8') as f:
596 current.write(nb, f, format);
632 current.write(nb, f, format);
597 elif args.format is not None:
633 elif args.format is not None:
598 old_fname, old_name, old_format = current.parse_filename(args.filename)
634 old_fname, old_name, old_format = current.parse_filename(args.filename)
599 new_format = args.format
635 new_format = args.format
600 if new_format == u'xml':
636 if new_format == u'xml':
601 raise ValueError('Notebooks cannot be written as xml.')
637 raise ValueError('Notebooks cannot be written as xml.')
602 elif new_format == u'ipynb' or new_format == u'json':
638 elif new_format == u'ipynb' or new_format == u'json':
603 new_fname = old_name + u'.ipynb'
639 new_fname = old_name + u'.ipynb'
604 new_format = u'json'
640 new_format = u'json'
605 elif new_format == u'py':
641 elif new_format == u'py':
606 new_fname = old_name + u'.py'
642 new_fname = old_name + u'.py'
607 else:
643 else:
608 raise ValueError('Invalid notebook format: %s' % new_format)
644 raise ValueError('Invalid notebook format: %s' % new_format)
609 with io.open(old_fname, 'r', encoding='utf-8') as f:
645 with io.open(old_fname, 'r', encoding='utf-8') as f:
610 nb = current.read(f, old_format)
646 nb = current.read(f, old_format)
611 with io.open(new_fname, 'w', encoding='utf-8') as f:
647 with io.open(new_fname, 'w', encoding='utf-8') as f:
612 current.write(nb, f, new_format)
648 current.write(nb, f, new_format)
@@ -1,580 +1,649 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Tests for the key interactiveshell module.
2 """Tests for the key interactiveshell module.
3
3
4 Historically the main classes in interactiveshell have been under-tested. This
4 Historically the main classes in interactiveshell have been under-tested. This
5 module should grow as many single-method tests as possible to trap many of the
5 module should grow as many single-method tests as possible to trap many of the
6 recurring bugs we seem to encounter with high-level interaction.
6 recurring bugs we seem to encounter with high-level interaction.
7
7
8 Authors
8 Authors
9 -------
9 -------
10 * Fernando Perez
10 * Fernando Perez
11 """
11 """
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 # Copyright (C) 2011 The IPython Development Team
13 # Copyright (C) 2011 The IPython Development Team
14 #
14 #
15 # Distributed under the terms of the BSD License. The full license is in
15 # Distributed under the terms of the BSD License. The full license is in
16 # the file COPYING, distributed as part of this software.
16 # the file COPYING, distributed as part of this software.
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20 # Imports
20 # Imports
21 #-----------------------------------------------------------------------------
21 #-----------------------------------------------------------------------------
22 # stdlib
22 # stdlib
23 import ast
23 import ast
24 import os
24 import os
25 import shutil
25 import shutil
26 import sys
26 import sys
27 import tempfile
27 import tempfile
28 import unittest
28 import unittest
29 from os.path import join
29 from os.path import join
30 from StringIO import StringIO
30 from StringIO import StringIO
31
31
32 # third-party
32 # third-party
33 import nose.tools as nt
33 import nose.tools as nt
34
34
35 # Our own
35 # Our own
36 from IPython.testing.decorators import skipif
36 from IPython.testing.decorators import skipif
37 from IPython.testing import tools as tt
37 from IPython.testing import tools as tt
38 from IPython.utils import io
38 from IPython.utils import io
39
39
40 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
41 # Globals
41 # Globals
42 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
43 # This is used by every single test, no point repeating it ad nauseam
43 # This is used by every single test, no point repeating it ad nauseam
44 ip = get_ipython()
44 ip = get_ipython()
45
45
46 #-----------------------------------------------------------------------------
46 #-----------------------------------------------------------------------------
47 # Tests
47 # Tests
48 #-----------------------------------------------------------------------------
48 #-----------------------------------------------------------------------------
49
49
50 class InteractiveShellTestCase(unittest.TestCase):
50 class InteractiveShellTestCase(unittest.TestCase):
51 def test_naked_string_cells(self):
51 def test_naked_string_cells(self):
52 """Test that cells with only naked strings are fully executed"""
52 """Test that cells with only naked strings are fully executed"""
53 # First, single-line inputs
53 # First, single-line inputs
54 ip.run_cell('"a"\n')
54 ip.run_cell('"a"\n')
55 self.assertEqual(ip.user_ns['_'], 'a')
55 self.assertEqual(ip.user_ns['_'], 'a')
56 # And also multi-line cells
56 # And also multi-line cells
57 ip.run_cell('"""a\nb"""\n')
57 ip.run_cell('"""a\nb"""\n')
58 self.assertEqual(ip.user_ns['_'], 'a\nb')
58 self.assertEqual(ip.user_ns['_'], 'a\nb')
59
59
60 def test_run_empty_cell(self):
60 def test_run_empty_cell(self):
61 """Just make sure we don't get a horrible error with a blank
61 """Just make sure we don't get a horrible error with a blank
62 cell of input. Yes, I did overlook that."""
62 cell of input. Yes, I did overlook that."""
63 old_xc = ip.execution_count
63 old_xc = ip.execution_count
64 ip.run_cell('')
64 ip.run_cell('')
65 self.assertEqual(ip.execution_count, old_xc)
65 self.assertEqual(ip.execution_count, old_xc)
66
66
67 def test_run_cell_multiline(self):
67 def test_run_cell_multiline(self):
68 """Multi-block, multi-line cells must execute correctly.
68 """Multi-block, multi-line cells must execute correctly.
69 """
69 """
70 src = '\n'.join(["x=1",
70 src = '\n'.join(["x=1",
71 "y=2",
71 "y=2",
72 "if 1:",
72 "if 1:",
73 " x += 1",
73 " x += 1",
74 " y += 1",])
74 " y += 1",])
75 ip.run_cell(src)
75 ip.run_cell(src)
76 self.assertEqual(ip.user_ns['x'], 2)
76 self.assertEqual(ip.user_ns['x'], 2)
77 self.assertEqual(ip.user_ns['y'], 3)
77 self.assertEqual(ip.user_ns['y'], 3)
78
78
79 def test_multiline_string_cells(self):
79 def test_multiline_string_cells(self):
80 "Code sprinkled with multiline strings should execute (GH-306)"
80 "Code sprinkled with multiline strings should execute (GH-306)"
81 ip.run_cell('tmp=0')
81 ip.run_cell('tmp=0')
82 self.assertEqual(ip.user_ns['tmp'], 0)
82 self.assertEqual(ip.user_ns['tmp'], 0)
83 ip.run_cell('tmp=1;"""a\nb"""\n')
83 ip.run_cell('tmp=1;"""a\nb"""\n')
84 self.assertEqual(ip.user_ns['tmp'], 1)
84 self.assertEqual(ip.user_ns['tmp'], 1)
85
85
86 def test_dont_cache_with_semicolon(self):
86 def test_dont_cache_with_semicolon(self):
87 "Ending a line with semicolon should not cache the returned object (GH-307)"
87 "Ending a line with semicolon should not cache the returned object (GH-307)"
88 oldlen = len(ip.user_ns['Out'])
88 oldlen = len(ip.user_ns['Out'])
89 a = ip.run_cell('1;', store_history=True)
89 a = ip.run_cell('1;', store_history=True)
90 newlen = len(ip.user_ns['Out'])
90 newlen = len(ip.user_ns['Out'])
91 self.assertEqual(oldlen, newlen)
91 self.assertEqual(oldlen, newlen)
92 #also test the default caching behavior
92 #also test the default caching behavior
93 ip.run_cell('1', store_history=True)
93 ip.run_cell('1', store_history=True)
94 newlen = len(ip.user_ns['Out'])
94 newlen = len(ip.user_ns['Out'])
95 self.assertEqual(oldlen+1, newlen)
95 self.assertEqual(oldlen+1, newlen)
96
96
97 def test_In_variable(self):
97 def test_In_variable(self):
98 "Verify that In variable grows with user input (GH-284)"
98 "Verify that In variable grows with user input (GH-284)"
99 oldlen = len(ip.user_ns['In'])
99 oldlen = len(ip.user_ns['In'])
100 ip.run_cell('1;', store_history=True)
100 ip.run_cell('1;', store_history=True)
101 newlen = len(ip.user_ns['In'])
101 newlen = len(ip.user_ns['In'])
102 self.assertEqual(oldlen+1, newlen)
102 self.assertEqual(oldlen+1, newlen)
103 self.assertEqual(ip.user_ns['In'][-1],'1;')
103 self.assertEqual(ip.user_ns['In'][-1],'1;')
104
104
105 def test_magic_names_in_string(self):
105 def test_magic_names_in_string(self):
106 ip.run_cell('a = """\n%exit\n"""')
106 ip.run_cell('a = """\n%exit\n"""')
107 self.assertEqual(ip.user_ns['a'], '\n%exit\n')
107 self.assertEqual(ip.user_ns['a'], '\n%exit\n')
108
108
109 def test_alias_crash(self):
109 def test_alias_crash(self):
110 """Errors in prefilter can't crash IPython"""
110 """Errors in prefilter can't crash IPython"""
111 ip.run_cell('%alias parts echo first %s second %s')
111 ip.run_cell('%alias parts echo first %s second %s')
112 # capture stderr:
112 # capture stderr:
113 save_err = io.stderr
113 save_err = io.stderr
114 io.stderr = StringIO()
114 io.stderr = StringIO()
115 ip.run_cell('parts 1')
115 ip.run_cell('parts 1')
116 err = io.stderr.getvalue()
116 err = io.stderr.getvalue()
117 io.stderr = save_err
117 io.stderr = save_err
118 self.assertEqual(err.split(':')[0], 'ERROR')
118 self.assertEqual(err.split(':')[0], 'ERROR')
119
119
120 def test_trailing_newline(self):
120 def test_trailing_newline(self):
121 """test that running !(command) does not raise a SyntaxError"""
121 """test that running !(command) does not raise a SyntaxError"""
122 ip.run_cell('!(true)\n', False)
122 ip.run_cell('!(true)\n', False)
123 ip.run_cell('!(true)\n\n\n', False)
123 ip.run_cell('!(true)\n\n\n', False)
124
124
125 def test_gh_597(self):
125 def test_gh_597(self):
126 """Pretty-printing lists of objects with non-ascii reprs may cause
126 """Pretty-printing lists of objects with non-ascii reprs may cause
127 problems."""
127 problems."""
128 class Spam(object):
128 class Spam(object):
129 def __repr__(self):
129 def __repr__(self):
130 return "\xe9"*50
130 return "\xe9"*50
131 import IPython.core.formatters
131 import IPython.core.formatters
132 f = IPython.core.formatters.PlainTextFormatter()
132 f = IPython.core.formatters.PlainTextFormatter()
133 f([Spam(),Spam()])
133 f([Spam(),Spam()])
134
134
135
135
136 def test_future_flags(self):
136 def test_future_flags(self):
137 """Check that future flags are used for parsing code (gh-777)"""
137 """Check that future flags are used for parsing code (gh-777)"""
138 ip.run_cell('from __future__ import print_function')
138 ip.run_cell('from __future__ import print_function')
139 try:
139 try:
140 ip.run_cell('prfunc_return_val = print(1,2, sep=" ")')
140 ip.run_cell('prfunc_return_val = print(1,2, sep=" ")')
141 assert 'prfunc_return_val' in ip.user_ns
141 assert 'prfunc_return_val' in ip.user_ns
142 finally:
142 finally:
143 # Reset compiler flags so we don't mess up other tests.
143 # Reset compiler flags so we don't mess up other tests.
144 ip.compile.reset_compiler_flags()
144 ip.compile.reset_compiler_flags()
145
145
146 def test_future_unicode(self):
146 def test_future_unicode(self):
147 """Check that unicode_literals is imported from __future__ (gh #786)"""
147 """Check that unicode_literals is imported from __future__ (gh #786)"""
148 try:
148 try:
149 ip.run_cell(u'byte_str = "a"')
149 ip.run_cell(u'byte_str = "a"')
150 assert isinstance(ip.user_ns['byte_str'], str) # string literals are byte strings by default
150 assert isinstance(ip.user_ns['byte_str'], str) # string literals are byte strings by default
151 ip.run_cell('from __future__ import unicode_literals')
151 ip.run_cell('from __future__ import unicode_literals')
152 ip.run_cell(u'unicode_str = "a"')
152 ip.run_cell(u'unicode_str = "a"')
153 assert isinstance(ip.user_ns['unicode_str'], unicode) # strings literals are now unicode
153 assert isinstance(ip.user_ns['unicode_str'], unicode) # strings literals are now unicode
154 finally:
154 finally:
155 # Reset compiler flags so we don't mess up other tests.
155 # Reset compiler flags so we don't mess up other tests.
156 ip.compile.reset_compiler_flags()
156 ip.compile.reset_compiler_flags()
157
157
158 def test_can_pickle(self):
158 def test_can_pickle(self):
159 "Can we pickle objects defined interactively (GH-29)"
159 "Can we pickle objects defined interactively (GH-29)"
160 ip = get_ipython()
160 ip = get_ipython()
161 ip.reset()
161 ip.reset()
162 ip.run_cell(("class Mylist(list):\n"
162 ip.run_cell(("class Mylist(list):\n"
163 " def __init__(self,x=[]):\n"
163 " def __init__(self,x=[]):\n"
164 " list.__init__(self,x)"))
164 " list.__init__(self,x)"))
165 ip.run_cell("w=Mylist([1,2,3])")
165 ip.run_cell("w=Mylist([1,2,3])")
166
166
167 from cPickle import dumps
167 from cPickle import dumps
168
168
169 # We need to swap in our main module - this is only necessary
169 # We need to swap in our main module - this is only necessary
170 # inside the test framework, because IPython puts the interactive module
170 # inside the test framework, because IPython puts the interactive module
171 # in place (but the test framework undoes this).
171 # in place (but the test framework undoes this).
172 _main = sys.modules['__main__']
172 _main = sys.modules['__main__']
173 sys.modules['__main__'] = ip.user_module
173 sys.modules['__main__'] = ip.user_module
174 try:
174 try:
175 res = dumps(ip.user_ns["w"])
175 res = dumps(ip.user_ns["w"])
176 finally:
176 finally:
177 sys.modules['__main__'] = _main
177 sys.modules['__main__'] = _main
178 self.assertTrue(isinstance(res, bytes))
178 self.assertTrue(isinstance(res, bytes))
179
179
180 def test_global_ns(self):
180 def test_global_ns(self):
181 "Code in functions must be able to access variables outside them."
181 "Code in functions must be able to access variables outside them."
182 ip = get_ipython()
182 ip = get_ipython()
183 ip.run_cell("a = 10")
183 ip.run_cell("a = 10")
184 ip.run_cell(("def f(x):\n"
184 ip.run_cell(("def f(x):\n"
185 " return x + a"))
185 " return x + a"))
186 ip.run_cell("b = f(12)")
186 ip.run_cell("b = f(12)")
187 self.assertEqual(ip.user_ns["b"], 22)
187 self.assertEqual(ip.user_ns["b"], 22)
188
188
189 def test_bad_custom_tb(self):
189 def test_bad_custom_tb(self):
190 """Check that InteractiveShell is protected from bad custom exception handlers"""
190 """Check that InteractiveShell is protected from bad custom exception handlers"""
191 from IPython.utils import io
191 from IPython.utils import io
192 save_stderr = io.stderr
192 save_stderr = io.stderr
193 try:
193 try:
194 # capture stderr
194 # capture stderr
195 io.stderr = StringIO()
195 io.stderr = StringIO()
196 ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0)
196 ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0)
197 self.assertEqual(ip.custom_exceptions, (IOError,))
197 self.assertEqual(ip.custom_exceptions, (IOError,))
198 ip.run_cell(u'raise IOError("foo")')
198 ip.run_cell(u'raise IOError("foo")')
199 self.assertEqual(ip.custom_exceptions, ())
199 self.assertEqual(ip.custom_exceptions, ())
200 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
200 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
201 finally:
201 finally:
202 io.stderr = save_stderr
202 io.stderr = save_stderr
203
203
204 def test_bad_custom_tb_return(self):
204 def test_bad_custom_tb_return(self):
205 """Check that InteractiveShell is protected from bad return types in custom exception handlers"""
205 """Check that InteractiveShell is protected from bad return types in custom exception handlers"""
206 from IPython.utils import io
206 from IPython.utils import io
207 save_stderr = io.stderr
207 save_stderr = io.stderr
208 try:
208 try:
209 # capture stderr
209 # capture stderr
210 io.stderr = StringIO()
210 io.stderr = StringIO()
211 ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1)
211 ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1)
212 self.assertEqual(ip.custom_exceptions, (NameError,))
212 self.assertEqual(ip.custom_exceptions, (NameError,))
213 ip.run_cell(u'a=abracadabra')
213 ip.run_cell(u'a=abracadabra')
214 self.assertEqual(ip.custom_exceptions, ())
214 self.assertEqual(ip.custom_exceptions, ())
215 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
215 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
216 finally:
216 finally:
217 io.stderr = save_stderr
217 io.stderr = save_stderr
218
218
219 def test_drop_by_id(self):
219 def test_drop_by_id(self):
220 myvars = {"a":object(), "b":object(), "c": object()}
220 myvars = {"a":object(), "b":object(), "c": object()}
221 ip.push(myvars, interactive=False)
221 ip.push(myvars, interactive=False)
222 for name in myvars:
222 for name in myvars:
223 assert name in ip.user_ns, name
223 assert name in ip.user_ns, name
224 assert name in ip.user_ns_hidden, name
224 assert name in ip.user_ns_hidden, name
225 ip.user_ns['b'] = 12
225 ip.user_ns['b'] = 12
226 ip.drop_by_id(myvars)
226 ip.drop_by_id(myvars)
227 for name in ["a", "c"]:
227 for name in ["a", "c"]:
228 assert name not in ip.user_ns, name
228 assert name not in ip.user_ns, name
229 assert name not in ip.user_ns_hidden, name
229 assert name not in ip.user_ns_hidden, name
230 assert ip.user_ns['b'] == 12
230 assert ip.user_ns['b'] == 12
231 ip.reset()
231 ip.reset()
232
232
233 def test_var_expand(self):
233 def test_var_expand(self):
234 ip.user_ns['f'] = u'Ca\xf1o'
234 ip.user_ns['f'] = u'Ca\xf1o'
235 self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o')
235 self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o')
236 self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o')
236 self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o')
237 self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1')
237 self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1')
238 self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2')
238 self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2')
239
239
240 ip.user_ns['f'] = b'Ca\xc3\xb1o'
240 ip.user_ns['f'] = b'Ca\xc3\xb1o'
241 # This should not raise any exception:
241 # This should not raise any exception:
242 ip.var_expand(u'echo $f')
242 ip.var_expand(u'echo $f')
243
243
244 def test_var_expand_local(self):
244 def test_var_expand_local(self):
245 """Test local variable expansion in !system and %magic calls"""
245 """Test local variable expansion in !system and %magic calls"""
246 # !system
246 # !system
247 ip.run_cell('def test():\n'
247 ip.run_cell('def test():\n'
248 ' lvar = "ttt"\n'
248 ' lvar = "ttt"\n'
249 ' ret = !echo {lvar}\n'
249 ' ret = !echo {lvar}\n'
250 ' return ret[0]\n')
250 ' return ret[0]\n')
251 res = ip.user_ns['test']()
251 res = ip.user_ns['test']()
252 nt.assert_in('ttt', res)
252 nt.assert_in('ttt', res)
253
253
254 # %magic
254 # %magic
255 ip.run_cell('def makemacro():\n'
255 ip.run_cell('def makemacro():\n'
256 ' macroname = "macro_var_expand_locals"\n'
256 ' macroname = "macro_var_expand_locals"\n'
257 ' %macro {macroname} codestr\n')
257 ' %macro {macroname} codestr\n')
258 ip.user_ns['codestr'] = "str(12)"
258 ip.user_ns['codestr'] = "str(12)"
259 ip.run_cell('makemacro()')
259 ip.run_cell('makemacro()')
260 nt.assert_in('macro_var_expand_locals', ip.user_ns)
260 nt.assert_in('macro_var_expand_locals', ip.user_ns)
261
261
262 def test_var_expand_self(self):
262 def test_var_expand_self(self):
263 """Test variable expansion with the name 'self', which was failing.
263 """Test variable expansion with the name 'self', which was failing.
264
264
265 See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218
265 See https://github.com/ipython/ipython/issues/1878#issuecomment-7698218
266 """
266 """
267 ip.run_cell('class cTest:\n'
267 ip.run_cell('class cTest:\n'
268 ' classvar="see me"\n'
268 ' classvar="see me"\n'
269 ' def test(self):\n'
269 ' def test(self):\n'
270 ' res = !echo Variable: {self.classvar}\n'
270 ' res = !echo Variable: {self.classvar}\n'
271 ' return res[0]\n')
271 ' return res[0]\n')
272 nt.assert_in('see me', ip.user_ns['cTest']().test())
272 nt.assert_in('see me', ip.user_ns['cTest']().test())
273
273
274 def test_bad_var_expand(self):
274 def test_bad_var_expand(self):
275 """var_expand on invalid formats shouldn't raise"""
275 """var_expand on invalid formats shouldn't raise"""
276 # SyntaxError
276 # SyntaxError
277 self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}")
277 self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}")
278 # NameError
278 # NameError
279 self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}")
279 self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}")
280 # ZeroDivisionError
280 # ZeroDivisionError
281 self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}")
281 self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}")
282
282
283 def test_silent_nopostexec(self):
283 def test_silent_nopostexec(self):
284 """run_cell(silent=True) doesn't invoke post-exec funcs"""
284 """run_cell(silent=True) doesn't invoke post-exec funcs"""
285 d = dict(called=False)
285 d = dict(called=False)
286 def set_called():
286 def set_called():
287 d['called'] = True
287 d['called'] = True
288
288
289 ip.register_post_execute(set_called)
289 ip.register_post_execute(set_called)
290 ip.run_cell("1", silent=True)
290 ip.run_cell("1", silent=True)
291 self.assertFalse(d['called'])
291 self.assertFalse(d['called'])
292 # double-check that non-silent exec did what we expected
292 # double-check that non-silent exec did what we expected
293 # silent to avoid
293 # silent to avoid
294 ip.run_cell("1")
294 ip.run_cell("1")
295 self.assertTrue(d['called'])
295 self.assertTrue(d['called'])
296 # remove post-exec
296 # remove post-exec
297 ip._post_execute.pop(set_called)
297 ip._post_execute.pop(set_called)
298
298
299 def test_silent_noadvance(self):
299 def test_silent_noadvance(self):
300 """run_cell(silent=True) doesn't advance execution_count"""
300 """run_cell(silent=True) doesn't advance execution_count"""
301 ec = ip.execution_count
301 ec = ip.execution_count
302 # silent should force store_history=False
302 # silent should force store_history=False
303 ip.run_cell("1", store_history=True, silent=True)
303 ip.run_cell("1", store_history=True, silent=True)
304
304
305 self.assertEqual(ec, ip.execution_count)
305 self.assertEqual(ec, ip.execution_count)
306 # double-check that non-silent exec did what we expected
306 # double-check that non-silent exec did what we expected
307 # silent to avoid
307 # silent to avoid
308 ip.run_cell("1", store_history=True)
308 ip.run_cell("1", store_history=True)
309 self.assertEqual(ec+1, ip.execution_count)
309 self.assertEqual(ec+1, ip.execution_count)
310
310
311 def test_silent_nodisplayhook(self):
311 def test_silent_nodisplayhook(self):
312 """run_cell(silent=True) doesn't trigger displayhook"""
312 """run_cell(silent=True) doesn't trigger displayhook"""
313 d = dict(called=False)
313 d = dict(called=False)
314
314
315 trap = ip.display_trap
315 trap = ip.display_trap
316 save_hook = trap.hook
316 save_hook = trap.hook
317
317
318 def failing_hook(*args, **kwargs):
318 def failing_hook(*args, **kwargs):
319 d['called'] = True
319 d['called'] = True
320
320
321 try:
321 try:
322 trap.hook = failing_hook
322 trap.hook = failing_hook
323 ip.run_cell("1", silent=True)
323 ip.run_cell("1", silent=True)
324 self.assertFalse(d['called'])
324 self.assertFalse(d['called'])
325 # double-check that non-silent exec did what we expected
325 # double-check that non-silent exec did what we expected
326 # silent to avoid
326 # silent to avoid
327 ip.run_cell("1")
327 ip.run_cell("1")
328 self.assertTrue(d['called'])
328 self.assertTrue(d['called'])
329 finally:
329 finally:
330 trap.hook = save_hook
330 trap.hook = save_hook
331
331
332 @skipif(sys.version_info[0] >= 3, "softspace removed in py3")
332 @skipif(sys.version_info[0] >= 3, "softspace removed in py3")
333 def test_print_softspace(self):
333 def test_print_softspace(self):
334 """Verify that softspace is handled correctly when executing multiple
334 """Verify that softspace is handled correctly when executing multiple
335 statements.
335 statements.
336
336
337 In [1]: print 1; print 2
337 In [1]: print 1; print 2
338 1
338 1
339 2
339 2
340
340
341 In [2]: print 1,; print 2
341 In [2]: print 1,; print 2
342 1 2
342 1 2
343 """
343 """
344
344
345 def test_ofind_line_magic(self):
345 def test_ofind_line_magic(self):
346 from IPython.core.magic import register_line_magic
346 from IPython.core.magic import register_line_magic
347
347
348 @register_line_magic
348 @register_line_magic
349 def lmagic(line):
349 def lmagic(line):
350 "A line magic"
350 "A line magic"
351
351
352 # Get info on line magic
352 # Get info on line magic
353 lfind = ip._ofind('lmagic')
353 lfind = ip._ofind('lmagic')
354 info = dict(found=True, isalias=False, ismagic=True,
354 info = dict(found=True, isalias=False, ismagic=True,
355 namespace = 'IPython internal', obj= lmagic.__wrapped__,
355 namespace = 'IPython internal', obj= lmagic.__wrapped__,
356 parent = None)
356 parent = None)
357 nt.assert_equal(lfind, info)
357 nt.assert_equal(lfind, info)
358
358
359 def test_ofind_cell_magic(self):
359 def test_ofind_cell_magic(self):
360 from IPython.core.magic import register_cell_magic
360 from IPython.core.magic import register_cell_magic
361
361
362 @register_cell_magic
362 @register_cell_magic
363 def cmagic(line, cell):
363 def cmagic(line, cell):
364 "A cell magic"
364 "A cell magic"
365
365
366 # Get info on cell magic
366 # Get info on cell magic
367 find = ip._ofind('cmagic')
367 find = ip._ofind('cmagic')
368 info = dict(found=True, isalias=False, ismagic=True,
368 info = dict(found=True, isalias=False, ismagic=True,
369 namespace = 'IPython internal', obj= cmagic.__wrapped__,
369 namespace = 'IPython internal', obj= cmagic.__wrapped__,
370 parent = None)
370 parent = None)
371 nt.assert_equal(find, info)
371 nt.assert_equal(find, info)
372
372
373 def test_custom_exception(self):
373 def test_custom_exception(self):
374 called = []
374 called = []
375 def my_handler(shell, etype, value, tb, tb_offset=None):
375 def my_handler(shell, etype, value, tb, tb_offset=None):
376 called.append(etype)
376 called.append(etype)
377 shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
377 shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
378
378
379 ip.set_custom_exc((ValueError,), my_handler)
379 ip.set_custom_exc((ValueError,), my_handler)
380 try:
380 try:
381 ip.run_cell("raise ValueError('test')")
381 ip.run_cell("raise ValueError('test')")
382 # Check that this was called, and only once.
382 # Check that this was called, and only once.
383 self.assertEqual(called, [ValueError])
383 self.assertEqual(called, [ValueError])
384 finally:
384 finally:
385 # Reset the custom exception hook
385 # Reset the custom exception hook
386 ip.set_custom_exc((), None)
386 ip.set_custom_exc((), None)
387
387
388 @skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
388 @skipif(sys.version_info[0] >= 3, "no differences with __future__ in py3")
389 def test_future_environment(self):
389 def test_future_environment(self):
390 "Can we run code with & without the shell's __future__ imports?"
390 "Can we run code with & without the shell's __future__ imports?"
391 ip.run_cell("from __future__ import division")
391 ip.run_cell("from __future__ import division")
392 ip.run_cell("a = 1/2", shell_futures=True)
392 ip.run_cell("a = 1/2", shell_futures=True)
393 self.assertEqual(ip.user_ns['a'], 0.5)
393 self.assertEqual(ip.user_ns['a'], 0.5)
394 ip.run_cell("b = 1/2", shell_futures=False)
394 ip.run_cell("b = 1/2", shell_futures=False)
395 self.assertEqual(ip.user_ns['b'], 0)
395 self.assertEqual(ip.user_ns['b'], 0)
396
396
397 ip.compile.reset_compiler_flags()
397 ip.compile.reset_compiler_flags()
398 # This shouldn't leak to the shell's compiler
398 # This shouldn't leak to the shell's compiler
399 ip.run_cell("from __future__ import division \nc=1/2", shell_futures=False)
399 ip.run_cell("from __future__ import division \nc=1/2", shell_futures=False)
400 self.assertEqual(ip.user_ns['c'], 0.5)
400 self.assertEqual(ip.user_ns['c'], 0.5)
401 ip.run_cell("d = 1/2", shell_futures=True)
401 ip.run_cell("d = 1/2", shell_futures=True)
402 self.assertEqual(ip.user_ns['d'], 0)
402 self.assertEqual(ip.user_ns['d'], 0)
403
403
404
404
405 class TestSafeExecfileNonAsciiPath(unittest.TestCase):
405 class TestSafeExecfileNonAsciiPath(unittest.TestCase):
406
406
407 def setUp(self):
407 def setUp(self):
408 self.BASETESTDIR = tempfile.mkdtemp()
408 self.BASETESTDIR = tempfile.mkdtemp()
409 self.TESTDIR = join(self.BASETESTDIR, u"Γ₯Àâ")
409 self.TESTDIR = join(self.BASETESTDIR, u"Γ₯Àâ")
410 os.mkdir(self.TESTDIR)
410 os.mkdir(self.TESTDIR)
411 with open(join(self.TESTDIR, u"Γ₯Àâtestscript.py"), "w") as sfile:
411 with open(join(self.TESTDIR, u"Γ₯Àâtestscript.py"), "w") as sfile:
412 sfile.write("pass\n")
412 sfile.write("pass\n")
413 self.oldpath = os.getcwdu()
413 self.oldpath = os.getcwdu()
414 os.chdir(self.TESTDIR)
414 os.chdir(self.TESTDIR)
415 self.fname = u"Γ₯Àâtestscript.py"
415 self.fname = u"Γ₯Àâtestscript.py"
416
416
417 def tearDown(self):
417 def tearDown(self):
418 os.chdir(self.oldpath)
418 os.chdir(self.oldpath)
419 shutil.rmtree(self.BASETESTDIR)
419 shutil.rmtree(self.BASETESTDIR)
420
420
421 def test_1(self):
421 def test_1(self):
422 """Test safe_execfile with non-ascii path
422 """Test safe_execfile with non-ascii path
423 """
423 """
424 ip.safe_execfile(self.fname, {}, raise_exceptions=True)
424 ip.safe_execfile(self.fname, {}, raise_exceptions=True)
425
425
426
426
427 class TestSystemRaw(unittest.TestCase):
427 class TestSystemRaw(unittest.TestCase):
428 def test_1(self):
428 def test_1(self):
429 """Test system_raw with non-ascii cmd
429 """Test system_raw with non-ascii cmd
430 """
430 """
431 cmd = ur'''python -c "'Γ₯Àâ'" '''
431 cmd = ur'''python -c "'Γ₯Àâ'" '''
432 ip.system_raw(cmd)
432 ip.system_raw(cmd)
433
433
434 def test_exit_code(self):
434 def test_exit_code(self):
435 """Test that the exit code is parsed correctly."""
435 """Test that the exit code is parsed correctly."""
436 ip.system_raw('exit 1')
436 ip.system_raw('exit 1')
437 self.assertEqual(ip.user_ns['_exit_code'], 1)
437 self.assertEqual(ip.user_ns['_exit_code'], 1)
438
438
439 class TestModules(unittest.TestCase, tt.TempFileMixin):
439 class TestModules(unittest.TestCase, tt.TempFileMixin):
440 def test_extraneous_loads(self):
440 def test_extraneous_loads(self):
441 """Test we're not loading modules on startup that we shouldn't.
441 """Test we're not loading modules on startup that we shouldn't.
442 """
442 """
443 self.mktmp("import sys\n"
443 self.mktmp("import sys\n"
444 "print('numpy' in sys.modules)\n"
444 "print('numpy' in sys.modules)\n"
445 "print('IPython.parallel' in sys.modules)\n"
445 "print('IPython.parallel' in sys.modules)\n"
446 "print('IPython.kernel.zmq' in sys.modules)\n"
446 "print('IPython.kernel.zmq' in sys.modules)\n"
447 )
447 )
448 out = "False\nFalse\nFalse\n"
448 out = "False\nFalse\nFalse\n"
449 tt.ipexec_validate(self.fname, out)
449 tt.ipexec_validate(self.fname, out)
450
450
451 class Negator(ast.NodeTransformer):
451 class Negator(ast.NodeTransformer):
452 """Negates all number literals in an AST."""
452 """Negates all number literals in an AST."""
453 def visit_Num(self, node):
453 def visit_Num(self, node):
454 node.n = -node.n
454 node.n = -node.n
455 return node
455 return node
456
456
457 class TestAstTransform(unittest.TestCase):
457 class TestAstTransform(unittest.TestCase):
458 def setUp(self):
458 def setUp(self):
459 self.negator = Negator()
459 self.negator = Negator()
460 ip.ast_transformers.append(self.negator)
460 ip.ast_transformers.append(self.negator)
461
461
462 def tearDown(self):
462 def tearDown(self):
463 ip.ast_transformers.remove(self.negator)
463 ip.ast_transformers.remove(self.negator)
464
464
465 def test_run_cell(self):
465 def test_run_cell(self):
466 with tt.AssertPrints('-34'):
466 with tt.AssertPrints('-34'):
467 ip.run_cell('print (12 + 22)')
467 ip.run_cell('print (12 + 22)')
468
468
469 # A named reference to a number shouldn't be transformed.
469 # A named reference to a number shouldn't be transformed.
470 ip.user_ns['n'] = 55
470 ip.user_ns['n'] = 55
471 with tt.AssertNotPrints('-55'):
471 with tt.AssertNotPrints('-55'):
472 ip.run_cell('print (n)')
472 ip.run_cell('print (n)')
473
473
474 def test_timeit(self):
474 def test_timeit(self):
475 called = set()
475 called = set()
476 def f(x):
476 def f(x):
477 called.add(x)
477 called.add(x)
478 ip.push({'f':f})
478 ip.push({'f':f})
479
479
480 with tt.AssertPrints("best of "):
480 with tt.AssertPrints("best of "):
481 ip.run_line_magic("timeit", "-n1 f(1)")
481 ip.run_line_magic("timeit", "-n1 f(1)")
482 self.assertEqual(called, set([-1]))
482 self.assertEqual(called, set([-1]))
483 called.clear()
483 called.clear()
484
484
485 with tt.AssertPrints("best of "):
485 with tt.AssertPrints("best of "):
486 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
486 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
487 self.assertEqual(called, set([-2, -3]))
487 self.assertEqual(called, set([-2, -3]))
488
488
489 def test_time(self):
489 def test_time(self):
490 called = []
490 called = []
491 def f(x):
491 def f(x):
492 called.append(x)
492 called.append(x)
493 ip.push({'f':f})
493 ip.push({'f':f})
494
494
495 # Test with an expression
495 # Test with an expression
496 with tt.AssertPrints("Wall time: "):
496 with tt.AssertPrints("Wall time: "):
497 ip.run_line_magic("time", "f(5+9)")
497 ip.run_line_magic("time", "f(5+9)")
498 self.assertEqual(called, [-14])
498 self.assertEqual(called, [-14])
499 called[:] = []
499 called[:] = []
500
500
501 # Test with a statement (different code path)
501 # Test with a statement (different code path)
502 with tt.AssertPrints("Wall time: "):
502 with tt.AssertPrints("Wall time: "):
503 ip.run_line_magic("time", "a = f(-3 + -2)")
503 ip.run_line_magic("time", "a = f(-3 + -2)")
504 self.assertEqual(called, [5])
504 self.assertEqual(called, [5])
505
505
506 def test_macro(self):
506 def test_macro(self):
507 ip.push({'a':10})
507 ip.push({'a':10})
508 # The AST transformation makes this do a+=-1
508 # The AST transformation makes this do a+=-1
509 ip.define_macro("amacro", "a+=1\nprint(a)")
509 ip.define_macro("amacro", "a+=1\nprint(a)")
510
510
511 with tt.AssertPrints("9"):
511 with tt.AssertPrints("9"):
512 ip.run_cell("amacro")
512 ip.run_cell("amacro")
513 with tt.AssertPrints("8"):
513 with tt.AssertPrints("8"):
514 ip.run_cell("amacro")
514 ip.run_cell("amacro")
515
515
516 class IntegerWrapper(ast.NodeTransformer):
516 class IntegerWrapper(ast.NodeTransformer):
517 """Wraps all integers in a call to Integer()"""
517 """Wraps all integers in a call to Integer()"""
518 def visit_Num(self, node):
518 def visit_Num(self, node):
519 if isinstance(node.n, int):
519 if isinstance(node.n, int):
520 return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()),
520 return ast.Call(func=ast.Name(id='Integer', ctx=ast.Load()),
521 args=[node], keywords=[])
521 args=[node], keywords=[])
522 return node
522 return node
523
523
524 class TestAstTransform2(unittest.TestCase):
524 class TestAstTransform2(unittest.TestCase):
525 def setUp(self):
525 def setUp(self):
526 self.intwrapper = IntegerWrapper()
526 self.intwrapper = IntegerWrapper()
527 ip.ast_transformers.append(self.intwrapper)
527 ip.ast_transformers.append(self.intwrapper)
528
528
529 self.calls = []
529 self.calls = []
530 def Integer(*args):
530 def Integer(*args):
531 self.calls.append(args)
531 self.calls.append(args)
532 return args
532 return args
533 ip.push({"Integer": Integer})
533 ip.push({"Integer": Integer})
534
534
535 def tearDown(self):
535 def tearDown(self):
536 ip.ast_transformers.remove(self.intwrapper)
536 ip.ast_transformers.remove(self.intwrapper)
537 del ip.user_ns['Integer']
537 del ip.user_ns['Integer']
538
538
539 def test_run_cell(self):
539 def test_run_cell(self):
540 ip.run_cell("n = 2")
540 ip.run_cell("n = 2")
541 self.assertEqual(self.calls, [(2,)])
541 self.assertEqual(self.calls, [(2,)])
542
542
543 # This shouldn't throw an error
543 # This shouldn't throw an error
544 ip.run_cell("o = 2.0")
544 ip.run_cell("o = 2.0")
545 self.assertEqual(ip.user_ns['o'], 2.0)
545 self.assertEqual(ip.user_ns['o'], 2.0)
546
546
547 def test_timeit(self):
547 def test_timeit(self):
548 called = set()
548 called = set()
549 def f(x):
549 def f(x):
550 called.add(x)
550 called.add(x)
551 ip.push({'f':f})
551 ip.push({'f':f})
552
552
553 with tt.AssertPrints("best of "):
553 with tt.AssertPrints("best of "):
554 ip.run_line_magic("timeit", "-n1 f(1)")
554 ip.run_line_magic("timeit", "-n1 f(1)")
555 self.assertEqual(called, set([(1,)]))
555 self.assertEqual(called, set([(1,)]))
556 called.clear()
556 called.clear()
557
557
558 with tt.AssertPrints("best of "):
558 with tt.AssertPrints("best of "):
559 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
559 ip.run_cell_magic("timeit", "-n1 f(2)", "f(3)")
560 self.assertEqual(called, set([(2,), (3,)]))
560 self.assertEqual(called, set([(2,), (3,)]))
561
561
562 class ErrorTransformer(ast.NodeTransformer):
562 class ErrorTransformer(ast.NodeTransformer):
563 """Throws an error when it sees a number."""
563 """Throws an error when it sees a number."""
564 def visit_Num(self):
564 def visit_Num(self):
565 raise ValueError("test")
565 raise ValueError("test")
566
566
567 class TestAstTransformError(unittest.TestCase):
567 class TestAstTransformError(unittest.TestCase):
568 def test_unregistering(self):
568 def test_unregistering(self):
569 err_transformer = ErrorTransformer()
569 err_transformer = ErrorTransformer()
570 ip.ast_transformers.append(err_transformer)
570 ip.ast_transformers.append(err_transformer)
571
571
572 with tt.AssertPrints("unregister", channel='stderr'):
572 with tt.AssertPrints("unregister", channel='stderr'):
573 ip.run_cell("1 + 2")
573 ip.run_cell("1 + 2")
574
574
575 # This should have been removed.
575 # This should have been removed.
576 nt.assert_not_in(err_transformer, ip.ast_transformers)
576 nt.assert_not_in(err_transformer, ip.ast_transformers)
577
577
578 def test__IPYTHON__():
578 def test__IPYTHON__():
579 # This shouldn't raise a NameError, that's all
579 # This shouldn't raise a NameError, that's all
580 __IPYTHON__
580 __IPYTHON__
581
582
583 class DummyRepr(object):
584 def __repr__(self):
585 return "DummyRepr"
586
587 def _repr_html_(self):
588 return "<b>dummy</b>"
589
590 def _repr_javascript_(self):
591 return "console.log('hi');", {'key': 'value'}
592
593
594 def test_user_variables():
595 # enable all formatters
596 ip.display_formatter.active_types = ip.display_formatter.format_types
597
598 ip.user_ns['dummy'] = d = DummyRepr()
599 keys = set(['dummy', 'doesnotexist'])
600 r = ip.user_variables(keys)
601
602 nt.assert_equal(keys, set(r.keys()))
603 dummy = r['dummy']
604 nt.assert_equal(set(['status', 'data', 'metadata']), set(dummy.keys()))
605 nt.assert_equal(dummy['status'], 'ok')
606 data = dummy['data']
607 metadata = dummy['metadata']
608 nt.assert_equal(data.get('text/html'), d._repr_html_())
609 js, jsmd = d._repr_javascript_()
610 nt.assert_equal(data.get('application/javascript'), js)
611 nt.assert_equal(metadata.get('application/javascript'), jsmd)
612
613 dne = r['doesnotexist']
614 nt.assert_equal(dne['status'], 'error')
615 nt.assert_equal(dne['ename'], 'KeyError')
616
617 # back to text only
618 ip.display_formatter.active_types = ['text/plain']
619
620 def test_user_expression():
621 # enable all formatters
622 ip.display_formatter.active_types = ip.display_formatter.format_types
623 query = {
624 'a' : '1 + 2',
625 'b' : '1/0',
626 }
627 r = ip.user_expressions(query)
628 import pprint
629 pprint.pprint(r)
630 nt.assert_equal(r.keys(), query.keys())
631 a = r['a']
632 nt.assert_equal(set(['status', 'data', 'metadata']), set(a.keys()))
633 nt.assert_equal(a['status'], 'ok')
634 data = a['data']
635 metadata = a['metadata']
636 nt.assert_equal(data.get('text/plain'), '3')
637
638 b = r['b']
639 nt.assert_equal(b['status'], 'error')
640 nt.assert_equal(b['ename'], 'ZeroDivisionError')
641
642 # back to text only
643 ip.display_formatter.active_types = ['text/plain']
644
645
646
647
648
649
@@ -1,302 +1,304 b''
1 # System library imports
1 # System library imports
2 from IPython.external.qt import QtGui
2 from IPython.external.qt import QtGui
3
3
4 # Local imports
4 # Local imports
5 from IPython.utils.traitlets import Bool
5 from IPython.utils.traitlets import Bool
6 from console_widget import ConsoleWidget
6 from console_widget import ConsoleWidget
7
7
8
8
9 class HistoryConsoleWidget(ConsoleWidget):
9 class HistoryConsoleWidget(ConsoleWidget):
10 """ A ConsoleWidget that keeps a history of the commands that have been
10 """ A ConsoleWidget that keeps a history of the commands that have been
11 executed and provides a readline-esque interface to this history.
11 executed and provides a readline-esque interface to this history.
12 """
12 """
13
13
14 #------ Configuration ------------------------------------------------------
14 #------ Configuration ------------------------------------------------------
15
15
16 # If enabled, the input buffer will become "locked" to history movement when
16 # If enabled, the input buffer will become "locked" to history movement when
17 # an edit is made to a multi-line input buffer. To override the lock, use
17 # an edit is made to a multi-line input buffer. To override the lock, use
18 # Shift in conjunction with the standard history cycling keys.
18 # Shift in conjunction with the standard history cycling keys.
19 history_lock = Bool(False, config=True)
19 history_lock = Bool(False, config=True)
20
20
21 #---------------------------------------------------------------------------
21 #---------------------------------------------------------------------------
22 # 'object' interface
22 # 'object' interface
23 #---------------------------------------------------------------------------
23 #---------------------------------------------------------------------------
24
24
25 def __init__(self, *args, **kw):
25 def __init__(self, *args, **kw):
26 super(HistoryConsoleWidget, self).__init__(*args, **kw)
26 super(HistoryConsoleWidget, self).__init__(*args, **kw)
27
27
28 # HistoryConsoleWidget protected variables.
28 # HistoryConsoleWidget protected variables.
29 self._history = []
29 self._history = []
30 self._history_edits = {}
30 self._history_edits = {}
31 self._history_index = 0
31 self._history_index = 0
32 self._history_prefix = ''
32 self._history_prefix = ''
33
33
34 #---------------------------------------------------------------------------
34 #---------------------------------------------------------------------------
35 # 'ConsoleWidget' public interface
35 # 'ConsoleWidget' public interface
36 #---------------------------------------------------------------------------
36 #---------------------------------------------------------------------------
37
37
38 def execute(self, source=None, hidden=False, interactive=False):
38 def execute(self, source=None, hidden=False, interactive=False):
39 """ Reimplemented to the store history.
39 """ Reimplemented to the store history.
40 """
40 """
41 if not hidden:
41 if not hidden:
42 history = self.input_buffer if source is None else source
42 history = self.input_buffer if source is None else source
43
43
44 executed = super(HistoryConsoleWidget, self).execute(
44 executed = super(HistoryConsoleWidget, self).execute(
45 source, hidden, interactive)
45 source, hidden, interactive)
46
46
47 if executed and not hidden:
47 if executed and not hidden:
48 # Save the command unless it was an empty string or was identical
48 # Save the command unless it was an empty string or was identical
49 # to the previous command.
49 # to the previous command.
50 history = history.rstrip()
50 history = history.rstrip()
51 if history and (not self._history or self._history[-1] != history):
51 if history and (not self._history or self._history[-1] != history):
52 self._history.append(history)
52 self._history.append(history)
53
53
54 # Emulate readline: reset all history edits.
54 # Emulate readline: reset all history edits.
55 self._history_edits = {}
55 self._history_edits = {}
56
56
57 # Move the history index to the most recent item.
57 # Move the history index to the most recent item.
58 self._history_index = len(self._history)
58 self._history_index = len(self._history)
59
59
60 return executed
60 return executed
61
61
62 #---------------------------------------------------------------------------
62 #---------------------------------------------------------------------------
63 # 'ConsoleWidget' abstract interface
63 # 'ConsoleWidget' abstract interface
64 #---------------------------------------------------------------------------
64 #---------------------------------------------------------------------------
65
65
66 def _up_pressed(self, shift_modifier):
66 def _up_pressed(self, shift_modifier):
67 """ Called when the up key is pressed. Returns whether to continue
67 """ Called when the up key is pressed. Returns whether to continue
68 processing the event.
68 processing the event.
69 """
69 """
70 prompt_cursor = self._get_prompt_cursor()
70 prompt_cursor = self._get_prompt_cursor()
71 if self._get_cursor().blockNumber() == prompt_cursor.blockNumber():
71 if self._get_cursor().blockNumber() == prompt_cursor.blockNumber():
72 # Bail out if we're locked.
72 # Bail out if we're locked.
73 if self._history_locked() and not shift_modifier:
73 if self._history_locked() and not shift_modifier:
74 return False
74 return False
75
75
76 # Set a search prefix based on the cursor position.
76 # Set a search prefix based on the cursor position.
77 col = self._get_input_buffer_cursor_column()
77 col = self._get_input_buffer_cursor_column()
78 input_buffer = self.input_buffer
78 input_buffer = self.input_buffer
79 # use the *shortest* of the cursor column and the history prefix
79 # use the *shortest* of the cursor column and the history prefix
80 # to determine if the prefix has changed
80 # to determine if the prefix has changed
81 n = min(col, len(self._history_prefix))
81 n = min(col, len(self._history_prefix))
82
82
83 # prefix changed, restart search from the beginning
83 # prefix changed, restart search from the beginning
84 if (self._history_prefix[:n] != input_buffer[:n]):
84 if (self._history_prefix[:n] != input_buffer[:n]):
85 self._history_index = len(self._history)
85 self._history_index = len(self._history)
86
86
87 # the only time we shouldn't set the history prefix
87 # the only time we shouldn't set the history prefix
88 # to the line up to the cursor is if we are already
88 # to the line up to the cursor is if we are already
89 # in a simple scroll (no prefix),
89 # in a simple scroll (no prefix),
90 # and the cursor is at the end of the first line
90 # and the cursor is at the end of the first line
91
91
92 # check if we are at the end of the first line
92 # check if we are at the end of the first line
93 c = self._get_cursor()
93 c = self._get_cursor()
94 current_pos = c.position()
94 current_pos = c.position()
95 c.movePosition(QtGui.QTextCursor.EndOfLine)
95 c.movePosition(QtGui.QTextCursor.EndOfLine)
96 at_eol = (c.position() == current_pos)
96 at_eol = (c.position() == current_pos)
97
97
98 if self._history_index == len(self._history) or \
98 if self._history_index == len(self._history) or \
99 not (self._history_prefix == '' and at_eol) or \
99 not (self._history_prefix == '' and at_eol) or \
100 not (self._get_edited_history(self._history_index)[:col] == input_buffer[:col]):
100 not (self._get_edited_history(self._history_index)[:col] == input_buffer[:col]):
101 self._history_prefix = input_buffer[:col]
101 self._history_prefix = input_buffer[:col]
102
102
103 # Perform the search.
103 # Perform the search.
104 self.history_previous(self._history_prefix,
104 self.history_previous(self._history_prefix,
105 as_prefix=not shift_modifier)
105 as_prefix=not shift_modifier)
106
106
107 # Go to the first line of the prompt for seemless history scrolling.
107 # Go to the first line of the prompt for seemless history scrolling.
108 # Emulate readline: keep the cursor position fixed for a prefix
108 # Emulate readline: keep the cursor position fixed for a prefix
109 # search.
109 # search.
110 cursor = self._get_prompt_cursor()
110 cursor = self._get_prompt_cursor()
111 if self._history_prefix:
111 if self._history_prefix:
112 cursor.movePosition(QtGui.QTextCursor.Right,
112 cursor.movePosition(QtGui.QTextCursor.Right,
113 n=len(self._history_prefix))
113 n=len(self._history_prefix))
114 else:
114 else:
115 cursor.movePosition(QtGui.QTextCursor.EndOfLine)
115 cursor.movePosition(QtGui.QTextCursor.EndOfLine)
116 self._set_cursor(cursor)
116 self._set_cursor(cursor)
117
117
118 return False
118 return False
119
119
120 return True
120 return True
121
121
122 def _down_pressed(self, shift_modifier):
122 def _down_pressed(self, shift_modifier):
123 """ Called when the down key is pressed. Returns whether to continue
123 """ Called when the down key is pressed. Returns whether to continue
124 processing the event.
124 processing the event.
125 """
125 """
126 end_cursor = self._get_end_cursor()
126 end_cursor = self._get_end_cursor()
127 if self._get_cursor().blockNumber() == end_cursor.blockNumber():
127 if self._get_cursor().blockNumber() == end_cursor.blockNumber():
128 # Bail out if we're locked.
128 # Bail out if we're locked.
129 if self._history_locked() and not shift_modifier:
129 if self._history_locked() and not shift_modifier:
130 return False
130 return False
131
131
132 # Perform the search.
132 # Perform the search.
133 replaced = self.history_next(self._history_prefix,
133 replaced = self.history_next(self._history_prefix,
134 as_prefix=not shift_modifier)
134 as_prefix=not shift_modifier)
135
135
136 # Emulate readline: keep the cursor position fixed for a prefix
136 # Emulate readline: keep the cursor position fixed for a prefix
137 # search. (We don't need to move the cursor to the end of the buffer
137 # search. (We don't need to move the cursor to the end of the buffer
138 # in the other case because this happens automatically when the
138 # in the other case because this happens automatically when the
139 # input buffer is set.)
139 # input buffer is set.)
140 if self._history_prefix and replaced:
140 if self._history_prefix and replaced:
141 cursor = self._get_prompt_cursor()
141 cursor = self._get_prompt_cursor()
142 cursor.movePosition(QtGui.QTextCursor.Right,
142 cursor.movePosition(QtGui.QTextCursor.Right,
143 n=len(self._history_prefix))
143 n=len(self._history_prefix))
144 self._set_cursor(cursor)
144 self._set_cursor(cursor)
145
145
146 return False
146 return False
147
147
148 return True
148 return True
149
149
150 #---------------------------------------------------------------------------
150 #---------------------------------------------------------------------------
151 # 'HistoryConsoleWidget' public interface
151 # 'HistoryConsoleWidget' public interface
152 #---------------------------------------------------------------------------
152 #---------------------------------------------------------------------------
153
153
154 def history_previous(self, substring='', as_prefix=True):
154 def history_previous(self, substring='', as_prefix=True):
155 """ If possible, set the input buffer to a previous history item.
155 """ If possible, set the input buffer to a previous history item.
156
156
157 Parameters:
157 Parameters:
158 -----------
158 -----------
159 substring : str, optional
159 substring : str, optional
160 If specified, search for an item with this substring.
160 If specified, search for an item with this substring.
161 as_prefix : bool, optional
161 as_prefix : bool, optional
162 If True, the substring must match at the beginning (default).
162 If True, the substring must match at the beginning (default).
163
163
164 Returns:
164 Returns:
165 --------
165 --------
166 Whether the input buffer was changed.
166 Whether the input buffer was changed.
167 """
167 """
168 index = self._history_index
168 index = self._history_index
169 replace = False
169 replace = False
170 while index > 0:
170 while index > 0:
171 index -= 1
171 index -= 1
172 history = self._get_edited_history(index)
172 history = self._get_edited_history(index)
173 if (as_prefix and history.startswith(substring)) \
173 if (as_prefix and history.startswith(substring)) \
174 or (not as_prefix and substring in history):
174 or (not as_prefix and substring in history):
175 replace = True
175 replace = True
176 break
176 break
177
177
178 if replace:
178 if replace:
179 self._store_edits()
179 self._store_edits()
180 self._history_index = index
180 self._history_index = index
181 self.input_buffer = history
181 self.input_buffer = history
182
182
183 return replace
183 return replace
184
184
185 def history_next(self, substring='', as_prefix=True):
185 def history_next(self, substring='', as_prefix=True):
186 """ If possible, set the input buffer to a subsequent history item.
186 """ If possible, set the input buffer to a subsequent history item.
187
187
188 Parameters:
188 Parameters:
189 -----------
189 -----------
190 substring : str, optional
190 substring : str, optional
191 If specified, search for an item with this substring.
191 If specified, search for an item with this substring.
192 as_prefix : bool, optional
192 as_prefix : bool, optional
193 If True, the substring must match at the beginning (default).
193 If True, the substring must match at the beginning (default).
194
194
195 Returns:
195 Returns:
196 --------
196 --------
197 Whether the input buffer was changed.
197 Whether the input buffer was changed.
198 """
198 """
199 index = self._history_index
199 index = self._history_index
200 replace = False
200 replace = False
201 while index < len(self._history):
201 while index < len(self._history):
202 index += 1
202 index += 1
203 history = self._get_edited_history(index)
203 history = self._get_edited_history(index)
204 if (as_prefix and history.startswith(substring)) \
204 if (as_prefix and history.startswith(substring)) \
205 or (not as_prefix and substring in history):
205 or (not as_prefix and substring in history):
206 replace = True
206 replace = True
207 break
207 break
208
208
209 if replace:
209 if replace:
210 self._store_edits()
210 self._store_edits()
211 self._history_index = index
211 self._history_index = index
212 self.input_buffer = history
212 self.input_buffer = history
213
213
214 return replace
214 return replace
215
215
216 def history_tail(self, n=10):
216 def history_tail(self, n=10):
217 """ Get the local history list.
217 """ Get the local history list.
218
218
219 Parameters:
219 Parameters:
220 -----------
220 -----------
221 n : int
221 n : int
222 The (maximum) number of history items to get.
222 The (maximum) number of history items to get.
223 """
223 """
224 return self._history[-n:]
224 return self._history[-n:]
225
225
226 def _request_update_session_history_length(self):
226 def _request_update_session_history_length(self):
227 msg_id = self.kernel_client.shell_channel.execute('',
227 msg_id = self.kernel_client.shell_channel.execute('',
228 silent=True,
228 silent=True,
229 user_expressions={
229 user_expressions={
230 'hlen':'len(get_ipython().history_manager.input_hist_raw)',
230 'hlen':'len(get_ipython().history_manager.input_hist_raw)',
231 }
231 }
232 )
232 )
233 self._request_info['execute'][msg_id] = self._ExecutionRequest(msg_id, 'save_magic')
233 self._request_info['execute'][msg_id] = self._ExecutionRequest(msg_id, 'save_magic')
234
234
235 def _handle_execute_reply(self, msg):
235 def _handle_execute_reply(self, msg):
236 """ Handles replies for code execution, here only session history length
236 """ Handles replies for code execution, here only session history length
237 """
237 """
238 msg_id = msg['parent_header']['msg_id']
238 msg_id = msg['parent_header']['msg_id']
239 info = self._request_info['execute'].pop(msg_id,None)
239 info = self._request_info['execute'].pop(msg_id,None)
240 if info and info.kind == 'save_magic' and not self._hidden:
240 if info and info.kind == 'save_magic' and not self._hidden:
241 content = msg['content']
241 content = msg['content']
242 status = content['status']
242 status = content['status']
243 if status == 'ok':
243 if status == 'ok':
244 self._max_session_history=(int(content['user_expressions']['hlen']))
244 self._max_session_history = int(
245 content['user_expressions']['hlen']['data']['text/plain']
246 )
245
247
246 def save_magic(self):
248 def save_magic(self):
247 # update the session history length
249 # update the session history length
248 self._request_update_session_history_length()
250 self._request_update_session_history_length()
249
251
250 file_name,extFilter = QtGui.QFileDialog.getSaveFileName(self,
252 file_name,extFilter = QtGui.QFileDialog.getSaveFileName(self,
251 "Enter A filename",
253 "Enter A filename",
252 filter='Python File (*.py);; All files (*.*)'
254 filter='Python File (*.py);; All files (*.*)'
253 )
255 )
254
256
255 # let's the user search/type for a file name, while the history length
257 # let's the user search/type for a file name, while the history length
256 # is fetched
258 # is fetched
257
259
258 if file_name:
260 if file_name:
259 hist_range, ok = QtGui.QInputDialog.getText(self,
261 hist_range, ok = QtGui.QInputDialog.getText(self,
260 'Please enter an interval of command to save',
262 'Please enter an interval of command to save',
261 'Saving commands:',
263 'Saving commands:',
262 text=str('1-'+str(self._max_session_history))
264 text=str('1-'+str(self._max_session_history))
263 )
265 )
264 if ok:
266 if ok:
265 self.execute("%save"+" "+file_name+" "+str(hist_range))
267 self.execute("%save"+" "+file_name+" "+str(hist_range))
266
268
267 #---------------------------------------------------------------------------
269 #---------------------------------------------------------------------------
268 # 'HistoryConsoleWidget' protected interface
270 # 'HistoryConsoleWidget' protected interface
269 #---------------------------------------------------------------------------
271 #---------------------------------------------------------------------------
270
272
271 def _history_locked(self):
273 def _history_locked(self):
272 """ Returns whether history movement is locked.
274 """ Returns whether history movement is locked.
273 """
275 """
274 return (self.history_lock and
276 return (self.history_lock and
275 (self._get_edited_history(self._history_index) !=
277 (self._get_edited_history(self._history_index) !=
276 self.input_buffer) and
278 self.input_buffer) and
277 (self._get_prompt_cursor().blockNumber() !=
279 (self._get_prompt_cursor().blockNumber() !=
278 self._get_end_cursor().blockNumber()))
280 self._get_end_cursor().blockNumber()))
279
281
280 def _get_edited_history(self, index):
282 def _get_edited_history(self, index):
281 """ Retrieves a history item, possibly with temporary edits.
283 """ Retrieves a history item, possibly with temporary edits.
282 """
284 """
283 if index in self._history_edits:
285 if index in self._history_edits:
284 return self._history_edits[index]
286 return self._history_edits[index]
285 elif index == len(self._history):
287 elif index == len(self._history):
286 return unicode()
288 return unicode()
287 return self._history[index]
289 return self._history[index]
288
290
289 def _set_history(self, history):
291 def _set_history(self, history):
290 """ Replace the current history with a sequence of history items.
292 """ Replace the current history with a sequence of history items.
291 """
293 """
292 self._history = list(history)
294 self._history = list(history)
293 self._history_edits = {}
295 self._history_edits = {}
294 self._history_index = len(self._history)
296 self._history_index = len(self._history)
295
297
296 def _store_edits(self):
298 def _store_edits(self):
297 """ If there are edits to the current input buffer, store them.
299 """ If there are edits to the current input buffer, store them.
298 """
300 """
299 current = self.input_buffer
301 current = self.input_buffer
300 if self._history_index == len(self._history) or \
302 if self._history_index == len(self._history) or \
301 self._history[self._history_index] != current:
303 self._history[self._history_index] != current:
302 self._history_edits[self._history_index] = current
304 self._history_edits[self._history_index] = current
@@ -1,992 +1,993 b''
1 """The Qt MainWindow for the QtConsole
1 """The Qt MainWindow for the QtConsole
2
2
3 This is a tabbed pseudo-terminal of IPython sessions, with a menu bar for
3 This is a tabbed pseudo-terminal of IPython sessions, with a menu bar for
4 common actions.
4 common actions.
5
5
6 Authors:
6 Authors:
7
7
8 * Evan Patterson
8 * Evan Patterson
9 * Min RK
9 * Min RK
10 * Erik Tollerud
10 * Erik Tollerud
11 * Fernando Perez
11 * Fernando Perez
12 * Bussonnier Matthias
12 * Bussonnier Matthias
13 * Thomas Kluyver
13 * Thomas Kluyver
14 * Paul Ivanov
14 * Paul Ivanov
15
15
16 """
16 """
17
17
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # Imports
19 # Imports
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21
21
22 # stdlib imports
22 # stdlib imports
23 import sys
23 import json
24 import re
24 import re
25 import sys
25 import webbrowser
26 import webbrowser
26 import ast
27 from threading import Thread
27 from threading import Thread
28
28
29 # System library imports
29 # System library imports
30 from IPython.external.qt import QtGui,QtCore
30 from IPython.external.qt import QtGui,QtCore
31
31
32 from IPython.core.magic import magic_escapes
33
32 def background(f):
34 def background(f):
33 """call a function in a simple thread, to prevent blocking"""
35 """call a function in a simple thread, to prevent blocking"""
34 t = Thread(target=f)
36 t = Thread(target=f)
35 t.start()
37 t.start()
36 return t
38 return t
37
39
38 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
39 # Classes
41 # Classes
40 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
41
43
42 class MainWindow(QtGui.QMainWindow):
44 class MainWindow(QtGui.QMainWindow):
43
45
44 #---------------------------------------------------------------------------
46 #---------------------------------------------------------------------------
45 # 'object' interface
47 # 'object' interface
46 #---------------------------------------------------------------------------
48 #---------------------------------------------------------------------------
47
49
48 _magic_menu_dict = {}
50 _magic_menu_dict = {}
49
51
50 def __init__(self, app,
52 def __init__(self, app,
51 confirm_exit=True,
53 confirm_exit=True,
52 new_frontend_factory=None, slave_frontend_factory=None,
54 new_frontend_factory=None, slave_frontend_factory=None,
53 ):
55 ):
54 """ Create a tabbed MainWindow for managing IPython FrontendWidgets
56 """ Create a tabbed MainWindow for managing IPython FrontendWidgets
55
57
56 Parameters
58 Parameters
57 ----------
59 ----------
58
60
59 app : reference to QApplication parent
61 app : reference to QApplication parent
60 confirm_exit : bool, optional
62 confirm_exit : bool, optional
61 Whether we should prompt on close of tabs
63 Whether we should prompt on close of tabs
62 new_frontend_factory : callable
64 new_frontend_factory : callable
63 A callable that returns a new IPythonWidget instance, attached to
65 A callable that returns a new IPythonWidget instance, attached to
64 its own running kernel.
66 its own running kernel.
65 slave_frontend_factory : callable
67 slave_frontend_factory : callable
66 A callable that takes an existing IPythonWidget, and returns a new
68 A callable that takes an existing IPythonWidget, and returns a new
67 IPythonWidget instance, attached to the same kernel.
69 IPythonWidget instance, attached to the same kernel.
68 """
70 """
69
71
70 super(MainWindow, self).__init__()
72 super(MainWindow, self).__init__()
71 self._kernel_counter = 0
73 self._kernel_counter = 0
72 self._app = app
74 self._app = app
73 self.confirm_exit = confirm_exit
75 self.confirm_exit = confirm_exit
74 self.new_frontend_factory = new_frontend_factory
76 self.new_frontend_factory = new_frontend_factory
75 self.slave_frontend_factory = slave_frontend_factory
77 self.slave_frontend_factory = slave_frontend_factory
76
78
77 self.tab_widget = QtGui.QTabWidget(self)
79 self.tab_widget = QtGui.QTabWidget(self)
78 self.tab_widget.setDocumentMode(True)
80 self.tab_widget.setDocumentMode(True)
79 self.tab_widget.setTabsClosable(True)
81 self.tab_widget.setTabsClosable(True)
80 self.tab_widget.tabCloseRequested[int].connect(self.close_tab)
82 self.tab_widget.tabCloseRequested[int].connect(self.close_tab)
81
83
82 self.setCentralWidget(self.tab_widget)
84 self.setCentralWidget(self.tab_widget)
83 # hide tab bar at first, since we have no tabs:
85 # hide tab bar at first, since we have no tabs:
84 self.tab_widget.tabBar().setVisible(False)
86 self.tab_widget.tabBar().setVisible(False)
85 # prevent focus in tab bar
87 # prevent focus in tab bar
86 self.tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
88 self.tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
87
89
88 def update_tab_bar_visibility(self):
90 def update_tab_bar_visibility(self):
89 """ update visibility of the tabBar depending of the number of tab
91 """ update visibility of the tabBar depending of the number of tab
90
92
91 0 or 1 tab, tabBar hidden
93 0 or 1 tab, tabBar hidden
92 2+ tabs, tabBar visible
94 2+ tabs, tabBar visible
93
95
94 send a self.close if number of tab ==0
96 send a self.close if number of tab ==0
95
97
96 need to be called explicitly, or be connected to tabInserted/tabRemoved
98 need to be called explicitly, or be connected to tabInserted/tabRemoved
97 """
99 """
98 if self.tab_widget.count() <= 1:
100 if self.tab_widget.count() <= 1:
99 self.tab_widget.tabBar().setVisible(False)
101 self.tab_widget.tabBar().setVisible(False)
100 else:
102 else:
101 self.tab_widget.tabBar().setVisible(True)
103 self.tab_widget.tabBar().setVisible(True)
102 if self.tab_widget.count()==0 :
104 if self.tab_widget.count()==0 :
103 self.close()
105 self.close()
104
106
105 @property
107 @property
106 def next_kernel_id(self):
108 def next_kernel_id(self):
107 """constantly increasing counter for kernel IDs"""
109 """constantly increasing counter for kernel IDs"""
108 c = self._kernel_counter
110 c = self._kernel_counter
109 self._kernel_counter += 1
111 self._kernel_counter += 1
110 return c
112 return c
111
113
112 @property
114 @property
113 def active_frontend(self):
115 def active_frontend(self):
114 return self.tab_widget.currentWidget()
116 return self.tab_widget.currentWidget()
115
117
116 def create_tab_with_new_frontend(self):
118 def create_tab_with_new_frontend(self):
117 """create a new frontend and attach it to a new tab"""
119 """create a new frontend and attach it to a new tab"""
118 widget = self.new_frontend_factory()
120 widget = self.new_frontend_factory()
119 self.add_tab_with_frontend(widget)
121 self.add_tab_with_frontend(widget)
120
122
121 def create_tab_with_current_kernel(self):
123 def create_tab_with_current_kernel(self):
122 """create a new frontend attached to the same kernel as the current tab"""
124 """create a new frontend attached to the same kernel as the current tab"""
123 current_widget = self.tab_widget.currentWidget()
125 current_widget = self.tab_widget.currentWidget()
124 current_widget_index = self.tab_widget.indexOf(current_widget)
126 current_widget_index = self.tab_widget.indexOf(current_widget)
125 current_widget_name = self.tab_widget.tabText(current_widget_index)
127 current_widget_name = self.tab_widget.tabText(current_widget_index)
126 widget = self.slave_frontend_factory(current_widget)
128 widget = self.slave_frontend_factory(current_widget)
127 if 'slave' in current_widget_name:
129 if 'slave' in current_widget_name:
128 # don't keep stacking slaves
130 # don't keep stacking slaves
129 name = current_widget_name
131 name = current_widget_name
130 else:
132 else:
131 name = '(%s) slave' % current_widget_name
133 name = '(%s) slave' % current_widget_name
132 self.add_tab_with_frontend(widget,name=name)
134 self.add_tab_with_frontend(widget,name=name)
133
135
134 def close_tab(self,current_tab):
136 def close_tab(self,current_tab):
135 """ Called when you need to try to close a tab.
137 """ Called when you need to try to close a tab.
136
138
137 It takes the number of the tab to be closed as argument, or a reference
139 It takes the number of the tab to be closed as argument, or a reference
138 to the widget inside this tab
140 to the widget inside this tab
139 """
141 """
140
142
141 # let's be sure "tab" and "closing widget" are respectively the index
143 # let's be sure "tab" and "closing widget" are respectively the index
142 # of the tab to close and a reference to the frontend to close
144 # of the tab to close and a reference to the frontend to close
143 if type(current_tab) is not int :
145 if type(current_tab) is not int :
144 current_tab = self.tab_widget.indexOf(current_tab)
146 current_tab = self.tab_widget.indexOf(current_tab)
145 closing_widget=self.tab_widget.widget(current_tab)
147 closing_widget=self.tab_widget.widget(current_tab)
146
148
147
149
148 # when trying to be closed, widget might re-send a request to be
150 # when trying to be closed, widget might re-send a request to be
149 # closed again, but will be deleted when event will be processed. So
151 # closed again, but will be deleted when event will be processed. So
150 # need to check that widget still exists and skip if not. One example
152 # need to check that widget still exists and skip if not. One example
151 # of this is when 'exit' is sent in a slave tab. 'exit' will be
153 # of this is when 'exit' is sent in a slave tab. 'exit' will be
152 # re-sent by this function on the master widget, which ask all slave
154 # re-sent by this function on the master widget, which ask all slave
153 # widgets to exit
155 # widgets to exit
154 if closing_widget==None:
156 if closing_widget==None:
155 return
157 return
156
158
157 #get a list of all slave widgets on the same kernel.
159 #get a list of all slave widgets on the same kernel.
158 slave_tabs = self.find_slave_widgets(closing_widget)
160 slave_tabs = self.find_slave_widgets(closing_widget)
159
161
160 keepkernel = None #Use the prompt by default
162 keepkernel = None #Use the prompt by default
161 if hasattr(closing_widget,'_keep_kernel_on_exit'): #set by exit magic
163 if hasattr(closing_widget,'_keep_kernel_on_exit'): #set by exit magic
162 keepkernel = closing_widget._keep_kernel_on_exit
164 keepkernel = closing_widget._keep_kernel_on_exit
163 # If signal sent by exit magic (_keep_kernel_on_exit, exist and not None)
165 # If signal sent by exit magic (_keep_kernel_on_exit, exist and not None)
164 # we set local slave tabs._hidden to True to avoid prompting for kernel
166 # we set local slave tabs._hidden to True to avoid prompting for kernel
165 # restart when they get the signal. and then "forward" the 'exit'
167 # restart when they get the signal. and then "forward" the 'exit'
166 # to the main window
168 # to the main window
167 if keepkernel is not None:
169 if keepkernel is not None:
168 for tab in slave_tabs:
170 for tab in slave_tabs:
169 tab._hidden = True
171 tab._hidden = True
170 if closing_widget in slave_tabs:
172 if closing_widget in slave_tabs:
171 try :
173 try :
172 self.find_master_tab(closing_widget).execute('exit')
174 self.find_master_tab(closing_widget).execute('exit')
173 except AttributeError:
175 except AttributeError:
174 self.log.info("Master already closed or not local, closing only current tab")
176 self.log.info("Master already closed or not local, closing only current tab")
175 self.tab_widget.removeTab(current_tab)
177 self.tab_widget.removeTab(current_tab)
176 self.update_tab_bar_visibility()
178 self.update_tab_bar_visibility()
177 return
179 return
178
180
179 kernel_client = closing_widget.kernel_client
181 kernel_client = closing_widget.kernel_client
180 kernel_manager = closing_widget.kernel_manager
182 kernel_manager = closing_widget.kernel_manager
181
183
182 if keepkernel is None and not closing_widget._confirm_exit:
184 if keepkernel is None and not closing_widget._confirm_exit:
183 # don't prompt, just terminate the kernel if we own it
185 # don't prompt, just terminate the kernel if we own it
184 # or leave it alone if we don't
186 # or leave it alone if we don't
185 keepkernel = closing_widget._existing
187 keepkernel = closing_widget._existing
186 if keepkernel is None: #show prompt
188 if keepkernel is None: #show prompt
187 if kernel_client and kernel_client.channels_running:
189 if kernel_client and kernel_client.channels_running:
188 title = self.window().windowTitle()
190 title = self.window().windowTitle()
189 cancel = QtGui.QMessageBox.Cancel
191 cancel = QtGui.QMessageBox.Cancel
190 okay = QtGui.QMessageBox.Ok
192 okay = QtGui.QMessageBox.Ok
191 if closing_widget._may_close:
193 if closing_widget._may_close:
192 msg = "You are closing the tab : "+'"'+self.tab_widget.tabText(current_tab)+'"'
194 msg = "You are closing the tab : "+'"'+self.tab_widget.tabText(current_tab)+'"'
193 info = "Would you like to quit the Kernel and close all attached Consoles as well?"
195 info = "Would you like to quit the Kernel and close all attached Consoles as well?"
194 justthis = QtGui.QPushButton("&No, just this Tab", self)
196 justthis = QtGui.QPushButton("&No, just this Tab", self)
195 justthis.setShortcut('N')
197 justthis.setShortcut('N')
196 closeall = QtGui.QPushButton("&Yes, close all", self)
198 closeall = QtGui.QPushButton("&Yes, close all", self)
197 closeall.setShortcut('Y')
199 closeall.setShortcut('Y')
198 # allow ctrl-d ctrl-d exit, like in terminal
200 # allow ctrl-d ctrl-d exit, like in terminal
199 closeall.setShortcut('Ctrl+D')
201 closeall.setShortcut('Ctrl+D')
200 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
202 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
201 title, msg)
203 title, msg)
202 box.setInformativeText(info)
204 box.setInformativeText(info)
203 box.addButton(cancel)
205 box.addButton(cancel)
204 box.addButton(justthis, QtGui.QMessageBox.NoRole)
206 box.addButton(justthis, QtGui.QMessageBox.NoRole)
205 box.addButton(closeall, QtGui.QMessageBox.YesRole)
207 box.addButton(closeall, QtGui.QMessageBox.YesRole)
206 box.setDefaultButton(closeall)
208 box.setDefaultButton(closeall)
207 box.setEscapeButton(cancel)
209 box.setEscapeButton(cancel)
208 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
210 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
209 box.setIconPixmap(pixmap)
211 box.setIconPixmap(pixmap)
210 reply = box.exec_()
212 reply = box.exec_()
211 if reply == 1: # close All
213 if reply == 1: # close All
212 for slave in slave_tabs:
214 for slave in slave_tabs:
213 background(slave.kernel_client.stop_channels)
215 background(slave.kernel_client.stop_channels)
214 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
216 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
215 closing_widget.execute("exit")
217 closing_widget.execute("exit")
216 self.tab_widget.removeTab(current_tab)
218 self.tab_widget.removeTab(current_tab)
217 background(kernel_client.stop_channels)
219 background(kernel_client.stop_channels)
218 elif reply == 0: # close Console
220 elif reply == 0: # close Console
219 if not closing_widget._existing:
221 if not closing_widget._existing:
220 # Have kernel: don't quit, just close the tab
222 # Have kernel: don't quit, just close the tab
221 closing_widget.execute("exit True")
223 closing_widget.execute("exit True")
222 self.tab_widget.removeTab(current_tab)
224 self.tab_widget.removeTab(current_tab)
223 background(kernel_client.stop_channels)
225 background(kernel_client.stop_channels)
224 else:
226 else:
225 reply = QtGui.QMessageBox.question(self, title,
227 reply = QtGui.QMessageBox.question(self, title,
226 "Are you sure you want to close this Console?"+
228 "Are you sure you want to close this Console?"+
227 "\nThe Kernel and other Consoles will remain active.",
229 "\nThe Kernel and other Consoles will remain active.",
228 okay|cancel,
230 okay|cancel,
229 defaultButton=okay
231 defaultButton=okay
230 )
232 )
231 if reply == okay:
233 if reply == okay:
232 self.tab_widget.removeTab(current_tab)
234 self.tab_widget.removeTab(current_tab)
233 elif keepkernel: #close console but leave kernel running (no prompt)
235 elif keepkernel: #close console but leave kernel running (no prompt)
234 self.tab_widget.removeTab(current_tab)
236 self.tab_widget.removeTab(current_tab)
235 background(kernel_client.stop_channels)
237 background(kernel_client.stop_channels)
236 else: #close console and kernel (no prompt)
238 else: #close console and kernel (no prompt)
237 self.tab_widget.removeTab(current_tab)
239 self.tab_widget.removeTab(current_tab)
238 if kernel_client and kernel_client.channels_running:
240 if kernel_client and kernel_client.channels_running:
239 for slave in slave_tabs:
241 for slave in slave_tabs:
240 background(slave.kernel_client.stop_channels)
242 background(slave.kernel_client.stop_channels)
241 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
243 self.tab_widget.removeTab(self.tab_widget.indexOf(slave))
242 if kernel_manager:
244 if kernel_manager:
243 kernel_manager.shutdown_kernel()
245 kernel_manager.shutdown_kernel()
244 background(kernel_client.stop_channels)
246 background(kernel_client.stop_channels)
245
247
246 self.update_tab_bar_visibility()
248 self.update_tab_bar_visibility()
247
249
248 def add_tab_with_frontend(self,frontend,name=None):
250 def add_tab_with_frontend(self,frontend,name=None):
249 """ insert a tab with a given frontend in the tab bar, and give it a name
251 """ insert a tab with a given frontend in the tab bar, and give it a name
250
252
251 """
253 """
252 if not name:
254 if not name:
253 name = 'kernel %i' % self.next_kernel_id
255 name = 'kernel %i' % self.next_kernel_id
254 self.tab_widget.addTab(frontend,name)
256 self.tab_widget.addTab(frontend,name)
255 self.update_tab_bar_visibility()
257 self.update_tab_bar_visibility()
256 self.make_frontend_visible(frontend)
258 self.make_frontend_visible(frontend)
257 frontend.exit_requested.connect(self.close_tab)
259 frontend.exit_requested.connect(self.close_tab)
258
260
259 def next_tab(self):
261 def next_tab(self):
260 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()+1))
262 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()+1))
261
263
262 def prev_tab(self):
264 def prev_tab(self):
263 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()-1))
265 self.tab_widget.setCurrentIndex((self.tab_widget.currentIndex()-1))
264
266
265 def make_frontend_visible(self,frontend):
267 def make_frontend_visible(self,frontend):
266 widget_index=self.tab_widget.indexOf(frontend)
268 widget_index=self.tab_widget.indexOf(frontend)
267 if widget_index > 0 :
269 if widget_index > 0 :
268 self.tab_widget.setCurrentIndex(widget_index)
270 self.tab_widget.setCurrentIndex(widget_index)
269
271
270 def find_master_tab(self,tab,as_list=False):
272 def find_master_tab(self,tab,as_list=False):
271 """
273 """
272 Try to return the frontend that owns the kernel attached to the given widget/tab.
274 Try to return the frontend that owns the kernel attached to the given widget/tab.
273
275
274 Only finds frontend owned by the current application. Selection
276 Only finds frontend owned by the current application. Selection
275 based on port of the kernel might be inaccurate if several kernel
277 based on port of the kernel might be inaccurate if several kernel
276 on different ip use same port number.
278 on different ip use same port number.
277
279
278 This function does the conversion tabNumber/widget if needed.
280 This function does the conversion tabNumber/widget if needed.
279 Might return None if no master widget (non local kernel)
281 Might return None if no master widget (non local kernel)
280 Will crash IPython if more than 1 masterWidget
282 Will crash IPython if more than 1 masterWidget
281
283
282 When asList set to True, always return a list of widget(s) owning
284 When asList set to True, always return a list of widget(s) owning
283 the kernel. The list might be empty or containing several Widget.
285 the kernel. The list might be empty or containing several Widget.
284 """
286 """
285
287
286 #convert from/to int/richIpythonWidget if needed
288 #convert from/to int/richIpythonWidget if needed
287 if isinstance(tab, int):
289 if isinstance(tab, int):
288 tab = self.tab_widget.widget(tab)
290 tab = self.tab_widget.widget(tab)
289 km=tab.kernel_client
291 km=tab.kernel_client
290
292
291 #build list of all widgets
293 #build list of all widgets
292 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
294 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
293
295
294 # widget that are candidate to be the owner of the kernel does have all the same port of the curent widget
296 # widget that are candidate to be the owner of the kernel does have all the same port of the curent widget
295 # And should have a _may_close attribute
297 # And should have a _may_close attribute
296 filtered_widget_list = [ widget for widget in widget_list if
298 filtered_widget_list = [ widget for widget in widget_list if
297 widget.kernel_client.connection_file == km.connection_file and
299 widget.kernel_client.connection_file == km.connection_file and
298 hasattr(widget,'_may_close') ]
300 hasattr(widget,'_may_close') ]
299 # the master widget is the one that may close the kernel
301 # the master widget is the one that may close the kernel
300 master_widget= [ widget for widget in filtered_widget_list if widget._may_close]
302 master_widget= [ widget for widget in filtered_widget_list if widget._may_close]
301 if as_list:
303 if as_list:
302 return master_widget
304 return master_widget
303 assert(len(master_widget)<=1 )
305 assert(len(master_widget)<=1 )
304 if len(master_widget)==0:
306 if len(master_widget)==0:
305 return None
307 return None
306
308
307 return master_widget[0]
309 return master_widget[0]
308
310
309 def find_slave_widgets(self,tab):
311 def find_slave_widgets(self,tab):
310 """return all the frontends that do not own the kernel attached to the given widget/tab.
312 """return all the frontends that do not own the kernel attached to the given widget/tab.
311
313
312 Only find frontends owned by the current application. Selection
314 Only find frontends owned by the current application. Selection
313 based on connection file of the kernel.
315 based on connection file of the kernel.
314
316
315 This function does the conversion tabNumber/widget if needed.
317 This function does the conversion tabNumber/widget if needed.
316 """
318 """
317 #convert from/to int/richIpythonWidget if needed
319 #convert from/to int/richIpythonWidget if needed
318 if isinstance(tab, int):
320 if isinstance(tab, int):
319 tab = self.tab_widget.widget(tab)
321 tab = self.tab_widget.widget(tab)
320 km=tab.kernel_client
322 km=tab.kernel_client
321
323
322 #build list of all widgets
324 #build list of all widgets
323 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
325 widget_list = [self.tab_widget.widget(i) for i in range(self.tab_widget.count())]
324
326
325 # widget that are candidate not to be the owner of the kernel does have all the same port of the curent widget
327 # widget that are candidate not to be the owner of the kernel does have all the same port of the curent widget
326 filtered_widget_list = ( widget for widget in widget_list if
328 filtered_widget_list = ( widget for widget in widget_list if
327 widget.kernel_client.connection_file == km.connection_file)
329 widget.kernel_client.connection_file == km.connection_file)
328 # Get a list of all widget owning the same kernel and removed it from
330 # Get a list of all widget owning the same kernel and removed it from
329 # the previous cadidate. (better using sets ?)
331 # the previous cadidate. (better using sets ?)
330 master_widget_list = self.find_master_tab(tab, as_list=True)
332 master_widget_list = self.find_master_tab(tab, as_list=True)
331 slave_list = [widget for widget in filtered_widget_list if widget not in master_widget_list]
333 slave_list = [widget for widget in filtered_widget_list if widget not in master_widget_list]
332
334
333 return slave_list
335 return slave_list
334
336
335 # Populate the menu bar with common actions and shortcuts
337 # Populate the menu bar with common actions and shortcuts
336 def add_menu_action(self, menu, action, defer_shortcut=False):
338 def add_menu_action(self, menu, action, defer_shortcut=False):
337 """Add action to menu as well as self
339 """Add action to menu as well as self
338
340
339 So that when the menu bar is invisible, its actions are still available.
341 So that when the menu bar is invisible, its actions are still available.
340
342
341 If defer_shortcut is True, set the shortcut context to widget-only,
343 If defer_shortcut is True, set the shortcut context to widget-only,
342 where it will avoid conflict with shortcuts already bound to the
344 where it will avoid conflict with shortcuts already bound to the
343 widgets themselves.
345 widgets themselves.
344 """
346 """
345 menu.addAction(action)
347 menu.addAction(action)
346 self.addAction(action)
348 self.addAction(action)
347
349
348 if defer_shortcut:
350 if defer_shortcut:
349 action.setShortcutContext(QtCore.Qt.WidgetShortcut)
351 action.setShortcutContext(QtCore.Qt.WidgetShortcut)
350
352
351 def init_menu_bar(self):
353 def init_menu_bar(self):
352 #create menu in the order they should appear in the menu bar
354 #create menu in the order they should appear in the menu bar
353 self.init_file_menu()
355 self.init_file_menu()
354 self.init_edit_menu()
356 self.init_edit_menu()
355 self.init_view_menu()
357 self.init_view_menu()
356 self.init_kernel_menu()
358 self.init_kernel_menu()
357 self.init_magic_menu()
359 self.init_magic_menu()
358 self.init_window_menu()
360 self.init_window_menu()
359 self.init_help_menu()
361 self.init_help_menu()
360
362
361 def init_file_menu(self):
363 def init_file_menu(self):
362 self.file_menu = self.menuBar().addMenu("&File")
364 self.file_menu = self.menuBar().addMenu("&File")
363
365
364 self.new_kernel_tab_act = QtGui.QAction("New Tab with &New kernel",
366 self.new_kernel_tab_act = QtGui.QAction("New Tab with &New kernel",
365 self,
367 self,
366 shortcut="Ctrl+T",
368 shortcut="Ctrl+T",
367 triggered=self.create_tab_with_new_frontend)
369 triggered=self.create_tab_with_new_frontend)
368 self.add_menu_action(self.file_menu, self.new_kernel_tab_act)
370 self.add_menu_action(self.file_menu, self.new_kernel_tab_act)
369
371
370 self.slave_kernel_tab_act = QtGui.QAction("New Tab with Sa&me kernel",
372 self.slave_kernel_tab_act = QtGui.QAction("New Tab with Sa&me kernel",
371 self,
373 self,
372 shortcut="Ctrl+Shift+T",
374 shortcut="Ctrl+Shift+T",
373 triggered=self.create_tab_with_current_kernel)
375 triggered=self.create_tab_with_current_kernel)
374 self.add_menu_action(self.file_menu, self.slave_kernel_tab_act)
376 self.add_menu_action(self.file_menu, self.slave_kernel_tab_act)
375
377
376 self.file_menu.addSeparator()
378 self.file_menu.addSeparator()
377
379
378 self.close_action=QtGui.QAction("&Close Tab",
380 self.close_action=QtGui.QAction("&Close Tab",
379 self,
381 self,
380 shortcut=QtGui.QKeySequence.Close,
382 shortcut=QtGui.QKeySequence.Close,
381 triggered=self.close_active_frontend
383 triggered=self.close_active_frontend
382 )
384 )
383 self.add_menu_action(self.file_menu, self.close_action)
385 self.add_menu_action(self.file_menu, self.close_action)
384
386
385 self.export_action=QtGui.QAction("&Save to HTML/XHTML",
387 self.export_action=QtGui.QAction("&Save to HTML/XHTML",
386 self,
388 self,
387 shortcut=QtGui.QKeySequence.Save,
389 shortcut=QtGui.QKeySequence.Save,
388 triggered=self.export_action_active_frontend
390 triggered=self.export_action_active_frontend
389 )
391 )
390 self.add_menu_action(self.file_menu, self.export_action, True)
392 self.add_menu_action(self.file_menu, self.export_action, True)
391
393
392 self.file_menu.addSeparator()
394 self.file_menu.addSeparator()
393
395
394 printkey = QtGui.QKeySequence(QtGui.QKeySequence.Print)
396 printkey = QtGui.QKeySequence(QtGui.QKeySequence.Print)
395 if printkey.matches("Ctrl+P") and sys.platform != 'darwin':
397 if printkey.matches("Ctrl+P") and sys.platform != 'darwin':
396 # Only override the default if there is a collision.
398 # Only override the default if there is a collision.
397 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
399 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
398 printkey = "Ctrl+Shift+P"
400 printkey = "Ctrl+Shift+P"
399 self.print_action = QtGui.QAction("&Print",
401 self.print_action = QtGui.QAction("&Print",
400 self,
402 self,
401 shortcut=printkey,
403 shortcut=printkey,
402 triggered=self.print_action_active_frontend)
404 triggered=self.print_action_active_frontend)
403 self.add_menu_action(self.file_menu, self.print_action, True)
405 self.add_menu_action(self.file_menu, self.print_action, True)
404
406
405 if sys.platform != 'darwin':
407 if sys.platform != 'darwin':
406 # OSX always has Quit in the Application menu, only add it
408 # OSX always has Quit in the Application menu, only add it
407 # to the File menu elsewhere.
409 # to the File menu elsewhere.
408
410
409 self.file_menu.addSeparator()
411 self.file_menu.addSeparator()
410
412
411 self.quit_action = QtGui.QAction("&Quit",
413 self.quit_action = QtGui.QAction("&Quit",
412 self,
414 self,
413 shortcut=QtGui.QKeySequence.Quit,
415 shortcut=QtGui.QKeySequence.Quit,
414 triggered=self.close,
416 triggered=self.close,
415 )
417 )
416 self.add_menu_action(self.file_menu, self.quit_action)
418 self.add_menu_action(self.file_menu, self.quit_action)
417
419
418
420
419 def init_edit_menu(self):
421 def init_edit_menu(self):
420 self.edit_menu = self.menuBar().addMenu("&Edit")
422 self.edit_menu = self.menuBar().addMenu("&Edit")
421
423
422 self.undo_action = QtGui.QAction("&Undo",
424 self.undo_action = QtGui.QAction("&Undo",
423 self,
425 self,
424 shortcut=QtGui.QKeySequence.Undo,
426 shortcut=QtGui.QKeySequence.Undo,
425 statusTip="Undo last action if possible",
427 statusTip="Undo last action if possible",
426 triggered=self.undo_active_frontend
428 triggered=self.undo_active_frontend
427 )
429 )
428 self.add_menu_action(self.edit_menu, self.undo_action)
430 self.add_menu_action(self.edit_menu, self.undo_action)
429
431
430 self.redo_action = QtGui.QAction("&Redo",
432 self.redo_action = QtGui.QAction("&Redo",
431 self,
433 self,
432 shortcut=QtGui.QKeySequence.Redo,
434 shortcut=QtGui.QKeySequence.Redo,
433 statusTip="Redo last action if possible",
435 statusTip="Redo last action if possible",
434 triggered=self.redo_active_frontend)
436 triggered=self.redo_active_frontend)
435 self.add_menu_action(self.edit_menu, self.redo_action)
437 self.add_menu_action(self.edit_menu, self.redo_action)
436
438
437 self.edit_menu.addSeparator()
439 self.edit_menu.addSeparator()
438
440
439 self.cut_action = QtGui.QAction("&Cut",
441 self.cut_action = QtGui.QAction("&Cut",
440 self,
442 self,
441 shortcut=QtGui.QKeySequence.Cut,
443 shortcut=QtGui.QKeySequence.Cut,
442 triggered=self.cut_active_frontend
444 triggered=self.cut_active_frontend
443 )
445 )
444 self.add_menu_action(self.edit_menu, self.cut_action, True)
446 self.add_menu_action(self.edit_menu, self.cut_action, True)
445
447
446 self.copy_action = QtGui.QAction("&Copy",
448 self.copy_action = QtGui.QAction("&Copy",
447 self,
449 self,
448 shortcut=QtGui.QKeySequence.Copy,
450 shortcut=QtGui.QKeySequence.Copy,
449 triggered=self.copy_active_frontend
451 triggered=self.copy_active_frontend
450 )
452 )
451 self.add_menu_action(self.edit_menu, self.copy_action, True)
453 self.add_menu_action(self.edit_menu, self.copy_action, True)
452
454
453 self.copy_raw_action = QtGui.QAction("Copy (&Raw Text)",
455 self.copy_raw_action = QtGui.QAction("Copy (&Raw Text)",
454 self,
456 self,
455 shortcut="Ctrl+Shift+C",
457 shortcut="Ctrl+Shift+C",
456 triggered=self.copy_raw_active_frontend
458 triggered=self.copy_raw_active_frontend
457 )
459 )
458 self.add_menu_action(self.edit_menu, self.copy_raw_action, True)
460 self.add_menu_action(self.edit_menu, self.copy_raw_action, True)
459
461
460 self.paste_action = QtGui.QAction("&Paste",
462 self.paste_action = QtGui.QAction("&Paste",
461 self,
463 self,
462 shortcut=QtGui.QKeySequence.Paste,
464 shortcut=QtGui.QKeySequence.Paste,
463 triggered=self.paste_active_frontend
465 triggered=self.paste_active_frontend
464 )
466 )
465 self.add_menu_action(self.edit_menu, self.paste_action, True)
467 self.add_menu_action(self.edit_menu, self.paste_action, True)
466
468
467 self.edit_menu.addSeparator()
469 self.edit_menu.addSeparator()
468
470
469 selectall = QtGui.QKeySequence(QtGui.QKeySequence.SelectAll)
471 selectall = QtGui.QKeySequence(QtGui.QKeySequence.SelectAll)
470 if selectall.matches("Ctrl+A") and sys.platform != 'darwin':
472 if selectall.matches("Ctrl+A") and sys.platform != 'darwin':
471 # Only override the default if there is a collision.
473 # Only override the default if there is a collision.
472 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
474 # Qt ctrl = cmd on OSX, so the match gets a false positive on OSX.
473 selectall = "Ctrl+Shift+A"
475 selectall = "Ctrl+Shift+A"
474 self.select_all_action = QtGui.QAction("Select &All",
476 self.select_all_action = QtGui.QAction("Select &All",
475 self,
477 self,
476 shortcut=selectall,
478 shortcut=selectall,
477 triggered=self.select_all_active_frontend
479 triggered=self.select_all_active_frontend
478 )
480 )
479 self.add_menu_action(self.edit_menu, self.select_all_action, True)
481 self.add_menu_action(self.edit_menu, self.select_all_action, True)
480
482
481
483
482 def init_view_menu(self):
484 def init_view_menu(self):
483 self.view_menu = self.menuBar().addMenu("&View")
485 self.view_menu = self.menuBar().addMenu("&View")
484
486
485 if sys.platform != 'darwin':
487 if sys.platform != 'darwin':
486 # disable on OSX, where there is always a menu bar
488 # disable on OSX, where there is always a menu bar
487 self.toggle_menu_bar_act = QtGui.QAction("Toggle &Menu Bar",
489 self.toggle_menu_bar_act = QtGui.QAction("Toggle &Menu Bar",
488 self,
490 self,
489 shortcut="Ctrl+Shift+M",
491 shortcut="Ctrl+Shift+M",
490 statusTip="Toggle visibility of menubar",
492 statusTip="Toggle visibility of menubar",
491 triggered=self.toggle_menu_bar)
493 triggered=self.toggle_menu_bar)
492 self.add_menu_action(self.view_menu, self.toggle_menu_bar_act)
494 self.add_menu_action(self.view_menu, self.toggle_menu_bar_act)
493
495
494 fs_key = "Ctrl+Meta+F" if sys.platform == 'darwin' else "F11"
496 fs_key = "Ctrl+Meta+F" if sys.platform == 'darwin' else "F11"
495 self.full_screen_act = QtGui.QAction("&Full Screen",
497 self.full_screen_act = QtGui.QAction("&Full Screen",
496 self,
498 self,
497 shortcut=fs_key,
499 shortcut=fs_key,
498 statusTip="Toggle between Fullscreen and Normal Size",
500 statusTip="Toggle between Fullscreen and Normal Size",
499 triggered=self.toggleFullScreen)
501 triggered=self.toggleFullScreen)
500 self.add_menu_action(self.view_menu, self.full_screen_act)
502 self.add_menu_action(self.view_menu, self.full_screen_act)
501
503
502 self.view_menu.addSeparator()
504 self.view_menu.addSeparator()
503
505
504 self.increase_font_size = QtGui.QAction("Zoom &In",
506 self.increase_font_size = QtGui.QAction("Zoom &In",
505 self,
507 self,
506 shortcut=QtGui.QKeySequence.ZoomIn,
508 shortcut=QtGui.QKeySequence.ZoomIn,
507 triggered=self.increase_font_size_active_frontend
509 triggered=self.increase_font_size_active_frontend
508 )
510 )
509 self.add_menu_action(self.view_menu, self.increase_font_size, True)
511 self.add_menu_action(self.view_menu, self.increase_font_size, True)
510
512
511 self.decrease_font_size = QtGui.QAction("Zoom &Out",
513 self.decrease_font_size = QtGui.QAction("Zoom &Out",
512 self,
514 self,
513 shortcut=QtGui.QKeySequence.ZoomOut,
515 shortcut=QtGui.QKeySequence.ZoomOut,
514 triggered=self.decrease_font_size_active_frontend
516 triggered=self.decrease_font_size_active_frontend
515 )
517 )
516 self.add_menu_action(self.view_menu, self.decrease_font_size, True)
518 self.add_menu_action(self.view_menu, self.decrease_font_size, True)
517
519
518 self.reset_font_size = QtGui.QAction("Zoom &Reset",
520 self.reset_font_size = QtGui.QAction("Zoom &Reset",
519 self,
521 self,
520 shortcut="Ctrl+0",
522 shortcut="Ctrl+0",
521 triggered=self.reset_font_size_active_frontend
523 triggered=self.reset_font_size_active_frontend
522 )
524 )
523 self.add_menu_action(self.view_menu, self.reset_font_size, True)
525 self.add_menu_action(self.view_menu, self.reset_font_size, True)
524
526
525 self.view_menu.addSeparator()
527 self.view_menu.addSeparator()
526
528
527 self.clear_action = QtGui.QAction("&Clear Screen",
529 self.clear_action = QtGui.QAction("&Clear Screen",
528 self,
530 self,
529 shortcut='Ctrl+L',
531 shortcut='Ctrl+L',
530 statusTip="Clear the console",
532 statusTip="Clear the console",
531 triggered=self.clear_magic_active_frontend)
533 triggered=self.clear_magic_active_frontend)
532 self.add_menu_action(self.view_menu, self.clear_action)
534 self.add_menu_action(self.view_menu, self.clear_action)
533
535
534 self.pager_menu = self.view_menu.addMenu("&Pager")
536 self.pager_menu = self.view_menu.addMenu("&Pager")
535
537
536 hsplit_action = QtGui.QAction(".. &Horizontal Split",
538 hsplit_action = QtGui.QAction(".. &Horizontal Split",
537 self,
539 self,
538 triggered=lambda: self.set_paging_active_frontend('hsplit'))
540 triggered=lambda: self.set_paging_active_frontend('hsplit'))
539
541
540 vsplit_action = QtGui.QAction(" : &Vertical Split",
542 vsplit_action = QtGui.QAction(" : &Vertical Split",
541 self,
543 self,
542 triggered=lambda: self.set_paging_active_frontend('vsplit'))
544 triggered=lambda: self.set_paging_active_frontend('vsplit'))
543
545
544 inside_action = QtGui.QAction(" &Inside Pager",
546 inside_action = QtGui.QAction(" &Inside Pager",
545 self,
547 self,
546 triggered=lambda: self.set_paging_active_frontend('inside'))
548 triggered=lambda: self.set_paging_active_frontend('inside'))
547
549
548 self.pager_menu.addAction(hsplit_action)
550 self.pager_menu.addAction(hsplit_action)
549 self.pager_menu.addAction(vsplit_action)
551 self.pager_menu.addAction(vsplit_action)
550 self.pager_menu.addAction(inside_action)
552 self.pager_menu.addAction(inside_action)
551
553
552 def init_kernel_menu(self):
554 def init_kernel_menu(self):
553 self.kernel_menu = self.menuBar().addMenu("&Kernel")
555 self.kernel_menu = self.menuBar().addMenu("&Kernel")
554 # Qt on OSX maps Ctrl to Cmd, and Meta to Ctrl
556 # Qt on OSX maps Ctrl to Cmd, and Meta to Ctrl
555 # keep the signal shortcuts to ctrl, rather than
557 # keep the signal shortcuts to ctrl, rather than
556 # platform-default like we do elsewhere.
558 # platform-default like we do elsewhere.
557
559
558 ctrl = "Meta" if sys.platform == 'darwin' else "Ctrl"
560 ctrl = "Meta" if sys.platform == 'darwin' else "Ctrl"
559
561
560 self.interrupt_kernel_action = QtGui.QAction("&Interrupt current Kernel",
562 self.interrupt_kernel_action = QtGui.QAction("&Interrupt current Kernel",
561 self,
563 self,
562 triggered=self.interrupt_kernel_active_frontend,
564 triggered=self.interrupt_kernel_active_frontend,
563 shortcut=ctrl+"+C",
565 shortcut=ctrl+"+C",
564 )
566 )
565 self.add_menu_action(self.kernel_menu, self.interrupt_kernel_action)
567 self.add_menu_action(self.kernel_menu, self.interrupt_kernel_action)
566
568
567 self.restart_kernel_action = QtGui.QAction("&Restart current Kernel",
569 self.restart_kernel_action = QtGui.QAction("&Restart current Kernel",
568 self,
570 self,
569 triggered=self.restart_kernel_active_frontend,
571 triggered=self.restart_kernel_active_frontend,
570 shortcut=ctrl+"+.",
572 shortcut=ctrl+"+.",
571 )
573 )
572 self.add_menu_action(self.kernel_menu, self.restart_kernel_action)
574 self.add_menu_action(self.kernel_menu, self.restart_kernel_action)
573
575
574 self.kernel_menu.addSeparator()
576 self.kernel_menu.addSeparator()
575
577
576 self.confirm_restart_kernel_action = QtGui.QAction("&Confirm kernel restart",
578 self.confirm_restart_kernel_action = QtGui.QAction("&Confirm kernel restart",
577 self,
579 self,
578 checkable=True,
580 checkable=True,
579 checked=self.active_frontend.confirm_restart,
581 checked=self.active_frontend.confirm_restart,
580 triggered=self.toggle_confirm_restart_active_frontend
582 triggered=self.toggle_confirm_restart_active_frontend
581 )
583 )
582
584
583 self.add_menu_action(self.kernel_menu, self.confirm_restart_kernel_action)
585 self.add_menu_action(self.kernel_menu, self.confirm_restart_kernel_action)
584 self.tab_widget.currentChanged.connect(self.update_restart_checkbox)
586 self.tab_widget.currentChanged.connect(self.update_restart_checkbox)
585
587
586 def _make_dynamic_magic(self,magic):
588 def _make_dynamic_magic(self,magic):
587 """Return a function `fun` that will execute `magic` on active frontend.
589 """Return a function `fun` that will execute `magic` on active frontend.
588
590
589 Parameters
591 Parameters
590 ----------
592 ----------
591 magic : string
593 magic : string
592 string that will be executed as is when the returned function is called
594 string that will be executed as is when the returned function is called
593
595
594 Returns
596 Returns
595 -------
597 -------
596 fun : function
598 fun : function
597 function with no parameters, when called will execute `magic` on the
599 function with no parameters, when called will execute `magic` on the
598 current active frontend at call time
600 current active frontend at call time
599
601
600 See Also
602 See Also
601 --------
603 --------
602 populate_all_magic_menu : generate the "All Magics..." menu
604 populate_all_magic_menu : generate the "All Magics..." menu
603
605
604 Notes
606 Notes
605 -----
607 -----
606 `fun` executes `magic` in active frontend at the moment it is triggered,
608 `fun` executes `magic` in active frontend at the moment it is triggered,
607 not the active frontend at the moment it was created.
609 not the active frontend at the moment it was created.
608
610
609 This function is mostly used to create the "All Magics..." Menu at run time.
611 This function is mostly used to create the "All Magics..." Menu at run time.
610 """
612 """
611 # need two level nested function to be sure to pass magic
613 # need two level nested function to be sure to pass magic
612 # to active frontend **at run time**.
614 # to active frontend **at run time**.
613 def inner_dynamic_magic():
615 def inner_dynamic_magic():
614 self.active_frontend.execute(magic)
616 self.active_frontend.execute(magic)
615 inner_dynamic_magic.__name__ = "dynamics_magic_s"
617 inner_dynamic_magic.__name__ = "dynamics_magic_s"
616 return inner_dynamic_magic
618 return inner_dynamic_magic
617
619
618 def populate_all_magic_menu(self, listofmagic=None):
620 def populate_all_magic_menu(self, display_data=None):
619 """Clean "All Magics..." menu and repopulate it with `listofmagic`
621 """Clean "All Magics..." menu and repopulate it with `display_data`
620
622
621 Parameters
623 Parameters
622 ----------
624 ----------
623 listofmagic : string,
625 display_data : dict,
624 repr() of a list of strings, send back by the kernel
626 dict of display_data for the magics dict of a MagicsManager.
627 Expects json data, as the result of %lsmagic
625
628
626 Notes
627 -----
628 `listofmagic`is a repr() of list because it is fed with the result of
629 a 'user_expression'
630 """
629 """
631 for k,v in self._magic_menu_dict.items():
630 for k,v in self._magic_menu_dict.items():
632 v.clear()
631 v.clear()
633 self.all_magic_menu.clear()
632 self.all_magic_menu.clear()
634
633
635
634 if not display_data:
636 mlist=ast.literal_eval(listofmagic)
635 return
637 for magic in mlist:
636
638 cell = (magic['type'] == 'cell')
637 if display_data['status'] != 'ok':
639 name = magic['name']
638 self.log.warn("%%lsmagic user-expression failed: %s" % display_data)
640 mclass = magic['class']
639 return
641 if cell :
640
642 prefix='%%'
641 mdict = json.loads(display_data['data'].get('application/json', {}))
643 else :
642
644 prefix='%'
643 for mtype in sorted(mdict):
645 magic_menu = self._get_magic_menu(mclass)
644 subdict = mdict[mtype]
646
645 prefix = magic_escapes[mtype]
647 pmagic = '%s%s'%(prefix,name)
646 for name in sorted(subdict):
648
647 mclass = subdict[name]
649 xaction = QtGui.QAction(pmagic,
648 magic_menu = self._get_magic_menu(mclass)
650 self,
649 pmagic = prefix + name
651 triggered=self._make_dynamic_magic(pmagic)
650 xaction = QtGui.QAction(pmagic,
652 )
651 self,
653 magic_menu.addAction(xaction)
652 triggered=self._make_dynamic_magic(pmagic)
654 self.all_magic_menu.addAction(xaction)
653 )
654 magic_menu.addAction(xaction)
655 self.all_magic_menu.addAction(xaction)
655
656
656 def update_all_magic_menu(self):
657 def update_all_magic_menu(self):
657 """ Update the list of magics in the "All Magics..." Menu
658 """ Update the list of magics in the "All Magics..." Menu
658
659
659 Request the kernel with the list of available magics and populate the
660 Request the kernel with the list of available magics and populate the
660 menu with the list received back
661 menu with the list received back
661
662
662 """
663 """
663 self.active_frontend._silent_exec_callback('get_ipython().magics_manager.lsmagic_info()',
664 self.active_frontend._silent_exec_callback('get_ipython().magic("lsmagic")',
664 self.populate_all_magic_menu)
665 self.populate_all_magic_menu)
665
666
666 def _get_magic_menu(self,menuidentifier, menulabel=None):
667 def _get_magic_menu(self,menuidentifier, menulabel=None):
667 """return a submagic menu by name, and create it if needed
668 """return a submagic menu by name, and create it if needed
668
669
669 parameters:
670 parameters:
670 -----------
671 -----------
671
672
672 menulabel : str
673 menulabel : str
673 Label for the menu
674 Label for the menu
674
675
675 Will infere the menu name from the identifier at creation if menulabel not given.
676 Will infere the menu name from the identifier at creation if menulabel not given.
676 To do so you have too give menuidentifier as a CamelCassedString
677 To do so you have too give menuidentifier as a CamelCassedString
677 """
678 """
678 menu = self._magic_menu_dict.get(menuidentifier,None)
679 menu = self._magic_menu_dict.get(menuidentifier,None)
679 if not menu :
680 if not menu :
680 if not menulabel:
681 if not menulabel:
681 menulabel = re.sub("([a-zA-Z]+)([A-Z][a-z])","\g<1> \g<2>",menuidentifier)
682 menulabel = re.sub("([a-zA-Z]+)([A-Z][a-z])","\g<1> \g<2>",menuidentifier)
682 menu = QtGui.QMenu(menulabel,self.magic_menu)
683 menu = QtGui.QMenu(menulabel,self.magic_menu)
683 self._magic_menu_dict[menuidentifier]=menu
684 self._magic_menu_dict[menuidentifier]=menu
684 self.magic_menu.insertMenu(self.magic_menu_separator,menu)
685 self.magic_menu.insertMenu(self.magic_menu_separator,menu)
685 return menu
686 return menu
686
687
687
688
688
689
689 def init_magic_menu(self):
690 def init_magic_menu(self):
690 self.magic_menu = self.menuBar().addMenu("&Magic")
691 self.magic_menu = self.menuBar().addMenu("&Magic")
691 self.magic_menu_separator = self.magic_menu.addSeparator()
692 self.magic_menu_separator = self.magic_menu.addSeparator()
692
693
693 self.all_magic_menu = self._get_magic_menu("AllMagics", menulabel="&All Magics...")
694 self.all_magic_menu = self._get_magic_menu("AllMagics", menulabel="&All Magics...")
694
695
695 # This action should usually not appear as it will be cleared when menu
696 # This action should usually not appear as it will be cleared when menu
696 # is updated at first kernel response. Though, it is necessary when
697 # is updated at first kernel response. Though, it is necessary when
697 # connecting through X-forwarding, as in this case, the menu is not
698 # connecting through X-forwarding, as in this case, the menu is not
698 # auto updated, SO DO NOT DELETE.
699 # auto updated, SO DO NOT DELETE.
699 self.pop = QtGui.QAction("&Update All Magic Menu ",
700 self.pop = QtGui.QAction("&Update All Magic Menu ",
700 self, triggered=self.update_all_magic_menu)
701 self, triggered=self.update_all_magic_menu)
701 self.add_menu_action(self.all_magic_menu, self.pop)
702 self.add_menu_action(self.all_magic_menu, self.pop)
702 # we need to populate the 'Magic Menu' once the kernel has answer at
703 # we need to populate the 'Magic Menu' once the kernel has answer at
703 # least once let's do it immediately, but it's assured to works
704 # least once let's do it immediately, but it's assured to works
704 self.pop.trigger()
705 self.pop.trigger()
705
706
706 self.reset_action = QtGui.QAction("&Reset",
707 self.reset_action = QtGui.QAction("&Reset",
707 self,
708 self,
708 statusTip="Clear all variables from workspace",
709 statusTip="Clear all variables from workspace",
709 triggered=self.reset_magic_active_frontend)
710 triggered=self.reset_magic_active_frontend)
710 self.add_menu_action(self.magic_menu, self.reset_action)
711 self.add_menu_action(self.magic_menu, self.reset_action)
711
712
712 self.history_action = QtGui.QAction("&History",
713 self.history_action = QtGui.QAction("&History",
713 self,
714 self,
714 statusTip="show command history",
715 statusTip="show command history",
715 triggered=self.history_magic_active_frontend)
716 triggered=self.history_magic_active_frontend)
716 self.add_menu_action(self.magic_menu, self.history_action)
717 self.add_menu_action(self.magic_menu, self.history_action)
717
718
718 self.save_action = QtGui.QAction("E&xport History ",
719 self.save_action = QtGui.QAction("E&xport History ",
719 self,
720 self,
720 statusTip="Export History as Python File",
721 statusTip="Export History as Python File",
721 triggered=self.save_magic_active_frontend)
722 triggered=self.save_magic_active_frontend)
722 self.add_menu_action(self.magic_menu, self.save_action)
723 self.add_menu_action(self.magic_menu, self.save_action)
723
724
724 self.who_action = QtGui.QAction("&Who",
725 self.who_action = QtGui.QAction("&Who",
725 self,
726 self,
726 statusTip="List interactive variables",
727 statusTip="List interactive variables",
727 triggered=self.who_magic_active_frontend)
728 triggered=self.who_magic_active_frontend)
728 self.add_menu_action(self.magic_menu, self.who_action)
729 self.add_menu_action(self.magic_menu, self.who_action)
729
730
730 self.who_ls_action = QtGui.QAction("Wh&o ls",
731 self.who_ls_action = QtGui.QAction("Wh&o ls",
731 self,
732 self,
732 statusTip="Return a list of interactive variables",
733 statusTip="Return a list of interactive variables",
733 triggered=self.who_ls_magic_active_frontend)
734 triggered=self.who_ls_magic_active_frontend)
734 self.add_menu_action(self.magic_menu, self.who_ls_action)
735 self.add_menu_action(self.magic_menu, self.who_ls_action)
735
736
736 self.whos_action = QtGui.QAction("Who&s",
737 self.whos_action = QtGui.QAction("Who&s",
737 self,
738 self,
738 statusTip="List interactive variables with details",
739 statusTip="List interactive variables with details",
739 triggered=self.whos_magic_active_frontend)
740 triggered=self.whos_magic_active_frontend)
740 self.add_menu_action(self.magic_menu, self.whos_action)
741 self.add_menu_action(self.magic_menu, self.whos_action)
741
742
742 def init_window_menu(self):
743 def init_window_menu(self):
743 self.window_menu = self.menuBar().addMenu("&Window")
744 self.window_menu = self.menuBar().addMenu("&Window")
744 if sys.platform == 'darwin':
745 if sys.platform == 'darwin':
745 # add min/maximize actions to OSX, which lacks default bindings.
746 # add min/maximize actions to OSX, which lacks default bindings.
746 self.minimizeAct = QtGui.QAction("Mini&mize",
747 self.minimizeAct = QtGui.QAction("Mini&mize",
747 self,
748 self,
748 shortcut="Ctrl+m",
749 shortcut="Ctrl+m",
749 statusTip="Minimize the window/Restore Normal Size",
750 statusTip="Minimize the window/Restore Normal Size",
750 triggered=self.toggleMinimized)
751 triggered=self.toggleMinimized)
751 # maximize is called 'Zoom' on OSX for some reason
752 # maximize is called 'Zoom' on OSX for some reason
752 self.maximizeAct = QtGui.QAction("&Zoom",
753 self.maximizeAct = QtGui.QAction("&Zoom",
753 self,
754 self,
754 shortcut="Ctrl+Shift+M",
755 shortcut="Ctrl+Shift+M",
755 statusTip="Maximize the window/Restore Normal Size",
756 statusTip="Maximize the window/Restore Normal Size",
756 triggered=self.toggleMaximized)
757 triggered=self.toggleMaximized)
757
758
758 self.add_menu_action(self.window_menu, self.minimizeAct)
759 self.add_menu_action(self.window_menu, self.minimizeAct)
759 self.add_menu_action(self.window_menu, self.maximizeAct)
760 self.add_menu_action(self.window_menu, self.maximizeAct)
760 self.window_menu.addSeparator()
761 self.window_menu.addSeparator()
761
762
762 prev_key = "Ctrl+Shift+Left" if sys.platform == 'darwin' else "Ctrl+PgUp"
763 prev_key = "Ctrl+Shift+Left" if sys.platform == 'darwin' else "Ctrl+PgUp"
763 self.prev_tab_act = QtGui.QAction("Pre&vious Tab",
764 self.prev_tab_act = QtGui.QAction("Pre&vious Tab",
764 self,
765 self,
765 shortcut=prev_key,
766 shortcut=prev_key,
766 statusTip="Select previous tab",
767 statusTip="Select previous tab",
767 triggered=self.prev_tab)
768 triggered=self.prev_tab)
768 self.add_menu_action(self.window_menu, self.prev_tab_act)
769 self.add_menu_action(self.window_menu, self.prev_tab_act)
769
770
770 next_key = "Ctrl+Shift+Right" if sys.platform == 'darwin' else "Ctrl+PgDown"
771 next_key = "Ctrl+Shift+Right" if sys.platform == 'darwin' else "Ctrl+PgDown"
771 self.next_tab_act = QtGui.QAction("Ne&xt Tab",
772 self.next_tab_act = QtGui.QAction("Ne&xt Tab",
772 self,
773 self,
773 shortcut=next_key,
774 shortcut=next_key,
774 statusTip="Select next tab",
775 statusTip="Select next tab",
775 triggered=self.next_tab)
776 triggered=self.next_tab)
776 self.add_menu_action(self.window_menu, self.next_tab_act)
777 self.add_menu_action(self.window_menu, self.next_tab_act)
777
778
778 def init_help_menu(self):
779 def init_help_menu(self):
779 # please keep the Help menu in Mac Os even if empty. It will
780 # please keep the Help menu in Mac Os even if empty. It will
780 # automatically contain a search field to search inside menus and
781 # automatically contain a search field to search inside menus and
781 # please keep it spelled in English, as long as Qt Doesn't support
782 # please keep it spelled in English, as long as Qt Doesn't support
782 # a QAction.MenuRole like HelpMenuRole otherwise it will lose
783 # a QAction.MenuRole like HelpMenuRole otherwise it will lose
783 # this search field functionality
784 # this search field functionality
784
785
785 self.help_menu = self.menuBar().addMenu("&Help")
786 self.help_menu = self.menuBar().addMenu("&Help")
786
787
787
788
788 # Help Menu
789 # Help Menu
789
790
790 self.intro_active_frontend_action = QtGui.QAction("&Intro to IPython",
791 self.intro_active_frontend_action = QtGui.QAction("&Intro to IPython",
791 self,
792 self,
792 triggered=self.intro_active_frontend
793 triggered=self.intro_active_frontend
793 )
794 )
794 self.add_menu_action(self.help_menu, self.intro_active_frontend_action)
795 self.add_menu_action(self.help_menu, self.intro_active_frontend_action)
795
796
796 self.quickref_active_frontend_action = QtGui.QAction("IPython &Cheat Sheet",
797 self.quickref_active_frontend_action = QtGui.QAction("IPython &Cheat Sheet",
797 self,
798 self,
798 triggered=self.quickref_active_frontend
799 triggered=self.quickref_active_frontend
799 )
800 )
800 self.add_menu_action(self.help_menu, self.quickref_active_frontend_action)
801 self.add_menu_action(self.help_menu, self.quickref_active_frontend_action)
801
802
802 self.guiref_active_frontend_action = QtGui.QAction("&Qt Console",
803 self.guiref_active_frontend_action = QtGui.QAction("&Qt Console",
803 self,
804 self,
804 triggered=self.guiref_active_frontend
805 triggered=self.guiref_active_frontend
805 )
806 )
806 self.add_menu_action(self.help_menu, self.guiref_active_frontend_action)
807 self.add_menu_action(self.help_menu, self.guiref_active_frontend_action)
807
808
808 self.onlineHelpAct = QtGui.QAction("Open Online &Help",
809 self.onlineHelpAct = QtGui.QAction("Open Online &Help",
809 self,
810 self,
810 triggered=self._open_online_help)
811 triggered=self._open_online_help)
811 self.add_menu_action(self.help_menu, self.onlineHelpAct)
812 self.add_menu_action(self.help_menu, self.onlineHelpAct)
812
813
813 # minimize/maximize/fullscreen actions:
814 # minimize/maximize/fullscreen actions:
814
815
815 def toggle_menu_bar(self):
816 def toggle_menu_bar(self):
816 menu_bar = self.menuBar()
817 menu_bar = self.menuBar()
817 if menu_bar.isVisible():
818 if menu_bar.isVisible():
818 menu_bar.setVisible(False)
819 menu_bar.setVisible(False)
819 else:
820 else:
820 menu_bar.setVisible(True)
821 menu_bar.setVisible(True)
821
822
822 def toggleMinimized(self):
823 def toggleMinimized(self):
823 if not self.isMinimized():
824 if not self.isMinimized():
824 self.showMinimized()
825 self.showMinimized()
825 else:
826 else:
826 self.showNormal()
827 self.showNormal()
827
828
828 def _open_online_help(self):
829 def _open_online_help(self):
829 filename="http://ipython.org/ipython-doc/stable/index.html"
830 filename="http://ipython.org/ipython-doc/stable/index.html"
830 webbrowser.open(filename, new=1, autoraise=True)
831 webbrowser.open(filename, new=1, autoraise=True)
831
832
832 def toggleMaximized(self):
833 def toggleMaximized(self):
833 if not self.isMaximized():
834 if not self.isMaximized():
834 self.showMaximized()
835 self.showMaximized()
835 else:
836 else:
836 self.showNormal()
837 self.showNormal()
837
838
838 # Min/Max imizing while in full screen give a bug
839 # Min/Max imizing while in full screen give a bug
839 # when going out of full screen, at least on OSX
840 # when going out of full screen, at least on OSX
840 def toggleFullScreen(self):
841 def toggleFullScreen(self):
841 if not self.isFullScreen():
842 if not self.isFullScreen():
842 self.showFullScreen()
843 self.showFullScreen()
843 if sys.platform == 'darwin':
844 if sys.platform == 'darwin':
844 self.maximizeAct.setEnabled(False)
845 self.maximizeAct.setEnabled(False)
845 self.minimizeAct.setEnabled(False)
846 self.minimizeAct.setEnabled(False)
846 else:
847 else:
847 self.showNormal()
848 self.showNormal()
848 if sys.platform == 'darwin':
849 if sys.platform == 'darwin':
849 self.maximizeAct.setEnabled(True)
850 self.maximizeAct.setEnabled(True)
850 self.minimizeAct.setEnabled(True)
851 self.minimizeAct.setEnabled(True)
851
852
852 def set_paging_active_frontend(self, paging):
853 def set_paging_active_frontend(self, paging):
853 self.active_frontend._set_paging(paging)
854 self.active_frontend._set_paging(paging)
854
855
855 def close_active_frontend(self):
856 def close_active_frontend(self):
856 self.close_tab(self.active_frontend)
857 self.close_tab(self.active_frontend)
857
858
858 def restart_kernel_active_frontend(self):
859 def restart_kernel_active_frontend(self):
859 self.active_frontend.request_restart_kernel()
860 self.active_frontend.request_restart_kernel()
860
861
861 def interrupt_kernel_active_frontend(self):
862 def interrupt_kernel_active_frontend(self):
862 self.active_frontend.request_interrupt_kernel()
863 self.active_frontend.request_interrupt_kernel()
863
864
864 def toggle_confirm_restart_active_frontend(self):
865 def toggle_confirm_restart_active_frontend(self):
865 widget = self.active_frontend
866 widget = self.active_frontend
866 widget.confirm_restart = not widget.confirm_restart
867 widget.confirm_restart = not widget.confirm_restart
867 self.confirm_restart_kernel_action.setChecked(widget.confirm_restart)
868 self.confirm_restart_kernel_action.setChecked(widget.confirm_restart)
868
869
869 def update_restart_checkbox(self):
870 def update_restart_checkbox(self):
870 if self.active_frontend is None:
871 if self.active_frontend is None:
871 return
872 return
872 widget = self.active_frontend
873 widget = self.active_frontend
873 self.confirm_restart_kernel_action.setChecked(widget.confirm_restart)
874 self.confirm_restart_kernel_action.setChecked(widget.confirm_restart)
874
875
875 def cut_active_frontend(self):
876 def cut_active_frontend(self):
876 widget = self.active_frontend
877 widget = self.active_frontend
877 if widget.can_cut():
878 if widget.can_cut():
878 widget.cut()
879 widget.cut()
879
880
880 def copy_active_frontend(self):
881 def copy_active_frontend(self):
881 widget = self.active_frontend
882 widget = self.active_frontend
882 widget.copy()
883 widget.copy()
883
884
884 def copy_raw_active_frontend(self):
885 def copy_raw_active_frontend(self):
885 self.active_frontend._copy_raw_action.trigger()
886 self.active_frontend._copy_raw_action.trigger()
886
887
887 def paste_active_frontend(self):
888 def paste_active_frontend(self):
888 widget = self.active_frontend
889 widget = self.active_frontend
889 if widget.can_paste():
890 if widget.can_paste():
890 widget.paste()
891 widget.paste()
891
892
892 def undo_active_frontend(self):
893 def undo_active_frontend(self):
893 self.active_frontend.undo()
894 self.active_frontend.undo()
894
895
895 def redo_active_frontend(self):
896 def redo_active_frontend(self):
896 self.active_frontend.redo()
897 self.active_frontend.redo()
897
898
898 def reset_magic_active_frontend(self):
899 def reset_magic_active_frontend(self):
899 self.active_frontend.execute("%reset")
900 self.active_frontend.execute("%reset")
900
901
901 def history_magic_active_frontend(self):
902 def history_magic_active_frontend(self):
902 self.active_frontend.execute("%history")
903 self.active_frontend.execute("%history")
903
904
904 def save_magic_active_frontend(self):
905 def save_magic_active_frontend(self):
905 self.active_frontend.save_magic()
906 self.active_frontend.save_magic()
906
907
907 def clear_magic_active_frontend(self):
908 def clear_magic_active_frontend(self):
908 self.active_frontend.execute("%clear")
909 self.active_frontend.execute("%clear")
909
910
910 def who_magic_active_frontend(self):
911 def who_magic_active_frontend(self):
911 self.active_frontend.execute("%who")
912 self.active_frontend.execute("%who")
912
913
913 def who_ls_magic_active_frontend(self):
914 def who_ls_magic_active_frontend(self):
914 self.active_frontend.execute("%who_ls")
915 self.active_frontend.execute("%who_ls")
915
916
916 def whos_magic_active_frontend(self):
917 def whos_magic_active_frontend(self):
917 self.active_frontend.execute("%whos")
918 self.active_frontend.execute("%whos")
918
919
919 def print_action_active_frontend(self):
920 def print_action_active_frontend(self):
920 self.active_frontend.print_action.trigger()
921 self.active_frontend.print_action.trigger()
921
922
922 def export_action_active_frontend(self):
923 def export_action_active_frontend(self):
923 self.active_frontend.export_action.trigger()
924 self.active_frontend.export_action.trigger()
924
925
925 def select_all_active_frontend(self):
926 def select_all_active_frontend(self):
926 self.active_frontend.select_all_action.trigger()
927 self.active_frontend.select_all_action.trigger()
927
928
928 def increase_font_size_active_frontend(self):
929 def increase_font_size_active_frontend(self):
929 self.active_frontend.increase_font_size.trigger()
930 self.active_frontend.increase_font_size.trigger()
930
931
931 def decrease_font_size_active_frontend(self):
932 def decrease_font_size_active_frontend(self):
932 self.active_frontend.decrease_font_size.trigger()
933 self.active_frontend.decrease_font_size.trigger()
933
934
934 def reset_font_size_active_frontend(self):
935 def reset_font_size_active_frontend(self):
935 self.active_frontend.reset_font_size.trigger()
936 self.active_frontend.reset_font_size.trigger()
936
937
937 def guiref_active_frontend(self):
938 def guiref_active_frontend(self):
938 self.active_frontend.execute("%guiref")
939 self.active_frontend.execute("%guiref")
939
940
940 def intro_active_frontend(self):
941 def intro_active_frontend(self):
941 self.active_frontend.execute("?")
942 self.active_frontend.execute("?")
942
943
943 def quickref_active_frontend(self):
944 def quickref_active_frontend(self):
944 self.active_frontend.execute("%quickref")
945 self.active_frontend.execute("%quickref")
945 #---------------------------------------------------------------------------
946 #---------------------------------------------------------------------------
946 # QWidget interface
947 # QWidget interface
947 #---------------------------------------------------------------------------
948 #---------------------------------------------------------------------------
948
949
949 def closeEvent(self, event):
950 def closeEvent(self, event):
950 """ Forward the close event to every tabs contained by the windows
951 """ Forward the close event to every tabs contained by the windows
951 """
952 """
952 if self.tab_widget.count() == 0:
953 if self.tab_widget.count() == 0:
953 # no tabs, just close
954 # no tabs, just close
954 event.accept()
955 event.accept()
955 return
956 return
956 # Do Not loop on the widget count as it change while closing
957 # Do Not loop on the widget count as it change while closing
957 title = self.window().windowTitle()
958 title = self.window().windowTitle()
958 cancel = QtGui.QMessageBox.Cancel
959 cancel = QtGui.QMessageBox.Cancel
959 okay = QtGui.QMessageBox.Ok
960 okay = QtGui.QMessageBox.Ok
960
961
961 if self.confirm_exit:
962 if self.confirm_exit:
962 if self.tab_widget.count() > 1:
963 if self.tab_widget.count() > 1:
963 msg = "Close all tabs, stop all kernels, and Quit?"
964 msg = "Close all tabs, stop all kernels, and Quit?"
964 else:
965 else:
965 msg = "Close console, stop kernel, and Quit?"
966 msg = "Close console, stop kernel, and Quit?"
966 info = "Kernels not started here (e.g. notebooks) will be left alone."
967 info = "Kernels not started here (e.g. notebooks) will be left alone."
967 closeall = QtGui.QPushButton("&Quit", self)
968 closeall = QtGui.QPushButton("&Quit", self)
968 closeall.setShortcut('Q')
969 closeall.setShortcut('Q')
969 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
970 box = QtGui.QMessageBox(QtGui.QMessageBox.Question,
970 title, msg)
971 title, msg)
971 box.setInformativeText(info)
972 box.setInformativeText(info)
972 box.addButton(cancel)
973 box.addButton(cancel)
973 box.addButton(closeall, QtGui.QMessageBox.YesRole)
974 box.addButton(closeall, QtGui.QMessageBox.YesRole)
974 box.setDefaultButton(closeall)
975 box.setDefaultButton(closeall)
975 box.setEscapeButton(cancel)
976 box.setEscapeButton(cancel)
976 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
977 pixmap = QtGui.QPixmap(self._app.icon.pixmap(QtCore.QSize(64,64)))
977 box.setIconPixmap(pixmap)
978 box.setIconPixmap(pixmap)
978 reply = box.exec_()
979 reply = box.exec_()
979 else:
980 else:
980 reply = okay
981 reply = okay
981
982
982 if reply == cancel:
983 if reply == cancel:
983 event.ignore()
984 event.ignore()
984 return
985 return
985 if reply == okay:
986 if reply == okay:
986 while self.tab_widget.count() >= 1:
987 while self.tab_widget.count() >= 1:
987 # prevent further confirmations:
988 # prevent further confirmations:
988 widget = self.active_frontend
989 widget = self.active_frontend
989 widget._confirm_exit = False
990 widget._confirm_exit = False
990 self.close_tab(widget)
991 self.close_tab(widget)
991 event.accept()
992 event.accept()
992
993
@@ -1,483 +1,511 b''
1 """Test suite for our zeromq-based messaging specification.
1 """Test suite for our zeromq-based messaging specification.
2 """
2 """
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (C) 2010-2011 The IPython Development Team
4 # Copyright (C) 2010-2011 The IPython Development Team
5 #
5 #
6 # Distributed under the terms of the BSD License. The full license is in
6 # Distributed under the terms of the BSD License. The full license is in
7 # the file COPYING.txt, distributed as part of this software.
7 # the file COPYING.txt, distributed as part of this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 import re
10 import re
11 import sys
11 import sys
12 import time
12 import time
13 from subprocess import PIPE
13 from subprocess import PIPE
14 from Queue import Empty
14 from Queue import Empty
15
15
16 import nose.tools as nt
16 import nose.tools as nt
17
17
18 from IPython.kernel import KernelManager
18 from IPython.kernel import KernelManager
19
19
20
20
21 from IPython.testing import decorators as dec
21 from IPython.testing import decorators as dec
22 from IPython.utils import io
22 from IPython.utils import io
23 from IPython.utils.traitlets import (
23 from IPython.utils.traitlets import (
24 HasTraits, TraitError, Bool, Unicode, Dict, Integer, List, Enum, Any,
24 HasTraits, TraitError, Bool, Unicode, Dict, Integer, List, Enum, Any,
25 )
25 )
26
26
27 #-----------------------------------------------------------------------------
27 #-----------------------------------------------------------------------------
28 # Global setup and utilities
28 # Global setup and utilities
29 #-----------------------------------------------------------------------------
29 #-----------------------------------------------------------------------------
30
30
31 def setup():
31 def setup():
32 global KM, KC
32 global KM, KC
33 KM = KernelManager()
33 KM = KernelManager()
34 KM.start_kernel(stdout=PIPE, stderr=PIPE)
34 KM.start_kernel(stdout=PIPE, stderr=PIPE)
35 KC = KM.client()
35 KC = KM.client()
36 KC.start_channels()
36 KC.start_channels()
37
37
38 # wait for kernel to be ready
38 # wait for kernel to be ready
39 KC.execute("pass")
39 KC.execute("pass")
40 KC.get_shell_msg(block=True, timeout=5)
40 KC.get_shell_msg(block=True, timeout=5)
41 flush_channels()
41 flush_channels()
42
42
43
43
44 def teardown():
44 def teardown():
45 KC.stop_channels()
45 KC.stop_channels()
46 KM.shutdown_kernel()
46 KM.shutdown_kernel()
47
47
48
48
49 def flush_channels(kc=None):
49 def flush_channels(kc=None):
50 """flush any messages waiting on the queue"""
50 """flush any messages waiting on the queue"""
51 if kc is None:
51 if kc is None:
52 kc = KC
52 kc = KC
53 for channel in (kc.shell_channel, kc.iopub_channel):
53 for channel in (kc.shell_channel, kc.iopub_channel):
54 while True:
54 while True:
55 try:
55 try:
56 msg = channel.get_msg(block=True, timeout=0.1)
56 msg = channel.get_msg(block=True, timeout=0.1)
57 except Empty:
57 except Empty:
58 break
58 break
59 else:
59 else:
60 list(validate_message(msg))
60 list(validate_message(msg))
61
61
62
62
63 def execute(code='', kc=None, **kwargs):
63 def execute(code='', kc=None, **kwargs):
64 """wrapper for doing common steps for validating an execution request"""
64 """wrapper for doing common steps for validating an execution request"""
65 msg_id = KC.execute(code=code, **kwargs)
65 msg_id = KC.execute(code=code, **kwargs)
66 reply = KC.get_shell_msg(timeout=2)
66 reply = KC.get_shell_msg(timeout=2)
67 list(validate_message(reply, 'execute_reply', msg_id))
67 list(validate_message(reply, 'execute_reply', msg_id))
68 busy = KC.get_iopub_msg(timeout=2)
68 busy = KC.get_iopub_msg(timeout=2)
69 list(validate_message(busy, 'status', msg_id))
69 list(validate_message(busy, 'status', msg_id))
70 nt.assert_equal(busy['content']['execution_state'], 'busy')
70 nt.assert_equal(busy['content']['execution_state'], 'busy')
71
71
72 if not kwargs.get('silent'):
72 if not kwargs.get('silent'):
73 pyin = KC.get_iopub_msg(timeout=2)
73 pyin = KC.get_iopub_msg(timeout=2)
74 list(validate_message(pyin, 'pyin', msg_id))
74 list(validate_message(pyin, 'pyin', msg_id))
75 nt.assert_equal(pyin['content']['code'], code)
75 nt.assert_equal(pyin['content']['code'], code)
76
76
77 return msg_id, reply['content']
77 return msg_id, reply['content']
78
78
79 #-----------------------------------------------------------------------------
79 #-----------------------------------------------------------------------------
80 # MSG Spec References
80 # MSG Spec References
81 #-----------------------------------------------------------------------------
81 #-----------------------------------------------------------------------------
82
82
83
83
84 class Reference(HasTraits):
84 class Reference(HasTraits):
85
85
86 """
86 """
87 Base class for message spec specification testing.
87 Base class for message spec specification testing.
88
88
89 This class is the core of the message specification test. The
89 This class is the core of the message specification test. The
90 idea is that child classes implement trait attributes for each
90 idea is that child classes implement trait attributes for each
91 message keys, so that message keys can be tested against these
91 message keys, so that message keys can be tested against these
92 traits using :meth:`check` method.
92 traits using :meth:`check` method.
93
93
94 """
94 """
95
95
96 def check(self, d):
96 def check(self, d):
97 """validate a dict against our traits"""
97 """validate a dict against our traits"""
98 for key in self.trait_names():
98 for key in self.trait_names():
99 yield nt.assert_true(key in d, "Missing key: %r, should be found in %s" % (key, d))
99 yield nt.assert_true(key in d, "Missing key: %r, should be found in %s" % (key, d))
100 # FIXME: always allow None, probably not a good idea
100 # FIXME: always allow None, probably not a good idea
101 if d[key] is None:
101 if d[key] is None:
102 continue
102 continue
103 try:
103 try:
104 setattr(self, key, d[key])
104 setattr(self, key, d[key])
105 except TraitError as e:
105 except TraitError as e:
106 yield nt.assert_true(False, str(e))
106 yield nt.assert_true(False, str(e))
107
107
108
108
109 class RMessage(Reference):
109 class RMessage(Reference):
110 msg_id = Unicode()
110 msg_id = Unicode()
111 msg_type = Unicode()
111 msg_type = Unicode()
112 header = Dict()
112 header = Dict()
113 parent_header = Dict()
113 parent_header = Dict()
114 content = Dict()
114 content = Dict()
115
115
116 class RHeader(Reference):
116 class RHeader(Reference):
117 msg_id = Unicode()
117 msg_id = Unicode()
118 msg_type = Unicode()
118 msg_type = Unicode()
119 session = Unicode()
119 session = Unicode()
120 username = Unicode()
120 username = Unicode()
121
121
122 class RContent(Reference):
122 class RContent(Reference):
123 status = Enum((u'ok', u'error'))
123 status = Enum((u'ok', u'error'))
124
124
125
125
126 class ExecuteReply(Reference):
126 class ExecuteReply(Reference):
127 execution_count = Integer()
127 execution_count = Integer()
128 status = Enum((u'ok', u'error'))
128 status = Enum((u'ok', u'error'))
129
129
130 def check(self, d):
130 def check(self, d):
131 for tst in Reference.check(self, d):
131 for tst in Reference.check(self, d):
132 yield tst
132 yield tst
133 if d['status'] == 'ok':
133 if d['status'] == 'ok':
134 for tst in ExecuteReplyOkay().check(d):
134 for tst in ExecuteReplyOkay().check(d):
135 yield tst
135 yield tst
136 elif d['status'] == 'error':
136 elif d['status'] == 'error':
137 for tst in ExecuteReplyError().check(d):
137 for tst in ExecuteReplyError().check(d):
138 yield tst
138 yield tst
139
139
140
140
141 class ExecuteReplyOkay(Reference):
141 class ExecuteReplyOkay(Reference):
142 payload = List(Dict)
142 payload = List(Dict)
143 user_variables = Dict()
143 user_variables = Dict()
144 user_expressions = Dict()
144 user_expressions = Dict()
145
145
146
146
147 class ExecuteReplyError(Reference):
147 class ExecuteReplyError(Reference):
148 ename = Unicode()
148 ename = Unicode()
149 evalue = Unicode()
149 evalue = Unicode()
150 traceback = List(Unicode)
150 traceback = List(Unicode)
151
151
152
152
153 class OInfoReply(Reference):
153 class OInfoReply(Reference):
154 name = Unicode()
154 name = Unicode()
155 found = Bool()
155 found = Bool()
156 ismagic = Bool()
156 ismagic = Bool()
157 isalias = Bool()
157 isalias = Bool()
158 namespace = Enum((u'builtin', u'magics', u'alias', u'Interactive'))
158 namespace = Enum((u'builtin', u'magics', u'alias', u'Interactive'))
159 type_name = Unicode()
159 type_name = Unicode()
160 string_form = Unicode()
160 string_form = Unicode()
161 base_class = Unicode()
161 base_class = Unicode()
162 length = Integer()
162 length = Integer()
163 file = Unicode()
163 file = Unicode()
164 definition = Unicode()
164 definition = Unicode()
165 argspec = Dict()
165 argspec = Dict()
166 init_definition = Unicode()
166 init_definition = Unicode()
167 docstring = Unicode()
167 docstring = Unicode()
168 init_docstring = Unicode()
168 init_docstring = Unicode()
169 class_docstring = Unicode()
169 class_docstring = Unicode()
170 call_def = Unicode()
170 call_def = Unicode()
171 call_docstring = Unicode()
171 call_docstring = Unicode()
172 source = Unicode()
172 source = Unicode()
173
173
174 def check(self, d):
174 def check(self, d):
175 for tst in Reference.check(self, d):
175 for tst in Reference.check(self, d):
176 yield tst
176 yield tst
177 if d['argspec'] is not None:
177 if d['argspec'] is not None:
178 for tst in ArgSpec().check(d['argspec']):
178 for tst in ArgSpec().check(d['argspec']):
179 yield tst
179 yield tst
180
180
181
181
182 class ArgSpec(Reference):
182 class ArgSpec(Reference):
183 args = List(Unicode)
183 args = List(Unicode)
184 varargs = Unicode()
184 varargs = Unicode()
185 varkw = Unicode()
185 varkw = Unicode()
186 defaults = List()
186 defaults = List()
187
187
188
188
189 class Status(Reference):
189 class Status(Reference):
190 execution_state = Enum((u'busy', u'idle', u'starting'))
190 execution_state = Enum((u'busy', u'idle', u'starting'))
191
191
192
192
193 class CompleteReply(Reference):
193 class CompleteReply(Reference):
194 matches = List(Unicode)
194 matches = List(Unicode)
195
195
196
196
197 def Version(num, trait=Integer):
197 def Version(num, trait=Integer):
198 return List(trait, default_value=[0] * num, minlen=num, maxlen=num)
198 return List(trait, default_value=[0] * num, minlen=num, maxlen=num)
199
199
200
200
201 class KernelInfoReply(Reference):
201 class KernelInfoReply(Reference):
202
202
203 protocol_version = Version(2)
203 protocol_version = Version(2)
204 ipython_version = Version(4, Any)
204 ipython_version = Version(4, Any)
205 language_version = Version(3)
205 language_version = Version(3)
206 language = Unicode()
206 language = Unicode()
207
207
208 def _ipython_version_changed(self, name, old, new):
208 def _ipython_version_changed(self, name, old, new):
209 for v in new:
209 for v in new:
210 nt.assert_true(
210 nt.assert_true(
211 isinstance(v, int) or isinstance(v, basestring),
211 isinstance(v, int) or isinstance(v, basestring),
212 'expected int or string as version component, got {0!r}'
212 'expected int or string as version component, got {0!r}'
213 .format(v))
213 .format(v))
214
214
215
215
216 # IOPub messages
216 # IOPub messages
217
217
218 class PyIn(Reference):
218 class PyIn(Reference):
219 code = Unicode()
219 code = Unicode()
220 execution_count = Integer()
220 execution_count = Integer()
221
221
222
222
223 PyErr = ExecuteReplyError
223 PyErr = ExecuteReplyError
224
224
225
225
226 class Stream(Reference):
226 class Stream(Reference):
227 name = Enum((u'stdout', u'stderr'))
227 name = Enum((u'stdout', u'stderr'))
228 data = Unicode()
228 data = Unicode()
229
229
230
230
231 mime_pat = re.compile(r'\w+/\w+')
231 mime_pat = re.compile(r'\w+/\w+')
232
232
233 class DisplayData(Reference):
233 class DisplayData(Reference):
234 source = Unicode()
234 source = Unicode()
235 metadata = Dict()
235 metadata = Dict()
236 data = Dict()
236 data = Dict()
237 def _data_changed(self, name, old, new):
237 def _data_changed(self, name, old, new):
238 for k,v in new.iteritems():
238 for k,v in new.iteritems():
239 nt.assert_true(mime_pat.match(k))
239 nt.assert_true(mime_pat.match(k))
240 nt.assert_true(isinstance(v, basestring), "expected string data, got %r" % v)
240 nt.assert_true(isinstance(v, basestring), "expected string data, got %r" % v)
241
241
242
242
243 class PyOut(Reference):
243 class PyOut(Reference):
244 execution_count = Integer()
244 execution_count = Integer()
245 data = Dict()
245 data = Dict()
246 def _data_changed(self, name, old, new):
246 def _data_changed(self, name, old, new):
247 for k,v in new.iteritems():
247 for k,v in new.iteritems():
248 nt.assert_true(mime_pat.match(k))
248 nt.assert_true(mime_pat.match(k))
249 nt.assert_true(isinstance(v, basestring), "expected string data, got %r" % v)
249 nt.assert_true(isinstance(v, basestring), "expected string data, got %r" % v)
250
250
251
251
252 references = {
252 references = {
253 'execute_reply' : ExecuteReply(),
253 'execute_reply' : ExecuteReply(),
254 'object_info_reply' : OInfoReply(),
254 'object_info_reply' : OInfoReply(),
255 'status' : Status(),
255 'status' : Status(),
256 'complete_reply' : CompleteReply(),
256 'complete_reply' : CompleteReply(),
257 'kernel_info_reply': KernelInfoReply(),
257 'kernel_info_reply': KernelInfoReply(),
258 'pyin' : PyIn(),
258 'pyin' : PyIn(),
259 'pyout' : PyOut(),
259 'pyout' : PyOut(),
260 'pyerr' : PyErr(),
260 'pyerr' : PyErr(),
261 'stream' : Stream(),
261 'stream' : Stream(),
262 'display_data' : DisplayData(),
262 'display_data' : DisplayData(),
263 }
263 }
264 """
264 """
265 Specifications of `content` part of the reply messages.
265 Specifications of `content` part of the reply messages.
266 """
266 """
267
267
268
268
269 def validate_message(msg, msg_type=None, parent=None):
269 def validate_message(msg, msg_type=None, parent=None):
270 """validate a message
270 """validate a message
271
271
272 This is a generator, and must be iterated through to actually
272 This is a generator, and must be iterated through to actually
273 trigger each test.
273 trigger each test.
274
274
275 If msg_type and/or parent are given, the msg_type and/or parent msg_id
275 If msg_type and/or parent are given, the msg_type and/or parent msg_id
276 are compared with the given values.
276 are compared with the given values.
277 """
277 """
278 RMessage().check(msg)
278 RMessage().check(msg)
279 if msg_type:
279 if msg_type:
280 yield nt.assert_equal(msg['msg_type'], msg_type)
280 yield nt.assert_equal(msg['msg_type'], msg_type)
281 if parent:
281 if parent:
282 yield nt.assert_equal(msg['parent_header']['msg_id'], parent)
282 yield nt.assert_equal(msg['parent_header']['msg_id'], parent)
283 content = msg['content']
283 content = msg['content']
284 ref = references[msg['msg_type']]
284 ref = references[msg['msg_type']]
285 for tst in ref.check(content):
285 for tst in ref.check(content):
286 yield tst
286 yield tst
287
287
288
288
289 #-----------------------------------------------------------------------------
289 #-----------------------------------------------------------------------------
290 # Tests
290 # Tests
291 #-----------------------------------------------------------------------------
291 #-----------------------------------------------------------------------------
292
292
293 # Shell channel
293 # Shell channel
294
294
295 @dec.parametric
295 @dec.parametric
296 def test_execute():
296 def test_execute():
297 flush_channels()
297 flush_channels()
298
298
299 msg_id = KC.execute(code='x=1')
299 msg_id = KC.execute(code='x=1')
300 reply = KC.get_shell_msg(timeout=2)
300 reply = KC.get_shell_msg(timeout=2)
301 for tst in validate_message(reply, 'execute_reply', msg_id):
301 for tst in validate_message(reply, 'execute_reply', msg_id):
302 yield tst
302 yield tst
303
303
304
304
305 @dec.parametric
305 @dec.parametric
306 def test_execute_silent():
306 def test_execute_silent():
307 flush_channels()
307 flush_channels()
308 msg_id, reply = execute(code='x=1', silent=True)
308 msg_id, reply = execute(code='x=1', silent=True)
309
309
310 # flush status=idle
310 # flush status=idle
311 status = KC.iopub_channel.get_msg(timeout=2)
311 status = KC.iopub_channel.get_msg(timeout=2)
312 for tst in validate_message(status, 'status', msg_id):
312 for tst in validate_message(status, 'status', msg_id):
313 yield tst
313 yield tst
314 nt.assert_equal(status['content']['execution_state'], 'idle')
314 nt.assert_equal(status['content']['execution_state'], 'idle')
315
315
316 yield nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
316 yield nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
317 count = reply['execution_count']
317 count = reply['execution_count']
318
318
319 msg_id, reply = execute(code='x=2', silent=True)
319 msg_id, reply = execute(code='x=2', silent=True)
320
320
321 # flush status=idle
321 # flush status=idle
322 status = KC.iopub_channel.get_msg(timeout=2)
322 status = KC.iopub_channel.get_msg(timeout=2)
323 for tst in validate_message(status, 'status', msg_id):
323 for tst in validate_message(status, 'status', msg_id):
324 yield tst
324 yield tst
325 yield nt.assert_equal(status['content']['execution_state'], 'idle')
325 yield nt.assert_equal(status['content']['execution_state'], 'idle')
326
326
327 yield nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
327 yield nt.assert_raises(Empty, KC.iopub_channel.get_msg, timeout=0.1)
328 count_2 = reply['execution_count']
328 count_2 = reply['execution_count']
329 yield nt.assert_equal(count_2, count)
329 yield nt.assert_equal(count_2, count)
330
330
331
331
332 @dec.parametric
332 @dec.parametric
333 def test_execute_error():
333 def test_execute_error():
334 flush_channels()
334 flush_channels()
335
335
336 msg_id, reply = execute(code='1/0')
336 msg_id, reply = execute(code='1/0')
337 yield nt.assert_equal(reply['status'], 'error')
337 yield nt.assert_equal(reply['status'], 'error')
338 yield nt.assert_equal(reply['ename'], 'ZeroDivisionError')
338 yield nt.assert_equal(reply['ename'], 'ZeroDivisionError')
339
339
340 pyerr = KC.iopub_channel.get_msg(timeout=2)
340 pyerr = KC.iopub_channel.get_msg(timeout=2)
341 for tst in validate_message(pyerr, 'pyerr', msg_id):
341 for tst in validate_message(pyerr, 'pyerr', msg_id):
342 yield tst
342 yield tst
343
343
344
344
345 def test_execute_inc():
345 def test_execute_inc():
346 """execute request should increment execution_count"""
346 """execute request should increment execution_count"""
347 flush_channels()
347 flush_channels()
348
348
349 msg_id, reply = execute(code='x=1')
349 msg_id, reply = execute(code='x=1')
350 count = reply['execution_count']
350 count = reply['execution_count']
351
351
352 flush_channels()
352 flush_channels()
353
353
354 msg_id, reply = execute(code='x=2')
354 msg_id, reply = execute(code='x=2')
355 count_2 = reply['execution_count']
355 count_2 = reply['execution_count']
356 nt.assert_equal(count_2, count+1)
356 nt.assert_equal(count_2, count+1)
357
357
358
358
359 def test_user_variables():
359 def test_user_variables():
360 flush_channels()
360 flush_channels()
361
361
362 msg_id, reply = execute(code='x=1', user_variables=['x'])
362 msg_id, reply = execute(code='x=1', user_variables=['x'])
363 user_variables = reply['user_variables']
363 user_variables = reply['user_variables']
364 nt.assert_equal(user_variables, {u'x' : u'1'})
364 nt.assert_equal(user_variables, {u'x': {
365 u'status': u'ok',
366 u'data': {u'text/plain': u'1'},
367 u'metadata': {},
368 }})
369
370
371 def test_user_variables_fail():
372 flush_channels()
373
374 msg_id, reply = execute(code='x=1', user_variables=['nosuchname'])
375 user_variables = reply['user_variables']
376 foo = user_variables['nosuchname']
377 nt.assert_equal(foo['status'], 'error')
378 nt.assert_equal(foo['ename'], 'KeyError')
365
379
366
380
367 def test_user_expressions():
381 def test_user_expressions():
368 flush_channels()
382 flush_channels()
369
383
370 msg_id, reply = execute(code='x=1', user_expressions=dict(foo='x+1'))
384 msg_id, reply = execute(code='x=1', user_expressions=dict(foo='x+1'))
371 user_expressions = reply['user_expressions']
385 user_expressions = reply['user_expressions']
372 nt.assert_equal(user_expressions, {u'foo' : u'2'})
386 nt.assert_equal(user_expressions, {u'foo': {
387 u'status': u'ok',
388 u'data': {u'text/plain': u'2'},
389 u'metadata': {},
390 }})
391
392
393 def test_user_expressions_fail():
394 flush_channels()
395
396 msg_id, reply = execute(code='x=0', user_expressions=dict(foo='nosuchname'))
397 user_expressions = reply['user_expressions']
398 foo = user_expressions['foo']
399 nt.assert_equal(foo['status'], 'error')
400 nt.assert_equal(foo['ename'], 'NameError')
373
401
374
402
375 @dec.parametric
403 @dec.parametric
376 def test_oinfo():
404 def test_oinfo():
377 flush_channels()
405 flush_channels()
378
406
379 msg_id = KC.object_info('a')
407 msg_id = KC.object_info('a')
380 reply = KC.get_shell_msg(timeout=2)
408 reply = KC.get_shell_msg(timeout=2)
381 for tst in validate_message(reply, 'object_info_reply', msg_id):
409 for tst in validate_message(reply, 'object_info_reply', msg_id):
382 yield tst
410 yield tst
383
411
384
412
385 @dec.parametric
413 @dec.parametric
386 def test_oinfo_found():
414 def test_oinfo_found():
387 flush_channels()
415 flush_channels()
388
416
389 msg_id, reply = execute(code='a=5')
417 msg_id, reply = execute(code='a=5')
390
418
391 msg_id = KC.object_info('a')
419 msg_id = KC.object_info('a')
392 reply = KC.get_shell_msg(timeout=2)
420 reply = KC.get_shell_msg(timeout=2)
393 for tst in validate_message(reply, 'object_info_reply', msg_id):
421 for tst in validate_message(reply, 'object_info_reply', msg_id):
394 yield tst
422 yield tst
395 content = reply['content']
423 content = reply['content']
396 yield nt.assert_true(content['found'])
424 yield nt.assert_true(content['found'])
397 argspec = content['argspec']
425 argspec = content['argspec']
398 yield nt.assert_true(argspec is None, "didn't expect argspec dict, got %r" % argspec)
426 yield nt.assert_true(argspec is None, "didn't expect argspec dict, got %r" % argspec)
399
427
400
428
401 @dec.parametric
429 @dec.parametric
402 def test_oinfo_detail():
430 def test_oinfo_detail():
403 flush_channels()
431 flush_channels()
404
432
405 msg_id, reply = execute(code='ip=get_ipython()')
433 msg_id, reply = execute(code='ip=get_ipython()')
406
434
407 msg_id = KC.object_info('ip.object_inspect', detail_level=2)
435 msg_id = KC.object_info('ip.object_inspect', detail_level=2)
408 reply = KC.get_shell_msg(timeout=2)
436 reply = KC.get_shell_msg(timeout=2)
409 for tst in validate_message(reply, 'object_info_reply', msg_id):
437 for tst in validate_message(reply, 'object_info_reply', msg_id):
410 yield tst
438 yield tst
411 content = reply['content']
439 content = reply['content']
412 yield nt.assert_true(content['found'])
440 yield nt.assert_true(content['found'])
413 argspec = content['argspec']
441 argspec = content['argspec']
414 yield nt.assert_true(isinstance(argspec, dict), "expected non-empty argspec dict, got %r" % argspec)
442 yield nt.assert_true(isinstance(argspec, dict), "expected non-empty argspec dict, got %r" % argspec)
415 yield nt.assert_equal(argspec['defaults'], [0])
443 yield nt.assert_equal(argspec['defaults'], [0])
416
444
417
445
418 @dec.parametric
446 @dec.parametric
419 def test_oinfo_not_found():
447 def test_oinfo_not_found():
420 flush_channels()
448 flush_channels()
421
449
422 msg_id = KC.object_info('dne')
450 msg_id = KC.object_info('dne')
423 reply = KC.get_shell_msg(timeout=2)
451 reply = KC.get_shell_msg(timeout=2)
424 for tst in validate_message(reply, 'object_info_reply', msg_id):
452 for tst in validate_message(reply, 'object_info_reply', msg_id):
425 yield tst
453 yield tst
426 content = reply['content']
454 content = reply['content']
427 yield nt.assert_false(content['found'])
455 yield nt.assert_false(content['found'])
428
456
429
457
430 @dec.parametric
458 @dec.parametric
431 def test_complete():
459 def test_complete():
432 flush_channels()
460 flush_channels()
433
461
434 msg_id, reply = execute(code="alpha = albert = 5")
462 msg_id, reply = execute(code="alpha = albert = 5")
435
463
436 msg_id = KC.complete('al', 'al', 2)
464 msg_id = KC.complete('al', 'al', 2)
437 reply = KC.get_shell_msg(timeout=2)
465 reply = KC.get_shell_msg(timeout=2)
438 for tst in validate_message(reply, 'complete_reply', msg_id):
466 for tst in validate_message(reply, 'complete_reply', msg_id):
439 yield tst
467 yield tst
440 matches = reply['content']['matches']
468 matches = reply['content']['matches']
441 for name in ('alpha', 'albert'):
469 for name in ('alpha', 'albert'):
442 yield nt.assert_true(name in matches, "Missing match: %r" % name)
470 yield nt.assert_true(name in matches, "Missing match: %r" % name)
443
471
444
472
445 @dec.parametric
473 @dec.parametric
446 def test_kernel_info_request():
474 def test_kernel_info_request():
447 flush_channels()
475 flush_channels()
448
476
449 msg_id = KC.kernel_info()
477 msg_id = KC.kernel_info()
450 reply = KC.get_shell_msg(timeout=2)
478 reply = KC.get_shell_msg(timeout=2)
451 for tst in validate_message(reply, 'kernel_info_reply', msg_id):
479 for tst in validate_message(reply, 'kernel_info_reply', msg_id):
452 yield tst
480 yield tst
453
481
454
482
455 # IOPub channel
483 # IOPub channel
456
484
457
485
458 @dec.parametric
486 @dec.parametric
459 def test_stream():
487 def test_stream():
460 flush_channels()
488 flush_channels()
461
489
462 msg_id, reply = execute("print('hi')")
490 msg_id, reply = execute("print('hi')")
463
491
464 stdout = KC.iopub_channel.get_msg(timeout=2)
492 stdout = KC.iopub_channel.get_msg(timeout=2)
465 for tst in validate_message(stdout, 'stream', msg_id):
493 for tst in validate_message(stdout, 'stream', msg_id):
466 yield tst
494 yield tst
467 content = stdout['content']
495 content = stdout['content']
468 yield nt.assert_equal(content['name'], u'stdout')
496 yield nt.assert_equal(content['name'], u'stdout')
469 yield nt.assert_equal(content['data'], u'hi\n')
497 yield nt.assert_equal(content['data'], u'hi\n')
470
498
471
499
472 @dec.parametric
500 @dec.parametric
473 def test_display_data():
501 def test_display_data():
474 flush_channels()
502 flush_channels()
475
503
476 msg_id, reply = execute("from IPython.core.display import display; display(1)")
504 msg_id, reply = execute("from IPython.core.display import display; display(1)")
477
505
478 display = KC.iopub_channel.get_msg(timeout=2)
506 display = KC.iopub_channel.get_msg(timeout=2)
479 for tst in validate_message(display, 'display_data', parent=msg_id):
507 for tst in validate_message(display, 'display_data', parent=msg_id):
480 yield tst
508 yield tst
481 data = display['content']['data']
509 data = display['content']['data']
482 yield nt.assert_equal(data['text/plain'], u'1')
510 yield nt.assert_equal(data['text/plain'], u'1')
483
511
@@ -1,618 +1,597 b''
1 """A ZMQ-based subclass of InteractiveShell.
1 """A ZMQ-based subclass of InteractiveShell.
2
2
3 This code is meant to ease the refactoring of the base InteractiveShell into
3 This code is meant to ease the refactoring of the base InteractiveShell into
4 something with a cleaner architecture for 2-process use, without actually
4 something with a cleaner architecture for 2-process use, without actually
5 breaking InteractiveShell itself. So we're doing something a bit ugly, where
5 breaking InteractiveShell itself. So we're doing something a bit ugly, where
6 we subclass and override what we want to fix. Once this is working well, we
6 we subclass and override what we want to fix. Once this is working well, we
7 can go back to the base class and refactor the code for a cleaner inheritance
7 can go back to the base class and refactor the code for a cleaner inheritance
8 implementation that doesn't rely on so much monkeypatching.
8 implementation that doesn't rely on so much monkeypatching.
9
9
10 But this lets us maintain a fully working IPython as we develop the new
10 But this lets us maintain a fully working IPython as we develop the new
11 machinery. This should thus be thought of as scaffolding.
11 machinery. This should thus be thought of as scaffolding.
12 """
12 """
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 from __future__ import print_function
16 from __future__ import print_function
17
17
18 # Stdlib
18 # Stdlib
19 import os
19 import os
20 import sys
20 import sys
21 import time
21 import time
22
22
23 # System library imports
23 # System library imports
24 from zmq.eventloop import ioloop
24 from zmq.eventloop import ioloop
25
25
26 # Our own
26 # Our own
27 from IPython.core.interactiveshell import (
27 from IPython.core.interactiveshell import (
28 InteractiveShell, InteractiveShellABC
28 InteractiveShell, InteractiveShellABC
29 )
29 )
30 from IPython.core import page
30 from IPython.core import page
31 from IPython.core.autocall import ZMQExitAutocall
31 from IPython.core.autocall import ZMQExitAutocall
32 from IPython.core.displaypub import DisplayPublisher
32 from IPython.core.displaypub import DisplayPublisher
33 from IPython.core.error import UsageError
33 from IPython.core.error import UsageError
34 from IPython.core.magics import MacroToEdit, CodeMagics
34 from IPython.core.magics import MacroToEdit, CodeMagics
35 from IPython.core.magic import magics_class, line_magic, Magics
35 from IPython.core.magic import magics_class, line_magic, Magics
36 from IPython.core.payloadpage import install_payload_page
36 from IPython.core.payloadpage import install_payload_page
37 from IPython.display import display, Javascript
37 from IPython.display import display, Javascript
38 from IPython.kernel.inprocess.socket import SocketABC
38 from IPython.kernel.inprocess.socket import SocketABC
39 from IPython.kernel import (
39 from IPython.kernel import (
40 get_connection_file, get_connection_info, connect_qtconsole
40 get_connection_file, get_connection_info, connect_qtconsole
41 )
41 )
42 from IPython.testing.skipdoctest import skip_doctest
42 from IPython.testing.skipdoctest import skip_doctest
43 from IPython.utils import io, openpy
43 from IPython.utils import io, openpy
44 from IPython.utils.jsonutil import json_clean, encode_images
44 from IPython.utils.jsonutil import json_clean, encode_images
45 from IPython.utils.process import arg_split
45 from IPython.utils.process import arg_split
46 from IPython.utils import py3compat
46 from IPython.utils import py3compat
47 from IPython.utils.traitlets import Instance, Type, Dict, CBool, CBytes
47 from IPython.utils.traitlets import Instance, Type, Dict, CBool, CBytes
48 from IPython.utils.warn import warn, error
48 from IPython.utils.warn import warn, error
49 from IPython.kernel.zmq.displayhook import ZMQShellDisplayHook
49 from IPython.kernel.zmq.displayhook import ZMQShellDisplayHook
50 from IPython.kernel.zmq.datapub import ZMQDataPublisher
50 from IPython.kernel.zmq.datapub import ZMQDataPublisher
51 from IPython.kernel.zmq.session import extract_header
51 from IPython.kernel.zmq.session import extract_header
52 from session import Session
52 from session import Session
53
53
54 #-----------------------------------------------------------------------------
54 #-----------------------------------------------------------------------------
55 # Functions and classes
55 # Functions and classes
56 #-----------------------------------------------------------------------------
56 #-----------------------------------------------------------------------------
57
57
58 class ZMQDisplayPublisher(DisplayPublisher):
58 class ZMQDisplayPublisher(DisplayPublisher):
59 """A display publisher that publishes data using a ZeroMQ PUB socket."""
59 """A display publisher that publishes data using a ZeroMQ PUB socket."""
60
60
61 session = Instance(Session)
61 session = Instance(Session)
62 pub_socket = Instance(SocketABC)
62 pub_socket = Instance(SocketABC)
63 parent_header = Dict({})
63 parent_header = Dict({})
64 topic = CBytes(b'displaypub')
64 topic = CBytes(b'displaypub')
65
65
66 def set_parent(self, parent):
66 def set_parent(self, parent):
67 """Set the parent for outbound messages."""
67 """Set the parent for outbound messages."""
68 self.parent_header = extract_header(parent)
68 self.parent_header = extract_header(parent)
69
69
70 def _flush_streams(self):
70 def _flush_streams(self):
71 """flush IO Streams prior to display"""
71 """flush IO Streams prior to display"""
72 sys.stdout.flush()
72 sys.stdout.flush()
73 sys.stderr.flush()
73 sys.stderr.flush()
74
74
75 def publish(self, source, data, metadata=None):
75 def publish(self, source, data, metadata=None):
76 self._flush_streams()
76 self._flush_streams()
77 if metadata is None:
77 if metadata is None:
78 metadata = {}
78 metadata = {}
79 self._validate_data(source, data, metadata)
79 self._validate_data(source, data, metadata)
80 content = {}
80 content = {}
81 content['source'] = source
81 content['source'] = source
82 content['data'] = encode_images(data)
82 content['data'] = encode_images(data)
83 content['metadata'] = metadata
83 content['metadata'] = metadata
84 self.session.send(
84 self.session.send(
85 self.pub_socket, u'display_data', json_clean(content),
85 self.pub_socket, u'display_data', json_clean(content),
86 parent=self.parent_header, ident=self.topic,
86 parent=self.parent_header, ident=self.topic,
87 )
87 )
88
88
89 def clear_output(self, stdout=True, stderr=True, other=True):
89 def clear_output(self, stdout=True, stderr=True, other=True):
90 content = dict(stdout=stdout, stderr=stderr, other=other)
90 content = dict(stdout=stdout, stderr=stderr, other=other)
91
91
92 if stdout:
92 if stdout:
93 print('\r', file=sys.stdout, end='')
93 print('\r', file=sys.stdout, end='')
94 if stderr:
94 if stderr:
95 print('\r', file=sys.stderr, end='')
95 print('\r', file=sys.stderr, end='')
96
96
97 self._flush_streams()
97 self._flush_streams()
98
98
99 self.session.send(
99 self.session.send(
100 self.pub_socket, u'clear_output', content,
100 self.pub_socket, u'clear_output', content,
101 parent=self.parent_header, ident=self.topic,
101 parent=self.parent_header, ident=self.topic,
102 )
102 )
103
103
104 @magics_class
104 @magics_class
105 class KernelMagics(Magics):
105 class KernelMagics(Magics):
106 #------------------------------------------------------------------------
106 #------------------------------------------------------------------------
107 # Magic overrides
107 # Magic overrides
108 #------------------------------------------------------------------------
108 #------------------------------------------------------------------------
109 # Once the base class stops inheriting from magic, this code needs to be
109 # Once the base class stops inheriting from magic, this code needs to be
110 # moved into a separate machinery as well. For now, at least isolate here
110 # moved into a separate machinery as well. For now, at least isolate here
111 # the magics which this class needs to implement differently from the base
111 # the magics which this class needs to implement differently from the base
112 # class, or that are unique to it.
112 # class, or that are unique to it.
113
113
114 @line_magic
114 @line_magic
115 def doctest_mode(self, parameter_s=''):
115 def doctest_mode(self, parameter_s=''):
116 """Toggle doctest mode on and off.
116 """Toggle doctest mode on and off.
117
117
118 This mode is intended to make IPython behave as much as possible like a
118 This mode is intended to make IPython behave as much as possible like a
119 plain Python shell, from the perspective of how its prompts, exceptions
119 plain Python shell, from the perspective of how its prompts, exceptions
120 and output look. This makes it easy to copy and paste parts of a
120 and output look. This makes it easy to copy and paste parts of a
121 session into doctests. It does so by:
121 session into doctests. It does so by:
122
122
123 - Changing the prompts to the classic ``>>>`` ones.
123 - Changing the prompts to the classic ``>>>`` ones.
124 - Changing the exception reporting mode to 'Plain'.
124 - Changing the exception reporting mode to 'Plain'.
125 - Disabling pretty-printing of output.
125 - Disabling pretty-printing of output.
126
126
127 Note that IPython also supports the pasting of code snippets that have
127 Note that IPython also supports the pasting of code snippets that have
128 leading '>>>' and '...' prompts in them. This means that you can paste
128 leading '>>>' and '...' prompts in them. This means that you can paste
129 doctests from files or docstrings (even if they have leading
129 doctests from files or docstrings (even if they have leading
130 whitespace), and the code will execute correctly. You can then use
130 whitespace), and the code will execute correctly. You can then use
131 '%history -t' to see the translated history; this will give you the
131 '%history -t' to see the translated history; this will give you the
132 input after removal of all the leading prompts and whitespace, which
132 input after removal of all the leading prompts and whitespace, which
133 can be pasted back into an editor.
133 can be pasted back into an editor.
134
134
135 With these features, you can switch into this mode easily whenever you
135 With these features, you can switch into this mode easily whenever you
136 need to do testing and changes to doctests, without having to leave
136 need to do testing and changes to doctests, without having to leave
137 your existing IPython session.
137 your existing IPython session.
138 """
138 """
139
139
140 from IPython.utils.ipstruct import Struct
140 from IPython.utils.ipstruct import Struct
141
141
142 # Shorthands
142 # Shorthands
143 shell = self.shell
143 shell = self.shell
144 disp_formatter = self.shell.display_formatter
144 disp_formatter = self.shell.display_formatter
145 ptformatter = disp_formatter.formatters['text/plain']
145 ptformatter = disp_formatter.formatters['text/plain']
146 # dstore is a data store kept in the instance metadata bag to track any
146 # dstore is a data store kept in the instance metadata bag to track any
147 # changes we make, so we can undo them later.
147 # changes we make, so we can undo them later.
148 dstore = shell.meta.setdefault('doctest_mode', Struct())
148 dstore = shell.meta.setdefault('doctest_mode', Struct())
149 save_dstore = dstore.setdefault
149 save_dstore = dstore.setdefault
150
150
151 # save a few values we'll need to recover later
151 # save a few values we'll need to recover later
152 mode = save_dstore('mode', False)
152 mode = save_dstore('mode', False)
153 save_dstore('rc_pprint', ptformatter.pprint)
153 save_dstore('rc_pprint', ptformatter.pprint)
154 save_dstore('rc_active_types',disp_formatter.active_types)
154 save_dstore('rc_active_types',disp_formatter.active_types)
155 save_dstore('xmode', shell.InteractiveTB.mode)
155 save_dstore('xmode', shell.InteractiveTB.mode)
156
156
157 if mode == False:
157 if mode == False:
158 # turn on
158 # turn on
159 ptformatter.pprint = False
159 ptformatter.pprint = False
160 disp_formatter.active_types = ['text/plain']
160 disp_formatter.active_types = ['text/plain']
161 shell.magic('xmode Plain')
161 shell.magic('xmode Plain')
162 else:
162 else:
163 # turn off
163 # turn off
164 ptformatter.pprint = dstore.rc_pprint
164 ptformatter.pprint = dstore.rc_pprint
165 disp_formatter.active_types = dstore.rc_active_types
165 disp_formatter.active_types = dstore.rc_active_types
166 shell.magic("xmode " + dstore.xmode)
166 shell.magic("xmode " + dstore.xmode)
167
167
168 # Store new mode and inform on console
168 # Store new mode and inform on console
169 dstore.mode = bool(1-int(mode))
169 dstore.mode = bool(1-int(mode))
170 mode_label = ['OFF','ON'][dstore.mode]
170 mode_label = ['OFF','ON'][dstore.mode]
171 print('Doctest mode is:', mode_label)
171 print('Doctest mode is:', mode_label)
172
172
173 # Send the payload back so that clients can modify their prompt display
173 # Send the payload back so that clients can modify their prompt display
174 payload = dict(
174 payload = dict(
175 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.doctest_mode',
175 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.doctest_mode',
176 mode=dstore.mode)
176 mode=dstore.mode)
177 shell.payload_manager.write_payload(payload)
177 shell.payload_manager.write_payload(payload)
178
178
179
179
180 _find_edit_target = CodeMagics._find_edit_target
180 _find_edit_target = CodeMagics._find_edit_target
181
181
182 @skip_doctest
182 @skip_doctest
183 @line_magic
183 @line_magic
184 def edit(self, parameter_s='', last_call=['','']):
184 def edit(self, parameter_s='', last_call=['','']):
185 """Bring up an editor and execute the resulting code.
185 """Bring up an editor and execute the resulting code.
186
186
187 Usage:
187 Usage:
188 %edit [options] [args]
188 %edit [options] [args]
189
189
190 %edit runs an external text editor. You will need to set the command for
190 %edit runs an external text editor. You will need to set the command for
191 this editor via the ``TerminalInteractiveShell.editor`` option in your
191 this editor via the ``TerminalInteractiveShell.editor`` option in your
192 configuration file before it will work.
192 configuration file before it will work.
193
193
194 This command allows you to conveniently edit multi-line code right in
194 This command allows you to conveniently edit multi-line code right in
195 your IPython session.
195 your IPython session.
196
196
197 If called without arguments, %edit opens up an empty editor with a
197 If called without arguments, %edit opens up an empty editor with a
198 temporary file and will execute the contents of this file when you
198 temporary file and will execute the contents of this file when you
199 close it (don't forget to save it!).
199 close it (don't forget to save it!).
200
200
201
201
202 Options:
202 Options:
203
203
204 -n <number>: open the editor at a specified line number. By default,
204 -n <number>: open the editor at a specified line number. By default,
205 the IPython editor hook uses the unix syntax 'editor +N filename', but
205 the IPython editor hook uses the unix syntax 'editor +N filename', but
206 you can configure this by providing your own modified hook if your
206 you can configure this by providing your own modified hook if your
207 favorite editor supports line-number specifications with a different
207 favorite editor supports line-number specifications with a different
208 syntax.
208 syntax.
209
209
210 -p: this will call the editor with the same data as the previous time
210 -p: this will call the editor with the same data as the previous time
211 it was used, regardless of how long ago (in your current session) it
211 it was used, regardless of how long ago (in your current session) it
212 was.
212 was.
213
213
214 -r: use 'raw' input. This option only applies to input taken from the
214 -r: use 'raw' input. This option only applies to input taken from the
215 user's history. By default, the 'processed' history is used, so that
215 user's history. By default, the 'processed' history is used, so that
216 magics are loaded in their transformed version to valid Python. If
216 magics are loaded in their transformed version to valid Python. If
217 this option is given, the raw input as typed as the command line is
217 this option is given, the raw input as typed as the command line is
218 used instead. When you exit the editor, it will be executed by
218 used instead. When you exit the editor, it will be executed by
219 IPython's own processor.
219 IPython's own processor.
220
220
221 -x: do not execute the edited code immediately upon exit. This is
221 -x: do not execute the edited code immediately upon exit. This is
222 mainly useful if you are editing programs which need to be called with
222 mainly useful if you are editing programs which need to be called with
223 command line arguments, which you can then do using %run.
223 command line arguments, which you can then do using %run.
224
224
225
225
226 Arguments:
226 Arguments:
227
227
228 If arguments are given, the following possibilites exist:
228 If arguments are given, the following possibilites exist:
229
229
230 - The arguments are numbers or pairs of colon-separated numbers (like
230 - The arguments are numbers or pairs of colon-separated numbers (like
231 1 4:8 9). These are interpreted as lines of previous input to be
231 1 4:8 9). These are interpreted as lines of previous input to be
232 loaded into the editor. The syntax is the same of the %macro command.
232 loaded into the editor. The syntax is the same of the %macro command.
233
233
234 - If the argument doesn't start with a number, it is evaluated as a
234 - If the argument doesn't start with a number, it is evaluated as a
235 variable and its contents loaded into the editor. You can thus edit
235 variable and its contents loaded into the editor. You can thus edit
236 any string which contains python code (including the result of
236 any string which contains python code (including the result of
237 previous edits).
237 previous edits).
238
238
239 - If the argument is the name of an object (other than a string),
239 - If the argument is the name of an object (other than a string),
240 IPython will try to locate the file where it was defined and open the
240 IPython will try to locate the file where it was defined and open the
241 editor at the point where it is defined. You can use `%edit function`
241 editor at the point where it is defined. You can use `%edit function`
242 to load an editor exactly at the point where 'function' is defined,
242 to load an editor exactly at the point where 'function' is defined,
243 edit it and have the file be executed automatically.
243 edit it and have the file be executed automatically.
244
244
245 If the object is a macro (see %macro for details), this opens up your
245 If the object is a macro (see %macro for details), this opens up your
246 specified editor with a temporary file containing the macro's data.
246 specified editor with a temporary file containing the macro's data.
247 Upon exit, the macro is reloaded with the contents of the file.
247 Upon exit, the macro is reloaded with the contents of the file.
248
248
249 Note: opening at an exact line is only supported under Unix, and some
249 Note: opening at an exact line is only supported under Unix, and some
250 editors (like kedit and gedit up to Gnome 2.8) do not understand the
250 editors (like kedit and gedit up to Gnome 2.8) do not understand the
251 '+NUMBER' parameter necessary for this feature. Good editors like
251 '+NUMBER' parameter necessary for this feature. Good editors like
252 (X)Emacs, vi, jed, pico and joe all do.
252 (X)Emacs, vi, jed, pico and joe all do.
253
253
254 - If the argument is not found as a variable, IPython will look for a
254 - If the argument is not found as a variable, IPython will look for a
255 file with that name (adding .py if necessary) and load it into the
255 file with that name (adding .py if necessary) and load it into the
256 editor. It will execute its contents with execfile() when you exit,
256 editor. It will execute its contents with execfile() when you exit,
257 loading any code in the file into your interactive namespace.
257 loading any code in the file into your interactive namespace.
258
258
259 After executing your code, %edit will return as output the code you
259 After executing your code, %edit will return as output the code you
260 typed in the editor (except when it was an existing file). This way
260 typed in the editor (except when it was an existing file). This way
261 you can reload the code in further invocations of %edit as a variable,
261 you can reload the code in further invocations of %edit as a variable,
262 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
262 via _<NUMBER> or Out[<NUMBER>], where <NUMBER> is the prompt number of
263 the output.
263 the output.
264
264
265 Note that %edit is also available through the alias %ed.
265 Note that %edit is also available through the alias %ed.
266
266
267 This is an example of creating a simple function inside the editor and
267 This is an example of creating a simple function inside the editor and
268 then modifying it. First, start up the editor:
268 then modifying it. First, start up the editor:
269
269
270 In [1]: ed
270 In [1]: ed
271 Editing... done. Executing edited code...
271 Editing... done. Executing edited code...
272 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
272 Out[1]: 'def foo():n print "foo() was defined in an editing session"n'
273
273
274 We can then call the function foo():
274 We can then call the function foo():
275
275
276 In [2]: foo()
276 In [2]: foo()
277 foo() was defined in an editing session
277 foo() was defined in an editing session
278
278
279 Now we edit foo. IPython automatically loads the editor with the
279 Now we edit foo. IPython automatically loads the editor with the
280 (temporary) file where foo() was previously defined:
280 (temporary) file where foo() was previously defined:
281
281
282 In [3]: ed foo
282 In [3]: ed foo
283 Editing... done. Executing edited code...
283 Editing... done. Executing edited code...
284
284
285 And if we call foo() again we get the modified version:
285 And if we call foo() again we get the modified version:
286
286
287 In [4]: foo()
287 In [4]: foo()
288 foo() has now been changed!
288 foo() has now been changed!
289
289
290 Here is an example of how to edit a code snippet successive
290 Here is an example of how to edit a code snippet successive
291 times. First we call the editor:
291 times. First we call the editor:
292
292
293 In [5]: ed
293 In [5]: ed
294 Editing... done. Executing edited code...
294 Editing... done. Executing edited code...
295 hello
295 hello
296 Out[5]: "print 'hello'n"
296 Out[5]: "print 'hello'n"
297
297
298 Now we call it again with the previous output (stored in _):
298 Now we call it again with the previous output (stored in _):
299
299
300 In [6]: ed _
300 In [6]: ed _
301 Editing... done. Executing edited code...
301 Editing... done. Executing edited code...
302 hello world
302 hello world
303 Out[6]: "print 'hello world'n"
303 Out[6]: "print 'hello world'n"
304
304
305 Now we call it with the output #8 (stored in _8, also as Out[8]):
305 Now we call it with the output #8 (stored in _8, also as Out[8]):
306
306
307 In [7]: ed _8
307 In [7]: ed _8
308 Editing... done. Executing edited code...
308 Editing... done. Executing edited code...
309 hello again
309 hello again
310 Out[7]: "print 'hello again'n"
310 Out[7]: "print 'hello again'n"
311 """
311 """
312
312
313 opts,args = self.parse_options(parameter_s,'prn:')
313 opts,args = self.parse_options(parameter_s,'prn:')
314
314
315 try:
315 try:
316 filename, lineno, _ = CodeMagics._find_edit_target(self.shell, args, opts, last_call)
316 filename, lineno, _ = CodeMagics._find_edit_target(self.shell, args, opts, last_call)
317 except MacroToEdit as e:
317 except MacroToEdit as e:
318 # TODO: Implement macro editing over 2 processes.
318 # TODO: Implement macro editing over 2 processes.
319 print("Macro editing not yet implemented in 2-process model.")
319 print("Macro editing not yet implemented in 2-process model.")
320 return
320 return
321
321
322 # Make sure we send to the client an absolute path, in case the working
322 # Make sure we send to the client an absolute path, in case the working
323 # directory of client and kernel don't match
323 # directory of client and kernel don't match
324 filename = os.path.abspath(filename)
324 filename = os.path.abspath(filename)
325
325
326 payload = {
326 payload = {
327 'source' : 'IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.edit_magic',
327 'source' : 'IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.edit_magic',
328 'filename' : filename,
328 'filename' : filename,
329 'line_number' : lineno
329 'line_number' : lineno
330 }
330 }
331 self.shell.payload_manager.write_payload(payload)
331 self.shell.payload_manager.write_payload(payload)
332
332
333 # A few magics that are adapted to the specifics of using pexpect and a
333 # A few magics that are adapted to the specifics of using pexpect and a
334 # remote terminal
334 # remote terminal
335
335
336 @line_magic
336 @line_magic
337 def clear(self, arg_s):
337 def clear(self, arg_s):
338 """Clear the terminal."""
338 """Clear the terminal."""
339 if os.name == 'posix':
339 if os.name == 'posix':
340 self.shell.system("clear")
340 self.shell.system("clear")
341 else:
341 else:
342 self.shell.system("cls")
342 self.shell.system("cls")
343
343
344 if os.name == 'nt':
344 if os.name == 'nt':
345 # This is the usual name in windows
345 # This is the usual name in windows
346 cls = line_magic('cls')(clear)
346 cls = line_magic('cls')(clear)
347
347
348 # Terminal pagers won't work over pexpect, but we do have our own pager
348 # Terminal pagers won't work over pexpect, but we do have our own pager
349
349
350 @line_magic
350 @line_magic
351 def less(self, arg_s):
351 def less(self, arg_s):
352 """Show a file through the pager.
352 """Show a file through the pager.
353
353
354 Files ending in .py are syntax-highlighted."""
354 Files ending in .py are syntax-highlighted."""
355 if not arg_s:
355 if not arg_s:
356 raise UsageError('Missing filename.')
356 raise UsageError('Missing filename.')
357
357
358 cont = open(arg_s).read()
358 cont = open(arg_s).read()
359 if arg_s.endswith('.py'):
359 if arg_s.endswith('.py'):
360 cont = self.shell.pycolorize(openpy.read_py_file(arg_s, skip_encoding_cookie=False))
360 cont = self.shell.pycolorize(openpy.read_py_file(arg_s, skip_encoding_cookie=False))
361 else:
361 else:
362 cont = open(arg_s).read()
362 cont = open(arg_s).read()
363 page.page(cont)
363 page.page(cont)
364
364
365 more = line_magic('more')(less)
365 more = line_magic('more')(less)
366
366
367 # Man calls a pager, so we also need to redefine it
367 # Man calls a pager, so we also need to redefine it
368 if os.name == 'posix':
368 if os.name == 'posix':
369 @line_magic
369 @line_magic
370 def man(self, arg_s):
370 def man(self, arg_s):
371 """Find the man page for the given command and display in pager."""
371 """Find the man page for the given command and display in pager."""
372 page.page(self.shell.getoutput('man %s | col -b' % arg_s,
372 page.page(self.shell.getoutput('man %s | col -b' % arg_s,
373 split=False))
373 split=False))
374
374
375 @line_magic
375 @line_magic
376 def connect_info(self, arg_s):
376 def connect_info(self, arg_s):
377 """Print information for connecting other clients to this kernel
377 """Print information for connecting other clients to this kernel
378
378
379 It will print the contents of this session's connection file, as well as
379 It will print the contents of this session's connection file, as well as
380 shortcuts for local clients.
380 shortcuts for local clients.
381
381
382 In the simplest case, when called from the most recently launched kernel,
382 In the simplest case, when called from the most recently launched kernel,
383 secondary clients can be connected, simply with:
383 secondary clients can be connected, simply with:
384
384
385 $> ipython <app> --existing
385 $> ipython <app> --existing
386
386
387 """
387 """
388
388
389 from IPython.core.application import BaseIPythonApplication as BaseIPApp
389 from IPython.core.application import BaseIPythonApplication as BaseIPApp
390
390
391 if BaseIPApp.initialized():
391 if BaseIPApp.initialized():
392 app = BaseIPApp.instance()
392 app = BaseIPApp.instance()
393 security_dir = app.profile_dir.security_dir
393 security_dir = app.profile_dir.security_dir
394 profile = app.profile
394 profile = app.profile
395 else:
395 else:
396 profile = 'default'
396 profile = 'default'
397 security_dir = ''
397 security_dir = ''
398
398
399 try:
399 try:
400 connection_file = get_connection_file()
400 connection_file = get_connection_file()
401 info = get_connection_info(unpack=False)
401 info = get_connection_info(unpack=False)
402 except Exception as e:
402 except Exception as e:
403 error("Could not get connection info: %r" % e)
403 error("Could not get connection info: %r" % e)
404 return
404 return
405
405
406 # add profile flag for non-default profile
406 # add profile flag for non-default profile
407 profile_flag = "--profile %s" % profile if profile != 'default' else ""
407 profile_flag = "--profile %s" % profile if profile != 'default' else ""
408
408
409 # if it's in the security dir, truncate to basename
409 # if it's in the security dir, truncate to basename
410 if security_dir == os.path.dirname(connection_file):
410 if security_dir == os.path.dirname(connection_file):
411 connection_file = os.path.basename(connection_file)
411 connection_file = os.path.basename(connection_file)
412
412
413
413
414 print (info + '\n')
414 print (info + '\n')
415 print ("Paste the above JSON into a file, and connect with:\n"
415 print ("Paste the above JSON into a file, and connect with:\n"
416 " $> ipython <app> --existing <file>\n"
416 " $> ipython <app> --existing <file>\n"
417 "or, if you are local, you can connect with just:\n"
417 "or, if you are local, you can connect with just:\n"
418 " $> ipython <app> --existing {0} {1}\n"
418 " $> ipython <app> --existing {0} {1}\n"
419 "or even just:\n"
419 "or even just:\n"
420 " $> ipython <app> --existing {1}\n"
420 " $> ipython <app> --existing {1}\n"
421 "if this is the most recent IPython session you have started.".format(
421 "if this is the most recent IPython session you have started.".format(
422 connection_file, profile_flag
422 connection_file, profile_flag
423 )
423 )
424 )
424 )
425
425
426 @line_magic
426 @line_magic
427 def qtconsole(self, arg_s):
427 def qtconsole(self, arg_s):
428 """Open a qtconsole connected to this kernel.
428 """Open a qtconsole connected to this kernel.
429
429
430 Useful for connecting a qtconsole to running notebooks, for better
430 Useful for connecting a qtconsole to running notebooks, for better
431 debugging.
431 debugging.
432 """
432 """
433
433
434 # %qtconsole should imply bind_kernel for engines:
434 # %qtconsole should imply bind_kernel for engines:
435 try:
435 try:
436 from IPython.parallel import bind_kernel
436 from IPython.parallel import bind_kernel
437 except ImportError:
437 except ImportError:
438 # technically possible, because parallel has higher pyzmq min-version
438 # technically possible, because parallel has higher pyzmq min-version
439 pass
439 pass
440 else:
440 else:
441 bind_kernel()
441 bind_kernel()
442
442
443 try:
443 try:
444 p = connect_qtconsole(argv=arg_split(arg_s, os.name=='posix'))
444 p = connect_qtconsole(argv=arg_split(arg_s, os.name=='posix'))
445 except Exception as e:
445 except Exception as e:
446 error("Could not start qtconsole: %r" % e)
446 error("Could not start qtconsole: %r" % e)
447 return
447 return
448
448
449 @line_magic
449 @line_magic
450 def autosave(self, arg_s):
450 def autosave(self, arg_s):
451 """Set the autosave interval in the notebook (in seconds).
451 """Set the autosave interval in the notebook (in seconds).
452
452
453 The default value is 120, or two minutes.
453 The default value is 120, or two minutes.
454 ``%autosave 0`` will disable autosave.
454 ``%autosave 0`` will disable autosave.
455
455
456 This magic only has an effect when called from the notebook interface.
456 This magic only has an effect when called from the notebook interface.
457 It has no effect when called in a startup file.
457 It has no effect when called in a startup file.
458 """
458 """
459
459
460 try:
460 try:
461 interval = int(arg_s)
461 interval = int(arg_s)
462 except ValueError:
462 except ValueError:
463 raise UsageError("%%autosave requires an integer, got %r" % arg_s)
463 raise UsageError("%%autosave requires an integer, got %r" % arg_s)
464
464
465 # javascript wants milliseconds
465 # javascript wants milliseconds
466 milliseconds = 1000 * interval
466 milliseconds = 1000 * interval
467 display(Javascript("IPython.notebook.set_autosave_interval(%i)" % milliseconds),
467 display(Javascript("IPython.notebook.set_autosave_interval(%i)" % milliseconds),
468 include=['application/javascript']
468 include=['application/javascript']
469 )
469 )
470 if interval:
470 if interval:
471 print("Autosaving every %i seconds" % interval)
471 print("Autosaving every %i seconds" % interval)
472 else:
472 else:
473 print("Autosave disabled")
473 print("Autosave disabled")
474
474
475 def safe_unicode(e):
476 """unicode(e) with various fallbacks. Used for exceptions, which may not be
477 safe to call unicode() on.
478 """
479 try:
480 return unicode(e)
481 except UnicodeError:
482 pass
483
484 try:
485 return py3compat.str_to_unicode(str(e))
486 except UnicodeError:
487 pass
488
489 try:
490 return py3compat.str_to_unicode(repr(e))
491 except UnicodeError:
492 pass
493
494 return u'Unrecoverably corrupt evalue'
495
496
475
497 class ZMQInteractiveShell(InteractiveShell):
476 class ZMQInteractiveShell(InteractiveShell):
498 """A subclass of InteractiveShell for ZMQ."""
477 """A subclass of InteractiveShell for ZMQ."""
499
478
500 displayhook_class = Type(ZMQShellDisplayHook)
479 displayhook_class = Type(ZMQShellDisplayHook)
501 display_pub_class = Type(ZMQDisplayPublisher)
480 display_pub_class = Type(ZMQDisplayPublisher)
502 data_pub_class = Type(ZMQDataPublisher)
481 data_pub_class = Type(ZMQDataPublisher)
503
482
504 # Override the traitlet in the parent class, because there's no point using
483 # Override the traitlet in the parent class, because there's no point using
505 # readline for the kernel. Can be removed when the readline code is moved
484 # readline for the kernel. Can be removed when the readline code is moved
506 # to the terminal frontend.
485 # to the terminal frontend.
507 colors_force = CBool(True)
486 colors_force = CBool(True)
508 readline_use = CBool(False)
487 readline_use = CBool(False)
509 # autoindent has no meaning in a zmqshell, and attempting to enable it
488 # autoindent has no meaning in a zmqshell, and attempting to enable it
510 # will print a warning in the absence of readline.
489 # will print a warning in the absence of readline.
511 autoindent = CBool(False)
490 autoindent = CBool(False)
512
491
513 exiter = Instance(ZMQExitAutocall)
492 exiter = Instance(ZMQExitAutocall)
514 def _exiter_default(self):
493 def _exiter_default(self):
515 return ZMQExitAutocall(self)
494 return ZMQExitAutocall(self)
516
495
517 def _exit_now_changed(self, name, old, new):
496 def _exit_now_changed(self, name, old, new):
518 """stop eventloop when exit_now fires"""
497 """stop eventloop when exit_now fires"""
519 if new:
498 if new:
520 loop = ioloop.IOLoop.instance()
499 loop = ioloop.IOLoop.instance()
521 loop.add_timeout(time.time()+0.1, loop.stop)
500 loop.add_timeout(time.time()+0.1, loop.stop)
522
501
523 keepkernel_on_exit = None
502 keepkernel_on_exit = None
524
503
525 # Over ZeroMQ, GUI control isn't done with PyOS_InputHook as there is no
504 # Over ZeroMQ, GUI control isn't done with PyOS_InputHook as there is no
526 # interactive input being read; we provide event loop support in ipkernel
505 # interactive input being read; we provide event loop support in ipkernel
527 from .eventloops import enable_gui
506 from .eventloops import enable_gui
528 enable_gui = staticmethod(enable_gui)
507 enable_gui = staticmethod(enable_gui)
529
508
530 def init_environment(self):
509 def init_environment(self):
531 """Configure the user's environment.
510 """Configure the user's environment.
532
511
533 """
512 """
534 env = os.environ
513 env = os.environ
535 # These two ensure 'ls' produces nice coloring on BSD-derived systems
514 # These two ensure 'ls' produces nice coloring on BSD-derived systems
536 env['TERM'] = 'xterm-color'
515 env['TERM'] = 'xterm-color'
537 env['CLICOLOR'] = '1'
516 env['CLICOLOR'] = '1'
538 # Since normal pagers don't work at all (over pexpect we don't have
517 # Since normal pagers don't work at all (over pexpect we don't have
539 # single-key control of the subprocess), try to disable paging in
518 # single-key control of the subprocess), try to disable paging in
540 # subprocesses as much as possible.
519 # subprocesses as much as possible.
541 env['PAGER'] = 'cat'
520 env['PAGER'] = 'cat'
542 env['GIT_PAGER'] = 'cat'
521 env['GIT_PAGER'] = 'cat'
543
522
544 # And install the payload version of page.
523 # And install the payload version of page.
545 install_payload_page()
524 install_payload_page()
546
525
547 def auto_rewrite_input(self, cmd):
526 def auto_rewrite_input(self, cmd):
548 """Called to show the auto-rewritten input for autocall and friends.
527 """Called to show the auto-rewritten input for autocall and friends.
549
528
550 FIXME: this payload is currently not correctly processed by the
529 FIXME: this payload is currently not correctly processed by the
551 frontend.
530 frontend.
552 """
531 """
553 new = self.prompt_manager.render('rewrite') + cmd
532 new = self.prompt_manager.render('rewrite') + cmd
554 payload = dict(
533 payload = dict(
555 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.auto_rewrite_input',
534 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.auto_rewrite_input',
556 transformed_input=new,
535 transformed_input=new,
557 )
536 )
558 self.payload_manager.write_payload(payload)
537 self.payload_manager.write_payload(payload)
559
538
560 def ask_exit(self):
539 def ask_exit(self):
561 """Engage the exit actions."""
540 """Engage the exit actions."""
562 self.exit_now = True
541 self.exit_now = True
563 payload = dict(
542 payload = dict(
564 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.ask_exit',
543 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.ask_exit',
565 exit=True,
544 exit=True,
566 keepkernel=self.keepkernel_on_exit,
545 keepkernel=self.keepkernel_on_exit,
567 )
546 )
568 self.payload_manager.write_payload(payload)
547 self.payload_manager.write_payload(payload)
569
548
570 def _showtraceback(self, etype, evalue, stb):
549 def _showtraceback(self, etype, evalue, stb):
571
550
572 exc_content = {
551 exc_content = {
573 u'traceback' : stb,
552 u'traceback' : stb,
574 u'ename' : unicode(etype.__name__),
553 u'ename' : unicode(etype.__name__),
575 u'evalue' : safe_unicode(evalue)
554 u'evalue' : py3compat.safe_unicode(evalue),
576 }
555 }
577
556
578 dh = self.displayhook
557 dh = self.displayhook
579 # Send exception info over pub socket for other clients than the caller
558 # Send exception info over pub socket for other clients than the caller
580 # to pick up
559 # to pick up
581 topic = None
560 topic = None
582 if dh.topic:
561 if dh.topic:
583 topic = dh.topic.replace(b'pyout', b'pyerr')
562 topic = dh.topic.replace(b'pyout', b'pyerr')
584
563
585 exc_msg = dh.session.send(dh.pub_socket, u'pyerr', json_clean(exc_content), dh.parent_header, ident=topic)
564 exc_msg = dh.session.send(dh.pub_socket, u'pyerr', json_clean(exc_content), dh.parent_header, ident=topic)
586
565
587 # FIXME - Hack: store exception info in shell object. Right now, the
566 # FIXME - Hack: store exception info in shell object. Right now, the
588 # caller is reading this info after the fact, we need to fix this logic
567 # caller is reading this info after the fact, we need to fix this logic
589 # to remove this hack. Even uglier, we need to store the error status
568 # to remove this hack. Even uglier, we need to store the error status
590 # here, because in the main loop, the logic that sets it is being
569 # here, because in the main loop, the logic that sets it is being
591 # skipped because runlines swallows the exceptions.
570 # skipped because runlines swallows the exceptions.
592 exc_content[u'status'] = u'error'
571 exc_content[u'status'] = u'error'
593 self._reply_content = exc_content
572 self._reply_content = exc_content
594 # /FIXME
573 # /FIXME
595
574
596 return exc_content
575 return exc_content
597
576
598 def set_next_input(self, text):
577 def set_next_input(self, text):
599 """Send the specified text to the frontend to be presented at the next
578 """Send the specified text to the frontend to be presented at the next
600 input cell."""
579 input cell."""
601 payload = dict(
580 payload = dict(
602 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.set_next_input',
581 source='IPython.kernel.zmq.zmqshell.ZMQInteractiveShell.set_next_input',
603 text=text
582 text=text
604 )
583 )
605 self.payload_manager.write_payload(payload)
584 self.payload_manager.write_payload(payload)
606
585
607 #-------------------------------------------------------------------------
586 #-------------------------------------------------------------------------
608 # Things related to magics
587 # Things related to magics
609 #-------------------------------------------------------------------------
588 #-------------------------------------------------------------------------
610
589
611 def init_magics(self):
590 def init_magics(self):
612 super(ZMQInteractiveShell, self).init_magics()
591 super(ZMQInteractiveShell, self).init_magics()
613 self.register_magics(KernelMagics)
592 self.register_magics(KernelMagics)
614 self.magics_manager.register_alias('ed', 'edit')
593 self.magics_manager.register_alias('ed', 'edit')
615
594
616
595
617
596
618 InteractiveShellABC.register(ZMQInteractiveShell)
597 InteractiveShellABC.register(ZMQInteractiveShell)
@@ -1,183 +1,204 b''
1 # coding: utf-8
1 # coding: utf-8
2 """Compatibility tricks for Python 3. Mainly to do with unicode."""
2 """Compatibility tricks for Python 3. Mainly to do with unicode."""
3 import __builtin__
3 import __builtin__
4 import functools
4 import functools
5 import sys
5 import sys
6 import re
6 import re
7 import types
7 import types
8
8
9 from .encoding import DEFAULT_ENCODING
9 from .encoding import DEFAULT_ENCODING
10
10
11 orig_open = open
11 orig_open = open
12
12
13 def no_code(x, encoding=None):
13 def no_code(x, encoding=None):
14 return x
14 return x
15
15
16 def decode(s, encoding=None):
16 def decode(s, encoding=None):
17 encoding = encoding or DEFAULT_ENCODING
17 encoding = encoding or DEFAULT_ENCODING
18 return s.decode(encoding, "replace")
18 return s.decode(encoding, "replace")
19
19
20 def encode(u, encoding=None):
20 def encode(u, encoding=None):
21 encoding = encoding or DEFAULT_ENCODING
21 encoding = encoding or DEFAULT_ENCODING
22 return u.encode(encoding, "replace")
22 return u.encode(encoding, "replace")
23
23
24
24
25 def cast_unicode(s, encoding=None):
25 def cast_unicode(s, encoding=None):
26 if isinstance(s, bytes):
26 if isinstance(s, bytes):
27 return decode(s, encoding)
27 return decode(s, encoding)
28 return s
28 return s
29
29
30 def cast_bytes(s, encoding=None):
30 def cast_bytes(s, encoding=None):
31 if not isinstance(s, bytes):
31 if not isinstance(s, bytes):
32 return encode(s, encoding)
32 return encode(s, encoding)
33 return s
33 return s
34
34
35 def _modify_str_or_docstring(str_change_func):
35 def _modify_str_or_docstring(str_change_func):
36 @functools.wraps(str_change_func)
36 @functools.wraps(str_change_func)
37 def wrapper(func_or_str):
37 def wrapper(func_or_str):
38 if isinstance(func_or_str, basestring):
38 if isinstance(func_or_str, basestring):
39 func = None
39 func = None
40 doc = func_or_str
40 doc = func_or_str
41 else:
41 else:
42 func = func_or_str
42 func = func_or_str
43 doc = func.__doc__
43 doc = func.__doc__
44
44
45 doc = str_change_func(doc)
45 doc = str_change_func(doc)
46
46
47 if func:
47 if func:
48 func.__doc__ = doc
48 func.__doc__ = doc
49 return func
49 return func
50 return doc
50 return doc
51 return wrapper
51 return wrapper
52
52
53 def safe_unicode(e):
54 """unicode(e) with various fallbacks. Used for exceptions, which may not be
55 safe to call unicode() on.
56 """
57 try:
58 return unicode(e)
59 except UnicodeError:
60 pass
61
62 try:
63 return py3compat.str_to_unicode(str(e))
64 except UnicodeError:
65 pass
66
67 try:
68 return py3compat.str_to_unicode(repr(e))
69 except UnicodeError:
70 pass
71
72 return u'Unrecoverably corrupt evalue'
73
53 if sys.version_info[0] >= 3:
74 if sys.version_info[0] >= 3:
54 PY3 = True
75 PY3 = True
55
76
56 input = input
77 input = input
57 builtin_mod_name = "builtins"
78 builtin_mod_name = "builtins"
58
79
59 str_to_unicode = no_code
80 str_to_unicode = no_code
60 unicode_to_str = no_code
81 unicode_to_str = no_code
61 str_to_bytes = encode
82 str_to_bytes = encode
62 bytes_to_str = decode
83 bytes_to_str = decode
63 cast_bytes_py2 = no_code
84 cast_bytes_py2 = no_code
64
85
65 string_types = (str,)
86 string_types = (str,)
66
87
67 def isidentifier(s, dotted=False):
88 def isidentifier(s, dotted=False):
68 if dotted:
89 if dotted:
69 return all(isidentifier(a) for a in s.split("."))
90 return all(isidentifier(a) for a in s.split("."))
70 return s.isidentifier()
91 return s.isidentifier()
71
92
72 open = orig_open
93 open = orig_open
73
94
74 MethodType = types.MethodType
95 MethodType = types.MethodType
75
96
76 def execfile(fname, glob, loc=None):
97 def execfile(fname, glob, loc=None):
77 loc = loc if (loc is not None) else glob
98 loc = loc if (loc is not None) else glob
78 with open(fname, 'rb') as f:
99 with open(fname, 'rb') as f:
79 exec compile(f.read(), fname, 'exec') in glob, loc
100 exec compile(f.read(), fname, 'exec') in glob, loc
80
101
81 # Refactor print statements in doctests.
102 # Refactor print statements in doctests.
82 _print_statement_re = re.compile(r"\bprint (?P<expr>.*)$", re.MULTILINE)
103 _print_statement_re = re.compile(r"\bprint (?P<expr>.*)$", re.MULTILINE)
83 def _print_statement_sub(match):
104 def _print_statement_sub(match):
84 expr = match.groups('expr')
105 expr = match.groups('expr')
85 return "print(%s)" % expr
106 return "print(%s)" % expr
86
107
87 @_modify_str_or_docstring
108 @_modify_str_or_docstring
88 def doctest_refactor_print(doc):
109 def doctest_refactor_print(doc):
89 """Refactor 'print x' statements in a doctest to print(x) style. 2to3
110 """Refactor 'print x' statements in a doctest to print(x) style. 2to3
90 unfortunately doesn't pick up on our doctests.
111 unfortunately doesn't pick up on our doctests.
91
112
92 Can accept a string or a function, so it can be used as a decorator."""
113 Can accept a string or a function, so it can be used as a decorator."""
93 return _print_statement_re.sub(_print_statement_sub, doc)
114 return _print_statement_re.sub(_print_statement_sub, doc)
94
115
95 # Abstract u'abc' syntax:
116 # Abstract u'abc' syntax:
96 @_modify_str_or_docstring
117 @_modify_str_or_docstring
97 def u_format(s):
118 def u_format(s):
98 """"{u}'abc'" --> "'abc'" (Python 3)
119 """"{u}'abc'" --> "'abc'" (Python 3)
99
120
100 Accepts a string or a function, so it can be used as a decorator."""
121 Accepts a string or a function, so it can be used as a decorator."""
101 return s.format(u='')
122 return s.format(u='')
102
123
103 else:
124 else:
104 PY3 = False
125 PY3 = False
105
126
106 input = raw_input
127 input = raw_input
107 builtin_mod_name = "__builtin__"
128 builtin_mod_name = "__builtin__"
108
129
109 str_to_unicode = decode
130 str_to_unicode = decode
110 unicode_to_str = encode
131 unicode_to_str = encode
111 str_to_bytes = no_code
132 str_to_bytes = no_code
112 bytes_to_str = no_code
133 bytes_to_str = no_code
113 cast_bytes_py2 = cast_bytes
134 cast_bytes_py2 = cast_bytes
114
135
115 string_types = (str, unicode)
136 string_types = (str, unicode)
116
137
117 import re
138 import re
118 _name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$")
139 _name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$")
119 def isidentifier(s, dotted=False):
140 def isidentifier(s, dotted=False):
120 if dotted:
141 if dotted:
121 return all(isidentifier(a) for a in s.split("."))
142 return all(isidentifier(a) for a in s.split("."))
122 return bool(_name_re.match(s))
143 return bool(_name_re.match(s))
123
144
124 class open(object):
145 class open(object):
125 """Wrapper providing key part of Python 3 open() interface."""
146 """Wrapper providing key part of Python 3 open() interface."""
126 def __init__(self, fname, mode="r", encoding="utf-8"):
147 def __init__(self, fname, mode="r", encoding="utf-8"):
127 self.f = orig_open(fname, mode)
148 self.f = orig_open(fname, mode)
128 self.enc = encoding
149 self.enc = encoding
129
150
130 def write(self, s):
151 def write(self, s):
131 return self.f.write(s.encode(self.enc))
152 return self.f.write(s.encode(self.enc))
132
153
133 def read(self, size=-1):
154 def read(self, size=-1):
134 return self.f.read(size).decode(self.enc)
155 return self.f.read(size).decode(self.enc)
135
156
136 def close(self):
157 def close(self):
137 return self.f.close()
158 return self.f.close()
138
159
139 def __enter__(self):
160 def __enter__(self):
140 return self
161 return self
141
162
142 def __exit__(self, etype, value, traceback):
163 def __exit__(self, etype, value, traceback):
143 self.f.close()
164 self.f.close()
144
165
145 def MethodType(func, instance):
166 def MethodType(func, instance):
146 return types.MethodType(func, instance, type(instance))
167 return types.MethodType(func, instance, type(instance))
147
168
148 # don't override system execfile on 2.x:
169 # don't override system execfile on 2.x:
149 execfile = execfile
170 execfile = execfile
150
171
151 def doctest_refactor_print(func_or_str):
172 def doctest_refactor_print(func_or_str):
152 return func_or_str
173 return func_or_str
153
174
154
175
155 # Abstract u'abc' syntax:
176 # Abstract u'abc' syntax:
156 @_modify_str_or_docstring
177 @_modify_str_or_docstring
157 def u_format(s):
178 def u_format(s):
158 """"{u}'abc'" --> "u'abc'" (Python 2)
179 """"{u}'abc'" --> "u'abc'" (Python 2)
159
180
160 Accepts a string or a function, so it can be used as a decorator."""
181 Accepts a string or a function, so it can be used as a decorator."""
161 return s.format(u='u')
182 return s.format(u='u')
162
183
163 if sys.platform == 'win32':
184 if sys.platform == 'win32':
164 def execfile(fname, glob=None, loc=None):
185 def execfile(fname, glob=None, loc=None):
165 loc = loc if (loc is not None) else glob
186 loc = loc if (loc is not None) else glob
166 # The rstrip() is necessary b/c trailing whitespace in files will
187 # The rstrip() is necessary b/c trailing whitespace in files will
167 # cause an IndentationError in Python 2.6 (this was fixed in 2.7,
188 # cause an IndentationError in Python 2.6 (this was fixed in 2.7,
168 # but we still support 2.6). See issue 1027.
189 # but we still support 2.6). See issue 1027.
169 scripttext = __builtin__.open(fname).read().rstrip() + '\n'
190 scripttext = __builtin__.open(fname).read().rstrip() + '\n'
170 # compile converts unicode filename to str assuming
191 # compile converts unicode filename to str assuming
171 # ascii. Let's do the conversion before calling compile
192 # ascii. Let's do the conversion before calling compile
172 if isinstance(fname, unicode):
193 if isinstance(fname, unicode):
173 filename = unicode_to_str(fname)
194 filename = unicode_to_str(fname)
174 else:
195 else:
175 filename = fname
196 filename = fname
176 exec compile(scripttext, filename, 'exec') in glob, loc
197 exec compile(scripttext, filename, 'exec') in glob, loc
177 else:
198 else:
178 def execfile(fname, *where):
199 def execfile(fname, *where):
179 if isinstance(fname, unicode):
200 if isinstance(fname, unicode):
180 filename = fname.encode(sys.getfilesystemencoding())
201 filename = fname.encode(sys.getfilesystemencoding())
181 else:
202 else:
182 filename = fname
203 filename = fname
183 __builtin__.execfile(filename, *where)
204 __builtin__.execfile(filename, *where)
@@ -1,1068 +1,1069 b''
1 .. _messaging:
1 .. _messaging:
2
2
3 ======================
3 ======================
4 Messaging in IPython
4 Messaging in IPython
5 ======================
5 ======================
6
6
7
7
8 Introduction
8 Introduction
9 ============
9 ============
10
10
11 This document explains the basic communications design and messaging
11 This document explains the basic communications design and messaging
12 specification for how the various IPython objects interact over a network
12 specification for how the various IPython objects interact over a network
13 transport. The current implementation uses the ZeroMQ_ library for messaging
13 transport. The current implementation uses the ZeroMQ_ library for messaging
14 within and between hosts.
14 within and between hosts.
15
15
16 .. Note::
16 .. Note::
17
17
18 This document should be considered the authoritative description of the
18 This document should be considered the authoritative description of the
19 IPython messaging protocol, and all developers are strongly encouraged to
19 IPython messaging protocol, and all developers are strongly encouraged to
20 keep it updated as the implementation evolves, so that we have a single
20 keep it updated as the implementation evolves, so that we have a single
21 common reference for all protocol details.
21 common reference for all protocol details.
22
22
23 The basic design is explained in the following diagram:
23 The basic design is explained in the following diagram:
24
24
25 .. image:: figs/frontend-kernel.png
25 .. image:: figs/frontend-kernel.png
26 :width: 450px
26 :width: 450px
27 :alt: IPython kernel/frontend messaging architecture.
27 :alt: IPython kernel/frontend messaging architecture.
28 :align: center
28 :align: center
29 :target: ../_images/frontend-kernel.png
29 :target: ../_images/frontend-kernel.png
30
30
31 A single kernel can be simultaneously connected to one or more frontends. The
31 A single kernel can be simultaneously connected to one or more frontends. The
32 kernel has three sockets that serve the following functions:
32 kernel has three sockets that serve the following functions:
33
33
34 1. stdin: this ROUTER socket is connected to all frontends, and it allows
34 1. stdin: this ROUTER socket is connected to all frontends, and it allows
35 the kernel to request input from the active frontend when :func:`raw_input` is called.
35 the kernel to request input from the active frontend when :func:`raw_input` is called.
36 The frontend that executed the code has a DEALER socket that acts as a 'virtual keyboard'
36 The frontend that executed the code has a DEALER socket that acts as a 'virtual keyboard'
37 for the kernel while this communication is happening (illustrated in the
37 for the kernel while this communication is happening (illustrated in the
38 figure by the black outline around the central keyboard). In practice,
38 figure by the black outline around the central keyboard). In practice,
39 frontends may display such kernel requests using a special input widget or
39 frontends may display such kernel requests using a special input widget or
40 otherwise indicating that the user is to type input for the kernel instead
40 otherwise indicating that the user is to type input for the kernel instead
41 of normal commands in the frontend.
41 of normal commands in the frontend.
42
42
43 2. Shell: this single ROUTER socket allows multiple incoming connections from
43 2. Shell: this single ROUTER socket allows multiple incoming connections from
44 frontends, and this is the socket where requests for code execution, object
44 frontends, and this is the socket where requests for code execution, object
45 information, prompts, etc. are made to the kernel by any frontend. The
45 information, prompts, etc. are made to the kernel by any frontend. The
46 communication on this socket is a sequence of request/reply actions from
46 communication on this socket is a sequence of request/reply actions from
47 each frontend and the kernel.
47 each frontend and the kernel.
48
48
49 3. IOPub: this socket is the 'broadcast channel' where the kernel publishes all
49 3. IOPub: this socket is the 'broadcast channel' where the kernel publishes all
50 side effects (stdout, stderr, etc.) as well as the requests coming from any
50 side effects (stdout, stderr, etc.) as well as the requests coming from any
51 client over the shell socket and its own requests on the stdin socket. There
51 client over the shell socket and its own requests on the stdin socket. There
52 are a number of actions in Python which generate side effects: :func:`print`
52 are a number of actions in Python which generate side effects: :func:`print`
53 writes to ``sys.stdout``, errors generate tracebacks, etc. Additionally, in
53 writes to ``sys.stdout``, errors generate tracebacks, etc. Additionally, in
54 a multi-client scenario, we want all frontends to be able to know what each
54 a multi-client scenario, we want all frontends to be able to know what each
55 other has sent to the kernel (this can be useful in collaborative scenarios,
55 other has sent to the kernel (this can be useful in collaborative scenarios,
56 for example). This socket allows both side effects and the information
56 for example). This socket allows both side effects and the information
57 about communications taking place with one client over the shell channel
57 about communications taking place with one client over the shell channel
58 to be made available to all clients in a uniform manner.
58 to be made available to all clients in a uniform manner.
59
59
60 All messages are tagged with enough information (details below) for clients
60 All messages are tagged with enough information (details below) for clients
61 to know which messages come from their own interaction with the kernel and
61 to know which messages come from their own interaction with the kernel and
62 which ones are from other clients, so they can display each type
62 which ones are from other clients, so they can display each type
63 appropriately.
63 appropriately.
64
64
65 The actual format of the messages allowed on each of these channels is
65 The actual format of the messages allowed on each of these channels is
66 specified below. Messages are dicts of dicts with string keys and values that
66 specified below. Messages are dicts of dicts with string keys and values that
67 are reasonably representable in JSON. Our current implementation uses JSON
67 are reasonably representable in JSON. Our current implementation uses JSON
68 explicitly as its message format, but this shouldn't be considered a permanent
68 explicitly as its message format, but this shouldn't be considered a permanent
69 feature. As we've discovered that JSON has non-trivial performance issues due
69 feature. As we've discovered that JSON has non-trivial performance issues due
70 to excessive copying, we may in the future move to a pure pickle-based raw
70 to excessive copying, we may in the future move to a pure pickle-based raw
71 message format. However, it should be possible to easily convert from the raw
71 message format. However, it should be possible to easily convert from the raw
72 objects to JSON, since we may have non-python clients (e.g. a web frontend).
72 objects to JSON, since we may have non-python clients (e.g. a web frontend).
73 As long as it's easy to make a JSON version of the objects that is a faithful
73 As long as it's easy to make a JSON version of the objects that is a faithful
74 representation of all the data, we can communicate with such clients.
74 representation of all the data, we can communicate with such clients.
75
75
76 .. Note::
76 .. Note::
77
77
78 Not all of these have yet been fully fleshed out, but the key ones are, see
78 Not all of these have yet been fully fleshed out, but the key ones are, see
79 kernel and frontend files for actual implementation details.
79 kernel and frontend files for actual implementation details.
80
80
81 General Message Format
81 General Message Format
82 ======================
82 ======================
83
83
84 A message is defined by the following four-dictionary structure::
84 A message is defined by the following four-dictionary structure::
85
85
86 {
86 {
87 # The message header contains a pair of unique identifiers for the
87 # The message header contains a pair of unique identifiers for the
88 # originating session and the actual message id, in addition to the
88 # originating session and the actual message id, in addition to the
89 # username for the process that generated the message. This is useful in
89 # username for the process that generated the message. This is useful in
90 # collaborative settings where multiple users may be interacting with the
90 # collaborative settings where multiple users may be interacting with the
91 # same kernel simultaneously, so that frontends can label the various
91 # same kernel simultaneously, so that frontends can label the various
92 # messages in a meaningful way.
92 # messages in a meaningful way.
93 'header' : {
93 'header' : {
94 'msg_id' : uuid,
94 'msg_id' : uuid,
95 'username' : str,
95 'username' : str,
96 'session' : uuid
96 'session' : uuid
97 # All recognized message type strings are listed below.
97 # All recognized message type strings are listed below.
98 'msg_type' : str,
98 'msg_type' : str,
99 },
99 },
100
100
101 # In a chain of messages, the header from the parent is copied so that
101 # In a chain of messages, the header from the parent is copied so that
102 # clients can track where messages come from.
102 # clients can track where messages come from.
103 'parent_header' : dict,
103 'parent_header' : dict,
104
104
105 # The actual content of the message must be a dict, whose structure
105 # The actual content of the message must be a dict, whose structure
106 # depends on the message type.
106 # depends on the message type.
107 'content' : dict,
107 'content' : dict,
108
108
109 # Any metadata associated with the message.
109 # Any metadata associated with the message.
110 'metadata' : dict,
110 'metadata' : dict,
111 }
111 }
112
112
113
113
114 Python functional API
114 Python functional API
115 =====================
115 =====================
116
116
117 As messages are dicts, they map naturally to a ``func(**kw)`` call form. We
117 As messages are dicts, they map naturally to a ``func(**kw)`` call form. We
118 should develop, at a few key points, functional forms of all the requests that
118 should develop, at a few key points, functional forms of all the requests that
119 take arguments in this manner and automatically construct the necessary dict
119 take arguments in this manner and automatically construct the necessary dict
120 for sending.
120 for sending.
121
121
122 In addition, the Python implementation of the message specification extends
122 In addition, the Python implementation of the message specification extends
123 messages upon deserialization to the following form for convenience::
123 messages upon deserialization to the following form for convenience::
124
124
125 {
125 {
126 'header' : dict,
126 'header' : dict,
127 # The msg's unique identifier and type are always stored in the header,
127 # The msg's unique identifier and type are always stored in the header,
128 # but the Python implementation copies them to the top level.
128 # but the Python implementation copies them to the top level.
129 'msg_id' : uuid,
129 'msg_id' : uuid,
130 'msg_type' : str,
130 'msg_type' : str,
131 'parent_header' : dict,
131 'parent_header' : dict,
132 'content' : dict,
132 'content' : dict,
133 'metadata' : dict,
133 'metadata' : dict,
134 }
134 }
135
135
136 All messages sent to or received by any IPython process should have this
136 All messages sent to or received by any IPython process should have this
137 extended structure.
137 extended structure.
138
138
139
139
140 Messages on the shell ROUTER/DEALER sockets
140 Messages on the shell ROUTER/DEALER sockets
141 ===========================================
141 ===========================================
142
142
143 .. _execute:
143 .. _execute:
144
144
145 Execute
145 Execute
146 -------
146 -------
147
147
148 This message type is used by frontends to ask the kernel to execute code on
148 This message type is used by frontends to ask the kernel to execute code on
149 behalf of the user, in a namespace reserved to the user's variables (and thus
149 behalf of the user, in a namespace reserved to the user's variables (and thus
150 separate from the kernel's own internal code and variables).
150 separate from the kernel's own internal code and variables).
151
151
152 Message type: ``execute_request``::
152 Message type: ``execute_request``::
153
153
154 content = {
154 content = {
155 # Source code to be executed by the kernel, one or more lines.
155 # Source code to be executed by the kernel, one or more lines.
156 'code' : str,
156 'code' : str,
157
157
158 # A boolean flag which, if True, signals the kernel to execute
158 # A boolean flag which, if True, signals the kernel to execute
159 # this code as quietly as possible. This means that the kernel
159 # this code as quietly as possible. This means that the kernel
160 # will compile the code with 'exec' instead of 'single' (so
160 # will compile the code with 'exec' instead of 'single' (so
161 # sys.displayhook will not fire), forces store_history to be False,
161 # sys.displayhook will not fire), forces store_history to be False,
162 # and will *not*:
162 # and will *not*:
163 # - broadcast exceptions on the PUB socket
163 # - broadcast exceptions on the PUB socket
164 # - do any logging
164 # - do any logging
165 #
165 #
166 # The default is False.
166 # The default is False.
167 'silent' : bool,
167 'silent' : bool,
168
168
169 # A boolean flag which, if True, signals the kernel to populate history
169 # A boolean flag which, if True, signals the kernel to populate history
170 # The default is True if silent is False. If silent is True, store_history
170 # The default is True if silent is False. If silent is True, store_history
171 # is forced to be False.
171 # is forced to be False.
172 'store_history' : bool,
172 'store_history' : bool,
173
173
174 # A list of variable names from the user's namespace to be retrieved. What
174 # A list of variable names from the user's namespace to be retrieved.
175 # returns is a JSON string of the variable's repr(), not a python object.
175 # What returns is a rich representation of each variable (dict keyed by name).
176 # See the display_data content for the structure of the representation data.
176 'user_variables' : list,
177 'user_variables' : list,
177
178
178 # Similarly, a dict mapping names to expressions to be evaluated in the
179 # Similarly, a dict mapping names to expressions to be evaluated in the
179 # user's dict.
180 # user's dict.
180 'user_expressions' : dict,
181 'user_expressions' : dict,
181
182
182 # Some frontends (e.g. the Notebook) do not support stdin requests. If
183 # Some frontends (e.g. the Notebook) do not support stdin requests. If
183 # raw_input is called from code executed from such a frontend, a
184 # raw_input is called from code executed from such a frontend, a
184 # StdinNotImplementedError will be raised.
185 # StdinNotImplementedError will be raised.
185 'allow_stdin' : True,
186 'allow_stdin' : True,
186
187
187 }
188 }
188
189
189 The ``code`` field contains a single string (possibly multiline). The kernel
190 The ``code`` field contains a single string (possibly multiline). The kernel
190 is responsible for splitting this into one or more independent execution blocks
191 is responsible for splitting this into one or more independent execution blocks
191 and deciding whether to compile these in 'single' or 'exec' mode (see below for
192 and deciding whether to compile these in 'single' or 'exec' mode (see below for
192 detailed execution semantics).
193 detailed execution semantics).
193
194
194 The ``user_`` fields deserve a detailed explanation. In the past, IPython had
195 The ``user_`` fields deserve a detailed explanation. In the past, IPython had
195 the notion of a prompt string that allowed arbitrary code to be evaluated, and
196 the notion of a prompt string that allowed arbitrary code to be evaluated, and
196 this was put to good use by many in creating prompts that displayed system
197 this was put to good use by many in creating prompts that displayed system
197 status, path information, and even more esoteric uses like remote instrument
198 status, path information, and even more esoteric uses like remote instrument
198 status acquired over the network. But now that IPython has a clean separation
199 status acquired over the network. But now that IPython has a clean separation
199 between the kernel and the clients, the kernel has no prompt knowledge; prompts
200 between the kernel and the clients, the kernel has no prompt knowledge; prompts
200 are a frontend-side feature, and it should be even possible for different
201 are a frontend-side feature, and it should be even possible for different
201 frontends to display different prompts while interacting with the same kernel.
202 frontends to display different prompts while interacting with the same kernel.
202
203
203 The kernel now provides the ability to retrieve data from the user's namespace
204 The kernel now provides the ability to retrieve data from the user's namespace
204 after the execution of the main ``code``, thanks to two fields in the
205 after the execution of the main ``code``, thanks to two fields in the
205 ``execute_request`` message:
206 ``execute_request`` message:
206
207
207 - ``user_variables``: If only variables from the user's namespace are needed, a
208 - ``user_variables``: If only variables from the user's namespace are needed, a
208 list of variable names can be passed and a dict with these names as keys and
209 list of variable names can be passed and a dict with these names as keys and
209 their :func:`repr()` as values will be returned.
210 their :func:`repr()` as values will be returned.
210
211
211 - ``user_expressions``: For more complex expressions that require function
212 - ``user_expressions``: For more complex expressions that require function
212 evaluations, a dict can be provided with string keys and arbitrary python
213 evaluations, a dict can be provided with string keys and arbitrary python
213 expressions as values. The return message will contain also a dict with the
214 expressions as values. The return message will contain also a dict with the
214 same keys and the :func:`repr()` of the evaluated expressions as value.
215 same keys and the :func:`repr()` of the evaluated expressions as value.
215
216
216 With this information, frontends can display any status information they wish
217 With this information, frontends can display any status information they wish
217 in the form that best suits each frontend (a status line, a popup, inline for a
218 in the form that best suits each frontend (a status line, a popup, inline for a
218 terminal, etc).
219 terminal, etc).
219
220
220 .. Note::
221 .. Note::
221
222
222 In order to obtain the current execution counter for the purposes of
223 In order to obtain the current execution counter for the purposes of
223 displaying input prompts, frontends simply make an execution request with an
224 displaying input prompts, frontends simply make an execution request with an
224 empty code string and ``silent=True``.
225 empty code string and ``silent=True``.
225
226
226 Execution semantics
227 Execution semantics
227 ~~~~~~~~~~~~~~~~~~~
228 ~~~~~~~~~~~~~~~~~~~
228
229
229 When the silent flag is false, the execution of use code consists of the
230 When the silent flag is false, the execution of use code consists of the
230 following phases (in silent mode, only the ``code`` field is executed):
231 following phases (in silent mode, only the ``code`` field is executed):
231
232
232 1. Run the ``pre_runcode_hook``.
233 1. Run the ``pre_runcode_hook``.
233
234
234 2. Execute the ``code`` field, see below for details.
235 2. Execute the ``code`` field, see below for details.
235
236
236 3. If #2 succeeds, compute ``user_variables`` and ``user_expressions`` are
237 3. If #2 succeeds, compute ``user_variables`` and ``user_expressions`` are
237 computed. This ensures that any error in the latter don't harm the main
238 computed. This ensures that any error in the latter don't harm the main
238 code execution.
239 code execution.
239
240
240 4. Call any method registered with :meth:`register_post_execute`.
241 4. Call any method registered with :meth:`register_post_execute`.
241
242
242 .. warning::
243 .. warning::
243
244
244 The API for running code before/after the main code block is likely to
245 The API for running code before/after the main code block is likely to
245 change soon. Both the ``pre_runcode_hook`` and the
246 change soon. Both the ``pre_runcode_hook`` and the
246 :meth:`register_post_execute` are susceptible to modification, as we find a
247 :meth:`register_post_execute` are susceptible to modification, as we find a
247 consistent model for both.
248 consistent model for both.
248
249
249 To understand how the ``code`` field is executed, one must know that Python
250 To understand how the ``code`` field is executed, one must know that Python
250 code can be compiled in one of three modes (controlled by the ``mode`` argument
251 code can be compiled in one of three modes (controlled by the ``mode`` argument
251 to the :func:`compile` builtin):
252 to the :func:`compile` builtin):
252
253
253 *single*
254 *single*
254 Valid for a single interactive statement (though the source can contain
255 Valid for a single interactive statement (though the source can contain
255 multiple lines, such as a for loop). When compiled in this mode, the
256 multiple lines, such as a for loop). When compiled in this mode, the
256 generated bytecode contains special instructions that trigger the calling of
257 generated bytecode contains special instructions that trigger the calling of
257 :func:`sys.displayhook` for any expression in the block that returns a value.
258 :func:`sys.displayhook` for any expression in the block that returns a value.
258 This means that a single statement can actually produce multiple calls to
259 This means that a single statement can actually produce multiple calls to
259 :func:`sys.displayhook`, if for example it contains a loop where each
260 :func:`sys.displayhook`, if for example it contains a loop where each
260 iteration computes an unassigned expression would generate 10 calls::
261 iteration computes an unassigned expression would generate 10 calls::
261
262
262 for i in range(10):
263 for i in range(10):
263 i**2
264 i**2
264
265
265 *exec*
266 *exec*
266 An arbitrary amount of source code, this is how modules are compiled.
267 An arbitrary amount of source code, this is how modules are compiled.
267 :func:`sys.displayhook` is *never* implicitly called.
268 :func:`sys.displayhook` is *never* implicitly called.
268
269
269 *eval*
270 *eval*
270 A single expression that returns a value. :func:`sys.displayhook` is *never*
271 A single expression that returns a value. :func:`sys.displayhook` is *never*
271 implicitly called.
272 implicitly called.
272
273
273
274
274 The ``code`` field is split into individual blocks each of which is valid for
275 The ``code`` field is split into individual blocks each of which is valid for
275 execution in 'single' mode, and then:
276 execution in 'single' mode, and then:
276
277
277 - If there is only a single block: it is executed in 'single' mode.
278 - If there is only a single block: it is executed in 'single' mode.
278
279
279 - If there is more than one block:
280 - If there is more than one block:
280
281
281 * if the last one is a single line long, run all but the last in 'exec' mode
282 * if the last one is a single line long, run all but the last in 'exec' mode
282 and the very last one in 'single' mode. This makes it easy to type simple
283 and the very last one in 'single' mode. This makes it easy to type simple
283 expressions at the end to see computed values.
284 expressions at the end to see computed values.
284
285
285 * if the last one is no more than two lines long, run all but the last in
286 * if the last one is no more than two lines long, run all but the last in
286 'exec' mode and the very last one in 'single' mode. This makes it easy to
287 'exec' mode and the very last one in 'single' mode. This makes it easy to
287 type simple expressions at the end to see computed values. - otherwise
288 type simple expressions at the end to see computed values. - otherwise
288 (last one is also multiline), run all in 'exec' mode
289 (last one is also multiline), run all in 'exec' mode
289
290
290 * otherwise (last one is also multiline), run all in 'exec' mode as a single
291 * otherwise (last one is also multiline), run all in 'exec' mode as a single
291 unit.
292 unit.
292
293
293 Any error in retrieving the ``user_variables`` or evaluating the
294 Any error in retrieving the ``user_variables`` or evaluating the
294 ``user_expressions`` will result in a simple error message in the return fields
295 ``user_expressions`` will result in a simple error message in the return fields
295 of the form::
296 of the form::
296
297
297 [ERROR] ExceptionType: Exception message
298 [ERROR] ExceptionType: Exception message
298
299
299 The user can simply send the same variable name or expression for evaluation to
300 The user can simply send the same variable name or expression for evaluation to
300 see a regular traceback.
301 see a regular traceback.
301
302
302 Errors in any registered post_execute functions are also reported similarly,
303 Errors in any registered post_execute functions are also reported similarly,
303 and the failing function is removed from the post_execution set so that it does
304 and the failing function is removed from the post_execution set so that it does
304 not continue triggering failures.
305 not continue triggering failures.
305
306
306 Upon completion of the execution request, the kernel *always* sends a reply,
307 Upon completion of the execution request, the kernel *always* sends a reply,
307 with a status code indicating what happened and additional data depending on
308 with a status code indicating what happened and additional data depending on
308 the outcome. See :ref:`below <execution_results>` for the possible return
309 the outcome. See :ref:`below <execution_results>` for the possible return
309 codes and associated data.
310 codes and associated data.
310
311
311
312
312 Execution counter (old prompt number)
313 Execution counter (old prompt number)
313 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
314 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
314
315
315 The kernel has a single, monotonically increasing counter of all execution
316 The kernel has a single, monotonically increasing counter of all execution
316 requests that are made with ``store_history=True``. This counter is used to populate
317 requests that are made with ``store_history=True``. This counter is used to populate
317 the ``In[n]``, ``Out[n]`` and ``_n`` variables, so clients will likely want to
318 the ``In[n]``, ``Out[n]`` and ``_n`` variables, so clients will likely want to
318 display it in some form to the user, which will typically (but not necessarily)
319 display it in some form to the user, which will typically (but not necessarily)
319 be done in the prompts. The value of this counter will be returned as the
320 be done in the prompts. The value of this counter will be returned as the
320 ``execution_count`` field of all ``execute_reply`` messages.
321 ``execution_count`` field of all ``execute_reply`` messages.
321
322
322 .. _execution_results:
323 .. _execution_results:
323
324
324 Execution results
325 Execution results
325 ~~~~~~~~~~~~~~~~~
326 ~~~~~~~~~~~~~~~~~
326
327
327 Message type: ``execute_reply``::
328 Message type: ``execute_reply``::
328
329
329 content = {
330 content = {
330 # One of: 'ok' OR 'error' OR 'abort'
331 # One of: 'ok' OR 'error' OR 'abort'
331 'status' : str,
332 'status' : str,
332
333
333 # The global kernel counter that increases by one with each request that
334 # The global kernel counter that increases by one with each request that
334 # stores history. This will typically be used by clients to display
335 # stores history. This will typically be used by clients to display
335 # prompt numbers to the user. If the request did not store history, this will
336 # prompt numbers to the user. If the request did not store history, this will
336 # be the current value of the counter in the kernel.
337 # be the current value of the counter in the kernel.
337 'execution_count' : int,
338 'execution_count' : int,
338 }
339 }
339
340
340 When status is 'ok', the following extra fields are present::
341 When status is 'ok', the following extra fields are present::
341
342
342 {
343 {
343 # 'payload' will be a list of payload dicts.
344 # 'payload' will be a list of payload dicts.
344 # Each execution payload is a dict with string keys that may have been
345 # Each execution payload is a dict with string keys that may have been
345 # produced by the code being executed. It is retrieved by the kernel at
346 # produced by the code being executed. It is retrieved by the kernel at
346 # the end of the execution and sent back to the front end, which can take
347 # the end of the execution and sent back to the front end, which can take
347 # action on it as needed. See main text for further details.
348 # action on it as needed. See main text for further details.
348 'payload' : list(dict),
349 'payload' : list(dict),
349
350
350 # Results for the user_variables and user_expressions.
351 # Results for the user_variables and user_expressions.
351 'user_variables' : dict,
352 'user_variables' : dict,
352 'user_expressions' : dict,
353 'user_expressions' : dict,
353 }
354 }
354
355
355 .. admonition:: Execution payloads
356 .. admonition:: Execution payloads
356
357
357 The notion of an 'execution payload' is different from a return value of a
358 The notion of an 'execution payload' is different from a return value of a
358 given set of code, which normally is just displayed on the pyout stream
359 given set of code, which normally is just displayed on the pyout stream
359 through the PUB socket. The idea of a payload is to allow special types of
360 through the PUB socket. The idea of a payload is to allow special types of
360 code, typically magics, to populate a data container in the IPython kernel
361 code, typically magics, to populate a data container in the IPython kernel
361 that will be shipped back to the caller via this channel. The kernel
362 that will be shipped back to the caller via this channel. The kernel
362 has an API for this in the PayloadManager::
363 has an API for this in the PayloadManager::
363
364
364 ip.payload_manager.write_payload(payload_dict)
365 ip.payload_manager.write_payload(payload_dict)
365
366
366 which appends a dictionary to the list of payloads.
367 which appends a dictionary to the list of payloads.
367
368
368
369
369 When status is 'error', the following extra fields are present::
370 When status is 'error', the following extra fields are present::
370
371
371 {
372 {
372 'ename' : str, # Exception name, as a string
373 'ename' : str, # Exception name, as a string
373 'evalue' : str, # Exception value, as a string
374 'evalue' : str, # Exception value, as a string
374
375
375 # The traceback will contain a list of frames, represented each as a
376 # The traceback will contain a list of frames, represented each as a
376 # string. For now we'll stick to the existing design of ultraTB, which
377 # string. For now we'll stick to the existing design of ultraTB, which
377 # controls exception level of detail statefully. But eventually we'll
378 # controls exception level of detail statefully. But eventually we'll
378 # want to grow into a model where more information is collected and
379 # want to grow into a model where more information is collected and
379 # packed into the traceback object, with clients deciding how little or
380 # packed into the traceback object, with clients deciding how little or
380 # how much of it to unpack. But for now, let's start with a simple list
381 # how much of it to unpack. But for now, let's start with a simple list
381 # of strings, since that requires only minimal changes to ultratb as
382 # of strings, since that requires only minimal changes to ultratb as
382 # written.
383 # written.
383 'traceback' : list,
384 'traceback' : list,
384 }
385 }
385
386
386
387
387 When status is 'abort', there are for now no additional data fields. This
388 When status is 'abort', there are for now no additional data fields. This
388 happens when the kernel was interrupted by a signal.
389 happens when the kernel was interrupted by a signal.
389
390
390 Kernel attribute access
391 Kernel attribute access
391 -----------------------
392 -----------------------
392
393
393 .. warning::
394 .. warning::
394
395
395 This part of the messaging spec is not actually implemented in the kernel
396 This part of the messaging spec is not actually implemented in the kernel
396 yet.
397 yet.
397
398
398 While this protocol does not specify full RPC access to arbitrary methods of
399 While this protocol does not specify full RPC access to arbitrary methods of
399 the kernel object, the kernel does allow read (and in some cases write) access
400 the kernel object, the kernel does allow read (and in some cases write) access
400 to certain attributes.
401 to certain attributes.
401
402
402 The policy for which attributes can be read is: any attribute of the kernel, or
403 The policy for which attributes can be read is: any attribute of the kernel, or
403 its sub-objects, that belongs to a :class:`Configurable` object and has been
404 its sub-objects, that belongs to a :class:`Configurable` object and has been
404 declared at the class-level with Traits validation, is in principle accessible
405 declared at the class-level with Traits validation, is in principle accessible
405 as long as its name does not begin with a leading underscore. The attribute
406 as long as its name does not begin with a leading underscore. The attribute
406 itself will have metadata indicating whether it allows remote read and/or write
407 itself will have metadata indicating whether it allows remote read and/or write
407 access. The message spec follows for attribute read and write requests.
408 access. The message spec follows for attribute read and write requests.
408
409
409 Message type: ``getattr_request``::
410 Message type: ``getattr_request``::
410
411
411 content = {
412 content = {
412 # The (possibly dotted) name of the attribute
413 # The (possibly dotted) name of the attribute
413 'name' : str,
414 'name' : str,
414 }
415 }
415
416
416 When a ``getattr_request`` fails, there are two possible error types:
417 When a ``getattr_request`` fails, there are two possible error types:
417
418
418 - AttributeError: this type of error was raised when trying to access the
419 - AttributeError: this type of error was raised when trying to access the
419 given name by the kernel itself. This means that the attribute likely
420 given name by the kernel itself. This means that the attribute likely
420 doesn't exist.
421 doesn't exist.
421
422
422 - AccessError: the attribute exists but its value is not readable remotely.
423 - AccessError: the attribute exists but its value is not readable remotely.
423
424
424
425
425 Message type: ``getattr_reply``::
426 Message type: ``getattr_reply``::
426
427
427 content = {
428 content = {
428 # One of ['ok', 'AttributeError', 'AccessError'].
429 # One of ['ok', 'AttributeError', 'AccessError'].
429 'status' : str,
430 'status' : str,
430 # If status is 'ok', a JSON object.
431 # If status is 'ok', a JSON object.
431 'value' : object,
432 'value' : object,
432 }
433 }
433
434
434 Message type: ``setattr_request``::
435 Message type: ``setattr_request``::
435
436
436 content = {
437 content = {
437 # The (possibly dotted) name of the attribute
438 # The (possibly dotted) name of the attribute
438 'name' : str,
439 'name' : str,
439
440
440 # A JSON-encoded object, that will be validated by the Traits
441 # A JSON-encoded object, that will be validated by the Traits
441 # information in the kernel
442 # information in the kernel
442 'value' : object,
443 'value' : object,
443 }
444 }
444
445
445 When a ``setattr_request`` fails, there are also two possible error types with
446 When a ``setattr_request`` fails, there are also two possible error types with
446 similar meanings as those of the ``getattr_request`` case, but for writing.
447 similar meanings as those of the ``getattr_request`` case, but for writing.
447
448
448 Message type: ``setattr_reply``::
449 Message type: ``setattr_reply``::
449
450
450 content = {
451 content = {
451 # One of ['ok', 'AttributeError', 'AccessError'].
452 # One of ['ok', 'AttributeError', 'AccessError'].
452 'status' : str,
453 'status' : str,
453 }
454 }
454
455
455
456
456
457
457 Object information
458 Object information
458 ------------------
459 ------------------
459
460
460 One of IPython's most used capabilities is the introspection of Python objects
461 One of IPython's most used capabilities is the introspection of Python objects
461 in the user's namespace, typically invoked via the ``?`` and ``??`` characters
462 in the user's namespace, typically invoked via the ``?`` and ``??`` characters
462 (which in reality are shorthands for the ``%pinfo`` magic). This is used often
463 (which in reality are shorthands for the ``%pinfo`` magic). This is used often
463 enough that it warrants an explicit message type, especially because frontends
464 enough that it warrants an explicit message type, especially because frontends
464 may want to get object information in response to user keystrokes (like Tab or
465 may want to get object information in response to user keystrokes (like Tab or
465 F1) besides from the user explicitly typing code like ``x??``.
466 F1) besides from the user explicitly typing code like ``x??``.
466
467
467 Message type: ``object_info_request``::
468 Message type: ``object_info_request``::
468
469
469 content = {
470 content = {
470 # The (possibly dotted) name of the object to be searched in all
471 # The (possibly dotted) name of the object to be searched in all
471 # relevant namespaces
472 # relevant namespaces
472 'name' : str,
473 'name' : str,
473
474
474 # The level of detail desired. The default (0) is equivalent to typing
475 # The level of detail desired. The default (0) is equivalent to typing
475 # 'x?' at the prompt, 1 is equivalent to 'x??'.
476 # 'x?' at the prompt, 1 is equivalent to 'x??'.
476 'detail_level' : int,
477 'detail_level' : int,
477 }
478 }
478
479
479 The returned information will be a dictionary with keys very similar to the
480 The returned information will be a dictionary with keys very similar to the
480 field names that IPython prints at the terminal.
481 field names that IPython prints at the terminal.
481
482
482 Message type: ``object_info_reply``::
483 Message type: ``object_info_reply``::
483
484
484 content = {
485 content = {
485 # The name the object was requested under
486 # The name the object was requested under
486 'name' : str,
487 'name' : str,
487
488
488 # Boolean flag indicating whether the named object was found or not. If
489 # Boolean flag indicating whether the named object was found or not. If
489 # it's false, all other fields will be empty.
490 # it's false, all other fields will be empty.
490 'found' : bool,
491 'found' : bool,
491
492
492 # Flags for magics and system aliases
493 # Flags for magics and system aliases
493 'ismagic' : bool,
494 'ismagic' : bool,
494 'isalias' : bool,
495 'isalias' : bool,
495
496
496 # The name of the namespace where the object was found ('builtin',
497 # The name of the namespace where the object was found ('builtin',
497 # 'magics', 'alias', 'interactive', etc.)
498 # 'magics', 'alias', 'interactive', etc.)
498 'namespace' : str,
499 'namespace' : str,
499
500
500 # The type name will be type.__name__ for normal Python objects, but it
501 # The type name will be type.__name__ for normal Python objects, but it
501 # can also be a string like 'Magic function' or 'System alias'
502 # can also be a string like 'Magic function' or 'System alias'
502 'type_name' : str,
503 'type_name' : str,
503
504
504 # The string form of the object, possibly truncated for length if
505 # The string form of the object, possibly truncated for length if
505 # detail_level is 0
506 # detail_level is 0
506 'string_form' : str,
507 'string_form' : str,
507
508
508 # For objects with a __class__ attribute this will be set
509 # For objects with a __class__ attribute this will be set
509 'base_class' : str,
510 'base_class' : str,
510
511
511 # For objects with a __len__ attribute this will be set
512 # For objects with a __len__ attribute this will be set
512 'length' : int,
513 'length' : int,
513
514
514 # If the object is a function, class or method whose file we can find,
515 # If the object is a function, class or method whose file we can find,
515 # we give its full path
516 # we give its full path
516 'file' : str,
517 'file' : str,
517
518
518 # For pure Python callable objects, we can reconstruct the object
519 # For pure Python callable objects, we can reconstruct the object
519 # definition line which provides its call signature. For convenience this
520 # definition line which provides its call signature. For convenience this
520 # is returned as a single 'definition' field, but below the raw parts that
521 # is returned as a single 'definition' field, but below the raw parts that
521 # compose it are also returned as the argspec field.
522 # compose it are also returned as the argspec field.
522 'definition' : str,
523 'definition' : str,
523
524
524 # The individual parts that together form the definition string. Clients
525 # The individual parts that together form the definition string. Clients
525 # with rich display capabilities may use this to provide a richer and more
526 # with rich display capabilities may use this to provide a richer and more
526 # precise representation of the definition line (e.g. by highlighting
527 # precise representation of the definition line (e.g. by highlighting
527 # arguments based on the user's cursor position). For non-callable
528 # arguments based on the user's cursor position). For non-callable
528 # objects, this field is empty.
529 # objects, this field is empty.
529 'argspec' : { # The names of all the arguments
530 'argspec' : { # The names of all the arguments
530 args : list,
531 args : list,
531 # The name of the varargs (*args), if any
532 # The name of the varargs (*args), if any
532 varargs : str,
533 varargs : str,
533 # The name of the varkw (**kw), if any
534 # The name of the varkw (**kw), if any
534 varkw : str,
535 varkw : str,
535 # The values (as strings) of all default arguments. Note
536 # The values (as strings) of all default arguments. Note
536 # that these must be matched *in reverse* with the 'args'
537 # that these must be matched *in reverse* with the 'args'
537 # list above, since the first positional args have no default
538 # list above, since the first positional args have no default
538 # value at all.
539 # value at all.
539 defaults : list,
540 defaults : list,
540 },
541 },
541
542
542 # For instances, provide the constructor signature (the definition of
543 # For instances, provide the constructor signature (the definition of
543 # the __init__ method):
544 # the __init__ method):
544 'init_definition' : str,
545 'init_definition' : str,
545
546
546 # Docstrings: for any object (function, method, module, package) with a
547 # Docstrings: for any object (function, method, module, package) with a
547 # docstring, we show it. But in addition, we may provide additional
548 # docstring, we show it. But in addition, we may provide additional
548 # docstrings. For example, for instances we will show the constructor
549 # docstrings. For example, for instances we will show the constructor
549 # and class docstrings as well, if available.
550 # and class docstrings as well, if available.
550 'docstring' : str,
551 'docstring' : str,
551
552
552 # For instances, provide the constructor and class docstrings
553 # For instances, provide the constructor and class docstrings
553 'init_docstring' : str,
554 'init_docstring' : str,
554 'class_docstring' : str,
555 'class_docstring' : str,
555
556
556 # If it's a callable object whose call method has a separate docstring and
557 # If it's a callable object whose call method has a separate docstring and
557 # definition line:
558 # definition line:
558 'call_def' : str,
559 'call_def' : str,
559 'call_docstring' : str,
560 'call_docstring' : str,
560
561
561 # If detail_level was 1, we also try to find the source code that
562 # If detail_level was 1, we also try to find the source code that
562 # defines the object, if possible. The string 'None' will indicate
563 # defines the object, if possible. The string 'None' will indicate
563 # that no source was found.
564 # that no source was found.
564 'source' : str,
565 'source' : str,
565 }
566 }
566
567
567
568
568 Complete
569 Complete
569 --------
570 --------
570
571
571 Message type: ``complete_request``::
572 Message type: ``complete_request``::
572
573
573 content = {
574 content = {
574 # The text to be completed, such as 'a.is'
575 # The text to be completed, such as 'a.is'
575 'text' : str,
576 'text' : str,
576
577
577 # The full line, such as 'print a.is'. This allows completers to
578 # The full line, such as 'print a.is'. This allows completers to
578 # make decisions that may require information about more than just the
579 # make decisions that may require information about more than just the
579 # current word.
580 # current word.
580 'line' : str,
581 'line' : str,
581
582
582 # The entire block of text where the line is. This may be useful in the
583 # The entire block of text where the line is. This may be useful in the
583 # case of multiline completions where more context may be needed. Note: if
584 # case of multiline completions where more context may be needed. Note: if
584 # in practice this field proves unnecessary, remove it to lighten the
585 # in practice this field proves unnecessary, remove it to lighten the
585 # messages.
586 # messages.
586
587
587 'block' : str,
588 'block' : str,
588
589
589 # The position of the cursor where the user hit 'TAB' on the line.
590 # The position of the cursor where the user hit 'TAB' on the line.
590 'cursor_pos' : int,
591 'cursor_pos' : int,
591 }
592 }
592
593
593 Message type: ``complete_reply``::
594 Message type: ``complete_reply``::
594
595
595 content = {
596 content = {
596 # The list of all matches to the completion request, such as
597 # The list of all matches to the completion request, such as
597 # ['a.isalnum', 'a.isalpha'] for the above example.
598 # ['a.isalnum', 'a.isalpha'] for the above example.
598 'matches' : list
599 'matches' : list
599 }
600 }
600
601
601
602
602 History
603 History
603 -------
604 -------
604
605
605 For clients to explicitly request history from a kernel. The kernel has all
606 For clients to explicitly request history from a kernel. The kernel has all
606 the actual execution history stored in a single location, so clients can
607 the actual execution history stored in a single location, so clients can
607 request it from the kernel when needed.
608 request it from the kernel when needed.
608
609
609 Message type: ``history_request``::
610 Message type: ``history_request``::
610
611
611 content = {
612 content = {
612
613
613 # If True, also return output history in the resulting dict.
614 # If True, also return output history in the resulting dict.
614 'output' : bool,
615 'output' : bool,
615
616
616 # If True, return the raw input history, else the transformed input.
617 # If True, return the raw input history, else the transformed input.
617 'raw' : bool,
618 'raw' : bool,
618
619
619 # So far, this can be 'range', 'tail' or 'search'.
620 # So far, this can be 'range', 'tail' or 'search'.
620 'hist_access_type' : str,
621 'hist_access_type' : str,
621
622
622 # If hist_access_type is 'range', get a range of input cells. session can
623 # If hist_access_type is 'range', get a range of input cells. session can
623 # be a positive session number, or a negative number to count back from
624 # be a positive session number, or a negative number to count back from
624 # the current session.
625 # the current session.
625 'session' : int,
626 'session' : int,
626 # start and stop are line numbers within that session.
627 # start and stop are line numbers within that session.
627 'start' : int,
628 'start' : int,
628 'stop' : int,
629 'stop' : int,
629
630
630 # If hist_access_type is 'tail' or 'search', get the last n cells.
631 # If hist_access_type is 'tail' or 'search', get the last n cells.
631 'n' : int,
632 'n' : int,
632
633
633 # If hist_access_type is 'search', get cells matching the specified glob
634 # If hist_access_type is 'search', get cells matching the specified glob
634 # pattern (with * and ? as wildcards).
635 # pattern (with * and ? as wildcards).
635 'pattern' : str,
636 'pattern' : str,
636
637
637 # If hist_access_type is 'search' and unique is true, do not
638 # If hist_access_type is 'search' and unique is true, do not
638 # include duplicated history. Default is false.
639 # include duplicated history. Default is false.
639 'unique' : bool,
640 'unique' : bool,
640
641
641 }
642 }
642
643
643 .. versionadded:: 4.0
644 .. versionadded:: 4.0
644 The key ``unique`` for ``history_request``.
645 The key ``unique`` for ``history_request``.
645
646
646 Message type: ``history_reply``::
647 Message type: ``history_reply``::
647
648
648 content = {
649 content = {
649 # A list of 3 tuples, either:
650 # A list of 3 tuples, either:
650 # (session, line_number, input) or
651 # (session, line_number, input) or
651 # (session, line_number, (input, output)),
652 # (session, line_number, (input, output)),
652 # depending on whether output was False or True, respectively.
653 # depending on whether output was False or True, respectively.
653 'history' : list,
654 'history' : list,
654 }
655 }
655
656
656
657
657 Connect
658 Connect
658 -------
659 -------
659
660
660 When a client connects to the request/reply socket of the kernel, it can issue
661 When a client connects to the request/reply socket of the kernel, it can issue
661 a connect request to get basic information about the kernel, such as the ports
662 a connect request to get basic information about the kernel, such as the ports
662 the other ZeroMQ sockets are listening on. This allows clients to only have
663 the other ZeroMQ sockets are listening on. This allows clients to only have
663 to know about a single port (the shell channel) to connect to a kernel.
664 to know about a single port (the shell channel) to connect to a kernel.
664
665
665 Message type: ``connect_request``::
666 Message type: ``connect_request``::
666
667
667 content = {
668 content = {
668 }
669 }
669
670
670 Message type: ``connect_reply``::
671 Message type: ``connect_reply``::
671
672
672 content = {
673 content = {
673 'shell_port' : int # The port the shell ROUTER socket is listening on.
674 'shell_port' : int # The port the shell ROUTER socket is listening on.
674 'iopub_port' : int # The port the PUB socket is listening on.
675 'iopub_port' : int # The port the PUB socket is listening on.
675 'stdin_port' : int # The port the stdin ROUTER socket is listening on.
676 'stdin_port' : int # The port the stdin ROUTER socket is listening on.
676 'hb_port' : int # The port the heartbeat socket is listening on.
677 'hb_port' : int # The port the heartbeat socket is listening on.
677 }
678 }
678
679
679
680
680 Kernel info
681 Kernel info
681 -----------
682 -----------
682
683
683 If a client needs to know what protocol the kernel supports, it can
684 If a client needs to know what protocol the kernel supports, it can
684 ask version number of the messaging protocol supported by the kernel.
685 ask version number of the messaging protocol supported by the kernel.
685 This message can be used to fetch other core information of the
686 This message can be used to fetch other core information of the
686 kernel, including language (e.g., Python), language version number and
687 kernel, including language (e.g., Python), language version number and
687 IPython version number.
688 IPython version number.
688
689
689 Message type: ``kernel_info_request``::
690 Message type: ``kernel_info_request``::
690
691
691 content = {
692 content = {
692 }
693 }
693
694
694 Message type: ``kernel_info_reply``::
695 Message type: ``kernel_info_reply``::
695
696
696 content = {
697 content = {
697 # Version of messaging protocol (mandatory).
698 # Version of messaging protocol (mandatory).
698 # The first integer indicates major version. It is incremented when
699 # The first integer indicates major version. It is incremented when
699 # there is any backward incompatible change.
700 # there is any backward incompatible change.
700 # The second integer indicates minor version. It is incremented when
701 # The second integer indicates minor version. It is incremented when
701 # there is any backward compatible change.
702 # there is any backward compatible change.
702 'protocol_version': [int, int],
703 'protocol_version': [int, int],
703
704
704 # IPython version number (optional).
705 # IPython version number (optional).
705 # Non-python kernel backend may not have this version number.
706 # Non-python kernel backend may not have this version number.
706 # The last component is an extra field, which may be 'dev' or
707 # The last component is an extra field, which may be 'dev' or
707 # 'rc1' in development version. It is an empty string for
708 # 'rc1' in development version. It is an empty string for
708 # released version.
709 # released version.
709 'ipython_version': [int, int, int, str],
710 'ipython_version': [int, int, int, str],
710
711
711 # Language version number (mandatory).
712 # Language version number (mandatory).
712 # It is Python version number (e.g., [2, 7, 3]) for the kernel
713 # It is Python version number (e.g., [2, 7, 3]) for the kernel
713 # included in IPython.
714 # included in IPython.
714 'language_version': [int, ...],
715 'language_version': [int, ...],
715
716
716 # Programming language in which kernel is implemented (mandatory).
717 # Programming language in which kernel is implemented (mandatory).
717 # Kernel included in IPython returns 'python'.
718 # Kernel included in IPython returns 'python'.
718 'language': str,
719 'language': str,
719 }
720 }
720
721
721
722
722 Kernel shutdown
723 Kernel shutdown
723 ---------------
724 ---------------
724
725
725 The clients can request the kernel to shut itself down; this is used in
726 The clients can request the kernel to shut itself down; this is used in
726 multiple cases:
727 multiple cases:
727
728
728 - when the user chooses to close the client application via a menu or window
729 - when the user chooses to close the client application via a menu or window
729 control.
730 control.
730 - when the user types 'exit' or 'quit' (or their uppercase magic equivalents).
731 - when the user types 'exit' or 'quit' (or their uppercase magic equivalents).
731 - when the user chooses a GUI method (like the 'Ctrl-C' shortcut in the
732 - when the user chooses a GUI method (like the 'Ctrl-C' shortcut in the
732 IPythonQt client) to force a kernel restart to get a clean kernel without
733 IPythonQt client) to force a kernel restart to get a clean kernel without
733 losing client-side state like history or inlined figures.
734 losing client-side state like history or inlined figures.
734
735
735 The client sends a shutdown request to the kernel, and once it receives the
736 The client sends a shutdown request to the kernel, and once it receives the
736 reply message (which is otherwise empty), it can assume that the kernel has
737 reply message (which is otherwise empty), it can assume that the kernel has
737 completed shutdown safely.
738 completed shutdown safely.
738
739
739 Upon their own shutdown, client applications will typically execute a last
740 Upon their own shutdown, client applications will typically execute a last
740 minute sanity check and forcefully terminate any kernel that is still alive, to
741 minute sanity check and forcefully terminate any kernel that is still alive, to
741 avoid leaving stray processes in the user's machine.
742 avoid leaving stray processes in the user's machine.
742
743
743 For both shutdown request and reply, there is no actual content that needs to
744 For both shutdown request and reply, there is no actual content that needs to
744 be sent, so the content dict is empty.
745 be sent, so the content dict is empty.
745
746
746 Message type: ``shutdown_request``::
747 Message type: ``shutdown_request``::
747
748
748 content = {
749 content = {
749 'restart' : bool # whether the shutdown is final, or precedes a restart
750 'restart' : bool # whether the shutdown is final, or precedes a restart
750 }
751 }
751
752
752 Message type: ``shutdown_reply``::
753 Message type: ``shutdown_reply``::
753
754
754 content = {
755 content = {
755 'restart' : bool # whether the shutdown is final, or precedes a restart
756 'restart' : bool # whether the shutdown is final, or precedes a restart
756 }
757 }
757
758
758 .. Note::
759 .. Note::
759
760
760 When the clients detect a dead kernel thanks to inactivity on the heartbeat
761 When the clients detect a dead kernel thanks to inactivity on the heartbeat
761 socket, they simply send a forceful process termination signal, since a dead
762 socket, they simply send a forceful process termination signal, since a dead
762 process is unlikely to respond in any useful way to messages.
763 process is unlikely to respond in any useful way to messages.
763
764
764
765
765 Messages on the PUB/SUB socket
766 Messages on the PUB/SUB socket
766 ==============================
767 ==============================
767
768
768 Streams (stdout, stderr, etc)
769 Streams (stdout, stderr, etc)
769 ------------------------------
770 ------------------------------
770
771
771 Message type: ``stream``::
772 Message type: ``stream``::
772
773
773 content = {
774 content = {
774 # The name of the stream is one of 'stdin', 'stdout', 'stderr'
775 # The name of the stream is one of 'stdin', 'stdout', 'stderr'
775 'name' : str,
776 'name' : str,
776
777
777 # The data is an arbitrary string to be written to that stream
778 # The data is an arbitrary string to be written to that stream
778 'data' : str,
779 'data' : str,
779 }
780 }
780
781
781 When a kernel receives a raw_input call, it should also broadcast it on the pub
782 When a kernel receives a raw_input call, it should also broadcast it on the pub
782 socket with the names 'stdin' and 'stdin_reply'. This will allow other clients
783 socket with the names 'stdin' and 'stdin_reply'. This will allow other clients
783 to monitor/display kernel interactions and possibly replay them to their user
784 to monitor/display kernel interactions and possibly replay them to their user
784 or otherwise expose them.
785 or otherwise expose them.
785
786
786 Display Data
787 Display Data
787 ------------
788 ------------
788
789
789 This type of message is used to bring back data that should be diplayed (text,
790 This type of message is used to bring back data that should be diplayed (text,
790 html, svg, etc.) in the frontends. This data is published to all frontends.
791 html, svg, etc.) in the frontends. This data is published to all frontends.
791 Each message can have multiple representations of the data; it is up to the
792 Each message can have multiple representations of the data; it is up to the
792 frontend to decide which to use and how. A single message should contain all
793 frontend to decide which to use and how. A single message should contain all
793 possible representations of the same information. Each representation should
794 possible representations of the same information. Each representation should
794 be a JSON'able data structure, and should be a valid MIME type.
795 be a JSON'able data structure, and should be a valid MIME type.
795
796
796 Some questions remain about this design:
797 Some questions remain about this design:
797
798
798 * Do we use this message type for pyout/displayhook? Probably not, because
799 * Do we use this message type for pyout/displayhook? Probably not, because
799 the displayhook also has to handle the Out prompt display. On the other hand
800 the displayhook also has to handle the Out prompt display. On the other hand
800 we could put that information into the metadata secion.
801 we could put that information into the metadata secion.
801
802
802 Message type: ``display_data``::
803 Message type: ``display_data``::
803
804
804 content = {
805 content = {
805
806
806 # Who create the data
807 # Who create the data
807 'source' : str,
808 'source' : str,
808
809
809 # The data dict contains key/value pairs, where the kids are MIME
810 # The data dict contains key/value pairs, where the kids are MIME
810 # types and the values are the raw data of the representation in that
811 # types and the values are the raw data of the representation in that
811 # format.
812 # format.
812 'data' : dict,
813 'data' : dict,
813
814
814 # Any metadata that describes the data
815 # Any metadata that describes the data
815 'metadata' : dict
816 'metadata' : dict
816 }
817 }
817
818
818
819
819 The ``metadata`` contains any metadata that describes the output.
820 The ``metadata`` contains any metadata that describes the output.
820 Global keys are assumed to apply to the output as a whole.
821 Global keys are assumed to apply to the output as a whole.
821 The ``metadata`` dict can also contain mime-type keys, which will be sub-dictionaries,
822 The ``metadata`` dict can also contain mime-type keys, which will be sub-dictionaries,
822 which are interpreted as applying only to output of that type.
823 which are interpreted as applying only to output of that type.
823 Third parties should put any data they write into a single dict
824 Third parties should put any data they write into a single dict
824 with a reasonably unique name to avoid conflicts.
825 with a reasonably unique name to avoid conflicts.
825
826
826 The only metadata keys currently defined in IPython are the width and height
827 The only metadata keys currently defined in IPython are the width and height
827 of images::
828 of images::
828
829
829 'metadata' : {
830 'metadata' : {
830 'image/png' : {
831 'image/png' : {
831 'width': 640,
832 'width': 640,
832 'height': 480
833 'height': 480
833 }
834 }
834 }
835 }
835
836
836
837
837 Raw Data Publication
838 Raw Data Publication
838 --------------------
839 --------------------
839
840
840 ``display_data`` lets you publish *representations* of data, such as images and html.
841 ``display_data`` lets you publish *representations* of data, such as images and html.
841 This ``data_pub`` message lets you publish *actual raw data*, sent via message buffers.
842 This ``data_pub`` message lets you publish *actual raw data*, sent via message buffers.
842
843
843 data_pub messages are constructed via the :func:`IPython.lib.datapub.publish_data` function:
844 data_pub messages are constructed via the :func:`IPython.lib.datapub.publish_data` function:
844
845
845 .. sourcecode:: python
846 .. sourcecode:: python
846
847
847 from IPython.kernel.zmq.datapub import publish_data
848 from IPython.kernel.zmq.datapub import publish_data
848 ns = dict(x=my_array)
849 ns = dict(x=my_array)
849 publish_data(ns)
850 publish_data(ns)
850
851
851
852
852 Message type: ``data_pub``::
853 Message type: ``data_pub``::
853
854
854 content = {
855 content = {
855 # the keys of the data dict, after it has been unserialized
856 # the keys of the data dict, after it has been unserialized
856 keys = ['a', 'b']
857 keys = ['a', 'b']
857 }
858 }
858 # the namespace dict will be serialized in the message buffers,
859 # the namespace dict will be serialized in the message buffers,
859 # which will have a length of at least one
860 # which will have a length of at least one
860 buffers = ['pdict', ...]
861 buffers = ['pdict', ...]
861
862
862
863
863 The interpretation of a sequence of data_pub messages for a given parent request should be
864 The interpretation of a sequence of data_pub messages for a given parent request should be
864 to update a single namespace with subsequent results.
865 to update a single namespace with subsequent results.
865
866
866 .. note::
867 .. note::
867
868
868 No frontends directly handle data_pub messages at this time.
869 No frontends directly handle data_pub messages at this time.
869 It is currently only used by the client/engines in :mod:`IPython.parallel`,
870 It is currently only used by the client/engines in :mod:`IPython.parallel`,
870 where engines may publish *data* to the Client,
871 where engines may publish *data* to the Client,
871 of which the Client can then publish *representations* via ``display_data``
872 of which the Client can then publish *representations* via ``display_data``
872 to various frontends.
873 to various frontends.
873
874
874 Python inputs
875 Python inputs
875 -------------
876 -------------
876
877
877 These messages are the re-broadcast of the ``execute_request``.
878 These messages are the re-broadcast of the ``execute_request``.
878
879
879 Message type: ``pyin``::
880 Message type: ``pyin``::
880
881
881 content = {
882 content = {
882 'code' : str, # Source code to be executed, one or more lines
883 'code' : str, # Source code to be executed, one or more lines
883
884
884 # The counter for this execution is also provided so that clients can
885 # The counter for this execution is also provided so that clients can
885 # display it, since IPython automatically creates variables called _iN
886 # display it, since IPython automatically creates variables called _iN
886 # (for input prompt In[N]).
887 # (for input prompt In[N]).
887 'execution_count' : int
888 'execution_count' : int
888 }
889 }
889
890
890 Python outputs
891 Python outputs
891 --------------
892 --------------
892
893
893 When Python produces output from code that has been compiled in with the
894 When Python produces output from code that has been compiled in with the
894 'single' flag to :func:`compile`, any expression that produces a value (such as
895 'single' flag to :func:`compile`, any expression that produces a value (such as
895 ``1+1``) is passed to ``sys.displayhook``, which is a callable that can do with
896 ``1+1``) is passed to ``sys.displayhook``, which is a callable that can do with
896 this value whatever it wants. The default behavior of ``sys.displayhook`` in
897 this value whatever it wants. The default behavior of ``sys.displayhook`` in
897 the Python interactive prompt is to print to ``sys.stdout`` the :func:`repr` of
898 the Python interactive prompt is to print to ``sys.stdout`` the :func:`repr` of
898 the value as long as it is not ``None`` (which isn't printed at all). In our
899 the value as long as it is not ``None`` (which isn't printed at all). In our
899 case, the kernel instantiates as ``sys.displayhook`` an object which has
900 case, the kernel instantiates as ``sys.displayhook`` an object which has
900 similar behavior, but which instead of printing to stdout, broadcasts these
901 similar behavior, but which instead of printing to stdout, broadcasts these
901 values as ``pyout`` messages for clients to display appropriately.
902 values as ``pyout`` messages for clients to display appropriately.
902
903
903 IPython's displayhook can handle multiple simultaneous formats depending on its
904 IPython's displayhook can handle multiple simultaneous formats depending on its
904 configuration. The default pretty-printed repr text is always given with the
905 configuration. The default pretty-printed repr text is always given with the
905 ``data`` entry in this message. Any other formats are provided in the
906 ``data`` entry in this message. Any other formats are provided in the
906 ``extra_formats`` list. Frontends are free to display any or all of these
907 ``extra_formats`` list. Frontends are free to display any or all of these
907 according to its capabilities. ``extra_formats`` list contains 3-tuples of an ID
908 according to its capabilities. ``extra_formats`` list contains 3-tuples of an ID
908 string, a type string, and the data. The ID is unique to the formatter
909 string, a type string, and the data. The ID is unique to the formatter
909 implementation that created the data. Frontends will typically ignore the ID
910 implementation that created the data. Frontends will typically ignore the ID
910 unless if it has requested a particular formatter. The type string tells the
911 unless if it has requested a particular formatter. The type string tells the
911 frontend how to interpret the data. It is often, but not always a MIME type.
912 frontend how to interpret the data. It is often, but not always a MIME type.
912 Frontends should ignore types that it does not understand. The data itself is
913 Frontends should ignore types that it does not understand. The data itself is
913 any JSON object and depends on the format. It is often, but not always a string.
914 any JSON object and depends on the format. It is often, but not always a string.
914
915
915 Message type: ``pyout``::
916 Message type: ``pyout``::
916
917
917 content = {
918 content = {
918
919
919 # The counter for this execution is also provided so that clients can
920 # The counter for this execution is also provided so that clients can
920 # display it, since IPython automatically creates variables called _N
921 # display it, since IPython automatically creates variables called _N
921 # (for prompt N).
922 # (for prompt N).
922 'execution_count' : int,
923 'execution_count' : int,
923
924
924 # The data dict contains key/value pairs, where the kids are MIME
925 # The data dict contains key/value pairs, where the kids are MIME
925 # types and the values are the raw data of the representation in that
926 # types and the values are the raw data of the representation in that
926 # format. The data dict must minimally contain the ``text/plain``
927 # format. The data dict must minimally contain the ``text/plain``
927 # MIME type which is used as a backup representation.
928 # MIME type which is used as a backup representation.
928 'data' : dict,
929 'data' : dict,
929
930
930 }
931 }
931
932
932 Python errors
933 Python errors
933 -------------
934 -------------
934
935
935 When an error occurs during code execution
936 When an error occurs during code execution
936
937
937 Message type: ``pyerr``::
938 Message type: ``pyerr``::
938
939
939 content = {
940 content = {
940 # Similar content to the execute_reply messages for the 'error' case,
941 # Similar content to the execute_reply messages for the 'error' case,
941 # except the 'status' field is omitted.
942 # except the 'status' field is omitted.
942 }
943 }
943
944
944 Kernel status
945 Kernel status
945 -------------
946 -------------
946
947
947 This message type is used by frontends to monitor the status of the kernel.
948 This message type is used by frontends to monitor the status of the kernel.
948
949
949 Message type: ``status``::
950 Message type: ``status``::
950
951
951 content = {
952 content = {
952 # When the kernel starts to execute code, it will enter the 'busy'
953 # When the kernel starts to execute code, it will enter the 'busy'
953 # state and when it finishes, it will enter the 'idle' state.
954 # state and when it finishes, it will enter the 'idle' state.
954 # The kernel will publish state 'starting' exactly once at process startup.
955 # The kernel will publish state 'starting' exactly once at process startup.
955 execution_state : ('busy', 'idle', 'starting')
956 execution_state : ('busy', 'idle', 'starting')
956 }
957 }
957
958
958 Kernel crashes
959 Kernel crashes
959 --------------
960 --------------
960
961
961 When the kernel has an unexpected exception, caught by the last-resort
962 When the kernel has an unexpected exception, caught by the last-resort
962 sys.excepthook, we should broadcast the crash handler's output before exiting.
963 sys.excepthook, we should broadcast the crash handler's output before exiting.
963 This will allow clients to notice that a kernel died, inform the user and
964 This will allow clients to notice that a kernel died, inform the user and
964 propose further actions.
965 propose further actions.
965
966
966 Message type: ``crash``::
967 Message type: ``crash``::
967
968
968 content = {
969 content = {
969 # Similarly to the 'error' case for execute_reply messages, this will
970 # Similarly to the 'error' case for execute_reply messages, this will
970 # contain ename, evalue and traceback fields.
971 # contain ename, evalue and traceback fields.
971
972
972 # An additional field with supplementary information such as where to
973 # An additional field with supplementary information such as where to
973 # send the crash message
974 # send the crash message
974 'info' : str,
975 'info' : str,
975 }
976 }
976
977
977
978
978 Future ideas
979 Future ideas
979 ------------
980 ------------
980
981
981 Other potential message types, currently unimplemented, listed below as ideas.
982 Other potential message types, currently unimplemented, listed below as ideas.
982
983
983 Message type: ``file``::
984 Message type: ``file``::
984
985
985 content = {
986 content = {
986 'path' : 'cool.jpg',
987 'path' : 'cool.jpg',
987 'mimetype' : str,
988 'mimetype' : str,
988 'data' : str,
989 'data' : str,
989 }
990 }
990
991
991
992
992 Messages on the stdin ROUTER/DEALER sockets
993 Messages on the stdin ROUTER/DEALER sockets
993 ===========================================
994 ===========================================
994
995
995 This is a socket where the request/reply pattern goes in the opposite direction:
996 This is a socket where the request/reply pattern goes in the opposite direction:
996 from the kernel to a *single* frontend, and its purpose is to allow
997 from the kernel to a *single* frontend, and its purpose is to allow
997 ``raw_input`` and similar operations that read from ``sys.stdin`` on the kernel
998 ``raw_input`` and similar operations that read from ``sys.stdin`` on the kernel
998 to be fulfilled by the client. The request should be made to the frontend that
999 to be fulfilled by the client. The request should be made to the frontend that
999 made the execution request that prompted ``raw_input`` to be called. For now we
1000 made the execution request that prompted ``raw_input`` to be called. For now we
1000 will keep these messages as simple as possible, since they only mean to convey
1001 will keep these messages as simple as possible, since they only mean to convey
1001 the ``raw_input(prompt)`` call.
1002 the ``raw_input(prompt)`` call.
1002
1003
1003 Message type: ``input_request``::
1004 Message type: ``input_request``::
1004
1005
1005 content = { 'prompt' : str }
1006 content = { 'prompt' : str }
1006
1007
1007 Message type: ``input_reply``::
1008 Message type: ``input_reply``::
1008
1009
1009 content = { 'value' : str }
1010 content = { 'value' : str }
1010
1011
1011 .. Note::
1012 .. Note::
1012
1013
1013 We do not explicitly try to forward the raw ``sys.stdin`` object, because in
1014 We do not explicitly try to forward the raw ``sys.stdin`` object, because in
1014 practice the kernel should behave like an interactive program. When a
1015 practice the kernel should behave like an interactive program. When a
1015 program is opened on the console, the keyboard effectively takes over the
1016 program is opened on the console, the keyboard effectively takes over the
1016 ``stdin`` file descriptor, and it can't be used for raw reading anymore.
1017 ``stdin`` file descriptor, and it can't be used for raw reading anymore.
1017 Since the IPython kernel effectively behaves like a console program (albeit
1018 Since the IPython kernel effectively behaves like a console program (albeit
1018 one whose "keyboard" is actually living in a separate process and
1019 one whose "keyboard" is actually living in a separate process and
1019 transported over the zmq connection), raw ``stdin`` isn't expected to be
1020 transported over the zmq connection), raw ``stdin`` isn't expected to be
1020 available.
1021 available.
1021
1022
1022
1023
1023 Heartbeat for kernels
1024 Heartbeat for kernels
1024 =====================
1025 =====================
1025
1026
1026 Initially we had considered using messages like those above over ZMQ for a
1027 Initially we had considered using messages like those above over ZMQ for a
1027 kernel 'heartbeat' (a way to detect quickly and reliably whether a kernel is
1028 kernel 'heartbeat' (a way to detect quickly and reliably whether a kernel is
1028 alive at all, even if it may be busy executing user code). But this has the
1029 alive at all, even if it may be busy executing user code). But this has the
1029 problem that if the kernel is locked inside extension code, it wouldn't execute
1030 problem that if the kernel is locked inside extension code, it wouldn't execute
1030 the python heartbeat code. But it turns out that we can implement a basic
1031 the python heartbeat code. But it turns out that we can implement a basic
1031 heartbeat with pure ZMQ, without using any Python messaging at all.
1032 heartbeat with pure ZMQ, without using any Python messaging at all.
1032
1033
1033 The monitor sends out a single zmq message (right now, it is a str of the
1034 The monitor sends out a single zmq message (right now, it is a str of the
1034 monitor's lifetime in seconds), and gets the same message right back, prefixed
1035 monitor's lifetime in seconds), and gets the same message right back, prefixed
1035 with the zmq identity of the DEALER socket in the heartbeat process. This can be
1036 with the zmq identity of the DEALER socket in the heartbeat process. This can be
1036 a uuid, or even a full message, but there doesn't seem to be a need for packing
1037 a uuid, or even a full message, but there doesn't seem to be a need for packing
1037 up a message when the sender and receiver are the exact same Python object.
1038 up a message when the sender and receiver are the exact same Python object.
1038
1039
1039 The model is this::
1040 The model is this::
1040
1041
1041 monitor.send(str(self.lifetime)) # '1.2345678910'
1042 monitor.send(str(self.lifetime)) # '1.2345678910'
1042
1043
1043 and the monitor receives some number of messages of the form::
1044 and the monitor receives some number of messages of the form::
1044
1045
1045 ['uuid-abcd-dead-beef', '1.2345678910']
1046 ['uuid-abcd-dead-beef', '1.2345678910']
1046
1047
1047 where the first part is the zmq.IDENTITY of the heart's DEALER on the engine, and
1048 where the first part is the zmq.IDENTITY of the heart's DEALER on the engine, and
1048 the rest is the message sent by the monitor. No Python code ever has any
1049 the rest is the message sent by the monitor. No Python code ever has any
1049 access to the message between the monitor's send, and the monitor's recv.
1050 access to the message between the monitor's send, and the monitor's recv.
1050
1051
1051
1052
1052 ToDo
1053 ToDo
1053 ====
1054 ====
1054
1055
1055 Missing things include:
1056 Missing things include:
1056
1057
1057 * Important: finish thinking through the payload concept and API.
1058 * Important: finish thinking through the payload concept and API.
1058
1059
1059 * Important: ensure that we have a good solution for magics like %edit. It's
1060 * Important: ensure that we have a good solution for magics like %edit. It's
1060 likely that with the payload concept we can build a full solution, but not
1061 likely that with the payload concept we can build a full solution, but not
1061 100% clear yet.
1062 100% clear yet.
1062
1063
1063 * Finishing the details of the heartbeat protocol.
1064 * Finishing the details of the heartbeat protocol.
1064
1065
1065 * Signal handling: specify what kind of information kernel should broadcast (or
1066 * Signal handling: specify what kind of information kernel should broadcast (or
1066 not) when it receives signals.
1067 not) when it receives signals.
1067
1068
1068 .. include:: ../links.rst
1069 .. include:: ../links.rst
General Comments 0
You need to be logged in to leave comments. Login now