##// END OF EJS Templates
more types, everywhere, and remove some ignored files from mypy. (#14325)
M Bussonnier -
r28644:06d3ec8d merge
parent child Browse files
Show More
@@ -1,374 +1,377 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Implementations for various useful completers.
2 """Implementations for various useful completers.
3
3
4 These are all loaded by default by IPython.
4 These are all loaded by default by IPython.
5 """
5 """
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2010-2011 The IPython Development Team.
7 # Copyright (C) 2010-2011 The IPython Development Team.
8 #
8 #
9 # Distributed under the terms of the BSD License.
9 # Distributed under the terms of the BSD License.
10 #
10 #
11 # The full license is in the file COPYING.txt, distributed with this software.
11 # The full license is in the file COPYING.txt, distributed with this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 # Stdlib imports
18 # Stdlib imports
19 import glob
19 import glob
20 import inspect
20 import inspect
21 import os
21 import os
22 import re
22 import re
23 import sys
23 import sys
24 from importlib import import_module
24 from importlib import import_module
25 from importlib.machinery import all_suffixes
25 from importlib.machinery import all_suffixes
26
26
27
27
28 # Third-party imports
28 # Third-party imports
29 from time import time
29 from time import time
30 from zipimport import zipimporter
30 from zipimport import zipimporter
31
31
32 # Our own imports
32 # Our own imports
33 from .completer import expand_user, compress_user
33 from .completer import expand_user, compress_user
34 from .error import TryNext
34 from .error import TryNext
35 from ..utils._process_common import arg_split
35 from ..utils._process_common import arg_split
36
36
37 # FIXME: this should be pulled in with the right call via the component system
37 # FIXME: this should be pulled in with the right call via the component system
38 from IPython import get_ipython
38 from IPython import get_ipython
39
39
40 from typing import List
40 from typing import List
41
41
42 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
43 # Globals and constants
43 # Globals and constants
44 #-----------------------------------------------------------------------------
44 #-----------------------------------------------------------------------------
45 _suffixes = all_suffixes()
45 _suffixes = all_suffixes()
46
46
47 # Time in seconds after which the rootmodules will be stored permanently in the
47 # Time in seconds after which the rootmodules will be stored permanently in the
48 # ipython ip.db database (kept in the user's .ipython dir).
48 # ipython ip.db database (kept in the user's .ipython dir).
49 TIMEOUT_STORAGE = 2
49 TIMEOUT_STORAGE = 2
50
50
51 # Time in seconds after which we give up
51 # Time in seconds after which we give up
52 TIMEOUT_GIVEUP = 20
52 TIMEOUT_GIVEUP = 20
53
53
54 # Regular expression for the python import statement
54 # Regular expression for the python import statement
55 import_re = re.compile(r'(?P<name>[^\W\d]\w*?)'
55 import_re = re.compile(r'(?P<name>[^\W\d]\w*?)'
56 r'(?P<package>[/\\]__init__)?'
56 r'(?P<package>[/\\]__init__)?'
57 r'(?P<suffix>%s)$' %
57 r'(?P<suffix>%s)$' %
58 r'|'.join(re.escape(s) for s in _suffixes))
58 r'|'.join(re.escape(s) for s in _suffixes))
59
59
60 # RE for the ipython %run command (python + ipython scripts)
60 # RE for the ipython %run command (python + ipython scripts)
61 magic_run_re = re.compile(r'.*(\.ipy|\.ipynb|\.py[w]?)$')
61 magic_run_re = re.compile(r'.*(\.ipy|\.ipynb|\.py[w]?)$')
62
62
63 #-----------------------------------------------------------------------------
63 #-----------------------------------------------------------------------------
64 # Local utilities
64 # Local utilities
65 #-----------------------------------------------------------------------------
65 #-----------------------------------------------------------------------------
66
66
67 def module_list(path):
67
68 def module_list(path: str) -> List[str]:
68 """
69 """
69 Return the list containing the names of the modules available in the given
70 Return the list containing the names of the modules available in the given
70 folder.
71 folder.
71 """
72 """
72 # sys.path has the cwd as an empty string, but isdir/listdir need it as '.'
73 # sys.path has the cwd as an empty string, but isdir/listdir need it as '.'
73 if path == '':
74 if path == '':
74 path = '.'
75 path = '.'
75
76
76 # A few local constants to be used in loops below
77 # A few local constants to be used in loops below
77 pjoin = os.path.join
78 pjoin = os.path.join
78
79
79 if os.path.isdir(path):
80 if os.path.isdir(path):
80 # Build a list of all files in the directory and all files
81 # Build a list of all files in the directory and all files
81 # in its subdirectories. For performance reasons, do not
82 # in its subdirectories. For performance reasons, do not
82 # recurse more than one level into subdirectories.
83 # recurse more than one level into subdirectories.
83 files = []
84 files: List[str] = []
84 for root, dirs, nondirs in os.walk(path, followlinks=True):
85 for root, dirs, nondirs in os.walk(path, followlinks=True):
85 subdir = root[len(path)+1:]
86 subdir = root[len(path)+1:]
86 if subdir:
87 if subdir:
87 files.extend(pjoin(subdir, f) for f in nondirs)
88 files.extend(pjoin(subdir, f) for f in nondirs)
88 dirs[:] = [] # Do not recurse into additional subdirectories.
89 dirs[:] = [] # Do not recurse into additional subdirectories.
89 else:
90 else:
90 files.extend(nondirs)
91 files.extend(nondirs)
91
92
92 else:
93 else:
93 try:
94 try:
94 files = list(zipimporter(path)._files.keys())
95 files = list(zipimporter(path)._files.keys()) # type: ignore
95 except:
96 except Exception:
96 files = []
97 files = []
97
98
98 # Build a list of modules which match the import_re regex.
99 # Build a list of modules which match the import_re regex.
99 modules = []
100 modules = []
100 for f in files:
101 for f in files:
101 m = import_re.match(f)
102 m = import_re.match(f)
102 if m:
103 if m:
103 modules.append(m.group('name'))
104 modules.append(m.group('name'))
104 return list(set(modules))
105 return list(set(modules))
105
106
106
107
107 def get_root_modules():
108 def get_root_modules():
108 """
109 """
109 Returns a list containing the names of all the modules available in the
110 Returns a list containing the names of all the modules available in the
110 folders of the pythonpath.
111 folders of the pythonpath.
111
112
112 ip.db['rootmodules_cache'] maps sys.path entries to list of modules.
113 ip.db['rootmodules_cache'] maps sys.path entries to list of modules.
113 """
114 """
114 ip = get_ipython()
115 ip = get_ipython()
115 if ip is None:
116 if ip is None:
116 # No global shell instance to store cached list of modules.
117 # No global shell instance to store cached list of modules.
117 # Don't try to scan for modules every time.
118 # Don't try to scan for modules every time.
118 return list(sys.builtin_module_names)
119 return list(sys.builtin_module_names)
119
120
120 if getattr(ip.db, "_mock", False):
121 if getattr(ip.db, "_mock", False):
121 rootmodules_cache = {}
122 rootmodules_cache = {}
122 else:
123 else:
123 rootmodules_cache = ip.db.get("rootmodules_cache", {})
124 rootmodules_cache = ip.db.get("rootmodules_cache", {})
124 rootmodules = list(sys.builtin_module_names)
125 rootmodules = list(sys.builtin_module_names)
125 start_time = time()
126 start_time = time()
126 store = False
127 store = False
127 for path in sys.path:
128 for path in sys.path:
128 try:
129 try:
129 modules = rootmodules_cache[path]
130 modules = rootmodules_cache[path]
130 except KeyError:
131 except KeyError:
131 modules = module_list(path)
132 modules = module_list(path)
132 try:
133 try:
133 modules.remove('__init__')
134 modules.remove('__init__')
134 except ValueError:
135 except ValueError:
135 pass
136 pass
136 if path not in ('', '.'): # cwd modules should not be cached
137 if path not in ('', '.'): # cwd modules should not be cached
137 rootmodules_cache[path] = modules
138 rootmodules_cache[path] = modules
138 if time() - start_time > TIMEOUT_STORAGE and not store:
139 if time() - start_time > TIMEOUT_STORAGE and not store:
139 store = True
140 store = True
140 print("\nCaching the list of root modules, please wait!")
141 print("\nCaching the list of root modules, please wait!")
141 print("(This will only be done once - type '%rehashx' to "
142 print("(This will only be done once - type '%rehashx' to "
142 "reset cache!)\n")
143 "reset cache!)\n")
143 sys.stdout.flush()
144 sys.stdout.flush()
144 if time() - start_time > TIMEOUT_GIVEUP:
145 if time() - start_time > TIMEOUT_GIVEUP:
145 print("This is taking too long, we give up.\n")
146 print("This is taking too long, we give up.\n")
146 return []
147 return []
147 rootmodules.extend(modules)
148 rootmodules.extend(modules)
148 if store:
149 if store:
149 ip.db['rootmodules_cache'] = rootmodules_cache
150 ip.db['rootmodules_cache'] = rootmodules_cache
150 rootmodules = list(set(rootmodules))
151 rootmodules = list(set(rootmodules))
151 return rootmodules
152 return rootmodules
152
153
153
154
154 def is_importable(module, attr, only_modules):
155 def is_importable(module, attr, only_modules):
155 if only_modules:
156 if only_modules:
156 return inspect.ismodule(getattr(module, attr))
157 return inspect.ismodule(getattr(module, attr))
157 else:
158 else:
158 return not(attr[:2] == '__' and attr[-2:] == '__')
159 return not(attr[:2] == '__' and attr[-2:] == '__')
159
160
160 def is_possible_submodule(module, attr):
161 def is_possible_submodule(module, attr):
161 try:
162 try:
162 obj = getattr(module, attr)
163 obj = getattr(module, attr)
163 except AttributeError:
164 except AttributeError:
164 # Is possilby an unimported submodule
165 # Is possilby an unimported submodule
165 return True
166 return True
166 except TypeError:
167 except TypeError:
167 # https://github.com/ipython/ipython/issues/9678
168 # https://github.com/ipython/ipython/issues/9678
168 return False
169 return False
169 return inspect.ismodule(obj)
170 return inspect.ismodule(obj)
170
171
171
172
172 def try_import(mod: str, only_modules=False) -> List[str]:
173 def try_import(mod: str, only_modules=False) -> List[str]:
173 """
174 """
174 Try to import given module and return list of potential completions.
175 Try to import given module and return list of potential completions.
175 """
176 """
176 mod = mod.rstrip('.')
177 mod = mod.rstrip('.')
177 try:
178 try:
178 m = import_module(mod)
179 m = import_module(mod)
179 except:
180 except:
180 return []
181 return []
181
182
182 m_is_init = '__init__' in (getattr(m, '__file__', '') or '')
183 m_is_init = '__init__' in (getattr(m, '__file__', '') or '')
183
184
184 completions = []
185 completions = []
185 if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init:
186 if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init:
186 completions.extend( [attr for attr in dir(m) if
187 completions.extend( [attr for attr in dir(m) if
187 is_importable(m, attr, only_modules)])
188 is_importable(m, attr, only_modules)])
188
189
189 m_all = getattr(m, "__all__", [])
190 m_all = getattr(m, "__all__", [])
190 if only_modules:
191 if only_modules:
191 completions.extend(attr for attr in m_all if is_possible_submodule(m, attr))
192 completions.extend(attr for attr in m_all if is_possible_submodule(m, attr))
192 else:
193 else:
193 completions.extend(m_all)
194 completions.extend(m_all)
194
195
195 if m_is_init:
196 if m_is_init:
196 file_ = m.__file__
197 file_ = m.__file__
197 completions.extend(module_list(os.path.dirname(file_)))
198 file_path = os.path.dirname(file_) # type: ignore
199 if file_path is not None:
200 completions.extend(module_list(file_path))
198 completions_set = {c for c in completions if isinstance(c, str)}
201 completions_set = {c for c in completions if isinstance(c, str)}
199 completions_set.discard('__init__')
202 completions_set.discard('__init__')
200 return list(completions_set)
203 return list(completions_set)
201
204
202
205
203 #-----------------------------------------------------------------------------
206 #-----------------------------------------------------------------------------
204 # Completion-related functions.
207 # Completion-related functions.
205 #-----------------------------------------------------------------------------
208 #-----------------------------------------------------------------------------
206
209
207 def quick_completer(cmd, completions):
210 def quick_completer(cmd, completions):
208 r""" Easily create a trivial completer for a command.
211 r""" Easily create a trivial completer for a command.
209
212
210 Takes either a list of completions, or all completions in string (that will
213 Takes either a list of completions, or all completions in string (that will
211 be split on whitespace).
214 be split on whitespace).
212
215
213 Example::
216 Example::
214
217
215 [d:\ipython]|1> import ipy_completers
218 [d:\ipython]|1> import ipy_completers
216 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
219 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
217 [d:\ipython]|3> foo b<TAB>
220 [d:\ipython]|3> foo b<TAB>
218 bar baz
221 bar baz
219 [d:\ipython]|3> foo ba
222 [d:\ipython]|3> foo ba
220 """
223 """
221
224
222 if isinstance(completions, str):
225 if isinstance(completions, str):
223 completions = completions.split()
226 completions = completions.split()
224
227
225 def do_complete(self, event):
228 def do_complete(self, event):
226 return completions
229 return completions
227
230
228 get_ipython().set_hook('complete_command',do_complete, str_key = cmd)
231 get_ipython().set_hook('complete_command',do_complete, str_key = cmd)
229
232
230 def module_completion(line):
233 def module_completion(line):
231 """
234 """
232 Returns a list containing the completion possibilities for an import line.
235 Returns a list containing the completion possibilities for an import line.
233
236
234 The line looks like this :
237 The line looks like this :
235 'import xml.d'
238 'import xml.d'
236 'from xml.dom import'
239 'from xml.dom import'
237 """
240 """
238
241
239 words = line.split(' ')
242 words = line.split(' ')
240 nwords = len(words)
243 nwords = len(words)
241
244
242 # from whatever <tab> -> 'import '
245 # from whatever <tab> -> 'import '
243 if nwords == 3 and words[0] == 'from':
246 if nwords == 3 and words[0] == 'from':
244 return ['import ']
247 return ['import ']
245
248
246 # 'from xy<tab>' or 'import xy<tab>'
249 # 'from xy<tab>' or 'import xy<tab>'
247 if nwords < 3 and (words[0] in {'%aimport', 'import', 'from'}) :
250 if nwords < 3 and (words[0] in {'%aimport', 'import', 'from'}) :
248 if nwords == 1:
251 if nwords == 1:
249 return get_root_modules()
252 return get_root_modules()
250 mod = words[1].split('.')
253 mod = words[1].split('.')
251 if len(mod) < 2:
254 if len(mod) < 2:
252 return get_root_modules()
255 return get_root_modules()
253 completion_list = try_import('.'.join(mod[:-1]), True)
256 completion_list = try_import('.'.join(mod[:-1]), True)
254 return ['.'.join(mod[:-1] + [el]) for el in completion_list]
257 return ['.'.join(mod[:-1] + [el]) for el in completion_list]
255
258
256 # 'from xyz import abc<tab>'
259 # 'from xyz import abc<tab>'
257 if nwords >= 3 and words[0] == 'from':
260 if nwords >= 3 and words[0] == 'from':
258 mod = words[1]
261 mod = words[1]
259 return try_import(mod)
262 return try_import(mod)
260
263
261 #-----------------------------------------------------------------------------
264 #-----------------------------------------------------------------------------
262 # Completers
265 # Completers
263 #-----------------------------------------------------------------------------
266 #-----------------------------------------------------------------------------
264 # These all have the func(self, event) signature to be used as custom
267 # These all have the func(self, event) signature to be used as custom
265 # completers
268 # completers
266
269
267 def module_completer(self,event):
270 def module_completer(self,event):
268 """Give completions after user has typed 'import ...' or 'from ...'"""
271 """Give completions after user has typed 'import ...' or 'from ...'"""
269
272
270 # This works in all versions of python. While 2.5 has
273 # This works in all versions of python. While 2.5 has
271 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
274 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
272 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
275 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
273 # of possibly problematic side effects.
276 # of possibly problematic side effects.
274 # This search the folders in the sys.path for available modules.
277 # This search the folders in the sys.path for available modules.
275
278
276 return module_completion(event.line)
279 return module_completion(event.line)
277
280
278 # FIXME: there's a lot of logic common to the run, cd and builtin file
281 # FIXME: there's a lot of logic common to the run, cd and builtin file
279 # completers, that is currently reimplemented in each.
282 # completers, that is currently reimplemented in each.
280
283
281 def magic_run_completer(self, event):
284 def magic_run_completer(self, event):
282 """Complete files that end in .py or .ipy or .ipynb for the %run command.
285 """Complete files that end in .py or .ipy or .ipynb for the %run command.
283 """
286 """
284 comps = arg_split(event.line, strict=False)
287 comps = arg_split(event.line, strict=False)
285 # relpath should be the current token that we need to complete.
288 # relpath should be the current token that we need to complete.
286 if (len(comps) > 1) and (not event.line.endswith(' ')):
289 if (len(comps) > 1) and (not event.line.endswith(' ')):
287 relpath = comps[-1].strip("'\"")
290 relpath = comps[-1].strip("'\"")
288 else:
291 else:
289 relpath = ''
292 relpath = ''
290
293
291 #print("\nev=", event) # dbg
294 #print("\nev=", event) # dbg
292 #print("rp=", relpath) # dbg
295 #print("rp=", relpath) # dbg
293 #print('comps=', comps) # dbg
296 #print('comps=', comps) # dbg
294
297
295 lglob = glob.glob
298 lglob = glob.glob
296 isdir = os.path.isdir
299 isdir = os.path.isdir
297 relpath, tilde_expand, tilde_val = expand_user(relpath)
300 relpath, tilde_expand, tilde_val = expand_user(relpath)
298
301
299 # Find if the user has already typed the first filename, after which we
302 # Find if the user has already typed the first filename, after which we
300 # should complete on all files, since after the first one other files may
303 # should complete on all files, since after the first one other files may
301 # be arguments to the input script.
304 # be arguments to the input script.
302
305
303 if any(magic_run_re.match(c) for c in comps):
306 if any(magic_run_re.match(c) for c in comps):
304 matches = [f.replace('\\','/') + ('/' if isdir(f) else '')
307 matches = [f.replace('\\','/') + ('/' if isdir(f) else '')
305 for f in lglob(relpath+'*')]
308 for f in lglob(relpath+'*')]
306 else:
309 else:
307 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') if isdir(f)]
310 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') if isdir(f)]
308 pys = [f.replace('\\','/')
311 pys = [f.replace('\\','/')
309 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
312 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
310 lglob(relpath+'*.ipynb') + lglob(relpath + '*.pyw')]
313 lglob(relpath+'*.ipynb') + lglob(relpath + '*.pyw')]
311
314
312 matches = dirs + pys
315 matches = dirs + pys
313
316
314 #print('run comp:', dirs+pys) # dbg
317 #print('run comp:', dirs+pys) # dbg
315 return [compress_user(p, tilde_expand, tilde_val) for p in matches]
318 return [compress_user(p, tilde_expand, tilde_val) for p in matches]
316
319
317
320
318 def cd_completer(self, event):
321 def cd_completer(self, event):
319 """Completer function for cd, which only returns directories."""
322 """Completer function for cd, which only returns directories."""
320 ip = get_ipython()
323 ip = get_ipython()
321 relpath = event.symbol
324 relpath = event.symbol
322
325
323 #print(event) # dbg
326 #print(event) # dbg
324 if event.line.endswith('-b') or ' -b ' in event.line:
327 if event.line.endswith('-b') or ' -b ' in event.line:
325 # return only bookmark completions
328 # return only bookmark completions
326 bkms = self.db.get('bookmarks', None)
329 bkms = self.db.get('bookmarks', None)
327 if bkms:
330 if bkms:
328 return bkms.keys()
331 return bkms.keys()
329 else:
332 else:
330 return []
333 return []
331
334
332 if event.symbol == '-':
335 if event.symbol == '-':
333 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
336 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
334 # jump in directory history by number
337 # jump in directory history by number
335 fmt = '-%0' + width_dh +'d [%s]'
338 fmt = '-%0' + width_dh +'d [%s]'
336 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
339 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
337 if len(ents) > 1:
340 if len(ents) > 1:
338 return ents
341 return ents
339 return []
342 return []
340
343
341 if event.symbol.startswith('--'):
344 if event.symbol.startswith('--'):
342 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
345 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
343
346
344 # Expand ~ in path and normalize directory separators.
347 # Expand ~ in path and normalize directory separators.
345 relpath, tilde_expand, tilde_val = expand_user(relpath)
348 relpath, tilde_expand, tilde_val = expand_user(relpath)
346 relpath = relpath.replace('\\','/')
349 relpath = relpath.replace('\\','/')
347
350
348 found = []
351 found = []
349 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
352 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
350 if os.path.isdir(f)]:
353 if os.path.isdir(f)]:
351 if ' ' in d:
354 if ' ' in d:
352 # we don't want to deal with any of that, complex code
355 # we don't want to deal with any of that, complex code
353 # for this is elsewhere
356 # for this is elsewhere
354 raise TryNext
357 raise TryNext
355
358
356 found.append(d)
359 found.append(d)
357
360
358 if not found:
361 if not found:
359 if os.path.isdir(relpath):
362 if os.path.isdir(relpath):
360 return [compress_user(relpath, tilde_expand, tilde_val)]
363 return [compress_user(relpath, tilde_expand, tilde_val)]
361
364
362 # if no completions so far, try bookmarks
365 # if no completions so far, try bookmarks
363 bks = self.db.get('bookmarks',{})
366 bks = self.db.get('bookmarks',{})
364 bkmatches = [s for s in bks if s.startswith(event.symbol)]
367 bkmatches = [s for s in bks if s.startswith(event.symbol)]
365 if bkmatches:
368 if bkmatches:
366 return bkmatches
369 return bkmatches
367
370
368 raise TryNext
371 raise TryNext
369
372
370 return [compress_user(p, tilde_expand, tilde_val) for p in found]
373 return [compress_user(p, tilde_expand, tilde_val) for p in found]
371
374
372 def reset_completer(self, event):
375 def reset_completer(self, event):
373 "A completer for %reset magic"
376 "A completer for %reset magic"
374 return '-f -s in out array dhist'.split()
377 return '-f -s in out array dhist'.split()
@@ -1,138 +1,149 b''
1 """An interface for publishing rich data to frontends.
1 """An interface for publishing rich data to frontends.
2
2
3 There are two components of the display system:
3 There are two components of the display system:
4
4
5 * Display formatters, which take a Python object and compute the
5 * Display formatters, which take a Python object and compute the
6 representation of the object in various formats (text, HTML, SVG, etc.).
6 representation of the object in various formats (text, HTML, SVG, etc.).
7 * The display publisher that is used to send the representation data to the
7 * The display publisher that is used to send the representation data to the
8 various frontends.
8 various frontends.
9
9
10 This module defines the logic display publishing. The display publisher uses
10 This module defines the logic display publishing. The display publisher uses
11 the ``display_data`` message type that is defined in the IPython messaging
11 the ``display_data`` message type that is defined in the IPython messaging
12 spec.
12 spec.
13 """
13 """
14
14
15 # Copyright (c) IPython Development Team.
15 # Copyright (c) IPython Development Team.
16 # Distributed under the terms of the Modified BSD License.
16 # Distributed under the terms of the Modified BSD License.
17
17
18
18
19 import sys
19 import sys
20
20
21 from traitlets.config.configurable import Configurable
21 from traitlets.config.configurable import Configurable
22 from traitlets import List
22 from traitlets import List
23
23
24 # This used to be defined here - it is imported for backwards compatibility
24 # This used to be defined here - it is imported for backwards compatibility
25 from .display_functions import publish_display_data
25 from .display_functions import publish_display_data
26
26
27 import typing as t
28
27 #-----------------------------------------------------------------------------
29 # -----------------------------------------------------------------------------
28 # Main payload class
30 # Main payload class
29 #-----------------------------------------------------------------------------
31 #-----------------------------------------------------------------------------
30
32
31
33
32 class DisplayPublisher(Configurable):
34 class DisplayPublisher(Configurable):
33 """A traited class that publishes display data to frontends.
35 """A traited class that publishes display data to frontends.
34
36
35 Instances of this class are created by the main IPython object and should
37 Instances of this class are created by the main IPython object and should
36 be accessed there.
38 be accessed there.
37 """
39 """
38
40
39 def __init__(self, shell=None, *args, **kwargs):
41 def __init__(self, shell=None, *args, **kwargs):
40 self.shell = shell
42 self.shell = shell
41 super().__init__(*args, **kwargs)
43 super().__init__(*args, **kwargs)
42
44
43 def _validate_data(self, data, metadata=None):
45 def _validate_data(self, data, metadata=None):
44 """Validate the display data.
46 """Validate the display data.
45
47
46 Parameters
48 Parameters
47 ----------
49 ----------
48 data : dict
50 data : dict
49 The formata data dictionary.
51 The formata data dictionary.
50 metadata : dict
52 metadata : dict
51 Any metadata for the data.
53 Any metadata for the data.
52 """
54 """
53
55
54 if not isinstance(data, dict):
56 if not isinstance(data, dict):
55 raise TypeError('data must be a dict, got: %r' % data)
57 raise TypeError('data must be a dict, got: %r' % data)
56 if metadata is not None:
58 if metadata is not None:
57 if not isinstance(metadata, dict):
59 if not isinstance(metadata, dict):
58 raise TypeError('metadata must be a dict, got: %r' % data)
60 raise TypeError('metadata must be a dict, got: %r' % data)
59
61
60 # use * to indicate transient, update are keyword-only
62 # use * to indicate transient, update are keyword-only
61 def publish(self, data, metadata=None, source=None, *, transient=None, update=False, **kwargs) -> None:
63 def publish(self, data, metadata=None, source=None, *, transient=None, update=False, **kwargs) -> None:
62 """Publish data and metadata to all frontends.
64 """Publish data and metadata to all frontends.
63
65
64 See the ``display_data`` message in the messaging documentation for
66 See the ``display_data`` message in the messaging documentation for
65 more details about this message type.
67 more details about this message type.
66
68
67 The following MIME types are currently implemented:
69 The following MIME types are currently implemented:
68
70
69 * text/plain
71 * text/plain
70 * text/html
72 * text/html
71 * text/markdown
73 * text/markdown
72 * text/latex
74 * text/latex
73 * application/json
75 * application/json
74 * application/javascript
76 * application/javascript
75 * image/png
77 * image/png
76 * image/jpeg
78 * image/jpeg
77 * image/svg+xml
79 * image/svg+xml
78
80
79 Parameters
81 Parameters
80 ----------
82 ----------
81 data : dict
83 data : dict
82 A dictionary having keys that are valid MIME types (like
84 A dictionary having keys that are valid MIME types (like
83 'text/plain' or 'image/svg+xml') and values that are the data for
85 'text/plain' or 'image/svg+xml') and values that are the data for
84 that MIME type. The data itself must be a JSON'able data
86 that MIME type. The data itself must be a JSON'able data
85 structure. Minimally all data should have the 'text/plain' data,
87 structure. Minimally all data should have the 'text/plain' data,
86 which can be displayed by all frontends. If more than the plain
88 which can be displayed by all frontends. If more than the plain
87 text is given, it is up to the frontend to decide which
89 text is given, it is up to the frontend to decide which
88 representation to use.
90 representation to use.
89 metadata : dict
91 metadata : dict
90 A dictionary for metadata related to the data. This can contain
92 A dictionary for metadata related to the data. This can contain
91 arbitrary key, value pairs that frontends can use to interpret
93 arbitrary key, value pairs that frontends can use to interpret
92 the data. Metadata specific to each mime-type can be specified
94 the data. Metadata specific to each mime-type can be specified
93 in the metadata dict with the same mime-type keys as
95 in the metadata dict with the same mime-type keys as
94 the data itself.
96 the data itself.
95 source : str, deprecated
97 source : str, deprecated
96 Unused.
98 Unused.
97 transient : dict, keyword-only
99 transient : dict, keyword-only
98 A dictionary for transient data.
100 A dictionary for transient data.
99 Data in this dictionary should not be persisted as part of saving this output.
101 Data in this dictionary should not be persisted as part of saving this output.
100 Examples include 'display_id'.
102 Examples include 'display_id'.
101 update : bool, keyword-only, default: False
103 update : bool, keyword-only, default: False
102 If True, only update existing outputs with the same display_id,
104 If True, only update existing outputs with the same display_id,
103 rather than creating a new output.
105 rather than creating a new output.
104 """
106 """
105
107
106 handlers = {}
108 handlers: t.Dict = {}
107 if self.shell is not None:
109 if self.shell is not None:
108 handlers = getattr(self.shell, 'mime_renderers', {})
110 handlers = getattr(self.shell, "mime_renderers", {})
109
111
110 for mime, handler in handlers.items():
112 for mime, handler in handlers.items():
111 if mime in data:
113 if mime in data:
112 handler(data[mime], metadata.get(mime, None))
114 handler(data[mime], metadata.get(mime, None))
113 return
115 return
114
116
115 if 'text/plain' in data:
117 if 'text/plain' in data:
116 print(data['text/plain'])
118 print(data['text/plain'])
117
119
118 def clear_output(self, wait=False):
120 def clear_output(self, wait=False):
119 """Clear the output of the cell receiving output."""
121 """Clear the output of the cell receiving output."""
120 print('\033[2K\r', end='')
122 print('\033[2K\r', end='')
121 sys.stdout.flush()
123 sys.stdout.flush()
122 print('\033[2K\r', end='')
124 print('\033[2K\r', end='')
123 sys.stderr.flush()
125 sys.stderr.flush()
124
126
125
127
126 class CapturingDisplayPublisher(DisplayPublisher):
128 class CapturingDisplayPublisher(DisplayPublisher):
127 """A DisplayPublisher that stores"""
129 """A DisplayPublisher that stores"""
128 outputs = List()
129
130
130 def publish(self, data, metadata=None, source=None, *, transient=None, update=False):
131 outputs: List = List()
131 self.outputs.append({'data':data, 'metadata':metadata,
132
132 'transient':transient, 'update':update})
133 def publish(
134 self, data, metadata=None, source=None, *, transient=None, update=False
135 ):
136 self.outputs.append(
137 {
138 "data": data,
139 "metadata": metadata,
140 "transient": transient,
141 "update": update,
142 }
143 )
133
144
134 def clear_output(self, wait=False):
145 def clear_output(self, wait=False):
135 super(CapturingDisplayPublisher, self).clear_output(wait)
146 super(CapturingDisplayPublisher, self).clear_output(wait)
136
147
137 # empty the list, *do not* reassign a new list
148 # empty the list, *do not* reassign a new list
138 self.outputs.clear()
149 self.outputs.clear()
@@ -1,161 +1,156 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 An application for managing IPython history.
3 An application for managing IPython history.
4
4
5 To be invoked as the `ipython history` subcommand.
5 To be invoked as the `ipython history` subcommand.
6 """
6 """
7
7
8 import sqlite3
8 import sqlite3
9 from pathlib import Path
9 from pathlib import Path
10
10
11 from traitlets.config.application import Application
11 from traitlets.config.application import Application
12 from .application import BaseIPythonApplication
12 from .application import BaseIPythonApplication
13 from traitlets import Bool, Int, Dict
13 from traitlets import Bool, Int, Dict
14 from ..utils.io import ask_yes_no
14 from ..utils.io import ask_yes_no
15
15
16 trim_hist_help = """Trim the IPython history database to the last 1000 entries.
16 trim_hist_help = """Trim the IPython history database to the last 1000 entries.
17
17
18 This actually copies the last 1000 entries to a new database, and then replaces
18 This actually copies the last 1000 entries to a new database, and then replaces
19 the old file with the new. Use the `--keep=` argument to specify a number
19 the old file with the new. Use the `--keep=` argument to specify a number
20 other than 1000.
20 other than 1000.
21 """
21 """
22
22
23 clear_hist_help = """Clear the IPython history database, deleting all entries.
23 clear_hist_help = """Clear the IPython history database, deleting all entries.
24
24
25 Because this is a destructive operation, IPython will prompt the user if they
25 Because this is a destructive operation, IPython will prompt the user if they
26 really want to do this. Passing a `-f` flag will force clearing without a
26 really want to do this. Passing a `-f` flag will force clearing without a
27 prompt.
27 prompt.
28
28
29 This is an handy alias to `ipython history trim --keep=0`
29 This is an handy alias to `ipython history trim --keep=0`
30 """
30 """
31
31
32
32
33 class HistoryTrim(BaseIPythonApplication):
33 class HistoryTrim(BaseIPythonApplication):
34 description = trim_hist_help
34 description = trim_hist_help
35
35
36 backup = Bool(False,
36 backup = Bool(False, help="Keep the old history file as history.sqlite.<N>").tag(
37 help="Keep the old history file as history.sqlite.<N>"
37 config=True
38 ).tag(config=True)
38 )
39
39
40 keep = Int(1000,
40 keep = Int(1000, help="Number of recent lines to keep in the database.").tag(
41 help="Number of recent lines to keep in the database."
41 config=True
42 ).tag(config=True)
42 )
43
43
44 flags = Dict(dict(
44 flags = Dict( # type: ignore
45 backup = ({'HistoryTrim' : {'backup' : True}},
45 dict(backup=({"HistoryTrim": {"backup": True}}, backup.help))
46 backup.help
47 )
46 )
48 ))
49
47
50 aliases=Dict(dict(
48 aliases = Dict(dict(keep="HistoryTrim.keep")) # type: ignore
51 keep = 'HistoryTrim.keep'
52 ))
53
49
54 def start(self):
50 def start(self):
55 profile_dir = Path(self.profile_dir.location)
51 profile_dir = Path(self.profile_dir.location)
56 hist_file = profile_dir / "history.sqlite"
52 hist_file = profile_dir / "history.sqlite"
57 con = sqlite3.connect(hist_file)
53 con = sqlite3.connect(hist_file)
58
54
59 # Grab the recent history from the current database.
55 # Grab the recent history from the current database.
60 inputs = list(con.execute('SELECT session, line, source, source_raw FROM '
56 inputs = list(con.execute('SELECT session, line, source, source_raw FROM '
61 'history ORDER BY session DESC, line DESC LIMIT ?', (self.keep+1,)))
57 'history ORDER BY session DESC, line DESC LIMIT ?', (self.keep+1,)))
62 if len(inputs) <= self.keep:
58 if len(inputs) <= self.keep:
63 print("There are already at most %d entries in the history database." % self.keep)
59 print("There are already at most %d entries in the history database." % self.keep)
64 print("Not doing anything. Use --keep= argument to keep fewer entries")
60 print("Not doing anything. Use --keep= argument to keep fewer entries")
65 return
61 return
66
62
67 print("Trimming history to the most recent %d entries." % self.keep)
63 print("Trimming history to the most recent %d entries." % self.keep)
68
64
69 inputs.pop() # Remove the extra element we got to check the length.
65 inputs.pop() # Remove the extra element we got to check the length.
70 inputs.reverse()
66 inputs.reverse()
71 if inputs:
67 if inputs:
72 first_session = inputs[0][0]
68 first_session = inputs[0][0]
73 outputs = list(con.execute('SELECT session, line, output FROM '
69 outputs = list(con.execute('SELECT session, line, output FROM '
74 'output_history WHERE session >= ?', (first_session,)))
70 'output_history WHERE session >= ?', (first_session,)))
75 sessions = list(con.execute('SELECT session, start, end, num_cmds, remark FROM '
71 sessions = list(con.execute('SELECT session, start, end, num_cmds, remark FROM '
76 'sessions WHERE session >= ?', (first_session,)))
72 'sessions WHERE session >= ?', (first_session,)))
77 con.close()
73 con.close()
78
74
79 # Create the new history database.
75 # Create the new history database.
80 new_hist_file = profile_dir / "history.sqlite.new"
76 new_hist_file = profile_dir / "history.sqlite.new"
81 i = 0
77 i = 0
82 while new_hist_file.exists():
78 while new_hist_file.exists():
83 # Make sure we don't interfere with an existing file.
79 # Make sure we don't interfere with an existing file.
84 i += 1
80 i += 1
85 new_hist_file = profile_dir / ("history.sqlite.new" + str(i))
81 new_hist_file = profile_dir / ("history.sqlite.new" + str(i))
86 new_db = sqlite3.connect(new_hist_file)
82 new_db = sqlite3.connect(new_hist_file)
87 new_db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
83 new_db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
88 primary key autoincrement, start timestamp,
84 primary key autoincrement, start timestamp,
89 end timestamp, num_cmds integer, remark text)""")
85 end timestamp, num_cmds integer, remark text)""")
90 new_db.execute("""CREATE TABLE IF NOT EXISTS history
86 new_db.execute("""CREATE TABLE IF NOT EXISTS history
91 (session integer, line integer, source text, source_raw text,
87 (session integer, line integer, source text, source_raw text,
92 PRIMARY KEY (session, line))""")
88 PRIMARY KEY (session, line))""")
93 new_db.execute("""CREATE TABLE IF NOT EXISTS output_history
89 new_db.execute("""CREATE TABLE IF NOT EXISTS output_history
94 (session integer, line integer, output text,
90 (session integer, line integer, output text,
95 PRIMARY KEY (session, line))""")
91 PRIMARY KEY (session, line))""")
96 new_db.commit()
92 new_db.commit()
97
93
98
94
99 if inputs:
95 if inputs:
100 with new_db:
96 with new_db:
101 # Add the recent history into the new database.
97 # Add the recent history into the new database.
102 new_db.executemany('insert into sessions values (?,?,?,?,?)', sessions)
98 new_db.executemany('insert into sessions values (?,?,?,?,?)', sessions)
103 new_db.executemany('insert into history values (?,?,?,?)', inputs)
99 new_db.executemany('insert into history values (?,?,?,?)', inputs)
104 new_db.executemany('insert into output_history values (?,?,?)', outputs)
100 new_db.executemany('insert into output_history values (?,?,?)', outputs)
105 new_db.close()
101 new_db.close()
106
102
107 if self.backup:
103 if self.backup:
108 i = 1
104 i = 1
109 backup_hist_file = profile_dir / ("history.sqlite.old.%d" % i)
105 backup_hist_file = profile_dir / ("history.sqlite.old.%d" % i)
110 while backup_hist_file.exists():
106 while backup_hist_file.exists():
111 i += 1
107 i += 1
112 backup_hist_file = profile_dir / ("history.sqlite.old.%d" % i)
108 backup_hist_file = profile_dir / ("history.sqlite.old.%d" % i)
113 hist_file.rename(backup_hist_file)
109 hist_file.rename(backup_hist_file)
114 print("Backed up longer history file to", backup_hist_file)
110 print("Backed up longer history file to", backup_hist_file)
115 else:
111 else:
116 hist_file.unlink()
112 hist_file.unlink()
117
113
118 new_hist_file.rename(hist_file)
114 new_hist_file.rename(hist_file)
119
115
116
120 class HistoryClear(HistoryTrim):
117 class HistoryClear(HistoryTrim):
121 description = clear_hist_help
118 description = clear_hist_help
122 keep = Int(0,
119 keep = Int(0, help="Number of recent lines to keep in the database.")
123 help="Number of recent lines to keep in the database.")
120
124
121 force = Bool(False, help="Don't prompt user for confirmation").tag(config=True)
125 force = Bool(False,
122
126 help="Don't prompt user for confirmation"
123 flags = Dict( # type: ignore
127 ).tag(config=True)
124 dict(
128
125 force=({"HistoryClear": {"force": True}}, force.help),
129 flags = Dict(dict(
126 f=({"HistoryTrim": {"force": True}}, force.help),
130 force = ({'HistoryClear' : {'force' : True}},
131 force.help),
132 f = ({'HistoryTrim' : {'force' : True}},
133 force.help
134 )
127 )
135 ))
128 )
136 aliases = Dict()
129 aliases = Dict() # type: ignore
137
130
138 def start(self):
131 def start(self):
139 if self.force or ask_yes_no("Really delete all ipython history? ",
132 if self.force or ask_yes_no(
140 default="no", interrupt="no"):
133 "Really delete all ipython history? ", default="no", interrupt="no"
134 ):
141 HistoryTrim.start(self)
135 HistoryTrim.start(self)
142
136
137
143 class HistoryApp(Application):
138 class HistoryApp(Application):
144 name = u'ipython-history'
139 name = "ipython-history"
145 description = "Manage the IPython history database."
140 description = "Manage the IPython history database."
146
141
147 subcommands = Dict(dict(
142 subcommands = Dict(dict(
148 trim = (HistoryTrim, HistoryTrim.description.splitlines()[0]),
143 trim = (HistoryTrim, HistoryTrim.description.splitlines()[0]),
149 clear = (HistoryClear, HistoryClear.description.splitlines()[0]),
144 clear = (HistoryClear, HistoryClear.description.splitlines()[0]),
150 ))
145 ))
151
146
152 def start(self):
147 def start(self):
153 if self.subapp is None:
148 if self.subapp is None:
154 print("No subcommand specified. Must specify one of: %s" % \
149 print("No subcommand specified. Must specify one of: %s" % \
155 (self.subcommands.keys()))
150 (self.subcommands.keys()))
156 print()
151 print()
157 self.print_description()
152 self.print_description()
158 self.print_subcommands()
153 self.print_subcommands()
159 self.exit(1)
154 self.exit(1)
160 else:
155 else:
161 return self.subapp.start()
156 return self.subapp.start()
@@ -1,795 +1,798 b''
1 """DEPRECATED: Input handling and transformation machinery.
1 """DEPRECATED: Input handling and transformation machinery.
2
2
3 This module was deprecated in IPython 7.0, in favour of inputtransformer2.
3 This module was deprecated in IPython 7.0, in favour of inputtransformer2.
4
4
5 The first class in this module, :class:`InputSplitter`, is designed to tell when
5 The first class in this module, :class:`InputSplitter`, is designed to tell when
6 input from a line-oriented frontend is complete and should be executed, and when
6 input from a line-oriented frontend is complete and should be executed, and when
7 the user should be prompted for another line of code instead. The name 'input
7 the user should be prompted for another line of code instead. The name 'input
8 splitter' is largely for historical reasons.
8 splitter' is largely for historical reasons.
9
9
10 A companion, :class:`IPythonInputSplitter`, provides the same functionality but
10 A companion, :class:`IPythonInputSplitter`, provides the same functionality but
11 with full support for the extended IPython syntax (magics, system calls, etc).
11 with full support for the extended IPython syntax (magics, system calls, etc).
12 The code to actually do these transformations is in :mod:`IPython.core.inputtransformer`.
12 The code to actually do these transformations is in :mod:`IPython.core.inputtransformer`.
13 :class:`IPythonInputSplitter` feeds the raw code to the transformers in order
13 :class:`IPythonInputSplitter` feeds the raw code to the transformers in order
14 and stores the results.
14 and stores the results.
15
15
16 For more details, see the class docstrings below.
16 For more details, see the class docstrings below.
17 """
17 """
18 from __future__ import annotations
18
19
19 from warnings import warn
20 from warnings import warn
20
21
21 warn('IPython.core.inputsplitter is deprecated since IPython 7 in favor of `IPython.core.inputtransformer2`',
22 warn('IPython.core.inputsplitter is deprecated since IPython 7 in favor of `IPython.core.inputtransformer2`',
22 DeprecationWarning)
23 DeprecationWarning)
23
24
24 # Copyright (c) IPython Development Team.
25 # Copyright (c) IPython Development Team.
25 # Distributed under the terms of the Modified BSD License.
26 # Distributed under the terms of the Modified BSD License.
26 import ast
27 import ast
27 import codeop
28 import codeop
28 import io
29 import io
29 import re
30 import re
30 import sys
31 import sys
31 import tokenize
32 import tokenize
32 import warnings
33 import warnings
33
34
34 from typing import List, Tuple, Union, Optional
35 from typing import List, Tuple, Union, Optional, TYPE_CHECKING
35 from types import CodeType
36 from types import CodeType
36
37
37 from IPython.core.inputtransformer import (leading_indent,
38 from IPython.core.inputtransformer import (leading_indent,
38 classic_prompt,
39 classic_prompt,
39 ipy_prompt,
40 ipy_prompt,
40 cellmagic,
41 cellmagic,
41 assemble_logical_lines,
42 assemble_logical_lines,
42 help_end,
43 help_end,
43 escaped_commands,
44 escaped_commands,
44 assign_from_magic,
45 assign_from_magic,
45 assign_from_system,
46 assign_from_system,
46 assemble_python_lines,
47 assemble_python_lines,
47 )
48 )
48 from IPython.utils import tokenutil
49 from IPython.utils import tokenutil
49
50
50 # These are available in this module for backwards compatibility.
51 # These are available in this module for backwards compatibility.
51 from IPython.core.inputtransformer import (ESC_SHELL, ESC_SH_CAP, ESC_HELP,
52 from IPython.core.inputtransformer import (ESC_SHELL, ESC_SH_CAP, ESC_HELP,
52 ESC_HELP2, ESC_MAGIC, ESC_MAGIC2,
53 ESC_HELP2, ESC_MAGIC, ESC_MAGIC2,
53 ESC_QUOTE, ESC_QUOTE2, ESC_PAREN, ESC_SEQUENCES)
54 ESC_QUOTE, ESC_QUOTE2, ESC_PAREN, ESC_SEQUENCES)
54
55
56 if TYPE_CHECKING:
57 from typing_extensions import Self
55 #-----------------------------------------------------------------------------
58 #-----------------------------------------------------------------------------
56 # Utilities
59 # Utilities
57 #-----------------------------------------------------------------------------
60 #-----------------------------------------------------------------------------
58
61
59 # FIXME: These are general-purpose utilities that later can be moved to the
62 # FIXME: These are general-purpose utilities that later can be moved to the
60 # general ward. Kept here for now because we're being very strict about test
63 # general ward. Kept here for now because we're being very strict about test
61 # coverage with this code, and this lets us ensure that we keep 100% coverage
64 # coverage with this code, and this lets us ensure that we keep 100% coverage
62 # while developing.
65 # while developing.
63
66
64 # compiled regexps for autoindent management
67 # compiled regexps for autoindent management
65 dedent_re = re.compile('|'.join([
68 dedent_re = re.compile('|'.join([
66 r'^\s+raise(\s.*)?$', # raise statement (+ space + other stuff, maybe)
69 r'^\s+raise(\s.*)?$', # raise statement (+ space + other stuff, maybe)
67 r'^\s+raise\([^\)]*\).*$', # wacky raise with immediate open paren
70 r'^\s+raise\([^\)]*\).*$', # wacky raise with immediate open paren
68 r'^\s+return(\s.*)?$', # normal return (+ space + other stuff, maybe)
71 r'^\s+return(\s.*)?$', # normal return (+ space + other stuff, maybe)
69 r'^\s+return\([^\)]*\).*$', # wacky return with immediate open paren
72 r'^\s+return\([^\)]*\).*$', # wacky return with immediate open paren
70 r'^\s+pass\s*$', # pass (optionally followed by trailing spaces)
73 r'^\s+pass\s*$', # pass (optionally followed by trailing spaces)
71 r'^\s+break\s*$', # break (optionally followed by trailing spaces)
74 r'^\s+break\s*$', # break (optionally followed by trailing spaces)
72 r'^\s+continue\s*$', # continue (optionally followed by trailing spaces)
75 r'^\s+continue\s*$', # continue (optionally followed by trailing spaces)
73 ]))
76 ]))
74 ini_spaces_re = re.compile(r'^([ \t\r\f\v]+)')
77 ini_spaces_re = re.compile(r'^([ \t\r\f\v]+)')
75
78
76 # regexp to match pure comment lines so we don't accidentally insert 'if 1:'
79 # regexp to match pure comment lines so we don't accidentally insert 'if 1:'
77 # before pure comments
80 # before pure comments
78 comment_line_re = re.compile(r'^\s*\#')
81 comment_line_re = re.compile(r'^\s*\#')
79
82
80
83
81 def num_ini_spaces(s):
84 def num_ini_spaces(s):
82 """Return the number of initial spaces in a string.
85 """Return the number of initial spaces in a string.
83
86
84 Note that tabs are counted as a single space. For now, we do *not* support
87 Note that tabs are counted as a single space. For now, we do *not* support
85 mixing of tabs and spaces in the user's input.
88 mixing of tabs and spaces in the user's input.
86
89
87 Parameters
90 Parameters
88 ----------
91 ----------
89 s : string
92 s : string
90
93
91 Returns
94 Returns
92 -------
95 -------
93 n : int
96 n : int
94 """
97 """
95 warnings.warn(
98 warnings.warn(
96 "`num_ini_spaces` is Pending Deprecation since IPython 8.17."
99 "`num_ini_spaces` is Pending Deprecation since IPython 8.17."
97 "It is considered fro removal in in future version. "
100 "It is considered fro removal in in future version. "
98 "Please open an issue if you believe it should be kept.",
101 "Please open an issue if you believe it should be kept.",
99 stacklevel=2,
102 stacklevel=2,
100 category=PendingDeprecationWarning,
103 category=PendingDeprecationWarning,
101 )
104 )
102 ini_spaces = ini_spaces_re.match(s)
105 ini_spaces = ini_spaces_re.match(s)
103 if ini_spaces:
106 if ini_spaces:
104 return ini_spaces.end()
107 return ini_spaces.end()
105 else:
108 else:
106 return 0
109 return 0
107
110
108 # Fake token types for partial_tokenize:
111 # Fake token types for partial_tokenize:
109 INCOMPLETE_STRING = tokenize.N_TOKENS
112 INCOMPLETE_STRING = tokenize.N_TOKENS
110 IN_MULTILINE_STATEMENT = tokenize.N_TOKENS + 1
113 IN_MULTILINE_STATEMENT = tokenize.N_TOKENS + 1
111
114
112 # The 2 classes below have the same API as TokenInfo, but don't try to look up
115 # The 2 classes below have the same API as TokenInfo, but don't try to look up
113 # a token type name that they won't find.
116 # a token type name that they won't find.
114 class IncompleteString:
117 class IncompleteString:
115 type = exact_type = INCOMPLETE_STRING
118 type = exact_type = INCOMPLETE_STRING
116 def __init__(self, s, start, end, line):
119 def __init__(self, s, start, end, line):
117 self.s = s
120 self.s = s
118 self.start = start
121 self.start = start
119 self.end = end
122 self.end = end
120 self.line = line
123 self.line = line
121
124
122 class InMultilineStatement:
125 class InMultilineStatement:
123 type = exact_type = IN_MULTILINE_STATEMENT
126 type = exact_type = IN_MULTILINE_STATEMENT
124 def __init__(self, pos, line):
127 def __init__(self, pos, line):
125 self.s = ''
128 self.s = ''
126 self.start = self.end = pos
129 self.start = self.end = pos
127 self.line = line
130 self.line = line
128
131
129 def partial_tokens(s):
132 def partial_tokens(s):
130 """Iterate over tokens from a possibly-incomplete string of code.
133 """Iterate over tokens from a possibly-incomplete string of code.
131
134
132 This adds two special token types: INCOMPLETE_STRING and
135 This adds two special token types: INCOMPLETE_STRING and
133 IN_MULTILINE_STATEMENT. These can only occur as the last token yielded, and
136 IN_MULTILINE_STATEMENT. These can only occur as the last token yielded, and
134 represent the two main ways for code to be incomplete.
137 represent the two main ways for code to be incomplete.
135 """
138 """
136 readline = io.StringIO(s).readline
139 readline = io.StringIO(s).readline
137 token = tokenize.TokenInfo(tokenize.NEWLINE, '', (1, 0), (1, 0), '')
140 token = tokenize.TokenInfo(tokenize.NEWLINE, '', (1, 0), (1, 0), '')
138 try:
141 try:
139 for token in tokenutil.generate_tokens_catch_errors(readline):
142 for token in tokenutil.generate_tokens_catch_errors(readline):
140 yield token
143 yield token
141 except tokenize.TokenError as e:
144 except tokenize.TokenError as e:
142 # catch EOF error
145 # catch EOF error
143 lines = s.splitlines(keepends=True)
146 lines = s.splitlines(keepends=True)
144 end = len(lines), len(lines[-1])
147 end = len(lines), len(lines[-1])
145 if 'multi-line string' in e.args[0]:
148 if 'multi-line string' in e.args[0]:
146 l, c = start = token.end
149 l, c = start = token.end
147 s = lines[l-1][c:] + ''.join(lines[l:])
150 s = lines[l-1][c:] + ''.join(lines[l:])
148 yield IncompleteString(s, start, end, lines[-1])
151 yield IncompleteString(s, start, end, lines[-1])
149 elif 'multi-line statement' in e.args[0]:
152 elif 'multi-line statement' in e.args[0]:
150 yield InMultilineStatement(end, lines[-1])
153 yield InMultilineStatement(end, lines[-1])
151 else:
154 else:
152 raise
155 raise
153
156
154 def find_next_indent(code) -> int:
157 def find_next_indent(code) -> int:
155 """Find the number of spaces for the next line of indentation"""
158 """Find the number of spaces for the next line of indentation"""
156 tokens = list(partial_tokens(code))
159 tokens = list(partial_tokens(code))
157 if tokens[-1].type == tokenize.ENDMARKER:
160 if tokens[-1].type == tokenize.ENDMARKER:
158 tokens.pop()
161 tokens.pop()
159 if not tokens:
162 if not tokens:
160 return 0
163 return 0
161
164
162 while tokens[-1].type in {
165 while tokens[-1].type in {
163 tokenize.DEDENT,
166 tokenize.DEDENT,
164 tokenize.NEWLINE,
167 tokenize.NEWLINE,
165 tokenize.COMMENT,
168 tokenize.COMMENT,
166 tokenize.ERRORTOKEN,
169 tokenize.ERRORTOKEN,
167 }:
170 }:
168 tokens.pop()
171 tokens.pop()
169
172
170 # Starting in Python 3.12, the tokenize module adds implicit newlines at the end
173 # Starting in Python 3.12, the tokenize module adds implicit newlines at the end
171 # of input. We need to remove those if we're in a multiline statement
174 # of input. We need to remove those if we're in a multiline statement
172 if tokens[-1].type == IN_MULTILINE_STATEMENT:
175 if tokens[-1].type == IN_MULTILINE_STATEMENT:
173 while tokens[-2].type in {tokenize.NL}:
176 while tokens[-2].type in {tokenize.NL}:
174 tokens.pop(-2)
177 tokens.pop(-2)
175
178
176
179
177 if tokens[-1].type == INCOMPLETE_STRING:
180 if tokens[-1].type == INCOMPLETE_STRING:
178 # Inside a multiline string
181 # Inside a multiline string
179 return 0
182 return 0
180
183
181 # Find the indents used before
184 # Find the indents used before
182 prev_indents = [0]
185 prev_indents = [0]
183 def _add_indent(n):
186 def _add_indent(n):
184 if n != prev_indents[-1]:
187 if n != prev_indents[-1]:
185 prev_indents.append(n)
188 prev_indents.append(n)
186
189
187 tokiter = iter(tokens)
190 tokiter = iter(tokens)
188 for tok in tokiter:
191 for tok in tokiter:
189 if tok.type in {tokenize.INDENT, tokenize.DEDENT}:
192 if tok.type in {tokenize.INDENT, tokenize.DEDENT}:
190 _add_indent(tok.end[1])
193 _add_indent(tok.end[1])
191 elif (tok.type == tokenize.NL):
194 elif (tok.type == tokenize.NL):
192 try:
195 try:
193 _add_indent(next(tokiter).start[1])
196 _add_indent(next(tokiter).start[1])
194 except StopIteration:
197 except StopIteration:
195 break
198 break
196
199
197 last_indent = prev_indents.pop()
200 last_indent = prev_indents.pop()
198
201
199 # If we've just opened a multiline statement (e.g. 'a = ['), indent more
202 # If we've just opened a multiline statement (e.g. 'a = ['), indent more
200 if tokens[-1].type == IN_MULTILINE_STATEMENT:
203 if tokens[-1].type == IN_MULTILINE_STATEMENT:
201 if tokens[-2].exact_type in {tokenize.LPAR, tokenize.LSQB, tokenize.LBRACE}:
204 if tokens[-2].exact_type in {tokenize.LPAR, tokenize.LSQB, tokenize.LBRACE}:
202 return last_indent + 4
205 return last_indent + 4
203 return last_indent
206 return last_indent
204
207
205 if tokens[-1].exact_type == tokenize.COLON:
208 if tokens[-1].exact_type == tokenize.COLON:
206 # Line ends with colon - indent
209 # Line ends with colon - indent
207 return last_indent + 4
210 return last_indent + 4
208
211
209 if last_indent:
212 if last_indent:
210 # Examine the last line for dedent cues - statements like return or
213 # Examine the last line for dedent cues - statements like return or
211 # raise which normally end a block of code.
214 # raise which normally end a block of code.
212 last_line_starts = 0
215 last_line_starts = 0
213 for i, tok in enumerate(tokens):
216 for i, tok in enumerate(tokens):
214 if tok.type == tokenize.NEWLINE:
217 if tok.type == tokenize.NEWLINE:
215 last_line_starts = i + 1
218 last_line_starts = i + 1
216
219
217 last_line_tokens = tokens[last_line_starts:]
220 last_line_tokens = tokens[last_line_starts:]
218 names = [t.string for t in last_line_tokens if t.type == tokenize.NAME]
221 names = [t.string for t in last_line_tokens if t.type == tokenize.NAME]
219 if names and names[0] in {'raise', 'return', 'pass', 'break', 'continue'}:
222 if names and names[0] in {'raise', 'return', 'pass', 'break', 'continue'}:
220 # Find the most recent indentation less than the current level
223 # Find the most recent indentation less than the current level
221 for indent in reversed(prev_indents):
224 for indent in reversed(prev_indents):
222 if indent < last_indent:
225 if indent < last_indent:
223 return indent
226 return indent
224
227
225 return last_indent
228 return last_indent
226
229
227
230
228 def last_blank(src):
231 def last_blank(src):
229 """Determine if the input source ends in a blank.
232 """Determine if the input source ends in a blank.
230
233
231 A blank is either a newline or a line consisting of whitespace.
234 A blank is either a newline or a line consisting of whitespace.
232
235
233 Parameters
236 Parameters
234 ----------
237 ----------
235 src : string
238 src : string
236 A single or multiline string.
239 A single or multiline string.
237 """
240 """
238 if not src: return False
241 if not src: return False
239 ll = src.splitlines()[-1]
242 ll = src.splitlines()[-1]
240 return (ll == '') or ll.isspace()
243 return (ll == '') or ll.isspace()
241
244
242
245
243 last_two_blanks_re = re.compile(r'\n\s*\n\s*$', re.MULTILINE)
246 last_two_blanks_re = re.compile(r'\n\s*\n\s*$', re.MULTILINE)
244 last_two_blanks_re2 = re.compile(r'.+\n\s*\n\s+$', re.MULTILINE)
247 last_two_blanks_re2 = re.compile(r'.+\n\s*\n\s+$', re.MULTILINE)
245
248
246 def last_two_blanks(src):
249 def last_two_blanks(src):
247 """Determine if the input source ends in two blanks.
250 """Determine if the input source ends in two blanks.
248
251
249 A blank is either a newline or a line consisting of whitespace.
252 A blank is either a newline or a line consisting of whitespace.
250
253
251 Parameters
254 Parameters
252 ----------
255 ----------
253 src : string
256 src : string
254 A single or multiline string.
257 A single or multiline string.
255 """
258 """
256 if not src: return False
259 if not src: return False
257 # The logic here is tricky: I couldn't get a regexp to work and pass all
260 # The logic here is tricky: I couldn't get a regexp to work and pass all
258 # the tests, so I took a different approach: split the source by lines,
261 # the tests, so I took a different approach: split the source by lines,
259 # grab the last two and prepend '###\n' as a stand-in for whatever was in
262 # grab the last two and prepend '###\n' as a stand-in for whatever was in
260 # the body before the last two lines. Then, with that structure, it's
263 # the body before the last two lines. Then, with that structure, it's
261 # possible to analyze with two regexps. Not the most elegant solution, but
264 # possible to analyze with two regexps. Not the most elegant solution, but
262 # it works. If anyone tries to change this logic, make sure to validate
265 # it works. If anyone tries to change this logic, make sure to validate
263 # the whole test suite first!
266 # the whole test suite first!
264 new_src = '\n'.join(['###\n'] + src.splitlines()[-2:])
267 new_src = '\n'.join(['###\n'] + src.splitlines()[-2:])
265 return (bool(last_two_blanks_re.match(new_src)) or
268 return (bool(last_two_blanks_re.match(new_src)) or
266 bool(last_two_blanks_re2.match(new_src)) )
269 bool(last_two_blanks_re2.match(new_src)) )
267
270
268
271
269 def remove_comments(src):
272 def remove_comments(src):
270 """Remove all comments from input source.
273 """Remove all comments from input source.
271
274
272 Note: comments are NOT recognized inside of strings!
275 Note: comments are NOT recognized inside of strings!
273
276
274 Parameters
277 Parameters
275 ----------
278 ----------
276 src : string
279 src : string
277 A single or multiline input string.
280 A single or multiline input string.
278
281
279 Returns
282 Returns
280 -------
283 -------
281 String with all Python comments removed.
284 String with all Python comments removed.
282 """
285 """
283
286
284 return re.sub('#.*', '', src)
287 return re.sub('#.*', '', src)
285
288
286
289
287 def get_input_encoding():
290 def get_input_encoding():
288 """Return the default standard input encoding.
291 """Return the default standard input encoding.
289
292
290 If sys.stdin has no encoding, 'ascii' is returned."""
293 If sys.stdin has no encoding, 'ascii' is returned."""
291 # There are strange environments for which sys.stdin.encoding is None. We
294 # There are strange environments for which sys.stdin.encoding is None. We
292 # ensure that a valid encoding is returned.
295 # ensure that a valid encoding is returned.
293 encoding = getattr(sys.stdin, 'encoding', None)
296 encoding = getattr(sys.stdin, 'encoding', None)
294 if encoding is None:
297 if encoding is None:
295 encoding = 'ascii'
298 encoding = 'ascii'
296 return encoding
299 return encoding
297
300
298 #-----------------------------------------------------------------------------
301 #-----------------------------------------------------------------------------
299 # Classes and functions for normal Python syntax handling
302 # Classes and functions for normal Python syntax handling
300 #-----------------------------------------------------------------------------
303 #-----------------------------------------------------------------------------
301
304
302 class InputSplitter(object):
305 class InputSplitter(object):
303 r"""An object that can accumulate lines of Python source before execution.
306 r"""An object that can accumulate lines of Python source before execution.
304
307
305 This object is designed to be fed python source line-by-line, using
308 This object is designed to be fed python source line-by-line, using
306 :meth:`push`. It will return on each push whether the currently pushed
309 :meth:`push`. It will return on each push whether the currently pushed
307 code could be executed already. In addition, it provides a method called
310 code could be executed already. In addition, it provides a method called
308 :meth:`push_accepts_more` that can be used to query whether more input
311 :meth:`push_accepts_more` that can be used to query whether more input
309 can be pushed into a single interactive block.
312 can be pushed into a single interactive block.
310
313
311 This is a simple example of how an interactive terminal-based client can use
314 This is a simple example of how an interactive terminal-based client can use
312 this tool::
315 this tool::
313
316
314 isp = InputSplitter()
317 isp = InputSplitter()
315 while isp.push_accepts_more():
318 while isp.push_accepts_more():
316 indent = ' '*isp.indent_spaces
319 indent = ' '*isp.indent_spaces
317 prompt = '>>> ' + indent
320 prompt = '>>> ' + indent
318 line = indent + raw_input(prompt)
321 line = indent + raw_input(prompt)
319 isp.push(line)
322 isp.push(line)
320 print 'Input source was:\n', isp.source_reset(),
323 print 'Input source was:\n', isp.source_reset(),
321 """
324 """
322 # A cache for storing the current indentation
325 # A cache for storing the current indentation
323 # The first value stores the most recently processed source input
326 # The first value stores the most recently processed source input
324 # The second value is the number of spaces for the current indentation
327 # The second value is the number of spaces for the current indentation
325 # If self.source matches the first value, the second value is a valid
328 # If self.source matches the first value, the second value is a valid
326 # current indentation. Otherwise, the cache is invalid and the indentation
329 # current indentation. Otherwise, the cache is invalid and the indentation
327 # must be recalculated.
330 # must be recalculated.
328 _indent_spaces_cache: Union[Tuple[None, None], Tuple[str, int]] = None, None
331 _indent_spaces_cache: Union[Tuple[None, None], Tuple[str, int]] = None, None
329 # String, indicating the default input encoding. It is computed by default
332 # String, indicating the default input encoding. It is computed by default
330 # at initialization time via get_input_encoding(), but it can be reset by a
333 # at initialization time via get_input_encoding(), but it can be reset by a
331 # client with specific knowledge of the encoding.
334 # client with specific knowledge of the encoding.
332 encoding = ''
335 encoding = ''
333 # String where the current full source input is stored, properly encoded.
336 # String where the current full source input is stored, properly encoded.
334 # Reading this attribute is the normal way of querying the currently pushed
337 # Reading this attribute is the normal way of querying the currently pushed
335 # source code, that has been properly encoded.
338 # source code, that has been properly encoded.
336 source: str = ""
339 source: str = ""
337 # Code object corresponding to the current source. It is automatically
340 # Code object corresponding to the current source. It is automatically
338 # synced to the source, so it can be queried at any time to obtain the code
341 # synced to the source, so it can be queried at any time to obtain the code
339 # object; it will be None if the source doesn't compile to valid Python.
342 # object; it will be None if the source doesn't compile to valid Python.
340 code: Optional[CodeType] = None
343 code: Optional[CodeType] = None
341
344
342 # Private attributes
345 # Private attributes
343
346
344 # List with lines of input accumulated so far
347 # List with lines of input accumulated so far
345 _buffer: List[str]
348 _buffer: List[str]
346 # Command compiler
349 # Command compiler
347 _compile: codeop.CommandCompiler
350 _compile: codeop.CommandCompiler
348 # Boolean indicating whether the current block is complete
351 # Boolean indicating whether the current block is complete
349 _is_complete: Optional[bool] = None
352 _is_complete: Optional[bool] = None
350 # Boolean indicating whether the current block has an unrecoverable syntax error
353 # Boolean indicating whether the current block has an unrecoverable syntax error
351 _is_invalid: bool = False
354 _is_invalid: bool = False
352
355
353 def __init__(self) -> None:
356 def __init__(self) -> None:
354 """Create a new InputSplitter instance."""
357 """Create a new InputSplitter instance."""
355 self._buffer = []
358 self._buffer = []
356 self._compile = codeop.CommandCompiler()
359 self._compile = codeop.CommandCompiler()
357 self.encoding = get_input_encoding()
360 self.encoding = get_input_encoding()
358
361
359 def reset(self):
362 def reset(self):
360 """Reset the input buffer and associated state."""
363 """Reset the input buffer and associated state."""
361 self._buffer[:] = []
364 self._buffer[:] = []
362 self.source = ''
365 self.source = ''
363 self.code = None
366 self.code = None
364 self._is_complete = False
367 self._is_complete = False
365 self._is_invalid = False
368 self._is_invalid = False
366
369
367 def source_reset(self):
370 def source_reset(self):
368 """Return the input source and perform a full reset.
371 """Return the input source and perform a full reset.
369 """
372 """
370 out = self.source
373 out = self.source
371 self.reset()
374 self.reset()
372 return out
375 return out
373
376
374 def check_complete(self, source):
377 def check_complete(self, source):
375 """Return whether a block of code is ready to execute, or should be continued
378 """Return whether a block of code is ready to execute, or should be continued
376
379
377 This is a non-stateful API, and will reset the state of this InputSplitter.
380 This is a non-stateful API, and will reset the state of this InputSplitter.
378
381
379 Parameters
382 Parameters
380 ----------
383 ----------
381 source : string
384 source : string
382 Python input code, which can be multiline.
385 Python input code, which can be multiline.
383
386
384 Returns
387 Returns
385 -------
388 -------
386 status : str
389 status : str
387 One of 'complete', 'incomplete', or 'invalid' if source is not a
390 One of 'complete', 'incomplete', or 'invalid' if source is not a
388 prefix of valid code.
391 prefix of valid code.
389 indent_spaces : int or None
392 indent_spaces : int or None
390 The number of spaces by which to indent the next line of code. If
393 The number of spaces by which to indent the next line of code. If
391 status is not 'incomplete', this is None.
394 status is not 'incomplete', this is None.
392 """
395 """
393 self.reset()
396 self.reset()
394 try:
397 try:
395 self.push(source)
398 self.push(source)
396 except SyntaxError:
399 except SyntaxError:
397 # Transformers in IPythonInputSplitter can raise SyntaxError,
400 # Transformers in IPythonInputSplitter can raise SyntaxError,
398 # which push() will not catch.
401 # which push() will not catch.
399 return 'invalid', None
402 return 'invalid', None
400 else:
403 else:
401 if self._is_invalid:
404 if self._is_invalid:
402 return 'invalid', None
405 return 'invalid', None
403 elif self.push_accepts_more():
406 elif self.push_accepts_more():
404 return 'incomplete', self.get_indent_spaces()
407 return 'incomplete', self.get_indent_spaces()
405 else:
408 else:
406 return 'complete', None
409 return 'complete', None
407 finally:
410 finally:
408 self.reset()
411 self.reset()
409
412
410 def push(self, lines:str) -> bool:
413 def push(self, lines:str) -> bool:
411 """Push one or more lines of input.
414 """Push one or more lines of input.
412
415
413 This stores the given lines and returns a status code indicating
416 This stores the given lines and returns a status code indicating
414 whether the code forms a complete Python block or not.
417 whether the code forms a complete Python block or not.
415
418
416 Any exceptions generated in compilation are swallowed, but if an
419 Any exceptions generated in compilation are swallowed, but if an
417 exception was produced, the method returns True.
420 exception was produced, the method returns True.
418
421
419 Parameters
422 Parameters
420 ----------
423 ----------
421 lines : string
424 lines : string
422 One or more lines of Python input.
425 One or more lines of Python input.
423
426
424 Returns
427 Returns
425 -------
428 -------
426 is_complete : boolean
429 is_complete : boolean
427 True if the current input source (the result of the current input
430 True if the current input source (the result of the current input
428 plus prior inputs) forms a complete Python execution block. Note that
431 plus prior inputs) forms a complete Python execution block. Note that
429 this value is also stored as a private attribute (``_is_complete``), so it
432 this value is also stored as a private attribute (``_is_complete``), so it
430 can be queried at any time.
433 can be queried at any time.
431 """
434 """
432 assert isinstance(lines, str)
435 assert isinstance(lines, str)
433 self._store(lines)
436 self._store(lines)
434 source = self.source
437 source = self.source
435
438
436 # Before calling _compile(), reset the code object to None so that if an
439 # Before calling _compile(), reset the code object to None so that if an
437 # exception is raised in compilation, we don't mislead by having
440 # exception is raised in compilation, we don't mislead by having
438 # inconsistent code/source attributes.
441 # inconsistent code/source attributes.
439 self.code, self._is_complete = None, None
442 self.code, self._is_complete = None, None
440 self._is_invalid = False
443 self._is_invalid = False
441
444
442 # Honor termination lines properly
445 # Honor termination lines properly
443 if source.endswith('\\\n'):
446 if source.endswith('\\\n'):
444 return False
447 return False
445
448
446 try:
449 try:
447 with warnings.catch_warnings():
450 with warnings.catch_warnings():
448 warnings.simplefilter('error', SyntaxWarning)
451 warnings.simplefilter('error', SyntaxWarning)
449 self.code = self._compile(source, symbol="exec")
452 self.code = self._compile(source, symbol="exec")
450 # Invalid syntax can produce any of a number of different errors from
453 # Invalid syntax can produce any of a number of different errors from
451 # inside the compiler, so we have to catch them all. Syntax errors
454 # inside the compiler, so we have to catch them all. Syntax errors
452 # immediately produce a 'ready' block, so the invalid Python can be
455 # immediately produce a 'ready' block, so the invalid Python can be
453 # sent to the kernel for evaluation with possible ipython
456 # sent to the kernel for evaluation with possible ipython
454 # special-syntax conversion.
457 # special-syntax conversion.
455 except (SyntaxError, OverflowError, ValueError, TypeError,
458 except (SyntaxError, OverflowError, ValueError, TypeError,
456 MemoryError, SyntaxWarning):
459 MemoryError, SyntaxWarning):
457 self._is_complete = True
460 self._is_complete = True
458 self._is_invalid = True
461 self._is_invalid = True
459 else:
462 else:
460 # Compilation didn't produce any exceptions (though it may not have
463 # Compilation didn't produce any exceptions (though it may not have
461 # given a complete code object)
464 # given a complete code object)
462 self._is_complete = self.code is not None
465 self._is_complete = self.code is not None
463
466
464 return self._is_complete
467 return self._is_complete
465
468
466 def push_accepts_more(self):
469 def push_accepts_more(self):
467 """Return whether a block of interactive input can accept more input.
470 """Return whether a block of interactive input can accept more input.
468
471
469 This method is meant to be used by line-oriented frontends, who need to
472 This method is meant to be used by line-oriented frontends, who need to
470 guess whether a block is complete or not based solely on prior and
473 guess whether a block is complete or not based solely on prior and
471 current input lines. The InputSplitter considers it has a complete
474 current input lines. The InputSplitter considers it has a complete
472 interactive block and will not accept more input when either:
475 interactive block and will not accept more input when either:
473
476
474 * A SyntaxError is raised
477 * A SyntaxError is raised
475
478
476 * The code is complete and consists of a single line or a single
479 * The code is complete and consists of a single line or a single
477 non-compound statement
480 non-compound statement
478
481
479 * The code is complete and has a blank line at the end
482 * The code is complete and has a blank line at the end
480
483
481 If the current input produces a syntax error, this method immediately
484 If the current input produces a syntax error, this method immediately
482 returns False but does *not* raise the syntax error exception, as
485 returns False but does *not* raise the syntax error exception, as
483 typically clients will want to send invalid syntax to an execution
486 typically clients will want to send invalid syntax to an execution
484 backend which might convert the invalid syntax into valid Python via
487 backend which might convert the invalid syntax into valid Python via
485 one of the dynamic IPython mechanisms.
488 one of the dynamic IPython mechanisms.
486 """
489 """
487
490
488 # With incomplete input, unconditionally accept more
491 # With incomplete input, unconditionally accept more
489 # A syntax error also sets _is_complete to True - see push()
492 # A syntax error also sets _is_complete to True - see push()
490 if not self._is_complete:
493 if not self._is_complete:
491 #print("Not complete") # debug
494 #print("Not complete") # debug
492 return True
495 return True
493
496
494 # The user can make any (complete) input execute by leaving a blank line
497 # The user can make any (complete) input execute by leaving a blank line
495 last_line = self.source.splitlines()[-1]
498 last_line = self.source.splitlines()[-1]
496 if (not last_line) or last_line.isspace():
499 if (not last_line) or last_line.isspace():
497 #print("Blank line") # debug
500 #print("Blank line") # debug
498 return False
501 return False
499
502
500 # If there's just a single line or AST node, and we're flush left, as is
503 # If there's just a single line or AST node, and we're flush left, as is
501 # the case after a simple statement such as 'a=1', we want to execute it
504 # the case after a simple statement such as 'a=1', we want to execute it
502 # straight away.
505 # straight away.
503 if self.get_indent_spaces() == 0:
506 if self.get_indent_spaces() == 0:
504 if len(self.source.splitlines()) <= 1:
507 if len(self.source.splitlines()) <= 1:
505 return False
508 return False
506
509
507 try:
510 try:
508 code_ast = ast.parse("".join(self._buffer))
511 code_ast = ast.parse("".join(self._buffer))
509 except Exception:
512 except Exception:
510 #print("Can't parse AST") # debug
513 #print("Can't parse AST") # debug
511 return False
514 return False
512 else:
515 else:
513 if len(code_ast.body) == 1 and \
516 if len(code_ast.body) == 1 and \
514 not hasattr(code_ast.body[0], 'body'):
517 not hasattr(code_ast.body[0], 'body'):
515 #print("Simple statement") # debug
518 #print("Simple statement") # debug
516 return False
519 return False
517
520
518 # General fallback - accept more code
521 # General fallback - accept more code
519 return True
522 return True
520
523
521 def get_indent_spaces(self) -> int:
524 def get_indent_spaces(self) -> int:
522 sourcefor, n = self._indent_spaces_cache
525 sourcefor, n = self._indent_spaces_cache
523 if sourcefor == self.source:
526 if sourcefor == self.source:
524 assert n is not None
527 assert n is not None
525 return n
528 return n
526
529
527 # self.source always has a trailing newline
530 # self.source always has a trailing newline
528 n = find_next_indent(self.source[:-1])
531 n = find_next_indent(self.source[:-1])
529 self._indent_spaces_cache = (self.source, n)
532 self._indent_spaces_cache = (self.source, n)
530 return n
533 return n
531
534
532 # Backwards compatibility. I think all code that used .indent_spaces was
535 # Backwards compatibility. I think all code that used .indent_spaces was
533 # inside IPython, but we can leave this here until IPython 7 in case any
536 # inside IPython, but we can leave this here until IPython 7 in case any
534 # other modules are using it. -TK, November 2017
537 # other modules are using it. -TK, November 2017
535 indent_spaces = property(get_indent_spaces)
538 indent_spaces = property(get_indent_spaces)
536
539
537 def _store(self, lines, buffer=None, store='source'):
540 def _store(self, lines, buffer=None, store='source'):
538 """Store one or more lines of input.
541 """Store one or more lines of input.
539
542
540 If input lines are not newline-terminated, a newline is automatically
543 If input lines are not newline-terminated, a newline is automatically
541 appended."""
544 appended."""
542
545
543 if buffer is None:
546 if buffer is None:
544 buffer = self._buffer
547 buffer = self._buffer
545
548
546 if lines.endswith('\n'):
549 if lines.endswith('\n'):
547 buffer.append(lines)
550 buffer.append(lines)
548 else:
551 else:
549 buffer.append(lines+'\n')
552 buffer.append(lines+'\n')
550 setattr(self, store, self._set_source(buffer))
553 setattr(self, store, self._set_source(buffer))
551
554
552 def _set_source(self, buffer):
555 def _set_source(self, buffer):
553 return u''.join(buffer)
556 return u''.join(buffer)
554
557
555
558
556 class IPythonInputSplitter(InputSplitter):
559 class IPythonInputSplitter(InputSplitter):
557 """An input splitter that recognizes all of IPython's special syntax."""
560 """An input splitter that recognizes all of IPython's special syntax."""
558
561
559 # String with raw, untransformed input.
562 # String with raw, untransformed input.
560 source_raw = ''
563 source_raw = ''
561
564
562 # Flag to track when a transformer has stored input that it hasn't given
565 # Flag to track when a transformer has stored input that it hasn't given
563 # back yet.
566 # back yet.
564 transformer_accumulating = False
567 transformer_accumulating = False
565
568
566 # Flag to track when assemble_python_lines has stored input that it hasn't
569 # Flag to track when assemble_python_lines has stored input that it hasn't
567 # given back yet.
570 # given back yet.
568 within_python_line = False
571 within_python_line = False
569
572
570 # Private attributes
573 # Private attributes
571
574
572 # List with lines of raw input accumulated so far.
575 # List with lines of raw input accumulated so far.
573 _buffer_raw: List[str]
576 _buffer_raw: List[str]
574
577
575 def __init__(self, line_input_checker=True, physical_line_transforms=None,
578 def __init__(self, line_input_checker=True, physical_line_transforms=None,
576 logical_line_transforms=None, python_line_transforms=None):
579 logical_line_transforms=None, python_line_transforms=None):
577 super(IPythonInputSplitter, self).__init__()
580 super(IPythonInputSplitter, self).__init__()
578 self._buffer_raw = []
581 self._buffer_raw = []
579 self._validate = True
582 self._validate = True
580
583
581 if physical_line_transforms is not None:
584 if physical_line_transforms is not None:
582 self.physical_line_transforms = physical_line_transforms
585 self.physical_line_transforms = physical_line_transforms
583 else:
586 else:
584 self.physical_line_transforms = [
587 self.physical_line_transforms = [
585 leading_indent(),
588 leading_indent(),
586 classic_prompt(),
589 classic_prompt(),
587 ipy_prompt(),
590 ipy_prompt(),
588 cellmagic(end_on_blank_line=line_input_checker),
591 cellmagic(end_on_blank_line=line_input_checker),
589 ]
592 ]
590
593
591 self.assemble_logical_lines = assemble_logical_lines()
594 self.assemble_logical_lines = assemble_logical_lines()
592 if logical_line_transforms is not None:
595 if logical_line_transforms is not None:
593 self.logical_line_transforms = logical_line_transforms
596 self.logical_line_transforms = logical_line_transforms
594 else:
597 else:
595 self.logical_line_transforms = [
598 self.logical_line_transforms = [
596 help_end(),
599 help_end(),
597 escaped_commands(),
600 escaped_commands(),
598 assign_from_magic(),
601 assign_from_magic(),
599 assign_from_system(),
602 assign_from_system(),
600 ]
603 ]
601
604
602 self.assemble_python_lines = assemble_python_lines()
605 self.assemble_python_lines = assemble_python_lines()
603 if python_line_transforms is not None:
606 if python_line_transforms is not None:
604 self.python_line_transforms = python_line_transforms
607 self.python_line_transforms = python_line_transforms
605 else:
608 else:
606 # We don't use any of these at present
609 # We don't use any of these at present
607 self.python_line_transforms = []
610 self.python_line_transforms = []
608
611
609 @property
612 @property
610 def transforms(self):
613 def transforms(self):
611 "Quick access to all transformers."
614 "Quick access to all transformers."
612 return self.physical_line_transforms + \
615 return self.physical_line_transforms + \
613 [self.assemble_logical_lines] + self.logical_line_transforms + \
616 [self.assemble_logical_lines] + self.logical_line_transforms + \
614 [self.assemble_python_lines] + self.python_line_transforms
617 [self.assemble_python_lines] + self.python_line_transforms
615
618
616 @property
619 @property
617 def transforms_in_use(self):
620 def transforms_in_use(self):
618 """Transformers, excluding logical line transformers if we're in a
621 """Transformers, excluding logical line transformers if we're in a
619 Python line."""
622 Python line."""
620 t = self.physical_line_transforms[:]
623 t = self.physical_line_transforms[:]
621 if not self.within_python_line:
624 if not self.within_python_line:
622 t += [self.assemble_logical_lines] + self.logical_line_transforms
625 t += [self.assemble_logical_lines] + self.logical_line_transforms
623 return t + [self.assemble_python_lines] + self.python_line_transforms
626 return t + [self.assemble_python_lines] + self.python_line_transforms
624
627
625 def reset(self):
628 def reset(self):
626 """Reset the input buffer and associated state."""
629 """Reset the input buffer and associated state."""
627 super(IPythonInputSplitter, self).reset()
630 super(IPythonInputSplitter, self).reset()
628 self._buffer_raw[:] = []
631 self._buffer_raw[:] = []
629 self.source_raw = ''
632 self.source_raw = ''
630 self.transformer_accumulating = False
633 self.transformer_accumulating = False
631 self.within_python_line = False
634 self.within_python_line = False
632
635
633 for t in self.transforms:
636 for t in self.transforms:
634 try:
637 try:
635 t.reset()
638 t.reset()
636 except SyntaxError:
639 except SyntaxError:
637 # Nothing that calls reset() expects to handle transformer
640 # Nothing that calls reset() expects to handle transformer
638 # errors
641 # errors
639 pass
642 pass
640
643
641 def flush_transformers(self):
644 def flush_transformers(self: Self):
642 def _flush(transform, outs):
645 def _flush(transform, outs: List[str]):
643 """yield transformed lines
646 """yield transformed lines
644
647
645 always strings, never None
648 always strings, never None
646
649
647 transform: the current transform
650 transform: the current transform
648 outs: an iterable of previously transformed inputs.
651 outs: an iterable of previously transformed inputs.
649 Each may be multiline, which will be passed
652 Each may be multiline, which will be passed
650 one line at a time to transform.
653 one line at a time to transform.
651 """
654 """
652 for out in outs:
655 for out in outs:
653 for line in out.splitlines():
656 for line in out.splitlines():
654 # push one line at a time
657 # push one line at a time
655 tmp = transform.push(line)
658 tmp = transform.push(line)
656 if tmp is not None:
659 if tmp is not None:
657 yield tmp
660 yield tmp
658
661
659 # reset the transform
662 # reset the transform
660 tmp = transform.reset()
663 tmp = transform.reset()
661 if tmp is not None:
664 if tmp is not None:
662 yield tmp
665 yield tmp
663
666
664 out: List[str] = []
667 out: List[str] = []
665 for t in self.transforms_in_use:
668 for t in self.transforms_in_use:
666 out = _flush(t, out)
669 out = _flush(t, out)
667
670
668 out = list(out)
671 out = list(out)
669 if out:
672 if out:
670 self._store('\n'.join(out))
673 self._store('\n'.join(out))
671
674
672 def raw_reset(self):
675 def raw_reset(self):
673 """Return raw input only and perform a full reset.
676 """Return raw input only and perform a full reset.
674 """
677 """
675 out = self.source_raw
678 out = self.source_raw
676 self.reset()
679 self.reset()
677 return out
680 return out
678
681
679 def source_reset(self):
682 def source_reset(self):
680 try:
683 try:
681 self.flush_transformers()
684 self.flush_transformers()
682 return self.source
685 return self.source
683 finally:
686 finally:
684 self.reset()
687 self.reset()
685
688
686 def push_accepts_more(self):
689 def push_accepts_more(self):
687 if self.transformer_accumulating:
690 if self.transformer_accumulating:
688 return True
691 return True
689 else:
692 else:
690 return super(IPythonInputSplitter, self).push_accepts_more()
693 return super(IPythonInputSplitter, self).push_accepts_more()
691
694
692 def transform_cell(self, cell):
695 def transform_cell(self, cell):
693 """Process and translate a cell of input.
696 """Process and translate a cell of input.
694 """
697 """
695 self.reset()
698 self.reset()
696 try:
699 try:
697 self.push(cell)
700 self.push(cell)
698 self.flush_transformers()
701 self.flush_transformers()
699 return self.source
702 return self.source
700 finally:
703 finally:
701 self.reset()
704 self.reset()
702
705
703 def push(self, lines:str) -> bool:
706 def push(self, lines:str) -> bool:
704 """Push one or more lines of IPython input.
707 """Push one or more lines of IPython input.
705
708
706 This stores the given lines and returns a status code indicating
709 This stores the given lines and returns a status code indicating
707 whether the code forms a complete Python block or not, after processing
710 whether the code forms a complete Python block or not, after processing
708 all input lines for special IPython syntax.
711 all input lines for special IPython syntax.
709
712
710 Any exceptions generated in compilation are swallowed, but if an
713 Any exceptions generated in compilation are swallowed, but if an
711 exception was produced, the method returns True.
714 exception was produced, the method returns True.
712
715
713 Parameters
716 Parameters
714 ----------
717 ----------
715 lines : string
718 lines : string
716 One or more lines of Python input.
719 One or more lines of Python input.
717
720
718 Returns
721 Returns
719 -------
722 -------
720 is_complete : boolean
723 is_complete : boolean
721 True if the current input source (the result of the current input
724 True if the current input source (the result of the current input
722 plus prior inputs) forms a complete Python execution block. Note that
725 plus prior inputs) forms a complete Python execution block. Note that
723 this value is also stored as a private attribute (_is_complete), so it
726 this value is also stored as a private attribute (_is_complete), so it
724 can be queried at any time.
727 can be queried at any time.
725 """
728 """
726 assert isinstance(lines, str)
729 assert isinstance(lines, str)
727 # We must ensure all input is pure unicode
730 # We must ensure all input is pure unicode
728 # ''.splitlines() --> [], but we need to push the empty line to transformers
731 # ''.splitlines() --> [], but we need to push the empty line to transformers
729 lines_list = lines.splitlines()
732 lines_list = lines.splitlines()
730 if not lines_list:
733 if not lines_list:
731 lines_list = ['']
734 lines_list = ['']
732
735
733 # Store raw source before applying any transformations to it. Note
736 # Store raw source before applying any transformations to it. Note
734 # that this must be done *after* the reset() call that would otherwise
737 # that this must be done *after* the reset() call that would otherwise
735 # flush the buffer.
738 # flush the buffer.
736 self._store(lines, self._buffer_raw, 'source_raw')
739 self._store(lines, self._buffer_raw, 'source_raw')
737
740
738 transformed_lines_list = []
741 transformed_lines_list = []
739 for line in lines_list:
742 for line in lines_list:
740 transformed = self._transform_line(line)
743 transformed = self._transform_line(line)
741 if transformed is not None:
744 if transformed is not None:
742 transformed_lines_list.append(transformed)
745 transformed_lines_list.append(transformed)
743
746
744 if transformed_lines_list:
747 if transformed_lines_list:
745 transformed_lines = '\n'.join(transformed_lines_list)
748 transformed_lines = '\n'.join(transformed_lines_list)
746 return super(IPythonInputSplitter, self).push(transformed_lines)
749 return super(IPythonInputSplitter, self).push(transformed_lines)
747 else:
750 else:
748 # Got nothing back from transformers - they must be waiting for
751 # Got nothing back from transformers - they must be waiting for
749 # more input.
752 # more input.
750 return False
753 return False
751
754
752 def _transform_line(self, line):
755 def _transform_line(self, line):
753 """Push a line of input code through the various transformers.
756 """Push a line of input code through the various transformers.
754
757
755 Returns any output from the transformers, or None if a transformer
758 Returns any output from the transformers, or None if a transformer
756 is accumulating lines.
759 is accumulating lines.
757
760
758 Sets self.transformer_accumulating as a side effect.
761 Sets self.transformer_accumulating as a side effect.
759 """
762 """
760 def _accumulating(dbg):
763 def _accumulating(dbg):
761 #print(dbg)
764 #print(dbg)
762 self.transformer_accumulating = True
765 self.transformer_accumulating = True
763 return None
766 return None
764
767
765 for transformer in self.physical_line_transforms:
768 for transformer in self.physical_line_transforms:
766 line = transformer.push(line)
769 line = transformer.push(line)
767 if line is None:
770 if line is None:
768 return _accumulating(transformer)
771 return _accumulating(transformer)
769
772
770 if not self.within_python_line:
773 if not self.within_python_line:
771 line = self.assemble_logical_lines.push(line)
774 line = self.assemble_logical_lines.push(line)
772 if line is None:
775 if line is None:
773 return _accumulating('acc logical line')
776 return _accumulating('acc logical line')
774
777
775 for transformer in self.logical_line_transforms:
778 for transformer in self.logical_line_transforms:
776 line = transformer.push(line)
779 line = transformer.push(line)
777 if line is None:
780 if line is None:
778 return _accumulating(transformer)
781 return _accumulating(transformer)
779
782
780 line = self.assemble_python_lines.push(line)
783 line = self.assemble_python_lines.push(line)
781 if line is None:
784 if line is None:
782 self.within_python_line = True
785 self.within_python_line = True
783 return _accumulating('acc python line')
786 return _accumulating('acc python line')
784 else:
787 else:
785 self.within_python_line = False
788 self.within_python_line = False
786
789
787 for transformer in self.python_line_transforms:
790 for transformer in self.python_line_transforms:
788 line = transformer.push(line)
791 line = transformer.push(line)
789 if line is None:
792 if line is None:
790 return _accumulating(transformer)
793 return _accumulating(transformer)
791
794
792 #print("transformers clear") #debug
795 #print("transformers clear") #debug
793 self.transformer_accumulating = False
796 self.transformer_accumulating = False
794 return line
797 return line
795
798
@@ -1,3976 +1,3979 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 import abc
14 import abc
15 import ast
15 import ast
16 import atexit
16 import atexit
17 import bdb
17 import bdb
18 import builtins as builtin_mod
18 import builtins as builtin_mod
19 import functools
19 import functools
20 import inspect
20 import inspect
21 import os
21 import os
22 import re
22 import re
23 import runpy
23 import runpy
24 import shutil
24 import shutil
25 import subprocess
25 import subprocess
26 import sys
26 import sys
27 import tempfile
27 import tempfile
28 import traceback
28 import traceback
29 import types
29 import types
30 import warnings
30 import warnings
31 from ast import stmt
31 from ast import stmt
32 from io import open as io_open
32 from io import open as io_open
33 from logging import error
33 from logging import error
34 from pathlib import Path
34 from pathlib import Path
35 from typing import Callable
35 from typing import Callable
36 from typing import List as ListType, Dict as DictType, Any as AnyType
36 from typing import List as ListType, Dict as DictType, Any as AnyType
37 from typing import Optional, Sequence, Tuple
37 from typing import Optional, Sequence, Tuple
38 from warnings import warn
38 from warnings import warn
39
39
40 try:
40 try:
41 from pickleshare import PickleShareDB
41 from pickleshare import PickleShareDB
42 except ModuleNotFoundError:
42 except ModuleNotFoundError:
43
43
44 class PickleShareDB: # type: ignore [no-redef]
44 class PickleShareDB: # type: ignore [no-redef]
45 _mock = True
45 _mock = True
46
46
47 def __init__(self, path):
47 def __init__(self, path):
48 pass
48 pass
49
49
50 def get(self, key, default=None):
50 def get(self, key, default=None):
51 warn(
51 warn(
52 f"This is now an optional IPython functionality, using {key} requires you to install the `pickleshare` library.",
52 f"This is now an optional IPython functionality, using {key} requires you to install the `pickleshare` library.",
53 stacklevel=2,
53 stacklevel=2,
54 )
54 )
55 return default
55 return default
56
56
57 def __getitem__(self, key):
57 def __getitem__(self, key):
58 warn(
58 warn(
59 f"This is now an optional IPython functionality, using {key} requires you to install the `pickleshare` library.",
59 f"This is now an optional IPython functionality, using {key} requires you to install the `pickleshare` library.",
60 stacklevel=2,
60 stacklevel=2,
61 )
61 )
62 return None
62 return None
63
63
64 def __setitem__(self, key, value):
64 def __setitem__(self, key, value):
65 warn(
65 warn(
66 f"This is now an optional IPython functionality, setting {key} requires you to install the `pickleshare` library.",
66 f"This is now an optional IPython functionality, setting {key} requires you to install the `pickleshare` library.",
67 stacklevel=2,
67 stacklevel=2,
68 )
68 )
69
69
70 def __delitem__(self, key):
70 def __delitem__(self, key):
71 warn(
71 warn(
72 f"This is now an optional IPython functionality, deleting {key} requires you to install the `pickleshare` library.",
72 f"This is now an optional IPython functionality, deleting {key} requires you to install the `pickleshare` library.",
73 stacklevel=2,
73 stacklevel=2,
74 )
74 )
75
75
76
76
77 from tempfile import TemporaryDirectory
77 from tempfile import TemporaryDirectory
78 from traitlets import (
78 from traitlets import (
79 Any,
79 Any,
80 Bool,
80 Bool,
81 CaselessStrEnum,
81 CaselessStrEnum,
82 Dict,
82 Dict,
83 Enum,
83 Enum,
84 Instance,
84 Instance,
85 Integer,
85 Integer,
86 List,
86 List,
87 Type,
87 Type,
88 Unicode,
88 Unicode,
89 default,
89 default,
90 observe,
90 observe,
91 validate,
91 validate,
92 )
92 )
93 from traitlets.config.configurable import SingletonConfigurable
93 from traitlets.config.configurable import SingletonConfigurable
94 from traitlets.utils.importstring import import_item
94 from traitlets.utils.importstring import import_item
95
95
96 import IPython.core.hooks
96 import IPython.core.hooks
97 from IPython.core import magic, oinspect, page, prefilter, ultratb
97 from IPython.core import magic, oinspect, page, prefilter, ultratb
98 from IPython.core.alias import Alias, AliasManager
98 from IPython.core.alias import Alias, AliasManager
99 from IPython.core.autocall import ExitAutocall
99 from IPython.core.autocall import ExitAutocall
100 from IPython.core.builtin_trap import BuiltinTrap
100 from IPython.core.builtin_trap import BuiltinTrap
101 from IPython.core.compilerop import CachingCompiler
101 from IPython.core.compilerop import CachingCompiler
102 from IPython.core.debugger import InterruptiblePdb
102 from IPython.core.debugger import InterruptiblePdb
103 from IPython.core.display_trap import DisplayTrap
103 from IPython.core.display_trap import DisplayTrap
104 from IPython.core.displayhook import DisplayHook
104 from IPython.core.displayhook import DisplayHook
105 from IPython.core.displaypub import DisplayPublisher
105 from IPython.core.displaypub import DisplayPublisher
106 from IPython.core.error import InputRejected, UsageError
106 from IPython.core.error import InputRejected, UsageError
107 from IPython.core.events import EventManager, available_events
107 from IPython.core.events import EventManager, available_events
108 from IPython.core.extensions import ExtensionManager
108 from IPython.core.extensions import ExtensionManager
109 from IPython.core.formatters import DisplayFormatter
109 from IPython.core.formatters import DisplayFormatter
110 from IPython.core.history import HistoryManager
110 from IPython.core.history import HistoryManager
111 from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
111 from IPython.core.inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
112 from IPython.core.logger import Logger
112 from IPython.core.logger import Logger
113 from IPython.core.macro import Macro
113 from IPython.core.macro import Macro
114 from IPython.core.payload import PayloadManager
114 from IPython.core.payload import PayloadManager
115 from IPython.core.prefilter import PrefilterManager
115 from IPython.core.prefilter import PrefilterManager
116 from IPython.core.profiledir import ProfileDir
116 from IPython.core.profiledir import ProfileDir
117 from IPython.core.usage import default_banner
117 from IPython.core.usage import default_banner
118 from IPython.display import display
118 from IPython.display import display
119 from IPython.paths import get_ipython_dir
119 from IPython.paths import get_ipython_dir
120 from IPython.testing.skipdoctest import skip_doctest
120 from IPython.testing.skipdoctest import skip_doctest
121 from IPython.utils import PyColorize, io, openpy, py3compat
121 from IPython.utils import PyColorize, io, openpy, py3compat
122 from IPython.utils.decorators import undoc
122 from IPython.utils.decorators import undoc
123 from IPython.utils.io import ask_yes_no
123 from IPython.utils.io import ask_yes_no
124 from IPython.utils.ipstruct import Struct
124 from IPython.utils.ipstruct import Struct
125 from IPython.utils.path import ensure_dir_exists, get_home_dir, get_py_filename
125 from IPython.utils.path import ensure_dir_exists, get_home_dir, get_py_filename
126 from IPython.utils.process import getoutput, system
126 from IPython.utils.process import getoutput, system
127 from IPython.utils.strdispatch import StrDispatch
127 from IPython.utils.strdispatch import StrDispatch
128 from IPython.utils.syspathcontext import prepended_to_syspath
128 from IPython.utils.syspathcontext import prepended_to_syspath
129 from IPython.utils.text import DollarFormatter, LSString, SList, format_screen
129 from IPython.utils.text import DollarFormatter, LSString, SList, format_screen
130 from IPython.core.oinspect import OInfo
130 from IPython.core.oinspect import OInfo
131
131
132
132
133 sphinxify: Optional[Callable]
133 sphinxify: Optional[Callable]
134
134
135 try:
135 try:
136 import docrepr.sphinxify as sphx
136 import docrepr.sphinxify as sphx
137
137
138 def sphinxify(oinfo):
138 def sphinxify(oinfo):
139 wrapped_docstring = sphx.wrap_main_docstring(oinfo)
139 wrapped_docstring = sphx.wrap_main_docstring(oinfo)
140
140
141 def sphinxify_docstring(docstring):
141 def sphinxify_docstring(docstring):
142 with TemporaryDirectory() as dirname:
142 with TemporaryDirectory() as dirname:
143 return {
143 return {
144 "text/html": sphx.sphinxify(wrapped_docstring, dirname),
144 "text/html": sphx.sphinxify(wrapped_docstring, dirname),
145 "text/plain": docstring,
145 "text/plain": docstring,
146 }
146 }
147
147
148 return sphinxify_docstring
148 return sphinxify_docstring
149 except ImportError:
149 except ImportError:
150 sphinxify = None
150 sphinxify = None
151
151
152 if sys.version_info[:2] < (3, 11):
152 if sys.version_info[:2] < (3, 11):
153 from exceptiongroup import BaseExceptionGroup
153 from exceptiongroup import BaseExceptionGroup
154
154
155 class ProvisionalWarning(DeprecationWarning):
155 class ProvisionalWarning(DeprecationWarning):
156 """
156 """
157 Warning class for unstable features
157 Warning class for unstable features
158 """
158 """
159 pass
159 pass
160
160
161 from ast import Module
161 from ast import Module
162
162
163 _assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
163 _assign_nodes = (ast.AugAssign, ast.AnnAssign, ast.Assign)
164 _single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
164 _single_targets_nodes = (ast.AugAssign, ast.AnnAssign)
165
165
166 #-----------------------------------------------------------------------------
166 #-----------------------------------------------------------------------------
167 # Await Helpers
167 # Await Helpers
168 #-----------------------------------------------------------------------------
168 #-----------------------------------------------------------------------------
169
169
170 # we still need to run things using the asyncio eventloop, but there is no
170 # we still need to run things using the asyncio eventloop, but there is no
171 # async integration
171 # async integration
172 from .async_helpers import (
172 from .async_helpers import (
173 _asyncio_runner,
173 _asyncio_runner,
174 _curio_runner,
174 _curio_runner,
175 _pseudo_sync_runner,
175 _pseudo_sync_runner,
176 _should_be_async,
176 _should_be_async,
177 _trio_runner,
177 _trio_runner,
178 )
178 )
179
179
180 #-----------------------------------------------------------------------------
180 #-----------------------------------------------------------------------------
181 # Globals
181 # Globals
182 #-----------------------------------------------------------------------------
182 #-----------------------------------------------------------------------------
183
183
184 # compiled regexps for autoindent management
184 # compiled regexps for autoindent management
185 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
185 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
186
186
187 #-----------------------------------------------------------------------------
187 #-----------------------------------------------------------------------------
188 # Utilities
188 # Utilities
189 #-----------------------------------------------------------------------------
189 #-----------------------------------------------------------------------------
190
190
191
191
192 def is_integer_string(s: str):
192 def is_integer_string(s: str):
193 """
193 """
194 Variant of "str.isnumeric()" that allow negative values and other ints.
194 Variant of "str.isnumeric()" that allow negative values and other ints.
195 """
195 """
196 try:
196 try:
197 int(s)
197 int(s)
198 return True
198 return True
199 except ValueError:
199 except ValueError:
200 return False
200 return False
201 raise ValueError("Unexpected error")
201 raise ValueError("Unexpected error")
202
202
203
203
204 @undoc
204 @undoc
205 def softspace(file, newvalue):
205 def softspace(file, newvalue):
206 """Copied from code.py, to remove the dependency"""
206 """Copied from code.py, to remove the dependency"""
207
207
208 oldvalue = 0
208 oldvalue = 0
209 try:
209 try:
210 oldvalue = file.softspace
210 oldvalue = file.softspace
211 except AttributeError:
211 except AttributeError:
212 pass
212 pass
213 try:
213 try:
214 file.softspace = newvalue
214 file.softspace = newvalue
215 except (AttributeError, TypeError):
215 except (AttributeError, TypeError):
216 # "attribute-less object" or "read-only attributes"
216 # "attribute-less object" or "read-only attributes"
217 pass
217 pass
218 return oldvalue
218 return oldvalue
219
219
220 @undoc
220 @undoc
221 def no_op(*a, **kw):
221 def no_op(*a, **kw):
222 pass
222 pass
223
223
224
224
225 class SpaceInInput(Exception): pass
225 class SpaceInInput(Exception): pass
226
226
227
227
228 class SeparateUnicode(Unicode):
228 class SeparateUnicode(Unicode):
229 r"""A Unicode subclass to validate separate_in, separate_out, etc.
229 r"""A Unicode subclass to validate separate_in, separate_out, etc.
230
230
231 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
231 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
232 """
232 """
233
233
234 def validate(self, obj, value):
234 def validate(self, obj, value):
235 if value == '0': value = ''
235 if value == '0': value = ''
236 value = value.replace('\\n','\n')
236 value = value.replace('\\n','\n')
237 return super(SeparateUnicode, self).validate(obj, value)
237 return super(SeparateUnicode, self).validate(obj, value)
238
238
239
239
240 @undoc
240 @undoc
241 class DummyMod(object):
241 class DummyMod(object):
242 """A dummy module used for IPython's interactive module when
242 """A dummy module used for IPython's interactive module when
243 a namespace must be assigned to the module's __dict__."""
243 a namespace must be assigned to the module's __dict__."""
244 __spec__ = None
244 __spec__ = None
245
245
246
246
247 class ExecutionInfo(object):
247 class ExecutionInfo(object):
248 """The arguments used for a call to :meth:`InteractiveShell.run_cell`
248 """The arguments used for a call to :meth:`InteractiveShell.run_cell`
249
249
250 Stores information about what is going to happen.
250 Stores information about what is going to happen.
251 """
251 """
252 raw_cell = None
252 raw_cell = None
253 store_history = False
253 store_history = False
254 silent = False
254 silent = False
255 shell_futures = True
255 shell_futures = True
256 cell_id = None
256 cell_id = None
257
257
258 def __init__(self, raw_cell, store_history, silent, shell_futures, cell_id):
258 def __init__(self, raw_cell, store_history, silent, shell_futures, cell_id):
259 self.raw_cell = raw_cell
259 self.raw_cell = raw_cell
260 self.store_history = store_history
260 self.store_history = store_history
261 self.silent = silent
261 self.silent = silent
262 self.shell_futures = shell_futures
262 self.shell_futures = shell_futures
263 self.cell_id = cell_id
263 self.cell_id = cell_id
264
264
265 def __repr__(self):
265 def __repr__(self):
266 name = self.__class__.__qualname__
266 name = self.__class__.__qualname__
267 raw_cell = (
267 raw_cell = (
268 (self.raw_cell[:50] + "..") if len(self.raw_cell) > 50 else self.raw_cell
268 (self.raw_cell[:50] + "..") if len(self.raw_cell) > 50 else self.raw_cell
269 )
269 )
270 return (
270 return (
271 '<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
271 '<%s object at %x, raw_cell="%s" store_history=%s silent=%s shell_futures=%s cell_id=%s>'
272 % (
272 % (
273 name,
273 name,
274 id(self),
274 id(self),
275 raw_cell,
275 raw_cell,
276 self.store_history,
276 self.store_history,
277 self.silent,
277 self.silent,
278 self.shell_futures,
278 self.shell_futures,
279 self.cell_id,
279 self.cell_id,
280 )
280 )
281 )
281 )
282
282
283
283
284 class ExecutionResult(object):
284 class ExecutionResult:
285 """The result of a call to :meth:`InteractiveShell.run_cell`
285 """The result of a call to :meth:`InteractiveShell.run_cell`
286
286
287 Stores information about what took place.
287 Stores information about what took place.
288 """
288 """
289 execution_count = None
289
290 error_before_exec = None
290 execution_count: Optional[int] = None
291 error_before_exec: Optional[bool] = None
291 error_in_exec: Optional[BaseException] = None
292 error_in_exec: Optional[BaseException] = None
292 info = None
293 info = None
293 result = None
294 result = None
294
295
295 def __init__(self, info):
296 def __init__(self, info):
296 self.info = info
297 self.info = info
297
298
298 @property
299 @property
299 def success(self):
300 def success(self):
300 return (self.error_before_exec is None) and (self.error_in_exec is None)
301 return (self.error_before_exec is None) and (self.error_in_exec is None)
301
302
302 def raise_error(self):
303 def raise_error(self):
303 """Reraises error if `success` is `False`, otherwise does nothing"""
304 """Reraises error if `success` is `False`, otherwise does nothing"""
304 if self.error_before_exec is not None:
305 if self.error_before_exec is not None:
305 raise self.error_before_exec
306 raise self.error_before_exec
306 if self.error_in_exec is not None:
307 if self.error_in_exec is not None:
307 raise self.error_in_exec
308 raise self.error_in_exec
308
309
309 def __repr__(self):
310 def __repr__(self):
310 name = self.__class__.__qualname__
311 name = self.__class__.__qualname__
311 return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\
312 return '<%s object at %x, execution_count=%s error_before_exec=%s error_in_exec=%s info=%s result=%s>' %\
312 (name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result))
313 (name, id(self), self.execution_count, self.error_before_exec, self.error_in_exec, repr(self.info), repr(self.result))
313
314
314 @functools.wraps(io_open)
315 @functools.wraps(io_open)
315 def _modified_open(file, *args, **kwargs):
316 def _modified_open(file, *args, **kwargs):
316 if file in {0, 1, 2}:
317 if file in {0, 1, 2}:
317 raise ValueError(
318 raise ValueError(
318 f"IPython won't let you open fd={file} by default "
319 f"IPython won't let you open fd={file} by default "
319 "as it is likely to crash IPython. If you know what you are doing, "
320 "as it is likely to crash IPython. If you know what you are doing, "
320 "you can use builtins' open."
321 "you can use builtins' open."
321 )
322 )
322
323
323 return io_open(file, *args, **kwargs)
324 return io_open(file, *args, **kwargs)
324
325
325 class InteractiveShell(SingletonConfigurable):
326 class InteractiveShell(SingletonConfigurable):
326 """An enhanced, interactive shell for Python."""
327 """An enhanced, interactive shell for Python."""
327
328
328 _instance = None
329 _instance = None
329
330
330 ast_transformers: List[ast.NodeTransformer] = List(
331 ast_transformers: List[ast.NodeTransformer] = List(
331 [],
332 [],
332 help="""
333 help="""
333 A list of ast.NodeTransformer subclass instances, which will be applied
334 A list of ast.NodeTransformer subclass instances, which will be applied
334 to user input before code is run.
335 to user input before code is run.
335 """,
336 """,
336 ).tag(config=True)
337 ).tag(config=True)
337
338
338 autocall = Enum((0,1,2), default_value=0, help=
339 autocall = Enum((0,1,2), default_value=0, help=
339 """
340 """
340 Make IPython automatically call any callable object even if you didn't
341 Make IPython automatically call any callable object even if you didn't
341 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
342 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
342 automatically. The value can be '0' to disable the feature, '1' for
343 automatically. The value can be '0' to disable the feature, '1' for
343 'smart' autocall, where it is not applied if there are no more
344 'smart' autocall, where it is not applied if there are no more
344 arguments on the line, and '2' for 'full' autocall, where all callable
345 arguments on the line, and '2' for 'full' autocall, where all callable
345 objects are automatically called (even if no arguments are present).
346 objects are automatically called (even if no arguments are present).
346 """
347 """
347 ).tag(config=True)
348 ).tag(config=True)
348
349
349 autoindent = Bool(True, help=
350 autoindent = Bool(True, help=
350 """
351 """
351 Autoindent IPython code entered interactively.
352 Autoindent IPython code entered interactively.
352 """
353 """
353 ).tag(config=True)
354 ).tag(config=True)
354
355
355 autoawait = Bool(True, help=
356 autoawait = Bool(True, help=
356 """
357 """
357 Automatically run await statement in the top level repl.
358 Automatically run await statement in the top level repl.
358 """
359 """
359 ).tag(config=True)
360 ).tag(config=True)
360
361
361 loop_runner_map ={
362 loop_runner_map ={
362 'asyncio':(_asyncio_runner, True),
363 'asyncio':(_asyncio_runner, True),
363 'curio':(_curio_runner, True),
364 'curio':(_curio_runner, True),
364 'trio':(_trio_runner, True),
365 'trio':(_trio_runner, True),
365 'sync': (_pseudo_sync_runner, False)
366 'sync': (_pseudo_sync_runner, False)
366 }
367 }
367
368
368 loop_runner = Any(default_value="IPython.core.interactiveshell._asyncio_runner",
369 loop_runner = Any(default_value="IPython.core.interactiveshell._asyncio_runner",
369 allow_none=True,
370 allow_none=True,
370 help="""Select the loop runner that will be used to execute top-level asynchronous code"""
371 help="""Select the loop runner that will be used to execute top-level asynchronous code"""
371 ).tag(config=True)
372 ).tag(config=True)
372
373
373 @default('loop_runner')
374 @default('loop_runner')
374 def _default_loop_runner(self):
375 def _default_loop_runner(self):
375 return import_item("IPython.core.interactiveshell._asyncio_runner")
376 return import_item("IPython.core.interactiveshell._asyncio_runner")
376
377
377 @validate('loop_runner')
378 @validate('loop_runner')
378 def _import_runner(self, proposal):
379 def _import_runner(self, proposal):
379 if isinstance(proposal.value, str):
380 if isinstance(proposal.value, str):
380 if proposal.value in self.loop_runner_map:
381 if proposal.value in self.loop_runner_map:
381 runner, autoawait = self.loop_runner_map[proposal.value]
382 runner, autoawait = self.loop_runner_map[proposal.value]
382 self.autoawait = autoawait
383 self.autoawait = autoawait
383 return runner
384 return runner
384 runner = import_item(proposal.value)
385 runner = import_item(proposal.value)
385 if not callable(runner):
386 if not callable(runner):
386 raise ValueError('loop_runner must be callable')
387 raise ValueError('loop_runner must be callable')
387 return runner
388 return runner
388 if not callable(proposal.value):
389 if not callable(proposal.value):
389 raise ValueError('loop_runner must be callable')
390 raise ValueError('loop_runner must be callable')
390 return proposal.value
391 return proposal.value
391
392
392 automagic = Bool(True, help=
393 automagic = Bool(True, help=
393 """
394 """
394 Enable magic commands to be called without the leading %.
395 Enable magic commands to be called without the leading %.
395 """
396 """
396 ).tag(config=True)
397 ).tag(config=True)
397
398
398 banner1 = Unicode(default_banner,
399 banner1 = Unicode(default_banner,
399 help="""The part of the banner to be printed before the profile"""
400 help="""The part of the banner to be printed before the profile"""
400 ).tag(config=True)
401 ).tag(config=True)
401 banner2 = Unicode('',
402 banner2 = Unicode('',
402 help="""The part of the banner to be printed after the profile"""
403 help="""The part of the banner to be printed after the profile"""
403 ).tag(config=True)
404 ).tag(config=True)
404
405
405 cache_size = Integer(1000, help=
406 cache_size = Integer(1000, help=
406 """
407 """
407 Set the size of the output cache. The default is 1000, you can
408 Set the size of the output cache. The default is 1000, you can
408 change it permanently in your config file. Setting it to 0 completely
409 change it permanently in your config file. Setting it to 0 completely
409 disables the caching system, and the minimum value accepted is 3 (if
410 disables the caching system, and the minimum value accepted is 3 (if
410 you provide a value less than 3, it is reset to 0 and a warning is
411 you provide a value less than 3, it is reset to 0 and a warning is
411 issued). This limit is defined because otherwise you'll spend more
412 issued). This limit is defined because otherwise you'll spend more
412 time re-flushing a too small cache than working
413 time re-flushing a too small cache than working
413 """
414 """
414 ).tag(config=True)
415 ).tag(config=True)
415 color_info = Bool(True, help=
416 color_info = Bool(True, help=
416 """
417 """
417 Use colors for displaying information about objects. Because this
418 Use colors for displaying information about objects. Because this
418 information is passed through a pager (like 'less'), and some pagers
419 information is passed through a pager (like 'less'), and some pagers
419 get confused with color codes, this capability can be turned off.
420 get confused with color codes, this capability can be turned off.
420 """
421 """
421 ).tag(config=True)
422 ).tag(config=True)
422 colors = CaselessStrEnum(('Neutral', 'NoColor','LightBG','Linux'),
423 colors = CaselessStrEnum(('Neutral', 'NoColor','LightBG','Linux'),
423 default_value='Neutral',
424 default_value='Neutral',
424 help="Set the color scheme (NoColor, Neutral, Linux, or LightBG)."
425 help="Set the color scheme (NoColor, Neutral, Linux, or LightBG)."
425 ).tag(config=True)
426 ).tag(config=True)
426 debug = Bool(False).tag(config=True)
427 debug = Bool(False).tag(config=True)
427 disable_failing_post_execute = Bool(False,
428 disable_failing_post_execute = Bool(False,
428 help="Don't call post-execute functions that have failed in the past."
429 help="Don't call post-execute functions that have failed in the past."
429 ).tag(config=True)
430 ).tag(config=True)
430 display_formatter = Instance(DisplayFormatter, allow_none=True)
431 display_formatter = Instance(DisplayFormatter, allow_none=True)
431 displayhook_class = Type(DisplayHook)
432 displayhook_class = Type(DisplayHook)
432 display_pub_class = Type(DisplayPublisher)
433 display_pub_class = Type(DisplayPublisher)
433 compiler_class = Type(CachingCompiler)
434 compiler_class = Type(CachingCompiler)
434 inspector_class = Type(
435 inspector_class = Type(
435 oinspect.Inspector, help="Class to use to instantiate the shell inspector"
436 oinspect.Inspector, help="Class to use to instantiate the shell inspector"
436 ).tag(config=True)
437 ).tag(config=True)
437
438
438 sphinxify_docstring = Bool(False, help=
439 sphinxify_docstring = Bool(False, help=
439 """
440 """
440 Enables rich html representation of docstrings. (This requires the
441 Enables rich html representation of docstrings. (This requires the
441 docrepr module).
442 docrepr module).
442 """).tag(config=True)
443 """).tag(config=True)
443
444
444 @observe("sphinxify_docstring")
445 @observe("sphinxify_docstring")
445 def _sphinxify_docstring_changed(self, change):
446 def _sphinxify_docstring_changed(self, change):
446 if change['new']:
447 if change['new']:
447 warn("`sphinxify_docstring` is provisional since IPython 5.0 and might change in future versions." , ProvisionalWarning)
448 warn("`sphinxify_docstring` is provisional since IPython 5.0 and might change in future versions." , ProvisionalWarning)
448
449
449 enable_html_pager = Bool(False, help=
450 enable_html_pager = Bool(False, help=
450 """
451 """
451 (Provisional API) enables html representation in mime bundles sent
452 (Provisional API) enables html representation in mime bundles sent
452 to pagers.
453 to pagers.
453 """).tag(config=True)
454 """).tag(config=True)
454
455
455 @observe("enable_html_pager")
456 @observe("enable_html_pager")
456 def _enable_html_pager_changed(self, change):
457 def _enable_html_pager_changed(self, change):
457 if change['new']:
458 if change['new']:
458 warn("`enable_html_pager` is provisional since IPython 5.0 and might change in future versions.", ProvisionalWarning)
459 warn("`enable_html_pager` is provisional since IPython 5.0 and might change in future versions.", ProvisionalWarning)
459
460
460 data_pub_class = None
461 data_pub_class = None
461
462
462 exit_now = Bool(False)
463 exit_now = Bool(False)
463 exiter = Instance(ExitAutocall)
464 exiter = Instance(ExitAutocall)
464 @default('exiter')
465 @default('exiter')
465 def _exiter_default(self):
466 def _exiter_default(self):
466 return ExitAutocall(self)
467 return ExitAutocall(self)
467 # Monotonically increasing execution counter
468 # Monotonically increasing execution counter
468 execution_count = Integer(1)
469 execution_count = Integer(1)
469 filename = Unicode("<ipython console>")
470 filename = Unicode("<ipython console>")
470 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__
471 ipython_dir= Unicode('').tag(config=True) # Set to get_ipython_dir() in __init__
471
472
472 # Used to transform cells before running them, and check whether code is complete
473 # Used to transform cells before running them, and check whether code is complete
473 input_transformer_manager = Instance('IPython.core.inputtransformer2.TransformerManager',
474 input_transformer_manager = Instance('IPython.core.inputtransformer2.TransformerManager',
474 ())
475 ())
475
476
476 @property
477 @property
477 def input_transformers_cleanup(self):
478 def input_transformers_cleanup(self):
478 return self.input_transformer_manager.cleanup_transforms
479 return self.input_transformer_manager.cleanup_transforms
479
480
480 input_transformers_post = List([],
481 input_transformers_post: List = List(
482 [],
481 help="A list of string input transformers, to be applied after IPython's "
483 help="A list of string input transformers, to be applied after IPython's "
482 "own input transformations."
484 "own input transformations."
483 )
485 )
484
486
485 @property
487 @property
486 def input_splitter(self):
488 def input_splitter(self):
487 """Make this available for backward compatibility (pre-7.0 release) with existing code.
489 """Make this available for backward compatibility (pre-7.0 release) with existing code.
488
490
489 For example, ipykernel ipykernel currently uses
491 For example, ipykernel ipykernel currently uses
490 `shell.input_splitter.check_complete`
492 `shell.input_splitter.check_complete`
491 """
493 """
492 from warnings import warn
494 from warnings import warn
493 warn("`input_splitter` is deprecated since IPython 7.0, prefer `input_transformer_manager`.",
495 warn("`input_splitter` is deprecated since IPython 7.0, prefer `input_transformer_manager`.",
494 DeprecationWarning, stacklevel=2
496 DeprecationWarning, stacklevel=2
495 )
497 )
496 return self.input_transformer_manager
498 return self.input_transformer_manager
497
499
498 logstart = Bool(False, help=
500 logstart = Bool(False, help=
499 """
501 """
500 Start logging to the default log file in overwrite mode.
502 Start logging to the default log file in overwrite mode.
501 Use `logappend` to specify a log file to **append** logs to.
503 Use `logappend` to specify a log file to **append** logs to.
502 """
504 """
503 ).tag(config=True)
505 ).tag(config=True)
504 logfile = Unicode('', help=
506 logfile = Unicode('', help=
505 """
507 """
506 The name of the logfile to use.
508 The name of the logfile to use.
507 """
509 """
508 ).tag(config=True)
510 ).tag(config=True)
509 logappend = Unicode('', help=
511 logappend = Unicode('', help=
510 """
512 """
511 Start logging to the given file in append mode.
513 Start logging to the given file in append mode.
512 Use `logfile` to specify a log file to **overwrite** logs to.
514 Use `logfile` to specify a log file to **overwrite** logs to.
513 """
515 """
514 ).tag(config=True)
516 ).tag(config=True)
515 object_info_string_level = Enum((0,1,2), default_value=0,
517 object_info_string_level = Enum((0,1,2), default_value=0,
516 ).tag(config=True)
518 ).tag(config=True)
517 pdb = Bool(False, help=
519 pdb = Bool(False, help=
518 """
520 """
519 Automatically call the pdb debugger after every exception.
521 Automatically call the pdb debugger after every exception.
520 """
522 """
521 ).tag(config=True)
523 ).tag(config=True)
522 display_page = Bool(False,
524 display_page = Bool(False,
523 help="""If True, anything that would be passed to the pager
525 help="""If True, anything that would be passed to the pager
524 will be displayed as regular output instead."""
526 will be displayed as regular output instead."""
525 ).tag(config=True)
527 ).tag(config=True)
526
528
527
529
528 show_rewritten_input = Bool(True,
530 show_rewritten_input = Bool(True,
529 help="Show rewritten input, e.g. for autocall."
531 help="Show rewritten input, e.g. for autocall."
530 ).tag(config=True)
532 ).tag(config=True)
531
533
532 quiet = Bool(False).tag(config=True)
534 quiet = Bool(False).tag(config=True)
533
535
534 history_length = Integer(10000,
536 history_length = Integer(10000,
535 help='Total length of command history'
537 help='Total length of command history'
536 ).tag(config=True)
538 ).tag(config=True)
537
539
538 history_load_length = Integer(1000, help=
540 history_load_length = Integer(1000, help=
539 """
541 """
540 The number of saved history entries to be loaded
542 The number of saved history entries to be loaded
541 into the history buffer at startup.
543 into the history buffer at startup.
542 """
544 """
543 ).tag(config=True)
545 ).tag(config=True)
544
546
545 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none', 'last_expr_or_assign'],
547 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none', 'last_expr_or_assign'],
546 default_value='last_expr',
548 default_value='last_expr',
547 help="""
549 help="""
548 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying
550 'all', 'last', 'last_expr' or 'none', 'last_expr_or_assign' specifying
549 which nodes should be run interactively (displaying output from expressions).
551 which nodes should be run interactively (displaying output from expressions).
550 """
552 """
551 ).tag(config=True)
553 ).tag(config=True)
552
554
553 warn_venv = Bool(
555 warn_venv = Bool(
554 True,
556 True,
555 help="Warn if running in a virtual environment with no IPython installed (so IPython from the global environment is used).",
557 help="Warn if running in a virtual environment with no IPython installed (so IPython from the global environment is used).",
556 ).tag(config=True)
558 ).tag(config=True)
557
559
558 # TODO: this part of prompt management should be moved to the frontends.
560 # TODO: this part of prompt management should be moved to the frontends.
559 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
561 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
560 separate_in = SeparateUnicode('\n').tag(config=True)
562 separate_in = SeparateUnicode('\n').tag(config=True)
561 separate_out = SeparateUnicode('').tag(config=True)
563 separate_out = SeparateUnicode('').tag(config=True)
562 separate_out2 = SeparateUnicode('').tag(config=True)
564 separate_out2 = SeparateUnicode('').tag(config=True)
563 wildcards_case_sensitive = Bool(True).tag(config=True)
565 wildcards_case_sensitive = Bool(True).tag(config=True)
564 xmode = CaselessStrEnum(('Context', 'Plain', 'Verbose', 'Minimal'),
566 xmode = CaselessStrEnum(('Context', 'Plain', 'Verbose', 'Minimal'),
565 default_value='Context',
567 default_value='Context',
566 help="Switch modes for the IPython exception handlers."
568 help="Switch modes for the IPython exception handlers."
567 ).tag(config=True)
569 ).tag(config=True)
568
570
569 # Subcomponents of InteractiveShell
571 # Subcomponents of InteractiveShell
570 alias_manager = Instance("IPython.core.alias.AliasManager", allow_none=True)
572 alias_manager = Instance("IPython.core.alias.AliasManager", allow_none=True)
571 prefilter_manager = Instance(
573 prefilter_manager = Instance(
572 "IPython.core.prefilter.PrefilterManager", allow_none=True
574 "IPython.core.prefilter.PrefilterManager", allow_none=True
573 )
575 )
574 builtin_trap = Instance("IPython.core.builtin_trap.BuiltinTrap")
576 builtin_trap = Instance("IPython.core.builtin_trap.BuiltinTrap")
575 display_trap = Instance("IPython.core.display_trap.DisplayTrap")
577 display_trap = Instance("IPython.core.display_trap.DisplayTrap")
576 extension_manager = Instance(
578 extension_manager = Instance(
577 "IPython.core.extensions.ExtensionManager", allow_none=True
579 "IPython.core.extensions.ExtensionManager", allow_none=True
578 )
580 )
579 payload_manager = Instance("IPython.core.payload.PayloadManager", allow_none=True)
581 payload_manager = Instance("IPython.core.payload.PayloadManager", allow_none=True)
580 history_manager = Instance(
582 history_manager = Instance(
581 "IPython.core.history.HistoryAccessorBase", allow_none=True
583 "IPython.core.history.HistoryAccessorBase", allow_none=True
582 )
584 )
583 magics_manager = Instance("IPython.core.magic.MagicsManager")
585 magics_manager = Instance("IPython.core.magic.MagicsManager")
584
586
585 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
587 profile_dir = Instance('IPython.core.application.ProfileDir', allow_none=True)
586 @property
588 @property
587 def profile(self):
589 def profile(self):
588 if self.profile_dir is not None:
590 if self.profile_dir is not None:
589 name = os.path.basename(self.profile_dir.location)
591 name = os.path.basename(self.profile_dir.location)
590 return name.replace('profile_','')
592 return name.replace('profile_','')
591
593
592
594
593 # Private interface
595 # Private interface
594 _post_execute = Dict()
596 _post_execute = Dict()
595
597
596 # Tracks any GUI loop loaded for pylab
598 # Tracks any GUI loop loaded for pylab
597 pylab_gui_select = None
599 pylab_gui_select = None
598
600
599 last_execution_succeeded = Bool(True, help='Did last executed command succeeded')
601 last_execution_succeeded = Bool(True, help='Did last executed command succeeded')
600
602
601 last_execution_result = Instance('IPython.core.interactiveshell.ExecutionResult', help='Result of executing the last command', allow_none=True)
603 last_execution_result = Instance('IPython.core.interactiveshell.ExecutionResult', help='Result of executing the last command', allow_none=True)
602
604
603 def __init__(self, ipython_dir=None, profile_dir=None,
605 def __init__(self, ipython_dir=None, profile_dir=None,
604 user_module=None, user_ns=None,
606 user_module=None, user_ns=None,
605 custom_exceptions=((), None), **kwargs):
607 custom_exceptions=((), None), **kwargs):
606 # This is where traits with a config_key argument are updated
608 # This is where traits with a config_key argument are updated
607 # from the values on config.
609 # from the values on config.
608 super(InteractiveShell, self).__init__(**kwargs)
610 super(InteractiveShell, self).__init__(**kwargs)
609 if 'PromptManager' in self.config:
611 if 'PromptManager' in self.config:
610 warn('As of IPython 5.0 `PromptManager` config will have no effect'
612 warn('As of IPython 5.0 `PromptManager` config will have no effect'
611 ' and has been replaced by TerminalInteractiveShell.prompts_class')
613 ' and has been replaced by TerminalInteractiveShell.prompts_class')
612 self.configurables = [self]
614 self.configurables = [self]
613
615
614 # These are relatively independent and stateless
616 # These are relatively independent and stateless
615 self.init_ipython_dir(ipython_dir)
617 self.init_ipython_dir(ipython_dir)
616 self.init_profile_dir(profile_dir)
618 self.init_profile_dir(profile_dir)
617 self.init_instance_attrs()
619 self.init_instance_attrs()
618 self.init_environment()
620 self.init_environment()
619
621
620 # Check if we're in a virtualenv, and set up sys.path.
622 # Check if we're in a virtualenv, and set up sys.path.
621 self.init_virtualenv()
623 self.init_virtualenv()
622
624
623 # Create namespaces (user_ns, user_global_ns, etc.)
625 # Create namespaces (user_ns, user_global_ns, etc.)
624 self.init_create_namespaces(user_module, user_ns)
626 self.init_create_namespaces(user_module, user_ns)
625 # This has to be done after init_create_namespaces because it uses
627 # This has to be done after init_create_namespaces because it uses
626 # something in self.user_ns, but before init_sys_modules, which
628 # something in self.user_ns, but before init_sys_modules, which
627 # is the first thing to modify sys.
629 # is the first thing to modify sys.
628 # TODO: When we override sys.stdout and sys.stderr before this class
630 # TODO: When we override sys.stdout and sys.stderr before this class
629 # is created, we are saving the overridden ones here. Not sure if this
631 # is created, we are saving the overridden ones here. Not sure if this
630 # is what we want to do.
632 # is what we want to do.
631 self.save_sys_module_state()
633 self.save_sys_module_state()
632 self.init_sys_modules()
634 self.init_sys_modules()
633
635
634 # While we're trying to have each part of the code directly access what
636 # While we're trying to have each part of the code directly access what
635 # it needs without keeping redundant references to objects, we have too
637 # it needs without keeping redundant references to objects, we have too
636 # much legacy code that expects ip.db to exist.
638 # much legacy code that expects ip.db to exist.
637 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
639 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
638
640
639 self.init_history()
641 self.init_history()
640 self.init_encoding()
642 self.init_encoding()
641 self.init_prefilter()
643 self.init_prefilter()
642
644
643 self.init_syntax_highlighting()
645 self.init_syntax_highlighting()
644 self.init_hooks()
646 self.init_hooks()
645 self.init_events()
647 self.init_events()
646 self.init_pushd_popd_magic()
648 self.init_pushd_popd_magic()
647 self.init_user_ns()
649 self.init_user_ns()
648 self.init_logger()
650 self.init_logger()
649 self.init_builtins()
651 self.init_builtins()
650
652
651 # The following was in post_config_initialization
653 # The following was in post_config_initialization
652 self.init_inspector()
654 self.init_inspector()
653 self.raw_input_original = input
655 self.raw_input_original = input
654 self.init_completer()
656 self.init_completer()
655 # TODO: init_io() needs to happen before init_traceback handlers
657 # TODO: init_io() needs to happen before init_traceback handlers
656 # because the traceback handlers hardcode the stdout/stderr streams.
658 # because the traceback handlers hardcode the stdout/stderr streams.
657 # This logic in in debugger.Pdb and should eventually be changed.
659 # This logic in in debugger.Pdb and should eventually be changed.
658 self.init_io()
660 self.init_io()
659 self.init_traceback_handlers(custom_exceptions)
661 self.init_traceback_handlers(custom_exceptions)
660 self.init_prompts()
662 self.init_prompts()
661 self.init_display_formatter()
663 self.init_display_formatter()
662 self.init_display_pub()
664 self.init_display_pub()
663 self.init_data_pub()
665 self.init_data_pub()
664 self.init_displayhook()
666 self.init_displayhook()
665 self.init_magics()
667 self.init_magics()
666 self.init_alias()
668 self.init_alias()
667 self.init_logstart()
669 self.init_logstart()
668 self.init_pdb()
670 self.init_pdb()
669 self.init_extension_manager()
671 self.init_extension_manager()
670 self.init_payload()
672 self.init_payload()
671 self.events.trigger('shell_initialized', self)
673 self.events.trigger('shell_initialized', self)
672 atexit.register(self.atexit_operations)
674 atexit.register(self.atexit_operations)
673
675
674 # The trio runner is used for running Trio in the foreground thread. It
676 # The trio runner is used for running Trio in the foreground thread. It
675 # is different from `_trio_runner(async_fn)` in `async_helpers.py`
677 # is different from `_trio_runner(async_fn)` in `async_helpers.py`
676 # which calls `trio.run()` for every cell. This runner runs all cells
678 # which calls `trio.run()` for every cell. This runner runs all cells
677 # inside a single Trio event loop. If used, it is set from
679 # inside a single Trio event loop. If used, it is set from
678 # `ipykernel.kernelapp`.
680 # `ipykernel.kernelapp`.
679 self.trio_runner = None
681 self.trio_runner = None
680
682
681 def get_ipython(self):
683 def get_ipython(self):
682 """Return the currently running IPython instance."""
684 """Return the currently running IPython instance."""
683 return self
685 return self
684
686
685 #-------------------------------------------------------------------------
687 #-------------------------------------------------------------------------
686 # Trait changed handlers
688 # Trait changed handlers
687 #-------------------------------------------------------------------------
689 #-------------------------------------------------------------------------
688 @observe('ipython_dir')
690 @observe('ipython_dir')
689 def _ipython_dir_changed(self, change):
691 def _ipython_dir_changed(self, change):
690 ensure_dir_exists(change['new'])
692 ensure_dir_exists(change['new'])
691
693
692 def set_autoindent(self,value=None):
694 def set_autoindent(self,value=None):
693 """Set the autoindent flag.
695 """Set the autoindent flag.
694
696
695 If called with no arguments, it acts as a toggle."""
697 If called with no arguments, it acts as a toggle."""
696 if value is None:
698 if value is None:
697 self.autoindent = not self.autoindent
699 self.autoindent = not self.autoindent
698 else:
700 else:
699 self.autoindent = value
701 self.autoindent = value
700
702
701 def set_trio_runner(self, tr):
703 def set_trio_runner(self, tr):
702 self.trio_runner = tr
704 self.trio_runner = tr
703
705
704 #-------------------------------------------------------------------------
706 #-------------------------------------------------------------------------
705 # init_* methods called by __init__
707 # init_* methods called by __init__
706 #-------------------------------------------------------------------------
708 #-------------------------------------------------------------------------
707
709
708 def init_ipython_dir(self, ipython_dir):
710 def init_ipython_dir(self, ipython_dir):
709 if ipython_dir is not None:
711 if ipython_dir is not None:
710 self.ipython_dir = ipython_dir
712 self.ipython_dir = ipython_dir
711 return
713 return
712
714
713 self.ipython_dir = get_ipython_dir()
715 self.ipython_dir = get_ipython_dir()
714
716
715 def init_profile_dir(self, profile_dir):
717 def init_profile_dir(self, profile_dir):
716 if profile_dir is not None:
718 if profile_dir is not None:
717 self.profile_dir = profile_dir
719 self.profile_dir = profile_dir
718 return
720 return
719 self.profile_dir = ProfileDir.create_profile_dir_by_name(
721 self.profile_dir = ProfileDir.create_profile_dir_by_name(
720 self.ipython_dir, "default"
722 self.ipython_dir, "default"
721 )
723 )
722
724
723 def init_instance_attrs(self):
725 def init_instance_attrs(self):
724 self.more = False
726 self.more = False
725
727
726 # command compiler
728 # command compiler
727 self.compile = self.compiler_class()
729 self.compile = self.compiler_class()
728
730
729 # Make an empty namespace, which extension writers can rely on both
731 # Make an empty namespace, which extension writers can rely on both
730 # existing and NEVER being used by ipython itself. This gives them a
732 # existing and NEVER being used by ipython itself. This gives them a
731 # convenient location for storing additional information and state
733 # convenient location for storing additional information and state
732 # their extensions may require, without fear of collisions with other
734 # their extensions may require, without fear of collisions with other
733 # ipython names that may develop later.
735 # ipython names that may develop later.
734 self.meta = Struct()
736 self.meta = Struct()
735
737
736 # Temporary files used for various purposes. Deleted at exit.
738 # Temporary files used for various purposes. Deleted at exit.
737 # The files here are stored with Path from Pathlib
739 # The files here are stored with Path from Pathlib
738 self.tempfiles = []
740 self.tempfiles = []
739 self.tempdirs = []
741 self.tempdirs = []
740
742
741 # keep track of where we started running (mainly for crash post-mortem)
743 # keep track of where we started running (mainly for crash post-mortem)
742 # This is not being used anywhere currently.
744 # This is not being used anywhere currently.
743 self.starting_dir = os.getcwd()
745 self.starting_dir = os.getcwd()
744
746
745 # Indentation management
747 # Indentation management
746 self.indent_current_nsp = 0
748 self.indent_current_nsp = 0
747
749
748 # Dict to track post-execution functions that have been registered
750 # Dict to track post-execution functions that have been registered
749 self._post_execute = {}
751 self._post_execute = {}
750
752
751 def init_environment(self):
753 def init_environment(self):
752 """Any changes we need to make to the user's environment."""
754 """Any changes we need to make to the user's environment."""
753 pass
755 pass
754
756
755 def init_encoding(self):
757 def init_encoding(self):
756 # Get system encoding at startup time. Certain terminals (like Emacs
758 # Get system encoding at startup time. Certain terminals (like Emacs
757 # under Win32 have it set to None, and we need to have a known valid
759 # under Win32 have it set to None, and we need to have a known valid
758 # encoding to use in the raw_input() method
760 # encoding to use in the raw_input() method
759 try:
761 try:
760 self.stdin_encoding = sys.stdin.encoding or 'ascii'
762 self.stdin_encoding = sys.stdin.encoding or 'ascii'
761 except AttributeError:
763 except AttributeError:
762 self.stdin_encoding = 'ascii'
764 self.stdin_encoding = 'ascii'
763
765
764
766
765 @observe('colors')
767 @observe('colors')
766 def init_syntax_highlighting(self, changes=None):
768 def init_syntax_highlighting(self, changes=None):
767 # Python source parser/formatter for syntax highlighting
769 # Python source parser/formatter for syntax highlighting
768 pyformat = PyColorize.Parser(style=self.colors, parent=self).format
770 pyformat = PyColorize.Parser(style=self.colors, parent=self).format
769 self.pycolorize = lambda src: pyformat(src,'str')
771 self.pycolorize = lambda src: pyformat(src,'str')
770
772
771 def refresh_style(self):
773 def refresh_style(self):
772 # No-op here, used in subclass
774 # No-op here, used in subclass
773 pass
775 pass
774
776
775 def init_pushd_popd_magic(self):
777 def init_pushd_popd_magic(self):
776 # for pushd/popd management
778 # for pushd/popd management
777 self.home_dir = get_home_dir()
779 self.home_dir = get_home_dir()
778
780
779 self.dir_stack = []
781 self.dir_stack = []
780
782
781 def init_logger(self):
783 def init_logger(self):
782 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
784 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
783 logmode='rotate')
785 logmode='rotate')
784
786
785 def init_logstart(self):
787 def init_logstart(self):
786 """Initialize logging in case it was requested at the command line.
788 """Initialize logging in case it was requested at the command line.
787 """
789 """
788 if self.logappend:
790 if self.logappend:
789 self.magic('logstart %s append' % self.logappend)
791 self.magic('logstart %s append' % self.logappend)
790 elif self.logfile:
792 elif self.logfile:
791 self.magic('logstart %s' % self.logfile)
793 self.magic('logstart %s' % self.logfile)
792 elif self.logstart:
794 elif self.logstart:
793 self.magic('logstart')
795 self.magic('logstart')
794
796
795
797
796 def init_builtins(self):
798 def init_builtins(self):
797 # A single, static flag that we set to True. Its presence indicates
799 # A single, static flag that we set to True. Its presence indicates
798 # that an IPython shell has been created, and we make no attempts at
800 # that an IPython shell has been created, and we make no attempts at
799 # removing on exit or representing the existence of more than one
801 # removing on exit or representing the existence of more than one
800 # IPython at a time.
802 # IPython at a time.
801 builtin_mod.__dict__['__IPYTHON__'] = True
803 builtin_mod.__dict__['__IPYTHON__'] = True
802 builtin_mod.__dict__['display'] = display
804 builtin_mod.__dict__['display'] = display
803
805
804 self.builtin_trap = BuiltinTrap(shell=self)
806 self.builtin_trap = BuiltinTrap(shell=self)
805
807
806 @observe('colors')
808 @observe('colors')
807 def init_inspector(self, changes=None):
809 def init_inspector(self, changes=None):
808 # Object inspector
810 # Object inspector
809 self.inspector = self.inspector_class(
811 self.inspector = self.inspector_class(
810 oinspect.InspectColors,
812 oinspect.InspectColors,
811 PyColorize.ANSICodeColors,
813 PyColorize.ANSICodeColors,
812 self.colors,
814 self.colors,
813 self.object_info_string_level,
815 self.object_info_string_level,
814 )
816 )
815
817
816 def init_io(self):
818 def init_io(self):
817 # implemented in subclasses, TerminalInteractiveShell does call
819 # implemented in subclasses, TerminalInteractiveShell does call
818 # colorama.init().
820 # colorama.init().
819 pass
821 pass
820
822
821 def init_prompts(self):
823 def init_prompts(self):
822 # Set system prompts, so that scripts can decide if they are running
824 # Set system prompts, so that scripts can decide if they are running
823 # interactively.
825 # interactively.
824 sys.ps1 = 'In : '
826 sys.ps1 = 'In : '
825 sys.ps2 = '...: '
827 sys.ps2 = '...: '
826 sys.ps3 = 'Out: '
828 sys.ps3 = 'Out: '
827
829
828 def init_display_formatter(self):
830 def init_display_formatter(self):
829 self.display_formatter = DisplayFormatter(parent=self)
831 self.display_formatter = DisplayFormatter(parent=self)
830 self.configurables.append(self.display_formatter)
832 self.configurables.append(self.display_formatter)
831
833
832 def init_display_pub(self):
834 def init_display_pub(self):
833 self.display_pub = self.display_pub_class(parent=self, shell=self)
835 self.display_pub = self.display_pub_class(parent=self, shell=self)
834 self.configurables.append(self.display_pub)
836 self.configurables.append(self.display_pub)
835
837
836 def init_data_pub(self):
838 def init_data_pub(self):
837 if not self.data_pub_class:
839 if not self.data_pub_class:
838 self.data_pub = None
840 self.data_pub = None
839 return
841 return
840 self.data_pub = self.data_pub_class(parent=self)
842 self.data_pub = self.data_pub_class(parent=self)
841 self.configurables.append(self.data_pub)
843 self.configurables.append(self.data_pub)
842
844
843 def init_displayhook(self):
845 def init_displayhook(self):
844 # Initialize displayhook, set in/out prompts and printing system
846 # Initialize displayhook, set in/out prompts and printing system
845 self.displayhook = self.displayhook_class(
847 self.displayhook = self.displayhook_class(
846 parent=self,
848 parent=self,
847 shell=self,
849 shell=self,
848 cache_size=self.cache_size,
850 cache_size=self.cache_size,
849 )
851 )
850 self.configurables.append(self.displayhook)
852 self.configurables.append(self.displayhook)
851 # This is a context manager that installs/revmoes the displayhook at
853 # This is a context manager that installs/revmoes the displayhook at
852 # the appropriate time.
854 # the appropriate time.
853 self.display_trap = DisplayTrap(hook=self.displayhook)
855 self.display_trap = DisplayTrap(hook=self.displayhook)
854
856
855 @staticmethod
857 @staticmethod
856 def get_path_links(p: Path):
858 def get_path_links(p: Path):
857 """Gets path links including all symlinks
859 """Gets path links including all symlinks
858
860
859 Examples
861 Examples
860 --------
862 --------
861 In [1]: from IPython.core.interactiveshell import InteractiveShell
863 In [1]: from IPython.core.interactiveshell import InteractiveShell
862
864
863 In [2]: import sys, pathlib
865 In [2]: import sys, pathlib
864
866
865 In [3]: paths = InteractiveShell.get_path_links(pathlib.Path(sys.executable))
867 In [3]: paths = InteractiveShell.get_path_links(pathlib.Path(sys.executable))
866
868
867 In [4]: len(paths) == len(set(paths))
869 In [4]: len(paths) == len(set(paths))
868 Out[4]: True
870 Out[4]: True
869
871
870 In [5]: bool(paths)
872 In [5]: bool(paths)
871 Out[5]: True
873 Out[5]: True
872 """
874 """
873 paths = [p]
875 paths = [p]
874 while p.is_symlink():
876 while p.is_symlink():
875 new_path = Path(os.readlink(p))
877 new_path = Path(os.readlink(p))
876 if not new_path.is_absolute():
878 if not new_path.is_absolute():
877 new_path = p.parent / new_path
879 new_path = p.parent / new_path
878 p = new_path
880 p = new_path
879 paths.append(p)
881 paths.append(p)
880 return paths
882 return paths
881
883
882 def init_virtualenv(self):
884 def init_virtualenv(self):
883 """Add the current virtualenv to sys.path so the user can import modules from it.
885 """Add the current virtualenv to sys.path so the user can import modules from it.
884 This isn't perfect: it doesn't use the Python interpreter with which the
886 This isn't perfect: it doesn't use the Python interpreter with which the
885 virtualenv was built, and it ignores the --no-site-packages option. A
887 virtualenv was built, and it ignores the --no-site-packages option. A
886 warning will appear suggesting the user installs IPython in the
888 warning will appear suggesting the user installs IPython in the
887 virtualenv, but for many cases, it probably works well enough.
889 virtualenv, but for many cases, it probably works well enough.
888
890
889 Adapted from code snippets online.
891 Adapted from code snippets online.
890
892
891 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
893 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
892 """
894 """
893 if 'VIRTUAL_ENV' not in os.environ:
895 if 'VIRTUAL_ENV' not in os.environ:
894 # Not in a virtualenv
896 # Not in a virtualenv
895 return
897 return
896 elif os.environ["VIRTUAL_ENV"] == "":
898 elif os.environ["VIRTUAL_ENV"] == "":
897 warn("Virtual env path set to '', please check if this is intended.")
899 warn("Virtual env path set to '', please check if this is intended.")
898 return
900 return
899
901
900 p = Path(sys.executable)
902 p = Path(sys.executable)
901 p_venv = Path(os.environ["VIRTUAL_ENV"])
903 p_venv = Path(os.environ["VIRTUAL_ENV"])
902
904
903 # fallback venv detection:
905 # fallback venv detection:
904 # stdlib venv may symlink sys.executable, so we can't use realpath.
906 # stdlib venv may symlink sys.executable, so we can't use realpath.
905 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
907 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
906 # So we just check every item in the symlink tree (generally <= 3)
908 # So we just check every item in the symlink tree (generally <= 3)
907 paths = self.get_path_links(p)
909 paths = self.get_path_links(p)
908
910
909 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible
911 # In Cygwin paths like "c:\..." and '\cygdrive\c\...' are possible
910 if p_venv.parts[1] == "cygdrive":
912 if p_venv.parts[1] == "cygdrive":
911 drive_name = p_venv.parts[2]
913 drive_name = p_venv.parts[2]
912 p_venv = (drive_name + ":/") / Path(*p_venv.parts[3:])
914 p_venv = (drive_name + ":/") / Path(*p_venv.parts[3:])
913
915
914 if any(p_venv == p.parents[1] for p in paths):
916 if any(p_venv == p.parents[1] for p in paths):
915 # Our exe is inside or has access to the virtualenv, don't need to do anything.
917 # Our exe is inside or has access to the virtualenv, don't need to do anything.
916 return
918 return
917
919
918 if sys.platform == "win32":
920 if sys.platform == "win32":
919 virtual_env = str(Path(os.environ["VIRTUAL_ENV"], "Lib", "site-packages"))
921 virtual_env = str(Path(os.environ["VIRTUAL_ENV"], "Lib", "site-packages"))
920 else:
922 else:
921 virtual_env_path = Path(
923 virtual_env_path = Path(
922 os.environ["VIRTUAL_ENV"], "lib", "python{}.{}", "site-packages"
924 os.environ["VIRTUAL_ENV"], "lib", "python{}.{}", "site-packages"
923 )
925 )
924 p_ver = sys.version_info[:2]
926 p_ver = sys.version_info[:2]
925
927
926 # Predict version from py[thon]-x.x in the $VIRTUAL_ENV
928 # Predict version from py[thon]-x.x in the $VIRTUAL_ENV
927 re_m = re.search(r"\bpy(?:thon)?([23])\.(\d+)\b", os.environ["VIRTUAL_ENV"])
929 re_m = re.search(r"\bpy(?:thon)?([23])\.(\d+)\b", os.environ["VIRTUAL_ENV"])
928 if re_m:
930 if re_m:
929 predicted_path = Path(str(virtual_env_path).format(*re_m.groups()))
931 predicted_path = Path(str(virtual_env_path).format(*re_m.groups()))
930 if predicted_path.exists():
932 if predicted_path.exists():
931 p_ver = re_m.groups()
933 p_ver = re_m.groups()
932
934
933 virtual_env = str(virtual_env_path).format(*p_ver)
935 virtual_env = str(virtual_env_path).format(*p_ver)
934 if self.warn_venv:
936 if self.warn_venv:
935 warn(
937 warn(
936 "Attempting to work in a virtualenv. If you encounter problems, "
938 "Attempting to work in a virtualenv. If you encounter problems, "
937 "please install IPython inside the virtualenv."
939 "please install IPython inside the virtualenv."
938 )
940 )
939 import site
941 import site
940 sys.path.insert(0, virtual_env)
942 sys.path.insert(0, virtual_env)
941 site.addsitedir(virtual_env)
943 site.addsitedir(virtual_env)
942
944
943 #-------------------------------------------------------------------------
945 #-------------------------------------------------------------------------
944 # Things related to injections into the sys module
946 # Things related to injections into the sys module
945 #-------------------------------------------------------------------------
947 #-------------------------------------------------------------------------
946
948
947 def save_sys_module_state(self):
949 def save_sys_module_state(self):
948 """Save the state of hooks in the sys module.
950 """Save the state of hooks in the sys module.
949
951
950 This has to be called after self.user_module is created.
952 This has to be called after self.user_module is created.
951 """
953 """
952 self._orig_sys_module_state = {'stdin': sys.stdin,
954 self._orig_sys_module_state = {'stdin': sys.stdin,
953 'stdout': sys.stdout,
955 'stdout': sys.stdout,
954 'stderr': sys.stderr,
956 'stderr': sys.stderr,
955 'excepthook': sys.excepthook}
957 'excepthook': sys.excepthook}
956 self._orig_sys_modules_main_name = self.user_module.__name__
958 self._orig_sys_modules_main_name = self.user_module.__name__
957 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
959 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
958
960
959 def restore_sys_module_state(self):
961 def restore_sys_module_state(self):
960 """Restore the state of the sys module."""
962 """Restore the state of the sys module."""
961 try:
963 try:
962 for k, v in self._orig_sys_module_state.items():
964 for k, v in self._orig_sys_module_state.items():
963 setattr(sys, k, v)
965 setattr(sys, k, v)
964 except AttributeError:
966 except AttributeError:
965 pass
967 pass
966 # Reset what what done in self.init_sys_modules
968 # Reset what what done in self.init_sys_modules
967 if self._orig_sys_modules_main_mod is not None:
969 if self._orig_sys_modules_main_mod is not None:
968 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
970 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
969
971
970 #-------------------------------------------------------------------------
972 #-------------------------------------------------------------------------
971 # Things related to the banner
973 # Things related to the banner
972 #-------------------------------------------------------------------------
974 #-------------------------------------------------------------------------
973
975
974 @property
976 @property
975 def banner(self):
977 def banner(self):
976 banner = self.banner1
978 banner = self.banner1
977 if self.profile and self.profile != 'default':
979 if self.profile and self.profile != 'default':
978 banner += '\nIPython profile: %s\n' % self.profile
980 banner += '\nIPython profile: %s\n' % self.profile
979 if self.banner2:
981 if self.banner2:
980 banner += '\n' + self.banner2
982 banner += '\n' + self.banner2
981 return banner
983 return banner
982
984
983 def show_banner(self, banner=None):
985 def show_banner(self, banner=None):
984 if banner is None:
986 if banner is None:
985 banner = self.banner
987 banner = self.banner
986 sys.stdout.write(banner)
988 sys.stdout.write(banner)
987
989
988 #-------------------------------------------------------------------------
990 #-------------------------------------------------------------------------
989 # Things related to hooks
991 # Things related to hooks
990 #-------------------------------------------------------------------------
992 #-------------------------------------------------------------------------
991
993
992 def init_hooks(self):
994 def init_hooks(self):
993 # hooks holds pointers used for user-side customizations
995 # hooks holds pointers used for user-side customizations
994 self.hooks = Struct()
996 self.hooks = Struct()
995
997
996 self.strdispatchers = {}
998 self.strdispatchers = {}
997
999
998 # Set all default hooks, defined in the IPython.hooks module.
1000 # Set all default hooks, defined in the IPython.hooks module.
999 hooks = IPython.core.hooks
1001 hooks = IPython.core.hooks
1000 for hook_name in hooks.__all__:
1002 for hook_name in hooks.__all__:
1001 # default hooks have priority 100, i.e. low; user hooks should have
1003 # default hooks have priority 100, i.e. low; user hooks should have
1002 # 0-100 priority
1004 # 0-100 priority
1003 self.set_hook(hook_name, getattr(hooks, hook_name), 100)
1005 self.set_hook(hook_name, getattr(hooks, hook_name), 100)
1004
1006
1005 if self.display_page:
1007 if self.display_page:
1006 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
1008 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
1007
1009
1008 def set_hook(self, name, hook, priority=50, str_key=None, re_key=None):
1010 def set_hook(self, name, hook, priority=50, str_key=None, re_key=None):
1009 """set_hook(name,hook) -> sets an internal IPython hook.
1011 """set_hook(name,hook) -> sets an internal IPython hook.
1010
1012
1011 IPython exposes some of its internal API as user-modifiable hooks. By
1013 IPython exposes some of its internal API as user-modifiable hooks. By
1012 adding your function to one of these hooks, you can modify IPython's
1014 adding your function to one of these hooks, you can modify IPython's
1013 behavior to call at runtime your own routines."""
1015 behavior to call at runtime your own routines."""
1014
1016
1015 # At some point in the future, this should validate the hook before it
1017 # At some point in the future, this should validate the hook before it
1016 # accepts it. Probably at least check that the hook takes the number
1018 # accepts it. Probably at least check that the hook takes the number
1017 # of args it's supposed to.
1019 # of args it's supposed to.
1018
1020
1019 f = types.MethodType(hook,self)
1021 f = types.MethodType(hook,self)
1020
1022
1021 # check if the hook is for strdispatcher first
1023 # check if the hook is for strdispatcher first
1022 if str_key is not None:
1024 if str_key is not None:
1023 sdp = self.strdispatchers.get(name, StrDispatch())
1025 sdp = self.strdispatchers.get(name, StrDispatch())
1024 sdp.add_s(str_key, f, priority )
1026 sdp.add_s(str_key, f, priority )
1025 self.strdispatchers[name] = sdp
1027 self.strdispatchers[name] = sdp
1026 return
1028 return
1027 if re_key is not None:
1029 if re_key is not None:
1028 sdp = self.strdispatchers.get(name, StrDispatch())
1030 sdp = self.strdispatchers.get(name, StrDispatch())
1029 sdp.add_re(re.compile(re_key), f, priority )
1031 sdp.add_re(re.compile(re_key), f, priority )
1030 self.strdispatchers[name] = sdp
1032 self.strdispatchers[name] = sdp
1031 return
1033 return
1032
1034
1033 dp = getattr(self.hooks, name, None)
1035 dp = getattr(self.hooks, name, None)
1034 if name not in IPython.core.hooks.__all__:
1036 if name not in IPython.core.hooks.__all__:
1035 print("Warning! Hook '%s' is not one of %s" % \
1037 print("Warning! Hook '%s' is not one of %s" % \
1036 (name, IPython.core.hooks.__all__ ))
1038 (name, IPython.core.hooks.__all__ ))
1037
1039
1038 if name in IPython.core.hooks.deprecated:
1040 if name in IPython.core.hooks.deprecated:
1039 alternative = IPython.core.hooks.deprecated[name]
1041 alternative = IPython.core.hooks.deprecated[name]
1040 raise ValueError(
1042 raise ValueError(
1041 "Hook {} has been deprecated since IPython 5.0. Use {} instead.".format(
1043 "Hook {} has been deprecated since IPython 5.0. Use {} instead.".format(
1042 name, alternative
1044 name, alternative
1043 )
1045 )
1044 )
1046 )
1045
1047
1046 if not dp:
1048 if not dp:
1047 dp = IPython.core.hooks.CommandChainDispatcher()
1049 dp = IPython.core.hooks.CommandChainDispatcher()
1048
1050
1049 try:
1051 try:
1050 dp.add(f,priority)
1052 dp.add(f,priority)
1051 except AttributeError:
1053 except AttributeError:
1052 # it was not commandchain, plain old func - replace
1054 # it was not commandchain, plain old func - replace
1053 dp = f
1055 dp = f
1054
1056
1055 setattr(self.hooks,name, dp)
1057 setattr(self.hooks,name, dp)
1056
1058
1057 #-------------------------------------------------------------------------
1059 #-------------------------------------------------------------------------
1058 # Things related to events
1060 # Things related to events
1059 #-------------------------------------------------------------------------
1061 #-------------------------------------------------------------------------
1060
1062
1061 def init_events(self):
1063 def init_events(self):
1062 self.events = EventManager(self, available_events)
1064 self.events = EventManager(self, available_events)
1063
1065
1064 self.events.register("pre_execute", self._clear_warning_registry)
1066 self.events.register("pre_execute", self._clear_warning_registry)
1065
1067
1066 def register_post_execute(self, func):
1068 def register_post_execute(self, func):
1067 """DEPRECATED: Use ip.events.register('post_run_cell', func)
1069 """DEPRECATED: Use ip.events.register('post_run_cell', func)
1068
1070
1069 Register a function for calling after code execution.
1071 Register a function for calling after code execution.
1070 """
1072 """
1071 raise ValueError(
1073 raise ValueError(
1072 "ip.register_post_execute is deprecated since IPython 1.0, use "
1074 "ip.register_post_execute is deprecated since IPython 1.0, use "
1073 "ip.events.register('post_run_cell', func) instead."
1075 "ip.events.register('post_run_cell', func) instead."
1074 )
1076 )
1075
1077
1076 def _clear_warning_registry(self):
1078 def _clear_warning_registry(self):
1077 # clear the warning registry, so that different code blocks with
1079 # clear the warning registry, so that different code blocks with
1078 # overlapping line number ranges don't cause spurious suppression of
1080 # overlapping line number ranges don't cause spurious suppression of
1079 # warnings (see gh-6611 for details)
1081 # warnings (see gh-6611 for details)
1080 if "__warningregistry__" in self.user_global_ns:
1082 if "__warningregistry__" in self.user_global_ns:
1081 del self.user_global_ns["__warningregistry__"]
1083 del self.user_global_ns["__warningregistry__"]
1082
1084
1083 #-------------------------------------------------------------------------
1085 #-------------------------------------------------------------------------
1084 # Things related to the "main" module
1086 # Things related to the "main" module
1085 #-------------------------------------------------------------------------
1087 #-------------------------------------------------------------------------
1086
1088
1087 def new_main_mod(self, filename, modname):
1089 def new_main_mod(self, filename, modname):
1088 """Return a new 'main' module object for user code execution.
1090 """Return a new 'main' module object for user code execution.
1089
1091
1090 ``filename`` should be the path of the script which will be run in the
1092 ``filename`` should be the path of the script which will be run in the
1091 module. Requests with the same filename will get the same module, with
1093 module. Requests with the same filename will get the same module, with
1092 its namespace cleared.
1094 its namespace cleared.
1093
1095
1094 ``modname`` should be the module name - normally either '__main__' or
1096 ``modname`` should be the module name - normally either '__main__' or
1095 the basename of the file without the extension.
1097 the basename of the file without the extension.
1096
1098
1097 When scripts are executed via %run, we must keep a reference to their
1099 When scripts are executed via %run, we must keep a reference to their
1098 __main__ module around so that Python doesn't
1100 __main__ module around so that Python doesn't
1099 clear it, rendering references to module globals useless.
1101 clear it, rendering references to module globals useless.
1100
1102
1101 This method keeps said reference in a private dict, keyed by the
1103 This method keeps said reference in a private dict, keyed by the
1102 absolute path of the script. This way, for multiple executions of the
1104 absolute path of the script. This way, for multiple executions of the
1103 same script we only keep one copy of the namespace (the last one),
1105 same script we only keep one copy of the namespace (the last one),
1104 thus preventing memory leaks from old references while allowing the
1106 thus preventing memory leaks from old references while allowing the
1105 objects from the last execution to be accessible.
1107 objects from the last execution to be accessible.
1106 """
1108 """
1107 filename = os.path.abspath(filename)
1109 filename = os.path.abspath(filename)
1108 try:
1110 try:
1109 main_mod = self._main_mod_cache[filename]
1111 main_mod = self._main_mod_cache[filename]
1110 except KeyError:
1112 except KeyError:
1111 main_mod = self._main_mod_cache[filename] = types.ModuleType(
1113 main_mod = self._main_mod_cache[filename] = types.ModuleType(
1112 modname,
1114 modname,
1113 doc="Module created for script run in IPython")
1115 doc="Module created for script run in IPython")
1114 else:
1116 else:
1115 main_mod.__dict__.clear()
1117 main_mod.__dict__.clear()
1116 main_mod.__name__ = modname
1118 main_mod.__name__ = modname
1117
1119
1118 main_mod.__file__ = filename
1120 main_mod.__file__ = filename
1119 # It seems pydoc (and perhaps others) needs any module instance to
1121 # It seems pydoc (and perhaps others) needs any module instance to
1120 # implement a __nonzero__ method
1122 # implement a __nonzero__ method
1121 main_mod.__nonzero__ = lambda : True
1123 main_mod.__nonzero__ = lambda : True
1122
1124
1123 return main_mod
1125 return main_mod
1124
1126
1125 def clear_main_mod_cache(self):
1127 def clear_main_mod_cache(self):
1126 """Clear the cache of main modules.
1128 """Clear the cache of main modules.
1127
1129
1128 Mainly for use by utilities like %reset.
1130 Mainly for use by utilities like %reset.
1129
1131
1130 Examples
1132 Examples
1131 --------
1133 --------
1132 In [15]: import IPython
1134 In [15]: import IPython
1133
1135
1134 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
1136 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
1135
1137
1136 In [17]: len(_ip._main_mod_cache) > 0
1138 In [17]: len(_ip._main_mod_cache) > 0
1137 Out[17]: True
1139 Out[17]: True
1138
1140
1139 In [18]: _ip.clear_main_mod_cache()
1141 In [18]: _ip.clear_main_mod_cache()
1140
1142
1141 In [19]: len(_ip._main_mod_cache) == 0
1143 In [19]: len(_ip._main_mod_cache) == 0
1142 Out[19]: True
1144 Out[19]: True
1143 """
1145 """
1144 self._main_mod_cache.clear()
1146 self._main_mod_cache.clear()
1145
1147
1146 #-------------------------------------------------------------------------
1148 #-------------------------------------------------------------------------
1147 # Things related to debugging
1149 # Things related to debugging
1148 #-------------------------------------------------------------------------
1150 #-------------------------------------------------------------------------
1149
1151
1150 def init_pdb(self):
1152 def init_pdb(self):
1151 # Set calling of pdb on exceptions
1153 # Set calling of pdb on exceptions
1152 # self.call_pdb is a property
1154 # self.call_pdb is a property
1153 self.call_pdb = self.pdb
1155 self.call_pdb = self.pdb
1154
1156
1155 def _get_call_pdb(self):
1157 def _get_call_pdb(self):
1156 return self._call_pdb
1158 return self._call_pdb
1157
1159
1158 def _set_call_pdb(self,val):
1160 def _set_call_pdb(self,val):
1159
1161
1160 if val not in (0,1,False,True):
1162 if val not in (0,1,False,True):
1161 raise ValueError('new call_pdb value must be boolean')
1163 raise ValueError('new call_pdb value must be boolean')
1162
1164
1163 # store value in instance
1165 # store value in instance
1164 self._call_pdb = val
1166 self._call_pdb = val
1165
1167
1166 # notify the actual exception handlers
1168 # notify the actual exception handlers
1167 self.InteractiveTB.call_pdb = val
1169 self.InteractiveTB.call_pdb = val
1168
1170
1169 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
1171 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
1170 'Control auto-activation of pdb at exceptions')
1172 'Control auto-activation of pdb at exceptions')
1171
1173
1172 def debugger(self,force=False):
1174 def debugger(self,force=False):
1173 """Call the pdb debugger.
1175 """Call the pdb debugger.
1174
1176
1175 Keywords:
1177 Keywords:
1176
1178
1177 - force(False): by default, this routine checks the instance call_pdb
1179 - force(False): by default, this routine checks the instance call_pdb
1178 flag and does not actually invoke the debugger if the flag is false.
1180 flag and does not actually invoke the debugger if the flag is false.
1179 The 'force' option forces the debugger to activate even if the flag
1181 The 'force' option forces the debugger to activate even if the flag
1180 is false.
1182 is false.
1181 """
1183 """
1182
1184
1183 if not (force or self.call_pdb):
1185 if not (force or self.call_pdb):
1184 return
1186 return
1185
1187
1186 if not hasattr(sys,'last_traceback'):
1188 if not hasattr(sys,'last_traceback'):
1187 error('No traceback has been produced, nothing to debug.')
1189 error('No traceback has been produced, nothing to debug.')
1188 return
1190 return
1189
1191
1190 self.InteractiveTB.debugger(force=True)
1192 self.InteractiveTB.debugger(force=True)
1191
1193
1192 #-------------------------------------------------------------------------
1194 #-------------------------------------------------------------------------
1193 # Things related to IPython's various namespaces
1195 # Things related to IPython's various namespaces
1194 #-------------------------------------------------------------------------
1196 #-------------------------------------------------------------------------
1195 default_user_namespaces = True
1197 default_user_namespaces = True
1196
1198
1197 def init_create_namespaces(self, user_module=None, user_ns=None):
1199 def init_create_namespaces(self, user_module=None, user_ns=None):
1198 # Create the namespace where the user will operate. user_ns is
1200 # Create the namespace where the user will operate. user_ns is
1199 # normally the only one used, and it is passed to the exec calls as
1201 # normally the only one used, and it is passed to the exec calls as
1200 # the locals argument. But we do carry a user_global_ns namespace
1202 # the locals argument. But we do carry a user_global_ns namespace
1201 # given as the exec 'globals' argument, This is useful in embedding
1203 # given as the exec 'globals' argument, This is useful in embedding
1202 # situations where the ipython shell opens in a context where the
1204 # situations where the ipython shell opens in a context where the
1203 # distinction between locals and globals is meaningful. For
1205 # distinction between locals and globals is meaningful. For
1204 # non-embedded contexts, it is just the same object as the user_ns dict.
1206 # non-embedded contexts, it is just the same object as the user_ns dict.
1205
1207
1206 # FIXME. For some strange reason, __builtins__ is showing up at user
1208 # FIXME. For some strange reason, __builtins__ is showing up at user
1207 # level as a dict instead of a module. This is a manual fix, but I
1209 # level as a dict instead of a module. This is a manual fix, but I
1208 # should really track down where the problem is coming from. Alex
1210 # should really track down where the problem is coming from. Alex
1209 # Schmolck reported this problem first.
1211 # Schmolck reported this problem first.
1210
1212
1211 # A useful post by Alex Martelli on this topic:
1213 # A useful post by Alex Martelli on this topic:
1212 # Re: inconsistent value from __builtins__
1214 # Re: inconsistent value from __builtins__
1213 # Von: Alex Martelli <aleaxit@yahoo.com>
1215 # Von: Alex Martelli <aleaxit@yahoo.com>
1214 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1216 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1215 # Gruppen: comp.lang.python
1217 # Gruppen: comp.lang.python
1216
1218
1217 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1219 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1218 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1220 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1219 # > <type 'dict'>
1221 # > <type 'dict'>
1220 # > >>> print type(__builtins__)
1222 # > >>> print type(__builtins__)
1221 # > <type 'module'>
1223 # > <type 'module'>
1222 # > Is this difference in return value intentional?
1224 # > Is this difference in return value intentional?
1223
1225
1224 # Well, it's documented that '__builtins__' can be either a dictionary
1226 # Well, it's documented that '__builtins__' can be either a dictionary
1225 # or a module, and it's been that way for a long time. Whether it's
1227 # or a module, and it's been that way for a long time. Whether it's
1226 # intentional (or sensible), I don't know. In any case, the idea is
1228 # intentional (or sensible), I don't know. In any case, the idea is
1227 # that if you need to access the built-in namespace directly, you
1229 # that if you need to access the built-in namespace directly, you
1228 # should start with "import __builtin__" (note, no 's') which will
1230 # should start with "import __builtin__" (note, no 's') which will
1229 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1231 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1230
1232
1231 # These routines return a properly built module and dict as needed by
1233 # These routines return a properly built module and dict as needed by
1232 # the rest of the code, and can also be used by extension writers to
1234 # the rest of the code, and can also be used by extension writers to
1233 # generate properly initialized namespaces.
1235 # generate properly initialized namespaces.
1234 if (user_ns is not None) or (user_module is not None):
1236 if (user_ns is not None) or (user_module is not None):
1235 self.default_user_namespaces = False
1237 self.default_user_namespaces = False
1236 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1238 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1237
1239
1238 # A record of hidden variables we have added to the user namespace, so
1240 # A record of hidden variables we have added to the user namespace, so
1239 # we can list later only variables defined in actual interactive use.
1241 # we can list later only variables defined in actual interactive use.
1240 self.user_ns_hidden = {}
1242 self.user_ns_hidden = {}
1241
1243
1242 # Now that FakeModule produces a real module, we've run into a nasty
1244 # Now that FakeModule produces a real module, we've run into a nasty
1243 # problem: after script execution (via %run), the module where the user
1245 # problem: after script execution (via %run), the module where the user
1244 # code ran is deleted. Now that this object is a true module (needed
1246 # code ran is deleted. Now that this object is a true module (needed
1245 # so doctest and other tools work correctly), the Python module
1247 # so doctest and other tools work correctly), the Python module
1246 # teardown mechanism runs over it, and sets to None every variable
1248 # teardown mechanism runs over it, and sets to None every variable
1247 # present in that module. Top-level references to objects from the
1249 # present in that module. Top-level references to objects from the
1248 # script survive, because the user_ns is updated with them. However,
1250 # script survive, because the user_ns is updated with them. However,
1249 # calling functions defined in the script that use other things from
1251 # calling functions defined in the script that use other things from
1250 # the script will fail, because the function's closure had references
1252 # the script will fail, because the function's closure had references
1251 # to the original objects, which are now all None. So we must protect
1253 # to the original objects, which are now all None. So we must protect
1252 # these modules from deletion by keeping a cache.
1254 # these modules from deletion by keeping a cache.
1253 #
1255 #
1254 # To avoid keeping stale modules around (we only need the one from the
1256 # To avoid keeping stale modules around (we only need the one from the
1255 # last run), we use a dict keyed with the full path to the script, so
1257 # last run), we use a dict keyed with the full path to the script, so
1256 # only the last version of the module is held in the cache. Note,
1258 # only the last version of the module is held in the cache. Note,
1257 # however, that we must cache the module *namespace contents* (their
1259 # however, that we must cache the module *namespace contents* (their
1258 # __dict__). Because if we try to cache the actual modules, old ones
1260 # __dict__). Because if we try to cache the actual modules, old ones
1259 # (uncached) could be destroyed while still holding references (such as
1261 # (uncached) could be destroyed while still holding references (such as
1260 # those held by GUI objects that tend to be long-lived)>
1262 # those held by GUI objects that tend to be long-lived)>
1261 #
1263 #
1262 # The %reset command will flush this cache. See the cache_main_mod()
1264 # The %reset command will flush this cache. See the cache_main_mod()
1263 # and clear_main_mod_cache() methods for details on use.
1265 # and clear_main_mod_cache() methods for details on use.
1264
1266
1265 # This is the cache used for 'main' namespaces
1267 # This is the cache used for 'main' namespaces
1266 self._main_mod_cache = {}
1268 self._main_mod_cache = {}
1267
1269
1268 # A table holding all the namespaces IPython deals with, so that
1270 # A table holding all the namespaces IPython deals with, so that
1269 # introspection facilities can search easily.
1271 # introspection facilities can search easily.
1270 self.ns_table = {'user_global':self.user_module.__dict__,
1272 self.ns_table = {'user_global':self.user_module.__dict__,
1271 'user_local':self.user_ns,
1273 'user_local':self.user_ns,
1272 'builtin':builtin_mod.__dict__
1274 'builtin':builtin_mod.__dict__
1273 }
1275 }
1274
1276
1275 @property
1277 @property
1276 def user_global_ns(self):
1278 def user_global_ns(self):
1277 return self.user_module.__dict__
1279 return self.user_module.__dict__
1278
1280
1279 def prepare_user_module(self, user_module=None, user_ns=None):
1281 def prepare_user_module(self, user_module=None, user_ns=None):
1280 """Prepare the module and namespace in which user code will be run.
1282 """Prepare the module and namespace in which user code will be run.
1281
1283
1282 When IPython is started normally, both parameters are None: a new module
1284 When IPython is started normally, both parameters are None: a new module
1283 is created automatically, and its __dict__ used as the namespace.
1285 is created automatically, and its __dict__ used as the namespace.
1284
1286
1285 If only user_module is provided, its __dict__ is used as the namespace.
1287 If only user_module is provided, its __dict__ is used as the namespace.
1286 If only user_ns is provided, a dummy module is created, and user_ns
1288 If only user_ns is provided, a dummy module is created, and user_ns
1287 becomes the global namespace. If both are provided (as they may be
1289 becomes the global namespace. If both are provided (as they may be
1288 when embedding), user_ns is the local namespace, and user_module
1290 when embedding), user_ns is the local namespace, and user_module
1289 provides the global namespace.
1291 provides the global namespace.
1290
1292
1291 Parameters
1293 Parameters
1292 ----------
1294 ----------
1293 user_module : module, optional
1295 user_module : module, optional
1294 The current user module in which IPython is being run. If None,
1296 The current user module in which IPython is being run. If None,
1295 a clean module will be created.
1297 a clean module will be created.
1296 user_ns : dict, optional
1298 user_ns : dict, optional
1297 A namespace in which to run interactive commands.
1299 A namespace in which to run interactive commands.
1298
1300
1299 Returns
1301 Returns
1300 -------
1302 -------
1301 A tuple of user_module and user_ns, each properly initialised.
1303 A tuple of user_module and user_ns, each properly initialised.
1302 """
1304 """
1303 if user_module is None and user_ns is not None:
1305 if user_module is None and user_ns is not None:
1304 user_ns.setdefault("__name__", "__main__")
1306 user_ns.setdefault("__name__", "__main__")
1305 user_module = DummyMod()
1307 user_module = DummyMod()
1306 user_module.__dict__ = user_ns
1308 user_module.__dict__ = user_ns
1307
1309
1308 if user_module is None:
1310 if user_module is None:
1309 user_module = types.ModuleType("__main__",
1311 user_module = types.ModuleType("__main__",
1310 doc="Automatically created module for IPython interactive environment")
1312 doc="Automatically created module for IPython interactive environment")
1311
1313
1312 # We must ensure that __builtin__ (without the final 's') is always
1314 # We must ensure that __builtin__ (without the final 's') is always
1313 # available and pointing to the __builtin__ *module*. For more details:
1315 # available and pointing to the __builtin__ *module*. For more details:
1314 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1316 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1315 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1317 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1316 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1318 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1317
1319
1318 if user_ns is None:
1320 if user_ns is None:
1319 user_ns = user_module.__dict__
1321 user_ns = user_module.__dict__
1320
1322
1321 return user_module, user_ns
1323 return user_module, user_ns
1322
1324
1323 def init_sys_modules(self):
1325 def init_sys_modules(self):
1324 # We need to insert into sys.modules something that looks like a
1326 # We need to insert into sys.modules something that looks like a
1325 # module but which accesses the IPython namespace, for shelve and
1327 # module but which accesses the IPython namespace, for shelve and
1326 # pickle to work interactively. Normally they rely on getting
1328 # pickle to work interactively. Normally they rely on getting
1327 # everything out of __main__, but for embedding purposes each IPython
1329 # everything out of __main__, but for embedding purposes each IPython
1328 # instance has its own private namespace, so we can't go shoving
1330 # instance has its own private namespace, so we can't go shoving
1329 # everything into __main__.
1331 # everything into __main__.
1330
1332
1331 # note, however, that we should only do this for non-embedded
1333 # note, however, that we should only do this for non-embedded
1332 # ipythons, which really mimic the __main__.__dict__ with their own
1334 # ipythons, which really mimic the __main__.__dict__ with their own
1333 # namespace. Embedded instances, on the other hand, should not do
1335 # namespace. Embedded instances, on the other hand, should not do
1334 # this because they need to manage the user local/global namespaces
1336 # this because they need to manage the user local/global namespaces
1335 # only, but they live within a 'normal' __main__ (meaning, they
1337 # only, but they live within a 'normal' __main__ (meaning, they
1336 # shouldn't overtake the execution environment of the script they're
1338 # shouldn't overtake the execution environment of the script they're
1337 # embedded in).
1339 # embedded in).
1338
1340
1339 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1341 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1340 main_name = self.user_module.__name__
1342 main_name = self.user_module.__name__
1341 sys.modules[main_name] = self.user_module
1343 sys.modules[main_name] = self.user_module
1342
1344
1343 def init_user_ns(self):
1345 def init_user_ns(self):
1344 """Initialize all user-visible namespaces to their minimum defaults.
1346 """Initialize all user-visible namespaces to their minimum defaults.
1345
1347
1346 Certain history lists are also initialized here, as they effectively
1348 Certain history lists are also initialized here, as they effectively
1347 act as user namespaces.
1349 act as user namespaces.
1348
1350
1349 Notes
1351 Notes
1350 -----
1352 -----
1351 All data structures here are only filled in, they are NOT reset by this
1353 All data structures here are only filled in, they are NOT reset by this
1352 method. If they were not empty before, data will simply be added to
1354 method. If they were not empty before, data will simply be added to
1353 them.
1355 them.
1354 """
1356 """
1355 # This function works in two parts: first we put a few things in
1357 # This function works in two parts: first we put a few things in
1356 # user_ns, and we sync that contents into user_ns_hidden so that these
1358 # user_ns, and we sync that contents into user_ns_hidden so that these
1357 # initial variables aren't shown by %who. After the sync, we add the
1359 # initial variables aren't shown by %who. After the sync, we add the
1358 # rest of what we *do* want the user to see with %who even on a new
1360 # rest of what we *do* want the user to see with %who even on a new
1359 # session (probably nothing, so they really only see their own stuff)
1361 # session (probably nothing, so they really only see their own stuff)
1360
1362
1361 # The user dict must *always* have a __builtin__ reference to the
1363 # The user dict must *always* have a __builtin__ reference to the
1362 # Python standard __builtin__ namespace, which must be imported.
1364 # Python standard __builtin__ namespace, which must be imported.
1363 # This is so that certain operations in prompt evaluation can be
1365 # This is so that certain operations in prompt evaluation can be
1364 # reliably executed with builtins. Note that we can NOT use
1366 # reliably executed with builtins. Note that we can NOT use
1365 # __builtins__ (note the 's'), because that can either be a dict or a
1367 # __builtins__ (note the 's'), because that can either be a dict or a
1366 # module, and can even mutate at runtime, depending on the context
1368 # module, and can even mutate at runtime, depending on the context
1367 # (Python makes no guarantees on it). In contrast, __builtin__ is
1369 # (Python makes no guarantees on it). In contrast, __builtin__ is
1368 # always a module object, though it must be explicitly imported.
1370 # always a module object, though it must be explicitly imported.
1369
1371
1370 # For more details:
1372 # For more details:
1371 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1373 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1372 ns = {}
1374 ns = {}
1373
1375
1374 # make global variables for user access to the histories
1376 # make global variables for user access to the histories
1375 ns['_ih'] = self.history_manager.input_hist_parsed
1377 ns['_ih'] = self.history_manager.input_hist_parsed
1376 ns['_oh'] = self.history_manager.output_hist
1378 ns['_oh'] = self.history_manager.output_hist
1377 ns['_dh'] = self.history_manager.dir_hist
1379 ns['_dh'] = self.history_manager.dir_hist
1378
1380
1379 # user aliases to input and output histories. These shouldn't show up
1381 # user aliases to input and output histories. These shouldn't show up
1380 # in %who, as they can have very large reprs.
1382 # in %who, as they can have very large reprs.
1381 ns['In'] = self.history_manager.input_hist_parsed
1383 ns['In'] = self.history_manager.input_hist_parsed
1382 ns['Out'] = self.history_manager.output_hist
1384 ns['Out'] = self.history_manager.output_hist
1383
1385
1384 # Store myself as the public api!!!
1386 # Store myself as the public api!!!
1385 ns['get_ipython'] = self.get_ipython
1387 ns['get_ipython'] = self.get_ipython
1386
1388
1387 ns['exit'] = self.exiter
1389 ns['exit'] = self.exiter
1388 ns['quit'] = self.exiter
1390 ns['quit'] = self.exiter
1389 ns["open"] = _modified_open
1391 ns["open"] = _modified_open
1390
1392
1391 # Sync what we've added so far to user_ns_hidden so these aren't seen
1393 # Sync what we've added so far to user_ns_hidden so these aren't seen
1392 # by %who
1394 # by %who
1393 self.user_ns_hidden.update(ns)
1395 self.user_ns_hidden.update(ns)
1394
1396
1395 # Anything put into ns now would show up in %who. Think twice before
1397 # Anything put into ns now would show up in %who. Think twice before
1396 # putting anything here, as we really want %who to show the user their
1398 # putting anything here, as we really want %who to show the user their
1397 # stuff, not our variables.
1399 # stuff, not our variables.
1398
1400
1399 # Finally, update the real user's namespace
1401 # Finally, update the real user's namespace
1400 self.user_ns.update(ns)
1402 self.user_ns.update(ns)
1401
1403
1402 @property
1404 @property
1403 def all_ns_refs(self):
1405 def all_ns_refs(self):
1404 """Get a list of references to all the namespace dictionaries in which
1406 """Get a list of references to all the namespace dictionaries in which
1405 IPython might store a user-created object.
1407 IPython might store a user-created object.
1406
1408
1407 Note that this does not include the displayhook, which also caches
1409 Note that this does not include the displayhook, which also caches
1408 objects from the output."""
1410 objects from the output."""
1409 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1411 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1410 [m.__dict__ for m in self._main_mod_cache.values()]
1412 [m.__dict__ for m in self._main_mod_cache.values()]
1411
1413
1412 def reset(self, new_session=True, aggressive=False):
1414 def reset(self, new_session=True, aggressive=False):
1413 """Clear all internal namespaces, and attempt to release references to
1415 """Clear all internal namespaces, and attempt to release references to
1414 user objects.
1416 user objects.
1415
1417
1416 If new_session is True, a new history session will be opened.
1418 If new_session is True, a new history session will be opened.
1417 """
1419 """
1418 # Clear histories
1420 # Clear histories
1419 assert self.history_manager is not None
1421 assert self.history_manager is not None
1420 self.history_manager.reset(new_session)
1422 self.history_manager.reset(new_session)
1421 # Reset counter used to index all histories
1423 # Reset counter used to index all histories
1422 if new_session:
1424 if new_session:
1423 self.execution_count = 1
1425 self.execution_count = 1
1424
1426
1425 # Reset last execution result
1427 # Reset last execution result
1426 self.last_execution_succeeded = True
1428 self.last_execution_succeeded = True
1427 self.last_execution_result = None
1429 self.last_execution_result = None
1428
1430
1429 # Flush cached output items
1431 # Flush cached output items
1430 if self.displayhook.do_full_cache:
1432 if self.displayhook.do_full_cache:
1431 self.displayhook.flush()
1433 self.displayhook.flush()
1432
1434
1433 # The main execution namespaces must be cleared very carefully,
1435 # The main execution namespaces must be cleared very carefully,
1434 # skipping the deletion of the builtin-related keys, because doing so
1436 # skipping the deletion of the builtin-related keys, because doing so
1435 # would cause errors in many object's __del__ methods.
1437 # would cause errors in many object's __del__ methods.
1436 if self.user_ns is not self.user_global_ns:
1438 if self.user_ns is not self.user_global_ns:
1437 self.user_ns.clear()
1439 self.user_ns.clear()
1438 ns = self.user_global_ns
1440 ns = self.user_global_ns
1439 drop_keys = set(ns.keys())
1441 drop_keys = set(ns.keys())
1440 drop_keys.discard('__builtin__')
1442 drop_keys.discard('__builtin__')
1441 drop_keys.discard('__builtins__')
1443 drop_keys.discard('__builtins__')
1442 drop_keys.discard('__name__')
1444 drop_keys.discard('__name__')
1443 for k in drop_keys:
1445 for k in drop_keys:
1444 del ns[k]
1446 del ns[k]
1445
1447
1446 self.user_ns_hidden.clear()
1448 self.user_ns_hidden.clear()
1447
1449
1448 # Restore the user namespaces to minimal usability
1450 # Restore the user namespaces to minimal usability
1449 self.init_user_ns()
1451 self.init_user_ns()
1450 if aggressive and not hasattr(self, "_sys_modules_keys"):
1452 if aggressive and not hasattr(self, "_sys_modules_keys"):
1451 print("Cannot restore sys.module, no snapshot")
1453 print("Cannot restore sys.module, no snapshot")
1452 elif aggressive:
1454 elif aggressive:
1453 print("culling sys module...")
1455 print("culling sys module...")
1454 current_keys = set(sys.modules.keys())
1456 current_keys = set(sys.modules.keys())
1455 for k in current_keys - self._sys_modules_keys:
1457 for k in current_keys - self._sys_modules_keys:
1456 if k.startswith("multiprocessing"):
1458 if k.startswith("multiprocessing"):
1457 continue
1459 continue
1458 del sys.modules[k]
1460 del sys.modules[k]
1459
1461
1460 # Restore the default and user aliases
1462 # Restore the default and user aliases
1461 self.alias_manager.clear_aliases()
1463 self.alias_manager.clear_aliases()
1462 self.alias_manager.init_aliases()
1464 self.alias_manager.init_aliases()
1463
1465
1464 # Now define aliases that only make sense on the terminal, because they
1466 # Now define aliases that only make sense on the terminal, because they
1465 # need direct access to the console in a way that we can't emulate in
1467 # need direct access to the console in a way that we can't emulate in
1466 # GUI or web frontend
1468 # GUI or web frontend
1467 if os.name == 'posix':
1469 if os.name == 'posix':
1468 for cmd in ('clear', 'more', 'less', 'man'):
1470 for cmd in ('clear', 'more', 'less', 'man'):
1469 if cmd not in self.magics_manager.magics['line']:
1471 if cmd not in self.magics_manager.magics['line']:
1470 self.alias_manager.soft_define_alias(cmd, cmd)
1472 self.alias_manager.soft_define_alias(cmd, cmd)
1471
1473
1472 # Flush the private list of module references kept for script
1474 # Flush the private list of module references kept for script
1473 # execution protection
1475 # execution protection
1474 self.clear_main_mod_cache()
1476 self.clear_main_mod_cache()
1475
1477
1476 def del_var(self, varname, by_name=False):
1478 def del_var(self, varname, by_name=False):
1477 """Delete a variable from the various namespaces, so that, as
1479 """Delete a variable from the various namespaces, so that, as
1478 far as possible, we're not keeping any hidden references to it.
1480 far as possible, we're not keeping any hidden references to it.
1479
1481
1480 Parameters
1482 Parameters
1481 ----------
1483 ----------
1482 varname : str
1484 varname : str
1483 The name of the variable to delete.
1485 The name of the variable to delete.
1484 by_name : bool
1486 by_name : bool
1485 If True, delete variables with the given name in each
1487 If True, delete variables with the given name in each
1486 namespace. If False (default), find the variable in the user
1488 namespace. If False (default), find the variable in the user
1487 namespace, and delete references to it.
1489 namespace, and delete references to it.
1488 """
1490 """
1489 if varname in ('__builtin__', '__builtins__'):
1491 if varname in ('__builtin__', '__builtins__'):
1490 raise ValueError("Refusing to delete %s" % varname)
1492 raise ValueError("Refusing to delete %s" % varname)
1491
1493
1492 ns_refs = self.all_ns_refs
1494 ns_refs = self.all_ns_refs
1493
1495
1494 if by_name: # Delete by name
1496 if by_name: # Delete by name
1495 for ns in ns_refs:
1497 for ns in ns_refs:
1496 try:
1498 try:
1497 del ns[varname]
1499 del ns[varname]
1498 except KeyError:
1500 except KeyError:
1499 pass
1501 pass
1500 else: # Delete by object
1502 else: # Delete by object
1501 try:
1503 try:
1502 obj = self.user_ns[varname]
1504 obj = self.user_ns[varname]
1503 except KeyError as e:
1505 except KeyError as e:
1504 raise NameError("name '%s' is not defined" % varname) from e
1506 raise NameError("name '%s' is not defined" % varname) from e
1505 # Also check in output history
1507 # Also check in output history
1506 assert self.history_manager is not None
1508 assert self.history_manager is not None
1507 ns_refs.append(self.history_manager.output_hist)
1509 ns_refs.append(self.history_manager.output_hist)
1508 for ns in ns_refs:
1510 for ns in ns_refs:
1509 to_delete = [n for n, o in ns.items() if o is obj]
1511 to_delete = [n for n, o in ns.items() if o is obj]
1510 for name in to_delete:
1512 for name in to_delete:
1511 del ns[name]
1513 del ns[name]
1512
1514
1513 # Ensure it is removed from the last execution result
1515 # Ensure it is removed from the last execution result
1514 if self.last_execution_result.result is obj:
1516 if self.last_execution_result.result is obj:
1515 self.last_execution_result = None
1517 self.last_execution_result = None
1516
1518
1517 # displayhook keeps extra references, but not in a dictionary
1519 # displayhook keeps extra references, but not in a dictionary
1518 for name in ('_', '__', '___'):
1520 for name in ('_', '__', '___'):
1519 if getattr(self.displayhook, name) is obj:
1521 if getattr(self.displayhook, name) is obj:
1520 setattr(self.displayhook, name, None)
1522 setattr(self.displayhook, name, None)
1521
1523
1522 def reset_selective(self, regex=None):
1524 def reset_selective(self, regex=None):
1523 """Clear selective variables from internal namespaces based on a
1525 """Clear selective variables from internal namespaces based on a
1524 specified regular expression.
1526 specified regular expression.
1525
1527
1526 Parameters
1528 Parameters
1527 ----------
1529 ----------
1528 regex : string or compiled pattern, optional
1530 regex : string or compiled pattern, optional
1529 A regular expression pattern that will be used in searching
1531 A regular expression pattern that will be used in searching
1530 variable names in the users namespaces.
1532 variable names in the users namespaces.
1531 """
1533 """
1532 if regex is not None:
1534 if regex is not None:
1533 try:
1535 try:
1534 m = re.compile(regex)
1536 m = re.compile(regex)
1535 except TypeError as e:
1537 except TypeError as e:
1536 raise TypeError('regex must be a string or compiled pattern') from e
1538 raise TypeError('regex must be a string or compiled pattern') from e
1537 # Search for keys in each namespace that match the given regex
1539 # Search for keys in each namespace that match the given regex
1538 # If a match is found, delete the key/value pair.
1540 # If a match is found, delete the key/value pair.
1539 for ns in self.all_ns_refs:
1541 for ns in self.all_ns_refs:
1540 for var in ns:
1542 for var in ns:
1541 if m.search(var):
1543 if m.search(var):
1542 del ns[var]
1544 del ns[var]
1543
1545
1544 def push(self, variables, interactive=True):
1546 def push(self, variables, interactive=True):
1545 """Inject a group of variables into the IPython user namespace.
1547 """Inject a group of variables into the IPython user namespace.
1546
1548
1547 Parameters
1549 Parameters
1548 ----------
1550 ----------
1549 variables : dict, str or list/tuple of str
1551 variables : dict, str or list/tuple of str
1550 The variables to inject into the user's namespace. If a dict, a
1552 The variables to inject into the user's namespace. If a dict, a
1551 simple update is done. If a str, the string is assumed to have
1553 simple update is done. If a str, the string is assumed to have
1552 variable names separated by spaces. A list/tuple of str can also
1554 variable names separated by spaces. A list/tuple of str can also
1553 be used to give the variable names. If just the variable names are
1555 be used to give the variable names. If just the variable names are
1554 give (list/tuple/str) then the variable values looked up in the
1556 give (list/tuple/str) then the variable values looked up in the
1555 callers frame.
1557 callers frame.
1556 interactive : bool
1558 interactive : bool
1557 If True (default), the variables will be listed with the ``who``
1559 If True (default), the variables will be listed with the ``who``
1558 magic.
1560 magic.
1559 """
1561 """
1560 vdict = None
1562 vdict = None
1561
1563
1562 # We need a dict of name/value pairs to do namespace updates.
1564 # We need a dict of name/value pairs to do namespace updates.
1563 if isinstance(variables, dict):
1565 if isinstance(variables, dict):
1564 vdict = variables
1566 vdict = variables
1565 elif isinstance(variables, (str, list, tuple)):
1567 elif isinstance(variables, (str, list, tuple)):
1566 if isinstance(variables, str):
1568 if isinstance(variables, str):
1567 vlist = variables.split()
1569 vlist = variables.split()
1568 else:
1570 else:
1569 vlist = variables
1571 vlist = variables
1570 vdict = {}
1572 vdict = {}
1571 cf = sys._getframe(1)
1573 cf = sys._getframe(1)
1572 for name in vlist:
1574 for name in vlist:
1573 try:
1575 try:
1574 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1576 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1575 except:
1577 except:
1576 print('Could not get variable %s from %s' %
1578 print('Could not get variable %s from %s' %
1577 (name,cf.f_code.co_name))
1579 (name,cf.f_code.co_name))
1578 else:
1580 else:
1579 raise ValueError('variables must be a dict/str/list/tuple')
1581 raise ValueError('variables must be a dict/str/list/tuple')
1580
1582
1581 # Propagate variables to user namespace
1583 # Propagate variables to user namespace
1582 self.user_ns.update(vdict)
1584 self.user_ns.update(vdict)
1583
1585
1584 # And configure interactive visibility
1586 # And configure interactive visibility
1585 user_ns_hidden = self.user_ns_hidden
1587 user_ns_hidden = self.user_ns_hidden
1586 if interactive:
1588 if interactive:
1587 for name in vdict:
1589 for name in vdict:
1588 user_ns_hidden.pop(name, None)
1590 user_ns_hidden.pop(name, None)
1589 else:
1591 else:
1590 user_ns_hidden.update(vdict)
1592 user_ns_hidden.update(vdict)
1591
1593
1592 def drop_by_id(self, variables):
1594 def drop_by_id(self, variables):
1593 """Remove a dict of variables from the user namespace, if they are the
1595 """Remove a dict of variables from the user namespace, if they are the
1594 same as the values in the dictionary.
1596 same as the values in the dictionary.
1595
1597
1596 This is intended for use by extensions: variables that they've added can
1598 This is intended for use by extensions: variables that they've added can
1597 be taken back out if they are unloaded, without removing any that the
1599 be taken back out if they are unloaded, without removing any that the
1598 user has overwritten.
1600 user has overwritten.
1599
1601
1600 Parameters
1602 Parameters
1601 ----------
1603 ----------
1602 variables : dict
1604 variables : dict
1603 A dictionary mapping object names (as strings) to the objects.
1605 A dictionary mapping object names (as strings) to the objects.
1604 """
1606 """
1605 for name, obj in variables.items():
1607 for name, obj in variables.items():
1606 if name in self.user_ns and self.user_ns[name] is obj:
1608 if name in self.user_ns and self.user_ns[name] is obj:
1607 del self.user_ns[name]
1609 del self.user_ns[name]
1608 self.user_ns_hidden.pop(name, None)
1610 self.user_ns_hidden.pop(name, None)
1609
1611
1610 #-------------------------------------------------------------------------
1612 #-------------------------------------------------------------------------
1611 # Things related to object introspection
1613 # Things related to object introspection
1612 #-------------------------------------------------------------------------
1614 #-------------------------------------------------------------------------
1613 @staticmethod
1615 @staticmethod
1614 def _find_parts(oname: str) -> Tuple[bool, ListType[str]]:
1616 def _find_parts(oname: str) -> Tuple[bool, ListType[str]]:
1615 """
1617 """
1616 Given an object name, return a list of parts of this object name.
1618 Given an object name, return a list of parts of this object name.
1617
1619
1618 Basically split on docs when using attribute access,
1620 Basically split on docs when using attribute access,
1619 and extract the value when using square bracket.
1621 and extract the value when using square bracket.
1620
1622
1621
1623
1622 For example foo.bar[3].baz[x] -> foo, bar, 3, baz, x
1624 For example foo.bar[3].baz[x] -> foo, bar, 3, baz, x
1623
1625
1624
1626
1625 Returns
1627 Returns
1626 -------
1628 -------
1627 parts_ok: bool
1629 parts_ok: bool
1628 wether we were properly able to parse parts.
1630 wether we were properly able to parse parts.
1629 parts: list of str
1631 parts: list of str
1630 extracted parts
1632 extracted parts
1631
1633
1632
1634
1633
1635
1634 """
1636 """
1635 raw_parts = oname.split(".")
1637 raw_parts = oname.split(".")
1636 parts = []
1638 parts = []
1637 parts_ok = True
1639 parts_ok = True
1638 for p in raw_parts:
1640 for p in raw_parts:
1639 if p.endswith("]"):
1641 if p.endswith("]"):
1640 var, *indices = p.split("[")
1642 var, *indices = p.split("[")
1641 if not var.isidentifier():
1643 if not var.isidentifier():
1642 parts_ok = False
1644 parts_ok = False
1643 break
1645 break
1644 parts.append(var)
1646 parts.append(var)
1645 for ind in indices:
1647 for ind in indices:
1646 if ind[-1] != "]" and not is_integer_string(ind[:-1]):
1648 if ind[-1] != "]" and not is_integer_string(ind[:-1]):
1647 parts_ok = False
1649 parts_ok = False
1648 break
1650 break
1649 parts.append(ind[:-1])
1651 parts.append(ind[:-1])
1650 continue
1652 continue
1651
1653
1652 if not p.isidentifier():
1654 if not p.isidentifier():
1653 parts_ok = False
1655 parts_ok = False
1654 parts.append(p)
1656 parts.append(p)
1655
1657
1656 return parts_ok, parts
1658 return parts_ok, parts
1657
1659
1658 def _ofind(
1660 def _ofind(
1659 self, oname: str, namespaces: Optional[Sequence[Tuple[str, AnyType]]] = None
1661 self, oname: str, namespaces: Optional[Sequence[Tuple[str, AnyType]]] = None
1660 ) -> OInfo:
1662 ) -> OInfo:
1661 """Find an object in the available namespaces.
1663 """Find an object in the available namespaces.
1662
1664
1663
1665
1664 Returns
1666 Returns
1665 -------
1667 -------
1666 OInfo with fields:
1668 OInfo with fields:
1667 - ismagic
1669 - ismagic
1668 - isalias
1670 - isalias
1669 - found
1671 - found
1670 - obj
1672 - obj
1671 - namespac
1673 - namespac
1672 - parent
1674 - parent
1673
1675
1674 Has special code to detect magic functions.
1676 Has special code to detect magic functions.
1675 """
1677 """
1676 oname = oname.strip()
1678 oname = oname.strip()
1677 parts_ok, parts = self._find_parts(oname)
1679 parts_ok, parts = self._find_parts(oname)
1678
1680
1679 if (
1681 if (
1680 not oname.startswith(ESC_MAGIC)
1682 not oname.startswith(ESC_MAGIC)
1681 and not oname.startswith(ESC_MAGIC2)
1683 and not oname.startswith(ESC_MAGIC2)
1682 and not parts_ok
1684 and not parts_ok
1683 ):
1685 ):
1684 return OInfo(
1686 return OInfo(
1685 ismagic=False,
1687 ismagic=False,
1686 isalias=False,
1688 isalias=False,
1687 found=False,
1689 found=False,
1688 obj=None,
1690 obj=None,
1689 namespace=None,
1691 namespace=None,
1690 parent=None,
1692 parent=None,
1691 )
1693 )
1692
1694
1693 if namespaces is None:
1695 if namespaces is None:
1694 # Namespaces to search in:
1696 # Namespaces to search in:
1695 # Put them in a list. The order is important so that we
1697 # Put them in a list. The order is important so that we
1696 # find things in the same order that Python finds them.
1698 # find things in the same order that Python finds them.
1697 namespaces = [ ('Interactive', self.user_ns),
1699 namespaces = [ ('Interactive', self.user_ns),
1698 ('Interactive (global)', self.user_global_ns),
1700 ('Interactive (global)', self.user_global_ns),
1699 ('Python builtin', builtin_mod.__dict__),
1701 ('Python builtin', builtin_mod.__dict__),
1700 ]
1702 ]
1701
1703
1702 ismagic = False
1704 ismagic = False
1703 isalias = False
1705 isalias = False
1704 found = False
1706 found = False
1705 ospace = None
1707 ospace = None
1706 parent = None
1708 parent = None
1707 obj = None
1709 obj = None
1708
1710
1709
1711
1710 # Look for the given name by splitting it in parts. If the head is
1712 # Look for the given name by splitting it in parts. If the head is
1711 # found, then we look for all the remaining parts as members, and only
1713 # found, then we look for all the remaining parts as members, and only
1712 # declare success if we can find them all.
1714 # declare success if we can find them all.
1713 oname_parts = parts
1715 oname_parts = parts
1714 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1716 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1715 for nsname,ns in namespaces:
1717 for nsname,ns in namespaces:
1716 try:
1718 try:
1717 obj = ns[oname_head]
1719 obj = ns[oname_head]
1718 except KeyError:
1720 except KeyError:
1719 continue
1721 continue
1720 else:
1722 else:
1721 for idx, part in enumerate(oname_rest):
1723 for idx, part in enumerate(oname_rest):
1722 try:
1724 try:
1723 parent = obj
1725 parent = obj
1724 # The last part is looked up in a special way to avoid
1726 # The last part is looked up in a special way to avoid
1725 # descriptor invocation as it may raise or have side
1727 # descriptor invocation as it may raise or have side
1726 # effects.
1728 # effects.
1727 if idx == len(oname_rest) - 1:
1729 if idx == len(oname_rest) - 1:
1728 obj = self._getattr_property(obj, part)
1730 obj = self._getattr_property(obj, part)
1729 else:
1731 else:
1730 if is_integer_string(part):
1732 if is_integer_string(part):
1731 obj = obj[int(part)]
1733 obj = obj[int(part)]
1732 else:
1734 else:
1733 obj = getattr(obj, part)
1735 obj = getattr(obj, part)
1734 except:
1736 except:
1735 # Blanket except b/c some badly implemented objects
1737 # Blanket except b/c some badly implemented objects
1736 # allow __getattr__ to raise exceptions other than
1738 # allow __getattr__ to raise exceptions other than
1737 # AttributeError, which then crashes IPython.
1739 # AttributeError, which then crashes IPython.
1738 break
1740 break
1739 else:
1741 else:
1740 # If we finish the for loop (no break), we got all members
1742 # If we finish the for loop (no break), we got all members
1741 found = True
1743 found = True
1742 ospace = nsname
1744 ospace = nsname
1743 break # namespace loop
1745 break # namespace loop
1744
1746
1745 # Try to see if it's magic
1747 # Try to see if it's magic
1746 if not found:
1748 if not found:
1747 obj = None
1749 obj = None
1748 if oname.startswith(ESC_MAGIC2):
1750 if oname.startswith(ESC_MAGIC2):
1749 oname = oname.lstrip(ESC_MAGIC2)
1751 oname = oname.lstrip(ESC_MAGIC2)
1750 obj = self.find_cell_magic(oname)
1752 obj = self.find_cell_magic(oname)
1751 elif oname.startswith(ESC_MAGIC):
1753 elif oname.startswith(ESC_MAGIC):
1752 oname = oname.lstrip(ESC_MAGIC)
1754 oname = oname.lstrip(ESC_MAGIC)
1753 obj = self.find_line_magic(oname)
1755 obj = self.find_line_magic(oname)
1754 else:
1756 else:
1755 # search without prefix, so run? will find %run?
1757 # search without prefix, so run? will find %run?
1756 obj = self.find_line_magic(oname)
1758 obj = self.find_line_magic(oname)
1757 if obj is None:
1759 if obj is None:
1758 obj = self.find_cell_magic(oname)
1760 obj = self.find_cell_magic(oname)
1759 if obj is not None:
1761 if obj is not None:
1760 found = True
1762 found = True
1761 ospace = 'IPython internal'
1763 ospace = 'IPython internal'
1762 ismagic = True
1764 ismagic = True
1763 isalias = isinstance(obj, Alias)
1765 isalias = isinstance(obj, Alias)
1764
1766
1765 # Last try: special-case some literals like '', [], {}, etc:
1767 # Last try: special-case some literals like '', [], {}, etc:
1766 if not found and oname_head in ["''",'""','[]','{}','()']:
1768 if not found and oname_head in ["''",'""','[]','{}','()']:
1767 obj = eval(oname_head)
1769 obj = eval(oname_head)
1768 found = True
1770 found = True
1769 ospace = 'Interactive'
1771 ospace = 'Interactive'
1770
1772
1771 return OInfo(
1773 return OInfo(
1772 obj=obj,
1774 obj=obj,
1773 found=found,
1775 found=found,
1774 parent=parent,
1776 parent=parent,
1775 ismagic=ismagic,
1777 ismagic=ismagic,
1776 isalias=isalias,
1778 isalias=isalias,
1777 namespace=ospace,
1779 namespace=ospace,
1778 )
1780 )
1779
1781
1780 @staticmethod
1782 @staticmethod
1781 def _getattr_property(obj, attrname):
1783 def _getattr_property(obj, attrname):
1782 """Property-aware getattr to use in object finding.
1784 """Property-aware getattr to use in object finding.
1783
1785
1784 If attrname represents a property, return it unevaluated (in case it has
1786 If attrname represents a property, return it unevaluated (in case it has
1785 side effects or raises an error.
1787 side effects or raises an error.
1786
1788
1787 """
1789 """
1788 if not isinstance(obj, type):
1790 if not isinstance(obj, type):
1789 try:
1791 try:
1790 # `getattr(type(obj), attrname)` is not guaranteed to return
1792 # `getattr(type(obj), attrname)` is not guaranteed to return
1791 # `obj`, but does so for property:
1793 # `obj`, but does so for property:
1792 #
1794 #
1793 # property.__get__(self, None, cls) -> self
1795 # property.__get__(self, None, cls) -> self
1794 #
1796 #
1795 # The universal alternative is to traverse the mro manually
1797 # The universal alternative is to traverse the mro manually
1796 # searching for attrname in class dicts.
1798 # searching for attrname in class dicts.
1797 if is_integer_string(attrname):
1799 if is_integer_string(attrname):
1798 return obj[int(attrname)]
1800 return obj[int(attrname)]
1799 else:
1801 else:
1800 attr = getattr(type(obj), attrname)
1802 attr = getattr(type(obj), attrname)
1801 except AttributeError:
1803 except AttributeError:
1802 pass
1804 pass
1803 else:
1805 else:
1804 # This relies on the fact that data descriptors (with both
1806 # This relies on the fact that data descriptors (with both
1805 # __get__ & __set__ magic methods) take precedence over
1807 # __get__ & __set__ magic methods) take precedence over
1806 # instance-level attributes:
1808 # instance-level attributes:
1807 #
1809 #
1808 # class A(object):
1810 # class A(object):
1809 # @property
1811 # @property
1810 # def foobar(self): return 123
1812 # def foobar(self): return 123
1811 # a = A()
1813 # a = A()
1812 # a.__dict__['foobar'] = 345
1814 # a.__dict__['foobar'] = 345
1813 # a.foobar # == 123
1815 # a.foobar # == 123
1814 #
1816 #
1815 # So, a property may be returned right away.
1817 # So, a property may be returned right away.
1816 if isinstance(attr, property):
1818 if isinstance(attr, property):
1817 return attr
1819 return attr
1818
1820
1819 # Nothing helped, fall back.
1821 # Nothing helped, fall back.
1820 return getattr(obj, attrname)
1822 return getattr(obj, attrname)
1821
1823
1822 def _object_find(self, oname, namespaces=None) -> OInfo:
1824 def _object_find(self, oname, namespaces=None) -> OInfo:
1823 """Find an object and return a struct with info about it."""
1825 """Find an object and return a struct with info about it."""
1824 return self._ofind(oname, namespaces)
1826 return self._ofind(oname, namespaces)
1825
1827
1826 def _inspect(self, meth, oname: str, namespaces=None, **kw):
1828 def _inspect(self, meth, oname: str, namespaces=None, **kw):
1827 """Generic interface to the inspector system.
1829 """Generic interface to the inspector system.
1828
1830
1829 This function is meant to be called by pdef, pdoc & friends.
1831 This function is meant to be called by pdef, pdoc & friends.
1830 """
1832 """
1831 info: OInfo = self._object_find(oname, namespaces)
1833 info: OInfo = self._object_find(oname, namespaces)
1832 if self.sphinxify_docstring:
1834 if self.sphinxify_docstring:
1833 if sphinxify is None:
1835 if sphinxify is None:
1834 raise ImportError("Module ``docrepr`` required but missing")
1836 raise ImportError("Module ``docrepr`` required but missing")
1835 docformat = sphinxify(self.object_inspect(oname))
1837 docformat = sphinxify(self.object_inspect(oname))
1836 else:
1838 else:
1837 docformat = None
1839 docformat = None
1838 if info.found or hasattr(info.parent, oinspect.HOOK_NAME):
1840 if info.found or hasattr(info.parent, oinspect.HOOK_NAME):
1839 pmethod = getattr(self.inspector, meth)
1841 pmethod = getattr(self.inspector, meth)
1840 # TODO: only apply format_screen to the plain/text repr of the mime
1842 # TODO: only apply format_screen to the plain/text repr of the mime
1841 # bundle.
1843 # bundle.
1842 formatter = format_screen if info.ismagic else docformat
1844 formatter = format_screen if info.ismagic else docformat
1843 if meth == 'pdoc':
1845 if meth == 'pdoc':
1844 pmethod(info.obj, oname, formatter)
1846 pmethod(info.obj, oname, formatter)
1845 elif meth == 'pinfo':
1847 elif meth == 'pinfo':
1846 pmethod(
1848 pmethod(
1847 info.obj,
1849 info.obj,
1848 oname,
1850 oname,
1849 formatter,
1851 formatter,
1850 info,
1852 info,
1851 enable_html_pager=self.enable_html_pager,
1853 enable_html_pager=self.enable_html_pager,
1852 **kw,
1854 **kw,
1853 )
1855 )
1854 else:
1856 else:
1855 pmethod(info.obj, oname)
1857 pmethod(info.obj, oname)
1856 else:
1858 else:
1857 print('Object `%s` not found.' % oname)
1859 print('Object `%s` not found.' % oname)
1858 return 'not found' # so callers can take other action
1860 return 'not found' # so callers can take other action
1859
1861
1860 def object_inspect(self, oname, detail_level=0):
1862 def object_inspect(self, oname, detail_level=0):
1861 """Get object info about oname"""
1863 """Get object info about oname"""
1862 with self.builtin_trap:
1864 with self.builtin_trap:
1863 info = self._object_find(oname)
1865 info = self._object_find(oname)
1864 if info.found:
1866 if info.found:
1865 return self.inspector.info(info.obj, oname, info=info,
1867 return self.inspector.info(info.obj, oname, info=info,
1866 detail_level=detail_level
1868 detail_level=detail_level
1867 )
1869 )
1868 else:
1870 else:
1869 return oinspect.object_info(name=oname, found=False)
1871 return oinspect.object_info(name=oname, found=False)
1870
1872
1871 def object_inspect_text(self, oname, detail_level=0):
1873 def object_inspect_text(self, oname, detail_level=0):
1872 """Get object info as formatted text"""
1874 """Get object info as formatted text"""
1873 return self.object_inspect_mime(oname, detail_level)['text/plain']
1875 return self.object_inspect_mime(oname, detail_level)['text/plain']
1874
1876
1875 def object_inspect_mime(self, oname, detail_level=0, omit_sections=()):
1877 def object_inspect_mime(self, oname, detail_level=0, omit_sections=()):
1876 """Get object info as a mimebundle of formatted representations.
1878 """Get object info as a mimebundle of formatted representations.
1877
1879
1878 A mimebundle is a dictionary, keyed by mime-type.
1880 A mimebundle is a dictionary, keyed by mime-type.
1879 It must always have the key `'text/plain'`.
1881 It must always have the key `'text/plain'`.
1880 """
1882 """
1881 with self.builtin_trap:
1883 with self.builtin_trap:
1882 info = self._object_find(oname)
1884 info = self._object_find(oname)
1883 if info.found:
1885 if info.found:
1884 docformat = (
1886 docformat = (
1885 sphinxify(self.object_inspect(oname))
1887 sphinxify(self.object_inspect(oname))
1886 if self.sphinxify_docstring
1888 if self.sphinxify_docstring
1887 else None
1889 else None
1888 )
1890 )
1889 return self.inspector._get_info(
1891 return self.inspector._get_info(
1890 info.obj,
1892 info.obj,
1891 oname,
1893 oname,
1892 info=info,
1894 info=info,
1893 detail_level=detail_level,
1895 detail_level=detail_level,
1894 formatter=docformat,
1896 formatter=docformat,
1895 omit_sections=omit_sections,
1897 omit_sections=omit_sections,
1896 )
1898 )
1897 else:
1899 else:
1898 raise KeyError(oname)
1900 raise KeyError(oname)
1899
1901
1900 #-------------------------------------------------------------------------
1902 #-------------------------------------------------------------------------
1901 # Things related to history management
1903 # Things related to history management
1902 #-------------------------------------------------------------------------
1904 #-------------------------------------------------------------------------
1903
1905
1904 def init_history(self):
1906 def init_history(self):
1905 """Sets up the command history, and starts regular autosaves."""
1907 """Sets up the command history, and starts regular autosaves."""
1906 self.history_manager = HistoryManager(shell=self, parent=self)
1908 self.history_manager = HistoryManager(shell=self, parent=self)
1907 self.configurables.append(self.history_manager)
1909 self.configurables.append(self.history_manager)
1908
1910
1909 #-------------------------------------------------------------------------
1911 #-------------------------------------------------------------------------
1910 # Things related to exception handling and tracebacks (not debugging)
1912 # Things related to exception handling and tracebacks (not debugging)
1911 #-------------------------------------------------------------------------
1913 #-------------------------------------------------------------------------
1912
1914
1913 debugger_cls = InterruptiblePdb
1915 debugger_cls = InterruptiblePdb
1914
1916
1915 def init_traceback_handlers(self, custom_exceptions):
1917 def init_traceback_handlers(self, custom_exceptions):
1916 # Syntax error handler.
1918 # Syntax error handler.
1917 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor', parent=self)
1919 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor', parent=self)
1918
1920
1919 # The interactive one is initialized with an offset, meaning we always
1921 # The interactive one is initialized with an offset, meaning we always
1920 # want to remove the topmost item in the traceback, which is our own
1922 # want to remove the topmost item in the traceback, which is our own
1921 # internal code. Valid modes: ['Plain','Context','Verbose','Minimal']
1923 # internal code. Valid modes: ['Plain','Context','Verbose','Minimal']
1922 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1924 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1923 color_scheme='NoColor',
1925 color_scheme='NoColor',
1924 tb_offset = 1,
1926 tb_offset = 1,
1925 debugger_cls=self.debugger_cls, parent=self)
1927 debugger_cls=self.debugger_cls, parent=self)
1926
1928
1927 # The instance will store a pointer to the system-wide exception hook,
1929 # The instance will store a pointer to the system-wide exception hook,
1928 # so that runtime code (such as magics) can access it. This is because
1930 # so that runtime code (such as magics) can access it. This is because
1929 # during the read-eval loop, it may get temporarily overwritten.
1931 # during the read-eval loop, it may get temporarily overwritten.
1930 self.sys_excepthook = sys.excepthook
1932 self.sys_excepthook = sys.excepthook
1931
1933
1932 # and add any custom exception handlers the user may have specified
1934 # and add any custom exception handlers the user may have specified
1933 self.set_custom_exc(*custom_exceptions)
1935 self.set_custom_exc(*custom_exceptions)
1934
1936
1935 # Set the exception mode
1937 # Set the exception mode
1936 self.InteractiveTB.set_mode(mode=self.xmode)
1938 self.InteractiveTB.set_mode(mode=self.xmode)
1937
1939
1938 def set_custom_exc(self, exc_tuple, handler):
1940 def set_custom_exc(self, exc_tuple, handler):
1939 """set_custom_exc(exc_tuple, handler)
1941 """set_custom_exc(exc_tuple, handler)
1940
1942
1941 Set a custom exception handler, which will be called if any of the
1943 Set a custom exception handler, which will be called if any of the
1942 exceptions in exc_tuple occur in the mainloop (specifically, in the
1944 exceptions in exc_tuple occur in the mainloop (specifically, in the
1943 run_code() method).
1945 run_code() method).
1944
1946
1945 Parameters
1947 Parameters
1946 ----------
1948 ----------
1947 exc_tuple : tuple of exception classes
1949 exc_tuple : tuple of exception classes
1948 A *tuple* of exception classes, for which to call the defined
1950 A *tuple* of exception classes, for which to call the defined
1949 handler. It is very important that you use a tuple, and NOT A
1951 handler. It is very important that you use a tuple, and NOT A
1950 LIST here, because of the way Python's except statement works. If
1952 LIST here, because of the way Python's except statement works. If
1951 you only want to trap a single exception, use a singleton tuple::
1953 you only want to trap a single exception, use a singleton tuple::
1952
1954
1953 exc_tuple == (MyCustomException,)
1955 exc_tuple == (MyCustomException,)
1954
1956
1955 handler : callable
1957 handler : callable
1956 handler must have the following signature::
1958 handler must have the following signature::
1957
1959
1958 def my_handler(self, etype, value, tb, tb_offset=None):
1960 def my_handler(self, etype, value, tb, tb_offset=None):
1959 ...
1961 ...
1960 return structured_traceback
1962 return structured_traceback
1961
1963
1962 Your handler must return a structured traceback (a list of strings),
1964 Your handler must return a structured traceback (a list of strings),
1963 or None.
1965 or None.
1964
1966
1965 This will be made into an instance method (via types.MethodType)
1967 This will be made into an instance method (via types.MethodType)
1966 of IPython itself, and it will be called if any of the exceptions
1968 of IPython itself, and it will be called if any of the exceptions
1967 listed in the exc_tuple are caught. If the handler is None, an
1969 listed in the exc_tuple are caught. If the handler is None, an
1968 internal basic one is used, which just prints basic info.
1970 internal basic one is used, which just prints basic info.
1969
1971
1970 To protect IPython from crashes, if your handler ever raises an
1972 To protect IPython from crashes, if your handler ever raises an
1971 exception or returns an invalid result, it will be immediately
1973 exception or returns an invalid result, it will be immediately
1972 disabled.
1974 disabled.
1973
1975
1974 Notes
1976 Notes
1975 -----
1977 -----
1976 WARNING: by putting in your own exception handler into IPython's main
1978 WARNING: by putting in your own exception handler into IPython's main
1977 execution loop, you run a very good chance of nasty crashes. This
1979 execution loop, you run a very good chance of nasty crashes. This
1978 facility should only be used if you really know what you are doing.
1980 facility should only be used if you really know what you are doing.
1979 """
1981 """
1980
1982
1981 if not isinstance(exc_tuple, tuple):
1983 if not isinstance(exc_tuple, tuple):
1982 raise TypeError("The custom exceptions must be given as a tuple.")
1984 raise TypeError("The custom exceptions must be given as a tuple.")
1983
1985
1984 def dummy_handler(self, etype, value, tb, tb_offset=None):
1986 def dummy_handler(self, etype, value, tb, tb_offset=None):
1985 print('*** Simple custom exception handler ***')
1987 print('*** Simple custom exception handler ***')
1986 print('Exception type :', etype)
1988 print('Exception type :', etype)
1987 print('Exception value:', value)
1989 print('Exception value:', value)
1988 print('Traceback :', tb)
1990 print('Traceback :', tb)
1989
1991
1990 def validate_stb(stb):
1992 def validate_stb(stb):
1991 """validate structured traceback return type
1993 """validate structured traceback return type
1992
1994
1993 return type of CustomTB *should* be a list of strings, but allow
1995 return type of CustomTB *should* be a list of strings, but allow
1994 single strings or None, which are harmless.
1996 single strings or None, which are harmless.
1995
1997
1996 This function will *always* return a list of strings,
1998 This function will *always* return a list of strings,
1997 and will raise a TypeError if stb is inappropriate.
1999 and will raise a TypeError if stb is inappropriate.
1998 """
2000 """
1999 msg = "CustomTB must return list of strings, not %r" % stb
2001 msg = "CustomTB must return list of strings, not %r" % stb
2000 if stb is None:
2002 if stb is None:
2001 return []
2003 return []
2002 elif isinstance(stb, str):
2004 elif isinstance(stb, str):
2003 return [stb]
2005 return [stb]
2004 elif not isinstance(stb, list):
2006 elif not isinstance(stb, list):
2005 raise TypeError(msg)
2007 raise TypeError(msg)
2006 # it's a list
2008 # it's a list
2007 for line in stb:
2009 for line in stb:
2008 # check every element
2010 # check every element
2009 if not isinstance(line, str):
2011 if not isinstance(line, str):
2010 raise TypeError(msg)
2012 raise TypeError(msg)
2011 return stb
2013 return stb
2012
2014
2013 if handler is None:
2015 if handler is None:
2014 wrapped = dummy_handler
2016 wrapped = dummy_handler
2015 else:
2017 else:
2016 def wrapped(self,etype,value,tb,tb_offset=None):
2018 def wrapped(self,etype,value,tb,tb_offset=None):
2017 """wrap CustomTB handler, to protect IPython from user code
2019 """wrap CustomTB handler, to protect IPython from user code
2018
2020
2019 This makes it harder (but not impossible) for custom exception
2021 This makes it harder (but not impossible) for custom exception
2020 handlers to crash IPython.
2022 handlers to crash IPython.
2021 """
2023 """
2022 try:
2024 try:
2023 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
2025 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
2024 return validate_stb(stb)
2026 return validate_stb(stb)
2025 except:
2027 except:
2026 # clear custom handler immediately
2028 # clear custom handler immediately
2027 self.set_custom_exc((), None)
2029 self.set_custom_exc((), None)
2028 print("Custom TB Handler failed, unregistering", file=sys.stderr)
2030 print("Custom TB Handler failed, unregistering", file=sys.stderr)
2029 # show the exception in handler first
2031 # show the exception in handler first
2030 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
2032 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
2031 print(self.InteractiveTB.stb2text(stb))
2033 print(self.InteractiveTB.stb2text(stb))
2032 print("The original exception:")
2034 print("The original exception:")
2033 stb = self.InteractiveTB.structured_traceback(
2035 stb = self.InteractiveTB.structured_traceback(
2034 (etype,value,tb), tb_offset=tb_offset
2036 (etype,value,tb), tb_offset=tb_offset
2035 )
2037 )
2036 return stb
2038 return stb
2037
2039
2038 self.CustomTB = types.MethodType(wrapped,self)
2040 self.CustomTB = types.MethodType(wrapped,self)
2039 self.custom_exceptions = exc_tuple
2041 self.custom_exceptions = exc_tuple
2040
2042
2041 def excepthook(self, etype, value, tb):
2043 def excepthook(self, etype, value, tb):
2042 """One more defense for GUI apps that call sys.excepthook.
2044 """One more defense for GUI apps that call sys.excepthook.
2043
2045
2044 GUI frameworks like wxPython trap exceptions and call
2046 GUI frameworks like wxPython trap exceptions and call
2045 sys.excepthook themselves. I guess this is a feature that
2047 sys.excepthook themselves. I guess this is a feature that
2046 enables them to keep running after exceptions that would
2048 enables them to keep running after exceptions that would
2047 otherwise kill their mainloop. This is a bother for IPython
2049 otherwise kill their mainloop. This is a bother for IPython
2048 which expects to catch all of the program exceptions with a try:
2050 which expects to catch all of the program exceptions with a try:
2049 except: statement.
2051 except: statement.
2050
2052
2051 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
2053 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
2052 any app directly invokes sys.excepthook, it will look to the user like
2054 any app directly invokes sys.excepthook, it will look to the user like
2053 IPython crashed. In order to work around this, we can disable the
2055 IPython crashed. In order to work around this, we can disable the
2054 CrashHandler and replace it with this excepthook instead, which prints a
2056 CrashHandler and replace it with this excepthook instead, which prints a
2055 regular traceback using our InteractiveTB. In this fashion, apps which
2057 regular traceback using our InteractiveTB. In this fashion, apps which
2056 call sys.excepthook will generate a regular-looking exception from
2058 call sys.excepthook will generate a regular-looking exception from
2057 IPython, and the CrashHandler will only be triggered by real IPython
2059 IPython, and the CrashHandler will only be triggered by real IPython
2058 crashes.
2060 crashes.
2059
2061
2060 This hook should be used sparingly, only in places which are not likely
2062 This hook should be used sparingly, only in places which are not likely
2061 to be true IPython errors.
2063 to be true IPython errors.
2062 """
2064 """
2063 self.showtraceback((etype, value, tb), tb_offset=0)
2065 self.showtraceback((etype, value, tb), tb_offset=0)
2064
2066
2065 def _get_exc_info(self, exc_tuple=None):
2067 def _get_exc_info(self, exc_tuple=None):
2066 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
2068 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
2067
2069
2068 Ensures sys.last_type,value,traceback hold the exc_info we found,
2070 Ensures sys.last_type,value,traceback hold the exc_info we found,
2069 from whichever source.
2071 from whichever source.
2070
2072
2071 raises ValueError if none of these contain any information
2073 raises ValueError if none of these contain any information
2072 """
2074 """
2073 if exc_tuple is None:
2075 if exc_tuple is None:
2074 etype, value, tb = sys.exc_info()
2076 etype, value, tb = sys.exc_info()
2075 else:
2077 else:
2076 etype, value, tb = exc_tuple
2078 etype, value, tb = exc_tuple
2077
2079
2078 if etype is None:
2080 if etype is None:
2079 if hasattr(sys, 'last_type'):
2081 if hasattr(sys, 'last_type'):
2080 etype, value, tb = sys.last_type, sys.last_value, \
2082 etype, value, tb = sys.last_type, sys.last_value, \
2081 sys.last_traceback
2083 sys.last_traceback
2082
2084
2083 if etype is None:
2085 if etype is None:
2084 raise ValueError("No exception to find")
2086 raise ValueError("No exception to find")
2085
2087
2086 # Now store the exception info in sys.last_type etc.
2088 # Now store the exception info in sys.last_type etc.
2087 # WARNING: these variables are somewhat deprecated and not
2089 # WARNING: these variables are somewhat deprecated and not
2088 # necessarily safe to use in a threaded environment, but tools
2090 # necessarily safe to use in a threaded environment, but tools
2089 # like pdb depend on their existence, so let's set them. If we
2091 # like pdb depend on their existence, so let's set them. If we
2090 # find problems in the field, we'll need to revisit their use.
2092 # find problems in the field, we'll need to revisit their use.
2091 sys.last_type = etype
2093 sys.last_type = etype
2092 sys.last_value = value
2094 sys.last_value = value
2093 sys.last_traceback = tb
2095 sys.last_traceback = tb
2094
2096
2095 return etype, value, tb
2097 return etype, value, tb
2096
2098
2097 def show_usage_error(self, exc):
2099 def show_usage_error(self, exc):
2098 """Show a short message for UsageErrors
2100 """Show a short message for UsageErrors
2099
2101
2100 These are special exceptions that shouldn't show a traceback.
2102 These are special exceptions that shouldn't show a traceback.
2101 """
2103 """
2102 print("UsageError: %s" % exc, file=sys.stderr)
2104 print("UsageError: %s" % exc, file=sys.stderr)
2103
2105
2104 def get_exception_only(self, exc_tuple=None):
2106 def get_exception_only(self, exc_tuple=None):
2105 """
2107 """
2106 Return as a string (ending with a newline) the exception that
2108 Return as a string (ending with a newline) the exception that
2107 just occurred, without any traceback.
2109 just occurred, without any traceback.
2108 """
2110 """
2109 etype, value, tb = self._get_exc_info(exc_tuple)
2111 etype, value, tb = self._get_exc_info(exc_tuple)
2110 msg = traceback.format_exception_only(etype, value)
2112 msg = traceback.format_exception_only(etype, value)
2111 return ''.join(msg)
2113 return ''.join(msg)
2112
2114
2113 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
2115 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
2114 exception_only=False, running_compiled_code=False):
2116 exception_only=False, running_compiled_code=False):
2115 """Display the exception that just occurred.
2117 """Display the exception that just occurred.
2116
2118
2117 If nothing is known about the exception, this is the method which
2119 If nothing is known about the exception, this is the method which
2118 should be used throughout the code for presenting user tracebacks,
2120 should be used throughout the code for presenting user tracebacks,
2119 rather than directly invoking the InteractiveTB object.
2121 rather than directly invoking the InteractiveTB object.
2120
2122
2121 A specific showsyntaxerror() also exists, but this method can take
2123 A specific showsyntaxerror() also exists, but this method can take
2122 care of calling it if needed, so unless you are explicitly catching a
2124 care of calling it if needed, so unless you are explicitly catching a
2123 SyntaxError exception, don't try to analyze the stack manually and
2125 SyntaxError exception, don't try to analyze the stack manually and
2124 simply call this method."""
2126 simply call this method."""
2125
2127
2126 try:
2128 try:
2127 try:
2129 try:
2128 etype, value, tb = self._get_exc_info(exc_tuple)
2130 etype, value, tb = self._get_exc_info(exc_tuple)
2129 except ValueError:
2131 except ValueError:
2130 print('No traceback available to show.', file=sys.stderr)
2132 print('No traceback available to show.', file=sys.stderr)
2131 return
2133 return
2132
2134
2133 if issubclass(etype, SyntaxError):
2135 if issubclass(etype, SyntaxError):
2134 # Though this won't be called by syntax errors in the input
2136 # Though this won't be called by syntax errors in the input
2135 # line, there may be SyntaxError cases with imported code.
2137 # line, there may be SyntaxError cases with imported code.
2136 self.showsyntaxerror(filename, running_compiled_code)
2138 self.showsyntaxerror(filename, running_compiled_code)
2137 elif etype is UsageError:
2139 elif etype is UsageError:
2138 self.show_usage_error(value)
2140 self.show_usage_error(value)
2139 else:
2141 else:
2140 if exception_only:
2142 if exception_only:
2141 stb = ['An exception has occurred, use %tb to see '
2143 stb = ['An exception has occurred, use %tb to see '
2142 'the full traceback.\n']
2144 'the full traceback.\n']
2143 stb.extend(self.InteractiveTB.get_exception_only(etype,
2145 stb.extend(self.InteractiveTB.get_exception_only(etype,
2144 value))
2146 value))
2145 else:
2147 else:
2146
2148
2147 def contains_exceptiongroup(val):
2149 def contains_exceptiongroup(val):
2148 if val is None:
2150 if val is None:
2149 return False
2151 return False
2150 return isinstance(
2152 return isinstance(
2151 val, BaseExceptionGroup
2153 val, BaseExceptionGroup
2152 ) or contains_exceptiongroup(val.__context__)
2154 ) or contains_exceptiongroup(val.__context__)
2153
2155
2154 if contains_exceptiongroup(value):
2156 if contains_exceptiongroup(value):
2155 # fall back to native exception formatting until ultratb
2157 # fall back to native exception formatting until ultratb
2156 # supports exception groups
2158 # supports exception groups
2157 traceback.print_exc()
2159 traceback.print_exc()
2158 else:
2160 else:
2159 try:
2161 try:
2160 # Exception classes can customise their traceback - we
2162 # Exception classes can customise their traceback - we
2161 # use this in IPython.parallel for exceptions occurring
2163 # use this in IPython.parallel for exceptions occurring
2162 # in the engines. This should return a list of strings.
2164 # in the engines. This should return a list of strings.
2163 if hasattr(value, "_render_traceback_"):
2165 if hasattr(value, "_render_traceback_"):
2164 stb = value._render_traceback_()
2166 stb = value._render_traceback_()
2165 else:
2167 else:
2166 stb = self.InteractiveTB.structured_traceback(
2168 stb = self.InteractiveTB.structured_traceback(
2167 etype, value, tb, tb_offset=tb_offset
2169 etype, value, tb, tb_offset=tb_offset
2168 )
2170 )
2169
2171
2170 except Exception:
2172 except Exception:
2171 print(
2173 print(
2172 "Unexpected exception formatting exception. Falling back to standard exception"
2174 "Unexpected exception formatting exception. Falling back to standard exception"
2173 )
2175 )
2174 traceback.print_exc()
2176 traceback.print_exc()
2175 return None
2177 return None
2176
2178
2177 self._showtraceback(etype, value, stb)
2179 self._showtraceback(etype, value, stb)
2178 if self.call_pdb:
2180 if self.call_pdb:
2179 # drop into debugger
2181 # drop into debugger
2180 self.debugger(force=True)
2182 self.debugger(force=True)
2181 return
2183 return
2182
2184
2183 # Actually show the traceback
2185 # Actually show the traceback
2184 self._showtraceback(etype, value, stb)
2186 self._showtraceback(etype, value, stb)
2185
2187
2186 except KeyboardInterrupt:
2188 except KeyboardInterrupt:
2187 print('\n' + self.get_exception_only(), file=sys.stderr)
2189 print('\n' + self.get_exception_only(), file=sys.stderr)
2188
2190
2189 def _showtraceback(self, etype, evalue, stb: str):
2191 def _showtraceback(self, etype, evalue, stb: str):
2190 """Actually show a traceback.
2192 """Actually show a traceback.
2191
2193
2192 Subclasses may override this method to put the traceback on a different
2194 Subclasses may override this method to put the traceback on a different
2193 place, like a side channel.
2195 place, like a side channel.
2194 """
2196 """
2195 val = self.InteractiveTB.stb2text(stb)
2197 val = self.InteractiveTB.stb2text(stb)
2196 try:
2198 try:
2197 print(val)
2199 print(val)
2198 except UnicodeEncodeError:
2200 except UnicodeEncodeError:
2199 print(val.encode("utf-8", "backslashreplace").decode())
2201 print(val.encode("utf-8", "backslashreplace").decode())
2200
2202
2201 def showsyntaxerror(self, filename=None, running_compiled_code=False):
2203 def showsyntaxerror(self, filename=None, running_compiled_code=False):
2202 """Display the syntax error that just occurred.
2204 """Display the syntax error that just occurred.
2203
2205
2204 This doesn't display a stack trace because there isn't one.
2206 This doesn't display a stack trace because there isn't one.
2205
2207
2206 If a filename is given, it is stuffed in the exception instead
2208 If a filename is given, it is stuffed in the exception instead
2207 of what was there before (because Python's parser always uses
2209 of what was there before (because Python's parser always uses
2208 "<string>" when reading from a string).
2210 "<string>" when reading from a string).
2209
2211
2210 If the syntax error occurred when running a compiled code (i.e. running_compile_code=True),
2212 If the syntax error occurred when running a compiled code (i.e. running_compile_code=True),
2211 longer stack trace will be displayed.
2213 longer stack trace will be displayed.
2212 """
2214 """
2213 etype, value, last_traceback = self._get_exc_info()
2215 etype, value, last_traceback = self._get_exc_info()
2214
2216
2215 if filename and issubclass(etype, SyntaxError):
2217 if filename and issubclass(etype, SyntaxError):
2216 try:
2218 try:
2217 value.filename = filename
2219 value.filename = filename
2218 except:
2220 except:
2219 # Not the format we expect; leave it alone
2221 # Not the format we expect; leave it alone
2220 pass
2222 pass
2221
2223
2222 # If the error occurred when executing compiled code, we should provide full stacktrace.
2224 # If the error occurred when executing compiled code, we should provide full stacktrace.
2223 elist = traceback.extract_tb(last_traceback) if running_compiled_code else []
2225 elist = traceback.extract_tb(last_traceback) if running_compiled_code else []
2224 stb = self.SyntaxTB.structured_traceback(etype, value, elist)
2226 stb = self.SyntaxTB.structured_traceback(etype, value, elist)
2225 self._showtraceback(etype, value, stb)
2227 self._showtraceback(etype, value, stb)
2226
2228
2227 # This is overridden in TerminalInteractiveShell to show a message about
2229 # This is overridden in TerminalInteractiveShell to show a message about
2228 # the %paste magic.
2230 # the %paste magic.
2229 def showindentationerror(self):
2231 def showindentationerror(self):
2230 """Called by _run_cell when there's an IndentationError in code entered
2232 """Called by _run_cell when there's an IndentationError in code entered
2231 at the prompt.
2233 at the prompt.
2232
2234
2233 This is overridden in TerminalInteractiveShell to show a message about
2235 This is overridden in TerminalInteractiveShell to show a message about
2234 the %paste magic."""
2236 the %paste magic."""
2235 self.showsyntaxerror()
2237 self.showsyntaxerror()
2236
2238
2237 @skip_doctest
2239 @skip_doctest
2238 def set_next_input(self, s, replace=False):
2240 def set_next_input(self, s, replace=False):
2239 """ Sets the 'default' input string for the next command line.
2241 """ Sets the 'default' input string for the next command line.
2240
2242
2241 Example::
2243 Example::
2242
2244
2243 In [1]: _ip.set_next_input("Hello Word")
2245 In [1]: _ip.set_next_input("Hello Word")
2244 In [2]: Hello Word_ # cursor is here
2246 In [2]: Hello Word_ # cursor is here
2245 """
2247 """
2246 self.rl_next_input = s
2248 self.rl_next_input = s
2247
2249
2248 def _indent_current_str(self):
2250 def _indent_current_str(self):
2249 """return the current level of indentation as a string"""
2251 """return the current level of indentation as a string"""
2250 return self.input_splitter.get_indent_spaces() * ' '
2252 return self.input_splitter.get_indent_spaces() * ' '
2251
2253
2252 #-------------------------------------------------------------------------
2254 #-------------------------------------------------------------------------
2253 # Things related to text completion
2255 # Things related to text completion
2254 #-------------------------------------------------------------------------
2256 #-------------------------------------------------------------------------
2255
2257
2256 def init_completer(self):
2258 def init_completer(self):
2257 """Initialize the completion machinery.
2259 """Initialize the completion machinery.
2258
2260
2259 This creates completion machinery that can be used by client code,
2261 This creates completion machinery that can be used by client code,
2260 either interactively in-process (typically triggered by the readline
2262 either interactively in-process (typically triggered by the readline
2261 library), programmatically (such as in test suites) or out-of-process
2263 library), programmatically (such as in test suites) or out-of-process
2262 (typically over the network by remote frontends).
2264 (typically over the network by remote frontends).
2263 """
2265 """
2264 from IPython.core.completer import IPCompleter
2266 from IPython.core.completer import IPCompleter
2265 from IPython.core.completerlib import (
2267 from IPython.core.completerlib import (
2266 cd_completer,
2268 cd_completer,
2267 magic_run_completer,
2269 magic_run_completer,
2268 module_completer,
2270 module_completer,
2269 reset_completer,
2271 reset_completer,
2270 )
2272 )
2271
2273
2272 self.Completer = IPCompleter(shell=self,
2274 self.Completer = IPCompleter(shell=self,
2273 namespace=self.user_ns,
2275 namespace=self.user_ns,
2274 global_namespace=self.user_global_ns,
2276 global_namespace=self.user_global_ns,
2275 parent=self,
2277 parent=self,
2276 )
2278 )
2277 self.configurables.append(self.Completer)
2279 self.configurables.append(self.Completer)
2278
2280
2279 # Add custom completers to the basic ones built into IPCompleter
2281 # Add custom completers to the basic ones built into IPCompleter
2280 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2282 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2281 self.strdispatchers['complete_command'] = sdisp
2283 self.strdispatchers['complete_command'] = sdisp
2282 self.Completer.custom_completers = sdisp
2284 self.Completer.custom_completers = sdisp
2283
2285
2284 self.set_hook('complete_command', module_completer, str_key = 'import')
2286 self.set_hook('complete_command', module_completer, str_key = 'import')
2285 self.set_hook('complete_command', module_completer, str_key = 'from')
2287 self.set_hook('complete_command', module_completer, str_key = 'from')
2286 self.set_hook('complete_command', module_completer, str_key = '%aimport')
2288 self.set_hook('complete_command', module_completer, str_key = '%aimport')
2287 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2289 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2288 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2290 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2289 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2291 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2290
2292
2291 @skip_doctest
2293 @skip_doctest
2292 def complete(self, text, line=None, cursor_pos=None):
2294 def complete(self, text, line=None, cursor_pos=None):
2293 """Return the completed text and a list of completions.
2295 """Return the completed text and a list of completions.
2294
2296
2295 Parameters
2297 Parameters
2296 ----------
2298 ----------
2297 text : string
2299 text : string
2298 A string of text to be completed on. It can be given as empty and
2300 A string of text to be completed on. It can be given as empty and
2299 instead a line/position pair are given. In this case, the
2301 instead a line/position pair are given. In this case, the
2300 completer itself will split the line like readline does.
2302 completer itself will split the line like readline does.
2301 line : string, optional
2303 line : string, optional
2302 The complete line that text is part of.
2304 The complete line that text is part of.
2303 cursor_pos : int, optional
2305 cursor_pos : int, optional
2304 The position of the cursor on the input line.
2306 The position of the cursor on the input line.
2305
2307
2306 Returns
2308 Returns
2307 -------
2309 -------
2308 text : string
2310 text : string
2309 The actual text that was completed.
2311 The actual text that was completed.
2310 matches : list
2312 matches : list
2311 A sorted list with all possible completions.
2313 A sorted list with all possible completions.
2312
2314
2313 Notes
2315 Notes
2314 -----
2316 -----
2315 The optional arguments allow the completion to take more context into
2317 The optional arguments allow the completion to take more context into
2316 account, and are part of the low-level completion API.
2318 account, and are part of the low-level completion API.
2317
2319
2318 This is a wrapper around the completion mechanism, similar to what
2320 This is a wrapper around the completion mechanism, similar to what
2319 readline does at the command line when the TAB key is hit. By
2321 readline does at the command line when the TAB key is hit. By
2320 exposing it as a method, it can be used by other non-readline
2322 exposing it as a method, it can be used by other non-readline
2321 environments (such as GUIs) for text completion.
2323 environments (such as GUIs) for text completion.
2322
2324
2323 Examples
2325 Examples
2324 --------
2326 --------
2325 In [1]: x = 'hello'
2327 In [1]: x = 'hello'
2326
2328
2327 In [2]: _ip.complete('x.l')
2329 In [2]: _ip.complete('x.l')
2328 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2330 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2329 """
2331 """
2330
2332
2331 # Inject names into __builtin__ so we can complete on the added names.
2333 # Inject names into __builtin__ so we can complete on the added names.
2332 with self.builtin_trap:
2334 with self.builtin_trap:
2333 return self.Completer.complete(text, line, cursor_pos)
2335 return self.Completer.complete(text, line, cursor_pos)
2334
2336
2335 def set_custom_completer(self, completer, pos=0) -> None:
2337 def set_custom_completer(self, completer, pos=0) -> None:
2336 """Adds a new custom completer function.
2338 """Adds a new custom completer function.
2337
2339
2338 The position argument (defaults to 0) is the index in the completers
2340 The position argument (defaults to 0) is the index in the completers
2339 list where you want the completer to be inserted.
2341 list where you want the completer to be inserted.
2340
2342
2341 `completer` should have the following signature::
2343 `completer` should have the following signature::
2342
2344
2343 def completion(self: Completer, text: string) -> List[str]:
2345 def completion(self: Completer, text: string) -> List[str]:
2344 raise NotImplementedError
2346 raise NotImplementedError
2345
2347
2346 It will be bound to the current Completer instance and pass some text
2348 It will be bound to the current Completer instance and pass some text
2347 and return a list with current completions to suggest to the user.
2349 and return a list with current completions to suggest to the user.
2348 """
2350 """
2349
2351
2350 newcomp = types.MethodType(completer, self.Completer)
2352 newcomp = types.MethodType(completer, self.Completer)
2351 self.Completer.custom_matchers.insert(pos,newcomp)
2353 self.Completer.custom_matchers.insert(pos,newcomp)
2352
2354
2353 def set_completer_frame(self, frame=None):
2355 def set_completer_frame(self, frame=None):
2354 """Set the frame of the completer."""
2356 """Set the frame of the completer."""
2355 if frame:
2357 if frame:
2356 self.Completer.namespace = frame.f_locals
2358 self.Completer.namespace = frame.f_locals
2357 self.Completer.global_namespace = frame.f_globals
2359 self.Completer.global_namespace = frame.f_globals
2358 else:
2360 else:
2359 self.Completer.namespace = self.user_ns
2361 self.Completer.namespace = self.user_ns
2360 self.Completer.global_namespace = self.user_global_ns
2362 self.Completer.global_namespace = self.user_global_ns
2361
2363
2362 #-------------------------------------------------------------------------
2364 #-------------------------------------------------------------------------
2363 # Things related to magics
2365 # Things related to magics
2364 #-------------------------------------------------------------------------
2366 #-------------------------------------------------------------------------
2365
2367
2366 def init_magics(self):
2368 def init_magics(self):
2367 from IPython.core import magics as m
2369 from IPython.core import magics as m
2368 self.magics_manager = magic.MagicsManager(shell=self,
2370 self.magics_manager = magic.MagicsManager(shell=self,
2369 parent=self,
2371 parent=self,
2370 user_magics=m.UserMagics(self))
2372 user_magics=m.UserMagics(self))
2371 self.configurables.append(self.magics_manager)
2373 self.configurables.append(self.magics_manager)
2372
2374
2373 # Expose as public API from the magics manager
2375 # Expose as public API from the magics manager
2374 self.register_magics = self.magics_manager.register
2376 self.register_magics = self.magics_manager.register
2375
2377
2376 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2378 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2377 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
2379 m.ConfigMagics, m.DisplayMagics, m.ExecutionMagics,
2378 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2380 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2379 m.NamespaceMagics, m.OSMagics, m.PackagingMagics,
2381 m.NamespaceMagics, m.OSMagics, m.PackagingMagics,
2380 m.PylabMagics, m.ScriptMagics,
2382 m.PylabMagics, m.ScriptMagics,
2381 )
2383 )
2382 self.register_magics(m.AsyncMagics)
2384 self.register_magics(m.AsyncMagics)
2383
2385
2384 # Register Magic Aliases
2386 # Register Magic Aliases
2385 mman = self.magics_manager
2387 mman = self.magics_manager
2386 # FIXME: magic aliases should be defined by the Magics classes
2388 # FIXME: magic aliases should be defined by the Magics classes
2387 # or in MagicsManager, not here
2389 # or in MagicsManager, not here
2388 mman.register_alias('ed', 'edit')
2390 mman.register_alias('ed', 'edit')
2389 mman.register_alias('hist', 'history')
2391 mman.register_alias('hist', 'history')
2390 mman.register_alias('rep', 'recall')
2392 mman.register_alias('rep', 'recall')
2391 mman.register_alias('SVG', 'svg', 'cell')
2393 mman.register_alias('SVG', 'svg', 'cell')
2392 mman.register_alias('HTML', 'html', 'cell')
2394 mman.register_alias('HTML', 'html', 'cell')
2393 mman.register_alias('file', 'writefile', 'cell')
2395 mman.register_alias('file', 'writefile', 'cell')
2394
2396
2395 # FIXME: Move the color initialization to the DisplayHook, which
2397 # FIXME: Move the color initialization to the DisplayHook, which
2396 # should be split into a prompt manager and displayhook. We probably
2398 # should be split into a prompt manager and displayhook. We probably
2397 # even need a centralize colors management object.
2399 # even need a centralize colors management object.
2398 self.run_line_magic('colors', self.colors)
2400 self.run_line_magic('colors', self.colors)
2399
2401
2400 # Defined here so that it's included in the documentation
2402 # Defined here so that it's included in the documentation
2401 @functools.wraps(magic.MagicsManager.register_function)
2403 @functools.wraps(magic.MagicsManager.register_function)
2402 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2404 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2403 self.magics_manager.register_function(
2405 self.magics_manager.register_function(
2404 func, magic_kind=magic_kind, magic_name=magic_name
2406 func, magic_kind=magic_kind, magic_name=magic_name
2405 )
2407 )
2406
2408
2407 def _find_with_lazy_load(self, /, type_, magic_name: str):
2409 def _find_with_lazy_load(self, /, type_, magic_name: str):
2408 """
2410 """
2409 Try to find a magic potentially lazy-loading it.
2411 Try to find a magic potentially lazy-loading it.
2410
2412
2411 Parameters
2413 Parameters
2412 ----------
2414 ----------
2413
2415
2414 type_: "line"|"cell"
2416 type_: "line"|"cell"
2415 the type of magics we are trying to find/lazy load.
2417 the type of magics we are trying to find/lazy load.
2416 magic_name: str
2418 magic_name: str
2417 The name of the magic we are trying to find/lazy load
2419 The name of the magic we are trying to find/lazy load
2418
2420
2419
2421
2420 Note that this may have any side effects
2422 Note that this may have any side effects
2421 """
2423 """
2422 finder = {"line": self.find_line_magic, "cell": self.find_cell_magic}[type_]
2424 finder = {"line": self.find_line_magic, "cell": self.find_cell_magic}[type_]
2423 fn = finder(magic_name)
2425 fn = finder(magic_name)
2424 if fn is not None:
2426 if fn is not None:
2425 return fn
2427 return fn
2426 lazy = self.magics_manager.lazy_magics.get(magic_name)
2428 lazy = self.magics_manager.lazy_magics.get(magic_name)
2427 if lazy is None:
2429 if lazy is None:
2428 return None
2430 return None
2429
2431
2430 self.run_line_magic("load_ext", lazy)
2432 self.run_line_magic("load_ext", lazy)
2431 res = finder(magic_name)
2433 res = finder(magic_name)
2432 return res
2434 return res
2433
2435
2434 def run_line_magic(self, magic_name: str, line: str, _stack_depth=1):
2436 def run_line_magic(self, magic_name: str, line: str, _stack_depth=1):
2435 """Execute the given line magic.
2437 """Execute the given line magic.
2436
2438
2437 Parameters
2439 Parameters
2438 ----------
2440 ----------
2439 magic_name : str
2441 magic_name : str
2440 Name of the desired magic function, without '%' prefix.
2442 Name of the desired magic function, without '%' prefix.
2441 line : str
2443 line : str
2442 The rest of the input line as a single string.
2444 The rest of the input line as a single string.
2443 _stack_depth : int
2445 _stack_depth : int
2444 If run_line_magic() is called from magic() then _stack_depth=2.
2446 If run_line_magic() is called from magic() then _stack_depth=2.
2445 This is added to ensure backward compatibility for use of 'get_ipython().magic()'
2447 This is added to ensure backward compatibility for use of 'get_ipython().magic()'
2446 """
2448 """
2447 fn = self._find_with_lazy_load("line", magic_name)
2449 fn = self._find_with_lazy_load("line", magic_name)
2448 if fn is None:
2450 if fn is None:
2449 lazy = self.magics_manager.lazy_magics.get(magic_name)
2451 lazy = self.magics_manager.lazy_magics.get(magic_name)
2450 if lazy:
2452 if lazy:
2451 self.run_line_magic("load_ext", lazy)
2453 self.run_line_magic("load_ext", lazy)
2452 fn = self.find_line_magic(magic_name)
2454 fn = self.find_line_magic(magic_name)
2453 if fn is None:
2455 if fn is None:
2454 cm = self.find_cell_magic(magic_name)
2456 cm = self.find_cell_magic(magic_name)
2455 etpl = "Line magic function `%%%s` not found%s."
2457 etpl = "Line magic function `%%%s` not found%s."
2456 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2458 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2457 'did you mean that instead?)' % magic_name )
2459 'did you mean that instead?)' % magic_name )
2458 raise UsageError(etpl % (magic_name, extra))
2460 raise UsageError(etpl % (magic_name, extra))
2459 else:
2461 else:
2460 # Note: this is the distance in the stack to the user's frame.
2462 # Note: this is the distance in the stack to the user's frame.
2461 # This will need to be updated if the internal calling logic gets
2463 # This will need to be updated if the internal calling logic gets
2462 # refactored, or else we'll be expanding the wrong variables.
2464 # refactored, or else we'll be expanding the wrong variables.
2463
2465
2464 # Determine stack_depth depending on where run_line_magic() has been called
2466 # Determine stack_depth depending on where run_line_magic() has been called
2465 stack_depth = _stack_depth
2467 stack_depth = _stack_depth
2466 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2468 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2467 # magic has opted out of var_expand
2469 # magic has opted out of var_expand
2468 magic_arg_s = line
2470 magic_arg_s = line
2469 else:
2471 else:
2470 magic_arg_s = self.var_expand(line, stack_depth)
2472 magic_arg_s = self.var_expand(line, stack_depth)
2471 # Put magic args in a list so we can call with f(*a) syntax
2473 # Put magic args in a list so we can call with f(*a) syntax
2472 args = [magic_arg_s]
2474 args = [magic_arg_s]
2473 kwargs = {}
2475 kwargs = {}
2474 # Grab local namespace if we need it:
2476 # Grab local namespace if we need it:
2475 if getattr(fn, "needs_local_scope", False):
2477 if getattr(fn, "needs_local_scope", False):
2476 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2478 kwargs['local_ns'] = self.get_local_scope(stack_depth)
2477 with self.builtin_trap:
2479 with self.builtin_trap:
2478 result = fn(*args, **kwargs)
2480 result = fn(*args, **kwargs)
2479
2481
2480 # The code below prevents the output from being displayed
2482 # The code below prevents the output from being displayed
2481 # when using magics with decorator @output_can_be_silenced
2483 # when using magics with decorator @output_can_be_silenced
2482 # when the last Python token in the expression is a ';'.
2484 # when the last Python token in the expression is a ';'.
2483 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2485 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2484 if DisplayHook.semicolon_at_end_of_expression(magic_arg_s):
2486 if DisplayHook.semicolon_at_end_of_expression(magic_arg_s):
2485 return None
2487 return None
2486
2488
2487 return result
2489 return result
2488
2490
2489 def get_local_scope(self, stack_depth):
2491 def get_local_scope(self, stack_depth):
2490 """Get local scope at given stack depth.
2492 """Get local scope at given stack depth.
2491
2493
2492 Parameters
2494 Parameters
2493 ----------
2495 ----------
2494 stack_depth : int
2496 stack_depth : int
2495 Depth relative to calling frame
2497 Depth relative to calling frame
2496 """
2498 """
2497 return sys._getframe(stack_depth + 1).f_locals
2499 return sys._getframe(stack_depth + 1).f_locals
2498
2500
2499 def run_cell_magic(self, magic_name, line, cell):
2501 def run_cell_magic(self, magic_name, line, cell):
2500 """Execute the given cell magic.
2502 """Execute the given cell magic.
2501
2503
2502 Parameters
2504 Parameters
2503 ----------
2505 ----------
2504 magic_name : str
2506 magic_name : str
2505 Name of the desired magic function, without '%' prefix.
2507 Name of the desired magic function, without '%' prefix.
2506 line : str
2508 line : str
2507 The rest of the first input line as a single string.
2509 The rest of the first input line as a single string.
2508 cell : str
2510 cell : str
2509 The body of the cell as a (possibly multiline) string.
2511 The body of the cell as a (possibly multiline) string.
2510 """
2512 """
2511 fn = self._find_with_lazy_load("cell", magic_name)
2513 fn = self._find_with_lazy_load("cell", magic_name)
2512 if fn is None:
2514 if fn is None:
2513 lm = self.find_line_magic(magic_name)
2515 lm = self.find_line_magic(magic_name)
2514 etpl = "Cell magic `%%{0}` not found{1}."
2516 etpl = "Cell magic `%%{0}` not found{1}."
2515 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2517 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2516 'did you mean that instead?)'.format(magic_name))
2518 'did you mean that instead?)'.format(magic_name))
2517 raise UsageError(etpl.format(magic_name, extra))
2519 raise UsageError(etpl.format(magic_name, extra))
2518 elif cell == '':
2520 elif cell == '':
2519 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2521 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2520 if self.find_line_magic(magic_name) is not None:
2522 if self.find_line_magic(magic_name) is not None:
2521 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2523 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2522 raise UsageError(message)
2524 raise UsageError(message)
2523 else:
2525 else:
2524 # Note: this is the distance in the stack to the user's frame.
2526 # Note: this is the distance in the stack to the user's frame.
2525 # This will need to be updated if the internal calling logic gets
2527 # This will need to be updated if the internal calling logic gets
2526 # refactored, or else we'll be expanding the wrong variables.
2528 # refactored, or else we'll be expanding the wrong variables.
2527 stack_depth = 2
2529 stack_depth = 2
2528 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2530 if getattr(fn, magic.MAGIC_NO_VAR_EXPAND_ATTR, False):
2529 # magic has opted out of var_expand
2531 # magic has opted out of var_expand
2530 magic_arg_s = line
2532 magic_arg_s = line
2531 else:
2533 else:
2532 magic_arg_s = self.var_expand(line, stack_depth)
2534 magic_arg_s = self.var_expand(line, stack_depth)
2533 kwargs = {}
2535 kwargs = {}
2534 if getattr(fn, "needs_local_scope", False):
2536 if getattr(fn, "needs_local_scope", False):
2535 kwargs['local_ns'] = self.user_ns
2537 kwargs['local_ns'] = self.user_ns
2536
2538
2537 with self.builtin_trap:
2539 with self.builtin_trap:
2538 args = (magic_arg_s, cell)
2540 args = (magic_arg_s, cell)
2539 result = fn(*args, **kwargs)
2541 result = fn(*args, **kwargs)
2540
2542
2541 # The code below prevents the output from being displayed
2543 # The code below prevents the output from being displayed
2542 # when using magics with decorator @output_can_be_silenced
2544 # when using magics with decorator @output_can_be_silenced
2543 # when the last Python token in the expression is a ';'.
2545 # when the last Python token in the expression is a ';'.
2544 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2546 if getattr(fn, magic.MAGIC_OUTPUT_CAN_BE_SILENCED, False):
2545 if DisplayHook.semicolon_at_end_of_expression(cell):
2547 if DisplayHook.semicolon_at_end_of_expression(cell):
2546 return None
2548 return None
2547
2549
2548 return result
2550 return result
2549
2551
2550 def find_line_magic(self, magic_name):
2552 def find_line_magic(self, magic_name):
2551 """Find and return a line magic by name.
2553 """Find and return a line magic by name.
2552
2554
2553 Returns None if the magic isn't found."""
2555 Returns None if the magic isn't found."""
2554 return self.magics_manager.magics['line'].get(magic_name)
2556 return self.magics_manager.magics['line'].get(magic_name)
2555
2557
2556 def find_cell_magic(self, magic_name):
2558 def find_cell_magic(self, magic_name):
2557 """Find and return a cell magic by name.
2559 """Find and return a cell magic by name.
2558
2560
2559 Returns None if the magic isn't found."""
2561 Returns None if the magic isn't found."""
2560 return self.magics_manager.magics['cell'].get(magic_name)
2562 return self.magics_manager.magics['cell'].get(magic_name)
2561
2563
2562 def find_magic(self, magic_name, magic_kind='line'):
2564 def find_magic(self, magic_name, magic_kind='line'):
2563 """Find and return a magic of the given type by name.
2565 """Find and return a magic of the given type by name.
2564
2566
2565 Returns None if the magic isn't found."""
2567 Returns None if the magic isn't found."""
2566 return self.magics_manager.magics[magic_kind].get(magic_name)
2568 return self.magics_manager.magics[magic_kind].get(magic_name)
2567
2569
2568 def magic(self, arg_s):
2570 def magic(self, arg_s):
2569 """
2571 """
2570 DEPRECATED
2572 DEPRECATED
2571
2573
2572 Deprecated since IPython 0.13 (warning added in
2574 Deprecated since IPython 0.13 (warning added in
2573 8.1), use run_line_magic(magic_name, parameter_s).
2575 8.1), use run_line_magic(magic_name, parameter_s).
2574
2576
2575 Call a magic function by name.
2577 Call a magic function by name.
2576
2578
2577 Input: a string containing the name of the magic function to call and
2579 Input: a string containing the name of the magic function to call and
2578 any additional arguments to be passed to the magic.
2580 any additional arguments to be passed to the magic.
2579
2581
2580 magic('name -opt foo bar') is equivalent to typing at the ipython
2582 magic('name -opt foo bar') is equivalent to typing at the ipython
2581 prompt:
2583 prompt:
2582
2584
2583 In[1]: %name -opt foo bar
2585 In[1]: %name -opt foo bar
2584
2586
2585 To call a magic without arguments, simply use magic('name').
2587 To call a magic without arguments, simply use magic('name').
2586
2588
2587 This provides a proper Python function to call IPython's magics in any
2589 This provides a proper Python function to call IPython's magics in any
2588 valid Python code you can type at the interpreter, including loops and
2590 valid Python code you can type at the interpreter, including loops and
2589 compound statements.
2591 compound statements.
2590 """
2592 """
2591 warnings.warn(
2593 warnings.warn(
2592 "`magic(...)` is deprecated since IPython 0.13 (warning added in "
2594 "`magic(...)` is deprecated since IPython 0.13 (warning added in "
2593 "8.1), use run_line_magic(magic_name, parameter_s).",
2595 "8.1), use run_line_magic(magic_name, parameter_s).",
2594 DeprecationWarning,
2596 DeprecationWarning,
2595 stacklevel=2,
2597 stacklevel=2,
2596 )
2598 )
2597 # TODO: should we issue a loud deprecation warning here?
2599 # TODO: should we issue a loud deprecation warning here?
2598 magic_name, _, magic_arg_s = arg_s.partition(' ')
2600 magic_name, _, magic_arg_s = arg_s.partition(' ')
2599 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2601 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2600 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2)
2602 return self.run_line_magic(magic_name, magic_arg_s, _stack_depth=2)
2601
2603
2602 #-------------------------------------------------------------------------
2604 #-------------------------------------------------------------------------
2603 # Things related to macros
2605 # Things related to macros
2604 #-------------------------------------------------------------------------
2606 #-------------------------------------------------------------------------
2605
2607
2606 def define_macro(self, name, themacro):
2608 def define_macro(self, name, themacro):
2607 """Define a new macro
2609 """Define a new macro
2608
2610
2609 Parameters
2611 Parameters
2610 ----------
2612 ----------
2611 name : str
2613 name : str
2612 The name of the macro.
2614 The name of the macro.
2613 themacro : str or Macro
2615 themacro : str or Macro
2614 The action to do upon invoking the macro. If a string, a new
2616 The action to do upon invoking the macro. If a string, a new
2615 Macro object is created by passing the string to it.
2617 Macro object is created by passing the string to it.
2616 """
2618 """
2617
2619
2618 from IPython.core import macro
2620 from IPython.core import macro
2619
2621
2620 if isinstance(themacro, str):
2622 if isinstance(themacro, str):
2621 themacro = macro.Macro(themacro)
2623 themacro = macro.Macro(themacro)
2622 if not isinstance(themacro, macro.Macro):
2624 if not isinstance(themacro, macro.Macro):
2623 raise ValueError('A macro must be a string or a Macro instance.')
2625 raise ValueError('A macro must be a string or a Macro instance.')
2624 self.user_ns[name] = themacro
2626 self.user_ns[name] = themacro
2625
2627
2626 #-------------------------------------------------------------------------
2628 #-------------------------------------------------------------------------
2627 # Things related to the running of system commands
2629 # Things related to the running of system commands
2628 #-------------------------------------------------------------------------
2630 #-------------------------------------------------------------------------
2629
2631
2630 def system_piped(self, cmd):
2632 def system_piped(self, cmd):
2631 """Call the given cmd in a subprocess, piping stdout/err
2633 """Call the given cmd in a subprocess, piping stdout/err
2632
2634
2633 Parameters
2635 Parameters
2634 ----------
2636 ----------
2635 cmd : str
2637 cmd : str
2636 Command to execute (can not end in '&', as background processes are
2638 Command to execute (can not end in '&', as background processes are
2637 not supported. Should not be a command that expects input
2639 not supported. Should not be a command that expects input
2638 other than simple text.
2640 other than simple text.
2639 """
2641 """
2640 if cmd.rstrip().endswith('&'):
2642 if cmd.rstrip().endswith('&'):
2641 # this is *far* from a rigorous test
2643 # this is *far* from a rigorous test
2642 # We do not support backgrounding processes because we either use
2644 # We do not support backgrounding processes because we either use
2643 # pexpect or pipes to read from. Users can always just call
2645 # pexpect or pipes to read from. Users can always just call
2644 # os.system() or use ip.system=ip.system_raw
2646 # os.system() or use ip.system=ip.system_raw
2645 # if they really want a background process.
2647 # if they really want a background process.
2646 raise OSError("Background processes not supported.")
2648 raise OSError("Background processes not supported.")
2647
2649
2648 # we explicitly do NOT return the subprocess status code, because
2650 # we explicitly do NOT return the subprocess status code, because
2649 # a non-None value would trigger :func:`sys.displayhook` calls.
2651 # a non-None value would trigger :func:`sys.displayhook` calls.
2650 # Instead, we store the exit_code in user_ns.
2652 # Instead, we store the exit_code in user_ns.
2651 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2653 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2652
2654
2653 def system_raw(self, cmd):
2655 def system_raw(self, cmd):
2654 """Call the given cmd in a subprocess using os.system on Windows or
2656 """Call the given cmd in a subprocess using os.system on Windows or
2655 subprocess.call using the system shell on other platforms.
2657 subprocess.call using the system shell on other platforms.
2656
2658
2657 Parameters
2659 Parameters
2658 ----------
2660 ----------
2659 cmd : str
2661 cmd : str
2660 Command to execute.
2662 Command to execute.
2661 """
2663 """
2662 cmd = self.var_expand(cmd, depth=1)
2664 cmd = self.var_expand(cmd, depth=1)
2663 # warn if there is an IPython magic alternative.
2665 # warn if there is an IPython magic alternative.
2664 if cmd == "":
2666 if cmd == "":
2665 main_cmd = ""
2667 main_cmd = ""
2666 else:
2668 else:
2667 main_cmd = cmd.split()[0]
2669 main_cmd = cmd.split()[0]
2668 has_magic_alternatives = ("pip", "conda", "cd")
2670 has_magic_alternatives = ("pip", "conda", "cd")
2669
2671
2670 if main_cmd in has_magic_alternatives:
2672 if main_cmd in has_magic_alternatives:
2671 warnings.warn(
2673 warnings.warn(
2672 (
2674 (
2673 "You executed the system command !{0} which may not work "
2675 "You executed the system command !{0} which may not work "
2674 "as expected. Try the IPython magic %{0} instead."
2676 "as expected. Try the IPython magic %{0} instead."
2675 ).format(main_cmd)
2677 ).format(main_cmd)
2676 )
2678 )
2677
2679
2678 # protect os.system from UNC paths on Windows, which it can't handle:
2680 # protect os.system from UNC paths on Windows, which it can't handle:
2679 if sys.platform == 'win32':
2681 if sys.platform == 'win32':
2680 from IPython.utils._process_win32 import AvoidUNCPath
2682 from IPython.utils._process_win32 import AvoidUNCPath
2681 with AvoidUNCPath() as path:
2683 with AvoidUNCPath() as path:
2682 if path is not None:
2684 if path is not None:
2683 cmd = '"pushd %s &&"%s' % (path, cmd)
2685 cmd = '"pushd %s &&"%s' % (path, cmd)
2684 try:
2686 try:
2685 ec = os.system(cmd)
2687 ec = os.system(cmd)
2686 except KeyboardInterrupt:
2688 except KeyboardInterrupt:
2687 print('\n' + self.get_exception_only(), file=sys.stderr)
2689 print('\n' + self.get_exception_only(), file=sys.stderr)
2688 ec = -2
2690 ec = -2
2689 else:
2691 else:
2690 # For posix the result of the subprocess.call() below is an exit
2692 # For posix the result of the subprocess.call() below is an exit
2691 # code, which by convention is zero for success, positive for
2693 # code, which by convention is zero for success, positive for
2692 # program failure. Exit codes above 128 are reserved for signals,
2694 # program failure. Exit codes above 128 are reserved for signals,
2693 # and the formula for converting a signal to an exit code is usually
2695 # and the formula for converting a signal to an exit code is usually
2694 # signal_number+128. To more easily differentiate between exit
2696 # signal_number+128. To more easily differentiate between exit
2695 # codes and signals, ipython uses negative numbers. For instance
2697 # codes and signals, ipython uses negative numbers. For instance
2696 # since control-c is signal 2 but exit code 130, ipython's
2698 # since control-c is signal 2 but exit code 130, ipython's
2697 # _exit_code variable will read -2. Note that some shells like
2699 # _exit_code variable will read -2. Note that some shells like
2698 # csh and fish don't follow sh/bash conventions for exit codes.
2700 # csh and fish don't follow sh/bash conventions for exit codes.
2699 executable = os.environ.get('SHELL', None)
2701 executable = os.environ.get('SHELL', None)
2700 try:
2702 try:
2701 # Use env shell instead of default /bin/sh
2703 # Use env shell instead of default /bin/sh
2702 ec = subprocess.call(cmd, shell=True, executable=executable)
2704 ec = subprocess.call(cmd, shell=True, executable=executable)
2703 except KeyboardInterrupt:
2705 except KeyboardInterrupt:
2704 # intercept control-C; a long traceback is not useful here
2706 # intercept control-C; a long traceback is not useful here
2705 print('\n' + self.get_exception_only(), file=sys.stderr)
2707 print('\n' + self.get_exception_only(), file=sys.stderr)
2706 ec = 130
2708 ec = 130
2707 if ec > 128:
2709 if ec > 128:
2708 ec = -(ec - 128)
2710 ec = -(ec - 128)
2709
2711
2710 # We explicitly do NOT return the subprocess status code, because
2712 # We explicitly do NOT return the subprocess status code, because
2711 # a non-None value would trigger :func:`sys.displayhook` calls.
2713 # a non-None value would trigger :func:`sys.displayhook` calls.
2712 # Instead, we store the exit_code in user_ns. Note the semantics
2714 # Instead, we store the exit_code in user_ns. Note the semantics
2713 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2715 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2714 # but raising SystemExit(_exit_code) will give status 254!
2716 # but raising SystemExit(_exit_code) will give status 254!
2715 self.user_ns['_exit_code'] = ec
2717 self.user_ns['_exit_code'] = ec
2716
2718
2717 # use piped system by default, because it is better behaved
2719 # use piped system by default, because it is better behaved
2718 system = system_piped
2720 system = system_piped
2719
2721
2720 def getoutput(self, cmd, split=True, depth=0):
2722 def getoutput(self, cmd, split=True, depth=0):
2721 """Get output (possibly including stderr) from a subprocess.
2723 """Get output (possibly including stderr) from a subprocess.
2722
2724
2723 Parameters
2725 Parameters
2724 ----------
2726 ----------
2725 cmd : str
2727 cmd : str
2726 Command to execute (can not end in '&', as background processes are
2728 Command to execute (can not end in '&', as background processes are
2727 not supported.
2729 not supported.
2728 split : bool, optional
2730 split : bool, optional
2729 If True, split the output into an IPython SList. Otherwise, an
2731 If True, split the output into an IPython SList. Otherwise, an
2730 IPython LSString is returned. These are objects similar to normal
2732 IPython LSString is returned. These are objects similar to normal
2731 lists and strings, with a few convenience attributes for easier
2733 lists and strings, with a few convenience attributes for easier
2732 manipulation of line-based output. You can use '?' on them for
2734 manipulation of line-based output. You can use '?' on them for
2733 details.
2735 details.
2734 depth : int, optional
2736 depth : int, optional
2735 How many frames above the caller are the local variables which should
2737 How many frames above the caller are the local variables which should
2736 be expanded in the command string? The default (0) assumes that the
2738 be expanded in the command string? The default (0) assumes that the
2737 expansion variables are in the stack frame calling this function.
2739 expansion variables are in the stack frame calling this function.
2738 """
2740 """
2739 if cmd.rstrip().endswith('&'):
2741 if cmd.rstrip().endswith('&'):
2740 # this is *far* from a rigorous test
2742 # this is *far* from a rigorous test
2741 raise OSError("Background processes not supported.")
2743 raise OSError("Background processes not supported.")
2742 out = getoutput(self.var_expand(cmd, depth=depth+1))
2744 out = getoutput(self.var_expand(cmd, depth=depth+1))
2743 if split:
2745 if split:
2744 out = SList(out.splitlines())
2746 out = SList(out.splitlines())
2745 else:
2747 else:
2746 out = LSString(out)
2748 out = LSString(out)
2747 return out
2749 return out
2748
2750
2749 #-------------------------------------------------------------------------
2751 #-------------------------------------------------------------------------
2750 # Things related to aliases
2752 # Things related to aliases
2751 #-------------------------------------------------------------------------
2753 #-------------------------------------------------------------------------
2752
2754
2753 def init_alias(self):
2755 def init_alias(self):
2754 self.alias_manager = AliasManager(shell=self, parent=self)
2756 self.alias_manager = AliasManager(shell=self, parent=self)
2755 self.configurables.append(self.alias_manager)
2757 self.configurables.append(self.alias_manager)
2756
2758
2757 #-------------------------------------------------------------------------
2759 #-------------------------------------------------------------------------
2758 # Things related to extensions
2760 # Things related to extensions
2759 #-------------------------------------------------------------------------
2761 #-------------------------------------------------------------------------
2760
2762
2761 def init_extension_manager(self):
2763 def init_extension_manager(self):
2762 self.extension_manager = ExtensionManager(shell=self, parent=self)
2764 self.extension_manager = ExtensionManager(shell=self, parent=self)
2763 self.configurables.append(self.extension_manager)
2765 self.configurables.append(self.extension_manager)
2764
2766
2765 #-------------------------------------------------------------------------
2767 #-------------------------------------------------------------------------
2766 # Things related to payloads
2768 # Things related to payloads
2767 #-------------------------------------------------------------------------
2769 #-------------------------------------------------------------------------
2768
2770
2769 def init_payload(self):
2771 def init_payload(self):
2770 self.payload_manager = PayloadManager(parent=self)
2772 self.payload_manager = PayloadManager(parent=self)
2771 self.configurables.append(self.payload_manager)
2773 self.configurables.append(self.payload_manager)
2772
2774
2773 #-------------------------------------------------------------------------
2775 #-------------------------------------------------------------------------
2774 # Things related to the prefilter
2776 # Things related to the prefilter
2775 #-------------------------------------------------------------------------
2777 #-------------------------------------------------------------------------
2776
2778
2777 def init_prefilter(self):
2779 def init_prefilter(self):
2778 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2780 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2779 self.configurables.append(self.prefilter_manager)
2781 self.configurables.append(self.prefilter_manager)
2780 # Ultimately this will be refactored in the new interpreter code, but
2782 # Ultimately this will be refactored in the new interpreter code, but
2781 # for now, we should expose the main prefilter method (there's legacy
2783 # for now, we should expose the main prefilter method (there's legacy
2782 # code out there that may rely on this).
2784 # code out there that may rely on this).
2783 self.prefilter = self.prefilter_manager.prefilter_lines
2785 self.prefilter = self.prefilter_manager.prefilter_lines
2784
2786
2785 def auto_rewrite_input(self, cmd):
2787 def auto_rewrite_input(self, cmd):
2786 """Print to the screen the rewritten form of the user's command.
2788 """Print to the screen the rewritten form of the user's command.
2787
2789
2788 This shows visual feedback by rewriting input lines that cause
2790 This shows visual feedback by rewriting input lines that cause
2789 automatic calling to kick in, like::
2791 automatic calling to kick in, like::
2790
2792
2791 /f x
2793 /f x
2792
2794
2793 into::
2795 into::
2794
2796
2795 ------> f(x)
2797 ------> f(x)
2796
2798
2797 after the user's input prompt. This helps the user understand that the
2799 after the user's input prompt. This helps the user understand that the
2798 input line was transformed automatically by IPython.
2800 input line was transformed automatically by IPython.
2799 """
2801 """
2800 if not self.show_rewritten_input:
2802 if not self.show_rewritten_input:
2801 return
2803 return
2802
2804
2803 # This is overridden in TerminalInteractiveShell to use fancy prompts
2805 # This is overridden in TerminalInteractiveShell to use fancy prompts
2804 print("------> " + cmd)
2806 print("------> " + cmd)
2805
2807
2806 #-------------------------------------------------------------------------
2808 #-------------------------------------------------------------------------
2807 # Things related to extracting values/expressions from kernel and user_ns
2809 # Things related to extracting values/expressions from kernel and user_ns
2808 #-------------------------------------------------------------------------
2810 #-------------------------------------------------------------------------
2809
2811
2810 def _user_obj_error(self):
2812 def _user_obj_error(self):
2811 """return simple exception dict
2813 """return simple exception dict
2812
2814
2813 for use in user_expressions
2815 for use in user_expressions
2814 """
2816 """
2815
2817
2816 etype, evalue, tb = self._get_exc_info()
2818 etype, evalue, tb = self._get_exc_info()
2817 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2819 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2818
2820
2819 exc_info = {
2821 exc_info = {
2820 "status": "error",
2822 "status": "error",
2821 "traceback": stb,
2823 "traceback": stb,
2822 "ename": etype.__name__,
2824 "ename": etype.__name__,
2823 "evalue": py3compat.safe_unicode(evalue),
2825 "evalue": py3compat.safe_unicode(evalue),
2824 }
2826 }
2825
2827
2826 return exc_info
2828 return exc_info
2827
2829
2828 def _format_user_obj(self, obj):
2830 def _format_user_obj(self, obj):
2829 """format a user object to display dict
2831 """format a user object to display dict
2830
2832
2831 for use in user_expressions
2833 for use in user_expressions
2832 """
2834 """
2833
2835
2834 data, md = self.display_formatter.format(obj)
2836 data, md = self.display_formatter.format(obj)
2835 value = {
2837 value = {
2836 'status' : 'ok',
2838 'status' : 'ok',
2837 'data' : data,
2839 'data' : data,
2838 'metadata' : md,
2840 'metadata' : md,
2839 }
2841 }
2840 return value
2842 return value
2841
2843
2842 def user_expressions(self, expressions):
2844 def user_expressions(self, expressions):
2843 """Evaluate a dict of expressions in the user's namespace.
2845 """Evaluate a dict of expressions in the user's namespace.
2844
2846
2845 Parameters
2847 Parameters
2846 ----------
2848 ----------
2847 expressions : dict
2849 expressions : dict
2848 A dict with string keys and string values. The expression values
2850 A dict with string keys and string values. The expression values
2849 should be valid Python expressions, each of which will be evaluated
2851 should be valid Python expressions, each of which will be evaluated
2850 in the user namespace.
2852 in the user namespace.
2851
2853
2852 Returns
2854 Returns
2853 -------
2855 -------
2854 A dict, keyed like the input expressions dict, with the rich mime-typed
2856 A dict, keyed like the input expressions dict, with the rich mime-typed
2855 display_data of each value.
2857 display_data of each value.
2856 """
2858 """
2857 out = {}
2859 out = {}
2858 user_ns = self.user_ns
2860 user_ns = self.user_ns
2859 global_ns = self.user_global_ns
2861 global_ns = self.user_global_ns
2860
2862
2861 for key, expr in expressions.items():
2863 for key, expr in expressions.items():
2862 try:
2864 try:
2863 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2865 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2864 except:
2866 except:
2865 value = self._user_obj_error()
2867 value = self._user_obj_error()
2866 out[key] = value
2868 out[key] = value
2867 return out
2869 return out
2868
2870
2869 #-------------------------------------------------------------------------
2871 #-------------------------------------------------------------------------
2870 # Things related to the running of code
2872 # Things related to the running of code
2871 #-------------------------------------------------------------------------
2873 #-------------------------------------------------------------------------
2872
2874
2873 def ex(self, cmd):
2875 def ex(self, cmd):
2874 """Execute a normal python statement in user namespace."""
2876 """Execute a normal python statement in user namespace."""
2875 with self.builtin_trap:
2877 with self.builtin_trap:
2876 exec(cmd, self.user_global_ns, self.user_ns)
2878 exec(cmd, self.user_global_ns, self.user_ns)
2877
2879
2878 def ev(self, expr):
2880 def ev(self, expr):
2879 """Evaluate python expression expr in user namespace.
2881 """Evaluate python expression expr in user namespace.
2880
2882
2881 Returns the result of evaluation
2883 Returns the result of evaluation
2882 """
2884 """
2883 with self.builtin_trap:
2885 with self.builtin_trap:
2884 return eval(expr, self.user_global_ns, self.user_ns)
2886 return eval(expr, self.user_global_ns, self.user_ns)
2885
2887
2886 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False):
2888 def safe_execfile(self, fname, *where, exit_ignore=False, raise_exceptions=False, shell_futures=False):
2887 """A safe version of the builtin execfile().
2889 """A safe version of the builtin execfile().
2888
2890
2889 This version will never throw an exception, but instead print
2891 This version will never throw an exception, but instead print
2890 helpful error messages to the screen. This only works on pure
2892 helpful error messages to the screen. This only works on pure
2891 Python files with the .py extension.
2893 Python files with the .py extension.
2892
2894
2893 Parameters
2895 Parameters
2894 ----------
2896 ----------
2895 fname : string
2897 fname : string
2896 The name of the file to be executed.
2898 The name of the file to be executed.
2897 *where : tuple
2899 *where : tuple
2898 One or two namespaces, passed to execfile() as (globals,locals).
2900 One or two namespaces, passed to execfile() as (globals,locals).
2899 If only one is given, it is passed as both.
2901 If only one is given, it is passed as both.
2900 exit_ignore : bool (False)
2902 exit_ignore : bool (False)
2901 If True, then silence SystemExit for non-zero status (it is always
2903 If True, then silence SystemExit for non-zero status (it is always
2902 silenced for zero status, as it is so common).
2904 silenced for zero status, as it is so common).
2903 raise_exceptions : bool (False)
2905 raise_exceptions : bool (False)
2904 If True raise exceptions everywhere. Meant for testing.
2906 If True raise exceptions everywhere. Meant for testing.
2905 shell_futures : bool (False)
2907 shell_futures : bool (False)
2906 If True, the code will share future statements with the interactive
2908 If True, the code will share future statements with the interactive
2907 shell. It will both be affected by previous __future__ imports, and
2909 shell. It will both be affected by previous __future__ imports, and
2908 any __future__ imports in the code will affect the shell. If False,
2910 any __future__ imports in the code will affect the shell. If False,
2909 __future__ imports are not shared in either direction.
2911 __future__ imports are not shared in either direction.
2910
2912
2911 """
2913 """
2912 fname = Path(fname).expanduser().resolve()
2914 fname = Path(fname).expanduser().resolve()
2913
2915
2914 # Make sure we can open the file
2916 # Make sure we can open the file
2915 try:
2917 try:
2916 with fname.open("rb"):
2918 with fname.open("rb"):
2917 pass
2919 pass
2918 except:
2920 except:
2919 warn('Could not open file <%s> for safe execution.' % fname)
2921 warn('Could not open file <%s> for safe execution.' % fname)
2920 return
2922 return
2921
2923
2922 # Find things also in current directory. This is needed to mimic the
2924 # Find things also in current directory. This is needed to mimic the
2923 # behavior of running a script from the system command line, where
2925 # behavior of running a script from the system command line, where
2924 # Python inserts the script's directory into sys.path
2926 # Python inserts the script's directory into sys.path
2925 dname = str(fname.parent)
2927 dname = str(fname.parent)
2926
2928
2927 with prepended_to_syspath(dname), self.builtin_trap:
2929 with prepended_to_syspath(dname), self.builtin_trap:
2928 try:
2930 try:
2929 glob, loc = (where + (None, ))[:2]
2931 glob, loc = (where + (None, ))[:2]
2930 py3compat.execfile(
2932 py3compat.execfile(
2931 fname, glob, loc,
2933 fname, glob, loc,
2932 self.compile if shell_futures else None)
2934 self.compile if shell_futures else None)
2933 except SystemExit as status:
2935 except SystemExit as status:
2934 # If the call was made with 0 or None exit status (sys.exit(0)
2936 # If the call was made with 0 or None exit status (sys.exit(0)
2935 # or sys.exit() ), don't bother showing a traceback, as both of
2937 # or sys.exit() ), don't bother showing a traceback, as both of
2936 # these are considered normal by the OS:
2938 # these are considered normal by the OS:
2937 # > python -c'import sys;sys.exit(0)'; echo $?
2939 # > python -c'import sys;sys.exit(0)'; echo $?
2938 # 0
2940 # 0
2939 # > python -c'import sys;sys.exit()'; echo $?
2941 # > python -c'import sys;sys.exit()'; echo $?
2940 # 0
2942 # 0
2941 # For other exit status, we show the exception unless
2943 # For other exit status, we show the exception unless
2942 # explicitly silenced, but only in short form.
2944 # explicitly silenced, but only in short form.
2943 if status.code:
2945 if status.code:
2944 if raise_exceptions:
2946 if raise_exceptions:
2945 raise
2947 raise
2946 if not exit_ignore:
2948 if not exit_ignore:
2947 self.showtraceback(exception_only=True)
2949 self.showtraceback(exception_only=True)
2948 except:
2950 except:
2949 if raise_exceptions:
2951 if raise_exceptions:
2950 raise
2952 raise
2951 # tb offset is 2 because we wrap execfile
2953 # tb offset is 2 because we wrap execfile
2952 self.showtraceback(tb_offset=2)
2954 self.showtraceback(tb_offset=2)
2953
2955
2954 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2956 def safe_execfile_ipy(self, fname, shell_futures=False, raise_exceptions=False):
2955 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2957 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2956
2958
2957 Parameters
2959 Parameters
2958 ----------
2960 ----------
2959 fname : str
2961 fname : str
2960 The name of the file to execute. The filename must have a
2962 The name of the file to execute. The filename must have a
2961 .ipy or .ipynb extension.
2963 .ipy or .ipynb extension.
2962 shell_futures : bool (False)
2964 shell_futures : bool (False)
2963 If True, the code will share future statements with the interactive
2965 If True, the code will share future statements with the interactive
2964 shell. It will both be affected by previous __future__ imports, and
2966 shell. It will both be affected by previous __future__ imports, and
2965 any __future__ imports in the code will affect the shell. If False,
2967 any __future__ imports in the code will affect the shell. If False,
2966 __future__ imports are not shared in either direction.
2968 __future__ imports are not shared in either direction.
2967 raise_exceptions : bool (False)
2969 raise_exceptions : bool (False)
2968 If True raise exceptions everywhere. Meant for testing.
2970 If True raise exceptions everywhere. Meant for testing.
2969 """
2971 """
2970 fname = Path(fname).expanduser().resolve()
2972 fname = Path(fname).expanduser().resolve()
2971
2973
2972 # Make sure we can open the file
2974 # Make sure we can open the file
2973 try:
2975 try:
2974 with fname.open("rb"):
2976 with fname.open("rb"):
2975 pass
2977 pass
2976 except:
2978 except:
2977 warn('Could not open file <%s> for safe execution.' % fname)
2979 warn('Could not open file <%s> for safe execution.' % fname)
2978 return
2980 return
2979
2981
2980 # Find things also in current directory. This is needed to mimic the
2982 # Find things also in current directory. This is needed to mimic the
2981 # behavior of running a script from the system command line, where
2983 # behavior of running a script from the system command line, where
2982 # Python inserts the script's directory into sys.path
2984 # Python inserts the script's directory into sys.path
2983 dname = str(fname.parent)
2985 dname = str(fname.parent)
2984
2986
2985 def get_cells():
2987 def get_cells():
2986 """generator for sequence of code blocks to run"""
2988 """generator for sequence of code blocks to run"""
2987 if fname.suffix == ".ipynb":
2989 if fname.suffix == ".ipynb":
2988 from nbformat import read
2990 from nbformat import read
2989 nb = read(fname, as_version=4)
2991 nb = read(fname, as_version=4)
2990 if not nb.cells:
2992 if not nb.cells:
2991 return
2993 return
2992 for cell in nb.cells:
2994 for cell in nb.cells:
2993 if cell.cell_type == 'code':
2995 if cell.cell_type == 'code':
2994 yield cell.source
2996 yield cell.source
2995 else:
2997 else:
2996 yield fname.read_text(encoding="utf-8")
2998 yield fname.read_text(encoding="utf-8")
2997
2999
2998 with prepended_to_syspath(dname):
3000 with prepended_to_syspath(dname):
2999 try:
3001 try:
3000 for cell in get_cells():
3002 for cell in get_cells():
3001 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
3003 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
3002 if raise_exceptions:
3004 if raise_exceptions:
3003 result.raise_error()
3005 result.raise_error()
3004 elif not result.success:
3006 elif not result.success:
3005 break
3007 break
3006 except:
3008 except:
3007 if raise_exceptions:
3009 if raise_exceptions:
3008 raise
3010 raise
3009 self.showtraceback()
3011 self.showtraceback()
3010 warn('Unknown failure executing file: <%s>' % fname)
3012 warn('Unknown failure executing file: <%s>' % fname)
3011
3013
3012 def safe_run_module(self, mod_name, where):
3014 def safe_run_module(self, mod_name, where):
3013 """A safe version of runpy.run_module().
3015 """A safe version of runpy.run_module().
3014
3016
3015 This version will never throw an exception, but instead print
3017 This version will never throw an exception, but instead print
3016 helpful error messages to the screen.
3018 helpful error messages to the screen.
3017
3019
3018 `SystemExit` exceptions with status code 0 or None are ignored.
3020 `SystemExit` exceptions with status code 0 or None are ignored.
3019
3021
3020 Parameters
3022 Parameters
3021 ----------
3023 ----------
3022 mod_name : string
3024 mod_name : string
3023 The name of the module to be executed.
3025 The name of the module to be executed.
3024 where : dict
3026 where : dict
3025 The globals namespace.
3027 The globals namespace.
3026 """
3028 """
3027 try:
3029 try:
3028 try:
3030 try:
3029 where.update(
3031 where.update(
3030 runpy.run_module(str(mod_name), run_name="__main__",
3032 runpy.run_module(str(mod_name), run_name="__main__",
3031 alter_sys=True)
3033 alter_sys=True)
3032 )
3034 )
3033 except SystemExit as status:
3035 except SystemExit as status:
3034 if status.code:
3036 if status.code:
3035 raise
3037 raise
3036 except:
3038 except:
3037 self.showtraceback()
3039 self.showtraceback()
3038 warn('Unknown failure executing module: <%s>' % mod_name)
3040 warn('Unknown failure executing module: <%s>' % mod_name)
3039
3041
3040 def run_cell(
3042 def run_cell(
3041 self,
3043 self,
3042 raw_cell,
3044 raw_cell,
3043 store_history=False,
3045 store_history=False,
3044 silent=False,
3046 silent=False,
3045 shell_futures=True,
3047 shell_futures=True,
3046 cell_id=None,
3048 cell_id=None,
3047 ):
3049 ):
3048 """Run a complete IPython cell.
3050 """Run a complete IPython cell.
3049
3051
3050 Parameters
3052 Parameters
3051 ----------
3053 ----------
3052 raw_cell : str
3054 raw_cell : str
3053 The code (including IPython code such as %magic functions) to run.
3055 The code (including IPython code such as %magic functions) to run.
3054 store_history : bool
3056 store_history : bool
3055 If True, the raw and translated cell will be stored in IPython's
3057 If True, the raw and translated cell will be stored in IPython's
3056 history. For user code calling back into IPython's machinery, this
3058 history. For user code calling back into IPython's machinery, this
3057 should be set to False.
3059 should be set to False.
3058 silent : bool
3060 silent : bool
3059 If True, avoid side-effects, such as implicit displayhooks and
3061 If True, avoid side-effects, such as implicit displayhooks and
3060 and logging. silent=True forces store_history=False.
3062 and logging. silent=True forces store_history=False.
3061 shell_futures : bool
3063 shell_futures : bool
3062 If True, the code will share future statements with the interactive
3064 If True, the code will share future statements with the interactive
3063 shell. It will both be affected by previous __future__ imports, and
3065 shell. It will both be affected by previous __future__ imports, and
3064 any __future__ imports in the code will affect the shell. If False,
3066 any __future__ imports in the code will affect the shell. If False,
3065 __future__ imports are not shared in either direction.
3067 __future__ imports are not shared in either direction.
3066
3068
3067 Returns
3069 Returns
3068 -------
3070 -------
3069 result : :class:`ExecutionResult`
3071 result : :class:`ExecutionResult`
3070 """
3072 """
3071 result = None
3073 result = None
3072 try:
3074 try:
3073 result = self._run_cell(
3075 result = self._run_cell(
3074 raw_cell, store_history, silent, shell_futures, cell_id
3076 raw_cell, store_history, silent, shell_futures, cell_id
3075 )
3077 )
3076 finally:
3078 finally:
3077 self.events.trigger('post_execute')
3079 self.events.trigger('post_execute')
3078 if not silent:
3080 if not silent:
3079 self.events.trigger('post_run_cell', result)
3081 self.events.trigger('post_run_cell', result)
3080 return result
3082 return result
3081
3083
3082 def _run_cell(
3084 def _run_cell(
3083 self,
3085 self,
3084 raw_cell: str,
3086 raw_cell: str,
3085 store_history: bool,
3087 store_history: bool,
3086 silent: bool,
3088 silent: bool,
3087 shell_futures: bool,
3089 shell_futures: bool,
3088 cell_id: str,
3090 cell_id: str,
3089 ) -> ExecutionResult:
3091 ) -> ExecutionResult:
3090 """Internal method to run a complete IPython cell."""
3092 """Internal method to run a complete IPython cell."""
3091
3093
3092 # we need to avoid calling self.transform_cell multiple time on the same thing
3094 # we need to avoid calling self.transform_cell multiple time on the same thing
3093 # so we need to store some results:
3095 # so we need to store some results:
3094 preprocessing_exc_tuple = None
3096 preprocessing_exc_tuple = None
3095 try:
3097 try:
3096 transformed_cell = self.transform_cell(raw_cell)
3098 transformed_cell = self.transform_cell(raw_cell)
3097 except Exception:
3099 except Exception:
3098 transformed_cell = raw_cell
3100 transformed_cell = raw_cell
3099 preprocessing_exc_tuple = sys.exc_info()
3101 preprocessing_exc_tuple = sys.exc_info()
3100
3102
3101 assert transformed_cell is not None
3103 assert transformed_cell is not None
3102 coro = self.run_cell_async(
3104 coro = self.run_cell_async(
3103 raw_cell,
3105 raw_cell,
3104 store_history=store_history,
3106 store_history=store_history,
3105 silent=silent,
3107 silent=silent,
3106 shell_futures=shell_futures,
3108 shell_futures=shell_futures,
3107 transformed_cell=transformed_cell,
3109 transformed_cell=transformed_cell,
3108 preprocessing_exc_tuple=preprocessing_exc_tuple,
3110 preprocessing_exc_tuple=preprocessing_exc_tuple,
3109 cell_id=cell_id,
3111 cell_id=cell_id,
3110 )
3112 )
3111
3113
3112 # run_cell_async is async, but may not actually need an eventloop.
3114 # run_cell_async is async, but may not actually need an eventloop.
3113 # when this is the case, we want to run it using the pseudo_sync_runner
3115 # when this is the case, we want to run it using the pseudo_sync_runner
3114 # so that code can invoke eventloops (for example via the %run , and
3116 # so that code can invoke eventloops (for example via the %run , and
3115 # `%paste` magic.
3117 # `%paste` magic.
3116 if self.trio_runner:
3118 if self.trio_runner:
3117 runner = self.trio_runner
3119 runner = self.trio_runner
3118 elif self.should_run_async(
3120 elif self.should_run_async(
3119 raw_cell,
3121 raw_cell,
3120 transformed_cell=transformed_cell,
3122 transformed_cell=transformed_cell,
3121 preprocessing_exc_tuple=preprocessing_exc_tuple,
3123 preprocessing_exc_tuple=preprocessing_exc_tuple,
3122 ):
3124 ):
3123 runner = self.loop_runner
3125 runner = self.loop_runner
3124 else:
3126 else:
3125 runner = _pseudo_sync_runner
3127 runner = _pseudo_sync_runner
3126
3128
3127 try:
3129 try:
3128 result = runner(coro)
3130 result = runner(coro)
3129 except BaseException as e:
3131 except BaseException as e:
3130 info = ExecutionInfo(
3132 info = ExecutionInfo(
3131 raw_cell, store_history, silent, shell_futures, cell_id
3133 raw_cell, store_history, silent, shell_futures, cell_id
3132 )
3134 )
3133 result = ExecutionResult(info)
3135 result = ExecutionResult(info)
3134 result.error_in_exec = e
3136 result.error_in_exec = e
3135 self.showtraceback(running_compiled_code=True)
3137 self.showtraceback(running_compiled_code=True)
3136 finally:
3138 finally:
3137 return result
3139 return result
3138
3140
3139 def should_run_async(
3141 def should_run_async(
3140 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None
3142 self, raw_cell: str, *, transformed_cell=None, preprocessing_exc_tuple=None
3141 ) -> bool:
3143 ) -> bool:
3142 """Return whether a cell should be run asynchronously via a coroutine runner
3144 """Return whether a cell should be run asynchronously via a coroutine runner
3143
3145
3144 Parameters
3146 Parameters
3145 ----------
3147 ----------
3146 raw_cell : str
3148 raw_cell : str
3147 The code to be executed
3149 The code to be executed
3148
3150
3149 Returns
3151 Returns
3150 -------
3152 -------
3151 result: bool
3153 result: bool
3152 Whether the code needs to be run with a coroutine runner or not
3154 Whether the code needs to be run with a coroutine runner or not
3153 .. versionadded:: 7.0
3155 .. versionadded:: 7.0
3154 """
3156 """
3155 if not self.autoawait:
3157 if not self.autoawait:
3156 return False
3158 return False
3157 if preprocessing_exc_tuple is not None:
3159 if preprocessing_exc_tuple is not None:
3158 return False
3160 return False
3159 assert preprocessing_exc_tuple is None
3161 assert preprocessing_exc_tuple is None
3160 if transformed_cell is None:
3162 if transformed_cell is None:
3161 warnings.warn(
3163 warnings.warn(
3162 "`should_run_async` will not call `transform_cell`"
3164 "`should_run_async` will not call `transform_cell`"
3163 " automatically in the future. Please pass the result to"
3165 " automatically in the future. Please pass the result to"
3164 " `transformed_cell` argument and any exception that happen"
3166 " `transformed_cell` argument and any exception that happen"
3165 " during the"
3167 " during the"
3166 "transform in `preprocessing_exc_tuple` in"
3168 "transform in `preprocessing_exc_tuple` in"
3167 " IPython 7.17 and above.",
3169 " IPython 7.17 and above.",
3168 DeprecationWarning,
3170 DeprecationWarning,
3169 stacklevel=2,
3171 stacklevel=2,
3170 )
3172 )
3171 try:
3173 try:
3172 cell = self.transform_cell(raw_cell)
3174 cell = self.transform_cell(raw_cell)
3173 except Exception:
3175 except Exception:
3174 # any exception during transform will be raised
3176 # any exception during transform will be raised
3175 # prior to execution
3177 # prior to execution
3176 return False
3178 return False
3177 else:
3179 else:
3178 cell = transformed_cell
3180 cell = transformed_cell
3179 return _should_be_async(cell)
3181 return _should_be_async(cell)
3180
3182
3181 async def run_cell_async(
3183 async def run_cell_async(
3182 self,
3184 self,
3183 raw_cell: str,
3185 raw_cell: str,
3184 store_history=False,
3186 store_history=False,
3185 silent=False,
3187 silent=False,
3186 shell_futures=True,
3188 shell_futures=True,
3187 *,
3189 *,
3188 transformed_cell: Optional[str] = None,
3190 transformed_cell: Optional[str] = None,
3189 preprocessing_exc_tuple: Optional[AnyType] = None,
3191 preprocessing_exc_tuple: Optional[AnyType] = None,
3190 cell_id=None,
3192 cell_id=None,
3191 ) -> ExecutionResult:
3193 ) -> ExecutionResult:
3192 """Run a complete IPython cell asynchronously.
3194 """Run a complete IPython cell asynchronously.
3193
3195
3194 Parameters
3196 Parameters
3195 ----------
3197 ----------
3196 raw_cell : str
3198 raw_cell : str
3197 The code (including IPython code such as %magic functions) to run.
3199 The code (including IPython code such as %magic functions) to run.
3198 store_history : bool
3200 store_history : bool
3199 If True, the raw and translated cell will be stored in IPython's
3201 If True, the raw and translated cell will be stored in IPython's
3200 history. For user code calling back into IPython's machinery, this
3202 history. For user code calling back into IPython's machinery, this
3201 should be set to False.
3203 should be set to False.
3202 silent : bool
3204 silent : bool
3203 If True, avoid side-effects, such as implicit displayhooks and
3205 If True, avoid side-effects, such as implicit displayhooks and
3204 and logging. silent=True forces store_history=False.
3206 and logging. silent=True forces store_history=False.
3205 shell_futures : bool
3207 shell_futures : bool
3206 If True, the code will share future statements with the interactive
3208 If True, the code will share future statements with the interactive
3207 shell. It will both be affected by previous __future__ imports, and
3209 shell. It will both be affected by previous __future__ imports, and
3208 any __future__ imports in the code will affect the shell. If False,
3210 any __future__ imports in the code will affect the shell. If False,
3209 __future__ imports are not shared in either direction.
3211 __future__ imports are not shared in either direction.
3210 transformed_cell: str
3212 transformed_cell: str
3211 cell that was passed through transformers
3213 cell that was passed through transformers
3212 preprocessing_exc_tuple:
3214 preprocessing_exc_tuple:
3213 trace if the transformation failed.
3215 trace if the transformation failed.
3214
3216
3215 Returns
3217 Returns
3216 -------
3218 -------
3217 result : :class:`ExecutionResult`
3219 result : :class:`ExecutionResult`
3218
3220
3219 .. versionadded:: 7.0
3221 .. versionadded:: 7.0
3220 """
3222 """
3221 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures, cell_id)
3223 info = ExecutionInfo(raw_cell, store_history, silent, shell_futures, cell_id)
3222 result = ExecutionResult(info)
3224 result = ExecutionResult(info)
3223
3225
3224 if (not raw_cell) or raw_cell.isspace():
3226 if (not raw_cell) or raw_cell.isspace():
3225 self.last_execution_succeeded = True
3227 self.last_execution_succeeded = True
3226 self.last_execution_result = result
3228 self.last_execution_result = result
3227 return result
3229 return result
3228
3230
3229 if silent:
3231 if silent:
3230 store_history = False
3232 store_history = False
3231
3233
3232 if store_history:
3234 if store_history:
3233 result.execution_count = self.execution_count
3235 result.execution_count = self.execution_count
3234
3236
3235 def error_before_exec(value):
3237 def error_before_exec(value):
3236 if store_history:
3238 if store_history:
3237 self.execution_count += 1
3239 self.execution_count += 1
3238 result.error_before_exec = value
3240 result.error_before_exec = value
3239 self.last_execution_succeeded = False
3241 self.last_execution_succeeded = False
3240 self.last_execution_result = result
3242 self.last_execution_result = result
3241 return result
3243 return result
3242
3244
3243 self.events.trigger('pre_execute')
3245 self.events.trigger('pre_execute')
3244 if not silent:
3246 if not silent:
3245 self.events.trigger('pre_run_cell', info)
3247 self.events.trigger('pre_run_cell', info)
3246
3248
3247 if transformed_cell is None:
3249 if transformed_cell is None:
3248 warnings.warn(
3250 warnings.warn(
3249 "`run_cell_async` will not call `transform_cell`"
3251 "`run_cell_async` will not call `transform_cell`"
3250 " automatically in the future. Please pass the result to"
3252 " automatically in the future. Please pass the result to"
3251 " `transformed_cell` argument and any exception that happen"
3253 " `transformed_cell` argument and any exception that happen"
3252 " during the"
3254 " during the"
3253 "transform in `preprocessing_exc_tuple` in"
3255 "transform in `preprocessing_exc_tuple` in"
3254 " IPython 7.17 and above.",
3256 " IPython 7.17 and above.",
3255 DeprecationWarning,
3257 DeprecationWarning,
3256 stacklevel=2,
3258 stacklevel=2,
3257 )
3259 )
3258 # If any of our input transformation (input_transformer_manager or
3260 # If any of our input transformation (input_transformer_manager or
3259 # prefilter_manager) raises an exception, we store it in this variable
3261 # prefilter_manager) raises an exception, we store it in this variable
3260 # so that we can display the error after logging the input and storing
3262 # so that we can display the error after logging the input and storing
3261 # it in the history.
3263 # it in the history.
3262 try:
3264 try:
3263 cell = self.transform_cell(raw_cell)
3265 cell = self.transform_cell(raw_cell)
3264 except Exception:
3266 except Exception:
3265 preprocessing_exc_tuple = sys.exc_info()
3267 preprocessing_exc_tuple = sys.exc_info()
3266 cell = raw_cell # cell has to exist so it can be stored/logged
3268 cell = raw_cell # cell has to exist so it can be stored/logged
3267 else:
3269 else:
3268 preprocessing_exc_tuple = None
3270 preprocessing_exc_tuple = None
3269 else:
3271 else:
3270 if preprocessing_exc_tuple is None:
3272 if preprocessing_exc_tuple is None:
3271 cell = transformed_cell
3273 cell = transformed_cell
3272 else:
3274 else:
3273 cell = raw_cell
3275 cell = raw_cell
3274
3276
3275 # Do NOT store paste/cpaste magic history
3277 # Do NOT store paste/cpaste magic history
3276 if "get_ipython().run_line_magic(" in cell and "paste" in cell:
3278 if "get_ipython().run_line_magic(" in cell and "paste" in cell:
3277 store_history = False
3279 store_history = False
3278
3280
3279 # Store raw and processed history
3281 # Store raw and processed history
3280 if store_history:
3282 if store_history:
3281 assert self.history_manager is not None
3283 assert self.history_manager is not None
3282 self.history_manager.store_inputs(self.execution_count, cell, raw_cell)
3284 self.history_manager.store_inputs(self.execution_count, cell, raw_cell)
3283 if not silent:
3285 if not silent:
3284 self.logger.log(cell, raw_cell)
3286 self.logger.log(cell, raw_cell)
3285
3287
3286 # Display the exception if input processing failed.
3288 # Display the exception if input processing failed.
3287 if preprocessing_exc_tuple is not None:
3289 if preprocessing_exc_tuple is not None:
3288 self.showtraceback(preprocessing_exc_tuple)
3290 self.showtraceback(preprocessing_exc_tuple)
3289 if store_history:
3291 if store_history:
3290 self.execution_count += 1
3292 self.execution_count += 1
3291 return error_before_exec(preprocessing_exc_tuple[1])
3293 return error_before_exec(preprocessing_exc_tuple[1])
3292
3294
3293 # Our own compiler remembers the __future__ environment. If we want to
3295 # Our own compiler remembers the __future__ environment. If we want to
3294 # run code with a separate __future__ environment, use the default
3296 # run code with a separate __future__ environment, use the default
3295 # compiler
3297 # compiler
3296 compiler = self.compile if shell_futures else self.compiler_class()
3298 compiler = self.compile if shell_futures else self.compiler_class()
3297
3299
3298 with self.builtin_trap:
3300 with self.builtin_trap:
3299 cell_name = compiler.cache(cell, self.execution_count, raw_code=raw_cell)
3301 cell_name = compiler.cache(cell, self.execution_count, raw_code=raw_cell)
3300
3302
3301 with self.display_trap:
3303 with self.display_trap:
3302 # Compile to bytecode
3304 # Compile to bytecode
3303 try:
3305 try:
3304 code_ast = compiler.ast_parse(cell, filename=cell_name)
3306 code_ast = compiler.ast_parse(cell, filename=cell_name)
3305 except self.custom_exceptions as e:
3307 except self.custom_exceptions as e:
3306 etype, value, tb = sys.exc_info()
3308 etype, value, tb = sys.exc_info()
3307 self.CustomTB(etype, value, tb)
3309 self.CustomTB(etype, value, tb)
3308 return error_before_exec(e)
3310 return error_before_exec(e)
3309 except IndentationError as e:
3311 except IndentationError as e:
3310 self.showindentationerror()
3312 self.showindentationerror()
3311 return error_before_exec(e)
3313 return error_before_exec(e)
3312 except (OverflowError, SyntaxError, ValueError, TypeError,
3314 except (OverflowError, SyntaxError, ValueError, TypeError,
3313 MemoryError) as e:
3315 MemoryError) as e:
3314 self.showsyntaxerror()
3316 self.showsyntaxerror()
3315 return error_before_exec(e)
3317 return error_before_exec(e)
3316
3318
3317 # Apply AST transformations
3319 # Apply AST transformations
3318 try:
3320 try:
3319 code_ast = self.transform_ast(code_ast)
3321 code_ast = self.transform_ast(code_ast)
3320 except InputRejected as e:
3322 except InputRejected as e:
3321 self.showtraceback()
3323 self.showtraceback()
3322 return error_before_exec(e)
3324 return error_before_exec(e)
3323
3325
3324 # Give the displayhook a reference to our ExecutionResult so it
3326 # Give the displayhook a reference to our ExecutionResult so it
3325 # can fill in the output value.
3327 # can fill in the output value.
3326 self.displayhook.exec_result = result
3328 self.displayhook.exec_result = result
3327
3329
3328 # Execute the user code
3330 # Execute the user code
3329 interactivity = "none" if silent else self.ast_node_interactivity
3331 interactivity = "none" if silent else self.ast_node_interactivity
3330
3332
3331
3333
3332 has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
3334 has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
3333 interactivity=interactivity, compiler=compiler, result=result)
3335 interactivity=interactivity, compiler=compiler, result=result)
3334
3336
3335 self.last_execution_succeeded = not has_raised
3337 self.last_execution_succeeded = not has_raised
3336 self.last_execution_result = result
3338 self.last_execution_result = result
3337
3339
3338 # Reset this so later displayed values do not modify the
3340 # Reset this so later displayed values do not modify the
3339 # ExecutionResult
3341 # ExecutionResult
3340 self.displayhook.exec_result = None
3342 self.displayhook.exec_result = None
3341
3343
3342 if store_history:
3344 if store_history:
3345 assert self.history_manager is not None
3343 # Write output to the database. Does nothing unless
3346 # Write output to the database. Does nothing unless
3344 # history output logging is enabled.
3347 # history output logging is enabled.
3345 self.history_manager.store_output(self.execution_count)
3348 self.history_manager.store_output(self.execution_count)
3346 # Each cell is a *single* input, regardless of how many lines it has
3349 # Each cell is a *single* input, regardless of how many lines it has
3347 self.execution_count += 1
3350 self.execution_count += 1
3348
3351
3349 return result
3352 return result
3350
3353
3351 def transform_cell(self, raw_cell):
3354 def transform_cell(self, raw_cell):
3352 """Transform an input cell before parsing it.
3355 """Transform an input cell before parsing it.
3353
3356
3354 Static transformations, implemented in IPython.core.inputtransformer2,
3357 Static transformations, implemented in IPython.core.inputtransformer2,
3355 deal with things like ``%magic`` and ``!system`` commands.
3358 deal with things like ``%magic`` and ``!system`` commands.
3356 These run on all input.
3359 These run on all input.
3357 Dynamic transformations, for things like unescaped magics and the exit
3360 Dynamic transformations, for things like unescaped magics and the exit
3358 autocall, depend on the state of the interpreter.
3361 autocall, depend on the state of the interpreter.
3359 These only apply to single line inputs.
3362 These only apply to single line inputs.
3360
3363
3361 These string-based transformations are followed by AST transformations;
3364 These string-based transformations are followed by AST transformations;
3362 see :meth:`transform_ast`.
3365 see :meth:`transform_ast`.
3363 """
3366 """
3364 # Static input transformations
3367 # Static input transformations
3365 cell = self.input_transformer_manager.transform_cell(raw_cell)
3368 cell = self.input_transformer_manager.transform_cell(raw_cell)
3366
3369
3367 if len(cell.splitlines()) == 1:
3370 if len(cell.splitlines()) == 1:
3368 # Dynamic transformations - only applied for single line commands
3371 # Dynamic transformations - only applied for single line commands
3369 with self.builtin_trap:
3372 with self.builtin_trap:
3370 # use prefilter_lines to handle trailing newlines
3373 # use prefilter_lines to handle trailing newlines
3371 # restore trailing newline for ast.parse
3374 # restore trailing newline for ast.parse
3372 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
3375 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
3373
3376
3374 lines = cell.splitlines(keepends=True)
3377 lines = cell.splitlines(keepends=True)
3375 for transform in self.input_transformers_post:
3378 for transform in self.input_transformers_post:
3376 lines = transform(lines)
3379 lines = transform(lines)
3377 cell = ''.join(lines)
3380 cell = ''.join(lines)
3378
3381
3379 return cell
3382 return cell
3380
3383
3381 def transform_ast(self, node):
3384 def transform_ast(self, node):
3382 """Apply the AST transformations from self.ast_transformers
3385 """Apply the AST transformations from self.ast_transformers
3383
3386
3384 Parameters
3387 Parameters
3385 ----------
3388 ----------
3386 node : ast.Node
3389 node : ast.Node
3387 The root node to be transformed. Typically called with the ast.Module
3390 The root node to be transformed. Typically called with the ast.Module
3388 produced by parsing user input.
3391 produced by parsing user input.
3389
3392
3390 Returns
3393 Returns
3391 -------
3394 -------
3392 An ast.Node corresponding to the node it was called with. Note that it
3395 An ast.Node corresponding to the node it was called with. Note that it
3393 may also modify the passed object, so don't rely on references to the
3396 may also modify the passed object, so don't rely on references to the
3394 original AST.
3397 original AST.
3395 """
3398 """
3396 for transformer in self.ast_transformers:
3399 for transformer in self.ast_transformers:
3397 try:
3400 try:
3398 node = transformer.visit(node)
3401 node = transformer.visit(node)
3399 except InputRejected:
3402 except InputRejected:
3400 # User-supplied AST transformers can reject an input by raising
3403 # User-supplied AST transformers can reject an input by raising
3401 # an InputRejected. Short-circuit in this case so that we
3404 # an InputRejected. Short-circuit in this case so that we
3402 # don't unregister the transform.
3405 # don't unregister the transform.
3403 raise
3406 raise
3404 except Exception as e:
3407 except Exception as e:
3405 warn(
3408 warn(
3406 "AST transformer %r threw an error. It will be unregistered. %s"
3409 "AST transformer %r threw an error. It will be unregistered. %s"
3407 % (transformer, e)
3410 % (transformer, e)
3408 )
3411 )
3409 self.ast_transformers.remove(transformer)
3412 self.ast_transformers.remove(transformer)
3410
3413
3411 if self.ast_transformers:
3414 if self.ast_transformers:
3412 ast.fix_missing_locations(node)
3415 ast.fix_missing_locations(node)
3413 return node
3416 return node
3414
3417
3415 async def run_ast_nodes(
3418 async def run_ast_nodes(
3416 self,
3419 self,
3417 nodelist: ListType[stmt],
3420 nodelist: ListType[stmt],
3418 cell_name: str,
3421 cell_name: str,
3419 interactivity="last_expr",
3422 interactivity="last_expr",
3420 compiler=compile,
3423 compiler=compile,
3421 result=None,
3424 result=None,
3422 ):
3425 ):
3423 """Run a sequence of AST nodes. The execution mode depends on the
3426 """Run a sequence of AST nodes. The execution mode depends on the
3424 interactivity parameter.
3427 interactivity parameter.
3425
3428
3426 Parameters
3429 Parameters
3427 ----------
3430 ----------
3428 nodelist : list
3431 nodelist : list
3429 A sequence of AST nodes to run.
3432 A sequence of AST nodes to run.
3430 cell_name : str
3433 cell_name : str
3431 Will be passed to the compiler as the filename of the cell. Typically
3434 Will be passed to the compiler as the filename of the cell. Typically
3432 the value returned by ip.compile.cache(cell).
3435 the value returned by ip.compile.cache(cell).
3433 interactivity : str
3436 interactivity : str
3434 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none',
3437 'all', 'last', 'last_expr' , 'last_expr_or_assign' or 'none',
3435 specifying which nodes should be run interactively (displaying output
3438 specifying which nodes should be run interactively (displaying output
3436 from expressions). 'last_expr' will run the last node interactively
3439 from expressions). 'last_expr' will run the last node interactively
3437 only if it is an expression (i.e. expressions in loops or other blocks
3440 only if it is an expression (i.e. expressions in loops or other blocks
3438 are not displayed) 'last_expr_or_assign' will run the last expression
3441 are not displayed) 'last_expr_or_assign' will run the last expression
3439 or the last assignment. Other values for this parameter will raise a
3442 or the last assignment. Other values for this parameter will raise a
3440 ValueError.
3443 ValueError.
3441
3444
3442 compiler : callable
3445 compiler : callable
3443 A function with the same interface as the built-in compile(), to turn
3446 A function with the same interface as the built-in compile(), to turn
3444 the AST nodes into code objects. Default is the built-in compile().
3447 the AST nodes into code objects. Default is the built-in compile().
3445 result : ExecutionResult, optional
3448 result : ExecutionResult, optional
3446 An object to store exceptions that occur during execution.
3449 An object to store exceptions that occur during execution.
3447
3450
3448 Returns
3451 Returns
3449 -------
3452 -------
3450 True if an exception occurred while running code, False if it finished
3453 True if an exception occurred while running code, False if it finished
3451 running.
3454 running.
3452 """
3455 """
3453 if not nodelist:
3456 if not nodelist:
3454 return
3457 return
3455
3458
3456
3459
3457 if interactivity == 'last_expr_or_assign':
3460 if interactivity == 'last_expr_or_assign':
3458 if isinstance(nodelist[-1], _assign_nodes):
3461 if isinstance(nodelist[-1], _assign_nodes):
3459 asg = nodelist[-1]
3462 asg = nodelist[-1]
3460 if isinstance(asg, ast.Assign) and len(asg.targets) == 1:
3463 if isinstance(asg, ast.Assign) and len(asg.targets) == 1:
3461 target = asg.targets[0]
3464 target = asg.targets[0]
3462 elif isinstance(asg, _single_targets_nodes):
3465 elif isinstance(asg, _single_targets_nodes):
3463 target = asg.target
3466 target = asg.target
3464 else:
3467 else:
3465 target = None
3468 target = None
3466 if isinstance(target, ast.Name):
3469 if isinstance(target, ast.Name):
3467 nnode = ast.Expr(ast.Name(target.id, ast.Load()))
3470 nnode = ast.Expr(ast.Name(target.id, ast.Load()))
3468 ast.fix_missing_locations(nnode)
3471 ast.fix_missing_locations(nnode)
3469 nodelist.append(nnode)
3472 nodelist.append(nnode)
3470 interactivity = 'last_expr'
3473 interactivity = 'last_expr'
3471
3474
3472 _async = False
3475 _async = False
3473 if interactivity == 'last_expr':
3476 if interactivity == 'last_expr':
3474 if isinstance(nodelist[-1], ast.Expr):
3477 if isinstance(nodelist[-1], ast.Expr):
3475 interactivity = "last"
3478 interactivity = "last"
3476 else:
3479 else:
3477 interactivity = "none"
3480 interactivity = "none"
3478
3481
3479 if interactivity == 'none':
3482 if interactivity == 'none':
3480 to_run_exec, to_run_interactive = nodelist, []
3483 to_run_exec, to_run_interactive = nodelist, []
3481 elif interactivity == 'last':
3484 elif interactivity == 'last':
3482 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
3485 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
3483 elif interactivity == 'all':
3486 elif interactivity == 'all':
3484 to_run_exec, to_run_interactive = [], nodelist
3487 to_run_exec, to_run_interactive = [], nodelist
3485 else:
3488 else:
3486 raise ValueError("Interactivity was %r" % interactivity)
3489 raise ValueError("Interactivity was %r" % interactivity)
3487
3490
3488 try:
3491 try:
3489
3492
3490 def compare(code):
3493 def compare(code):
3491 is_async = inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE
3494 is_async = inspect.CO_COROUTINE & code.co_flags == inspect.CO_COROUTINE
3492 return is_async
3495 return is_async
3493
3496
3494 # refactor that to just change the mod constructor.
3497 # refactor that to just change the mod constructor.
3495 to_run = []
3498 to_run = []
3496 for node in to_run_exec:
3499 for node in to_run_exec:
3497 to_run.append((node, "exec"))
3500 to_run.append((node, "exec"))
3498
3501
3499 for node in to_run_interactive:
3502 for node in to_run_interactive:
3500 to_run.append((node, "single"))
3503 to_run.append((node, "single"))
3501
3504
3502 for node, mode in to_run:
3505 for node, mode in to_run:
3503 if mode == "exec":
3506 if mode == "exec":
3504 mod = Module([node], [])
3507 mod = Module([node], [])
3505 elif mode == "single":
3508 elif mode == "single":
3506 mod = ast.Interactive([node]) # type: ignore
3509 mod = ast.Interactive([node]) # type: ignore
3507 with compiler.extra_flags(
3510 with compiler.extra_flags(
3508 getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
3511 getattr(ast, "PyCF_ALLOW_TOP_LEVEL_AWAIT", 0x0)
3509 if self.autoawait
3512 if self.autoawait
3510 else 0x0
3513 else 0x0
3511 ):
3514 ):
3512 code = compiler(mod, cell_name, mode)
3515 code = compiler(mod, cell_name, mode)
3513 asy = compare(code)
3516 asy = compare(code)
3514 if await self.run_code(code, result, async_=asy):
3517 if await self.run_code(code, result, async_=asy):
3515 return True
3518 return True
3516
3519
3517 # Flush softspace
3520 # Flush softspace
3518 if softspace(sys.stdout, 0):
3521 if softspace(sys.stdout, 0):
3519 print()
3522 print()
3520
3523
3521 except:
3524 except:
3522 # It's possible to have exceptions raised here, typically by
3525 # It's possible to have exceptions raised here, typically by
3523 # compilation of odd code (such as a naked 'return' outside a
3526 # compilation of odd code (such as a naked 'return' outside a
3524 # function) that did parse but isn't valid. Typically the exception
3527 # function) that did parse but isn't valid. Typically the exception
3525 # is a SyntaxError, but it's safest just to catch anything and show
3528 # is a SyntaxError, but it's safest just to catch anything and show
3526 # the user a traceback.
3529 # the user a traceback.
3527
3530
3528 # We do only one try/except outside the loop to minimize the impact
3531 # We do only one try/except outside the loop to minimize the impact
3529 # on runtime, and also because if any node in the node list is
3532 # on runtime, and also because if any node in the node list is
3530 # broken, we should stop execution completely.
3533 # broken, we should stop execution completely.
3531 if result:
3534 if result:
3532 result.error_before_exec = sys.exc_info()[1]
3535 result.error_before_exec = sys.exc_info()[1]
3533 self.showtraceback()
3536 self.showtraceback()
3534 return True
3537 return True
3535
3538
3536 return False
3539 return False
3537
3540
3538 async def run_code(self, code_obj, result=None, *, async_=False):
3541 async def run_code(self, code_obj, result=None, *, async_=False):
3539 """Execute a code object.
3542 """Execute a code object.
3540
3543
3541 When an exception occurs, self.showtraceback() is called to display a
3544 When an exception occurs, self.showtraceback() is called to display a
3542 traceback.
3545 traceback.
3543
3546
3544 Parameters
3547 Parameters
3545 ----------
3548 ----------
3546 code_obj : code object
3549 code_obj : code object
3547 A compiled code object, to be executed
3550 A compiled code object, to be executed
3548 result : ExecutionResult, optional
3551 result : ExecutionResult, optional
3549 An object to store exceptions that occur during execution.
3552 An object to store exceptions that occur during execution.
3550 async_ : Bool (Experimental)
3553 async_ : Bool (Experimental)
3551 Attempt to run top-level asynchronous code in a default loop.
3554 Attempt to run top-level asynchronous code in a default loop.
3552
3555
3553 Returns
3556 Returns
3554 -------
3557 -------
3555 False : successful execution.
3558 False : successful execution.
3556 True : an error occurred.
3559 True : an error occurred.
3557 """
3560 """
3558 # special value to say that anything above is IPython and should be
3561 # special value to say that anything above is IPython and should be
3559 # hidden.
3562 # hidden.
3560 __tracebackhide__ = "__ipython_bottom__"
3563 __tracebackhide__ = "__ipython_bottom__"
3561 # Set our own excepthook in case the user code tries to call it
3564 # Set our own excepthook in case the user code tries to call it
3562 # directly, so that the IPython crash handler doesn't get triggered
3565 # directly, so that the IPython crash handler doesn't get triggered
3563 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3566 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3564
3567
3565 # we save the original sys.excepthook in the instance, in case config
3568 # we save the original sys.excepthook in the instance, in case config
3566 # code (such as magics) needs access to it.
3569 # code (such as magics) needs access to it.
3567 self.sys_excepthook = old_excepthook
3570 self.sys_excepthook = old_excepthook
3568 outflag = True # happens in more places, so it's easier as default
3571 outflag = True # happens in more places, so it's easier as default
3569 try:
3572 try:
3570 try:
3573 try:
3571 if async_:
3574 if async_:
3572 await eval(code_obj, self.user_global_ns, self.user_ns)
3575 await eval(code_obj, self.user_global_ns, self.user_ns)
3573 else:
3576 else:
3574 exec(code_obj, self.user_global_ns, self.user_ns)
3577 exec(code_obj, self.user_global_ns, self.user_ns)
3575 finally:
3578 finally:
3576 # Reset our crash handler in place
3579 # Reset our crash handler in place
3577 sys.excepthook = old_excepthook
3580 sys.excepthook = old_excepthook
3578 except SystemExit as e:
3581 except SystemExit as e:
3579 if result is not None:
3582 if result is not None:
3580 result.error_in_exec = e
3583 result.error_in_exec = e
3581 self.showtraceback(exception_only=True)
3584 self.showtraceback(exception_only=True)
3582 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
3585 warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)
3583 except bdb.BdbQuit:
3586 except bdb.BdbQuit:
3584 etype, value, tb = sys.exc_info()
3587 etype, value, tb = sys.exc_info()
3585 if result is not None:
3588 if result is not None:
3586 result.error_in_exec = value
3589 result.error_in_exec = value
3587 # the BdbQuit stops here
3590 # the BdbQuit stops here
3588 except self.custom_exceptions:
3591 except self.custom_exceptions:
3589 etype, value, tb = sys.exc_info()
3592 etype, value, tb = sys.exc_info()
3590 if result is not None:
3593 if result is not None:
3591 result.error_in_exec = value
3594 result.error_in_exec = value
3592 self.CustomTB(etype, value, tb)
3595 self.CustomTB(etype, value, tb)
3593 except:
3596 except:
3594 if result is not None:
3597 if result is not None:
3595 result.error_in_exec = sys.exc_info()[1]
3598 result.error_in_exec = sys.exc_info()[1]
3596 self.showtraceback(running_compiled_code=True)
3599 self.showtraceback(running_compiled_code=True)
3597 else:
3600 else:
3598 outflag = False
3601 outflag = False
3599 return outflag
3602 return outflag
3600
3603
3601 # For backwards compatibility
3604 # For backwards compatibility
3602 runcode = run_code
3605 runcode = run_code
3603
3606
3604 def check_complete(self, code: str) -> Tuple[str, str]:
3607 def check_complete(self, code: str) -> Tuple[str, str]:
3605 """Return whether a block of code is ready to execute, or should be continued
3608 """Return whether a block of code is ready to execute, or should be continued
3606
3609
3607 Parameters
3610 Parameters
3608 ----------
3611 ----------
3609 code : string
3612 code : string
3610 Python input code, which can be multiline.
3613 Python input code, which can be multiline.
3611
3614
3612 Returns
3615 Returns
3613 -------
3616 -------
3614 status : str
3617 status : str
3615 One of 'complete', 'incomplete', or 'invalid' if source is not a
3618 One of 'complete', 'incomplete', or 'invalid' if source is not a
3616 prefix of valid code.
3619 prefix of valid code.
3617 indent : str
3620 indent : str
3618 When status is 'incomplete', this is some whitespace to insert on
3621 When status is 'incomplete', this is some whitespace to insert on
3619 the next line of the prompt.
3622 the next line of the prompt.
3620 """
3623 """
3621 status, nspaces = self.input_transformer_manager.check_complete(code)
3624 status, nspaces = self.input_transformer_manager.check_complete(code)
3622 return status, ' ' * (nspaces or 0)
3625 return status, ' ' * (nspaces or 0)
3623
3626
3624 #-------------------------------------------------------------------------
3627 #-------------------------------------------------------------------------
3625 # Things related to GUI support and pylab
3628 # Things related to GUI support and pylab
3626 #-------------------------------------------------------------------------
3629 #-------------------------------------------------------------------------
3627
3630
3628 active_eventloop: Optional[str] = None
3631 active_eventloop: Optional[str] = None
3629
3632
3630 def enable_gui(self, gui=None):
3633 def enable_gui(self, gui=None):
3631 raise NotImplementedError('Implement enable_gui in a subclass')
3634 raise NotImplementedError('Implement enable_gui in a subclass')
3632
3635
3633 def enable_matplotlib(self, gui=None):
3636 def enable_matplotlib(self, gui=None):
3634 """Enable interactive matplotlib and inline figure support.
3637 """Enable interactive matplotlib and inline figure support.
3635
3638
3636 This takes the following steps:
3639 This takes the following steps:
3637
3640
3638 1. select the appropriate eventloop and matplotlib backend
3641 1. select the appropriate eventloop and matplotlib backend
3639 2. set up matplotlib for interactive use with that backend
3642 2. set up matplotlib for interactive use with that backend
3640 3. configure formatters for inline figure display
3643 3. configure formatters for inline figure display
3641 4. enable the selected gui eventloop
3644 4. enable the selected gui eventloop
3642
3645
3643 Parameters
3646 Parameters
3644 ----------
3647 ----------
3645 gui : optional, string
3648 gui : optional, string
3646 If given, dictates the choice of matplotlib GUI backend to use
3649 If given, dictates the choice of matplotlib GUI backend to use
3647 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3650 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3648 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3651 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3649 matplotlib (as dictated by the matplotlib build-time options plus the
3652 matplotlib (as dictated by the matplotlib build-time options plus the
3650 user's matplotlibrc configuration file). Note that not all backends
3653 user's matplotlibrc configuration file). Note that not all backends
3651 make sense in all contexts, for example a terminal ipython can't
3654 make sense in all contexts, for example a terminal ipython can't
3652 display figures inline.
3655 display figures inline.
3653 """
3656 """
3654 from matplotlib_inline.backend_inline import configure_inline_support
3657 from matplotlib_inline.backend_inline import configure_inline_support
3655
3658
3656 from IPython.core import pylabtools as pt
3659 from IPython.core import pylabtools as pt
3657 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3660 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3658
3661
3659 if gui != 'inline':
3662 if gui != 'inline':
3660 # If we have our first gui selection, store it
3663 # If we have our first gui selection, store it
3661 if self.pylab_gui_select is None:
3664 if self.pylab_gui_select is None:
3662 self.pylab_gui_select = gui
3665 self.pylab_gui_select = gui
3663 # Otherwise if they are different
3666 # Otherwise if they are different
3664 elif gui != self.pylab_gui_select:
3667 elif gui != self.pylab_gui_select:
3665 print('Warning: Cannot change to a different GUI toolkit: %s.'
3668 print('Warning: Cannot change to a different GUI toolkit: %s.'
3666 ' Using %s instead.' % (gui, self.pylab_gui_select))
3669 ' Using %s instead.' % (gui, self.pylab_gui_select))
3667 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3670 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3668
3671
3669 pt.activate_matplotlib(backend)
3672 pt.activate_matplotlib(backend)
3670 configure_inline_support(self, backend)
3673 configure_inline_support(self, backend)
3671
3674
3672 # Now we must activate the gui pylab wants to use, and fix %run to take
3675 # Now we must activate the gui pylab wants to use, and fix %run to take
3673 # plot updates into account
3676 # plot updates into account
3674 self.enable_gui(gui)
3677 self.enable_gui(gui)
3675 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3678 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3676 pt.mpl_runner(self.safe_execfile)
3679 pt.mpl_runner(self.safe_execfile)
3677
3680
3678 return gui, backend
3681 return gui, backend
3679
3682
3680 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3683 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3681 """Activate pylab support at runtime.
3684 """Activate pylab support at runtime.
3682
3685
3683 This turns on support for matplotlib, preloads into the interactive
3686 This turns on support for matplotlib, preloads into the interactive
3684 namespace all of numpy and pylab, and configures IPython to correctly
3687 namespace all of numpy and pylab, and configures IPython to correctly
3685 interact with the GUI event loop. The GUI backend to be used can be
3688 interact with the GUI event loop. The GUI backend to be used can be
3686 optionally selected with the optional ``gui`` argument.
3689 optionally selected with the optional ``gui`` argument.
3687
3690
3688 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3691 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3689
3692
3690 Parameters
3693 Parameters
3691 ----------
3694 ----------
3692 gui : optional, string
3695 gui : optional, string
3693 If given, dictates the choice of matplotlib GUI backend to use
3696 If given, dictates the choice of matplotlib GUI backend to use
3694 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3697 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3695 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3698 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3696 matplotlib (as dictated by the matplotlib build-time options plus the
3699 matplotlib (as dictated by the matplotlib build-time options plus the
3697 user's matplotlibrc configuration file). Note that not all backends
3700 user's matplotlibrc configuration file). Note that not all backends
3698 make sense in all contexts, for example a terminal ipython can't
3701 make sense in all contexts, for example a terminal ipython can't
3699 display figures inline.
3702 display figures inline.
3700 import_all : optional, bool, default: True
3703 import_all : optional, bool, default: True
3701 Whether to do `from numpy import *` and `from pylab import *`
3704 Whether to do `from numpy import *` and `from pylab import *`
3702 in addition to module imports.
3705 in addition to module imports.
3703 welcome_message : deprecated
3706 welcome_message : deprecated
3704 This argument is ignored, no welcome message will be displayed.
3707 This argument is ignored, no welcome message will be displayed.
3705 """
3708 """
3706 from IPython.core.pylabtools import import_pylab
3709 from IPython.core.pylabtools import import_pylab
3707
3710
3708 gui, backend = self.enable_matplotlib(gui)
3711 gui, backend = self.enable_matplotlib(gui)
3709
3712
3710 # We want to prevent the loading of pylab to pollute the user's
3713 # We want to prevent the loading of pylab to pollute the user's
3711 # namespace as shown by the %who* magics, so we execute the activation
3714 # namespace as shown by the %who* magics, so we execute the activation
3712 # code in an empty namespace, and we update *both* user_ns and
3715 # code in an empty namespace, and we update *both* user_ns and
3713 # user_ns_hidden with this information.
3716 # user_ns_hidden with this information.
3714 ns = {}
3717 ns = {}
3715 import_pylab(ns, import_all)
3718 import_pylab(ns, import_all)
3716 # warn about clobbered names
3719 # warn about clobbered names
3717 ignored = {"__builtins__"}
3720 ignored = {"__builtins__"}
3718 both = set(ns).intersection(self.user_ns).difference(ignored)
3721 both = set(ns).intersection(self.user_ns).difference(ignored)
3719 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3722 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3720 self.user_ns.update(ns)
3723 self.user_ns.update(ns)
3721 self.user_ns_hidden.update(ns)
3724 self.user_ns_hidden.update(ns)
3722 return gui, backend, clobbered
3725 return gui, backend, clobbered
3723
3726
3724 #-------------------------------------------------------------------------
3727 #-------------------------------------------------------------------------
3725 # Utilities
3728 # Utilities
3726 #-------------------------------------------------------------------------
3729 #-------------------------------------------------------------------------
3727
3730
3728 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3731 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3729 """Expand python variables in a string.
3732 """Expand python variables in a string.
3730
3733
3731 The depth argument indicates how many frames above the caller should
3734 The depth argument indicates how many frames above the caller should
3732 be walked to look for the local namespace where to expand variables.
3735 be walked to look for the local namespace where to expand variables.
3733
3736
3734 The global namespace for expansion is always the user's interactive
3737 The global namespace for expansion is always the user's interactive
3735 namespace.
3738 namespace.
3736 """
3739 """
3737 ns = self.user_ns.copy()
3740 ns = self.user_ns.copy()
3738 try:
3741 try:
3739 frame = sys._getframe(depth+1)
3742 frame = sys._getframe(depth+1)
3740 except ValueError:
3743 except ValueError:
3741 # This is thrown if there aren't that many frames on the stack,
3744 # This is thrown if there aren't that many frames on the stack,
3742 # e.g. if a script called run_line_magic() directly.
3745 # e.g. if a script called run_line_magic() directly.
3743 pass
3746 pass
3744 else:
3747 else:
3745 ns.update(frame.f_locals)
3748 ns.update(frame.f_locals)
3746
3749
3747 try:
3750 try:
3748 # We have to use .vformat() here, because 'self' is a valid and common
3751 # We have to use .vformat() here, because 'self' is a valid and common
3749 # name, and expanding **ns for .format() would make it collide with
3752 # name, and expanding **ns for .format() would make it collide with
3750 # the 'self' argument of the method.
3753 # the 'self' argument of the method.
3751 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3754 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3752 except Exception:
3755 except Exception:
3753 # if formatter couldn't format, just let it go untransformed
3756 # if formatter couldn't format, just let it go untransformed
3754 pass
3757 pass
3755 return cmd
3758 return cmd
3756
3759
3757 def mktempfile(self, data=None, prefix='ipython_edit_'):
3760 def mktempfile(self, data=None, prefix='ipython_edit_'):
3758 """Make a new tempfile and return its filename.
3761 """Make a new tempfile and return its filename.
3759
3762
3760 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3763 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3761 but it registers the created filename internally so ipython cleans it up
3764 but it registers the created filename internally so ipython cleans it up
3762 at exit time.
3765 at exit time.
3763
3766
3764 Optional inputs:
3767 Optional inputs:
3765
3768
3766 - data(None): if data is given, it gets written out to the temp file
3769 - data(None): if data is given, it gets written out to the temp file
3767 immediately, and the file is closed again."""
3770 immediately, and the file is closed again."""
3768
3771
3769 dir_path = Path(tempfile.mkdtemp(prefix=prefix))
3772 dir_path = Path(tempfile.mkdtemp(prefix=prefix))
3770 self.tempdirs.append(dir_path)
3773 self.tempdirs.append(dir_path)
3771
3774
3772 handle, filename = tempfile.mkstemp(".py", prefix, dir=str(dir_path))
3775 handle, filename = tempfile.mkstemp(".py", prefix, dir=str(dir_path))
3773 os.close(handle) # On Windows, there can only be one open handle on a file
3776 os.close(handle) # On Windows, there can only be one open handle on a file
3774
3777
3775 file_path = Path(filename)
3778 file_path = Path(filename)
3776 self.tempfiles.append(file_path)
3779 self.tempfiles.append(file_path)
3777
3780
3778 if data:
3781 if data:
3779 file_path.write_text(data, encoding="utf-8")
3782 file_path.write_text(data, encoding="utf-8")
3780 return filename
3783 return filename
3781
3784
3782 def ask_yes_no(self, prompt, default=None, interrupt=None):
3785 def ask_yes_no(self, prompt, default=None, interrupt=None):
3783 if self.quiet:
3786 if self.quiet:
3784 return True
3787 return True
3785 return ask_yes_no(prompt,default,interrupt)
3788 return ask_yes_no(prompt,default,interrupt)
3786
3789
3787 def show_usage(self):
3790 def show_usage(self):
3788 """Show a usage message"""
3791 """Show a usage message"""
3789 page.page(IPython.core.usage.interactive_usage)
3792 page.page(IPython.core.usage.interactive_usage)
3790
3793
3791 def extract_input_lines(self, range_str, raw=False):
3794 def extract_input_lines(self, range_str, raw=False):
3792 """Return as a string a set of input history slices.
3795 """Return as a string a set of input history slices.
3793
3796
3794 Parameters
3797 Parameters
3795 ----------
3798 ----------
3796 range_str : str
3799 range_str : str
3797 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3800 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3798 since this function is for use by magic functions which get their
3801 since this function is for use by magic functions which get their
3799 arguments as strings. The number before the / is the session
3802 arguments as strings. The number before the / is the session
3800 number: ~n goes n back from the current session.
3803 number: ~n goes n back from the current session.
3801
3804
3802 If empty string is given, returns history of current session
3805 If empty string is given, returns history of current session
3803 without the last input.
3806 without the last input.
3804
3807
3805 raw : bool, optional
3808 raw : bool, optional
3806 By default, the processed input is used. If this is true, the raw
3809 By default, the processed input is used. If this is true, the raw
3807 input history is used instead.
3810 input history is used instead.
3808
3811
3809 Notes
3812 Notes
3810 -----
3813 -----
3811 Slices can be described with two notations:
3814 Slices can be described with two notations:
3812
3815
3813 * ``N:M`` -> standard python form, means including items N...(M-1).
3816 * ``N:M`` -> standard python form, means including items N...(M-1).
3814 * ``N-M`` -> include items N..M (closed endpoint).
3817 * ``N-M`` -> include items N..M (closed endpoint).
3815 """
3818 """
3816 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3819 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3817 text = "\n".join(x for _, _, x in lines)
3820 text = "\n".join(x for _, _, x in lines)
3818
3821
3819 # Skip the last line, as it's probably the magic that called this
3822 # Skip the last line, as it's probably the magic that called this
3820 if not range_str:
3823 if not range_str:
3821 if "\n" not in text:
3824 if "\n" not in text:
3822 text = ""
3825 text = ""
3823 else:
3826 else:
3824 text = text[: text.rfind("\n")]
3827 text = text[: text.rfind("\n")]
3825
3828
3826 return text
3829 return text
3827
3830
3828 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3831 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3829 """Get a code string from history, file, url, or a string or macro.
3832 """Get a code string from history, file, url, or a string or macro.
3830
3833
3831 This is mainly used by magic functions.
3834 This is mainly used by magic functions.
3832
3835
3833 Parameters
3836 Parameters
3834 ----------
3837 ----------
3835 target : str
3838 target : str
3836 A string specifying code to retrieve. This will be tried respectively
3839 A string specifying code to retrieve. This will be tried respectively
3837 as: ranges of input history (see %history for syntax), url,
3840 as: ranges of input history (see %history for syntax), url,
3838 corresponding .py file, filename, or an expression evaluating to a
3841 corresponding .py file, filename, or an expression evaluating to a
3839 string or Macro in the user namespace.
3842 string or Macro in the user namespace.
3840
3843
3841 If empty string is given, returns complete history of current
3844 If empty string is given, returns complete history of current
3842 session, without the last line.
3845 session, without the last line.
3843
3846
3844 raw : bool
3847 raw : bool
3845 If true (default), retrieve raw history. Has no effect on the other
3848 If true (default), retrieve raw history. Has no effect on the other
3846 retrieval mechanisms.
3849 retrieval mechanisms.
3847
3850
3848 py_only : bool (default False)
3851 py_only : bool (default False)
3849 Only try to fetch python code, do not try alternative methods to decode file
3852 Only try to fetch python code, do not try alternative methods to decode file
3850 if unicode fails.
3853 if unicode fails.
3851
3854
3852 Returns
3855 Returns
3853 -------
3856 -------
3854 A string of code.
3857 A string of code.
3855 ValueError is raised if nothing is found, and TypeError if it evaluates
3858 ValueError is raised if nothing is found, and TypeError if it evaluates
3856 to an object of another type. In each case, .args[0] is a printable
3859 to an object of another type. In each case, .args[0] is a printable
3857 message.
3860 message.
3858 """
3861 """
3859 code = self.extract_input_lines(target, raw=raw) # Grab history
3862 code = self.extract_input_lines(target, raw=raw) # Grab history
3860 if code:
3863 if code:
3861 return code
3864 return code
3862 try:
3865 try:
3863 if target.startswith(('http://', 'https://')):
3866 if target.startswith(('http://', 'https://')):
3864 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie)
3867 return openpy.read_py_url(target, skip_encoding_cookie=skip_encoding_cookie)
3865 except UnicodeDecodeError as e:
3868 except UnicodeDecodeError as e:
3866 if not py_only :
3869 if not py_only :
3867 # Deferred import
3870 # Deferred import
3868 from urllib.request import urlopen
3871 from urllib.request import urlopen
3869 response = urlopen(target)
3872 response = urlopen(target)
3870 return response.read().decode('latin1')
3873 return response.read().decode('latin1')
3871 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3874 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3872
3875
3873 potential_target = [target]
3876 potential_target = [target]
3874 try :
3877 try :
3875 potential_target.insert(0,get_py_filename(target))
3878 potential_target.insert(0,get_py_filename(target))
3876 except IOError:
3879 except IOError:
3877 pass
3880 pass
3878
3881
3879 for tgt in potential_target :
3882 for tgt in potential_target :
3880 if os.path.isfile(tgt): # Read file
3883 if os.path.isfile(tgt): # Read file
3881 try :
3884 try :
3882 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3885 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3883 except UnicodeDecodeError as e:
3886 except UnicodeDecodeError as e:
3884 if not py_only :
3887 if not py_only :
3885 with io_open(tgt,'r', encoding='latin1') as f :
3888 with io_open(tgt,'r', encoding='latin1') as f :
3886 return f.read()
3889 return f.read()
3887 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3890 raise ValueError(("'%s' seem to be unreadable.") % target) from e
3888 elif os.path.isdir(os.path.expanduser(tgt)):
3891 elif os.path.isdir(os.path.expanduser(tgt)):
3889 raise ValueError("'%s' is a directory, not a regular file." % target)
3892 raise ValueError("'%s' is a directory, not a regular file." % target)
3890
3893
3891 if search_ns:
3894 if search_ns:
3892 # Inspect namespace to load object source
3895 # Inspect namespace to load object source
3893 object_info = self.object_inspect(target, detail_level=1)
3896 object_info = self.object_inspect(target, detail_level=1)
3894 if object_info['found'] and object_info['source']:
3897 if object_info['found'] and object_info['source']:
3895 return object_info['source']
3898 return object_info['source']
3896
3899
3897 try: # User namespace
3900 try: # User namespace
3898 codeobj = eval(target, self.user_ns)
3901 codeobj = eval(target, self.user_ns)
3899 except Exception as e:
3902 except Exception as e:
3900 raise ValueError(("'%s' was not found in history, as a file, url, "
3903 raise ValueError(("'%s' was not found in history, as a file, url, "
3901 "nor in the user namespace.") % target) from e
3904 "nor in the user namespace.") % target) from e
3902
3905
3903 if isinstance(codeobj, str):
3906 if isinstance(codeobj, str):
3904 return codeobj
3907 return codeobj
3905 elif isinstance(codeobj, Macro):
3908 elif isinstance(codeobj, Macro):
3906 return codeobj.value
3909 return codeobj.value
3907
3910
3908 raise TypeError("%s is neither a string nor a macro." % target,
3911 raise TypeError("%s is neither a string nor a macro." % target,
3909 codeobj)
3912 codeobj)
3910
3913
3911 def _atexit_once(self):
3914 def _atexit_once(self):
3912 """
3915 """
3913 At exist operation that need to be called at most once.
3916 At exist operation that need to be called at most once.
3914 Second call to this function per instance will do nothing.
3917 Second call to this function per instance will do nothing.
3915 """
3918 """
3916
3919
3917 if not getattr(self, "_atexit_once_called", False):
3920 if not getattr(self, "_atexit_once_called", False):
3918 self._atexit_once_called = True
3921 self._atexit_once_called = True
3919 # Clear all user namespaces to release all references cleanly.
3922 # Clear all user namespaces to release all references cleanly.
3920 self.reset(new_session=False)
3923 self.reset(new_session=False)
3921 # Close the history session (this stores the end time and line count)
3924 # Close the history session (this stores the end time and line count)
3922 # this must be *before* the tempfile cleanup, in case of temporary
3925 # this must be *before* the tempfile cleanup, in case of temporary
3923 # history db
3926 # history db
3924 self.history_manager.end_session()
3927 self.history_manager.end_session()
3925 self.history_manager = None
3928 self.history_manager = None
3926
3929
3927 #-------------------------------------------------------------------------
3930 #-------------------------------------------------------------------------
3928 # Things related to IPython exiting
3931 # Things related to IPython exiting
3929 #-------------------------------------------------------------------------
3932 #-------------------------------------------------------------------------
3930 def atexit_operations(self):
3933 def atexit_operations(self):
3931 """This will be executed at the time of exit.
3934 """This will be executed at the time of exit.
3932
3935
3933 Cleanup operations and saving of persistent data that is done
3936 Cleanup operations and saving of persistent data that is done
3934 unconditionally by IPython should be performed here.
3937 unconditionally by IPython should be performed here.
3935
3938
3936 For things that may depend on startup flags or platform specifics (such
3939 For things that may depend on startup flags or platform specifics (such
3937 as having readline or not), register a separate atexit function in the
3940 as having readline or not), register a separate atexit function in the
3938 code that has the appropriate information, rather than trying to
3941 code that has the appropriate information, rather than trying to
3939 clutter
3942 clutter
3940 """
3943 """
3941 self._atexit_once()
3944 self._atexit_once()
3942
3945
3943 # Cleanup all tempfiles and folders left around
3946 # Cleanup all tempfiles and folders left around
3944 for tfile in self.tempfiles:
3947 for tfile in self.tempfiles:
3945 try:
3948 try:
3946 tfile.unlink()
3949 tfile.unlink()
3947 self.tempfiles.remove(tfile)
3950 self.tempfiles.remove(tfile)
3948 except FileNotFoundError:
3951 except FileNotFoundError:
3949 pass
3952 pass
3950 del self.tempfiles
3953 del self.tempfiles
3951 for tdir in self.tempdirs:
3954 for tdir in self.tempdirs:
3952 try:
3955 try:
3953 shutil.rmtree(tdir)
3956 shutil.rmtree(tdir)
3954 self.tempdirs.remove(tdir)
3957 self.tempdirs.remove(tdir)
3955 except FileNotFoundError:
3958 except FileNotFoundError:
3956 pass
3959 pass
3957 del self.tempdirs
3960 del self.tempdirs
3958
3961
3959 # Restore user's cursor
3962 # Restore user's cursor
3960 if hasattr(self, "editing_mode") and self.editing_mode == "vi":
3963 if hasattr(self, "editing_mode") and self.editing_mode == "vi":
3961 sys.stdout.write("\x1b[0 q")
3964 sys.stdout.write("\x1b[0 q")
3962 sys.stdout.flush()
3965 sys.stdout.flush()
3963
3966
3964 def cleanup(self):
3967 def cleanup(self):
3965 self.restore_sys_module_state()
3968 self.restore_sys_module_state()
3966
3969
3967
3970
3968 # Overridden in terminal subclass to change prompts
3971 # Overridden in terminal subclass to change prompts
3969 def switch_doctest_mode(self, mode):
3972 def switch_doctest_mode(self, mode):
3970 pass
3973 pass
3971
3974
3972
3975
3973 class InteractiveShellABC(metaclass=abc.ABCMeta):
3976 class InteractiveShellABC(metaclass=abc.ABCMeta):
3974 """An abstract base class for InteractiveShell."""
3977 """An abstract base class for InteractiveShell."""
3975
3978
3976 InteractiveShellABC.register(InteractiveShell)
3979 InteractiveShellABC.register(InteractiveShell)
@@ -1,757 +1,759 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 import os
14 import os
15 import re
15 import re
16 import sys
16 import sys
17 from getopt import getopt, GetoptError
17 from getopt import getopt, GetoptError
18
18
19 from traitlets.config.configurable import Configurable
19 from traitlets.config.configurable import Configurable
20 from . import oinspect
20 from . import oinspect
21 from .error import UsageError
21 from .error import UsageError
22 from .inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
22 from .inputtransformer2 import ESC_MAGIC, ESC_MAGIC2
23 from ..utils.ipstruct import Struct
23 from ..utils.ipstruct import Struct
24 from ..utils.process import arg_split
24 from ..utils.process import arg_split
25 from ..utils.text import dedent
25 from ..utils.text import dedent
26 from traitlets import Bool, Dict, Instance, observe
26 from traitlets import Bool, Dict, Instance, observe
27 from logging import error
27 from logging import error
28
28
29 import typing as t
30
29 #-----------------------------------------------------------------------------
31 #-----------------------------------------------------------------------------
30 # Globals
32 # Globals
31 #-----------------------------------------------------------------------------
33 #-----------------------------------------------------------------------------
32
34
33 # A dict we'll use for each class that has magics, used as temporary storage to
35 # A dict we'll use for each class that has magics, used as temporary storage to
34 # pass information between the @line/cell_magic method decorators and the
36 # pass information between the @line/cell_magic method decorators and the
35 # @magics_class class decorator, because the method decorators have no
37 # @magics_class class decorator, because the method decorators have no
36 # access to the class when they run. See for more details:
38 # access to the class when they run. See for more details:
37 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
39 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
38
40
39 magics = dict(line={}, cell={})
41 magics: t.Dict = dict(line={}, cell={})
40
42
41 magic_kinds = ('line', 'cell')
43 magic_kinds = ('line', 'cell')
42 magic_spec = ('line', 'cell', 'line_cell')
44 magic_spec = ('line', 'cell', 'line_cell')
43 magic_escapes = dict(line=ESC_MAGIC, cell=ESC_MAGIC2)
45 magic_escapes = dict(line=ESC_MAGIC, cell=ESC_MAGIC2)
44
46
45 #-----------------------------------------------------------------------------
47 #-----------------------------------------------------------------------------
46 # Utility classes and functions
48 # Utility classes and functions
47 #-----------------------------------------------------------------------------
49 #-----------------------------------------------------------------------------
48
50
49 class Bunch: pass
51 class Bunch: pass
50
52
51
53
52 def on_off(tag):
54 def on_off(tag):
53 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
55 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
54 return ['OFF','ON'][tag]
56 return ['OFF','ON'][tag]
55
57
56
58
57 def compress_dhist(dh):
59 def compress_dhist(dh):
58 """Compress a directory history into a new one with at most 20 entries.
60 """Compress a directory history into a new one with at most 20 entries.
59
61
60 Return a new list made from the first and last 10 elements of dhist after
62 Return a new list made from the first and last 10 elements of dhist after
61 removal of duplicates.
63 removal of duplicates.
62 """
64 """
63 head, tail = dh[:-10], dh[-10:]
65 head, tail = dh[:-10], dh[-10:]
64
66
65 newhead = []
67 newhead = []
66 done = set()
68 done = set()
67 for h in head:
69 for h in head:
68 if h in done:
70 if h in done:
69 continue
71 continue
70 newhead.append(h)
72 newhead.append(h)
71 done.add(h)
73 done.add(h)
72
74
73 return newhead + tail
75 return newhead + tail
74
76
75
77
76 def needs_local_scope(func):
78 def needs_local_scope(func):
77 """Decorator to mark magic functions which need to local scope to run."""
79 """Decorator to mark magic functions which need to local scope to run."""
78 func.needs_local_scope = True
80 func.needs_local_scope = True
79 return func
81 return func
80
82
81 #-----------------------------------------------------------------------------
83 #-----------------------------------------------------------------------------
82 # Class and method decorators for registering magics
84 # Class and method decorators for registering magics
83 #-----------------------------------------------------------------------------
85 #-----------------------------------------------------------------------------
84
86
85 def magics_class(cls):
87 def magics_class(cls):
86 """Class decorator for all subclasses of the main Magics class.
88 """Class decorator for all subclasses of the main Magics class.
87
89
88 Any class that subclasses Magics *must* also apply this decorator, to
90 Any class that subclasses Magics *must* also apply this decorator, to
89 ensure that all the methods that have been decorated as line/cell magics
91 ensure that all the methods that have been decorated as line/cell magics
90 get correctly registered in the class instance. This is necessary because
92 get correctly registered in the class instance. This is necessary because
91 when method decorators run, the class does not exist yet, so they
93 when method decorators run, the class does not exist yet, so they
92 temporarily store their information into a module global. Application of
94 temporarily store their information into a module global. Application of
93 this class decorator copies that global data to the class instance and
95 this class decorator copies that global data to the class instance and
94 clears the global.
96 clears the global.
95
97
96 Obviously, this mechanism is not thread-safe, which means that the
98 Obviously, this mechanism is not thread-safe, which means that the
97 *creation* of subclasses of Magic should only be done in a single-thread
99 *creation* of subclasses of Magic should only be done in a single-thread
98 context. Instantiation of the classes has no restrictions. Given that
100 context. Instantiation of the classes has no restrictions. Given that
99 these classes are typically created at IPython startup time and before user
101 these classes are typically created at IPython startup time and before user
100 application code becomes active, in practice this should not pose any
102 application code becomes active, in practice this should not pose any
101 problems.
103 problems.
102 """
104 """
103 cls.registered = True
105 cls.registered = True
104 cls.magics = dict(line = magics['line'],
106 cls.magics = dict(line = magics['line'],
105 cell = magics['cell'])
107 cell = magics['cell'])
106 magics['line'] = {}
108 magics['line'] = {}
107 magics['cell'] = {}
109 magics['cell'] = {}
108 return cls
110 return cls
109
111
110
112
111 def record_magic(dct, magic_kind, magic_name, func):
113 def record_magic(dct, magic_kind, magic_name, func):
112 """Utility function to store a function as a magic of a specific kind.
114 """Utility function to store a function as a magic of a specific kind.
113
115
114 Parameters
116 Parameters
115 ----------
117 ----------
116 dct : dict
118 dct : dict
117 A dictionary with 'line' and 'cell' subdicts.
119 A dictionary with 'line' and 'cell' subdicts.
118 magic_kind : str
120 magic_kind : str
119 Kind of magic to be stored.
121 Kind of magic to be stored.
120 magic_name : str
122 magic_name : str
121 Key to store the magic as.
123 Key to store the magic as.
122 func : function
124 func : function
123 Callable object to store.
125 Callable object to store.
124 """
126 """
125 if magic_kind == 'line_cell':
127 if magic_kind == 'line_cell':
126 dct['line'][magic_name] = dct['cell'][magic_name] = func
128 dct['line'][magic_name] = dct['cell'][magic_name] = func
127 else:
129 else:
128 dct[magic_kind][magic_name] = func
130 dct[magic_kind][magic_name] = func
129
131
130
132
131 def validate_type(magic_kind):
133 def validate_type(magic_kind):
132 """Ensure that the given magic_kind is valid.
134 """Ensure that the given magic_kind is valid.
133
135
134 Check that the given magic_kind is one of the accepted spec types (stored
136 Check that the given magic_kind is one of the accepted spec types (stored
135 in the global `magic_spec`), raise ValueError otherwise.
137 in the global `magic_spec`), raise ValueError otherwise.
136 """
138 """
137 if magic_kind not in magic_spec:
139 if magic_kind not in magic_spec:
138 raise ValueError('magic_kind must be one of %s, %s given' %
140 raise ValueError('magic_kind must be one of %s, %s given' %
139 magic_kinds, magic_kind)
141 magic_kinds, magic_kind)
140
142
141
143
142 # The docstrings for the decorator below will be fairly similar for the two
144 # The docstrings for the decorator below will be fairly similar for the two
143 # types (method and function), so we generate them here once and reuse the
145 # types (method and function), so we generate them here once and reuse the
144 # templates below.
146 # templates below.
145 _docstring_template = \
147 _docstring_template = \
146 """Decorate the given {0} as {1} magic.
148 """Decorate the given {0} as {1} magic.
147
149
148 The decorator can be used with or without arguments, as follows.
150 The decorator can be used with or without arguments, as follows.
149
151
150 i) without arguments: it will create a {1} magic named as the {0} being
152 i) without arguments: it will create a {1} magic named as the {0} being
151 decorated::
153 decorated::
152
154
153 @deco
155 @deco
154 def foo(...)
156 def foo(...)
155
157
156 will create a {1} magic named `foo`.
158 will create a {1} magic named `foo`.
157
159
158 ii) with one string argument: which will be used as the actual name of the
160 ii) with one string argument: which will be used as the actual name of the
159 resulting magic::
161 resulting magic::
160
162
161 @deco('bar')
163 @deco('bar')
162 def foo(...)
164 def foo(...)
163
165
164 will create a {1} magic named `bar`.
166 will create a {1} magic named `bar`.
165
167
166 To register a class magic use ``Interactiveshell.register_magic(class or instance)``.
168 To register a class magic use ``Interactiveshell.register_magic(class or instance)``.
167 """
169 """
168
170
169 # These two are decorator factories. While they are conceptually very similar,
171 # These two are decorator factories. While they are conceptually very similar,
170 # there are enough differences in the details that it's simpler to have them
172 # there are enough differences in the details that it's simpler to have them
171 # written as completely standalone functions rather than trying to share code
173 # written as completely standalone functions rather than trying to share code
172 # and make a single one with convoluted logic.
174 # and make a single one with convoluted logic.
173
175
174 def _method_magic_marker(magic_kind):
176 def _method_magic_marker(magic_kind):
175 """Decorator factory for methods in Magics subclasses.
177 """Decorator factory for methods in Magics subclasses.
176 """
178 """
177
179
178 validate_type(magic_kind)
180 validate_type(magic_kind)
179
181
180 # This is a closure to capture the magic_kind. We could also use a class,
182 # This is a closure to capture the magic_kind. We could also use a class,
181 # but it's overkill for just that one bit of state.
183 # but it's overkill for just that one bit of state.
182 def magic_deco(arg):
184 def magic_deco(arg):
183 if callable(arg):
185 if callable(arg):
184 # "Naked" decorator call (just @foo, no args)
186 # "Naked" decorator call (just @foo, no args)
185 func = arg
187 func = arg
186 name = func.__name__
188 name = func.__name__
187 retval = arg
189 retval = arg
188 record_magic(magics, magic_kind, name, name)
190 record_magic(magics, magic_kind, name, name)
189 elif isinstance(arg, str):
191 elif isinstance(arg, str):
190 # Decorator called with arguments (@foo('bar'))
192 # Decorator called with arguments (@foo('bar'))
191 name = arg
193 name = arg
192 def mark(func, *a, **kw):
194 def mark(func, *a, **kw):
193 record_magic(magics, magic_kind, name, func.__name__)
195 record_magic(magics, magic_kind, name, func.__name__)
194 return func
196 return func
195 retval = mark
197 retval = mark
196 else:
198 else:
197 raise TypeError("Decorator can only be called with "
199 raise TypeError("Decorator can only be called with "
198 "string or function")
200 "string or function")
199 return retval
201 return retval
200
202
201 # Ensure the resulting decorator has a usable docstring
203 # Ensure the resulting decorator has a usable docstring
202 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
204 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
203 return magic_deco
205 return magic_deco
204
206
205
207
206 def _function_magic_marker(magic_kind):
208 def _function_magic_marker(magic_kind):
207 """Decorator factory for standalone functions.
209 """Decorator factory for standalone functions.
208 """
210 """
209 validate_type(magic_kind)
211 validate_type(magic_kind)
210
212
211 # This is a closure to capture the magic_kind. We could also use a class,
213 # This is a closure to capture the magic_kind. We could also use a class,
212 # but it's overkill for just that one bit of state.
214 # but it's overkill for just that one bit of state.
213 def magic_deco(arg):
215 def magic_deco(arg):
214 # Find get_ipython() in the caller's namespace
216 # Find get_ipython() in the caller's namespace
215 caller = sys._getframe(1)
217 caller = sys._getframe(1)
216 for ns in ['f_locals', 'f_globals', 'f_builtins']:
218 for ns in ['f_locals', 'f_globals', 'f_builtins']:
217 get_ipython = getattr(caller, ns).get('get_ipython')
219 get_ipython = getattr(caller, ns).get('get_ipython')
218 if get_ipython is not None:
220 if get_ipython is not None:
219 break
221 break
220 else:
222 else:
221 raise NameError('Decorator can only run in context where '
223 raise NameError('Decorator can only run in context where '
222 '`get_ipython` exists')
224 '`get_ipython` exists')
223
225
224 ip = get_ipython()
226 ip = get_ipython()
225
227
226 if callable(arg):
228 if callable(arg):
227 # "Naked" decorator call (just @foo, no args)
229 # "Naked" decorator call (just @foo, no args)
228 func = arg
230 func = arg
229 name = func.__name__
231 name = func.__name__
230 ip.register_magic_function(func, magic_kind, name)
232 ip.register_magic_function(func, magic_kind, name)
231 retval = arg
233 retval = arg
232 elif isinstance(arg, str):
234 elif isinstance(arg, str):
233 # Decorator called with arguments (@foo('bar'))
235 # Decorator called with arguments (@foo('bar'))
234 name = arg
236 name = arg
235 def mark(func, *a, **kw):
237 def mark(func, *a, **kw):
236 ip.register_magic_function(func, magic_kind, name)
238 ip.register_magic_function(func, magic_kind, name)
237 return func
239 return func
238 retval = mark
240 retval = mark
239 else:
241 else:
240 raise TypeError("Decorator can only be called with "
242 raise TypeError("Decorator can only be called with "
241 "string or function")
243 "string or function")
242 return retval
244 return retval
243
245
244 # Ensure the resulting decorator has a usable docstring
246 # Ensure the resulting decorator has a usable docstring
245 ds = _docstring_template.format('function', magic_kind)
247 ds = _docstring_template.format('function', magic_kind)
246
248
247 ds += dedent("""
249 ds += dedent("""
248 Note: this decorator can only be used in a context where IPython is already
250 Note: this decorator can only be used in a context where IPython is already
249 active, so that the `get_ipython()` call succeeds. You can therefore use
251 active, so that the `get_ipython()` call succeeds. You can therefore use
250 it in your startup files loaded after IPython initializes, but *not* in the
252 it in your startup files loaded after IPython initializes, but *not* in the
251 IPython configuration file itself, which is executed before IPython is
253 IPython configuration file itself, which is executed before IPython is
252 fully up and running. Any file located in the `startup` subdirectory of
254 fully up and running. Any file located in the `startup` subdirectory of
253 your configuration profile will be OK in this sense.
255 your configuration profile will be OK in this sense.
254 """)
256 """)
255
257
256 magic_deco.__doc__ = ds
258 magic_deco.__doc__ = ds
257 return magic_deco
259 return magic_deco
258
260
259
261
260 MAGIC_NO_VAR_EXPAND_ATTR = "_ipython_magic_no_var_expand"
262 MAGIC_NO_VAR_EXPAND_ATTR = "_ipython_magic_no_var_expand"
261 MAGIC_OUTPUT_CAN_BE_SILENCED = "_ipython_magic_output_can_be_silenced"
263 MAGIC_OUTPUT_CAN_BE_SILENCED = "_ipython_magic_output_can_be_silenced"
262
264
263
265
264 def no_var_expand(magic_func):
266 def no_var_expand(magic_func):
265 """Mark a magic function as not needing variable expansion
267 """Mark a magic function as not needing variable expansion
266
268
267 By default, IPython interprets `{a}` or `$a` in the line passed to magics
269 By default, IPython interprets `{a}` or `$a` in the line passed to magics
268 as variables that should be interpolated from the interactive namespace
270 as variables that should be interpolated from the interactive namespace
269 before passing the line to the magic function.
271 before passing the line to the magic function.
270 This is not always desirable, e.g. when the magic executes Python code
272 This is not always desirable, e.g. when the magic executes Python code
271 (%timeit, %time, etc.).
273 (%timeit, %time, etc.).
272 Decorate magics with `@no_var_expand` to opt-out of variable expansion.
274 Decorate magics with `@no_var_expand` to opt-out of variable expansion.
273
275
274 .. versionadded:: 7.3
276 .. versionadded:: 7.3
275 """
277 """
276 setattr(magic_func, MAGIC_NO_VAR_EXPAND_ATTR, True)
278 setattr(magic_func, MAGIC_NO_VAR_EXPAND_ATTR, True)
277 return magic_func
279 return magic_func
278
280
279
281
280 def output_can_be_silenced(magic_func):
282 def output_can_be_silenced(magic_func):
281 """Mark a magic function so its output may be silenced.
283 """Mark a magic function so its output may be silenced.
282
284
283 The output is silenced if the Python code used as a parameter of
285 The output is silenced if the Python code used as a parameter of
284 the magic ends in a semicolon, not counting a Python comment that can
286 the magic ends in a semicolon, not counting a Python comment that can
285 follow it.
287 follow it.
286 """
288 """
287 setattr(magic_func, MAGIC_OUTPUT_CAN_BE_SILENCED, True)
289 setattr(magic_func, MAGIC_OUTPUT_CAN_BE_SILENCED, True)
288 return magic_func
290 return magic_func
289
291
290 # Create the actual decorators for public use
292 # Create the actual decorators for public use
291
293
292 # These three are used to decorate methods in class definitions
294 # These three are used to decorate methods in class definitions
293 line_magic = _method_magic_marker('line')
295 line_magic = _method_magic_marker('line')
294 cell_magic = _method_magic_marker('cell')
296 cell_magic = _method_magic_marker('cell')
295 line_cell_magic = _method_magic_marker('line_cell')
297 line_cell_magic = _method_magic_marker('line_cell')
296
298
297 # These three decorate standalone functions and perform the decoration
299 # These three decorate standalone functions and perform the decoration
298 # immediately. They can only run where get_ipython() works
300 # immediately. They can only run where get_ipython() works
299 register_line_magic = _function_magic_marker('line')
301 register_line_magic = _function_magic_marker('line')
300 register_cell_magic = _function_magic_marker('cell')
302 register_cell_magic = _function_magic_marker('cell')
301 register_line_cell_magic = _function_magic_marker('line_cell')
303 register_line_cell_magic = _function_magic_marker('line_cell')
302
304
303 #-----------------------------------------------------------------------------
305 #-----------------------------------------------------------------------------
304 # Core Magic classes
306 # Core Magic classes
305 #-----------------------------------------------------------------------------
307 #-----------------------------------------------------------------------------
306
308
307 class MagicsManager(Configurable):
309 class MagicsManager(Configurable):
308 """Object that handles all magic-related functionality for IPython.
310 """Object that handles all magic-related functionality for IPython.
309 """
311 """
310 # Non-configurable class attributes
312 # Non-configurable class attributes
311
313
312 # A two-level dict, first keyed by magic type, then by magic function, and
314 # A two-level dict, first keyed by magic type, then by magic function, and
313 # holding the actual callable object as value. This is the dict used for
315 # holding the actual callable object as value. This is the dict used for
314 # magic function dispatch
316 # magic function dispatch
315 magics = Dict()
317 magics = Dict()
316 lazy_magics = Dict(
318 lazy_magics = Dict(
317 help="""
319 help="""
318 Mapping from magic names to modules to load.
320 Mapping from magic names to modules to load.
319
321
320 This can be used in IPython/IPykernel configuration to declare lazy magics
322 This can be used in IPython/IPykernel configuration to declare lazy magics
321 that will only be imported/registered on first use.
323 that will only be imported/registered on first use.
322
324
323 For example::
325 For example::
324
326
325 c.MagicsManager.lazy_magics = {
327 c.MagicsManager.lazy_magics = {
326 "my_magic": "slow.to.import",
328 "my_magic": "slow.to.import",
327 "my_other_magic": "also.slow",
329 "my_other_magic": "also.slow",
328 }
330 }
329
331
330 On first invocation of `%my_magic`, `%%my_magic`, `%%my_other_magic` or
332 On first invocation of `%my_magic`, `%%my_magic`, `%%my_other_magic` or
331 `%%my_other_magic`, the corresponding module will be loaded as an ipython
333 `%%my_other_magic`, the corresponding module will be loaded as an ipython
332 extensions as if you had previously done `%load_ext ipython`.
334 extensions as if you had previously done `%load_ext ipython`.
333
335
334 Magics names should be without percent(s) as magics can be both cell
336 Magics names should be without percent(s) as magics can be both cell
335 and line magics.
337 and line magics.
336
338
337 Lazy loading happen relatively late in execution process, and
339 Lazy loading happen relatively late in execution process, and
338 complex extensions that manipulate Python/IPython internal state or global state
340 complex extensions that manipulate Python/IPython internal state or global state
339 might not support lazy loading.
341 might not support lazy loading.
340 """
342 """
341 ).tag(
343 ).tag(
342 config=True,
344 config=True,
343 )
345 )
344
346
345 # A registry of the original objects that we've been given holding magics.
347 # A registry of the original objects that we've been given holding magics.
346 registry = Dict()
348 registry = Dict()
347
349
348 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', allow_none=True)
350 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC', allow_none=True)
349
351
350 auto_magic = Bool(True, help=
352 auto_magic = Bool(True, help=
351 "Automatically call line magics without requiring explicit % prefix"
353 "Automatically call line magics without requiring explicit % prefix"
352 ).tag(config=True)
354 ).tag(config=True)
353 @observe('auto_magic')
355 @observe('auto_magic')
354 def _auto_magic_changed(self, change):
356 def _auto_magic_changed(self, change):
355 self.shell.automagic = change['new']
357 self.shell.automagic = change['new']
356
358
357 _auto_status = [
359 _auto_status = [
358 'Automagic is OFF, % prefix IS needed for line magics.',
360 'Automagic is OFF, % prefix IS needed for line magics.',
359 'Automagic is ON, % prefix IS NOT needed for line magics.']
361 'Automagic is ON, % prefix IS NOT needed for line magics.']
360
362
361 user_magics = Instance('IPython.core.magics.UserMagics', allow_none=True)
363 user_magics = Instance('IPython.core.magics.UserMagics', allow_none=True)
362
364
363 def __init__(self, shell=None, config=None, user_magics=None, **traits):
365 def __init__(self, shell=None, config=None, user_magics=None, **traits):
364
366
365 super(MagicsManager, self).__init__(shell=shell, config=config,
367 super(MagicsManager, self).__init__(shell=shell, config=config,
366 user_magics=user_magics, **traits)
368 user_magics=user_magics, **traits)
367 self.magics = dict(line={}, cell={})
369 self.magics = dict(line={}, cell={})
368 # Let's add the user_magics to the registry for uniformity, so *all*
370 # Let's add the user_magics to the registry for uniformity, so *all*
369 # registered magic containers can be found there.
371 # registered magic containers can be found there.
370 self.registry[user_magics.__class__.__name__] = user_magics
372 self.registry[user_magics.__class__.__name__] = user_magics
371
373
372 def auto_status(self):
374 def auto_status(self):
373 """Return descriptive string with automagic status."""
375 """Return descriptive string with automagic status."""
374 return self._auto_status[self.auto_magic]
376 return self._auto_status[self.auto_magic]
375
377
376 def lsmagic(self):
378 def lsmagic(self):
377 """Return a dict of currently available magic functions.
379 """Return a dict of currently available magic functions.
378
380
379 The return dict has the keys 'line' and 'cell', corresponding to the
381 The return dict has the keys 'line' and 'cell', corresponding to the
380 two types of magics we support. Each value is a list of names.
382 two types of magics we support. Each value is a list of names.
381 """
383 """
382 return self.magics
384 return self.magics
383
385
384 def lsmagic_docs(self, brief=False, missing=''):
386 def lsmagic_docs(self, brief=False, missing=''):
385 """Return dict of documentation of magic functions.
387 """Return dict of documentation of magic functions.
386
388
387 The return dict has the keys 'line' and 'cell', corresponding to the
389 The return dict has the keys 'line' and 'cell', corresponding to the
388 two types of magics we support. Each value is a dict keyed by magic
390 two types of magics we support. Each value is a dict keyed by magic
389 name whose value is the function docstring. If a docstring is
391 name whose value is the function docstring. If a docstring is
390 unavailable, the value of `missing` is used instead.
392 unavailable, the value of `missing` is used instead.
391
393
392 If brief is True, only the first line of each docstring will be returned.
394 If brief is True, only the first line of each docstring will be returned.
393 """
395 """
394 docs = {}
396 docs = {}
395 for m_type in self.magics:
397 for m_type in self.magics:
396 m_docs = {}
398 m_docs = {}
397 for m_name, m_func in self.magics[m_type].items():
399 for m_name, m_func in self.magics[m_type].items():
398 if m_func.__doc__:
400 if m_func.__doc__:
399 if brief:
401 if brief:
400 m_docs[m_name] = m_func.__doc__.split('\n', 1)[0]
402 m_docs[m_name] = m_func.__doc__.split('\n', 1)[0]
401 else:
403 else:
402 m_docs[m_name] = m_func.__doc__.rstrip()
404 m_docs[m_name] = m_func.__doc__.rstrip()
403 else:
405 else:
404 m_docs[m_name] = missing
406 m_docs[m_name] = missing
405 docs[m_type] = m_docs
407 docs[m_type] = m_docs
406 return docs
408 return docs
407
409
408 def register_lazy(self, name: str, fully_qualified_name: str):
410 def register_lazy(self, name: str, fully_qualified_name: str):
409 """
411 """
410 Lazily register a magic via an extension.
412 Lazily register a magic via an extension.
411
413
412
414
413 Parameters
415 Parameters
414 ----------
416 ----------
415 name : str
417 name : str
416 Name of the magic you wish to register.
418 Name of the magic you wish to register.
417 fully_qualified_name :
419 fully_qualified_name :
418 Fully qualified name of the module/submodule that should be loaded
420 Fully qualified name of the module/submodule that should be loaded
419 as an extensions when the magic is first called.
421 as an extensions when the magic is first called.
420 It is assumed that loading this extensions will register the given
422 It is assumed that loading this extensions will register the given
421 magic.
423 magic.
422 """
424 """
423
425
424 self.lazy_magics[name] = fully_qualified_name
426 self.lazy_magics[name] = fully_qualified_name
425
427
426 def register(self, *magic_objects):
428 def register(self, *magic_objects):
427 """Register one or more instances of Magics.
429 """Register one or more instances of Magics.
428
430
429 Take one or more classes or instances of classes that subclass the main
431 Take one or more classes or instances of classes that subclass the main
430 `core.Magic` class, and register them with IPython to use the magic
432 `core.Magic` class, and register them with IPython to use the magic
431 functions they provide. The registration process will then ensure that
433 functions they provide. The registration process will then ensure that
432 any methods that have decorated to provide line and/or cell magics will
434 any methods that have decorated to provide line and/or cell magics will
433 be recognized with the `%x`/`%%x` syntax as a line/cell magic
435 be recognized with the `%x`/`%%x` syntax as a line/cell magic
434 respectively.
436 respectively.
435
437
436 If classes are given, they will be instantiated with the default
438 If classes are given, they will be instantiated with the default
437 constructor. If your classes need a custom constructor, you should
439 constructor. If your classes need a custom constructor, you should
438 instanitate them first and pass the instance.
440 instanitate them first and pass the instance.
439
441
440 The provided arguments can be an arbitrary mix of classes and instances.
442 The provided arguments can be an arbitrary mix of classes and instances.
441
443
442 Parameters
444 Parameters
443 ----------
445 ----------
444 *magic_objects : one or more classes or instances
446 *magic_objects : one or more classes or instances
445 """
447 """
446 # Start by validating them to ensure they have all had their magic
448 # Start by validating them to ensure they have all had their magic
447 # methods registered at the instance level
449 # methods registered at the instance level
448 for m in magic_objects:
450 for m in magic_objects:
449 if not m.registered:
451 if not m.registered:
450 raise ValueError("Class of magics %r was constructed without "
452 raise ValueError("Class of magics %r was constructed without "
451 "the @register_magics class decorator")
453 "the @register_magics class decorator")
452 if isinstance(m, type):
454 if isinstance(m, type):
453 # If we're given an uninstantiated class
455 # If we're given an uninstantiated class
454 m = m(shell=self.shell)
456 m = m(shell=self.shell)
455
457
456 # Now that we have an instance, we can register it and update the
458 # Now that we have an instance, we can register it and update the
457 # table of callables
459 # table of callables
458 self.registry[m.__class__.__name__] = m
460 self.registry[m.__class__.__name__] = m
459 for mtype in magic_kinds:
461 for mtype in magic_kinds:
460 self.magics[mtype].update(m.magics[mtype])
462 self.magics[mtype].update(m.magics[mtype])
461
463
462 def register_function(self, func, magic_kind='line', magic_name=None):
464 def register_function(self, func, magic_kind='line', magic_name=None):
463 """Expose a standalone function as magic function for IPython.
465 """Expose a standalone function as magic function for IPython.
464
466
465 This will create an IPython magic (line, cell or both) from a
467 This will create an IPython magic (line, cell or both) from a
466 standalone function. The functions should have the following
468 standalone function. The functions should have the following
467 signatures:
469 signatures:
468
470
469 * For line magics: `def f(line)`
471 * For line magics: `def f(line)`
470 * For cell magics: `def f(line, cell)`
472 * For cell magics: `def f(line, cell)`
471 * For a function that does both: `def f(line, cell=None)`
473 * For a function that does both: `def f(line, cell=None)`
472
474
473 In the latter case, the function will be called with `cell==None` when
475 In the latter case, the function will be called with `cell==None` when
474 invoked as `%f`, and with cell as a string when invoked as `%%f`.
476 invoked as `%f`, and with cell as a string when invoked as `%%f`.
475
477
476 Parameters
478 Parameters
477 ----------
479 ----------
478 func : callable
480 func : callable
479 Function to be registered as a magic.
481 Function to be registered as a magic.
480 magic_kind : str
482 magic_kind : str
481 Kind of magic, one of 'line', 'cell' or 'line_cell'
483 Kind of magic, one of 'line', 'cell' or 'line_cell'
482 magic_name : optional str
484 magic_name : optional str
483 If given, the name the magic will have in the IPython namespace. By
485 If given, the name the magic will have in the IPython namespace. By
484 default, the name of the function itself is used.
486 default, the name of the function itself is used.
485 """
487 """
486
488
487 # Create the new method in the user_magics and register it in the
489 # Create the new method in the user_magics and register it in the
488 # global table
490 # global table
489 validate_type(magic_kind)
491 validate_type(magic_kind)
490 magic_name = func.__name__ if magic_name is None else magic_name
492 magic_name = func.__name__ if magic_name is None else magic_name
491 setattr(self.user_magics, magic_name, func)
493 setattr(self.user_magics, magic_name, func)
492 record_magic(self.magics, magic_kind, magic_name, func)
494 record_magic(self.magics, magic_kind, magic_name, func)
493
495
494 def register_alias(self, alias_name, magic_name, magic_kind='line', magic_params=None):
496 def register_alias(self, alias_name, magic_name, magic_kind='line', magic_params=None):
495 """Register an alias to a magic function.
497 """Register an alias to a magic function.
496
498
497 The alias is an instance of :class:`MagicAlias`, which holds the
499 The alias is an instance of :class:`MagicAlias`, which holds the
498 name and kind of the magic it should call. Binding is done at
500 name and kind of the magic it should call. Binding is done at
499 call time, so if the underlying magic function is changed the alias
501 call time, so if the underlying magic function is changed the alias
500 will call the new function.
502 will call the new function.
501
503
502 Parameters
504 Parameters
503 ----------
505 ----------
504 alias_name : str
506 alias_name : str
505 The name of the magic to be registered.
507 The name of the magic to be registered.
506 magic_name : str
508 magic_name : str
507 The name of an existing magic.
509 The name of an existing magic.
508 magic_kind : str
510 magic_kind : str
509 Kind of magic, one of 'line' or 'cell'
511 Kind of magic, one of 'line' or 'cell'
510 """
512 """
511
513
512 # `validate_type` is too permissive, as it allows 'line_cell'
514 # `validate_type` is too permissive, as it allows 'line_cell'
513 # which we do not handle.
515 # which we do not handle.
514 if magic_kind not in magic_kinds:
516 if magic_kind not in magic_kinds:
515 raise ValueError('magic_kind must be one of %s, %s given' %
517 raise ValueError('magic_kind must be one of %s, %s given' %
516 magic_kinds, magic_kind)
518 magic_kinds, magic_kind)
517
519
518 alias = MagicAlias(self.shell, magic_name, magic_kind, magic_params)
520 alias = MagicAlias(self.shell, magic_name, magic_kind, magic_params)
519 setattr(self.user_magics, alias_name, alias)
521 setattr(self.user_magics, alias_name, alias)
520 record_magic(self.magics, magic_kind, alias_name, alias)
522 record_magic(self.magics, magic_kind, alias_name, alias)
521
523
522 # Key base class that provides the central functionality for magics.
524 # Key base class that provides the central functionality for magics.
523
525
524
526
525 class Magics(Configurable):
527 class Magics(Configurable):
526 """Base class for implementing magic functions.
528 """Base class for implementing magic functions.
527
529
528 Shell functions which can be reached as %function_name. All magic
530 Shell functions which can be reached as %function_name. All magic
529 functions should accept a string, which they can parse for their own
531 functions should accept a string, which they can parse for their own
530 needs. This can make some functions easier to type, eg `%cd ../`
532 needs. This can make some functions easier to type, eg `%cd ../`
531 vs. `%cd("../")`
533 vs. `%cd("../")`
532
534
533 Classes providing magic functions need to subclass this class, and they
535 Classes providing magic functions need to subclass this class, and they
534 MUST:
536 MUST:
535
537
536 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
538 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
537 individual methods as magic functions, AND
539 individual methods as magic functions, AND
538
540
539 - Use the class decorator `@magics_class` to ensure that the magic
541 - Use the class decorator `@magics_class` to ensure that the magic
540 methods are properly registered at the instance level upon instance
542 methods are properly registered at the instance level upon instance
541 initialization.
543 initialization.
542
544
543 See :mod:`magic_functions` for examples of actual implementation classes.
545 See :mod:`magic_functions` for examples of actual implementation classes.
544 """
546 """
545 # Dict holding all command-line options for each magic.
547 # Dict holding all command-line options for each magic.
546 options_table = None
548 options_table = None
547 # Dict for the mapping of magic names to methods, set by class decorator
549 # Dict for the mapping of magic names to methods, set by class decorator
548 magics = None
550 magics = None
549 # Flag to check that the class decorator was properly applied
551 # Flag to check that the class decorator was properly applied
550 registered = False
552 registered = False
551 # Instance of IPython shell
553 # Instance of IPython shell
552 shell = None
554 shell = None
553
555
554 def __init__(self, shell=None, **kwargs):
556 def __init__(self, shell=None, **kwargs):
555 if not(self.__class__.registered):
557 if not(self.__class__.registered):
556 raise ValueError('Magics subclass without registration - '
558 raise ValueError('Magics subclass without registration - '
557 'did you forget to apply @magics_class?')
559 'did you forget to apply @magics_class?')
558 if shell is not None:
560 if shell is not None:
559 if hasattr(shell, 'configurables'):
561 if hasattr(shell, 'configurables'):
560 shell.configurables.append(self)
562 shell.configurables.append(self)
561 if hasattr(shell, 'config'):
563 if hasattr(shell, 'config'):
562 kwargs.setdefault('parent', shell)
564 kwargs.setdefault('parent', shell)
563
565
564 self.shell = shell
566 self.shell = shell
565 self.options_table = {}
567 self.options_table = {}
566 # The method decorators are run when the instance doesn't exist yet, so
568 # The method decorators are run when the instance doesn't exist yet, so
567 # they can only record the names of the methods they are supposed to
569 # they can only record the names of the methods they are supposed to
568 # grab. Only now, that the instance exists, can we create the proper
570 # grab. Only now, that the instance exists, can we create the proper
569 # mapping to bound methods. So we read the info off the original names
571 # mapping to bound methods. So we read the info off the original names
570 # table and replace each method name by the actual bound method.
572 # table and replace each method name by the actual bound method.
571 # But we mustn't clobber the *class* mapping, in case of multiple instances.
573 # But we mustn't clobber the *class* mapping, in case of multiple instances.
572 class_magics = self.magics
574 class_magics = self.magics
573 self.magics = {}
575 self.magics = {}
574 for mtype in magic_kinds:
576 for mtype in magic_kinds:
575 tab = self.magics[mtype] = {}
577 tab = self.magics[mtype] = {}
576 cls_tab = class_magics[mtype]
578 cls_tab = class_magics[mtype]
577 for magic_name, meth_name in cls_tab.items():
579 for magic_name, meth_name in cls_tab.items():
578 if isinstance(meth_name, str):
580 if isinstance(meth_name, str):
579 # it's a method name, grab it
581 # it's a method name, grab it
580 tab[magic_name] = getattr(self, meth_name)
582 tab[magic_name] = getattr(self, meth_name)
581 else:
583 else:
582 # it's the real thing
584 # it's the real thing
583 tab[magic_name] = meth_name
585 tab[magic_name] = meth_name
584 # Configurable **needs** to be initiated at the end or the config
586 # Configurable **needs** to be initiated at the end or the config
585 # magics get screwed up.
587 # magics get screwed up.
586 super(Magics, self).__init__(**kwargs)
588 super(Magics, self).__init__(**kwargs)
587
589
588 def arg_err(self,func):
590 def arg_err(self,func):
589 """Print docstring if incorrect arguments were passed"""
591 """Print docstring if incorrect arguments were passed"""
590 print('Error in arguments:')
592 print('Error in arguments:')
591 print(oinspect.getdoc(func))
593 print(oinspect.getdoc(func))
592
594
593 def format_latex(self, strng):
595 def format_latex(self, strng):
594 """Format a string for latex inclusion."""
596 """Format a string for latex inclusion."""
595
597
596 # Characters that need to be escaped for latex:
598 # Characters that need to be escaped for latex:
597 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
599 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
598 # Magic command names as headers:
600 # Magic command names as headers:
599 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
601 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
600 re.MULTILINE)
602 re.MULTILINE)
601 # Magic commands
603 # Magic commands
602 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
604 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
603 re.MULTILINE)
605 re.MULTILINE)
604 # Paragraph continue
606 # Paragraph continue
605 par_re = re.compile(r'\\$',re.MULTILINE)
607 par_re = re.compile(r'\\$',re.MULTILINE)
606
608
607 # The "\n" symbol
609 # The "\n" symbol
608 newline_re = re.compile(r'\\n')
610 newline_re = re.compile(r'\\n')
609
611
610 # Now build the string for output:
612 # Now build the string for output:
611 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
613 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
612 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
614 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
613 strng)
615 strng)
614 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
616 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
615 strng = par_re.sub(r'\\\\',strng)
617 strng = par_re.sub(r'\\\\',strng)
616 strng = escape_re.sub(r'\\\1',strng)
618 strng = escape_re.sub(r'\\\1',strng)
617 strng = newline_re.sub(r'\\textbackslash{}n',strng)
619 strng = newline_re.sub(r'\\textbackslash{}n',strng)
618 return strng
620 return strng
619
621
620 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
622 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
621 """Parse options passed to an argument string.
623 """Parse options passed to an argument string.
622
624
623 The interface is similar to that of :func:`getopt.getopt`, but it
625 The interface is similar to that of :func:`getopt.getopt`, but it
624 returns a :class:`~IPython.utils.struct.Struct` with the options as keys
626 returns a :class:`~IPython.utils.struct.Struct` with the options as keys
625 and the stripped argument string still as a string.
627 and the stripped argument string still as a string.
626
628
627 arg_str is quoted as a true sys.argv vector by using shlex.split.
629 arg_str is quoted as a true sys.argv vector by using shlex.split.
628 This allows us to easily expand variables, glob files, quote
630 This allows us to easily expand variables, glob files, quote
629 arguments, etc.
631 arguments, etc.
630
632
631 Parameters
633 Parameters
632 ----------
634 ----------
633 arg_str : str
635 arg_str : str
634 The arguments to parse.
636 The arguments to parse.
635 opt_str : str
637 opt_str : str
636 The options specification.
638 The options specification.
637 mode : str, default 'string'
639 mode : str, default 'string'
638 If given as 'list', the argument string is returned as a list (split
640 If given as 'list', the argument string is returned as a list (split
639 on whitespace) instead of a string.
641 on whitespace) instead of a string.
640 list_all : bool, default False
642 list_all : bool, default False
641 Put all option values in lists. Normally only options
643 Put all option values in lists. Normally only options
642 appearing more than once are put in a list.
644 appearing more than once are put in a list.
643 posix : bool, default True
645 posix : bool, default True
644 Whether to split the input line in POSIX mode or not, as per the
646 Whether to split the input line in POSIX mode or not, as per the
645 conventions outlined in the :mod:`shlex` module from the standard
647 conventions outlined in the :mod:`shlex` module from the standard
646 library.
648 library.
647 """
649 """
648
650
649 # inject default options at the beginning of the input line
651 # inject default options at the beginning of the input line
650 caller = sys._getframe(1).f_code.co_name
652 caller = sys._getframe(1).f_code.co_name
651 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
653 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
652
654
653 mode = kw.get('mode','string')
655 mode = kw.get('mode','string')
654 if mode not in ['string','list']:
656 if mode not in ['string','list']:
655 raise ValueError('incorrect mode given: %s' % mode)
657 raise ValueError('incorrect mode given: %s' % mode)
656 # Get options
658 # Get options
657 list_all = kw.get('list_all',0)
659 list_all = kw.get('list_all',0)
658 posix = kw.get('posix', os.name == 'posix')
660 posix = kw.get('posix', os.name == 'posix')
659 strict = kw.get('strict', True)
661 strict = kw.get('strict', True)
660
662
661 preserve_non_opts = kw.get("preserve_non_opts", False)
663 preserve_non_opts = kw.get("preserve_non_opts", False)
662 remainder_arg_str = arg_str
664 remainder_arg_str = arg_str
663
665
664 # Check if we have more than one argument to warrant extra processing:
666 # Check if we have more than one argument to warrant extra processing:
665 odict = {} # Dictionary with options
667 odict = {} # Dictionary with options
666 args = arg_str.split()
668 args = arg_str.split()
667 if len(args) >= 1:
669 if len(args) >= 1:
668 # If the list of inputs only has 0 or 1 thing in it, there's no
670 # If the list of inputs only has 0 or 1 thing in it, there's no
669 # need to look for options
671 # need to look for options
670 argv = arg_split(arg_str, posix, strict)
672 argv = arg_split(arg_str, posix, strict)
671 # Do regular option processing
673 # Do regular option processing
672 try:
674 try:
673 opts,args = getopt(argv, opt_str, long_opts)
675 opts,args = getopt(argv, opt_str, long_opts)
674 except GetoptError as e:
676 except GetoptError as e:
675 raise UsageError(
677 raise UsageError(
676 '%s ( allowed: "%s" %s)' % (e.msg, opt_str, " ".join(long_opts))
678 '%s ( allowed: "%s" %s)' % (e.msg, opt_str, " ".join(long_opts))
677 ) from e
679 ) from e
678 for o, a in opts:
680 for o, a in opts:
679 if mode == "string" and preserve_non_opts:
681 if mode == "string" and preserve_non_opts:
680 # remove option-parts from the original args-string and preserve remaining-part.
682 # remove option-parts from the original args-string and preserve remaining-part.
681 # This relies on the arg_split(...) and getopt(...)'s impl spec, that the parsed options are
683 # This relies on the arg_split(...) and getopt(...)'s impl spec, that the parsed options are
682 # returned in the original order.
684 # returned in the original order.
683 remainder_arg_str = remainder_arg_str.replace(o, "", 1).replace(
685 remainder_arg_str = remainder_arg_str.replace(o, "", 1).replace(
684 a, "", 1
686 a, "", 1
685 )
687 )
686 if o.startswith("--"):
688 if o.startswith("--"):
687 o = o[2:]
689 o = o[2:]
688 else:
690 else:
689 o = o[1:]
691 o = o[1:]
690 try:
692 try:
691 odict[o].append(a)
693 odict[o].append(a)
692 except AttributeError:
694 except AttributeError:
693 odict[o] = [odict[o],a]
695 odict[o] = [odict[o],a]
694 except KeyError:
696 except KeyError:
695 if list_all:
697 if list_all:
696 odict[o] = [a]
698 odict[o] = [a]
697 else:
699 else:
698 odict[o] = a
700 odict[o] = a
699
701
700 # Prepare opts,args for return
702 # Prepare opts,args for return
701 opts = Struct(odict)
703 opts = Struct(odict)
702 if mode == 'string':
704 if mode == 'string':
703 if preserve_non_opts:
705 if preserve_non_opts:
704 args = remainder_arg_str.lstrip()
706 args = remainder_arg_str.lstrip()
705 else:
707 else:
706 args = " ".join(args)
708 args = " ".join(args)
707
709
708 return opts,args
710 return opts,args
709
711
710 def default_option(self, fn, optstr):
712 def default_option(self, fn, optstr):
711 """Make an entry in the options_table for fn, with value optstr"""
713 """Make an entry in the options_table for fn, with value optstr"""
712
714
713 if fn not in self.lsmagic():
715 if fn not in self.lsmagic():
714 error("%s is not a magic function" % fn)
716 error("%s is not a magic function" % fn)
715 self.options_table[fn] = optstr
717 self.options_table[fn] = optstr
716
718
717
719
718 class MagicAlias(object):
720 class MagicAlias(object):
719 """An alias to another magic function.
721 """An alias to another magic function.
720
722
721 An alias is determined by its magic name and magic kind. Lookup
723 An alias is determined by its magic name and magic kind. Lookup
722 is done at call time, so if the underlying magic changes the alias
724 is done at call time, so if the underlying magic changes the alias
723 will call the new function.
725 will call the new function.
724
726
725 Use the :meth:`MagicsManager.register_alias` method or the
727 Use the :meth:`MagicsManager.register_alias` method or the
726 `%alias_magic` magic function to create and register a new alias.
728 `%alias_magic` magic function to create and register a new alias.
727 """
729 """
728 def __init__(self, shell, magic_name, magic_kind, magic_params=None):
730 def __init__(self, shell, magic_name, magic_kind, magic_params=None):
729 self.shell = shell
731 self.shell = shell
730 self.magic_name = magic_name
732 self.magic_name = magic_name
731 self.magic_params = magic_params
733 self.magic_params = magic_params
732 self.magic_kind = magic_kind
734 self.magic_kind = magic_kind
733
735
734 self.pretty_target = '%s%s' % (magic_escapes[self.magic_kind], self.magic_name)
736 self.pretty_target = '%s%s' % (magic_escapes[self.magic_kind], self.magic_name)
735 self.__doc__ = "Alias for `%s`." % self.pretty_target
737 self.__doc__ = "Alias for `%s`." % self.pretty_target
736
738
737 self._in_call = False
739 self._in_call = False
738
740
739 def __call__(self, *args, **kwargs):
741 def __call__(self, *args, **kwargs):
740 """Call the magic alias."""
742 """Call the magic alias."""
741 fn = self.shell.find_magic(self.magic_name, self.magic_kind)
743 fn = self.shell.find_magic(self.magic_name, self.magic_kind)
742 if fn is None:
744 if fn is None:
743 raise UsageError("Magic `%s` not found." % self.pretty_target)
745 raise UsageError("Magic `%s` not found." % self.pretty_target)
744
746
745 # Protect against infinite recursion.
747 # Protect against infinite recursion.
746 if self._in_call:
748 if self._in_call:
747 raise UsageError("Infinite recursion detected; "
749 raise UsageError("Infinite recursion detected; "
748 "magic aliases cannot call themselves.")
750 "magic aliases cannot call themselves.")
749 self._in_call = True
751 self._in_call = True
750 try:
752 try:
751 if self.magic_params:
753 if self.magic_params:
752 args_list = list(args)
754 args_list = list(args)
753 args_list[0] = self.magic_params + " " + args[0]
755 args_list[0] = self.magic_params + " " + args[0]
754 args = tuple(args_list)
756 args = tuple(args_list)
755 return fn(*args, **kwargs)
757 return fn(*args, **kwargs)
756 finally:
758 finally:
757 self._in_call = False
759 self._in_call = False
@@ -1,944 +1,946 b''
1 # -*- coding: utf-8 -*-
2 """
1 """
3 Python advanced pretty printer. This pretty printer is intended to
2 Python advanced pretty printer. This pretty printer is intended to
4 replace the old `pprint` python module which does not allow developers
3 replace the old `pprint` python module which does not allow developers
5 to provide their own pretty print callbacks.
4 to provide their own pretty print callbacks.
6
5
7 This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`.
6 This module is based on ruby's `prettyprint.rb` library by `Tanaka Akira`.
8
7
9
8
10 Example Usage
9 Example Usage
11 -------------
10 -------------
12
11
13 To directly print the representation of an object use `pprint`::
12 To directly print the representation of an object use `pprint`::
14
13
15 from pretty import pprint
14 from pretty import pprint
16 pprint(complex_object)
15 pprint(complex_object)
17
16
18 To get a string of the output use `pretty`::
17 To get a string of the output use `pretty`::
19
18
20 from pretty import pretty
19 from pretty import pretty
21 string = pretty(complex_object)
20 string = pretty(complex_object)
22
21
23
22
24 Extending
23 Extending
25 ---------
24 ---------
26
25
27 The pretty library allows developers to add pretty printing rules for their
26 The pretty library allows developers to add pretty printing rules for their
28 own objects. This process is straightforward. All you have to do is to
27 own objects. This process is straightforward. All you have to do is to
29 add a `_repr_pretty_` method to your object and call the methods on the
28 add a `_repr_pretty_` method to your object and call the methods on the
30 pretty printer passed::
29 pretty printer passed::
31
30
32 class MyObject(object):
31 class MyObject(object):
33
32
34 def _repr_pretty_(self, p, cycle):
33 def _repr_pretty_(self, p, cycle):
35 ...
34 ...
36
35
37 Here's an example for a class with a simple constructor::
36 Here's an example for a class with a simple constructor::
38
37
39 class MySimpleObject:
38 class MySimpleObject:
40
39
41 def __init__(self, a, b, *, c=None):
40 def __init__(self, a, b, *, c=None):
42 self.a = a
41 self.a = a
43 self.b = b
42 self.b = b
44 self.c = c
43 self.c = c
45
44
46 def _repr_pretty_(self, p, cycle):
45 def _repr_pretty_(self, p, cycle):
47 ctor = CallExpression.factory(self.__class__.__name__)
46 ctor = CallExpression.factory(self.__class__.__name__)
48 if self.c is None:
47 if self.c is None:
49 p.pretty(ctor(a, b))
48 p.pretty(ctor(a, b))
50 else:
49 else:
51 p.pretty(ctor(a, b, c=c))
50 p.pretty(ctor(a, b, c=c))
52
51
53 Here is an example implementation of a `_repr_pretty_` method for a list
52 Here is an example implementation of a `_repr_pretty_` method for a list
54 subclass::
53 subclass::
55
54
56 class MyList(list):
55 class MyList(list):
57
56
58 def _repr_pretty_(self, p, cycle):
57 def _repr_pretty_(self, p, cycle):
59 if cycle:
58 if cycle:
60 p.text('MyList(...)')
59 p.text('MyList(...)')
61 else:
60 else:
62 with p.group(8, 'MyList([', '])'):
61 with p.group(8, 'MyList([', '])'):
63 for idx, item in enumerate(self):
62 for idx, item in enumerate(self):
64 if idx:
63 if idx:
65 p.text(',')
64 p.text(',')
66 p.breakable()
65 p.breakable()
67 p.pretty(item)
66 p.pretty(item)
68
67
69 The `cycle` parameter is `True` if pretty detected a cycle. You *have* to
68 The `cycle` parameter is `True` if pretty detected a cycle. You *have* to
70 react to that or the result is an infinite loop. `p.text()` just adds
69 react to that or the result is an infinite loop. `p.text()` just adds
71 non breaking text to the output, `p.breakable()` either adds a whitespace
70 non breaking text to the output, `p.breakable()` either adds a whitespace
72 or breaks here. If you pass it an argument it's used instead of the
71 or breaks here. If you pass it an argument it's used instead of the
73 default space. `p.pretty` prettyprints another object using the pretty print
72 default space. `p.pretty` prettyprints another object using the pretty print
74 method.
73 method.
75
74
76 The first parameter to the `group` function specifies the extra indentation
75 The first parameter to the `group` function specifies the extra indentation
77 of the next line. In this example the next item will either be on the same
76 of the next line. In this example the next item will either be on the same
78 line (if the items are short enough) or aligned with the right edge of the
77 line (if the items are short enough) or aligned with the right edge of the
79 opening bracket of `MyList`.
78 opening bracket of `MyList`.
80
79
81 If you just want to indent something you can use the group function
80 If you just want to indent something you can use the group function
82 without open / close parameters. You can also use this code::
81 without open / close parameters. You can also use this code::
83
82
84 with p.indent(2):
83 with p.indent(2):
85 ...
84 ...
86
85
87 Inheritance diagram:
86 Inheritance diagram:
88
87
89 .. inheritance-diagram:: IPython.lib.pretty
88 .. inheritance-diagram:: IPython.lib.pretty
90 :parts: 3
89 :parts: 3
91
90
92 :copyright: 2007 by Armin Ronacher.
91 :copyright: 2007 by Armin Ronacher.
93 Portions (c) 2009 by Robert Kern.
92 Portions (c) 2009 by Robert Kern.
94 :license: BSD License.
93 :license: BSD License.
95 """
94 """
96
95
97 from contextlib import contextmanager
96 from contextlib import contextmanager
98 import datetime
97 import datetime
99 import os
98 import os
100 import re
99 import re
101 import sys
100 import sys
102 import types
101 import types
103 from collections import deque
102 from collections import deque
104 from inspect import signature
103 from inspect import signature
105 from io import StringIO
104 from io import StringIO
106 from warnings import warn
105 from warnings import warn
107
106
108 from IPython.utils.decorators import undoc
107 from IPython.utils.decorators import undoc
109 from IPython.utils.py3compat import PYPY
108 from IPython.utils.py3compat import PYPY
110
109
110 from typing import Dict
111
111 __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter',
112 __all__ = ['pretty', 'pprint', 'PrettyPrinter', 'RepresentationPrinter',
112 'for_type', 'for_type_by_name', 'RawText', 'RawStringLiteral', 'CallExpression']
113 'for_type', 'for_type_by_name', 'RawText', 'RawStringLiteral', 'CallExpression']
113
114
114
115
115 MAX_SEQ_LENGTH = 1000
116 MAX_SEQ_LENGTH = 1000
116 _re_pattern_type = type(re.compile(''))
117 _re_pattern_type = type(re.compile(''))
117
118
118 def _safe_getattr(obj, attr, default=None):
119 def _safe_getattr(obj, attr, default=None):
119 """Safe version of getattr.
120 """Safe version of getattr.
120
121
121 Same as getattr, but will return ``default`` on any Exception,
122 Same as getattr, but will return ``default`` on any Exception,
122 rather than raising.
123 rather than raising.
123 """
124 """
124 try:
125 try:
125 return getattr(obj, attr, default)
126 return getattr(obj, attr, default)
126 except Exception:
127 except Exception:
127 return default
128 return default
128
129
129 @undoc
130 @undoc
130 class CUnicodeIO(StringIO):
131 class CUnicodeIO(StringIO):
131 def __init__(self, *args, **kwargs):
132 def __init__(self, *args, **kwargs):
132 super().__init__(*args, **kwargs)
133 super().__init__(*args, **kwargs)
133 warn(("CUnicodeIO is deprecated since IPython 6.0. "
134 warn(("CUnicodeIO is deprecated since IPython 6.0. "
134 "Please use io.StringIO instead."),
135 "Please use io.StringIO instead."),
135 DeprecationWarning, stacklevel=2)
136 DeprecationWarning, stacklevel=2)
136
137
137 def _sorted_for_pprint(items):
138 def _sorted_for_pprint(items):
138 """
139 """
139 Sort the given items for pretty printing. Since some predictable
140 Sort the given items for pretty printing. Since some predictable
140 sorting is better than no sorting at all, we sort on the string
141 sorting is better than no sorting at all, we sort on the string
141 representation if normal sorting fails.
142 representation if normal sorting fails.
142 """
143 """
143 items = list(items)
144 items = list(items)
144 try:
145 try:
145 return sorted(items)
146 return sorted(items)
146 except Exception:
147 except Exception:
147 try:
148 try:
148 return sorted(items, key=str)
149 return sorted(items, key=str)
149 except Exception:
150 except Exception:
150 return items
151 return items
151
152
152 def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
153 def pretty(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
153 """
154 """
154 Pretty print the object's representation.
155 Pretty print the object's representation.
155 """
156 """
156 stream = StringIO()
157 stream = StringIO()
157 printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length=max_seq_length)
158 printer = RepresentationPrinter(stream, verbose, max_width, newline, max_seq_length=max_seq_length)
158 printer.pretty(obj)
159 printer.pretty(obj)
159 printer.flush()
160 printer.flush()
160 return stream.getvalue()
161 return stream.getvalue()
161
162
162
163
163 def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
164 def pprint(obj, verbose=False, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
164 """
165 """
165 Like `pretty` but print to stdout.
166 Like `pretty` but print to stdout.
166 """
167 """
167 printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length=max_seq_length)
168 printer = RepresentationPrinter(sys.stdout, verbose, max_width, newline, max_seq_length=max_seq_length)
168 printer.pretty(obj)
169 printer.pretty(obj)
169 printer.flush()
170 printer.flush()
170 sys.stdout.write(newline)
171 sys.stdout.write(newline)
171 sys.stdout.flush()
172 sys.stdout.flush()
172
173
173 class _PrettyPrinterBase(object):
174 class _PrettyPrinterBase(object):
174
175
175 @contextmanager
176 @contextmanager
176 def indent(self, indent):
177 def indent(self, indent):
177 """with statement support for indenting/dedenting."""
178 """with statement support for indenting/dedenting."""
178 self.indentation += indent
179 self.indentation += indent
179 try:
180 try:
180 yield
181 yield
181 finally:
182 finally:
182 self.indentation -= indent
183 self.indentation -= indent
183
184
184 @contextmanager
185 @contextmanager
185 def group(self, indent=0, open='', close=''):
186 def group(self, indent=0, open='', close=''):
186 """like begin_group / end_group but for the with statement."""
187 """like begin_group / end_group but for the with statement."""
187 self.begin_group(indent, open)
188 self.begin_group(indent, open)
188 try:
189 try:
189 yield
190 yield
190 finally:
191 finally:
191 self.end_group(indent, close)
192 self.end_group(indent, close)
192
193
193 class PrettyPrinter(_PrettyPrinterBase):
194 class PrettyPrinter(_PrettyPrinterBase):
194 """
195 """
195 Baseclass for the `RepresentationPrinter` prettyprinter that is used to
196 Baseclass for the `RepresentationPrinter` prettyprinter that is used to
196 generate pretty reprs of objects. Contrary to the `RepresentationPrinter`
197 generate pretty reprs of objects. Contrary to the `RepresentationPrinter`
197 this printer knows nothing about the default pprinters or the `_repr_pretty_`
198 this printer knows nothing about the default pprinters or the `_repr_pretty_`
198 callback method.
199 callback method.
199 """
200 """
200
201
201 def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
202 def __init__(self, output, max_width=79, newline='\n', max_seq_length=MAX_SEQ_LENGTH):
202 self.output = output
203 self.output = output
203 self.max_width = max_width
204 self.max_width = max_width
204 self.newline = newline
205 self.newline = newline
205 self.max_seq_length = max_seq_length
206 self.max_seq_length = max_seq_length
206 self.output_width = 0
207 self.output_width = 0
207 self.buffer_width = 0
208 self.buffer_width = 0
208 self.buffer = deque()
209 self.buffer = deque()
209
210
210 root_group = Group(0)
211 root_group = Group(0)
211 self.group_stack = [root_group]
212 self.group_stack = [root_group]
212 self.group_queue = GroupQueue(root_group)
213 self.group_queue = GroupQueue(root_group)
213 self.indentation = 0
214 self.indentation = 0
214
215
215 def _break_one_group(self, group):
216 def _break_one_group(self, group):
216 while group.breakables:
217 while group.breakables:
217 x = self.buffer.popleft()
218 x = self.buffer.popleft()
218 self.output_width = x.output(self.output, self.output_width)
219 self.output_width = x.output(self.output, self.output_width)
219 self.buffer_width -= x.width
220 self.buffer_width -= x.width
220 while self.buffer and isinstance(self.buffer[0], Text):
221 while self.buffer and isinstance(self.buffer[0], Text):
221 x = self.buffer.popleft()
222 x = self.buffer.popleft()
222 self.output_width = x.output(self.output, self.output_width)
223 self.output_width = x.output(self.output, self.output_width)
223 self.buffer_width -= x.width
224 self.buffer_width -= x.width
224
225
225 def _break_outer_groups(self):
226 def _break_outer_groups(self):
226 while self.max_width < self.output_width + self.buffer_width:
227 while self.max_width < self.output_width + self.buffer_width:
227 group = self.group_queue.deq()
228 group = self.group_queue.deq()
228 if not group:
229 if not group:
229 return
230 return
230 self._break_one_group(group)
231 self._break_one_group(group)
231
232
232 def text(self, obj):
233 def text(self, obj):
233 """Add literal text to the output."""
234 """Add literal text to the output."""
234 width = len(obj)
235 width = len(obj)
235 if self.buffer:
236 if self.buffer:
236 text = self.buffer[-1]
237 text = self.buffer[-1]
237 if not isinstance(text, Text):
238 if not isinstance(text, Text):
238 text = Text()
239 text = Text()
239 self.buffer.append(text)
240 self.buffer.append(text)
240 text.add(obj, width)
241 text.add(obj, width)
241 self.buffer_width += width
242 self.buffer_width += width
242 self._break_outer_groups()
243 self._break_outer_groups()
243 else:
244 else:
244 self.output.write(obj)
245 self.output.write(obj)
245 self.output_width += width
246 self.output_width += width
246
247
247 def breakable(self, sep=' '):
248 def breakable(self, sep=' '):
248 """
249 """
249 Add a breakable separator to the output. This does not mean that it
250 Add a breakable separator to the output. This does not mean that it
250 will automatically break here. If no breaking on this position takes
251 will automatically break here. If no breaking on this position takes
251 place the `sep` is inserted which default to one space.
252 place the `sep` is inserted which default to one space.
252 """
253 """
253 width = len(sep)
254 width = len(sep)
254 group = self.group_stack[-1]
255 group = self.group_stack[-1]
255 if group.want_break:
256 if group.want_break:
256 self.flush()
257 self.flush()
257 self.output.write(self.newline)
258 self.output.write(self.newline)
258 self.output.write(' ' * self.indentation)
259 self.output.write(' ' * self.indentation)
259 self.output_width = self.indentation
260 self.output_width = self.indentation
260 self.buffer_width = 0
261 self.buffer_width = 0
261 else:
262 else:
262 self.buffer.append(Breakable(sep, width, self))
263 self.buffer.append(Breakable(sep, width, self))
263 self.buffer_width += width
264 self.buffer_width += width
264 self._break_outer_groups()
265 self._break_outer_groups()
265
266
266 def break_(self):
267 def break_(self):
267 """
268 """
268 Explicitly insert a newline into the output, maintaining correct indentation.
269 Explicitly insert a newline into the output, maintaining correct indentation.
269 """
270 """
270 group = self.group_queue.deq()
271 group = self.group_queue.deq()
271 if group:
272 if group:
272 self._break_one_group(group)
273 self._break_one_group(group)
273 self.flush()
274 self.flush()
274 self.output.write(self.newline)
275 self.output.write(self.newline)
275 self.output.write(' ' * self.indentation)
276 self.output.write(' ' * self.indentation)
276 self.output_width = self.indentation
277 self.output_width = self.indentation
277 self.buffer_width = 0
278 self.buffer_width = 0
278
279
279
280
280 def begin_group(self, indent=0, open=''):
281 def begin_group(self, indent=0, open=''):
281 """
282 """
282 Begin a group.
283 Begin a group.
283 The first parameter specifies the indentation for the next line (usually
284 The first parameter specifies the indentation for the next line (usually
284 the width of the opening text), the second the opening text. All
285 the width of the opening text), the second the opening text. All
285 parameters are optional.
286 parameters are optional.
286 """
287 """
287 if open:
288 if open:
288 self.text(open)
289 self.text(open)
289 group = Group(self.group_stack[-1].depth + 1)
290 group = Group(self.group_stack[-1].depth + 1)
290 self.group_stack.append(group)
291 self.group_stack.append(group)
291 self.group_queue.enq(group)
292 self.group_queue.enq(group)
292 self.indentation += indent
293 self.indentation += indent
293
294
294 def _enumerate(self, seq):
295 def _enumerate(self, seq):
295 """like enumerate, but with an upper limit on the number of items"""
296 """like enumerate, but with an upper limit on the number of items"""
296 for idx, x in enumerate(seq):
297 for idx, x in enumerate(seq):
297 if self.max_seq_length and idx >= self.max_seq_length:
298 if self.max_seq_length and idx >= self.max_seq_length:
298 self.text(',')
299 self.text(',')
299 self.breakable()
300 self.breakable()
300 self.text('...')
301 self.text('...')
301 return
302 return
302 yield idx, x
303 yield idx, x
303
304
304 def end_group(self, dedent=0, close=''):
305 def end_group(self, dedent=0, close=''):
305 """End a group. See `begin_group` for more details."""
306 """End a group. See `begin_group` for more details."""
306 self.indentation -= dedent
307 self.indentation -= dedent
307 group = self.group_stack.pop()
308 group = self.group_stack.pop()
308 if not group.breakables:
309 if not group.breakables:
309 self.group_queue.remove(group)
310 self.group_queue.remove(group)
310 if close:
311 if close:
311 self.text(close)
312 self.text(close)
312
313
313 def flush(self):
314 def flush(self):
314 """Flush data that is left in the buffer."""
315 """Flush data that is left in the buffer."""
315 for data in self.buffer:
316 for data in self.buffer:
316 self.output_width += data.output(self.output, self.output_width)
317 self.output_width += data.output(self.output, self.output_width)
317 self.buffer.clear()
318 self.buffer.clear()
318 self.buffer_width = 0
319 self.buffer_width = 0
319
320
320
321
321 def _get_mro(obj_class):
322 def _get_mro(obj_class):
322 """ Get a reasonable method resolution order of a class and its superclasses
323 """ Get a reasonable method resolution order of a class and its superclasses
323 for both old-style and new-style classes.
324 for both old-style and new-style classes.
324 """
325 """
325 if not hasattr(obj_class, '__mro__'):
326 if not hasattr(obj_class, '__mro__'):
326 # Old-style class. Mix in object to make a fake new-style class.
327 # Old-style class. Mix in object to make a fake new-style class.
327 try:
328 try:
328 obj_class = type(obj_class.__name__, (obj_class, object), {})
329 obj_class = type(obj_class.__name__, (obj_class, object), {})
329 except TypeError:
330 except TypeError:
330 # Old-style extension type that does not descend from object.
331 # Old-style extension type that does not descend from object.
331 # FIXME: try to construct a more thorough MRO.
332 # FIXME: try to construct a more thorough MRO.
332 mro = [obj_class]
333 mro = [obj_class]
333 else:
334 else:
334 mro = obj_class.__mro__[1:-1]
335 mro = obj_class.__mro__[1:-1]
335 else:
336 else:
336 mro = obj_class.__mro__
337 mro = obj_class.__mro__
337 return mro
338 return mro
338
339
339
340
340 class RepresentationPrinter(PrettyPrinter):
341 class RepresentationPrinter(PrettyPrinter):
341 """
342 """
342 Special pretty printer that has a `pretty` method that calls the pretty
343 Special pretty printer that has a `pretty` method that calls the pretty
343 printer for a python object.
344 printer for a python object.
344
345
345 This class stores processing data on `self` so you must *never* use
346 This class stores processing data on `self` so you must *never* use
346 this class in a threaded environment. Always lock it or reinstanciate
347 this class in a threaded environment. Always lock it or reinstanciate
347 it.
348 it.
348
349
349 Instances also have a verbose flag callbacks can access to control their
350 Instances also have a verbose flag callbacks can access to control their
350 output. For example the default instance repr prints all attributes and
351 output. For example the default instance repr prints all attributes and
351 methods that are not prefixed by an underscore if the printer is in
352 methods that are not prefixed by an underscore if the printer is in
352 verbose mode.
353 verbose mode.
353 """
354 """
354
355
355 def __init__(self, output, verbose=False, max_width=79, newline='\n',
356 def __init__(self, output, verbose=False, max_width=79, newline='\n',
356 singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None,
357 singleton_pprinters=None, type_pprinters=None, deferred_pprinters=None,
357 max_seq_length=MAX_SEQ_LENGTH):
358 max_seq_length=MAX_SEQ_LENGTH):
358
359
359 PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length)
360 PrettyPrinter.__init__(self, output, max_width, newline, max_seq_length=max_seq_length)
360 self.verbose = verbose
361 self.verbose = verbose
361 self.stack = []
362 self.stack = []
362 if singleton_pprinters is None:
363 if singleton_pprinters is None:
363 singleton_pprinters = _singleton_pprinters.copy()
364 singleton_pprinters = _singleton_pprinters.copy()
364 self.singleton_pprinters = singleton_pprinters
365 self.singleton_pprinters = singleton_pprinters
365 if type_pprinters is None:
366 if type_pprinters is None:
366 type_pprinters = _type_pprinters.copy()
367 type_pprinters = _type_pprinters.copy()
367 self.type_pprinters = type_pprinters
368 self.type_pprinters = type_pprinters
368 if deferred_pprinters is None:
369 if deferred_pprinters is None:
369 deferred_pprinters = _deferred_type_pprinters.copy()
370 deferred_pprinters = _deferred_type_pprinters.copy()
370 self.deferred_pprinters = deferred_pprinters
371 self.deferred_pprinters = deferred_pprinters
371
372
372 def pretty(self, obj):
373 def pretty(self, obj):
373 """Pretty print the given object."""
374 """Pretty print the given object."""
374 obj_id = id(obj)
375 obj_id = id(obj)
375 cycle = obj_id in self.stack
376 cycle = obj_id in self.stack
376 self.stack.append(obj_id)
377 self.stack.append(obj_id)
377 self.begin_group()
378 self.begin_group()
378 try:
379 try:
379 obj_class = _safe_getattr(obj, '__class__', None) or type(obj)
380 obj_class = _safe_getattr(obj, '__class__', None) or type(obj)
380 # First try to find registered singleton printers for the type.
381 # First try to find registered singleton printers for the type.
381 try:
382 try:
382 printer = self.singleton_pprinters[obj_id]
383 printer = self.singleton_pprinters[obj_id]
383 except (TypeError, KeyError):
384 except (TypeError, KeyError):
384 pass
385 pass
385 else:
386 else:
386 return printer(obj, self, cycle)
387 return printer(obj, self, cycle)
387 # Next walk the mro and check for either:
388 # Next walk the mro and check for either:
388 # 1) a registered printer
389 # 1) a registered printer
389 # 2) a _repr_pretty_ method
390 # 2) a _repr_pretty_ method
390 for cls in _get_mro(obj_class):
391 for cls in _get_mro(obj_class):
391 if cls in self.type_pprinters:
392 if cls in self.type_pprinters:
392 # printer registered in self.type_pprinters
393 # printer registered in self.type_pprinters
393 return self.type_pprinters[cls](obj, self, cycle)
394 return self.type_pprinters[cls](obj, self, cycle)
394 else:
395 else:
395 # deferred printer
396 # deferred printer
396 printer = self._in_deferred_types(cls)
397 printer = self._in_deferred_types(cls)
397 if printer is not None:
398 if printer is not None:
398 return printer(obj, self, cycle)
399 return printer(obj, self, cycle)
399 else:
400 else:
400 # Finally look for special method names.
401 # Finally look for special method names.
401 # Some objects automatically create any requested
402 # Some objects automatically create any requested
402 # attribute. Try to ignore most of them by checking for
403 # attribute. Try to ignore most of them by checking for
403 # callability.
404 # callability.
404 if '_repr_pretty_' in cls.__dict__:
405 if '_repr_pretty_' in cls.__dict__:
405 meth = cls._repr_pretty_
406 meth = cls._repr_pretty_
406 if callable(meth):
407 if callable(meth):
407 return meth(obj, self, cycle)
408 return meth(obj, self, cycle)
408 if cls is not object \
409 if cls is not object \
409 and callable(cls.__dict__.get('__repr__')):
410 and callable(cls.__dict__.get('__repr__')):
410 return _repr_pprint(obj, self, cycle)
411 return _repr_pprint(obj, self, cycle)
411
412
412 return _default_pprint(obj, self, cycle)
413 return _default_pprint(obj, self, cycle)
413 finally:
414 finally:
414 self.end_group()
415 self.end_group()
415 self.stack.pop()
416 self.stack.pop()
416
417
417 def _in_deferred_types(self, cls):
418 def _in_deferred_types(self, cls):
418 """
419 """
419 Check if the given class is specified in the deferred type registry.
420 Check if the given class is specified in the deferred type registry.
420
421
421 Returns the printer from the registry if it exists, and None if the
422 Returns the printer from the registry if it exists, and None if the
422 class is not in the registry. Successful matches will be moved to the
423 class is not in the registry. Successful matches will be moved to the
423 regular type registry for future use.
424 regular type registry for future use.
424 """
425 """
425 mod = _safe_getattr(cls, '__module__', None)
426 mod = _safe_getattr(cls, '__module__', None)
426 name = _safe_getattr(cls, '__name__', None)
427 name = _safe_getattr(cls, '__name__', None)
427 key = (mod, name)
428 key = (mod, name)
428 printer = None
429 printer = None
429 if key in self.deferred_pprinters:
430 if key in self.deferred_pprinters:
430 # Move the printer over to the regular registry.
431 # Move the printer over to the regular registry.
431 printer = self.deferred_pprinters.pop(key)
432 printer = self.deferred_pprinters.pop(key)
432 self.type_pprinters[cls] = printer
433 self.type_pprinters[cls] = printer
433 return printer
434 return printer
434
435
435
436
436 class Printable(object):
437 class Printable(object):
437
438
438 def output(self, stream, output_width):
439 def output(self, stream, output_width):
439 return output_width
440 return output_width
440
441
441
442
442 class Text(Printable):
443 class Text(Printable):
443
444
444 def __init__(self):
445 def __init__(self):
445 self.objs = []
446 self.objs = []
446 self.width = 0
447 self.width = 0
447
448
448 def output(self, stream, output_width):
449 def output(self, stream, output_width):
449 for obj in self.objs:
450 for obj in self.objs:
450 stream.write(obj)
451 stream.write(obj)
451 return output_width + self.width
452 return output_width + self.width
452
453
453 def add(self, obj, width):
454 def add(self, obj, width):
454 self.objs.append(obj)
455 self.objs.append(obj)
455 self.width += width
456 self.width += width
456
457
457
458
458 class Breakable(Printable):
459 class Breakable(Printable):
459
460
460 def __init__(self, seq, width, pretty):
461 def __init__(self, seq, width, pretty):
461 self.obj = seq
462 self.obj = seq
462 self.width = width
463 self.width = width
463 self.pretty = pretty
464 self.pretty = pretty
464 self.indentation = pretty.indentation
465 self.indentation = pretty.indentation
465 self.group = pretty.group_stack[-1]
466 self.group = pretty.group_stack[-1]
466 self.group.breakables.append(self)
467 self.group.breakables.append(self)
467
468
468 def output(self, stream, output_width):
469 def output(self, stream, output_width):
469 self.group.breakables.popleft()
470 self.group.breakables.popleft()
470 if self.group.want_break:
471 if self.group.want_break:
471 stream.write(self.pretty.newline)
472 stream.write(self.pretty.newline)
472 stream.write(' ' * self.indentation)
473 stream.write(' ' * self.indentation)
473 return self.indentation
474 return self.indentation
474 if not self.group.breakables:
475 if not self.group.breakables:
475 self.pretty.group_queue.remove(self.group)
476 self.pretty.group_queue.remove(self.group)
476 stream.write(self.obj)
477 stream.write(self.obj)
477 return output_width + self.width
478 return output_width + self.width
478
479
479
480
480 class Group(Printable):
481 class Group(Printable):
481
482
482 def __init__(self, depth):
483 def __init__(self, depth):
483 self.depth = depth
484 self.depth = depth
484 self.breakables = deque()
485 self.breakables = deque()
485 self.want_break = False
486 self.want_break = False
486
487
487
488
488 class GroupQueue(object):
489 class GroupQueue(object):
489
490
490 def __init__(self, *groups):
491 def __init__(self, *groups):
491 self.queue = []
492 self.queue = []
492 for group in groups:
493 for group in groups:
493 self.enq(group)
494 self.enq(group)
494
495
495 def enq(self, group):
496 def enq(self, group):
496 depth = group.depth
497 depth = group.depth
497 while depth > len(self.queue) - 1:
498 while depth > len(self.queue) - 1:
498 self.queue.append([])
499 self.queue.append([])
499 self.queue[depth].append(group)
500 self.queue[depth].append(group)
500
501
501 def deq(self):
502 def deq(self):
502 for stack in self.queue:
503 for stack in self.queue:
503 for idx, group in enumerate(reversed(stack)):
504 for idx, group in enumerate(reversed(stack)):
504 if group.breakables:
505 if group.breakables:
505 del stack[idx]
506 del stack[idx]
506 group.want_break = True
507 group.want_break = True
507 return group
508 return group
508 for group in stack:
509 for group in stack:
509 group.want_break = True
510 group.want_break = True
510 del stack[:]
511 del stack[:]
511
512
512 def remove(self, group):
513 def remove(self, group):
513 try:
514 try:
514 self.queue[group.depth].remove(group)
515 self.queue[group.depth].remove(group)
515 except ValueError:
516 except ValueError:
516 pass
517 pass
517
518
518
519
519 class RawText:
520 class RawText:
520 """ Object such that ``p.pretty(RawText(value))`` is the same as ``p.text(value)``.
521 """ Object such that ``p.pretty(RawText(value))`` is the same as ``p.text(value)``.
521
522
522 An example usage of this would be to show a list as binary numbers, using
523 An example usage of this would be to show a list as binary numbers, using
523 ``p.pretty([RawText(bin(i)) for i in integers])``.
524 ``p.pretty([RawText(bin(i)) for i in integers])``.
524 """
525 """
525 def __init__(self, value):
526 def __init__(self, value):
526 self.value = value
527 self.value = value
527
528
528 def _repr_pretty_(self, p, cycle):
529 def _repr_pretty_(self, p, cycle):
529 p.text(self.value)
530 p.text(self.value)
530
531
531
532
532 class CallExpression:
533 class CallExpression:
533 """ Object which emits a line-wrapped call expression in the form `__name(*args, **kwargs)` """
534 """ Object which emits a line-wrapped call expression in the form `__name(*args, **kwargs)` """
534 def __init__(__self, __name, *args, **kwargs):
535 def __init__(__self, __name, *args, **kwargs):
535 # dunders are to avoid clashes with kwargs, as python's name manging
536 # dunders are to avoid clashes with kwargs, as python's name manging
536 # will kick in.
537 # will kick in.
537 self = __self
538 self = __self
538 self.name = __name
539 self.name = __name
539 self.args = args
540 self.args = args
540 self.kwargs = kwargs
541 self.kwargs = kwargs
541
542
542 @classmethod
543 @classmethod
543 def factory(cls, name):
544 def factory(cls, name):
544 def inner(*args, **kwargs):
545 def inner(*args, **kwargs):
545 return cls(name, *args, **kwargs)
546 return cls(name, *args, **kwargs)
546 return inner
547 return inner
547
548
548 def _repr_pretty_(self, p, cycle):
549 def _repr_pretty_(self, p, cycle):
549 # dunders are to avoid clashes with kwargs, as python's name manging
550 # dunders are to avoid clashes with kwargs, as python's name manging
550 # will kick in.
551 # will kick in.
551
552
552 started = False
553 started = False
553 def new_item():
554 def new_item():
554 nonlocal started
555 nonlocal started
555 if started:
556 if started:
556 p.text(",")
557 p.text(",")
557 p.breakable()
558 p.breakable()
558 started = True
559 started = True
559
560
560 prefix = self.name + "("
561 prefix = self.name + "("
561 with p.group(len(prefix), prefix, ")"):
562 with p.group(len(prefix), prefix, ")"):
562 for arg in self.args:
563 for arg in self.args:
563 new_item()
564 new_item()
564 p.pretty(arg)
565 p.pretty(arg)
565 for arg_name, arg in self.kwargs.items():
566 for arg_name, arg in self.kwargs.items():
566 new_item()
567 new_item()
567 arg_prefix = arg_name + "="
568 arg_prefix = arg_name + "="
568 with p.group(len(arg_prefix), arg_prefix):
569 with p.group(len(arg_prefix), arg_prefix):
569 p.pretty(arg)
570 p.pretty(arg)
570
571
571
572
572 class RawStringLiteral:
573 class RawStringLiteral:
573 """ Wrapper that shows a string with a `r` prefix """
574 """ Wrapper that shows a string with a `r` prefix """
574 def __init__(self, value):
575 def __init__(self, value):
575 self.value = value
576 self.value = value
576
577
577 def _repr_pretty_(self, p, cycle):
578 def _repr_pretty_(self, p, cycle):
578 base_repr = repr(self.value)
579 base_repr = repr(self.value)
579 if base_repr[:1] in 'uU':
580 if base_repr[:1] in 'uU':
580 base_repr = base_repr[1:]
581 base_repr = base_repr[1:]
581 prefix = 'ur'
582 prefix = 'ur'
582 else:
583 else:
583 prefix = 'r'
584 prefix = 'r'
584 base_repr = prefix + base_repr.replace('\\\\', '\\')
585 base_repr = prefix + base_repr.replace('\\\\', '\\')
585 p.text(base_repr)
586 p.text(base_repr)
586
587
587
588
588 def _default_pprint(obj, p, cycle):
589 def _default_pprint(obj, p, cycle):
589 """
590 """
590 The default print function. Used if an object does not provide one and
591 The default print function. Used if an object does not provide one and
591 it's none of the builtin objects.
592 it's none of the builtin objects.
592 """
593 """
593 klass = _safe_getattr(obj, '__class__', None) or type(obj)
594 klass = _safe_getattr(obj, '__class__', None) or type(obj)
594 if _safe_getattr(klass, '__repr__', None) is not object.__repr__:
595 if _safe_getattr(klass, '__repr__', None) is not object.__repr__:
595 # A user-provided repr. Find newlines and replace them with p.break_()
596 # A user-provided repr. Find newlines and replace them with p.break_()
596 _repr_pprint(obj, p, cycle)
597 _repr_pprint(obj, p, cycle)
597 return
598 return
598 p.begin_group(1, '<')
599 p.begin_group(1, '<')
599 p.pretty(klass)
600 p.pretty(klass)
600 p.text(' at 0x%x' % id(obj))
601 p.text(' at 0x%x' % id(obj))
601 if cycle:
602 if cycle:
602 p.text(' ...')
603 p.text(' ...')
603 elif p.verbose:
604 elif p.verbose:
604 first = True
605 first = True
605 for key in dir(obj):
606 for key in dir(obj):
606 if not key.startswith('_'):
607 if not key.startswith('_'):
607 try:
608 try:
608 value = getattr(obj, key)
609 value = getattr(obj, key)
609 except AttributeError:
610 except AttributeError:
610 continue
611 continue
611 if isinstance(value, types.MethodType):
612 if isinstance(value, types.MethodType):
612 continue
613 continue
613 if not first:
614 if not first:
614 p.text(',')
615 p.text(',')
615 p.breakable()
616 p.breakable()
616 p.text(key)
617 p.text(key)
617 p.text('=')
618 p.text('=')
618 step = len(key) + 1
619 step = len(key) + 1
619 p.indentation += step
620 p.indentation += step
620 p.pretty(value)
621 p.pretty(value)
621 p.indentation -= step
622 p.indentation -= step
622 first = False
623 first = False
623 p.end_group(1, '>')
624 p.end_group(1, '>')
624
625
625
626
626 def _seq_pprinter_factory(start, end):
627 def _seq_pprinter_factory(start, end):
627 """
628 """
628 Factory that returns a pprint function useful for sequences. Used by
629 Factory that returns a pprint function useful for sequences. Used by
629 the default pprint for tuples and lists.
630 the default pprint for tuples and lists.
630 """
631 """
631 def inner(obj, p, cycle):
632 def inner(obj, p, cycle):
632 if cycle:
633 if cycle:
633 return p.text(start + '...' + end)
634 return p.text(start + '...' + end)
634 step = len(start)
635 step = len(start)
635 p.begin_group(step, start)
636 p.begin_group(step, start)
636 for idx, x in p._enumerate(obj):
637 for idx, x in p._enumerate(obj):
637 if idx:
638 if idx:
638 p.text(',')
639 p.text(',')
639 p.breakable()
640 p.breakable()
640 p.pretty(x)
641 p.pretty(x)
641 if len(obj) == 1 and isinstance(obj, tuple):
642 if len(obj) == 1 and isinstance(obj, tuple):
642 # Special case for 1-item tuples.
643 # Special case for 1-item tuples.
643 p.text(',')
644 p.text(',')
644 p.end_group(step, end)
645 p.end_group(step, end)
645 return inner
646 return inner
646
647
647
648
648 def _set_pprinter_factory(start, end):
649 def _set_pprinter_factory(start, end):
649 """
650 """
650 Factory that returns a pprint function useful for sets and frozensets.
651 Factory that returns a pprint function useful for sets and frozensets.
651 """
652 """
652 def inner(obj, p, cycle):
653 def inner(obj, p, cycle):
653 if cycle:
654 if cycle:
654 return p.text(start + '...' + end)
655 return p.text(start + '...' + end)
655 if len(obj) == 0:
656 if len(obj) == 0:
656 # Special case.
657 # Special case.
657 p.text(type(obj).__name__ + '()')
658 p.text(type(obj).__name__ + '()')
658 else:
659 else:
659 step = len(start)
660 step = len(start)
660 p.begin_group(step, start)
661 p.begin_group(step, start)
661 # Like dictionary keys, we will try to sort the items if there aren't too many
662 # Like dictionary keys, we will try to sort the items if there aren't too many
662 if not (p.max_seq_length and len(obj) >= p.max_seq_length):
663 if not (p.max_seq_length and len(obj) >= p.max_seq_length):
663 items = _sorted_for_pprint(obj)
664 items = _sorted_for_pprint(obj)
664 else:
665 else:
665 items = obj
666 items = obj
666 for idx, x in p._enumerate(items):
667 for idx, x in p._enumerate(items):
667 if idx:
668 if idx:
668 p.text(',')
669 p.text(',')
669 p.breakable()
670 p.breakable()
670 p.pretty(x)
671 p.pretty(x)
671 p.end_group(step, end)
672 p.end_group(step, end)
672 return inner
673 return inner
673
674
674
675
675 def _dict_pprinter_factory(start, end):
676 def _dict_pprinter_factory(start, end):
676 """
677 """
677 Factory that returns a pprint function used by the default pprint of
678 Factory that returns a pprint function used by the default pprint of
678 dicts and dict proxies.
679 dicts and dict proxies.
679 """
680 """
680 def inner(obj, p, cycle):
681 def inner(obj, p, cycle):
681 if cycle:
682 if cycle:
682 return p.text('{...}')
683 return p.text('{...}')
683 step = len(start)
684 step = len(start)
684 p.begin_group(step, start)
685 p.begin_group(step, start)
685 keys = obj.keys()
686 keys = obj.keys()
686 for idx, key in p._enumerate(keys):
687 for idx, key in p._enumerate(keys):
687 if idx:
688 if idx:
688 p.text(',')
689 p.text(',')
689 p.breakable()
690 p.breakable()
690 p.pretty(key)
691 p.pretty(key)
691 p.text(': ')
692 p.text(': ')
692 p.pretty(obj[key])
693 p.pretty(obj[key])
693 p.end_group(step, end)
694 p.end_group(step, end)
694 return inner
695 return inner
695
696
696
697
697 def _super_pprint(obj, p, cycle):
698 def _super_pprint(obj, p, cycle):
698 """The pprint for the super type."""
699 """The pprint for the super type."""
699 p.begin_group(8, '<super: ')
700 p.begin_group(8, '<super: ')
700 p.pretty(obj.__thisclass__)
701 p.pretty(obj.__thisclass__)
701 p.text(',')
702 p.text(',')
702 p.breakable()
703 p.breakable()
703 if PYPY: # In PyPy, super() objects don't have __self__ attributes
704 if PYPY: # In PyPy, super() objects don't have __self__ attributes
704 dself = obj.__repr__.__self__
705 dself = obj.__repr__.__self__
705 p.pretty(None if dself is obj else dself)
706 p.pretty(None if dself is obj else dself)
706 else:
707 else:
707 p.pretty(obj.__self__)
708 p.pretty(obj.__self__)
708 p.end_group(8, '>')
709 p.end_group(8, '>')
709
710
710
711
711
712
712 class _ReFlags:
713 class _ReFlags:
713 def __init__(self, value):
714 def __init__(self, value):
714 self.value = value
715 self.value = value
715
716
716 def _repr_pretty_(self, p, cycle):
717 def _repr_pretty_(self, p, cycle):
717 done_one = False
718 done_one = False
718 for flag in ('TEMPLATE', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL',
719 for flag in ('TEMPLATE', 'IGNORECASE', 'LOCALE', 'MULTILINE', 'DOTALL',
719 'UNICODE', 'VERBOSE', 'DEBUG'):
720 'UNICODE', 'VERBOSE', 'DEBUG'):
720 if self.value & getattr(re, flag):
721 if self.value & getattr(re, flag):
721 if done_one:
722 if done_one:
722 p.text('|')
723 p.text('|')
723 p.text('re.' + flag)
724 p.text('re.' + flag)
724 done_one = True
725 done_one = True
725
726
726
727
727 def _re_pattern_pprint(obj, p, cycle):
728 def _re_pattern_pprint(obj, p, cycle):
728 """The pprint function for regular expression patterns."""
729 """The pprint function for regular expression patterns."""
729 re_compile = CallExpression.factory('re.compile')
730 re_compile = CallExpression.factory('re.compile')
730 if obj.flags:
731 if obj.flags:
731 p.pretty(re_compile(RawStringLiteral(obj.pattern), _ReFlags(obj.flags)))
732 p.pretty(re_compile(RawStringLiteral(obj.pattern), _ReFlags(obj.flags)))
732 else:
733 else:
733 p.pretty(re_compile(RawStringLiteral(obj.pattern)))
734 p.pretty(re_compile(RawStringLiteral(obj.pattern)))
734
735
735
736
736 def _types_simplenamespace_pprint(obj, p, cycle):
737 def _types_simplenamespace_pprint(obj, p, cycle):
737 """The pprint function for types.SimpleNamespace."""
738 """The pprint function for types.SimpleNamespace."""
738 namespace = CallExpression.factory('namespace')
739 namespace = CallExpression.factory('namespace')
739 if cycle:
740 if cycle:
740 p.pretty(namespace(RawText("...")))
741 p.pretty(namespace(RawText("...")))
741 else:
742 else:
742 p.pretty(namespace(**obj.__dict__))
743 p.pretty(namespace(**obj.__dict__))
743
744
744
745
745 def _type_pprint(obj, p, cycle):
746 def _type_pprint(obj, p, cycle):
746 """The pprint for classes and types."""
747 """The pprint for classes and types."""
747 # Heap allocated types might not have the module attribute,
748 # Heap allocated types might not have the module attribute,
748 # and others may set it to None.
749 # and others may set it to None.
749
750
750 # Checks for a __repr__ override in the metaclass. Can't compare the
751 # Checks for a __repr__ override in the metaclass. Can't compare the
751 # type(obj).__repr__ directly because in PyPy the representation function
752 # type(obj).__repr__ directly because in PyPy the representation function
752 # inherited from type isn't the same type.__repr__
753 # inherited from type isn't the same type.__repr__
753 if [m for m in _get_mro(type(obj)) if "__repr__" in vars(m)][:1] != [type]:
754 if [m for m in _get_mro(type(obj)) if "__repr__" in vars(m)][:1] != [type]:
754 _repr_pprint(obj, p, cycle)
755 _repr_pprint(obj, p, cycle)
755 return
756 return
756
757
757 mod = _safe_getattr(obj, '__module__', None)
758 mod = _safe_getattr(obj, '__module__', None)
758 try:
759 try:
759 name = obj.__qualname__
760 name = obj.__qualname__
760 if not isinstance(name, str):
761 if not isinstance(name, str):
761 # This can happen if the type implements __qualname__ as a property
762 # This can happen if the type implements __qualname__ as a property
762 # or other descriptor in Python 2.
763 # or other descriptor in Python 2.
763 raise Exception("Try __name__")
764 raise Exception("Try __name__")
764 except Exception:
765 except Exception:
765 name = obj.__name__
766 name = obj.__name__
766 if not isinstance(name, str):
767 if not isinstance(name, str):
767 name = '<unknown type>'
768 name = '<unknown type>'
768
769
769 if mod in (None, '__builtin__', 'builtins', 'exceptions'):
770 if mod in (None, '__builtin__', 'builtins', 'exceptions'):
770 p.text(name)
771 p.text(name)
771 else:
772 else:
772 p.text(mod + '.' + name)
773 p.text(mod + '.' + name)
773
774
774
775
775 def _repr_pprint(obj, p, cycle):
776 def _repr_pprint(obj, p, cycle):
776 """A pprint that just redirects to the normal repr function."""
777 """A pprint that just redirects to the normal repr function."""
777 # Find newlines and replace them with p.break_()
778 # Find newlines and replace them with p.break_()
778 output = repr(obj)
779 output = repr(obj)
779 lines = output.splitlines()
780 lines = output.splitlines()
780 with p.group():
781 with p.group():
781 for idx, output_line in enumerate(lines):
782 for idx, output_line in enumerate(lines):
782 if idx:
783 if idx:
783 p.break_()
784 p.break_()
784 p.text(output_line)
785 p.text(output_line)
785
786
786
787
787 def _function_pprint(obj, p, cycle):
788 def _function_pprint(obj, p, cycle):
788 """Base pprint for all functions and builtin functions."""
789 """Base pprint for all functions and builtin functions."""
789 name = _safe_getattr(obj, '__qualname__', obj.__name__)
790 name = _safe_getattr(obj, '__qualname__', obj.__name__)
790 mod = obj.__module__
791 mod = obj.__module__
791 if mod and mod not in ('__builtin__', 'builtins', 'exceptions'):
792 if mod and mod not in ('__builtin__', 'builtins', 'exceptions'):
792 name = mod + '.' + name
793 name = mod + '.' + name
793 try:
794 try:
794 func_def = name + str(signature(obj))
795 func_def = name + str(signature(obj))
795 except ValueError:
796 except ValueError:
796 func_def = name
797 func_def = name
797 p.text('<function %s>' % func_def)
798 p.text('<function %s>' % func_def)
798
799
799
800
800 def _exception_pprint(obj, p, cycle):
801 def _exception_pprint(obj, p, cycle):
801 """Base pprint for all exceptions."""
802 """Base pprint for all exceptions."""
802 name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__)
803 name = getattr(obj.__class__, '__qualname__', obj.__class__.__name__)
803 if obj.__class__.__module__ not in ('exceptions', 'builtins'):
804 if obj.__class__.__module__ not in ('exceptions', 'builtins'):
804 name = '%s.%s' % (obj.__class__.__module__, name)
805 name = '%s.%s' % (obj.__class__.__module__, name)
805
806
806 p.pretty(CallExpression(name, *getattr(obj, 'args', ())))
807 p.pretty(CallExpression(name, *getattr(obj, 'args', ())))
807
808
808
809
809 #: the exception base
810 #: the exception base
811 _exception_base: type
810 try:
812 try:
811 _exception_base = BaseException
813 _exception_base = BaseException
812 except NameError:
814 except NameError:
813 _exception_base = Exception
815 _exception_base = Exception
814
816
815
817
816 #: printers for builtin types
818 #: printers for builtin types
817 _type_pprinters = {
819 _type_pprinters = {
818 int: _repr_pprint,
820 int: _repr_pprint,
819 float: _repr_pprint,
821 float: _repr_pprint,
820 str: _repr_pprint,
822 str: _repr_pprint,
821 tuple: _seq_pprinter_factory('(', ')'),
823 tuple: _seq_pprinter_factory('(', ')'),
822 list: _seq_pprinter_factory('[', ']'),
824 list: _seq_pprinter_factory('[', ']'),
823 dict: _dict_pprinter_factory('{', '}'),
825 dict: _dict_pprinter_factory('{', '}'),
824 set: _set_pprinter_factory('{', '}'),
826 set: _set_pprinter_factory('{', '}'),
825 frozenset: _set_pprinter_factory('frozenset({', '})'),
827 frozenset: _set_pprinter_factory('frozenset({', '})'),
826 super: _super_pprint,
828 super: _super_pprint,
827 _re_pattern_type: _re_pattern_pprint,
829 _re_pattern_type: _re_pattern_pprint,
828 type: _type_pprint,
830 type: _type_pprint,
829 types.FunctionType: _function_pprint,
831 types.FunctionType: _function_pprint,
830 types.BuiltinFunctionType: _function_pprint,
832 types.BuiltinFunctionType: _function_pprint,
831 types.MethodType: _repr_pprint,
833 types.MethodType: _repr_pprint,
832 types.SimpleNamespace: _types_simplenamespace_pprint,
834 types.SimpleNamespace: _types_simplenamespace_pprint,
833 datetime.datetime: _repr_pprint,
835 datetime.datetime: _repr_pprint,
834 datetime.timedelta: _repr_pprint,
836 datetime.timedelta: _repr_pprint,
835 _exception_base: _exception_pprint
837 _exception_base: _exception_pprint
836 }
838 }
837
839
838 # render os.environ like a dict
840 # render os.environ like a dict
839 _env_type = type(os.environ)
841 _env_type = type(os.environ)
840 # future-proof in case os.environ becomes a plain dict?
842 # future-proof in case os.environ becomes a plain dict?
841 if _env_type is not dict:
843 if _env_type is not dict:
842 _type_pprinters[_env_type] = _dict_pprinter_factory('environ{', '}')
844 _type_pprinters[_env_type] = _dict_pprinter_factory('environ{', '}')
843
845
844 _type_pprinters[types.MappingProxyType] = _dict_pprinter_factory("mappingproxy({", "})")
846 _type_pprinters[types.MappingProxyType] = _dict_pprinter_factory("mappingproxy({", "})")
845 _type_pprinters[slice] = _repr_pprint
847 _type_pprinters[slice] = _repr_pprint
846
848
847 _type_pprinters[range] = _repr_pprint
849 _type_pprinters[range] = _repr_pprint
848 _type_pprinters[bytes] = _repr_pprint
850 _type_pprinters[bytes] = _repr_pprint
849
851
850 #: printers for types specified by name
852 #: printers for types specified by name
851 _deferred_type_pprinters = {
853 _deferred_type_pprinters: Dict = {}
852 }
854
853
855
854 def for_type(typ, func):
856 def for_type(typ, func):
855 """
857 """
856 Add a pretty printer for a given type.
858 Add a pretty printer for a given type.
857 """
859 """
858 oldfunc = _type_pprinters.get(typ, None)
860 oldfunc = _type_pprinters.get(typ, None)
859 if func is not None:
861 if func is not None:
860 # To support easy restoration of old pprinters, we need to ignore Nones.
862 # To support easy restoration of old pprinters, we need to ignore Nones.
861 _type_pprinters[typ] = func
863 _type_pprinters[typ] = func
862 return oldfunc
864 return oldfunc
863
865
864 def for_type_by_name(type_module, type_name, func):
866 def for_type_by_name(type_module, type_name, func):
865 """
867 """
866 Add a pretty printer for a type specified by the module and name of a type
868 Add a pretty printer for a type specified by the module and name of a type
867 rather than the type object itself.
869 rather than the type object itself.
868 """
870 """
869 key = (type_module, type_name)
871 key = (type_module, type_name)
870 oldfunc = _deferred_type_pprinters.get(key, None)
872 oldfunc = _deferred_type_pprinters.get(key, None)
871 if func is not None:
873 if func is not None:
872 # To support easy restoration of old pprinters, we need to ignore Nones.
874 # To support easy restoration of old pprinters, we need to ignore Nones.
873 _deferred_type_pprinters[key] = func
875 _deferred_type_pprinters[key] = func
874 return oldfunc
876 return oldfunc
875
877
876
878
877 #: printers for the default singletons
879 #: printers for the default singletons
878 _singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis,
880 _singleton_pprinters = dict.fromkeys(map(id, [None, True, False, Ellipsis,
879 NotImplemented]), _repr_pprint)
881 NotImplemented]), _repr_pprint)
880
882
881
883
882 def _defaultdict_pprint(obj, p, cycle):
884 def _defaultdict_pprint(obj, p, cycle):
883 cls_ctor = CallExpression.factory(obj.__class__.__name__)
885 cls_ctor = CallExpression.factory(obj.__class__.__name__)
884 if cycle:
886 if cycle:
885 p.pretty(cls_ctor(RawText("...")))
887 p.pretty(cls_ctor(RawText("...")))
886 else:
888 else:
887 p.pretty(cls_ctor(obj.default_factory, dict(obj)))
889 p.pretty(cls_ctor(obj.default_factory, dict(obj)))
888
890
889 def _ordereddict_pprint(obj, p, cycle):
891 def _ordereddict_pprint(obj, p, cycle):
890 cls_ctor = CallExpression.factory(obj.__class__.__name__)
892 cls_ctor = CallExpression.factory(obj.__class__.__name__)
891 if cycle:
893 if cycle:
892 p.pretty(cls_ctor(RawText("...")))
894 p.pretty(cls_ctor(RawText("...")))
893 elif len(obj):
895 elif len(obj):
894 p.pretty(cls_ctor(list(obj.items())))
896 p.pretty(cls_ctor(list(obj.items())))
895 else:
897 else:
896 p.pretty(cls_ctor())
898 p.pretty(cls_ctor())
897
899
898 def _deque_pprint(obj, p, cycle):
900 def _deque_pprint(obj, p, cycle):
899 cls_ctor = CallExpression.factory(obj.__class__.__name__)
901 cls_ctor = CallExpression.factory(obj.__class__.__name__)
900 if cycle:
902 if cycle:
901 p.pretty(cls_ctor(RawText("...")))
903 p.pretty(cls_ctor(RawText("...")))
902 elif obj.maxlen is not None:
904 elif obj.maxlen is not None:
903 p.pretty(cls_ctor(list(obj), maxlen=obj.maxlen))
905 p.pretty(cls_ctor(list(obj), maxlen=obj.maxlen))
904 else:
906 else:
905 p.pretty(cls_ctor(list(obj)))
907 p.pretty(cls_ctor(list(obj)))
906
908
907 def _counter_pprint(obj, p, cycle):
909 def _counter_pprint(obj, p, cycle):
908 cls_ctor = CallExpression.factory(obj.__class__.__name__)
910 cls_ctor = CallExpression.factory(obj.__class__.__name__)
909 if cycle:
911 if cycle:
910 p.pretty(cls_ctor(RawText("...")))
912 p.pretty(cls_ctor(RawText("...")))
911 elif len(obj):
913 elif len(obj):
912 p.pretty(cls_ctor(dict(obj.most_common())))
914 p.pretty(cls_ctor(dict(obj.most_common())))
913 else:
915 else:
914 p.pretty(cls_ctor())
916 p.pretty(cls_ctor())
915
917
916
918
917 def _userlist_pprint(obj, p, cycle):
919 def _userlist_pprint(obj, p, cycle):
918 cls_ctor = CallExpression.factory(obj.__class__.__name__)
920 cls_ctor = CallExpression.factory(obj.__class__.__name__)
919 if cycle:
921 if cycle:
920 p.pretty(cls_ctor(RawText("...")))
922 p.pretty(cls_ctor(RawText("...")))
921 else:
923 else:
922 p.pretty(cls_ctor(obj.data))
924 p.pretty(cls_ctor(obj.data))
923
925
924
926
925 for_type_by_name('collections', 'defaultdict', _defaultdict_pprint)
927 for_type_by_name('collections', 'defaultdict', _defaultdict_pprint)
926 for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint)
928 for_type_by_name('collections', 'OrderedDict', _ordereddict_pprint)
927 for_type_by_name('collections', 'deque', _deque_pprint)
929 for_type_by_name('collections', 'deque', _deque_pprint)
928 for_type_by_name('collections', 'Counter', _counter_pprint)
930 for_type_by_name('collections', 'Counter', _counter_pprint)
929 for_type_by_name("collections", "UserList", _userlist_pprint)
931 for_type_by_name("collections", "UserList", _userlist_pprint)
930
932
931 if __name__ == '__main__':
933 if __name__ == '__main__':
932 from random import randrange
934 from random import randrange
933 class Foo(object):
935 class Foo(object):
934 def __init__(self):
936 def __init__(self):
935 self.foo = 1
937 self.foo = 1
936 self.bar = re.compile(r'\s+')
938 self.bar = re.compile(r'\s+')
937 self.blub = dict.fromkeys(range(30), randrange(1, 40))
939 self.blub = dict.fromkeys(range(30), randrange(1, 40))
938 self.hehe = 23424.234234
940 self.hehe = 23424.234234
939 self.list = ["blub", "blah", self]
941 self.list = ["blub", "blah", self]
940
942
941 def get_foo(self):
943 def get_foo(self):
942 print("foo")
944 print("foo")
943
945
944 pprint(Foo(), verbose=True)
946 pprint(Foo(), verbose=True)
@@ -1,87 +1,78 b''
1 [build-system]
1 [build-system]
2 requires = ["setuptools >= 51.0.0"]
2 requires = ["setuptools >= 51.0.0"]
3 # We need access to the 'setupbase' module at build time.
3 # We need access to the 'setupbase' module at build time.
4 # Hence we declare a custom build backend.
4 # Hence we declare a custom build backend.
5 build-backend = "_build_meta" # just re-exports setuptools.build_meta definitions
5 build-backend = "_build_meta" # just re-exports setuptools.build_meta definitions
6 backend-path = ["."]
6 backend-path = ["."]
7
7
8 [tool.mypy]
8 [tool.mypy]
9 python_version = "3.10"
9 python_version = "3.10"
10 ignore_missing_imports = true
10 ignore_missing_imports = true
11 follow_imports = 'silent'
11 follow_imports = 'silent'
12 exclude = [
12 exclude = [
13 'test_\.+\.py',
13 'test_\.+\.py',
14 'IPython.utils.tests.test_wildcard',
14 'IPython.utils.tests.test_wildcard',
15 'testing',
15 'testing',
16 'tests',
16 'tests',
17 'PyColorize.py',
17 'PyColorize.py',
18 '_process_win32_controller.py',
18 '_process_win32_controller.py',
19 'IPython/core/application.py',
19 'IPython/core/application.py',
20 'IPython/core/completerlib.py',
21 'IPython/core/displaypub.py',
22 'IPython/core/historyapp.py',
23 #'IPython/core/interactiveshell.py',
24 'IPython/core/magic.py',
25 'IPython/core/profileapp.py',
20 'IPython/core/profileapp.py',
26 # 'IPython/core/ultratb.py',
27 'IPython/lib/deepreload.py',
21 'IPython/lib/deepreload.py',
28 'IPython/lib/pretty.py',
29 'IPython/sphinxext/ipython_directive.py',
22 'IPython/sphinxext/ipython_directive.py',
30 'IPython/terminal/ipapp.py',
23 'IPython/terminal/ipapp.py',
31 'IPython/utils/_process_win32.py',
24 'IPython/utils/_process_win32.py',
32 'IPython/utils/path.py',
25 'IPython/utils/path.py',
33 'IPython/utils/timing.py',
34 'IPython/utils/text.py'
35 ]
26 ]
36
27
37 [tool.pytest.ini_options]
28 [tool.pytest.ini_options]
38 addopts = [
29 addopts = [
39 "--durations=10",
30 "--durations=10",
40 "-pIPython.testing.plugin.pytest_ipdoctest",
31 "-pIPython.testing.plugin.pytest_ipdoctest",
41 "--ipdoctest-modules",
32 "--ipdoctest-modules",
42 "--ignore=docs",
33 "--ignore=docs",
43 "--ignore=examples",
34 "--ignore=examples",
44 "--ignore=htmlcov",
35 "--ignore=htmlcov",
45 "--ignore=ipython_kernel",
36 "--ignore=ipython_kernel",
46 "--ignore=ipython_parallel",
37 "--ignore=ipython_parallel",
47 "--ignore=results",
38 "--ignore=results",
48 "--ignore=tmp",
39 "--ignore=tmp",
49 "--ignore=tools",
40 "--ignore=tools",
50 "--ignore=traitlets",
41 "--ignore=traitlets",
51 "--ignore=IPython/core/tests/daft_extension",
42 "--ignore=IPython/core/tests/daft_extension",
52 "--ignore=IPython/sphinxext",
43 "--ignore=IPython/sphinxext",
53 "--ignore=IPython/terminal/pt_inputhooks",
44 "--ignore=IPython/terminal/pt_inputhooks",
54 "--ignore=IPython/__main__.py",
45 "--ignore=IPython/__main__.py",
55 "--ignore=IPython/external/qt_for_kernel.py",
46 "--ignore=IPython/external/qt_for_kernel.py",
56 "--ignore=IPython/html/widgets/widget_link.py",
47 "--ignore=IPython/html/widgets/widget_link.py",
57 "--ignore=IPython/html/widgets/widget_output.py",
48 "--ignore=IPython/html/widgets/widget_output.py",
58 "--ignore=IPython/terminal/console.py",
49 "--ignore=IPython/terminal/console.py",
59 "--ignore=IPython/utils/_process_cli.py",
50 "--ignore=IPython/utils/_process_cli.py",
60 "--ignore=IPython/utils/_process_posix.py",
51 "--ignore=IPython/utils/_process_posix.py",
61 "--ignore=IPython/utils/_process_win32.py",
52 "--ignore=IPython/utils/_process_win32.py",
62 "--ignore=IPython/utils/_process_win32_controller.py",
53 "--ignore=IPython/utils/_process_win32_controller.py",
63 "--ignore=IPython/utils/daemonize.py",
54 "--ignore=IPython/utils/daemonize.py",
64 "--ignore=IPython/utils/eventful.py",
55 "--ignore=IPython/utils/eventful.py",
65 "--ignore=IPython/kernel",
56 "--ignore=IPython/kernel",
66 "--ignore=IPython/consoleapp.py",
57 "--ignore=IPython/consoleapp.py",
67 "--ignore=IPython/core/inputsplitter.py",
58 "--ignore=IPython/core/inputsplitter.py",
68 "--ignore=IPython/lib/kernel.py",
59 "--ignore=IPython/lib/kernel.py",
69 "--ignore=IPython/utils/jsonutil.py",
60 "--ignore=IPython/utils/jsonutil.py",
70 "--ignore=IPython/utils/localinterfaces.py",
61 "--ignore=IPython/utils/localinterfaces.py",
71 "--ignore=IPython/utils/log.py",
62 "--ignore=IPython/utils/log.py",
72 "--ignore=IPython/utils/signatures.py",
63 "--ignore=IPython/utils/signatures.py",
73 "--ignore=IPython/utils/traitlets.py",
64 "--ignore=IPython/utils/traitlets.py",
74 "--ignore=IPython/utils/version.py"
65 "--ignore=IPython/utils/version.py"
75 ]
66 ]
76 doctest_optionflags = [
67 doctest_optionflags = [
77 "NORMALIZE_WHITESPACE",
68 "NORMALIZE_WHITESPACE",
78 "ELLIPSIS"
69 "ELLIPSIS"
79 ]
70 ]
80 ipdoctest_optionflags = [
71 ipdoctest_optionflags = [
81 "NORMALIZE_WHITESPACE",
72 "NORMALIZE_WHITESPACE",
82 "ELLIPSIS"
73 "ELLIPSIS"
83 ]
74 ]
84 asyncio_mode = "strict"
75 asyncio_mode = "strict"
85
76
86 [tool.pyright]
77 [tool.pyright]
87 pythonPlatform="All"
78 pythonPlatform="All"
General Comments 0
You need to be logged in to leave comments. Login now