##// END OF EJS Templates
Merge pull request #6662 from minrk/dependencies...
Thomas Kluyver -
r20848:e94a8ddf merge
parent child Browse files
Show More

The requested changes are too big and content was truncated. Show full diff

@@ -1,621 +1,621 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """A base class for a configurable application."""
2 """A base class for a configurable application."""
3
3
4 # Copyright (c) IPython Development Team.
4 # Copyright (c) IPython Development Team.
5 # Distributed under the terms of the Modified BSD License.
5 # Distributed under the terms of the Modified BSD License.
6
6
7 from __future__ import print_function
7 from __future__ import print_function
8
8
9 import json
9 import json
10 import logging
10 import logging
11 import os
11 import os
12 import re
12 import re
13 import sys
13 import sys
14 from copy import deepcopy
14 from copy import deepcopy
15 from collections import defaultdict
15 from collections import defaultdict
16
16
17 from IPython.external.decorator import decorator
17 from decorator import decorator
18
18
19 from IPython.config.configurable import SingletonConfigurable
19 from IPython.config.configurable import SingletonConfigurable
20 from IPython.config.loader import (
20 from IPython.config.loader import (
21 KVArgParseConfigLoader, PyFileConfigLoader, Config, ArgumentError, ConfigFileNotFound, JSONFileConfigLoader
21 KVArgParseConfigLoader, PyFileConfigLoader, Config, ArgumentError, ConfigFileNotFound, JSONFileConfigLoader
22 )
22 )
23
23
24 from IPython.utils.traitlets import (
24 from IPython.utils.traitlets import (
25 Unicode, List, Enum, Dict, Instance, TraitError
25 Unicode, List, Enum, Dict, Instance, TraitError
26 )
26 )
27 from IPython.utils.importstring import import_item
27 from IPython.utils.importstring import import_item
28 from IPython.utils.text import indent, wrap_paragraphs, dedent
28 from IPython.utils.text import indent, wrap_paragraphs, dedent
29 from IPython.utils import py3compat
29 from IPython.utils import py3compat
30 from IPython.utils.py3compat import string_types, iteritems
30 from IPython.utils.py3compat import string_types, iteritems
31
31
32 #-----------------------------------------------------------------------------
32 #-----------------------------------------------------------------------------
33 # Descriptions for the various sections
33 # Descriptions for the various sections
34 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
35
35
36 # merge flags&aliases into options
36 # merge flags&aliases into options
37 option_description = """
37 option_description = """
38 Arguments that take values are actually convenience aliases to full
38 Arguments that take values are actually convenience aliases to full
39 Configurables, whose aliases are listed on the help line. For more information
39 Configurables, whose aliases are listed on the help line. For more information
40 on full configurables, see '--help-all'.
40 on full configurables, see '--help-all'.
41 """.strip() # trim newlines of front and back
41 """.strip() # trim newlines of front and back
42
42
43 keyvalue_description = """
43 keyvalue_description = """
44 Parameters are set from command-line arguments of the form:
44 Parameters are set from command-line arguments of the form:
45 `--Class.trait=value`.
45 `--Class.trait=value`.
46 This line is evaluated in Python, so simple expressions are allowed, e.g.::
46 This line is evaluated in Python, so simple expressions are allowed, e.g.::
47 `--C.a='range(3)'` For setting C.a=[0,1,2].
47 `--C.a='range(3)'` For setting C.a=[0,1,2].
48 """.strip() # trim newlines of front and back
48 """.strip() # trim newlines of front and back
49
49
50 # sys.argv can be missing, for example when python is embedded. See the docs
50 # sys.argv can be missing, for example when python is embedded. See the docs
51 # for details: http://docs.python.org/2/c-api/intro.html#embedding-python
51 # for details: http://docs.python.org/2/c-api/intro.html#embedding-python
52 if not hasattr(sys, "argv"):
52 if not hasattr(sys, "argv"):
53 sys.argv = [""]
53 sys.argv = [""]
54
54
55 subcommand_description = """
55 subcommand_description = """
56 Subcommands are launched as `{app} cmd [args]`. For information on using
56 Subcommands are launched as `{app} cmd [args]`. For information on using
57 subcommand 'cmd', do: `{app} cmd -h`.
57 subcommand 'cmd', do: `{app} cmd -h`.
58 """
58 """
59 # get running program name
59 # get running program name
60
60
61 #-----------------------------------------------------------------------------
61 #-----------------------------------------------------------------------------
62 # Application class
62 # Application class
63 #-----------------------------------------------------------------------------
63 #-----------------------------------------------------------------------------
64
64
65 @decorator
65 @decorator
66 def catch_config_error(method, app, *args, **kwargs):
66 def catch_config_error(method, app, *args, **kwargs):
67 """Method decorator for catching invalid config (Trait/ArgumentErrors) during init.
67 """Method decorator for catching invalid config (Trait/ArgumentErrors) during init.
68
68
69 On a TraitError (generally caused by bad config), this will print the trait's
69 On a TraitError (generally caused by bad config), this will print the trait's
70 message, and exit the app.
70 message, and exit the app.
71
71
72 For use on init methods, to prevent invoking excepthook on invalid input.
72 For use on init methods, to prevent invoking excepthook on invalid input.
73 """
73 """
74 try:
74 try:
75 return method(app, *args, **kwargs)
75 return method(app, *args, **kwargs)
76 except (TraitError, ArgumentError) as e:
76 except (TraitError, ArgumentError) as e:
77 app.print_help()
77 app.print_help()
78 app.log.fatal("Bad config encountered during initialization:")
78 app.log.fatal("Bad config encountered during initialization:")
79 app.log.fatal(str(e))
79 app.log.fatal(str(e))
80 app.log.debug("Config at the time: %s", app.config)
80 app.log.debug("Config at the time: %s", app.config)
81 app.exit(1)
81 app.exit(1)
82
82
83
83
84 class ApplicationError(Exception):
84 class ApplicationError(Exception):
85 pass
85 pass
86
86
87 class LevelFormatter(logging.Formatter):
87 class LevelFormatter(logging.Formatter):
88 """Formatter with additional `highlevel` record
88 """Formatter with additional `highlevel` record
89
89
90 This field is empty if log level is less than highlevel_limit,
90 This field is empty if log level is less than highlevel_limit,
91 otherwise it is formatted with self.highlevel_format.
91 otherwise it is formatted with self.highlevel_format.
92
92
93 Useful for adding 'WARNING' to warning messages,
93 Useful for adding 'WARNING' to warning messages,
94 without adding 'INFO' to info, etc.
94 without adding 'INFO' to info, etc.
95 """
95 """
96 highlevel_limit = logging.WARN
96 highlevel_limit = logging.WARN
97 highlevel_format = " %(levelname)s |"
97 highlevel_format = " %(levelname)s |"
98
98
99 def format(self, record):
99 def format(self, record):
100 if record.levelno >= self.highlevel_limit:
100 if record.levelno >= self.highlevel_limit:
101 record.highlevel = self.highlevel_format % record.__dict__
101 record.highlevel = self.highlevel_format % record.__dict__
102 else:
102 else:
103 record.highlevel = ""
103 record.highlevel = ""
104 return super(LevelFormatter, self).format(record)
104 return super(LevelFormatter, self).format(record)
105
105
106
106
107 class Application(SingletonConfigurable):
107 class Application(SingletonConfigurable):
108 """A singleton application with full configuration support."""
108 """A singleton application with full configuration support."""
109
109
110 # The name of the application, will usually match the name of the command
110 # The name of the application, will usually match the name of the command
111 # line application
111 # line application
112 name = Unicode(u'application')
112 name = Unicode(u'application')
113
113
114 # The description of the application that is printed at the beginning
114 # The description of the application that is printed at the beginning
115 # of the help.
115 # of the help.
116 description = Unicode(u'This is an application.')
116 description = Unicode(u'This is an application.')
117 # default section descriptions
117 # default section descriptions
118 option_description = Unicode(option_description)
118 option_description = Unicode(option_description)
119 keyvalue_description = Unicode(keyvalue_description)
119 keyvalue_description = Unicode(keyvalue_description)
120 subcommand_description = Unicode(subcommand_description)
120 subcommand_description = Unicode(subcommand_description)
121
121
122 # The usage and example string that goes at the end of the help string.
122 # The usage and example string that goes at the end of the help string.
123 examples = Unicode()
123 examples = Unicode()
124
124
125 # A sequence of Configurable subclasses whose config=True attributes will
125 # A sequence of Configurable subclasses whose config=True attributes will
126 # be exposed at the command line.
126 # be exposed at the command line.
127 classes = []
127 classes = []
128 @property
128 @property
129 def _help_classes(self):
129 def _help_classes(self):
130 """Define `App.help_classes` if CLI classes should differ from config file classes"""
130 """Define `App.help_classes` if CLI classes should differ from config file classes"""
131 return getattr(self, 'help_classes', self.classes)
131 return getattr(self, 'help_classes', self.classes)
132
132
133 @property
133 @property
134 def _config_classes(self):
134 def _config_classes(self):
135 """Define `App.config_classes` if config file classes should differ from CLI classes."""
135 """Define `App.config_classes` if config file classes should differ from CLI classes."""
136 return getattr(self, 'config_classes', self.classes)
136 return getattr(self, 'config_classes', self.classes)
137
137
138 # The version string of this application.
138 # The version string of this application.
139 version = Unicode(u'0.0')
139 version = Unicode(u'0.0')
140
140
141 # the argv used to initialize the application
141 # the argv used to initialize the application
142 argv = List()
142 argv = List()
143
143
144 # The log level for the application
144 # The log level for the application
145 log_level = Enum((0,10,20,30,40,50,'DEBUG','INFO','WARN','ERROR','CRITICAL'),
145 log_level = Enum((0,10,20,30,40,50,'DEBUG','INFO','WARN','ERROR','CRITICAL'),
146 default_value=logging.WARN,
146 default_value=logging.WARN,
147 config=True,
147 config=True,
148 help="Set the log level by value or name.")
148 help="Set the log level by value or name.")
149 def _log_level_changed(self, name, old, new):
149 def _log_level_changed(self, name, old, new):
150 """Adjust the log level when log_level is set."""
150 """Adjust the log level when log_level is set."""
151 if isinstance(new, string_types):
151 if isinstance(new, string_types):
152 new = getattr(logging, new)
152 new = getattr(logging, new)
153 self.log_level = new
153 self.log_level = new
154 self.log.setLevel(new)
154 self.log.setLevel(new)
155
155
156 _log_formatter_cls = LevelFormatter
156 _log_formatter_cls = LevelFormatter
157
157
158 log_datefmt = Unicode("%Y-%m-%d %H:%M:%S", config=True,
158 log_datefmt = Unicode("%Y-%m-%d %H:%M:%S", config=True,
159 help="The date format used by logging formatters for %(asctime)s"
159 help="The date format used by logging formatters for %(asctime)s"
160 )
160 )
161 def _log_datefmt_changed(self, name, old, new):
161 def _log_datefmt_changed(self, name, old, new):
162 self._log_format_changed('log_format', self.log_format, self.log_format)
162 self._log_format_changed('log_format', self.log_format, self.log_format)
163
163
164 log_format = Unicode("[%(name)s]%(highlevel)s %(message)s", config=True,
164 log_format = Unicode("[%(name)s]%(highlevel)s %(message)s", config=True,
165 help="The Logging format template",
165 help="The Logging format template",
166 )
166 )
167 def _log_format_changed(self, name, old, new):
167 def _log_format_changed(self, name, old, new):
168 """Change the log formatter when log_format is set."""
168 """Change the log formatter when log_format is set."""
169 _log_handler = self.log.handlers[0]
169 _log_handler = self.log.handlers[0]
170 _log_formatter = self._log_formatter_cls(fmt=new, datefmt=self.log_datefmt)
170 _log_formatter = self._log_formatter_cls(fmt=new, datefmt=self.log_datefmt)
171 _log_handler.setFormatter(_log_formatter)
171 _log_handler.setFormatter(_log_formatter)
172
172
173
173
174 log = Instance(logging.Logger)
174 log = Instance(logging.Logger)
175 def _log_default(self):
175 def _log_default(self):
176 """Start logging for this application.
176 """Start logging for this application.
177
177
178 The default is to log to stderr using a StreamHandler, if no default
178 The default is to log to stderr using a StreamHandler, if no default
179 handler already exists. The log level starts at logging.WARN, but this
179 handler already exists. The log level starts at logging.WARN, but this
180 can be adjusted by setting the ``log_level`` attribute.
180 can be adjusted by setting the ``log_level`` attribute.
181 """
181 """
182 log = logging.getLogger(self.__class__.__name__)
182 log = logging.getLogger(self.__class__.__name__)
183 log.setLevel(self.log_level)
183 log.setLevel(self.log_level)
184 log.propagate = False
184 log.propagate = False
185 _log = log # copied from Logger.hasHandlers() (new in Python 3.2)
185 _log = log # copied from Logger.hasHandlers() (new in Python 3.2)
186 while _log:
186 while _log:
187 if _log.handlers:
187 if _log.handlers:
188 return log
188 return log
189 if not _log.propagate:
189 if not _log.propagate:
190 break
190 break
191 else:
191 else:
192 _log = _log.parent
192 _log = _log.parent
193 if sys.executable.endswith('pythonw.exe'):
193 if sys.executable.endswith('pythonw.exe'):
194 # this should really go to a file, but file-logging is only
194 # this should really go to a file, but file-logging is only
195 # hooked up in parallel applications
195 # hooked up in parallel applications
196 _log_handler = logging.StreamHandler(open(os.devnull, 'w'))
196 _log_handler = logging.StreamHandler(open(os.devnull, 'w'))
197 else:
197 else:
198 _log_handler = logging.StreamHandler()
198 _log_handler = logging.StreamHandler()
199 _log_formatter = self._log_formatter_cls(fmt=self.log_format, datefmt=self.log_datefmt)
199 _log_formatter = self._log_formatter_cls(fmt=self.log_format, datefmt=self.log_datefmt)
200 _log_handler.setFormatter(_log_formatter)
200 _log_handler.setFormatter(_log_formatter)
201 log.addHandler(_log_handler)
201 log.addHandler(_log_handler)
202 return log
202 return log
203
203
204 # the alias map for configurables
204 # the alias map for configurables
205 aliases = Dict({'log-level' : 'Application.log_level'})
205 aliases = Dict({'log-level' : 'Application.log_level'})
206
206
207 # flags for loading Configurables or store_const style flags
207 # flags for loading Configurables or store_const style flags
208 # flags are loaded from this dict by '--key' flags
208 # flags are loaded from this dict by '--key' flags
209 # this must be a dict of two-tuples, the first element being the Config/dict
209 # this must be a dict of two-tuples, the first element being the Config/dict
210 # and the second being the help string for the flag
210 # and the second being the help string for the flag
211 flags = Dict()
211 flags = Dict()
212 def _flags_changed(self, name, old, new):
212 def _flags_changed(self, name, old, new):
213 """ensure flags dict is valid"""
213 """ensure flags dict is valid"""
214 for key,value in iteritems(new):
214 for key,value in iteritems(new):
215 assert len(value) == 2, "Bad flag: %r:%s"%(key,value)
215 assert len(value) == 2, "Bad flag: %r:%s"%(key,value)
216 assert isinstance(value[0], (dict, Config)), "Bad flag: %r:%s"%(key,value)
216 assert isinstance(value[0], (dict, Config)), "Bad flag: %r:%s"%(key,value)
217 assert isinstance(value[1], string_types), "Bad flag: %r:%s"%(key,value)
217 assert isinstance(value[1], string_types), "Bad flag: %r:%s"%(key,value)
218
218
219
219
220 # subcommands for launching other applications
220 # subcommands for launching other applications
221 # if this is not empty, this will be a parent Application
221 # if this is not empty, this will be a parent Application
222 # this must be a dict of two-tuples,
222 # this must be a dict of two-tuples,
223 # the first element being the application class/import string
223 # the first element being the application class/import string
224 # and the second being the help string for the subcommand
224 # and the second being the help string for the subcommand
225 subcommands = Dict()
225 subcommands = Dict()
226 # parse_command_line will initialize a subapp, if requested
226 # parse_command_line will initialize a subapp, if requested
227 subapp = Instance('IPython.config.application.Application', allow_none=True)
227 subapp = Instance('IPython.config.application.Application', allow_none=True)
228
228
229 # extra command-line arguments that don't set config values
229 # extra command-line arguments that don't set config values
230 extra_args = List(Unicode)
230 extra_args = List(Unicode)
231
231
232
232
233 def __init__(self, **kwargs):
233 def __init__(self, **kwargs):
234 SingletonConfigurable.__init__(self, **kwargs)
234 SingletonConfigurable.__init__(self, **kwargs)
235 # Ensure my class is in self.classes, so my attributes appear in command line
235 # Ensure my class is in self.classes, so my attributes appear in command line
236 # options and config files.
236 # options and config files.
237 if self.__class__ not in self.classes:
237 if self.__class__ not in self.classes:
238 self.classes.insert(0, self.__class__)
238 self.classes.insert(0, self.__class__)
239
239
240 def _config_changed(self, name, old, new):
240 def _config_changed(self, name, old, new):
241 SingletonConfigurable._config_changed(self, name, old, new)
241 SingletonConfigurable._config_changed(self, name, old, new)
242 self.log.debug('Config changed:')
242 self.log.debug('Config changed:')
243 self.log.debug(repr(new))
243 self.log.debug(repr(new))
244
244
245 @catch_config_error
245 @catch_config_error
246 def initialize(self, argv=None):
246 def initialize(self, argv=None):
247 """Do the basic steps to configure me.
247 """Do the basic steps to configure me.
248
248
249 Override in subclasses.
249 Override in subclasses.
250 """
250 """
251 self.parse_command_line(argv)
251 self.parse_command_line(argv)
252
252
253
253
254 def start(self):
254 def start(self):
255 """Start the app mainloop.
255 """Start the app mainloop.
256
256
257 Override in subclasses.
257 Override in subclasses.
258 """
258 """
259 if self.subapp is not None:
259 if self.subapp is not None:
260 return self.subapp.start()
260 return self.subapp.start()
261
261
262 def print_alias_help(self):
262 def print_alias_help(self):
263 """Print the alias part of the help."""
263 """Print the alias part of the help."""
264 if not self.aliases:
264 if not self.aliases:
265 return
265 return
266
266
267 lines = []
267 lines = []
268 classdict = {}
268 classdict = {}
269 for cls in self._help_classes:
269 for cls in self._help_classes:
270 # include all parents (up to, but excluding Configurable) in available names
270 # include all parents (up to, but excluding Configurable) in available names
271 for c in cls.mro()[:-3]:
271 for c in cls.mro()[:-3]:
272 classdict[c.__name__] = c
272 classdict[c.__name__] = c
273
273
274 for alias, longname in iteritems(self.aliases):
274 for alias, longname in iteritems(self.aliases):
275 classname, traitname = longname.split('.',1)
275 classname, traitname = longname.split('.',1)
276 cls = classdict[classname]
276 cls = classdict[classname]
277
277
278 trait = cls.class_traits(config=True)[traitname]
278 trait = cls.class_traits(config=True)[traitname]
279 help = cls.class_get_trait_help(trait).splitlines()
279 help = cls.class_get_trait_help(trait).splitlines()
280 # reformat first line
280 # reformat first line
281 help[0] = help[0].replace(longname, alias) + ' (%s)'%longname
281 help[0] = help[0].replace(longname, alias) + ' (%s)'%longname
282 if len(alias) == 1:
282 if len(alias) == 1:
283 help[0] = help[0].replace('--%s='%alias, '-%s '%alias)
283 help[0] = help[0].replace('--%s='%alias, '-%s '%alias)
284 lines.extend(help)
284 lines.extend(help)
285 # lines.append('')
285 # lines.append('')
286 print(os.linesep.join(lines))
286 print(os.linesep.join(lines))
287
287
288 def print_flag_help(self):
288 def print_flag_help(self):
289 """Print the flag part of the help."""
289 """Print the flag part of the help."""
290 if not self.flags:
290 if not self.flags:
291 return
291 return
292
292
293 lines = []
293 lines = []
294 for m, (cfg,help) in iteritems(self.flags):
294 for m, (cfg,help) in iteritems(self.flags):
295 prefix = '--' if len(m) > 1 else '-'
295 prefix = '--' if len(m) > 1 else '-'
296 lines.append(prefix+m)
296 lines.append(prefix+m)
297 lines.append(indent(dedent(help.strip())))
297 lines.append(indent(dedent(help.strip())))
298 # lines.append('')
298 # lines.append('')
299 print(os.linesep.join(lines))
299 print(os.linesep.join(lines))
300
300
301 def print_options(self):
301 def print_options(self):
302 if not self.flags and not self.aliases:
302 if not self.flags and not self.aliases:
303 return
303 return
304 lines = ['Options']
304 lines = ['Options']
305 lines.append('-'*len(lines[0]))
305 lines.append('-'*len(lines[0]))
306 lines.append('')
306 lines.append('')
307 for p in wrap_paragraphs(self.option_description):
307 for p in wrap_paragraphs(self.option_description):
308 lines.append(p)
308 lines.append(p)
309 lines.append('')
309 lines.append('')
310 print(os.linesep.join(lines))
310 print(os.linesep.join(lines))
311 self.print_flag_help()
311 self.print_flag_help()
312 self.print_alias_help()
312 self.print_alias_help()
313 print()
313 print()
314
314
315 def print_subcommands(self):
315 def print_subcommands(self):
316 """Print the subcommand part of the help."""
316 """Print the subcommand part of the help."""
317 if not self.subcommands:
317 if not self.subcommands:
318 return
318 return
319
319
320 lines = ["Subcommands"]
320 lines = ["Subcommands"]
321 lines.append('-'*len(lines[0]))
321 lines.append('-'*len(lines[0]))
322 lines.append('')
322 lines.append('')
323 for p in wrap_paragraphs(self.subcommand_description.format(
323 for p in wrap_paragraphs(self.subcommand_description.format(
324 app=self.name)):
324 app=self.name)):
325 lines.append(p)
325 lines.append(p)
326 lines.append('')
326 lines.append('')
327 for subc, (cls, help) in iteritems(self.subcommands):
327 for subc, (cls, help) in iteritems(self.subcommands):
328 lines.append(subc)
328 lines.append(subc)
329 if help:
329 if help:
330 lines.append(indent(dedent(help.strip())))
330 lines.append(indent(dedent(help.strip())))
331 lines.append('')
331 lines.append('')
332 print(os.linesep.join(lines))
332 print(os.linesep.join(lines))
333
333
334 def print_help(self, classes=False):
334 def print_help(self, classes=False):
335 """Print the help for each Configurable class in self.classes.
335 """Print the help for each Configurable class in self.classes.
336
336
337 If classes=False (the default), only flags and aliases are printed.
337 If classes=False (the default), only flags and aliases are printed.
338 """
338 """
339 self.print_description()
339 self.print_description()
340 self.print_subcommands()
340 self.print_subcommands()
341 self.print_options()
341 self.print_options()
342
342
343 if classes:
343 if classes:
344 help_classes = self._help_classes
344 help_classes = self._help_classes
345 if help_classes:
345 if help_classes:
346 print("Class parameters")
346 print("Class parameters")
347 print("----------------")
347 print("----------------")
348 print()
348 print()
349 for p in wrap_paragraphs(self.keyvalue_description):
349 for p in wrap_paragraphs(self.keyvalue_description):
350 print(p)
350 print(p)
351 print()
351 print()
352
352
353 for cls in help_classes:
353 for cls in help_classes:
354 cls.class_print_help()
354 cls.class_print_help()
355 print()
355 print()
356 else:
356 else:
357 print("To see all available configurables, use `--help-all`")
357 print("To see all available configurables, use `--help-all`")
358 print()
358 print()
359
359
360 self.print_examples()
360 self.print_examples()
361
361
362
362
363 def print_description(self):
363 def print_description(self):
364 """Print the application description."""
364 """Print the application description."""
365 for p in wrap_paragraphs(self.description):
365 for p in wrap_paragraphs(self.description):
366 print(p)
366 print(p)
367 print()
367 print()
368
368
369 def print_examples(self):
369 def print_examples(self):
370 """Print usage and examples.
370 """Print usage and examples.
371
371
372 This usage string goes at the end of the command line help string
372 This usage string goes at the end of the command line help string
373 and should contain examples of the application's usage.
373 and should contain examples of the application's usage.
374 """
374 """
375 if self.examples:
375 if self.examples:
376 print("Examples")
376 print("Examples")
377 print("--------")
377 print("--------")
378 print()
378 print()
379 print(indent(dedent(self.examples.strip())))
379 print(indent(dedent(self.examples.strip())))
380 print()
380 print()
381
381
382 def print_version(self):
382 def print_version(self):
383 """Print the version string."""
383 """Print the version string."""
384 print(self.version)
384 print(self.version)
385
385
386 def update_config(self, config):
386 def update_config(self, config):
387 """Fire the traits events when the config is updated."""
387 """Fire the traits events when the config is updated."""
388 # Save a copy of the current config.
388 # Save a copy of the current config.
389 newconfig = deepcopy(self.config)
389 newconfig = deepcopy(self.config)
390 # Merge the new config into the current one.
390 # Merge the new config into the current one.
391 newconfig.merge(config)
391 newconfig.merge(config)
392 # Save the combined config as self.config, which triggers the traits
392 # Save the combined config as self.config, which triggers the traits
393 # events.
393 # events.
394 self.config = newconfig
394 self.config = newconfig
395
395
396 @catch_config_error
396 @catch_config_error
397 def initialize_subcommand(self, subc, argv=None):
397 def initialize_subcommand(self, subc, argv=None):
398 """Initialize a subcommand with argv."""
398 """Initialize a subcommand with argv."""
399 subapp,help = self.subcommands.get(subc)
399 subapp,help = self.subcommands.get(subc)
400
400
401 if isinstance(subapp, string_types):
401 if isinstance(subapp, string_types):
402 subapp = import_item(subapp)
402 subapp = import_item(subapp)
403
403
404 # clear existing instances
404 # clear existing instances
405 self.__class__.clear_instance()
405 self.__class__.clear_instance()
406 # instantiate
406 # instantiate
407 self.subapp = subapp.instance(config=self.config)
407 self.subapp = subapp.instance(config=self.config)
408 # and initialize subapp
408 # and initialize subapp
409 self.subapp.initialize(argv)
409 self.subapp.initialize(argv)
410
410
411 def flatten_flags(self):
411 def flatten_flags(self):
412 """flatten flags and aliases, so cl-args override as expected.
412 """flatten flags and aliases, so cl-args override as expected.
413
413
414 This prevents issues such as an alias pointing to InteractiveShell,
414 This prevents issues such as an alias pointing to InteractiveShell,
415 but a config file setting the same trait in TerminalInteraciveShell
415 but a config file setting the same trait in TerminalInteraciveShell
416 getting inappropriate priority over the command-line arg.
416 getting inappropriate priority over the command-line arg.
417
417
418 Only aliases with exactly one descendent in the class list
418 Only aliases with exactly one descendent in the class list
419 will be promoted.
419 will be promoted.
420
420
421 """
421 """
422 # build a tree of classes in our list that inherit from a particular
422 # build a tree of classes in our list that inherit from a particular
423 # it will be a dict by parent classname of classes in our list
423 # it will be a dict by parent classname of classes in our list
424 # that are descendents
424 # that are descendents
425 mro_tree = defaultdict(list)
425 mro_tree = defaultdict(list)
426 for cls in self._help_classes:
426 for cls in self._help_classes:
427 clsname = cls.__name__
427 clsname = cls.__name__
428 for parent in cls.mro()[1:-3]:
428 for parent in cls.mro()[1:-3]:
429 # exclude cls itself and Configurable,HasTraits,object
429 # exclude cls itself and Configurable,HasTraits,object
430 mro_tree[parent.__name__].append(clsname)
430 mro_tree[parent.__name__].append(clsname)
431 # flatten aliases, which have the form:
431 # flatten aliases, which have the form:
432 # { 'alias' : 'Class.trait' }
432 # { 'alias' : 'Class.trait' }
433 aliases = {}
433 aliases = {}
434 for alias, cls_trait in iteritems(self.aliases):
434 for alias, cls_trait in iteritems(self.aliases):
435 cls,trait = cls_trait.split('.',1)
435 cls,trait = cls_trait.split('.',1)
436 children = mro_tree[cls]
436 children = mro_tree[cls]
437 if len(children) == 1:
437 if len(children) == 1:
438 # exactly one descendent, promote alias
438 # exactly one descendent, promote alias
439 cls = children[0]
439 cls = children[0]
440 aliases[alias] = '.'.join([cls,trait])
440 aliases[alias] = '.'.join([cls,trait])
441
441
442 # flatten flags, which are of the form:
442 # flatten flags, which are of the form:
443 # { 'key' : ({'Cls' : {'trait' : value}}, 'help')}
443 # { 'key' : ({'Cls' : {'trait' : value}}, 'help')}
444 flags = {}
444 flags = {}
445 for key, (flagdict, help) in iteritems(self.flags):
445 for key, (flagdict, help) in iteritems(self.flags):
446 newflag = {}
446 newflag = {}
447 for cls, subdict in iteritems(flagdict):
447 for cls, subdict in iteritems(flagdict):
448 children = mro_tree[cls]
448 children = mro_tree[cls]
449 # exactly one descendent, promote flag section
449 # exactly one descendent, promote flag section
450 if len(children) == 1:
450 if len(children) == 1:
451 cls = children[0]
451 cls = children[0]
452 newflag[cls] = subdict
452 newflag[cls] = subdict
453 flags[key] = (newflag, help)
453 flags[key] = (newflag, help)
454 return flags, aliases
454 return flags, aliases
455
455
456 @catch_config_error
456 @catch_config_error
457 def parse_command_line(self, argv=None):
457 def parse_command_line(self, argv=None):
458 """Parse the command line arguments."""
458 """Parse the command line arguments."""
459 argv = sys.argv[1:] if argv is None else argv
459 argv = sys.argv[1:] if argv is None else argv
460 self.argv = [ py3compat.cast_unicode(arg) for arg in argv ]
460 self.argv = [ py3compat.cast_unicode(arg) for arg in argv ]
461
461
462 if argv and argv[0] == 'help':
462 if argv and argv[0] == 'help':
463 # turn `ipython help notebook` into `ipython notebook -h`
463 # turn `ipython help notebook` into `ipython notebook -h`
464 argv = argv[1:] + ['-h']
464 argv = argv[1:] + ['-h']
465
465
466 if self.subcommands and len(argv) > 0:
466 if self.subcommands and len(argv) > 0:
467 # we have subcommands, and one may have been specified
467 # we have subcommands, and one may have been specified
468 subc, subargv = argv[0], argv[1:]
468 subc, subargv = argv[0], argv[1:]
469 if re.match(r'^\w(\-?\w)*$', subc) and subc in self.subcommands:
469 if re.match(r'^\w(\-?\w)*$', subc) and subc in self.subcommands:
470 # it's a subcommand, and *not* a flag or class parameter
470 # it's a subcommand, and *not* a flag or class parameter
471 return self.initialize_subcommand(subc, subargv)
471 return self.initialize_subcommand(subc, subargv)
472
472
473 # Arguments after a '--' argument are for the script IPython may be
473 # Arguments after a '--' argument are for the script IPython may be
474 # about to run, not IPython iteslf. For arguments parsed here (help and
474 # about to run, not IPython iteslf. For arguments parsed here (help and
475 # version), we want to only search the arguments up to the first
475 # version), we want to only search the arguments up to the first
476 # occurrence of '--', which we're calling interpreted_argv.
476 # occurrence of '--', which we're calling interpreted_argv.
477 try:
477 try:
478 interpreted_argv = argv[:argv.index('--')]
478 interpreted_argv = argv[:argv.index('--')]
479 except ValueError:
479 except ValueError:
480 interpreted_argv = argv
480 interpreted_argv = argv
481
481
482 if any(x in interpreted_argv for x in ('-h', '--help-all', '--help')):
482 if any(x in interpreted_argv for x in ('-h', '--help-all', '--help')):
483 self.print_help('--help-all' in interpreted_argv)
483 self.print_help('--help-all' in interpreted_argv)
484 self.exit(0)
484 self.exit(0)
485
485
486 if '--version' in interpreted_argv or '-V' in interpreted_argv:
486 if '--version' in interpreted_argv or '-V' in interpreted_argv:
487 self.print_version()
487 self.print_version()
488 self.exit(0)
488 self.exit(0)
489
489
490 # flatten flags&aliases, so cl-args get appropriate priority:
490 # flatten flags&aliases, so cl-args get appropriate priority:
491 flags,aliases = self.flatten_flags()
491 flags,aliases = self.flatten_flags()
492 loader = KVArgParseConfigLoader(argv=argv, aliases=aliases,
492 loader = KVArgParseConfigLoader(argv=argv, aliases=aliases,
493 flags=flags, log=self.log)
493 flags=flags, log=self.log)
494 config = loader.load_config()
494 config = loader.load_config()
495 self.update_config(config)
495 self.update_config(config)
496 # store unparsed args in extra_args
496 # store unparsed args in extra_args
497 self.extra_args = loader.extra_args
497 self.extra_args = loader.extra_args
498
498
499 @classmethod
499 @classmethod
500 def _load_config_files(cls, basefilename, path=None, log=None):
500 def _load_config_files(cls, basefilename, path=None, log=None):
501 """Load config files (py,json) by filename and path.
501 """Load config files (py,json) by filename and path.
502
502
503 yield each config object in turn.
503 yield each config object in turn.
504 """
504 """
505
505
506 if not isinstance(path, list):
506 if not isinstance(path, list):
507 path = [path]
507 path = [path]
508 for path in path[::-1]:
508 for path in path[::-1]:
509 # path list is in descending priority order, so load files backwards:
509 # path list is in descending priority order, so load files backwards:
510 pyloader = PyFileConfigLoader(basefilename+'.py', path=path, log=log)
510 pyloader = PyFileConfigLoader(basefilename+'.py', path=path, log=log)
511 jsonloader = JSONFileConfigLoader(basefilename+'.json', path=path, log=log)
511 jsonloader = JSONFileConfigLoader(basefilename+'.json', path=path, log=log)
512 config = None
512 config = None
513 for loader in [pyloader, jsonloader]:
513 for loader in [pyloader, jsonloader]:
514 try:
514 try:
515 config = loader.load_config()
515 config = loader.load_config()
516 except ConfigFileNotFound:
516 except ConfigFileNotFound:
517 pass
517 pass
518 except Exception:
518 except Exception:
519 # try to get the full filename, but it will be empty in the
519 # try to get the full filename, but it will be empty in the
520 # unlikely event that the error raised before filefind finished
520 # unlikely event that the error raised before filefind finished
521 filename = loader.full_filename or basefilename
521 filename = loader.full_filename or basefilename
522 # problem while running the file
522 # problem while running the file
523 if log:
523 if log:
524 log.error("Exception while loading config file %s",
524 log.error("Exception while loading config file %s",
525 filename, exc_info=True)
525 filename, exc_info=True)
526 else:
526 else:
527 if log:
527 if log:
528 log.debug("Loaded config file: %s", loader.full_filename)
528 log.debug("Loaded config file: %s", loader.full_filename)
529 if config:
529 if config:
530 yield config
530 yield config
531
531
532 raise StopIteration
532 raise StopIteration
533
533
534
534
535 @catch_config_error
535 @catch_config_error
536 def load_config_file(self, filename, path=None):
536 def load_config_file(self, filename, path=None):
537 """Load config files by filename and path."""
537 """Load config files by filename and path."""
538 filename, ext = os.path.splitext(filename)
538 filename, ext = os.path.splitext(filename)
539 loaded = []
539 loaded = []
540 for config in self._load_config_files(filename, path=path, log=self.log):
540 for config in self._load_config_files(filename, path=path, log=self.log):
541 loaded.append(config)
541 loaded.append(config)
542 self.update_config(config)
542 self.update_config(config)
543 if len(loaded) > 1:
543 if len(loaded) > 1:
544 collisions = loaded[0].collisions(loaded[1])
544 collisions = loaded[0].collisions(loaded[1])
545 if collisions:
545 if collisions:
546 self.log.warn("Collisions detected in {0}.py and {0}.json config files."
546 self.log.warn("Collisions detected in {0}.py and {0}.json config files."
547 " {0}.json has higher priority: {1}".format(
547 " {0}.json has higher priority: {1}".format(
548 filename, json.dumps(collisions, indent=2),
548 filename, json.dumps(collisions, indent=2),
549 ))
549 ))
550
550
551
551
552 def generate_config_file(self):
552 def generate_config_file(self):
553 """generate default config file from Configurables"""
553 """generate default config file from Configurables"""
554 lines = ["# Configuration file for %s."%self.name]
554 lines = ["# Configuration file for %s."%self.name]
555 lines.append('')
555 lines.append('')
556 lines.append('c = get_config()')
556 lines.append('c = get_config()')
557 lines.append('')
557 lines.append('')
558 for cls in self._config_classes:
558 for cls in self._config_classes:
559 lines.append(cls.class_config_section())
559 lines.append(cls.class_config_section())
560 return '\n'.join(lines)
560 return '\n'.join(lines)
561
561
562 def exit(self, exit_status=0):
562 def exit(self, exit_status=0):
563 self.log.debug("Exiting application: %s" % self.name)
563 self.log.debug("Exiting application: %s" % self.name)
564 sys.exit(exit_status)
564 sys.exit(exit_status)
565
565
566 @classmethod
566 @classmethod
567 def launch_instance(cls, argv=None, **kwargs):
567 def launch_instance(cls, argv=None, **kwargs):
568 """Launch a global instance of this Application
568 """Launch a global instance of this Application
569
569
570 If a global instance already exists, this reinitializes and starts it
570 If a global instance already exists, this reinitializes and starts it
571 """
571 """
572 app = cls.instance(**kwargs)
572 app = cls.instance(**kwargs)
573 app.initialize(argv)
573 app.initialize(argv)
574 app.start()
574 app.start()
575
575
576 #-----------------------------------------------------------------------------
576 #-----------------------------------------------------------------------------
577 # utility functions, for convenience
577 # utility functions, for convenience
578 #-----------------------------------------------------------------------------
578 #-----------------------------------------------------------------------------
579
579
580 def boolean_flag(name, configurable, set_help='', unset_help=''):
580 def boolean_flag(name, configurable, set_help='', unset_help=''):
581 """Helper for building basic --trait, --no-trait flags.
581 """Helper for building basic --trait, --no-trait flags.
582
582
583 Parameters
583 Parameters
584 ----------
584 ----------
585
585
586 name : str
586 name : str
587 The name of the flag.
587 The name of the flag.
588 configurable : str
588 configurable : str
589 The 'Class.trait' string of the trait to be set/unset with the flag
589 The 'Class.trait' string of the trait to be set/unset with the flag
590 set_help : unicode
590 set_help : unicode
591 help string for --name flag
591 help string for --name flag
592 unset_help : unicode
592 unset_help : unicode
593 help string for --no-name flag
593 help string for --no-name flag
594
594
595 Returns
595 Returns
596 -------
596 -------
597
597
598 cfg : dict
598 cfg : dict
599 A dict with two keys: 'name', and 'no-name', for setting and unsetting
599 A dict with two keys: 'name', and 'no-name', for setting and unsetting
600 the trait, respectively.
600 the trait, respectively.
601 """
601 """
602 # default helpstrings
602 # default helpstrings
603 set_help = set_help or "set %s=True"%configurable
603 set_help = set_help or "set %s=True"%configurable
604 unset_help = unset_help or "set %s=False"%configurable
604 unset_help = unset_help or "set %s=False"%configurable
605
605
606 cls,trait = configurable.split('.')
606 cls,trait = configurable.split('.')
607
607
608 setter = {cls : {trait : True}}
608 setter = {cls : {trait : True}}
609 unsetter = {cls : {trait : False}}
609 unsetter = {cls : {trait : False}}
610 return {name : (setter, set_help), 'no-'+name : (unsetter, unset_help)}
610 return {name : (setter, set_help), 'no-'+name : (unsetter, unset_help)}
611
611
612
612
613 def get_config():
613 def get_config():
614 """Get the config object for the global Application instance, if there is one
614 """Get the config object for the global Application instance, if there is one
615
615
616 otherwise return an empty config object
616 otherwise return an empty config object
617 """
617 """
618 if Application.initialized():
618 if Application.initialized():
619 return Application.instance().config
619 return Application.instance().config
620 else:
620 else:
621 return Config()
621 return Config()
@@ -1,965 +1,965 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Display formatters.
2 """Display formatters.
3
3
4 Inheritance diagram:
4 Inheritance diagram:
5
5
6 .. inheritance-diagram:: IPython.core.formatters
6 .. inheritance-diagram:: IPython.core.formatters
7 :parts: 3
7 :parts: 3
8 """
8 """
9
9
10 # Copyright (c) IPython Development Team.
10 # Copyright (c) IPython Development Team.
11 # Distributed under the terms of the Modified BSD License.
11 # Distributed under the terms of the Modified BSD License.
12
12
13 import abc
13 import abc
14 import inspect
14 import inspect
15 import json
15 import json
16 import sys
16 import sys
17 import traceback
17 import traceback
18 import warnings
18 import warnings
19
19
20 from IPython.external.decorator import decorator
20 from decorator import decorator
21
21
22 from IPython.config.configurable import Configurable
22 from IPython.config.configurable import Configurable
23 from IPython.core.getipython import get_ipython
23 from IPython.core.getipython import get_ipython
24 from IPython.lib import pretty
24 from IPython.lib import pretty
25 from IPython.utils.traitlets import (
25 from IPython.utils.traitlets import (
26 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
26 Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List,
27 ForwardDeclaredInstance,
27 ForwardDeclaredInstance,
28 )
28 )
29 from IPython.utils.py3compat import (
29 from IPython.utils.py3compat import (
30 with_metaclass, string_types, unicode_type,
30 with_metaclass, string_types, unicode_type,
31 )
31 )
32
32
33
33
34 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
35 # The main DisplayFormatter class
35 # The main DisplayFormatter class
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37
37
38
38
39 def _safe_get_formatter_method(obj, name):
39 def _safe_get_formatter_method(obj, name):
40 """Safely get a formatter method
40 """Safely get a formatter method
41
41
42 - Classes cannot have formatter methods, only instance
42 - Classes cannot have formatter methods, only instance
43 - protect against proxy objects that claim to have everything
43 - protect against proxy objects that claim to have everything
44 """
44 """
45 if inspect.isclass(obj):
45 if inspect.isclass(obj):
46 # repr methods only make sense on instances, not classes
46 # repr methods only make sense on instances, not classes
47 return None
47 return None
48 method = pretty._safe_getattr(obj, name, None)
48 method = pretty._safe_getattr(obj, name, None)
49 if callable(method):
49 if callable(method):
50 # obj claims to have repr method...
50 # obj claims to have repr method...
51 if callable(pretty._safe_getattr(obj, '_ipython_canary_method_should_not_exist_', None)):
51 if callable(pretty._safe_getattr(obj, '_ipython_canary_method_should_not_exist_', None)):
52 # ...but don't trust proxy objects that claim to have everything
52 # ...but don't trust proxy objects that claim to have everything
53 return None
53 return None
54 return method
54 return method
55
55
56
56
57 class DisplayFormatter(Configurable):
57 class DisplayFormatter(Configurable):
58
58
59 # When set to true only the default plain text formatter will be used.
59 # When set to true only the default plain text formatter will be used.
60 plain_text_only = Bool(False, config=True)
60 plain_text_only = Bool(False, config=True)
61 def _plain_text_only_changed(self, name, old, new):
61 def _plain_text_only_changed(self, name, old, new):
62 warnings.warn("""DisplayFormatter.plain_text_only is deprecated.
62 warnings.warn("""DisplayFormatter.plain_text_only is deprecated.
63
63
64 Use DisplayFormatter.active_types = ['text/plain']
64 Use DisplayFormatter.active_types = ['text/plain']
65 for the same effect.
65 for the same effect.
66 """, DeprecationWarning)
66 """, DeprecationWarning)
67 if new:
67 if new:
68 self.active_types = ['text/plain']
68 self.active_types = ['text/plain']
69 else:
69 else:
70 self.active_types = self.format_types
70 self.active_types = self.format_types
71
71
72 active_types = List(Unicode, config=True,
72 active_types = List(Unicode, config=True,
73 help="""List of currently active mime-types to display.
73 help="""List of currently active mime-types to display.
74 You can use this to set a white-list for formats to display.
74 You can use this to set a white-list for formats to display.
75
75
76 Most users will not need to change this value.
76 Most users will not need to change this value.
77 """)
77 """)
78 def _active_types_default(self):
78 def _active_types_default(self):
79 return self.format_types
79 return self.format_types
80
80
81 def _active_types_changed(self, name, old, new):
81 def _active_types_changed(self, name, old, new):
82 for key, formatter in self.formatters.items():
82 for key, formatter in self.formatters.items():
83 if key in new:
83 if key in new:
84 formatter.enabled = True
84 formatter.enabled = True
85 else:
85 else:
86 formatter.enabled = False
86 formatter.enabled = False
87
87
88 ipython_display_formatter = ForwardDeclaredInstance('FormatterABC')
88 ipython_display_formatter = ForwardDeclaredInstance('FormatterABC')
89 def _ipython_display_formatter_default(self):
89 def _ipython_display_formatter_default(self):
90 return IPythonDisplayFormatter(parent=self)
90 return IPythonDisplayFormatter(parent=self)
91
91
92 # A dict of formatter whose keys are format types (MIME types) and whose
92 # A dict of formatter whose keys are format types (MIME types) and whose
93 # values are subclasses of BaseFormatter.
93 # values are subclasses of BaseFormatter.
94 formatters = Dict()
94 formatters = Dict()
95 def _formatters_default(self):
95 def _formatters_default(self):
96 """Activate the default formatters."""
96 """Activate the default formatters."""
97 formatter_classes = [
97 formatter_classes = [
98 PlainTextFormatter,
98 PlainTextFormatter,
99 HTMLFormatter,
99 HTMLFormatter,
100 MarkdownFormatter,
100 MarkdownFormatter,
101 SVGFormatter,
101 SVGFormatter,
102 PNGFormatter,
102 PNGFormatter,
103 PDFFormatter,
103 PDFFormatter,
104 JPEGFormatter,
104 JPEGFormatter,
105 LatexFormatter,
105 LatexFormatter,
106 JSONFormatter,
106 JSONFormatter,
107 JavascriptFormatter
107 JavascriptFormatter
108 ]
108 ]
109 d = {}
109 d = {}
110 for cls in formatter_classes:
110 for cls in formatter_classes:
111 f = cls(parent=self)
111 f = cls(parent=self)
112 d[f.format_type] = f
112 d[f.format_type] = f
113 return d
113 return d
114
114
115 def format(self, obj, include=None, exclude=None):
115 def format(self, obj, include=None, exclude=None):
116 """Return a format data dict for an object.
116 """Return a format data dict for an object.
117
117
118 By default all format types will be computed.
118 By default all format types will be computed.
119
119
120 The following MIME types are currently implemented:
120 The following MIME types are currently implemented:
121
121
122 * text/plain
122 * text/plain
123 * text/html
123 * text/html
124 * text/markdown
124 * text/markdown
125 * text/latex
125 * text/latex
126 * application/json
126 * application/json
127 * application/javascript
127 * application/javascript
128 * application/pdf
128 * application/pdf
129 * image/png
129 * image/png
130 * image/jpeg
130 * image/jpeg
131 * image/svg+xml
131 * image/svg+xml
132
132
133 Parameters
133 Parameters
134 ----------
134 ----------
135 obj : object
135 obj : object
136 The Python object whose format data will be computed.
136 The Python object whose format data will be computed.
137 include : list or tuple, optional
137 include : list or tuple, optional
138 A list of format type strings (MIME types) to include in the
138 A list of format type strings (MIME types) to include in the
139 format data dict. If this is set *only* the format types included
139 format data dict. If this is set *only* the format types included
140 in this list will be computed.
140 in this list will be computed.
141 exclude : list or tuple, optional
141 exclude : list or tuple, optional
142 A list of format type string (MIME types) to exclude in the format
142 A list of format type string (MIME types) to exclude in the format
143 data dict. If this is set all format types will be computed,
143 data dict. If this is set all format types will be computed,
144 except for those included in this argument.
144 except for those included in this argument.
145
145
146 Returns
146 Returns
147 -------
147 -------
148 (format_dict, metadata_dict) : tuple of two dicts
148 (format_dict, metadata_dict) : tuple of two dicts
149
149
150 format_dict is a dictionary of key/value pairs, one of each format that was
150 format_dict is a dictionary of key/value pairs, one of each format that was
151 generated for the object. The keys are the format types, which
151 generated for the object. The keys are the format types, which
152 will usually be MIME type strings and the values and JSON'able
152 will usually be MIME type strings and the values and JSON'able
153 data structure containing the raw data for the representation in
153 data structure containing the raw data for the representation in
154 that format.
154 that format.
155
155
156 metadata_dict is a dictionary of metadata about each mime-type output.
156 metadata_dict is a dictionary of metadata about each mime-type output.
157 Its keys will be a strict subset of the keys in format_dict.
157 Its keys will be a strict subset of the keys in format_dict.
158 """
158 """
159 format_dict = {}
159 format_dict = {}
160 md_dict = {}
160 md_dict = {}
161
161
162 if self.ipython_display_formatter(obj):
162 if self.ipython_display_formatter(obj):
163 # object handled itself, don't proceed
163 # object handled itself, don't proceed
164 return {}, {}
164 return {}, {}
165
165
166 for format_type, formatter in self.formatters.items():
166 for format_type, formatter in self.formatters.items():
167 if include and format_type not in include:
167 if include and format_type not in include:
168 continue
168 continue
169 if exclude and format_type in exclude:
169 if exclude and format_type in exclude:
170 continue
170 continue
171
171
172 md = None
172 md = None
173 try:
173 try:
174 data = formatter(obj)
174 data = formatter(obj)
175 except:
175 except:
176 # FIXME: log the exception
176 # FIXME: log the exception
177 raise
177 raise
178
178
179 # formatters can return raw data or (data, metadata)
179 # formatters can return raw data or (data, metadata)
180 if isinstance(data, tuple) and len(data) == 2:
180 if isinstance(data, tuple) and len(data) == 2:
181 data, md = data
181 data, md = data
182
182
183 if data is not None:
183 if data is not None:
184 format_dict[format_type] = data
184 format_dict[format_type] = data
185 if md is not None:
185 if md is not None:
186 md_dict[format_type] = md
186 md_dict[format_type] = md
187
187
188 return format_dict, md_dict
188 return format_dict, md_dict
189
189
190 @property
190 @property
191 def format_types(self):
191 def format_types(self):
192 """Return the format types (MIME types) of the active formatters."""
192 """Return the format types (MIME types) of the active formatters."""
193 return list(self.formatters.keys())
193 return list(self.formatters.keys())
194
194
195
195
196 #-----------------------------------------------------------------------------
196 #-----------------------------------------------------------------------------
197 # Formatters for specific format types (text, html, svg, etc.)
197 # Formatters for specific format types (text, html, svg, etc.)
198 #-----------------------------------------------------------------------------
198 #-----------------------------------------------------------------------------
199
199
200
200
201 def _safe_repr(obj):
201 def _safe_repr(obj):
202 """Try to return a repr of an object
202 """Try to return a repr of an object
203
203
204 always returns a string, at least.
204 always returns a string, at least.
205 """
205 """
206 try:
206 try:
207 return repr(obj)
207 return repr(obj)
208 except Exception as e:
208 except Exception as e:
209 return "un-repr-able object (%r)" % e
209 return "un-repr-able object (%r)" % e
210
210
211
211
212 class FormatterWarning(UserWarning):
212 class FormatterWarning(UserWarning):
213 """Warning class for errors in formatters"""
213 """Warning class for errors in formatters"""
214
214
215 @decorator
215 @decorator
216 def catch_format_error(method, self, *args, **kwargs):
216 def catch_format_error(method, self, *args, **kwargs):
217 """show traceback on failed format call"""
217 """show traceback on failed format call"""
218 try:
218 try:
219 r = method(self, *args, **kwargs)
219 r = method(self, *args, **kwargs)
220 except NotImplementedError:
220 except NotImplementedError:
221 # don't warn on NotImplementedErrors
221 # don't warn on NotImplementedErrors
222 return None
222 return None
223 except Exception:
223 except Exception:
224 exc_info = sys.exc_info()
224 exc_info = sys.exc_info()
225 ip = get_ipython()
225 ip = get_ipython()
226 if ip is not None:
226 if ip is not None:
227 ip.showtraceback(exc_info)
227 ip.showtraceback(exc_info)
228 else:
228 else:
229 traceback.print_exception(*exc_info)
229 traceback.print_exception(*exc_info)
230 return None
230 return None
231 return self._check_return(r, args[0])
231 return self._check_return(r, args[0])
232
232
233
233
234 class FormatterABC(with_metaclass(abc.ABCMeta, object)):
234 class FormatterABC(with_metaclass(abc.ABCMeta, object)):
235 """ Abstract base class for Formatters.
235 """ Abstract base class for Formatters.
236
236
237 A formatter is a callable class that is responsible for computing the
237 A formatter is a callable class that is responsible for computing the
238 raw format data for a particular format type (MIME type). For example,
238 raw format data for a particular format type (MIME type). For example,
239 an HTML formatter would have a format type of `text/html` and would return
239 an HTML formatter would have a format type of `text/html` and would return
240 the HTML representation of the object when called.
240 the HTML representation of the object when called.
241 """
241 """
242
242
243 # The format type of the data returned, usually a MIME type.
243 # The format type of the data returned, usually a MIME type.
244 format_type = 'text/plain'
244 format_type = 'text/plain'
245
245
246 # Is the formatter enabled...
246 # Is the formatter enabled...
247 enabled = True
247 enabled = True
248
248
249 @abc.abstractmethod
249 @abc.abstractmethod
250 def __call__(self, obj):
250 def __call__(self, obj):
251 """Return a JSON'able representation of the object.
251 """Return a JSON'able representation of the object.
252
252
253 If the object cannot be formatted by this formatter,
253 If the object cannot be formatted by this formatter,
254 warn and return None.
254 warn and return None.
255 """
255 """
256 return repr(obj)
256 return repr(obj)
257
257
258
258
259 def _mod_name_key(typ):
259 def _mod_name_key(typ):
260 """Return a (__module__, __name__) tuple for a type.
260 """Return a (__module__, __name__) tuple for a type.
261
261
262 Used as key in Formatter.deferred_printers.
262 Used as key in Formatter.deferred_printers.
263 """
263 """
264 module = getattr(typ, '__module__', None)
264 module = getattr(typ, '__module__', None)
265 name = getattr(typ, '__name__', None)
265 name = getattr(typ, '__name__', None)
266 return (module, name)
266 return (module, name)
267
267
268
268
269 def _get_type(obj):
269 def _get_type(obj):
270 """Return the type of an instance (old and new-style)"""
270 """Return the type of an instance (old and new-style)"""
271 return getattr(obj, '__class__', None) or type(obj)
271 return getattr(obj, '__class__', None) or type(obj)
272
272
273 _raise_key_error = object()
273 _raise_key_error = object()
274
274
275
275
276 class BaseFormatter(Configurable):
276 class BaseFormatter(Configurable):
277 """A base formatter class that is configurable.
277 """A base formatter class that is configurable.
278
278
279 This formatter should usually be used as the base class of all formatters.
279 This formatter should usually be used as the base class of all formatters.
280 It is a traited :class:`Configurable` class and includes an extensible
280 It is a traited :class:`Configurable` class and includes an extensible
281 API for users to determine how their objects are formatted. The following
281 API for users to determine how their objects are formatted. The following
282 logic is used to find a function to format an given object.
282 logic is used to find a function to format an given object.
283
283
284 1. The object is introspected to see if it has a method with the name
284 1. The object is introspected to see if it has a method with the name
285 :attr:`print_method`. If is does, that object is passed to that method
285 :attr:`print_method`. If is does, that object is passed to that method
286 for formatting.
286 for formatting.
287 2. If no print method is found, three internal dictionaries are consulted
287 2. If no print method is found, three internal dictionaries are consulted
288 to find print method: :attr:`singleton_printers`, :attr:`type_printers`
288 to find print method: :attr:`singleton_printers`, :attr:`type_printers`
289 and :attr:`deferred_printers`.
289 and :attr:`deferred_printers`.
290
290
291 Users should use these dictionaries to register functions that will be
291 Users should use these dictionaries to register functions that will be
292 used to compute the format data for their objects (if those objects don't
292 used to compute the format data for their objects (if those objects don't
293 have the special print methods). The easiest way of using these
293 have the special print methods). The easiest way of using these
294 dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name`
294 dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name`
295 methods.
295 methods.
296
296
297 If no function/callable is found to compute the format data, ``None`` is
297 If no function/callable is found to compute the format data, ``None`` is
298 returned and this format type is not used.
298 returned and this format type is not used.
299 """
299 """
300
300
301 format_type = Unicode('text/plain')
301 format_type = Unicode('text/plain')
302 _return_type = string_types
302 _return_type = string_types
303
303
304 enabled = Bool(True, config=True)
304 enabled = Bool(True, config=True)
305
305
306 print_method = ObjectName('__repr__')
306 print_method = ObjectName('__repr__')
307
307
308 # The singleton printers.
308 # The singleton printers.
309 # Maps the IDs of the builtin singleton objects to the format functions.
309 # Maps the IDs of the builtin singleton objects to the format functions.
310 singleton_printers = Dict(config=True)
310 singleton_printers = Dict(config=True)
311
311
312 # The type-specific printers.
312 # The type-specific printers.
313 # Map type objects to the format functions.
313 # Map type objects to the format functions.
314 type_printers = Dict(config=True)
314 type_printers = Dict(config=True)
315
315
316 # The deferred-import type-specific printers.
316 # The deferred-import type-specific printers.
317 # Map (modulename, classname) pairs to the format functions.
317 # Map (modulename, classname) pairs to the format functions.
318 deferred_printers = Dict(config=True)
318 deferred_printers = Dict(config=True)
319
319
320 @catch_format_error
320 @catch_format_error
321 def __call__(self, obj):
321 def __call__(self, obj):
322 """Compute the format for an object."""
322 """Compute the format for an object."""
323 if self.enabled:
323 if self.enabled:
324 # lookup registered printer
324 # lookup registered printer
325 try:
325 try:
326 printer = self.lookup(obj)
326 printer = self.lookup(obj)
327 except KeyError:
327 except KeyError:
328 pass
328 pass
329 else:
329 else:
330 return printer(obj)
330 return printer(obj)
331 # Finally look for special method names
331 # Finally look for special method names
332 method = _safe_get_formatter_method(obj, self.print_method)
332 method = _safe_get_formatter_method(obj, self.print_method)
333 if method is not None:
333 if method is not None:
334 return method()
334 return method()
335 return None
335 return None
336 else:
336 else:
337 return None
337 return None
338
338
339 def __contains__(self, typ):
339 def __contains__(self, typ):
340 """map in to lookup_by_type"""
340 """map in to lookup_by_type"""
341 try:
341 try:
342 self.lookup_by_type(typ)
342 self.lookup_by_type(typ)
343 except KeyError:
343 except KeyError:
344 return False
344 return False
345 else:
345 else:
346 return True
346 return True
347
347
348 def _check_return(self, r, obj):
348 def _check_return(self, r, obj):
349 """Check that a return value is appropriate
349 """Check that a return value is appropriate
350
350
351 Return the value if so, None otherwise, warning if invalid.
351 Return the value if so, None otherwise, warning if invalid.
352 """
352 """
353 if r is None or isinstance(r, self._return_type) or \
353 if r is None or isinstance(r, self._return_type) or \
354 (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)):
354 (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)):
355 return r
355 return r
356 else:
356 else:
357 warnings.warn(
357 warnings.warn(
358 "%s formatter returned invalid type %s (expected %s) for object: %s" % \
358 "%s formatter returned invalid type %s (expected %s) for object: %s" % \
359 (self.format_type, type(r), self._return_type, _safe_repr(obj)),
359 (self.format_type, type(r), self._return_type, _safe_repr(obj)),
360 FormatterWarning
360 FormatterWarning
361 )
361 )
362
362
363 def lookup(self, obj):
363 def lookup(self, obj):
364 """Look up the formatter for a given instance.
364 """Look up the formatter for a given instance.
365
365
366 Parameters
366 Parameters
367 ----------
367 ----------
368 obj : object instance
368 obj : object instance
369
369
370 Returns
370 Returns
371 -------
371 -------
372 f : callable
372 f : callable
373 The registered formatting callable for the type.
373 The registered formatting callable for the type.
374
374
375 Raises
375 Raises
376 ------
376 ------
377 KeyError if the type has not been registered.
377 KeyError if the type has not been registered.
378 """
378 """
379 # look for singleton first
379 # look for singleton first
380 obj_id = id(obj)
380 obj_id = id(obj)
381 if obj_id in self.singleton_printers:
381 if obj_id in self.singleton_printers:
382 return self.singleton_printers[obj_id]
382 return self.singleton_printers[obj_id]
383 # then lookup by type
383 # then lookup by type
384 return self.lookup_by_type(_get_type(obj))
384 return self.lookup_by_type(_get_type(obj))
385
385
386 def lookup_by_type(self, typ):
386 def lookup_by_type(self, typ):
387 """Look up the registered formatter for a type.
387 """Look up the registered formatter for a type.
388
388
389 Parameters
389 Parameters
390 ----------
390 ----------
391 typ : type or '__module__.__name__' string for a type
391 typ : type or '__module__.__name__' string for a type
392
392
393 Returns
393 Returns
394 -------
394 -------
395 f : callable
395 f : callable
396 The registered formatting callable for the type.
396 The registered formatting callable for the type.
397
397
398 Raises
398 Raises
399 ------
399 ------
400 KeyError if the type has not been registered.
400 KeyError if the type has not been registered.
401 """
401 """
402 if isinstance(typ, string_types):
402 if isinstance(typ, string_types):
403 typ_key = tuple(typ.rsplit('.',1))
403 typ_key = tuple(typ.rsplit('.',1))
404 if typ_key not in self.deferred_printers:
404 if typ_key not in self.deferred_printers:
405 # We may have it cached in the type map. We will have to
405 # We may have it cached in the type map. We will have to
406 # iterate over all of the types to check.
406 # iterate over all of the types to check.
407 for cls in self.type_printers:
407 for cls in self.type_printers:
408 if _mod_name_key(cls) == typ_key:
408 if _mod_name_key(cls) == typ_key:
409 return self.type_printers[cls]
409 return self.type_printers[cls]
410 else:
410 else:
411 return self.deferred_printers[typ_key]
411 return self.deferred_printers[typ_key]
412 else:
412 else:
413 for cls in pretty._get_mro(typ):
413 for cls in pretty._get_mro(typ):
414 if cls in self.type_printers or self._in_deferred_types(cls):
414 if cls in self.type_printers or self._in_deferred_types(cls):
415 return self.type_printers[cls]
415 return self.type_printers[cls]
416
416
417 # If we have reached here, the lookup failed.
417 # If we have reached here, the lookup failed.
418 raise KeyError("No registered printer for {0!r}".format(typ))
418 raise KeyError("No registered printer for {0!r}".format(typ))
419
419
420 def for_type(self, typ, func=None):
420 def for_type(self, typ, func=None):
421 """Add a format function for a given type.
421 """Add a format function for a given type.
422
422
423 Parameters
423 Parameters
424 -----------
424 -----------
425 typ : type or '__module__.__name__' string for a type
425 typ : type or '__module__.__name__' string for a type
426 The class of the object that will be formatted using `func`.
426 The class of the object that will be formatted using `func`.
427 func : callable
427 func : callable
428 A callable for computing the format data.
428 A callable for computing the format data.
429 `func` will be called with the object to be formatted,
429 `func` will be called with the object to be formatted,
430 and will return the raw data in this formatter's format.
430 and will return the raw data in this formatter's format.
431 Subclasses may use a different call signature for the
431 Subclasses may use a different call signature for the
432 `func` argument.
432 `func` argument.
433
433
434 If `func` is None or not specified, there will be no change,
434 If `func` is None or not specified, there will be no change,
435 only returning the current value.
435 only returning the current value.
436
436
437 Returns
437 Returns
438 -------
438 -------
439 oldfunc : callable
439 oldfunc : callable
440 The currently registered callable.
440 The currently registered callable.
441 If you are registering a new formatter,
441 If you are registering a new formatter,
442 this will be the previous value (to enable restoring later).
442 this will be the previous value (to enable restoring later).
443 """
443 """
444 # if string given, interpret as 'pkg.module.class_name'
444 # if string given, interpret as 'pkg.module.class_name'
445 if isinstance(typ, string_types):
445 if isinstance(typ, string_types):
446 type_module, type_name = typ.rsplit('.', 1)
446 type_module, type_name = typ.rsplit('.', 1)
447 return self.for_type_by_name(type_module, type_name, func)
447 return self.for_type_by_name(type_module, type_name, func)
448
448
449 try:
449 try:
450 oldfunc = self.lookup_by_type(typ)
450 oldfunc = self.lookup_by_type(typ)
451 except KeyError:
451 except KeyError:
452 oldfunc = None
452 oldfunc = None
453
453
454 if func is not None:
454 if func is not None:
455 self.type_printers[typ] = func
455 self.type_printers[typ] = func
456
456
457 return oldfunc
457 return oldfunc
458
458
459 def for_type_by_name(self, type_module, type_name, func=None):
459 def for_type_by_name(self, type_module, type_name, func=None):
460 """Add a format function for a type specified by the full dotted
460 """Add a format function for a type specified by the full dotted
461 module and name of the type, rather than the type of the object.
461 module and name of the type, rather than the type of the object.
462
462
463 Parameters
463 Parameters
464 ----------
464 ----------
465 type_module : str
465 type_module : str
466 The full dotted name of the module the type is defined in, like
466 The full dotted name of the module the type is defined in, like
467 ``numpy``.
467 ``numpy``.
468 type_name : str
468 type_name : str
469 The name of the type (the class name), like ``dtype``
469 The name of the type (the class name), like ``dtype``
470 func : callable
470 func : callable
471 A callable for computing the format data.
471 A callable for computing the format data.
472 `func` will be called with the object to be formatted,
472 `func` will be called with the object to be formatted,
473 and will return the raw data in this formatter's format.
473 and will return the raw data in this formatter's format.
474 Subclasses may use a different call signature for the
474 Subclasses may use a different call signature for the
475 `func` argument.
475 `func` argument.
476
476
477 If `func` is None or unspecified, there will be no change,
477 If `func` is None or unspecified, there will be no change,
478 only returning the current value.
478 only returning the current value.
479
479
480 Returns
480 Returns
481 -------
481 -------
482 oldfunc : callable
482 oldfunc : callable
483 The currently registered callable.
483 The currently registered callable.
484 If you are registering a new formatter,
484 If you are registering a new formatter,
485 this will be the previous value (to enable restoring later).
485 this will be the previous value (to enable restoring later).
486 """
486 """
487 key = (type_module, type_name)
487 key = (type_module, type_name)
488
488
489 try:
489 try:
490 oldfunc = self.lookup_by_type("%s.%s" % key)
490 oldfunc = self.lookup_by_type("%s.%s" % key)
491 except KeyError:
491 except KeyError:
492 oldfunc = None
492 oldfunc = None
493
493
494 if func is not None:
494 if func is not None:
495 self.deferred_printers[key] = func
495 self.deferred_printers[key] = func
496 return oldfunc
496 return oldfunc
497
497
498 def pop(self, typ, default=_raise_key_error):
498 def pop(self, typ, default=_raise_key_error):
499 """Pop a formatter for the given type.
499 """Pop a formatter for the given type.
500
500
501 Parameters
501 Parameters
502 ----------
502 ----------
503 typ : type or '__module__.__name__' string for a type
503 typ : type or '__module__.__name__' string for a type
504 default : object
504 default : object
505 value to be returned if no formatter is registered for typ.
505 value to be returned if no formatter is registered for typ.
506
506
507 Returns
507 Returns
508 -------
508 -------
509 obj : object
509 obj : object
510 The last registered object for the type.
510 The last registered object for the type.
511
511
512 Raises
512 Raises
513 ------
513 ------
514 KeyError if the type is not registered and default is not specified.
514 KeyError if the type is not registered and default is not specified.
515 """
515 """
516
516
517 if isinstance(typ, string_types):
517 if isinstance(typ, string_types):
518 typ_key = tuple(typ.rsplit('.',1))
518 typ_key = tuple(typ.rsplit('.',1))
519 if typ_key not in self.deferred_printers:
519 if typ_key not in self.deferred_printers:
520 # We may have it cached in the type map. We will have to
520 # We may have it cached in the type map. We will have to
521 # iterate over all of the types to check.
521 # iterate over all of the types to check.
522 for cls in self.type_printers:
522 for cls in self.type_printers:
523 if _mod_name_key(cls) == typ_key:
523 if _mod_name_key(cls) == typ_key:
524 old = self.type_printers.pop(cls)
524 old = self.type_printers.pop(cls)
525 break
525 break
526 else:
526 else:
527 old = default
527 old = default
528 else:
528 else:
529 old = self.deferred_printers.pop(typ_key)
529 old = self.deferred_printers.pop(typ_key)
530 else:
530 else:
531 if typ in self.type_printers:
531 if typ in self.type_printers:
532 old = self.type_printers.pop(typ)
532 old = self.type_printers.pop(typ)
533 else:
533 else:
534 old = self.deferred_printers.pop(_mod_name_key(typ), default)
534 old = self.deferred_printers.pop(_mod_name_key(typ), default)
535 if old is _raise_key_error:
535 if old is _raise_key_error:
536 raise KeyError("No registered value for {0!r}".format(typ))
536 raise KeyError("No registered value for {0!r}".format(typ))
537 return old
537 return old
538
538
539 def _in_deferred_types(self, cls):
539 def _in_deferred_types(self, cls):
540 """
540 """
541 Check if the given class is specified in the deferred type registry.
541 Check if the given class is specified in the deferred type registry.
542
542
543 Successful matches will be moved to the regular type registry for future use.
543 Successful matches will be moved to the regular type registry for future use.
544 """
544 """
545 mod = getattr(cls, '__module__', None)
545 mod = getattr(cls, '__module__', None)
546 name = getattr(cls, '__name__', None)
546 name = getattr(cls, '__name__', None)
547 key = (mod, name)
547 key = (mod, name)
548 if key in self.deferred_printers:
548 if key in self.deferred_printers:
549 # Move the printer over to the regular registry.
549 # Move the printer over to the regular registry.
550 printer = self.deferred_printers.pop(key)
550 printer = self.deferred_printers.pop(key)
551 self.type_printers[cls] = printer
551 self.type_printers[cls] = printer
552 return True
552 return True
553 return False
553 return False
554
554
555
555
556 class PlainTextFormatter(BaseFormatter):
556 class PlainTextFormatter(BaseFormatter):
557 """The default pretty-printer.
557 """The default pretty-printer.
558
558
559 This uses :mod:`IPython.lib.pretty` to compute the format data of
559 This uses :mod:`IPython.lib.pretty` to compute the format data of
560 the object. If the object cannot be pretty printed, :func:`repr` is used.
560 the object. If the object cannot be pretty printed, :func:`repr` is used.
561 See the documentation of :mod:`IPython.lib.pretty` for details on
561 See the documentation of :mod:`IPython.lib.pretty` for details on
562 how to write pretty printers. Here is a simple example::
562 how to write pretty printers. Here is a simple example::
563
563
564 def dtype_pprinter(obj, p, cycle):
564 def dtype_pprinter(obj, p, cycle):
565 if cycle:
565 if cycle:
566 return p.text('dtype(...)')
566 return p.text('dtype(...)')
567 if hasattr(obj, 'fields'):
567 if hasattr(obj, 'fields'):
568 if obj.fields is None:
568 if obj.fields is None:
569 p.text(repr(obj))
569 p.text(repr(obj))
570 else:
570 else:
571 p.begin_group(7, 'dtype([')
571 p.begin_group(7, 'dtype([')
572 for i, field in enumerate(obj.descr):
572 for i, field in enumerate(obj.descr):
573 if i > 0:
573 if i > 0:
574 p.text(',')
574 p.text(',')
575 p.breakable()
575 p.breakable()
576 p.pretty(field)
576 p.pretty(field)
577 p.end_group(7, '])')
577 p.end_group(7, '])')
578 """
578 """
579
579
580 # The format type of data returned.
580 # The format type of data returned.
581 format_type = Unicode('text/plain')
581 format_type = Unicode('text/plain')
582
582
583 # This subclass ignores this attribute as it always need to return
583 # This subclass ignores this attribute as it always need to return
584 # something.
584 # something.
585 enabled = Bool(True, config=False)
585 enabled = Bool(True, config=False)
586
586
587 max_seq_length = Integer(pretty.MAX_SEQ_LENGTH, config=True,
587 max_seq_length = Integer(pretty.MAX_SEQ_LENGTH, config=True,
588 help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
588 help="""Truncate large collections (lists, dicts, tuples, sets) to this size.
589
589
590 Set to 0 to disable truncation.
590 Set to 0 to disable truncation.
591 """
591 """
592 )
592 )
593
593
594 # Look for a _repr_pretty_ methods to use for pretty printing.
594 # Look for a _repr_pretty_ methods to use for pretty printing.
595 print_method = ObjectName('_repr_pretty_')
595 print_method = ObjectName('_repr_pretty_')
596
596
597 # Whether to pretty-print or not.
597 # Whether to pretty-print or not.
598 pprint = Bool(True, config=True)
598 pprint = Bool(True, config=True)
599
599
600 # Whether to be verbose or not.
600 # Whether to be verbose or not.
601 verbose = Bool(False, config=True)
601 verbose = Bool(False, config=True)
602
602
603 # The maximum width.
603 # The maximum width.
604 max_width = Integer(79, config=True)
604 max_width = Integer(79, config=True)
605
605
606 # The newline character.
606 # The newline character.
607 newline = Unicode('\n', config=True)
607 newline = Unicode('\n', config=True)
608
608
609 # format-string for pprinting floats
609 # format-string for pprinting floats
610 float_format = Unicode('%r')
610 float_format = Unicode('%r')
611 # setter for float precision, either int or direct format-string
611 # setter for float precision, either int or direct format-string
612 float_precision = CUnicode('', config=True)
612 float_precision = CUnicode('', config=True)
613
613
614 def _float_precision_changed(self, name, old, new):
614 def _float_precision_changed(self, name, old, new):
615 """float_precision changed, set float_format accordingly.
615 """float_precision changed, set float_format accordingly.
616
616
617 float_precision can be set by int or str.
617 float_precision can be set by int or str.
618 This will set float_format, after interpreting input.
618 This will set float_format, after interpreting input.
619 If numpy has been imported, numpy print precision will also be set.
619 If numpy has been imported, numpy print precision will also be set.
620
620
621 integer `n` sets format to '%.nf', otherwise, format set directly.
621 integer `n` sets format to '%.nf', otherwise, format set directly.
622
622
623 An empty string returns to defaults (repr for float, 8 for numpy).
623 An empty string returns to defaults (repr for float, 8 for numpy).
624
624
625 This parameter can be set via the '%precision' magic.
625 This parameter can be set via the '%precision' magic.
626 """
626 """
627
627
628 if '%' in new:
628 if '%' in new:
629 # got explicit format string
629 # got explicit format string
630 fmt = new
630 fmt = new
631 try:
631 try:
632 fmt%3.14159
632 fmt%3.14159
633 except Exception:
633 except Exception:
634 raise ValueError("Precision must be int or format string, not %r"%new)
634 raise ValueError("Precision must be int or format string, not %r"%new)
635 elif new:
635 elif new:
636 # otherwise, should be an int
636 # otherwise, should be an int
637 try:
637 try:
638 i = int(new)
638 i = int(new)
639 assert i >= 0
639 assert i >= 0
640 except ValueError:
640 except ValueError:
641 raise ValueError("Precision must be int or format string, not %r"%new)
641 raise ValueError("Precision must be int or format string, not %r"%new)
642 except AssertionError:
642 except AssertionError:
643 raise ValueError("int precision must be non-negative, not %r"%i)
643 raise ValueError("int precision must be non-negative, not %r"%i)
644
644
645 fmt = '%%.%if'%i
645 fmt = '%%.%if'%i
646 if 'numpy' in sys.modules:
646 if 'numpy' in sys.modules:
647 # set numpy precision if it has been imported
647 # set numpy precision if it has been imported
648 import numpy
648 import numpy
649 numpy.set_printoptions(precision=i)
649 numpy.set_printoptions(precision=i)
650 else:
650 else:
651 # default back to repr
651 # default back to repr
652 fmt = '%r'
652 fmt = '%r'
653 if 'numpy' in sys.modules:
653 if 'numpy' in sys.modules:
654 import numpy
654 import numpy
655 # numpy default is 8
655 # numpy default is 8
656 numpy.set_printoptions(precision=8)
656 numpy.set_printoptions(precision=8)
657 self.float_format = fmt
657 self.float_format = fmt
658
658
659 # Use the default pretty printers from IPython.lib.pretty.
659 # Use the default pretty printers from IPython.lib.pretty.
660 def _singleton_printers_default(self):
660 def _singleton_printers_default(self):
661 return pretty._singleton_pprinters.copy()
661 return pretty._singleton_pprinters.copy()
662
662
663 def _type_printers_default(self):
663 def _type_printers_default(self):
664 d = pretty._type_pprinters.copy()
664 d = pretty._type_pprinters.copy()
665 d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
665 d[float] = lambda obj,p,cycle: p.text(self.float_format%obj)
666 return d
666 return d
667
667
668 def _deferred_printers_default(self):
668 def _deferred_printers_default(self):
669 return pretty._deferred_type_pprinters.copy()
669 return pretty._deferred_type_pprinters.copy()
670
670
671 #### FormatterABC interface ####
671 #### FormatterABC interface ####
672
672
673 @catch_format_error
673 @catch_format_error
674 def __call__(self, obj):
674 def __call__(self, obj):
675 """Compute the pretty representation of the object."""
675 """Compute the pretty representation of the object."""
676 if not self.pprint:
676 if not self.pprint:
677 return repr(obj)
677 return repr(obj)
678 else:
678 else:
679 # handle str and unicode on Python 2
679 # handle str and unicode on Python 2
680 # io.StringIO only accepts unicode,
680 # io.StringIO only accepts unicode,
681 # cStringIO doesn't handle unicode on py2,
681 # cStringIO doesn't handle unicode on py2,
682 # StringIO allows str, unicode but only ascii str
682 # StringIO allows str, unicode but only ascii str
683 stream = pretty.CUnicodeIO()
683 stream = pretty.CUnicodeIO()
684 printer = pretty.RepresentationPrinter(stream, self.verbose,
684 printer = pretty.RepresentationPrinter(stream, self.verbose,
685 self.max_width, self.newline,
685 self.max_width, self.newline,
686 max_seq_length=self.max_seq_length,
686 max_seq_length=self.max_seq_length,
687 singleton_pprinters=self.singleton_printers,
687 singleton_pprinters=self.singleton_printers,
688 type_pprinters=self.type_printers,
688 type_pprinters=self.type_printers,
689 deferred_pprinters=self.deferred_printers)
689 deferred_pprinters=self.deferred_printers)
690 printer.pretty(obj)
690 printer.pretty(obj)
691 printer.flush()
691 printer.flush()
692 return stream.getvalue()
692 return stream.getvalue()
693
693
694
694
695 class HTMLFormatter(BaseFormatter):
695 class HTMLFormatter(BaseFormatter):
696 """An HTML formatter.
696 """An HTML formatter.
697
697
698 To define the callables that compute the HTML representation of your
698 To define the callables that compute the HTML representation of your
699 objects, define a :meth:`_repr_html_` method or use the :meth:`for_type`
699 objects, define a :meth:`_repr_html_` method or use the :meth:`for_type`
700 or :meth:`for_type_by_name` methods to register functions that handle
700 or :meth:`for_type_by_name` methods to register functions that handle
701 this.
701 this.
702
702
703 The return value of this formatter should be a valid HTML snippet that
703 The return value of this formatter should be a valid HTML snippet that
704 could be injected into an existing DOM. It should *not* include the
704 could be injected into an existing DOM. It should *not* include the
705 ```<html>`` or ```<body>`` tags.
705 ```<html>`` or ```<body>`` tags.
706 """
706 """
707 format_type = Unicode('text/html')
707 format_type = Unicode('text/html')
708
708
709 print_method = ObjectName('_repr_html_')
709 print_method = ObjectName('_repr_html_')
710
710
711
711
712 class MarkdownFormatter(BaseFormatter):
712 class MarkdownFormatter(BaseFormatter):
713 """A Markdown formatter.
713 """A Markdown formatter.
714
714
715 To define the callables that compute the Markdown representation of your
715 To define the callables that compute the Markdown representation of your
716 objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type`
716 objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type`
717 or :meth:`for_type_by_name` methods to register functions that handle
717 or :meth:`for_type_by_name` methods to register functions that handle
718 this.
718 this.
719
719
720 The return value of this formatter should be a valid Markdown.
720 The return value of this formatter should be a valid Markdown.
721 """
721 """
722 format_type = Unicode('text/markdown')
722 format_type = Unicode('text/markdown')
723
723
724 print_method = ObjectName('_repr_markdown_')
724 print_method = ObjectName('_repr_markdown_')
725
725
726 class SVGFormatter(BaseFormatter):
726 class SVGFormatter(BaseFormatter):
727 """An SVG formatter.
727 """An SVG formatter.
728
728
729 To define the callables that compute the SVG representation of your
729 To define the callables that compute the SVG representation of your
730 objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type`
730 objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type`
731 or :meth:`for_type_by_name` methods to register functions that handle
731 or :meth:`for_type_by_name` methods to register functions that handle
732 this.
732 this.
733
733
734 The return value of this formatter should be valid SVG enclosed in
734 The return value of this formatter should be valid SVG enclosed in
735 ```<svg>``` tags, that could be injected into an existing DOM. It should
735 ```<svg>``` tags, that could be injected into an existing DOM. It should
736 *not* include the ```<html>`` or ```<body>`` tags.
736 *not* include the ```<html>`` or ```<body>`` tags.
737 """
737 """
738 format_type = Unicode('image/svg+xml')
738 format_type = Unicode('image/svg+xml')
739
739
740 print_method = ObjectName('_repr_svg_')
740 print_method = ObjectName('_repr_svg_')
741
741
742
742
743 class PNGFormatter(BaseFormatter):
743 class PNGFormatter(BaseFormatter):
744 """A PNG formatter.
744 """A PNG formatter.
745
745
746 To define the callables that compute the PNG representation of your
746 To define the callables that compute the PNG representation of your
747 objects, define a :meth:`_repr_png_` method or use the :meth:`for_type`
747 objects, define a :meth:`_repr_png_` method or use the :meth:`for_type`
748 or :meth:`for_type_by_name` methods to register functions that handle
748 or :meth:`for_type_by_name` methods to register functions that handle
749 this.
749 this.
750
750
751 The return value of this formatter should be raw PNG data, *not*
751 The return value of this formatter should be raw PNG data, *not*
752 base64 encoded.
752 base64 encoded.
753 """
753 """
754 format_type = Unicode('image/png')
754 format_type = Unicode('image/png')
755
755
756 print_method = ObjectName('_repr_png_')
756 print_method = ObjectName('_repr_png_')
757
757
758 _return_type = (bytes, unicode_type)
758 _return_type = (bytes, unicode_type)
759
759
760
760
761 class JPEGFormatter(BaseFormatter):
761 class JPEGFormatter(BaseFormatter):
762 """A JPEG formatter.
762 """A JPEG formatter.
763
763
764 To define the callables that compute the JPEG representation of your
764 To define the callables that compute the JPEG representation of your
765 objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type`
765 objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type`
766 or :meth:`for_type_by_name` methods to register functions that handle
766 or :meth:`for_type_by_name` methods to register functions that handle
767 this.
767 this.
768
768
769 The return value of this formatter should be raw JPEG data, *not*
769 The return value of this formatter should be raw JPEG data, *not*
770 base64 encoded.
770 base64 encoded.
771 """
771 """
772 format_type = Unicode('image/jpeg')
772 format_type = Unicode('image/jpeg')
773
773
774 print_method = ObjectName('_repr_jpeg_')
774 print_method = ObjectName('_repr_jpeg_')
775
775
776 _return_type = (bytes, unicode_type)
776 _return_type = (bytes, unicode_type)
777
777
778
778
779 class LatexFormatter(BaseFormatter):
779 class LatexFormatter(BaseFormatter):
780 """A LaTeX formatter.
780 """A LaTeX formatter.
781
781
782 To define the callables that compute the LaTeX representation of your
782 To define the callables that compute the LaTeX representation of your
783 objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type`
783 objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type`
784 or :meth:`for_type_by_name` methods to register functions that handle
784 or :meth:`for_type_by_name` methods to register functions that handle
785 this.
785 this.
786
786
787 The return value of this formatter should be a valid LaTeX equation,
787 The return value of this formatter should be a valid LaTeX equation,
788 enclosed in either ```$```, ```$$``` or another LaTeX equation
788 enclosed in either ```$```, ```$$``` or another LaTeX equation
789 environment.
789 environment.
790 """
790 """
791 format_type = Unicode('text/latex')
791 format_type = Unicode('text/latex')
792
792
793 print_method = ObjectName('_repr_latex_')
793 print_method = ObjectName('_repr_latex_')
794
794
795
795
796 class JSONFormatter(BaseFormatter):
796 class JSONFormatter(BaseFormatter):
797 """A JSON string formatter.
797 """A JSON string formatter.
798
798
799 To define the callables that compute the JSONable representation of
799 To define the callables that compute the JSONable representation of
800 your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type`
800 your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type`
801 or :meth:`for_type_by_name` methods to register functions that handle
801 or :meth:`for_type_by_name` methods to register functions that handle
802 this.
802 this.
803
803
804 The return value of this formatter should be a JSONable list or dict.
804 The return value of this formatter should be a JSONable list or dict.
805 JSON scalars (None, number, string) are not allowed, only dict or list containers.
805 JSON scalars (None, number, string) are not allowed, only dict or list containers.
806 """
806 """
807 format_type = Unicode('application/json')
807 format_type = Unicode('application/json')
808 _return_type = (list, dict)
808 _return_type = (list, dict)
809
809
810 print_method = ObjectName('_repr_json_')
810 print_method = ObjectName('_repr_json_')
811
811
812 def _check_return(self, r, obj):
812 def _check_return(self, r, obj):
813 """Check that a return value is appropriate
813 """Check that a return value is appropriate
814
814
815 Return the value if so, None otherwise, warning if invalid.
815 Return the value if so, None otherwise, warning if invalid.
816 """
816 """
817 if r is None:
817 if r is None:
818 return
818 return
819 md = None
819 md = None
820 if isinstance(r, tuple):
820 if isinstance(r, tuple):
821 # unpack data, metadata tuple for type checking on first element
821 # unpack data, metadata tuple for type checking on first element
822 r, md = r
822 r, md = r
823
823
824 # handle deprecated JSON-as-string form from IPython < 3
824 # handle deprecated JSON-as-string form from IPython < 3
825 if isinstance(r, string_types):
825 if isinstance(r, string_types):
826 warnings.warn("JSON expects JSONable list/dict containers, not JSON strings",
826 warnings.warn("JSON expects JSONable list/dict containers, not JSON strings",
827 FormatterWarning)
827 FormatterWarning)
828 r = json.loads(r)
828 r = json.loads(r)
829
829
830 if md is not None:
830 if md is not None:
831 # put the tuple back together
831 # put the tuple back together
832 r = (r, md)
832 r = (r, md)
833 return super(JSONFormatter, self)._check_return(r, obj)
833 return super(JSONFormatter, self)._check_return(r, obj)
834
834
835
835
836 class JavascriptFormatter(BaseFormatter):
836 class JavascriptFormatter(BaseFormatter):
837 """A Javascript formatter.
837 """A Javascript formatter.
838
838
839 To define the callables that compute the Javascript representation of
839 To define the callables that compute the Javascript representation of
840 your objects, define a :meth:`_repr_javascript_` method or use the
840 your objects, define a :meth:`_repr_javascript_` method or use the
841 :meth:`for_type` or :meth:`for_type_by_name` methods to register functions
841 :meth:`for_type` or :meth:`for_type_by_name` methods to register functions
842 that handle this.
842 that handle this.
843
843
844 The return value of this formatter should be valid Javascript code and
844 The return value of this formatter should be valid Javascript code and
845 should *not* be enclosed in ```<script>``` tags.
845 should *not* be enclosed in ```<script>``` tags.
846 """
846 """
847 format_type = Unicode('application/javascript')
847 format_type = Unicode('application/javascript')
848
848
849 print_method = ObjectName('_repr_javascript_')
849 print_method = ObjectName('_repr_javascript_')
850
850
851
851
852 class PDFFormatter(BaseFormatter):
852 class PDFFormatter(BaseFormatter):
853 """A PDF formatter.
853 """A PDF formatter.
854
854
855 To define the callables that compute the PDF representation of your
855 To define the callables that compute the PDF representation of your
856 objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type`
856 objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type`
857 or :meth:`for_type_by_name` methods to register functions that handle
857 or :meth:`for_type_by_name` methods to register functions that handle
858 this.
858 this.
859
859
860 The return value of this formatter should be raw PDF data, *not*
860 The return value of this formatter should be raw PDF data, *not*
861 base64 encoded.
861 base64 encoded.
862 """
862 """
863 format_type = Unicode('application/pdf')
863 format_type = Unicode('application/pdf')
864
864
865 print_method = ObjectName('_repr_pdf_')
865 print_method = ObjectName('_repr_pdf_')
866
866
867 _return_type = (bytes, unicode_type)
867 _return_type = (bytes, unicode_type)
868
868
869 class IPythonDisplayFormatter(BaseFormatter):
869 class IPythonDisplayFormatter(BaseFormatter):
870 """A Formatter for objects that know how to display themselves.
870 """A Formatter for objects that know how to display themselves.
871
871
872 To define the callables that compute the representation of your
872 To define the callables that compute the representation of your
873 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
873 objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type`
874 or :meth:`for_type_by_name` methods to register functions that handle
874 or :meth:`for_type_by_name` methods to register functions that handle
875 this. Unlike mime-type displays, this method should not return anything,
875 this. Unlike mime-type displays, this method should not return anything,
876 instead calling any appropriate display methods itself.
876 instead calling any appropriate display methods itself.
877
877
878 This display formatter has highest priority.
878 This display formatter has highest priority.
879 If it fires, no other display formatter will be called.
879 If it fires, no other display formatter will be called.
880 """
880 """
881 print_method = ObjectName('_ipython_display_')
881 print_method = ObjectName('_ipython_display_')
882 _return_type = (type(None), bool)
882 _return_type = (type(None), bool)
883
883
884
884
885 @catch_format_error
885 @catch_format_error
886 def __call__(self, obj):
886 def __call__(self, obj):
887 """Compute the format for an object."""
887 """Compute the format for an object."""
888 if self.enabled:
888 if self.enabled:
889 # lookup registered printer
889 # lookup registered printer
890 try:
890 try:
891 printer = self.lookup(obj)
891 printer = self.lookup(obj)
892 except KeyError:
892 except KeyError:
893 pass
893 pass
894 else:
894 else:
895 printer(obj)
895 printer(obj)
896 return True
896 return True
897 # Finally look for special method names
897 # Finally look for special method names
898 method = _safe_get_formatter_method(obj, self.print_method)
898 method = _safe_get_formatter_method(obj, self.print_method)
899 if method is not None:
899 if method is not None:
900 method()
900 method()
901 return True
901 return True
902
902
903
903
904 FormatterABC.register(BaseFormatter)
904 FormatterABC.register(BaseFormatter)
905 FormatterABC.register(PlainTextFormatter)
905 FormatterABC.register(PlainTextFormatter)
906 FormatterABC.register(HTMLFormatter)
906 FormatterABC.register(HTMLFormatter)
907 FormatterABC.register(MarkdownFormatter)
907 FormatterABC.register(MarkdownFormatter)
908 FormatterABC.register(SVGFormatter)
908 FormatterABC.register(SVGFormatter)
909 FormatterABC.register(PNGFormatter)
909 FormatterABC.register(PNGFormatter)
910 FormatterABC.register(PDFFormatter)
910 FormatterABC.register(PDFFormatter)
911 FormatterABC.register(JPEGFormatter)
911 FormatterABC.register(JPEGFormatter)
912 FormatterABC.register(LatexFormatter)
912 FormatterABC.register(LatexFormatter)
913 FormatterABC.register(JSONFormatter)
913 FormatterABC.register(JSONFormatter)
914 FormatterABC.register(JavascriptFormatter)
914 FormatterABC.register(JavascriptFormatter)
915 FormatterABC.register(IPythonDisplayFormatter)
915 FormatterABC.register(IPythonDisplayFormatter)
916
916
917
917
918 def format_display_data(obj, include=None, exclude=None):
918 def format_display_data(obj, include=None, exclude=None):
919 """Return a format data dict for an object.
919 """Return a format data dict for an object.
920
920
921 By default all format types will be computed.
921 By default all format types will be computed.
922
922
923 The following MIME types are currently implemented:
923 The following MIME types are currently implemented:
924
924
925 * text/plain
925 * text/plain
926 * text/html
926 * text/html
927 * text/markdown
927 * text/markdown
928 * text/latex
928 * text/latex
929 * application/json
929 * application/json
930 * application/javascript
930 * application/javascript
931 * application/pdf
931 * application/pdf
932 * image/png
932 * image/png
933 * image/jpeg
933 * image/jpeg
934 * image/svg+xml
934 * image/svg+xml
935
935
936 Parameters
936 Parameters
937 ----------
937 ----------
938 obj : object
938 obj : object
939 The Python object whose format data will be computed.
939 The Python object whose format data will be computed.
940
940
941 Returns
941 Returns
942 -------
942 -------
943 format_dict : dict
943 format_dict : dict
944 A dictionary of key/value pairs, one or each format that was
944 A dictionary of key/value pairs, one or each format that was
945 generated for the object. The keys are the format types, which
945 generated for the object. The keys are the format types, which
946 will usually be MIME type strings and the values and JSON'able
946 will usually be MIME type strings and the values and JSON'able
947 data structure containing the raw data for the representation in
947 data structure containing the raw data for the representation in
948 that format.
948 that format.
949 include : list or tuple, optional
949 include : list or tuple, optional
950 A list of format type strings (MIME types) to include in the
950 A list of format type strings (MIME types) to include in the
951 format data dict. If this is set *only* the format types included
951 format data dict. If this is set *only* the format types included
952 in this list will be computed.
952 in this list will be computed.
953 exclude : list or tuple, optional
953 exclude : list or tuple, optional
954 A list of format type string (MIME types) to exclue in the format
954 A list of format type string (MIME types) to exclue in the format
955 data dict. If this is set all format types will be computed,
955 data dict. If this is set all format types will be computed,
956 except for those included in this argument.
956 except for those included in this argument.
957 """
957 """
958 from IPython.core.interactiveshell import InteractiveShell
958 from IPython.core.interactiveshell import InteractiveShell
959
959
960 InteractiveShell.instance().display_formatter.format(
960 InteractiveShell.instance().display_formatter.format(
961 obj,
961 obj,
962 include,
962 include,
963 exclude
963 exclude
964 )
964 )
965
965
@@ -1,870 +1,870 b''
1 """ History related magics and functionality """
1 """ History related magics and functionality """
2 #-----------------------------------------------------------------------------
2 #-----------------------------------------------------------------------------
3 # Copyright (C) 2010-2011 The IPython Development Team.
3 # Copyright (C) 2010-2011 The IPython Development Team.
4 #
4 #
5 # Distributed under the terms of the BSD License.
5 # Distributed under the terms of the BSD License.
6 #
6 #
7 # The full license is in the file COPYING.txt, distributed with this software.
7 # The full license is in the file COPYING.txt, distributed with this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Imports
11 # Imports
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 from __future__ import print_function
13 from __future__ import print_function
14
14
15 # Stdlib imports
15 # Stdlib imports
16 import atexit
16 import atexit
17 import datetime
17 import datetime
18 import os
18 import os
19 import re
19 import re
20 try:
20 try:
21 import sqlite3
21 import sqlite3
22 except ImportError:
22 except ImportError:
23 try:
23 try:
24 from pysqlite2 import dbapi2 as sqlite3
24 from pysqlite2 import dbapi2 as sqlite3
25 except ImportError:
25 except ImportError:
26 sqlite3 = None
26 sqlite3 = None
27 import threading
27 import threading
28
28
29 # Our own packages
29 # Our own packages
30 from IPython.config.configurable import Configurable
30 from IPython.config.configurable import Configurable
31 from IPython.external.decorator import decorator
31 from decorator import decorator
32 from IPython.utils.decorators import undoc
32 from IPython.utils.decorators import undoc
33 from IPython.utils.path import locate_profile
33 from IPython.utils.path import locate_profile
34 from IPython.utils import py3compat
34 from IPython.utils import py3compat
35 from IPython.utils.traitlets import (
35 from IPython.utils.traitlets import (
36 Any, Bool, Dict, Instance, Integer, List, Unicode, TraitError,
36 Any, Bool, Dict, Instance, Integer, List, Unicode, TraitError,
37 )
37 )
38 from IPython.utils.warn import warn
38 from IPython.utils.warn import warn
39
39
40 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
41 # Classes and functions
41 # Classes and functions
42 #-----------------------------------------------------------------------------
42 #-----------------------------------------------------------------------------
43
43
44 @undoc
44 @undoc
45 class DummyDB(object):
45 class DummyDB(object):
46 """Dummy DB that will act as a black hole for history.
46 """Dummy DB that will act as a black hole for history.
47
47
48 Only used in the absence of sqlite"""
48 Only used in the absence of sqlite"""
49 def execute(*args, **kwargs):
49 def execute(*args, **kwargs):
50 return []
50 return []
51
51
52 def commit(self, *args, **kwargs):
52 def commit(self, *args, **kwargs):
53 pass
53 pass
54
54
55 def __enter__(self, *args, **kwargs):
55 def __enter__(self, *args, **kwargs):
56 pass
56 pass
57
57
58 def __exit__(self, *args, **kwargs):
58 def __exit__(self, *args, **kwargs):
59 pass
59 pass
60
60
61
61
62 @decorator
62 @decorator
63 def needs_sqlite(f, self, *a, **kw):
63 def needs_sqlite(f, self, *a, **kw):
64 """Decorator: return an empty list in the absence of sqlite."""
64 """Decorator: return an empty list in the absence of sqlite."""
65 if sqlite3 is None or not self.enabled:
65 if sqlite3 is None or not self.enabled:
66 return []
66 return []
67 else:
67 else:
68 return f(self, *a, **kw)
68 return f(self, *a, **kw)
69
69
70
70
71 if sqlite3 is not None:
71 if sqlite3 is not None:
72 DatabaseError = sqlite3.DatabaseError
72 DatabaseError = sqlite3.DatabaseError
73 else:
73 else:
74 @undoc
74 @undoc
75 class DatabaseError(Exception):
75 class DatabaseError(Exception):
76 "Dummy exception when sqlite could not be imported. Should never occur."
76 "Dummy exception when sqlite could not be imported. Should never occur."
77
77
78 @decorator
78 @decorator
79 def catch_corrupt_db(f, self, *a, **kw):
79 def catch_corrupt_db(f, self, *a, **kw):
80 """A decorator which wraps HistoryAccessor method calls to catch errors from
80 """A decorator which wraps HistoryAccessor method calls to catch errors from
81 a corrupt SQLite database, move the old database out of the way, and create
81 a corrupt SQLite database, move the old database out of the way, and create
82 a new one.
82 a new one.
83 """
83 """
84 try:
84 try:
85 return f(self, *a, **kw)
85 return f(self, *a, **kw)
86 except DatabaseError:
86 except DatabaseError:
87 if os.path.isfile(self.hist_file):
87 if os.path.isfile(self.hist_file):
88 # Try to move the file out of the way
88 # Try to move the file out of the way
89 base,ext = os.path.splitext(self.hist_file)
89 base,ext = os.path.splitext(self.hist_file)
90 newpath = base + '-corrupt' + ext
90 newpath = base + '-corrupt' + ext
91 os.rename(self.hist_file, newpath)
91 os.rename(self.hist_file, newpath)
92 self.init_db()
92 self.init_db()
93 print("ERROR! History file wasn't a valid SQLite database.",
93 print("ERROR! History file wasn't a valid SQLite database.",
94 "It was moved to %s" % newpath, "and a new file created.")
94 "It was moved to %s" % newpath, "and a new file created.")
95 return []
95 return []
96
96
97 else:
97 else:
98 # The hist_file is probably :memory: or something else.
98 # The hist_file is probably :memory: or something else.
99 raise
99 raise
100
100
101 class HistoryAccessorBase(Configurable):
101 class HistoryAccessorBase(Configurable):
102 """An abstract class for History Accessors """
102 """An abstract class for History Accessors """
103
103
104 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
104 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
105 raise NotImplementedError
105 raise NotImplementedError
106
106
107 def search(self, pattern="*", raw=True, search_raw=True,
107 def search(self, pattern="*", raw=True, search_raw=True,
108 output=False, n=None, unique=False):
108 output=False, n=None, unique=False):
109 raise NotImplementedError
109 raise NotImplementedError
110
110
111 def get_range(self, session, start=1, stop=None, raw=True,output=False):
111 def get_range(self, session, start=1, stop=None, raw=True,output=False):
112 raise NotImplementedError
112 raise NotImplementedError
113
113
114 def get_range_by_str(self, rangestr, raw=True, output=False):
114 def get_range_by_str(self, rangestr, raw=True, output=False):
115 raise NotImplementedError
115 raise NotImplementedError
116
116
117
117
118 class HistoryAccessor(HistoryAccessorBase):
118 class HistoryAccessor(HistoryAccessorBase):
119 """Access the history database without adding to it.
119 """Access the history database without adding to it.
120
120
121 This is intended for use by standalone history tools. IPython shells use
121 This is intended for use by standalone history tools. IPython shells use
122 HistoryManager, below, which is a subclass of this."""
122 HistoryManager, below, which is a subclass of this."""
123
123
124 # String holding the path to the history file
124 # String holding the path to the history file
125 hist_file = Unicode(config=True,
125 hist_file = Unicode(config=True,
126 help="""Path to file to use for SQLite history database.
126 help="""Path to file to use for SQLite history database.
127
127
128 By default, IPython will put the history database in the IPython
128 By default, IPython will put the history database in the IPython
129 profile directory. If you would rather share one history among
129 profile directory. If you would rather share one history among
130 profiles, you can set this value in each, so that they are consistent.
130 profiles, you can set this value in each, so that they are consistent.
131
131
132 Due to an issue with fcntl, SQLite is known to misbehave on some NFS
132 Due to an issue with fcntl, SQLite is known to misbehave on some NFS
133 mounts. If you see IPython hanging, try setting this to something on a
133 mounts. If you see IPython hanging, try setting this to something on a
134 local disk, e.g::
134 local disk, e.g::
135
135
136 ipython --HistoryManager.hist_file=/tmp/ipython_hist.sqlite
136 ipython --HistoryManager.hist_file=/tmp/ipython_hist.sqlite
137
137
138 """)
138 """)
139
139
140 enabled = Bool(True, config=True,
140 enabled = Bool(True, config=True,
141 help="""enable the SQLite history
141 help="""enable the SQLite history
142
142
143 set enabled=False to disable the SQLite history,
143 set enabled=False to disable the SQLite history,
144 in which case there will be no stored history, no SQLite connection,
144 in which case there will be no stored history, no SQLite connection,
145 and no background saving thread. This may be necessary in some
145 and no background saving thread. This may be necessary in some
146 threaded environments where IPython is embedded.
146 threaded environments where IPython is embedded.
147 """
147 """
148 )
148 )
149
149
150 connection_options = Dict(config=True,
150 connection_options = Dict(config=True,
151 help="""Options for configuring the SQLite connection
151 help="""Options for configuring the SQLite connection
152
152
153 These options are passed as keyword args to sqlite3.connect
153 These options are passed as keyword args to sqlite3.connect
154 when establishing database conenctions.
154 when establishing database conenctions.
155 """
155 """
156 )
156 )
157
157
158 # The SQLite database
158 # The SQLite database
159 db = Any()
159 db = Any()
160 def _db_changed(self, name, old, new):
160 def _db_changed(self, name, old, new):
161 """validate the db, since it can be an Instance of two different types"""
161 """validate the db, since it can be an Instance of two different types"""
162 connection_types = (DummyDB,)
162 connection_types = (DummyDB,)
163 if sqlite3 is not None:
163 if sqlite3 is not None:
164 connection_types = (DummyDB, sqlite3.Connection)
164 connection_types = (DummyDB, sqlite3.Connection)
165 if not isinstance(new, connection_types):
165 if not isinstance(new, connection_types):
166 msg = "%s.db must be sqlite3 Connection or DummyDB, not %r" % \
166 msg = "%s.db must be sqlite3 Connection or DummyDB, not %r" % \
167 (self.__class__.__name__, new)
167 (self.__class__.__name__, new)
168 raise TraitError(msg)
168 raise TraitError(msg)
169
169
170 def __init__(self, profile='default', hist_file=u'', **traits):
170 def __init__(self, profile='default', hist_file=u'', **traits):
171 """Create a new history accessor.
171 """Create a new history accessor.
172
172
173 Parameters
173 Parameters
174 ----------
174 ----------
175 profile : str
175 profile : str
176 The name of the profile from which to open history.
176 The name of the profile from which to open history.
177 hist_file : str
177 hist_file : str
178 Path to an SQLite history database stored by IPython. If specified,
178 Path to an SQLite history database stored by IPython. If specified,
179 hist_file overrides profile.
179 hist_file overrides profile.
180 config : :class:`~IPython.config.loader.Config`
180 config : :class:`~IPython.config.loader.Config`
181 Config object. hist_file can also be set through this.
181 Config object. hist_file can also be set through this.
182 """
182 """
183 # We need a pointer back to the shell for various tasks.
183 # We need a pointer back to the shell for various tasks.
184 super(HistoryAccessor, self).__init__(**traits)
184 super(HistoryAccessor, self).__init__(**traits)
185 # defer setting hist_file from kwarg until after init,
185 # defer setting hist_file from kwarg until after init,
186 # otherwise the default kwarg value would clobber any value
186 # otherwise the default kwarg value would clobber any value
187 # set by config
187 # set by config
188 if hist_file:
188 if hist_file:
189 self.hist_file = hist_file
189 self.hist_file = hist_file
190
190
191 if self.hist_file == u'':
191 if self.hist_file == u'':
192 # No one has set the hist_file, yet.
192 # No one has set the hist_file, yet.
193 self.hist_file = self._get_hist_file_name(profile)
193 self.hist_file = self._get_hist_file_name(profile)
194
194
195 if sqlite3 is None and self.enabled:
195 if sqlite3 is None and self.enabled:
196 warn("IPython History requires SQLite, your history will not be saved")
196 warn("IPython History requires SQLite, your history will not be saved")
197 self.enabled = False
197 self.enabled = False
198
198
199 self.init_db()
199 self.init_db()
200
200
201 def _get_hist_file_name(self, profile='default'):
201 def _get_hist_file_name(self, profile='default'):
202 """Find the history file for the given profile name.
202 """Find the history file for the given profile name.
203
203
204 This is overridden by the HistoryManager subclass, to use the shell's
204 This is overridden by the HistoryManager subclass, to use the shell's
205 active profile.
205 active profile.
206
206
207 Parameters
207 Parameters
208 ----------
208 ----------
209 profile : str
209 profile : str
210 The name of a profile which has a history file.
210 The name of a profile which has a history file.
211 """
211 """
212 return os.path.join(locate_profile(profile), 'history.sqlite')
212 return os.path.join(locate_profile(profile), 'history.sqlite')
213
213
214 @catch_corrupt_db
214 @catch_corrupt_db
215 def init_db(self):
215 def init_db(self):
216 """Connect to the database, and create tables if necessary."""
216 """Connect to the database, and create tables if necessary."""
217 if not self.enabled:
217 if not self.enabled:
218 self.db = DummyDB()
218 self.db = DummyDB()
219 return
219 return
220
220
221 # use detect_types so that timestamps return datetime objects
221 # use detect_types so that timestamps return datetime objects
222 kwargs = dict(detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
222 kwargs = dict(detect_types=sqlite3.PARSE_DECLTYPES|sqlite3.PARSE_COLNAMES)
223 kwargs.update(self.connection_options)
223 kwargs.update(self.connection_options)
224 self.db = sqlite3.connect(self.hist_file, **kwargs)
224 self.db = sqlite3.connect(self.hist_file, **kwargs)
225 self.db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
225 self.db.execute("""CREATE TABLE IF NOT EXISTS sessions (session integer
226 primary key autoincrement, start timestamp,
226 primary key autoincrement, start timestamp,
227 end timestamp, num_cmds integer, remark text)""")
227 end timestamp, num_cmds integer, remark text)""")
228 self.db.execute("""CREATE TABLE IF NOT EXISTS history
228 self.db.execute("""CREATE TABLE IF NOT EXISTS history
229 (session integer, line integer, source text, source_raw text,
229 (session integer, line integer, source text, source_raw text,
230 PRIMARY KEY (session, line))""")
230 PRIMARY KEY (session, line))""")
231 # Output history is optional, but ensure the table's there so it can be
231 # Output history is optional, but ensure the table's there so it can be
232 # enabled later.
232 # enabled later.
233 self.db.execute("""CREATE TABLE IF NOT EXISTS output_history
233 self.db.execute("""CREATE TABLE IF NOT EXISTS output_history
234 (session integer, line integer, output text,
234 (session integer, line integer, output text,
235 PRIMARY KEY (session, line))""")
235 PRIMARY KEY (session, line))""")
236 self.db.commit()
236 self.db.commit()
237
237
238 def writeout_cache(self):
238 def writeout_cache(self):
239 """Overridden by HistoryManager to dump the cache before certain
239 """Overridden by HistoryManager to dump the cache before certain
240 database lookups."""
240 database lookups."""
241 pass
241 pass
242
242
243 ## -------------------------------
243 ## -------------------------------
244 ## Methods for retrieving history:
244 ## Methods for retrieving history:
245 ## -------------------------------
245 ## -------------------------------
246 def _run_sql(self, sql, params, raw=True, output=False):
246 def _run_sql(self, sql, params, raw=True, output=False):
247 """Prepares and runs an SQL query for the history database.
247 """Prepares and runs an SQL query for the history database.
248
248
249 Parameters
249 Parameters
250 ----------
250 ----------
251 sql : str
251 sql : str
252 Any filtering expressions to go after SELECT ... FROM ...
252 Any filtering expressions to go after SELECT ... FROM ...
253 params : tuple
253 params : tuple
254 Parameters passed to the SQL query (to replace "?")
254 Parameters passed to the SQL query (to replace "?")
255 raw, output : bool
255 raw, output : bool
256 See :meth:`get_range`
256 See :meth:`get_range`
257
257
258 Returns
258 Returns
259 -------
259 -------
260 Tuples as :meth:`get_range`
260 Tuples as :meth:`get_range`
261 """
261 """
262 toget = 'source_raw' if raw else 'source'
262 toget = 'source_raw' if raw else 'source'
263 sqlfrom = "history"
263 sqlfrom = "history"
264 if output:
264 if output:
265 sqlfrom = "history LEFT JOIN output_history USING (session, line)"
265 sqlfrom = "history LEFT JOIN output_history USING (session, line)"
266 toget = "history.%s, output_history.output" % toget
266 toget = "history.%s, output_history.output" % toget
267 cur = self.db.execute("SELECT session, line, %s FROM %s " %\
267 cur = self.db.execute("SELECT session, line, %s FROM %s " %\
268 (toget, sqlfrom) + sql, params)
268 (toget, sqlfrom) + sql, params)
269 if output: # Regroup into 3-tuples, and parse JSON
269 if output: # Regroup into 3-tuples, and parse JSON
270 return ((ses, lin, (inp, out)) for ses, lin, inp, out in cur)
270 return ((ses, lin, (inp, out)) for ses, lin, inp, out in cur)
271 return cur
271 return cur
272
272
273 @needs_sqlite
273 @needs_sqlite
274 @catch_corrupt_db
274 @catch_corrupt_db
275 def get_session_info(self, session):
275 def get_session_info(self, session):
276 """Get info about a session.
276 """Get info about a session.
277
277
278 Parameters
278 Parameters
279 ----------
279 ----------
280
280
281 session : int
281 session : int
282 Session number to retrieve.
282 Session number to retrieve.
283
283
284 Returns
284 Returns
285 -------
285 -------
286
286
287 session_id : int
287 session_id : int
288 Session ID number
288 Session ID number
289 start : datetime
289 start : datetime
290 Timestamp for the start of the session.
290 Timestamp for the start of the session.
291 end : datetime
291 end : datetime
292 Timestamp for the end of the session, or None if IPython crashed.
292 Timestamp for the end of the session, or None if IPython crashed.
293 num_cmds : int
293 num_cmds : int
294 Number of commands run, or None if IPython crashed.
294 Number of commands run, or None if IPython crashed.
295 remark : unicode
295 remark : unicode
296 A manually set description.
296 A manually set description.
297 """
297 """
298 query = "SELECT * from sessions where session == ?"
298 query = "SELECT * from sessions where session == ?"
299 return self.db.execute(query, (session,)).fetchone()
299 return self.db.execute(query, (session,)).fetchone()
300
300
301 @catch_corrupt_db
301 @catch_corrupt_db
302 def get_last_session_id(self):
302 def get_last_session_id(self):
303 """Get the last session ID currently in the database.
303 """Get the last session ID currently in the database.
304
304
305 Within IPython, this should be the same as the value stored in
305 Within IPython, this should be the same as the value stored in
306 :attr:`HistoryManager.session_number`.
306 :attr:`HistoryManager.session_number`.
307 """
307 """
308 for record in self.get_tail(n=1, include_latest=True):
308 for record in self.get_tail(n=1, include_latest=True):
309 return record[0]
309 return record[0]
310
310
311 @catch_corrupt_db
311 @catch_corrupt_db
312 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
312 def get_tail(self, n=10, raw=True, output=False, include_latest=False):
313 """Get the last n lines from the history database.
313 """Get the last n lines from the history database.
314
314
315 Parameters
315 Parameters
316 ----------
316 ----------
317 n : int
317 n : int
318 The number of lines to get
318 The number of lines to get
319 raw, output : bool
319 raw, output : bool
320 See :meth:`get_range`
320 See :meth:`get_range`
321 include_latest : bool
321 include_latest : bool
322 If False (default), n+1 lines are fetched, and the latest one
322 If False (default), n+1 lines are fetched, and the latest one
323 is discarded. This is intended to be used where the function
323 is discarded. This is intended to be used where the function
324 is called by a user command, which it should not return.
324 is called by a user command, which it should not return.
325
325
326 Returns
326 Returns
327 -------
327 -------
328 Tuples as :meth:`get_range`
328 Tuples as :meth:`get_range`
329 """
329 """
330 self.writeout_cache()
330 self.writeout_cache()
331 if not include_latest:
331 if not include_latest:
332 n += 1
332 n += 1
333 cur = self._run_sql("ORDER BY session DESC, line DESC LIMIT ?",
333 cur = self._run_sql("ORDER BY session DESC, line DESC LIMIT ?",
334 (n,), raw=raw, output=output)
334 (n,), raw=raw, output=output)
335 if not include_latest:
335 if not include_latest:
336 return reversed(list(cur)[1:])
336 return reversed(list(cur)[1:])
337 return reversed(list(cur))
337 return reversed(list(cur))
338
338
339 @catch_corrupt_db
339 @catch_corrupt_db
340 def search(self, pattern="*", raw=True, search_raw=True,
340 def search(self, pattern="*", raw=True, search_raw=True,
341 output=False, n=None, unique=False):
341 output=False, n=None, unique=False):
342 """Search the database using unix glob-style matching (wildcards
342 """Search the database using unix glob-style matching (wildcards
343 * and ?).
343 * and ?).
344
344
345 Parameters
345 Parameters
346 ----------
346 ----------
347 pattern : str
347 pattern : str
348 The wildcarded pattern to match when searching
348 The wildcarded pattern to match when searching
349 search_raw : bool
349 search_raw : bool
350 If True, search the raw input, otherwise, the parsed input
350 If True, search the raw input, otherwise, the parsed input
351 raw, output : bool
351 raw, output : bool
352 See :meth:`get_range`
352 See :meth:`get_range`
353 n : None or int
353 n : None or int
354 If an integer is given, it defines the limit of
354 If an integer is given, it defines the limit of
355 returned entries.
355 returned entries.
356 unique : bool
356 unique : bool
357 When it is true, return only unique entries.
357 When it is true, return only unique entries.
358
358
359 Returns
359 Returns
360 -------
360 -------
361 Tuples as :meth:`get_range`
361 Tuples as :meth:`get_range`
362 """
362 """
363 tosearch = "source_raw" if search_raw else "source"
363 tosearch = "source_raw" if search_raw else "source"
364 if output:
364 if output:
365 tosearch = "history." + tosearch
365 tosearch = "history." + tosearch
366 self.writeout_cache()
366 self.writeout_cache()
367 sqlform = "WHERE %s GLOB ?" % tosearch
367 sqlform = "WHERE %s GLOB ?" % tosearch
368 params = (pattern,)
368 params = (pattern,)
369 if unique:
369 if unique:
370 sqlform += ' GROUP BY {0}'.format(tosearch)
370 sqlform += ' GROUP BY {0}'.format(tosearch)
371 if n is not None:
371 if n is not None:
372 sqlform += " ORDER BY session DESC, line DESC LIMIT ?"
372 sqlform += " ORDER BY session DESC, line DESC LIMIT ?"
373 params += (n,)
373 params += (n,)
374 elif unique:
374 elif unique:
375 sqlform += " ORDER BY session, line"
375 sqlform += " ORDER BY session, line"
376 cur = self._run_sql(sqlform, params, raw=raw, output=output)
376 cur = self._run_sql(sqlform, params, raw=raw, output=output)
377 if n is not None:
377 if n is not None:
378 return reversed(list(cur))
378 return reversed(list(cur))
379 return cur
379 return cur
380
380
381 @catch_corrupt_db
381 @catch_corrupt_db
382 def get_range(self, session, start=1, stop=None, raw=True,output=False):
382 def get_range(self, session, start=1, stop=None, raw=True,output=False):
383 """Retrieve input by session.
383 """Retrieve input by session.
384
384
385 Parameters
385 Parameters
386 ----------
386 ----------
387 session : int
387 session : int
388 Session number to retrieve.
388 Session number to retrieve.
389 start : int
389 start : int
390 First line to retrieve.
390 First line to retrieve.
391 stop : int
391 stop : int
392 End of line range (excluded from output itself). If None, retrieve
392 End of line range (excluded from output itself). If None, retrieve
393 to the end of the session.
393 to the end of the session.
394 raw : bool
394 raw : bool
395 If True, return untranslated input
395 If True, return untranslated input
396 output : bool
396 output : bool
397 If True, attempt to include output. This will be 'real' Python
397 If True, attempt to include output. This will be 'real' Python
398 objects for the current session, or text reprs from previous
398 objects for the current session, or text reprs from previous
399 sessions if db_log_output was enabled at the time. Where no output
399 sessions if db_log_output was enabled at the time. Where no output
400 is found, None is used.
400 is found, None is used.
401
401
402 Returns
402 Returns
403 -------
403 -------
404 entries
404 entries
405 An iterator over the desired lines. Each line is a 3-tuple, either
405 An iterator over the desired lines. Each line is a 3-tuple, either
406 (session, line, input) if output is False, or
406 (session, line, input) if output is False, or
407 (session, line, (input, output)) if output is True.
407 (session, line, (input, output)) if output is True.
408 """
408 """
409 if stop:
409 if stop:
410 lineclause = "line >= ? AND line < ?"
410 lineclause = "line >= ? AND line < ?"
411 params = (session, start, stop)
411 params = (session, start, stop)
412 else:
412 else:
413 lineclause = "line>=?"
413 lineclause = "line>=?"
414 params = (session, start)
414 params = (session, start)
415
415
416 return self._run_sql("WHERE session==? AND %s" % lineclause,
416 return self._run_sql("WHERE session==? AND %s" % lineclause,
417 params, raw=raw, output=output)
417 params, raw=raw, output=output)
418
418
419 def get_range_by_str(self, rangestr, raw=True, output=False):
419 def get_range_by_str(self, rangestr, raw=True, output=False):
420 """Get lines of history from a string of ranges, as used by magic
420 """Get lines of history from a string of ranges, as used by magic
421 commands %hist, %save, %macro, etc.
421 commands %hist, %save, %macro, etc.
422
422
423 Parameters
423 Parameters
424 ----------
424 ----------
425 rangestr : str
425 rangestr : str
426 A string specifying ranges, e.g. "5 ~2/1-4". See
426 A string specifying ranges, e.g. "5 ~2/1-4". See
427 :func:`magic_history` for full details.
427 :func:`magic_history` for full details.
428 raw, output : bool
428 raw, output : bool
429 As :meth:`get_range`
429 As :meth:`get_range`
430
430
431 Returns
431 Returns
432 -------
432 -------
433 Tuples as :meth:`get_range`
433 Tuples as :meth:`get_range`
434 """
434 """
435 for sess, s, e in extract_hist_ranges(rangestr):
435 for sess, s, e in extract_hist_ranges(rangestr):
436 for line in self.get_range(sess, s, e, raw=raw, output=output):
436 for line in self.get_range(sess, s, e, raw=raw, output=output):
437 yield line
437 yield line
438
438
439
439
440 class HistoryManager(HistoryAccessor):
440 class HistoryManager(HistoryAccessor):
441 """A class to organize all history-related functionality in one place.
441 """A class to organize all history-related functionality in one place.
442 """
442 """
443 # Public interface
443 # Public interface
444
444
445 # An instance of the IPython shell we are attached to
445 # An instance of the IPython shell we are attached to
446 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
446 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
447 # Lists to hold processed and raw history. These start with a blank entry
447 # Lists to hold processed and raw history. These start with a blank entry
448 # so that we can index them starting from 1
448 # so that we can index them starting from 1
449 input_hist_parsed = List([""])
449 input_hist_parsed = List([""])
450 input_hist_raw = List([""])
450 input_hist_raw = List([""])
451 # A list of directories visited during session
451 # A list of directories visited during session
452 dir_hist = List()
452 dir_hist = List()
453 def _dir_hist_default(self):
453 def _dir_hist_default(self):
454 try:
454 try:
455 return [py3compat.getcwd()]
455 return [py3compat.getcwd()]
456 except OSError:
456 except OSError:
457 return []
457 return []
458
458
459 # A dict of output history, keyed with ints from the shell's
459 # A dict of output history, keyed with ints from the shell's
460 # execution count.
460 # execution count.
461 output_hist = Dict()
461 output_hist = Dict()
462 # The text/plain repr of outputs.
462 # The text/plain repr of outputs.
463 output_hist_reprs = Dict()
463 output_hist_reprs = Dict()
464
464
465 # The number of the current session in the history database
465 # The number of the current session in the history database
466 session_number = Integer()
466 session_number = Integer()
467
467
468 db_log_output = Bool(False, config=True,
468 db_log_output = Bool(False, config=True,
469 help="Should the history database include output? (default: no)"
469 help="Should the history database include output? (default: no)"
470 )
470 )
471 db_cache_size = Integer(0, config=True,
471 db_cache_size = Integer(0, config=True,
472 help="Write to database every x commands (higher values save disk access & power).\n"
472 help="Write to database every x commands (higher values save disk access & power).\n"
473 "Values of 1 or less effectively disable caching."
473 "Values of 1 or less effectively disable caching."
474 )
474 )
475 # The input and output caches
475 # The input and output caches
476 db_input_cache = List()
476 db_input_cache = List()
477 db_output_cache = List()
477 db_output_cache = List()
478
478
479 # History saving in separate thread
479 # History saving in separate thread
480 save_thread = Instance('IPython.core.history.HistorySavingThread')
480 save_thread = Instance('IPython.core.history.HistorySavingThread')
481 try: # Event is a function returning an instance of _Event...
481 try: # Event is a function returning an instance of _Event...
482 save_flag = Instance(threading._Event)
482 save_flag = Instance(threading._Event)
483 except AttributeError: # ...until Python 3.3, when it's a class.
483 except AttributeError: # ...until Python 3.3, when it's a class.
484 save_flag = Instance(threading.Event)
484 save_flag = Instance(threading.Event)
485
485
486 # Private interface
486 # Private interface
487 # Variables used to store the three last inputs from the user. On each new
487 # Variables used to store the three last inputs from the user. On each new
488 # history update, we populate the user's namespace with these, shifted as
488 # history update, we populate the user's namespace with these, shifted as
489 # necessary.
489 # necessary.
490 _i00 = Unicode(u'')
490 _i00 = Unicode(u'')
491 _i = Unicode(u'')
491 _i = Unicode(u'')
492 _ii = Unicode(u'')
492 _ii = Unicode(u'')
493 _iii = Unicode(u'')
493 _iii = Unicode(u'')
494
494
495 # A regex matching all forms of the exit command, so that we don't store
495 # A regex matching all forms of the exit command, so that we don't store
496 # them in the history (it's annoying to rewind the first entry and land on
496 # them in the history (it's annoying to rewind the first entry and land on
497 # an exit call).
497 # an exit call).
498 _exit_re = re.compile(r"(exit|quit)(\s*\(.*\))?$")
498 _exit_re = re.compile(r"(exit|quit)(\s*\(.*\))?$")
499
499
500 def __init__(self, shell=None, config=None, **traits):
500 def __init__(self, shell=None, config=None, **traits):
501 """Create a new history manager associated with a shell instance.
501 """Create a new history manager associated with a shell instance.
502 """
502 """
503 # We need a pointer back to the shell for various tasks.
503 # We need a pointer back to the shell for various tasks.
504 super(HistoryManager, self).__init__(shell=shell, config=config,
504 super(HistoryManager, self).__init__(shell=shell, config=config,
505 **traits)
505 **traits)
506 self.save_flag = threading.Event()
506 self.save_flag = threading.Event()
507 self.db_input_cache_lock = threading.Lock()
507 self.db_input_cache_lock = threading.Lock()
508 self.db_output_cache_lock = threading.Lock()
508 self.db_output_cache_lock = threading.Lock()
509 if self.enabled and self.hist_file != ':memory:':
509 if self.enabled and self.hist_file != ':memory:':
510 self.save_thread = HistorySavingThread(self)
510 self.save_thread = HistorySavingThread(self)
511 self.save_thread.start()
511 self.save_thread.start()
512
512
513 self.new_session()
513 self.new_session()
514
514
515 def _get_hist_file_name(self, profile=None):
515 def _get_hist_file_name(self, profile=None):
516 """Get default history file name based on the Shell's profile.
516 """Get default history file name based on the Shell's profile.
517
517
518 The profile parameter is ignored, but must exist for compatibility with
518 The profile parameter is ignored, but must exist for compatibility with
519 the parent class."""
519 the parent class."""
520 profile_dir = self.shell.profile_dir.location
520 profile_dir = self.shell.profile_dir.location
521 return os.path.join(profile_dir, 'history.sqlite')
521 return os.path.join(profile_dir, 'history.sqlite')
522
522
523 @needs_sqlite
523 @needs_sqlite
524 def new_session(self, conn=None):
524 def new_session(self, conn=None):
525 """Get a new session number."""
525 """Get a new session number."""
526 if conn is None:
526 if conn is None:
527 conn = self.db
527 conn = self.db
528
528
529 with conn:
529 with conn:
530 cur = conn.execute("""INSERT INTO sessions VALUES (NULL, ?, NULL,
530 cur = conn.execute("""INSERT INTO sessions VALUES (NULL, ?, NULL,
531 NULL, "") """, (datetime.datetime.now(),))
531 NULL, "") """, (datetime.datetime.now(),))
532 self.session_number = cur.lastrowid
532 self.session_number = cur.lastrowid
533
533
534 def end_session(self):
534 def end_session(self):
535 """Close the database session, filling in the end time and line count."""
535 """Close the database session, filling in the end time and line count."""
536 self.writeout_cache()
536 self.writeout_cache()
537 with self.db:
537 with self.db:
538 self.db.execute("""UPDATE sessions SET end=?, num_cmds=? WHERE
538 self.db.execute("""UPDATE sessions SET end=?, num_cmds=? WHERE
539 session==?""", (datetime.datetime.now(),
539 session==?""", (datetime.datetime.now(),
540 len(self.input_hist_parsed)-1, self.session_number))
540 len(self.input_hist_parsed)-1, self.session_number))
541 self.session_number = 0
541 self.session_number = 0
542
542
543 def name_session(self, name):
543 def name_session(self, name):
544 """Give the current session a name in the history database."""
544 """Give the current session a name in the history database."""
545 with self.db:
545 with self.db:
546 self.db.execute("UPDATE sessions SET remark=? WHERE session==?",
546 self.db.execute("UPDATE sessions SET remark=? WHERE session==?",
547 (name, self.session_number))
547 (name, self.session_number))
548
548
549 def reset(self, new_session=True):
549 def reset(self, new_session=True):
550 """Clear the session history, releasing all object references, and
550 """Clear the session history, releasing all object references, and
551 optionally open a new session."""
551 optionally open a new session."""
552 self.output_hist.clear()
552 self.output_hist.clear()
553 # The directory history can't be completely empty
553 # The directory history can't be completely empty
554 self.dir_hist[:] = [py3compat.getcwd()]
554 self.dir_hist[:] = [py3compat.getcwd()]
555
555
556 if new_session:
556 if new_session:
557 if self.session_number:
557 if self.session_number:
558 self.end_session()
558 self.end_session()
559 self.input_hist_parsed[:] = [""]
559 self.input_hist_parsed[:] = [""]
560 self.input_hist_raw[:] = [""]
560 self.input_hist_raw[:] = [""]
561 self.new_session()
561 self.new_session()
562
562
563 # ------------------------------
563 # ------------------------------
564 # Methods for retrieving history
564 # Methods for retrieving history
565 # ------------------------------
565 # ------------------------------
566 def get_session_info(self, session=0):
566 def get_session_info(self, session=0):
567 """Get info about a session.
567 """Get info about a session.
568
568
569 Parameters
569 Parameters
570 ----------
570 ----------
571
571
572 session : int
572 session : int
573 Session number to retrieve. The current session is 0, and negative
573 Session number to retrieve. The current session is 0, and negative
574 numbers count back from current session, so -1 is the previous session.
574 numbers count back from current session, so -1 is the previous session.
575
575
576 Returns
576 Returns
577 -------
577 -------
578
578
579 session_id : int
579 session_id : int
580 Session ID number
580 Session ID number
581 start : datetime
581 start : datetime
582 Timestamp for the start of the session.
582 Timestamp for the start of the session.
583 end : datetime
583 end : datetime
584 Timestamp for the end of the session, or None if IPython crashed.
584 Timestamp for the end of the session, or None if IPython crashed.
585 num_cmds : int
585 num_cmds : int
586 Number of commands run, or None if IPython crashed.
586 Number of commands run, or None if IPython crashed.
587 remark : unicode
587 remark : unicode
588 A manually set description.
588 A manually set description.
589 """
589 """
590 if session <= 0:
590 if session <= 0:
591 session += self.session_number
591 session += self.session_number
592
592
593 return super(HistoryManager, self).get_session_info(session=session)
593 return super(HistoryManager, self).get_session_info(session=session)
594
594
595 def _get_range_session(self, start=1, stop=None, raw=True, output=False):
595 def _get_range_session(self, start=1, stop=None, raw=True, output=False):
596 """Get input and output history from the current session. Called by
596 """Get input and output history from the current session. Called by
597 get_range, and takes similar parameters."""
597 get_range, and takes similar parameters."""
598 input_hist = self.input_hist_raw if raw else self.input_hist_parsed
598 input_hist = self.input_hist_raw if raw else self.input_hist_parsed
599
599
600 n = len(input_hist)
600 n = len(input_hist)
601 if start < 0:
601 if start < 0:
602 start += n
602 start += n
603 if not stop or (stop > n):
603 if not stop or (stop > n):
604 stop = n
604 stop = n
605 elif stop < 0:
605 elif stop < 0:
606 stop += n
606 stop += n
607
607
608 for i in range(start, stop):
608 for i in range(start, stop):
609 if output:
609 if output:
610 line = (input_hist[i], self.output_hist_reprs.get(i))
610 line = (input_hist[i], self.output_hist_reprs.get(i))
611 else:
611 else:
612 line = input_hist[i]
612 line = input_hist[i]
613 yield (0, i, line)
613 yield (0, i, line)
614
614
615 def get_range(self, session=0, start=1, stop=None, raw=True,output=False):
615 def get_range(self, session=0, start=1, stop=None, raw=True,output=False):
616 """Retrieve input by session.
616 """Retrieve input by session.
617
617
618 Parameters
618 Parameters
619 ----------
619 ----------
620 session : int
620 session : int
621 Session number to retrieve. The current session is 0, and negative
621 Session number to retrieve. The current session is 0, and negative
622 numbers count back from current session, so -1 is previous session.
622 numbers count back from current session, so -1 is previous session.
623 start : int
623 start : int
624 First line to retrieve.
624 First line to retrieve.
625 stop : int
625 stop : int
626 End of line range (excluded from output itself). If None, retrieve
626 End of line range (excluded from output itself). If None, retrieve
627 to the end of the session.
627 to the end of the session.
628 raw : bool
628 raw : bool
629 If True, return untranslated input
629 If True, return untranslated input
630 output : bool
630 output : bool
631 If True, attempt to include output. This will be 'real' Python
631 If True, attempt to include output. This will be 'real' Python
632 objects for the current session, or text reprs from previous
632 objects for the current session, or text reprs from previous
633 sessions if db_log_output was enabled at the time. Where no output
633 sessions if db_log_output was enabled at the time. Where no output
634 is found, None is used.
634 is found, None is used.
635
635
636 Returns
636 Returns
637 -------
637 -------
638 entries
638 entries
639 An iterator over the desired lines. Each line is a 3-tuple, either
639 An iterator over the desired lines. Each line is a 3-tuple, either
640 (session, line, input) if output is False, or
640 (session, line, input) if output is False, or
641 (session, line, (input, output)) if output is True.
641 (session, line, (input, output)) if output is True.
642 """
642 """
643 if session <= 0:
643 if session <= 0:
644 session += self.session_number
644 session += self.session_number
645 if session==self.session_number: # Current session
645 if session==self.session_number: # Current session
646 return self._get_range_session(start, stop, raw, output)
646 return self._get_range_session(start, stop, raw, output)
647 return super(HistoryManager, self).get_range(session, start, stop, raw,
647 return super(HistoryManager, self).get_range(session, start, stop, raw,
648 output)
648 output)
649
649
650 ## ----------------------------
650 ## ----------------------------
651 ## Methods for storing history:
651 ## Methods for storing history:
652 ## ----------------------------
652 ## ----------------------------
653 def store_inputs(self, line_num, source, source_raw=None):
653 def store_inputs(self, line_num, source, source_raw=None):
654 """Store source and raw input in history and create input cache
654 """Store source and raw input in history and create input cache
655 variables ``_i*``.
655 variables ``_i*``.
656
656
657 Parameters
657 Parameters
658 ----------
658 ----------
659 line_num : int
659 line_num : int
660 The prompt number of this input.
660 The prompt number of this input.
661
661
662 source : str
662 source : str
663 Python input.
663 Python input.
664
664
665 source_raw : str, optional
665 source_raw : str, optional
666 If given, this is the raw input without any IPython transformations
666 If given, this is the raw input without any IPython transformations
667 applied to it. If not given, ``source`` is used.
667 applied to it. If not given, ``source`` is used.
668 """
668 """
669 if source_raw is None:
669 if source_raw is None:
670 source_raw = source
670 source_raw = source
671 source = source.rstrip('\n')
671 source = source.rstrip('\n')
672 source_raw = source_raw.rstrip('\n')
672 source_raw = source_raw.rstrip('\n')
673
673
674 # do not store exit/quit commands
674 # do not store exit/quit commands
675 if self._exit_re.match(source_raw.strip()):
675 if self._exit_re.match(source_raw.strip()):
676 return
676 return
677
677
678 self.input_hist_parsed.append(source)
678 self.input_hist_parsed.append(source)
679 self.input_hist_raw.append(source_raw)
679 self.input_hist_raw.append(source_raw)
680
680
681 with self.db_input_cache_lock:
681 with self.db_input_cache_lock:
682 self.db_input_cache.append((line_num, source, source_raw))
682 self.db_input_cache.append((line_num, source, source_raw))
683 # Trigger to flush cache and write to DB.
683 # Trigger to flush cache and write to DB.
684 if len(self.db_input_cache) >= self.db_cache_size:
684 if len(self.db_input_cache) >= self.db_cache_size:
685 self.save_flag.set()
685 self.save_flag.set()
686
686
687 # update the auto _i variables
687 # update the auto _i variables
688 self._iii = self._ii
688 self._iii = self._ii
689 self._ii = self._i
689 self._ii = self._i
690 self._i = self._i00
690 self._i = self._i00
691 self._i00 = source_raw
691 self._i00 = source_raw
692
692
693 # hackish access to user namespace to create _i1,_i2... dynamically
693 # hackish access to user namespace to create _i1,_i2... dynamically
694 new_i = '_i%s' % line_num
694 new_i = '_i%s' % line_num
695 to_main = {'_i': self._i,
695 to_main = {'_i': self._i,
696 '_ii': self._ii,
696 '_ii': self._ii,
697 '_iii': self._iii,
697 '_iii': self._iii,
698 new_i : self._i00 }
698 new_i : self._i00 }
699
699
700 if self.shell is not None:
700 if self.shell is not None:
701 self.shell.push(to_main, interactive=False)
701 self.shell.push(to_main, interactive=False)
702
702
703 def store_output(self, line_num):
703 def store_output(self, line_num):
704 """If database output logging is enabled, this saves all the
704 """If database output logging is enabled, this saves all the
705 outputs from the indicated prompt number to the database. It's
705 outputs from the indicated prompt number to the database. It's
706 called by run_cell after code has been executed.
706 called by run_cell after code has been executed.
707
707
708 Parameters
708 Parameters
709 ----------
709 ----------
710 line_num : int
710 line_num : int
711 The line number from which to save outputs
711 The line number from which to save outputs
712 """
712 """
713 if (not self.db_log_output) or (line_num not in self.output_hist_reprs):
713 if (not self.db_log_output) or (line_num not in self.output_hist_reprs):
714 return
714 return
715 output = self.output_hist_reprs[line_num]
715 output = self.output_hist_reprs[line_num]
716
716
717 with self.db_output_cache_lock:
717 with self.db_output_cache_lock:
718 self.db_output_cache.append((line_num, output))
718 self.db_output_cache.append((line_num, output))
719 if self.db_cache_size <= 1:
719 if self.db_cache_size <= 1:
720 self.save_flag.set()
720 self.save_flag.set()
721
721
722 def _writeout_input_cache(self, conn):
722 def _writeout_input_cache(self, conn):
723 with conn:
723 with conn:
724 for line in self.db_input_cache:
724 for line in self.db_input_cache:
725 conn.execute("INSERT INTO history VALUES (?, ?, ?, ?)",
725 conn.execute("INSERT INTO history VALUES (?, ?, ?, ?)",
726 (self.session_number,)+line)
726 (self.session_number,)+line)
727
727
728 def _writeout_output_cache(self, conn):
728 def _writeout_output_cache(self, conn):
729 with conn:
729 with conn:
730 for line in self.db_output_cache:
730 for line in self.db_output_cache:
731 conn.execute("INSERT INTO output_history VALUES (?, ?, ?)",
731 conn.execute("INSERT INTO output_history VALUES (?, ?, ?)",
732 (self.session_number,)+line)
732 (self.session_number,)+line)
733
733
734 @needs_sqlite
734 @needs_sqlite
735 def writeout_cache(self, conn=None):
735 def writeout_cache(self, conn=None):
736 """Write any entries in the cache to the database."""
736 """Write any entries in the cache to the database."""
737 if conn is None:
737 if conn is None:
738 conn = self.db
738 conn = self.db
739
739
740 with self.db_input_cache_lock:
740 with self.db_input_cache_lock:
741 try:
741 try:
742 self._writeout_input_cache(conn)
742 self._writeout_input_cache(conn)
743 except sqlite3.IntegrityError:
743 except sqlite3.IntegrityError:
744 self.new_session(conn)
744 self.new_session(conn)
745 print("ERROR! Session/line number was not unique in",
745 print("ERROR! Session/line number was not unique in",
746 "database. History logging moved to new session",
746 "database. History logging moved to new session",
747 self.session_number)
747 self.session_number)
748 try:
748 try:
749 # Try writing to the new session. If this fails, don't
749 # Try writing to the new session. If this fails, don't
750 # recurse
750 # recurse
751 self._writeout_input_cache(conn)
751 self._writeout_input_cache(conn)
752 except sqlite3.IntegrityError:
752 except sqlite3.IntegrityError:
753 pass
753 pass
754 finally:
754 finally:
755 self.db_input_cache = []
755 self.db_input_cache = []
756
756
757 with self.db_output_cache_lock:
757 with self.db_output_cache_lock:
758 try:
758 try:
759 self._writeout_output_cache(conn)
759 self._writeout_output_cache(conn)
760 except sqlite3.IntegrityError:
760 except sqlite3.IntegrityError:
761 print("!! Session/line number for output was not unique",
761 print("!! Session/line number for output was not unique",
762 "in database. Output will not be stored.")
762 "in database. Output will not be stored.")
763 finally:
763 finally:
764 self.db_output_cache = []
764 self.db_output_cache = []
765
765
766
766
767 class HistorySavingThread(threading.Thread):
767 class HistorySavingThread(threading.Thread):
768 """This thread takes care of writing history to the database, so that
768 """This thread takes care of writing history to the database, so that
769 the UI isn't held up while that happens.
769 the UI isn't held up while that happens.
770
770
771 It waits for the HistoryManager's save_flag to be set, then writes out
771 It waits for the HistoryManager's save_flag to be set, then writes out
772 the history cache. The main thread is responsible for setting the flag when
772 the history cache. The main thread is responsible for setting the flag when
773 the cache size reaches a defined threshold."""
773 the cache size reaches a defined threshold."""
774 daemon = True
774 daemon = True
775 stop_now = False
775 stop_now = False
776 enabled = True
776 enabled = True
777 def __init__(self, history_manager):
777 def __init__(self, history_manager):
778 super(HistorySavingThread, self).__init__(name="IPythonHistorySavingThread")
778 super(HistorySavingThread, self).__init__(name="IPythonHistorySavingThread")
779 self.history_manager = history_manager
779 self.history_manager = history_manager
780 self.enabled = history_manager.enabled
780 self.enabled = history_manager.enabled
781 atexit.register(self.stop)
781 atexit.register(self.stop)
782
782
783 @needs_sqlite
783 @needs_sqlite
784 def run(self):
784 def run(self):
785 # We need a separate db connection per thread:
785 # We need a separate db connection per thread:
786 try:
786 try:
787 self.db = sqlite3.connect(self.history_manager.hist_file,
787 self.db = sqlite3.connect(self.history_manager.hist_file,
788 **self.history_manager.connection_options
788 **self.history_manager.connection_options
789 )
789 )
790 while True:
790 while True:
791 self.history_manager.save_flag.wait()
791 self.history_manager.save_flag.wait()
792 if self.stop_now:
792 if self.stop_now:
793 self.db.close()
793 self.db.close()
794 return
794 return
795 self.history_manager.save_flag.clear()
795 self.history_manager.save_flag.clear()
796 self.history_manager.writeout_cache(self.db)
796 self.history_manager.writeout_cache(self.db)
797 except Exception as e:
797 except Exception as e:
798 print(("The history saving thread hit an unexpected error (%s)."
798 print(("The history saving thread hit an unexpected error (%s)."
799 "History will not be written to the database.") % repr(e))
799 "History will not be written to the database.") % repr(e))
800
800
801 def stop(self):
801 def stop(self):
802 """This can be called from the main thread to safely stop this thread.
802 """This can be called from the main thread to safely stop this thread.
803
803
804 Note that it does not attempt to write out remaining history before
804 Note that it does not attempt to write out remaining history before
805 exiting. That should be done by calling the HistoryManager's
805 exiting. That should be done by calling the HistoryManager's
806 end_session method."""
806 end_session method."""
807 self.stop_now = True
807 self.stop_now = True
808 self.history_manager.save_flag.set()
808 self.history_manager.save_flag.set()
809 self.join()
809 self.join()
810
810
811
811
812 # To match, e.g. ~5/8-~2/3
812 # To match, e.g. ~5/8-~2/3
813 range_re = re.compile(r"""
813 range_re = re.compile(r"""
814 ((?P<startsess>~?\d+)/)?
814 ((?P<startsess>~?\d+)/)?
815 (?P<start>\d+)?
815 (?P<start>\d+)?
816 ((?P<sep>[\-:])
816 ((?P<sep>[\-:])
817 ((?P<endsess>~?\d+)/)?
817 ((?P<endsess>~?\d+)/)?
818 (?P<end>\d+))?
818 (?P<end>\d+))?
819 $""", re.VERBOSE)
819 $""", re.VERBOSE)
820
820
821
821
822 def extract_hist_ranges(ranges_str):
822 def extract_hist_ranges(ranges_str):
823 """Turn a string of history ranges into 3-tuples of (session, start, stop).
823 """Turn a string of history ranges into 3-tuples of (session, start, stop).
824
824
825 Examples
825 Examples
826 --------
826 --------
827 >>> list(extract_hist_ranges("~8/5-~7/4 2"))
827 >>> list(extract_hist_ranges("~8/5-~7/4 2"))
828 [(-8, 5, None), (-7, 1, 5), (0, 2, 3)]
828 [(-8, 5, None), (-7, 1, 5), (0, 2, 3)]
829 """
829 """
830 for range_str in ranges_str.split():
830 for range_str in ranges_str.split():
831 rmatch = range_re.match(range_str)
831 rmatch = range_re.match(range_str)
832 if not rmatch:
832 if not rmatch:
833 continue
833 continue
834 start = rmatch.group("start")
834 start = rmatch.group("start")
835 if start:
835 if start:
836 start = int(start)
836 start = int(start)
837 end = rmatch.group("end")
837 end = rmatch.group("end")
838 # If no end specified, get (a, a + 1)
838 # If no end specified, get (a, a + 1)
839 end = int(end) if end else start + 1
839 end = int(end) if end else start + 1
840 else: # start not specified
840 else: # start not specified
841 if not rmatch.group('startsess'): # no startsess
841 if not rmatch.group('startsess'): # no startsess
842 continue
842 continue
843 start = 1
843 start = 1
844 end = None # provide the entire session hist
844 end = None # provide the entire session hist
845
845
846 if rmatch.group("sep") == "-": # 1-3 == 1:4 --> [1, 2, 3]
846 if rmatch.group("sep") == "-": # 1-3 == 1:4 --> [1, 2, 3]
847 end += 1
847 end += 1
848 startsess = rmatch.group("startsess") or "0"
848 startsess = rmatch.group("startsess") or "0"
849 endsess = rmatch.group("endsess") or startsess
849 endsess = rmatch.group("endsess") or startsess
850 startsess = int(startsess.replace("~","-"))
850 startsess = int(startsess.replace("~","-"))
851 endsess = int(endsess.replace("~","-"))
851 endsess = int(endsess.replace("~","-"))
852 assert endsess >= startsess, "start session must be earlier than end session"
852 assert endsess >= startsess, "start session must be earlier than end session"
853
853
854 if endsess == startsess:
854 if endsess == startsess:
855 yield (startsess, start, end)
855 yield (startsess, start, end)
856 continue
856 continue
857 # Multiple sessions in one range:
857 # Multiple sessions in one range:
858 yield (startsess, start, None)
858 yield (startsess, start, None)
859 for sess in range(startsess+1, endsess):
859 for sess in range(startsess+1, endsess):
860 yield (sess, 1, None)
860 yield (sess, 1, None)
861 yield (endsess, 1, end)
861 yield (endsess, 1, end)
862
862
863
863
864 def _format_lineno(session, line):
864 def _format_lineno(session, line):
865 """Helper function to format line numbers properly."""
865 """Helper function to format line numbers properly."""
866 if session == 0:
866 if session == 0:
867 return str(line)
867 return str(line)
868 return "%s#%s" % (session, line)
868 return "%s#%s" % (session, line)
869
869
870
870
@@ -1,3391 +1,3392 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Main IPython class."""
2 """Main IPython class."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Copyright (C) 2008-2011 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 from __future__ import absolute_import, print_function
13 from __future__ import absolute_import, print_function
14
14
15 import __future__
15 import __future__
16 import abc
16 import abc
17 import ast
17 import ast
18 import atexit
18 import atexit
19 import functools
19 import functools
20 import os
20 import os
21 import re
21 import re
22 import runpy
22 import runpy
23 import sys
23 import sys
24 import tempfile
24 import tempfile
25 import traceback
25 import traceback
26 import types
26 import types
27 import subprocess
27 import subprocess
28 from io import open as io_open
28 from io import open as io_open
29
29
30 from pickleshare import PickleShareDB
31
30 from IPython.config.configurable import SingletonConfigurable
32 from IPython.config.configurable import SingletonConfigurable
31 from IPython.core import debugger, oinspect
33 from IPython.core import debugger, oinspect
32 from IPython.core import magic
34 from IPython.core import magic
33 from IPython.core import page
35 from IPython.core import page
34 from IPython.core import prefilter
36 from IPython.core import prefilter
35 from IPython.core import shadowns
37 from IPython.core import shadowns
36 from IPython.core import ultratb
38 from IPython.core import ultratb
37 from IPython.core.alias import Alias, AliasManager
39 from IPython.core.alias import Alias, AliasManager
38 from IPython.core.autocall import ExitAutocall
40 from IPython.core.autocall import ExitAutocall
39 from IPython.core.builtin_trap import BuiltinTrap
41 from IPython.core.builtin_trap import BuiltinTrap
40 from IPython.core.events import EventManager, available_events
42 from IPython.core.events import EventManager, available_events
41 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
43 from IPython.core.compilerop import CachingCompiler, check_linecache_ipython
42 from IPython.core.display_trap import DisplayTrap
44 from IPython.core.display_trap import DisplayTrap
43 from IPython.core.displayhook import DisplayHook
45 from IPython.core.displayhook import DisplayHook
44 from IPython.core.displaypub import DisplayPublisher
46 from IPython.core.displaypub import DisplayPublisher
45 from IPython.core.error import InputRejected, UsageError
47 from IPython.core.error import InputRejected, UsageError
46 from IPython.core.extensions import ExtensionManager
48 from IPython.core.extensions import ExtensionManager
47 from IPython.core.formatters import DisplayFormatter
49 from IPython.core.formatters import DisplayFormatter
48 from IPython.core.history import HistoryManager
50 from IPython.core.history import HistoryManager
49 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
51 from IPython.core.inputsplitter import IPythonInputSplitter, ESC_MAGIC, ESC_MAGIC2
50 from IPython.core.logger import Logger
52 from IPython.core.logger import Logger
51 from IPython.core.macro import Macro
53 from IPython.core.macro import Macro
52 from IPython.core.payload import PayloadManager
54 from IPython.core.payload import PayloadManager
53 from IPython.core.prefilter import PrefilterManager
55 from IPython.core.prefilter import PrefilterManager
54 from IPython.core.profiledir import ProfileDir
56 from IPython.core.profiledir import ProfileDir
55 from IPython.core.prompts import PromptManager
57 from IPython.core.prompts import PromptManager
56 from IPython.core.usage import default_banner
58 from IPython.core.usage import default_banner
57 from IPython.testing.skipdoctest import skip_doctest
59 from IPython.testing.skipdoctest import skip_doctest
58 from IPython.utils import PyColorize
60 from IPython.utils import PyColorize
59 from IPython.utils import io
61 from IPython.utils import io
60 from IPython.utils import py3compat
62 from IPython.utils import py3compat
61 from IPython.utils import openpy
63 from IPython.utils import openpy
62 from IPython.utils.decorators import undoc
64 from IPython.utils.decorators import undoc
63 from IPython.utils.io import ask_yes_no
65 from IPython.utils.io import ask_yes_no
64 from IPython.utils.ipstruct import Struct
66 from IPython.utils.ipstruct import Struct
65 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename, ensure_dir_exists
67 from IPython.utils.path import get_home_dir, get_ipython_dir, get_py_filename, unquote_filename, ensure_dir_exists
66 from IPython.utils.pickleshare import PickleShareDB
67 from IPython.utils.process import system, getoutput
68 from IPython.utils.process import system, getoutput
68 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
69 from IPython.utils.py3compat import (builtin_mod, unicode_type, string_types,
69 with_metaclass, iteritems)
70 with_metaclass, iteritems)
70 from IPython.utils.strdispatch import StrDispatch
71 from IPython.utils.strdispatch import StrDispatch
71 from IPython.utils.syspathcontext import prepended_to_syspath
72 from IPython.utils.syspathcontext import prepended_to_syspath
72 from IPython.utils.text import (format_screen, LSString, SList,
73 from IPython.utils.text import (format_screen, LSString, SList,
73 DollarFormatter)
74 DollarFormatter)
74 from IPython.utils.traitlets import (Integer, Bool, CBool, CaselessStrEnum, Enum,
75 from IPython.utils.traitlets import (Integer, Bool, CBool, CaselessStrEnum, Enum,
75 List, Unicode, Instance, Type)
76 List, Unicode, Instance, Type)
76 from IPython.utils.warn import warn, error
77 from IPython.utils.warn import warn, error
77 import IPython.core.hooks
78 import IPython.core.hooks
78
79
79 #-----------------------------------------------------------------------------
80 #-----------------------------------------------------------------------------
80 # Globals
81 # Globals
81 #-----------------------------------------------------------------------------
82 #-----------------------------------------------------------------------------
82
83
83 # compiled regexps for autoindent management
84 # compiled regexps for autoindent management
84 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
85
86
86 #-----------------------------------------------------------------------------
87 #-----------------------------------------------------------------------------
87 # Utilities
88 # Utilities
88 #-----------------------------------------------------------------------------
89 #-----------------------------------------------------------------------------
89
90
90 @undoc
91 @undoc
91 def softspace(file, newvalue):
92 def softspace(file, newvalue):
92 """Copied from code.py, to remove the dependency"""
93 """Copied from code.py, to remove the dependency"""
93
94
94 oldvalue = 0
95 oldvalue = 0
95 try:
96 try:
96 oldvalue = file.softspace
97 oldvalue = file.softspace
97 except AttributeError:
98 except AttributeError:
98 pass
99 pass
99 try:
100 try:
100 file.softspace = newvalue
101 file.softspace = newvalue
101 except (AttributeError, TypeError):
102 except (AttributeError, TypeError):
102 # "attribute-less object" or "read-only attributes"
103 # "attribute-less object" or "read-only attributes"
103 pass
104 pass
104 return oldvalue
105 return oldvalue
105
106
106 @undoc
107 @undoc
107 def no_op(*a, **kw): pass
108 def no_op(*a, **kw): pass
108
109
109 @undoc
110 @undoc
110 class NoOpContext(object):
111 class NoOpContext(object):
111 def __enter__(self): pass
112 def __enter__(self): pass
112 def __exit__(self, type, value, traceback): pass
113 def __exit__(self, type, value, traceback): pass
113 no_op_context = NoOpContext()
114 no_op_context = NoOpContext()
114
115
115 class SpaceInInput(Exception): pass
116 class SpaceInInput(Exception): pass
116
117
117 @undoc
118 @undoc
118 class Bunch: pass
119 class Bunch: pass
119
120
120
121
121 def get_default_colors():
122 def get_default_colors():
122 if sys.platform=='darwin':
123 if sys.platform=='darwin':
123 return "LightBG"
124 return "LightBG"
124 elif os.name=='nt':
125 elif os.name=='nt':
125 return 'Linux'
126 return 'Linux'
126 else:
127 else:
127 return 'Linux'
128 return 'Linux'
128
129
129
130
130 class SeparateUnicode(Unicode):
131 class SeparateUnicode(Unicode):
131 r"""A Unicode subclass to validate separate_in, separate_out, etc.
132 r"""A Unicode subclass to validate separate_in, separate_out, etc.
132
133
133 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
134 This is a Unicode based trait that converts '0'->'' and ``'\\n'->'\n'``.
134 """
135 """
135
136
136 def validate(self, obj, value):
137 def validate(self, obj, value):
137 if value == '0': value = ''
138 if value == '0': value = ''
138 value = value.replace('\\n','\n')
139 value = value.replace('\\n','\n')
139 return super(SeparateUnicode, self).validate(obj, value)
140 return super(SeparateUnicode, self).validate(obj, value)
140
141
141
142
142 class ReadlineNoRecord(object):
143 class ReadlineNoRecord(object):
143 """Context manager to execute some code, then reload readline history
144 """Context manager to execute some code, then reload readline history
144 so that interactive input to the code doesn't appear when pressing up."""
145 so that interactive input to the code doesn't appear when pressing up."""
145 def __init__(self, shell):
146 def __init__(self, shell):
146 self.shell = shell
147 self.shell = shell
147 self._nested_level = 0
148 self._nested_level = 0
148
149
149 def __enter__(self):
150 def __enter__(self):
150 if self._nested_level == 0:
151 if self._nested_level == 0:
151 try:
152 try:
152 self.orig_length = self.current_length()
153 self.orig_length = self.current_length()
153 self.readline_tail = self.get_readline_tail()
154 self.readline_tail = self.get_readline_tail()
154 except (AttributeError, IndexError): # Can fail with pyreadline
155 except (AttributeError, IndexError): # Can fail with pyreadline
155 self.orig_length, self.readline_tail = 999999, []
156 self.orig_length, self.readline_tail = 999999, []
156 self._nested_level += 1
157 self._nested_level += 1
157
158
158 def __exit__(self, type, value, traceback):
159 def __exit__(self, type, value, traceback):
159 self._nested_level -= 1
160 self._nested_level -= 1
160 if self._nested_level == 0:
161 if self._nested_level == 0:
161 # Try clipping the end if it's got longer
162 # Try clipping the end if it's got longer
162 try:
163 try:
163 e = self.current_length() - self.orig_length
164 e = self.current_length() - self.orig_length
164 if e > 0:
165 if e > 0:
165 for _ in range(e):
166 for _ in range(e):
166 self.shell.readline.remove_history_item(self.orig_length)
167 self.shell.readline.remove_history_item(self.orig_length)
167
168
168 # If it still doesn't match, just reload readline history.
169 # If it still doesn't match, just reload readline history.
169 if self.current_length() != self.orig_length \
170 if self.current_length() != self.orig_length \
170 or self.get_readline_tail() != self.readline_tail:
171 or self.get_readline_tail() != self.readline_tail:
171 self.shell.refill_readline_hist()
172 self.shell.refill_readline_hist()
172 except (AttributeError, IndexError):
173 except (AttributeError, IndexError):
173 pass
174 pass
174 # Returning False will cause exceptions to propagate
175 # Returning False will cause exceptions to propagate
175 return False
176 return False
176
177
177 def current_length(self):
178 def current_length(self):
178 return self.shell.readline.get_current_history_length()
179 return self.shell.readline.get_current_history_length()
179
180
180 def get_readline_tail(self, n=10):
181 def get_readline_tail(self, n=10):
181 """Get the last n items in readline history."""
182 """Get the last n items in readline history."""
182 end = self.shell.readline.get_current_history_length() + 1
183 end = self.shell.readline.get_current_history_length() + 1
183 start = max(end-n, 1)
184 start = max(end-n, 1)
184 ghi = self.shell.readline.get_history_item
185 ghi = self.shell.readline.get_history_item
185 return [ghi(x) for x in range(start, end)]
186 return [ghi(x) for x in range(start, end)]
186
187
187
188
188 @undoc
189 @undoc
189 class DummyMod(object):
190 class DummyMod(object):
190 """A dummy module used for IPython's interactive module when
191 """A dummy module used for IPython's interactive module when
191 a namespace must be assigned to the module's __dict__."""
192 a namespace must be assigned to the module's __dict__."""
192 pass
193 pass
193
194
194
195
195 class ExecutionResult(object):
196 class ExecutionResult(object):
196 """The result of a call to :meth:`InteractiveShell.run_cell`
197 """The result of a call to :meth:`InteractiveShell.run_cell`
197
198
198 Stores information about what took place.
199 Stores information about what took place.
199 """
200 """
200 execution_count = None
201 execution_count = None
201 error_before_exec = None
202 error_before_exec = None
202 error_in_exec = None
203 error_in_exec = None
203 result = None
204 result = None
204
205
205 @property
206 @property
206 def success(self):
207 def success(self):
207 return (self.error_before_exec is None) and (self.error_in_exec is None)
208 return (self.error_before_exec is None) and (self.error_in_exec is None)
208
209
209
210
210 class InteractiveShell(SingletonConfigurable):
211 class InteractiveShell(SingletonConfigurable):
211 """An enhanced, interactive shell for Python."""
212 """An enhanced, interactive shell for Python."""
212
213
213 _instance = None
214 _instance = None
214
215
215 ast_transformers = List([], config=True, help=
216 ast_transformers = List([], config=True, help=
216 """
217 """
217 A list of ast.NodeTransformer subclass instances, which will be applied
218 A list of ast.NodeTransformer subclass instances, which will be applied
218 to user input before code is run.
219 to user input before code is run.
219 """
220 """
220 )
221 )
221
222
222 autocall = Enum((0,1,2), default_value=0, config=True, help=
223 autocall = Enum((0,1,2), default_value=0, config=True, help=
223 """
224 """
224 Make IPython automatically call any callable object even if you didn't
225 Make IPython automatically call any callable object even if you didn't
225 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
226 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
226 automatically. The value can be '0' to disable the feature, '1' for
227 automatically. The value can be '0' to disable the feature, '1' for
227 'smart' autocall, where it is not applied if there are no more
228 'smart' autocall, where it is not applied if there are no more
228 arguments on the line, and '2' for 'full' autocall, where all callable
229 arguments on the line, and '2' for 'full' autocall, where all callable
229 objects are automatically called (even if no arguments are present).
230 objects are automatically called (even if no arguments are present).
230 """
231 """
231 )
232 )
232 # TODO: remove all autoindent logic and put into frontends.
233 # TODO: remove all autoindent logic and put into frontends.
233 # We can't do this yet because even runlines uses the autoindent.
234 # We can't do this yet because even runlines uses the autoindent.
234 autoindent = CBool(True, config=True, help=
235 autoindent = CBool(True, config=True, help=
235 """
236 """
236 Autoindent IPython code entered interactively.
237 Autoindent IPython code entered interactively.
237 """
238 """
238 )
239 )
239 automagic = CBool(True, config=True, help=
240 automagic = CBool(True, config=True, help=
240 """
241 """
241 Enable magic commands to be called without the leading %.
242 Enable magic commands to be called without the leading %.
242 """
243 """
243 )
244 )
244
245
245 banner1 = Unicode(default_banner, config=True,
246 banner1 = Unicode(default_banner, config=True,
246 help="""The part of the banner to be printed before the profile"""
247 help="""The part of the banner to be printed before the profile"""
247 )
248 )
248 banner2 = Unicode('', config=True,
249 banner2 = Unicode('', config=True,
249 help="""The part of the banner to be printed after the profile"""
250 help="""The part of the banner to be printed after the profile"""
250 )
251 )
251
252
252 cache_size = Integer(1000, config=True, help=
253 cache_size = Integer(1000, config=True, help=
253 """
254 """
254 Set the size of the output cache. The default is 1000, you can
255 Set the size of the output cache. The default is 1000, you can
255 change it permanently in your config file. Setting it to 0 completely
256 change it permanently in your config file. Setting it to 0 completely
256 disables the caching system, and the minimum value accepted is 20 (if
257 disables the caching system, and the minimum value accepted is 20 (if
257 you provide a value less than 20, it is reset to 0 and a warning is
258 you provide a value less than 20, it is reset to 0 and a warning is
258 issued). This limit is defined because otherwise you'll spend more
259 issued). This limit is defined because otherwise you'll spend more
259 time re-flushing a too small cache than working
260 time re-flushing a too small cache than working
260 """
261 """
261 )
262 )
262 color_info = CBool(True, config=True, help=
263 color_info = CBool(True, config=True, help=
263 """
264 """
264 Use colors for displaying information about objects. Because this
265 Use colors for displaying information about objects. Because this
265 information is passed through a pager (like 'less'), and some pagers
266 information is passed through a pager (like 'less'), and some pagers
266 get confused with color codes, this capability can be turned off.
267 get confused with color codes, this capability can be turned off.
267 """
268 """
268 )
269 )
269 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
270 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
270 default_value=get_default_colors(), config=True,
271 default_value=get_default_colors(), config=True,
271 help="Set the color scheme (NoColor, Linux, or LightBG)."
272 help="Set the color scheme (NoColor, Linux, or LightBG)."
272 )
273 )
273 colors_force = CBool(False, help=
274 colors_force = CBool(False, help=
274 """
275 """
275 Force use of ANSI color codes, regardless of OS and readline
276 Force use of ANSI color codes, regardless of OS and readline
276 availability.
277 availability.
277 """
278 """
278 # FIXME: This is essentially a hack to allow ZMQShell to show colors
279 # FIXME: This is essentially a hack to allow ZMQShell to show colors
279 # without readline on Win32. When the ZMQ formatting system is
280 # without readline on Win32. When the ZMQ formatting system is
280 # refactored, this should be removed.
281 # refactored, this should be removed.
281 )
282 )
282 debug = CBool(False, config=True)
283 debug = CBool(False, config=True)
283 deep_reload = CBool(False, config=True, help=
284 deep_reload = CBool(False, config=True, help=
284 """
285 """
285 Enable deep (recursive) reloading by default. IPython can use the
286 Enable deep (recursive) reloading by default. IPython can use the
286 deep_reload module which reloads changes in modules recursively (it
287 deep_reload module which reloads changes in modules recursively (it
287 replaces the reload() function, so you don't need to change anything to
288 replaces the reload() function, so you don't need to change anything to
288 use it). deep_reload() forces a full reload of modules whose code may
289 use it). deep_reload() forces a full reload of modules whose code may
289 have changed, which the default reload() function does not. When
290 have changed, which the default reload() function does not. When
290 deep_reload is off, IPython will use the normal reload(), but
291 deep_reload is off, IPython will use the normal reload(), but
291 deep_reload will still be available as dreload().
292 deep_reload will still be available as dreload().
292 """
293 """
293 )
294 )
294 disable_failing_post_execute = CBool(False, config=True,
295 disable_failing_post_execute = CBool(False, config=True,
295 help="Don't call post-execute functions that have failed in the past."
296 help="Don't call post-execute functions that have failed in the past."
296 )
297 )
297 display_formatter = Instance(DisplayFormatter)
298 display_formatter = Instance(DisplayFormatter)
298 displayhook_class = Type(DisplayHook)
299 displayhook_class = Type(DisplayHook)
299 display_pub_class = Type(DisplayPublisher)
300 display_pub_class = Type(DisplayPublisher)
300 data_pub_class = None
301 data_pub_class = None
301
302
302 exit_now = CBool(False)
303 exit_now = CBool(False)
303 exiter = Instance(ExitAutocall)
304 exiter = Instance(ExitAutocall)
304 def _exiter_default(self):
305 def _exiter_default(self):
305 return ExitAutocall(self)
306 return ExitAutocall(self)
306 # Monotonically increasing execution counter
307 # Monotonically increasing execution counter
307 execution_count = Integer(1)
308 execution_count = Integer(1)
308 filename = Unicode("<ipython console>")
309 filename = Unicode("<ipython console>")
309 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
310 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
310
311
311 # Input splitter, to transform input line by line and detect when a block
312 # Input splitter, to transform input line by line and detect when a block
312 # is ready to be executed.
313 # is ready to be executed.
313 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
314 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
314 (), {'line_input_checker': True})
315 (), {'line_input_checker': True})
315
316
316 # This InputSplitter instance is used to transform completed cells before
317 # This InputSplitter instance is used to transform completed cells before
317 # running them. It allows cell magics to contain blank lines.
318 # running them. It allows cell magics to contain blank lines.
318 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
319 input_transformer_manager = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
319 (), {'line_input_checker': False})
320 (), {'line_input_checker': False})
320
321
321 logstart = CBool(False, config=True, help=
322 logstart = CBool(False, config=True, help=
322 """
323 """
323 Start logging to the default log file in overwrite mode.
324 Start logging to the default log file in overwrite mode.
324 Use `logappend` to specify a log file to **append** logs to.
325 Use `logappend` to specify a log file to **append** logs to.
325 """
326 """
326 )
327 )
327 logfile = Unicode('', config=True, help=
328 logfile = Unicode('', config=True, help=
328 """
329 """
329 The name of the logfile to use.
330 The name of the logfile to use.
330 """
331 """
331 )
332 )
332 logappend = Unicode('', config=True, help=
333 logappend = Unicode('', config=True, help=
333 """
334 """
334 Start logging to the given file in append mode.
335 Start logging to the given file in append mode.
335 Use `logfile` to specify a log file to **overwrite** logs to.
336 Use `logfile` to specify a log file to **overwrite** logs to.
336 """
337 """
337 )
338 )
338 object_info_string_level = Enum((0,1,2), default_value=0,
339 object_info_string_level = Enum((0,1,2), default_value=0,
339 config=True)
340 config=True)
340 pdb = CBool(False, config=True, help=
341 pdb = CBool(False, config=True, help=
341 """
342 """
342 Automatically call the pdb debugger after every exception.
343 Automatically call the pdb debugger after every exception.
343 """
344 """
344 )
345 )
345 multiline_history = CBool(sys.platform != 'win32', config=True,
346 multiline_history = CBool(sys.platform != 'win32', config=True,
346 help="Save multi-line entries as one entry in readline history"
347 help="Save multi-line entries as one entry in readline history"
347 )
348 )
348 display_page = Bool(False, config=True,
349 display_page = Bool(False, config=True,
349 help="""If True, anything that would be passed to the pager
350 help="""If True, anything that would be passed to the pager
350 will be displayed as regular output instead."""
351 will be displayed as regular output instead."""
351 )
352 )
352
353
353 # deprecated prompt traits:
354 # deprecated prompt traits:
354
355
355 prompt_in1 = Unicode('In [\\#]: ', config=True,
356 prompt_in1 = Unicode('In [\\#]: ', config=True,
356 help="Deprecated, use PromptManager.in_template")
357 help="Deprecated, use PromptManager.in_template")
357 prompt_in2 = Unicode(' .\\D.: ', config=True,
358 prompt_in2 = Unicode(' .\\D.: ', config=True,
358 help="Deprecated, use PromptManager.in2_template")
359 help="Deprecated, use PromptManager.in2_template")
359 prompt_out = Unicode('Out[\\#]: ', config=True,
360 prompt_out = Unicode('Out[\\#]: ', config=True,
360 help="Deprecated, use PromptManager.out_template")
361 help="Deprecated, use PromptManager.out_template")
361 prompts_pad_left = CBool(True, config=True,
362 prompts_pad_left = CBool(True, config=True,
362 help="Deprecated, use PromptManager.justify")
363 help="Deprecated, use PromptManager.justify")
363
364
364 def _prompt_trait_changed(self, name, old, new):
365 def _prompt_trait_changed(self, name, old, new):
365 table = {
366 table = {
366 'prompt_in1' : 'in_template',
367 'prompt_in1' : 'in_template',
367 'prompt_in2' : 'in2_template',
368 'prompt_in2' : 'in2_template',
368 'prompt_out' : 'out_template',
369 'prompt_out' : 'out_template',
369 'prompts_pad_left' : 'justify',
370 'prompts_pad_left' : 'justify',
370 }
371 }
371 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
372 warn("InteractiveShell.{name} is deprecated, use PromptManager.{newname}".format(
372 name=name, newname=table[name])
373 name=name, newname=table[name])
373 )
374 )
374 # protect against weird cases where self.config may not exist:
375 # protect against weird cases where self.config may not exist:
375 if self.config is not None:
376 if self.config is not None:
376 # propagate to corresponding PromptManager trait
377 # propagate to corresponding PromptManager trait
377 setattr(self.config.PromptManager, table[name], new)
378 setattr(self.config.PromptManager, table[name], new)
378
379
379 _prompt_in1_changed = _prompt_trait_changed
380 _prompt_in1_changed = _prompt_trait_changed
380 _prompt_in2_changed = _prompt_trait_changed
381 _prompt_in2_changed = _prompt_trait_changed
381 _prompt_out_changed = _prompt_trait_changed
382 _prompt_out_changed = _prompt_trait_changed
382 _prompt_pad_left_changed = _prompt_trait_changed
383 _prompt_pad_left_changed = _prompt_trait_changed
383
384
384 show_rewritten_input = CBool(True, config=True,
385 show_rewritten_input = CBool(True, config=True,
385 help="Show rewritten input, e.g. for autocall."
386 help="Show rewritten input, e.g. for autocall."
386 )
387 )
387
388
388 quiet = CBool(False, config=True)
389 quiet = CBool(False, config=True)
389
390
390 history_length = Integer(10000, config=True)
391 history_length = Integer(10000, config=True)
391
392
392 # The readline stuff will eventually be moved to the terminal subclass
393 # The readline stuff will eventually be moved to the terminal subclass
393 # but for now, we can't do that as readline is welded in everywhere.
394 # but for now, we can't do that as readline is welded in everywhere.
394 readline_use = CBool(True, config=True)
395 readline_use = CBool(True, config=True)
395 readline_remove_delims = Unicode('-/~', config=True)
396 readline_remove_delims = Unicode('-/~', config=True)
396 readline_delims = Unicode() # set by init_readline()
397 readline_delims = Unicode() # set by init_readline()
397 # don't use \M- bindings by default, because they
398 # don't use \M- bindings by default, because they
398 # conflict with 8-bit encodings. See gh-58,gh-88
399 # conflict with 8-bit encodings. See gh-58,gh-88
399 readline_parse_and_bind = List([
400 readline_parse_and_bind = List([
400 'tab: complete',
401 'tab: complete',
401 '"\C-l": clear-screen',
402 '"\C-l": clear-screen',
402 'set show-all-if-ambiguous on',
403 'set show-all-if-ambiguous on',
403 '"\C-o": tab-insert',
404 '"\C-o": tab-insert',
404 '"\C-r": reverse-search-history',
405 '"\C-r": reverse-search-history',
405 '"\C-s": forward-search-history',
406 '"\C-s": forward-search-history',
406 '"\C-p": history-search-backward',
407 '"\C-p": history-search-backward',
407 '"\C-n": history-search-forward',
408 '"\C-n": history-search-forward',
408 '"\e[A": history-search-backward',
409 '"\e[A": history-search-backward',
409 '"\e[B": history-search-forward',
410 '"\e[B": history-search-forward',
410 '"\C-k": kill-line',
411 '"\C-k": kill-line',
411 '"\C-u": unix-line-discard',
412 '"\C-u": unix-line-discard',
412 ], config=True)
413 ], config=True)
413
414
414 _custom_readline_config = False
415 _custom_readline_config = False
415
416
416 def _readline_parse_and_bind_changed(self, name, old, new):
417 def _readline_parse_and_bind_changed(self, name, old, new):
417 # notice that readline config is customized
418 # notice that readline config is customized
418 # indicates that it should have higher priority than inputrc
419 # indicates that it should have higher priority than inputrc
419 self._custom_readline_config = True
420 self._custom_readline_config = True
420
421
421 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
422 ast_node_interactivity = Enum(['all', 'last', 'last_expr', 'none'],
422 default_value='last_expr', config=True,
423 default_value='last_expr', config=True,
423 help="""
424 help="""
424 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
425 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
425 run interactively (displaying output from expressions).""")
426 run interactively (displaying output from expressions).""")
426
427
427 # TODO: this part of prompt management should be moved to the frontends.
428 # TODO: this part of prompt management should be moved to the frontends.
428 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
429 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
429 separate_in = SeparateUnicode('\n', config=True)
430 separate_in = SeparateUnicode('\n', config=True)
430 separate_out = SeparateUnicode('', config=True)
431 separate_out = SeparateUnicode('', config=True)
431 separate_out2 = SeparateUnicode('', config=True)
432 separate_out2 = SeparateUnicode('', config=True)
432 wildcards_case_sensitive = CBool(True, config=True)
433 wildcards_case_sensitive = CBool(True, config=True)
433 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
434 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
434 default_value='Context', config=True)
435 default_value='Context', config=True)
435
436
436 # Subcomponents of InteractiveShell
437 # Subcomponents of InteractiveShell
437 alias_manager = Instance('IPython.core.alias.AliasManager')
438 alias_manager = Instance('IPython.core.alias.AliasManager')
438 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
439 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
439 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
440 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
440 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
441 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
441 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
442 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
442 payload_manager = Instance('IPython.core.payload.PayloadManager')
443 payload_manager = Instance('IPython.core.payload.PayloadManager')
443 history_manager = Instance('IPython.core.history.HistoryAccessorBase')
444 history_manager = Instance('IPython.core.history.HistoryAccessorBase')
444 magics_manager = Instance('IPython.core.magic.MagicsManager')
445 magics_manager = Instance('IPython.core.magic.MagicsManager')
445
446
446 profile_dir = Instance('IPython.core.application.ProfileDir')
447 profile_dir = Instance('IPython.core.application.ProfileDir')
447 @property
448 @property
448 def profile(self):
449 def profile(self):
449 if self.profile_dir is not None:
450 if self.profile_dir is not None:
450 name = os.path.basename(self.profile_dir.location)
451 name = os.path.basename(self.profile_dir.location)
451 return name.replace('profile_','')
452 return name.replace('profile_','')
452
453
453
454
454 # Private interface
455 # Private interface
455 _post_execute = Instance(dict)
456 _post_execute = Instance(dict)
456
457
457 # Tracks any GUI loop loaded for pylab
458 # Tracks any GUI loop loaded for pylab
458 pylab_gui_select = None
459 pylab_gui_select = None
459
460
460 def __init__(self, ipython_dir=None, profile_dir=None,
461 def __init__(self, ipython_dir=None, profile_dir=None,
461 user_module=None, user_ns=None,
462 user_module=None, user_ns=None,
462 custom_exceptions=((), None), **kwargs):
463 custom_exceptions=((), None), **kwargs):
463
464
464 # This is where traits with a config_key argument are updated
465 # This is where traits with a config_key argument are updated
465 # from the values on config.
466 # from the values on config.
466 super(InteractiveShell, self).__init__(**kwargs)
467 super(InteractiveShell, self).__init__(**kwargs)
467 self.configurables = [self]
468 self.configurables = [self]
468
469
469 # These are relatively independent and stateless
470 # These are relatively independent and stateless
470 self.init_ipython_dir(ipython_dir)
471 self.init_ipython_dir(ipython_dir)
471 self.init_profile_dir(profile_dir)
472 self.init_profile_dir(profile_dir)
472 self.init_instance_attrs()
473 self.init_instance_attrs()
473 self.init_environment()
474 self.init_environment()
474
475
475 # Check if we're in a virtualenv, and set up sys.path.
476 # Check if we're in a virtualenv, and set up sys.path.
476 self.init_virtualenv()
477 self.init_virtualenv()
477
478
478 # Create namespaces (user_ns, user_global_ns, etc.)
479 # Create namespaces (user_ns, user_global_ns, etc.)
479 self.init_create_namespaces(user_module, user_ns)
480 self.init_create_namespaces(user_module, user_ns)
480 # This has to be done after init_create_namespaces because it uses
481 # This has to be done after init_create_namespaces because it uses
481 # something in self.user_ns, but before init_sys_modules, which
482 # something in self.user_ns, but before init_sys_modules, which
482 # is the first thing to modify sys.
483 # is the first thing to modify sys.
483 # TODO: When we override sys.stdout and sys.stderr before this class
484 # TODO: When we override sys.stdout and sys.stderr before this class
484 # is created, we are saving the overridden ones here. Not sure if this
485 # is created, we are saving the overridden ones here. Not sure if this
485 # is what we want to do.
486 # is what we want to do.
486 self.save_sys_module_state()
487 self.save_sys_module_state()
487 self.init_sys_modules()
488 self.init_sys_modules()
488
489
489 # While we're trying to have each part of the code directly access what
490 # While we're trying to have each part of the code directly access what
490 # it needs without keeping redundant references to objects, we have too
491 # it needs without keeping redundant references to objects, we have too
491 # much legacy code that expects ip.db to exist.
492 # much legacy code that expects ip.db to exist.
492 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
493 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
493
494
494 self.init_history()
495 self.init_history()
495 self.init_encoding()
496 self.init_encoding()
496 self.init_prefilter()
497 self.init_prefilter()
497
498
498 self.init_syntax_highlighting()
499 self.init_syntax_highlighting()
499 self.init_hooks()
500 self.init_hooks()
500 self.init_events()
501 self.init_events()
501 self.init_pushd_popd_magic()
502 self.init_pushd_popd_magic()
502 # self.init_traceback_handlers use to be here, but we moved it below
503 # self.init_traceback_handlers use to be here, but we moved it below
503 # because it and init_io have to come after init_readline.
504 # because it and init_io have to come after init_readline.
504 self.init_user_ns()
505 self.init_user_ns()
505 self.init_logger()
506 self.init_logger()
506 self.init_builtins()
507 self.init_builtins()
507
508
508 # The following was in post_config_initialization
509 # The following was in post_config_initialization
509 self.init_inspector()
510 self.init_inspector()
510 # init_readline() must come before init_io(), because init_io uses
511 # init_readline() must come before init_io(), because init_io uses
511 # readline related things.
512 # readline related things.
512 self.init_readline()
513 self.init_readline()
513 # We save this here in case user code replaces raw_input, but it needs
514 # We save this here in case user code replaces raw_input, but it needs
514 # to be after init_readline(), because PyPy's readline works by replacing
515 # to be after init_readline(), because PyPy's readline works by replacing
515 # raw_input.
516 # raw_input.
516 if py3compat.PY3:
517 if py3compat.PY3:
517 self.raw_input_original = input
518 self.raw_input_original = input
518 else:
519 else:
519 self.raw_input_original = raw_input
520 self.raw_input_original = raw_input
520 # init_completer must come after init_readline, because it needs to
521 # init_completer must come after init_readline, because it needs to
521 # know whether readline is present or not system-wide to configure the
522 # know whether readline is present or not system-wide to configure the
522 # completers, since the completion machinery can now operate
523 # completers, since the completion machinery can now operate
523 # independently of readline (e.g. over the network)
524 # independently of readline (e.g. over the network)
524 self.init_completer()
525 self.init_completer()
525 # TODO: init_io() needs to happen before init_traceback handlers
526 # TODO: init_io() needs to happen before init_traceback handlers
526 # because the traceback handlers hardcode the stdout/stderr streams.
527 # because the traceback handlers hardcode the stdout/stderr streams.
527 # This logic in in debugger.Pdb and should eventually be changed.
528 # This logic in in debugger.Pdb and should eventually be changed.
528 self.init_io()
529 self.init_io()
529 self.init_traceback_handlers(custom_exceptions)
530 self.init_traceback_handlers(custom_exceptions)
530 self.init_prompts()
531 self.init_prompts()
531 self.init_display_formatter()
532 self.init_display_formatter()
532 self.init_display_pub()
533 self.init_display_pub()
533 self.init_data_pub()
534 self.init_data_pub()
534 self.init_displayhook()
535 self.init_displayhook()
535 self.init_magics()
536 self.init_magics()
536 self.init_alias()
537 self.init_alias()
537 self.init_logstart()
538 self.init_logstart()
538 self.init_pdb()
539 self.init_pdb()
539 self.init_extension_manager()
540 self.init_extension_manager()
540 self.init_payload()
541 self.init_payload()
541 self.hooks.late_startup_hook()
542 self.hooks.late_startup_hook()
542 self.events.trigger('shell_initialized', self)
543 self.events.trigger('shell_initialized', self)
543 atexit.register(self.atexit_operations)
544 atexit.register(self.atexit_operations)
544
545
545 def get_ipython(self):
546 def get_ipython(self):
546 """Return the currently running IPython instance."""
547 """Return the currently running IPython instance."""
547 return self
548 return self
548
549
549 #-------------------------------------------------------------------------
550 #-------------------------------------------------------------------------
550 # Trait changed handlers
551 # Trait changed handlers
551 #-------------------------------------------------------------------------
552 #-------------------------------------------------------------------------
552
553
553 def _ipython_dir_changed(self, name, new):
554 def _ipython_dir_changed(self, name, new):
554 ensure_dir_exists(new)
555 ensure_dir_exists(new)
555
556
556 def set_autoindent(self,value=None):
557 def set_autoindent(self,value=None):
557 """Set the autoindent flag, checking for readline support.
558 """Set the autoindent flag, checking for readline support.
558
559
559 If called with no arguments, it acts as a toggle."""
560 If called with no arguments, it acts as a toggle."""
560
561
561 if value != 0 and not self.has_readline:
562 if value != 0 and not self.has_readline:
562 if os.name == 'posix':
563 if os.name == 'posix':
563 warn("The auto-indent feature requires the readline library")
564 warn("The auto-indent feature requires the readline library")
564 self.autoindent = 0
565 self.autoindent = 0
565 return
566 return
566 if value is None:
567 if value is None:
567 self.autoindent = not self.autoindent
568 self.autoindent = not self.autoindent
568 else:
569 else:
569 self.autoindent = value
570 self.autoindent = value
570
571
571 #-------------------------------------------------------------------------
572 #-------------------------------------------------------------------------
572 # init_* methods called by __init__
573 # init_* methods called by __init__
573 #-------------------------------------------------------------------------
574 #-------------------------------------------------------------------------
574
575
575 def init_ipython_dir(self, ipython_dir):
576 def init_ipython_dir(self, ipython_dir):
576 if ipython_dir is not None:
577 if ipython_dir is not None:
577 self.ipython_dir = ipython_dir
578 self.ipython_dir = ipython_dir
578 return
579 return
579
580
580 self.ipython_dir = get_ipython_dir()
581 self.ipython_dir = get_ipython_dir()
581
582
582 def init_profile_dir(self, profile_dir):
583 def init_profile_dir(self, profile_dir):
583 if profile_dir is not None:
584 if profile_dir is not None:
584 self.profile_dir = profile_dir
585 self.profile_dir = profile_dir
585 return
586 return
586 self.profile_dir =\
587 self.profile_dir =\
587 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
588 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
588
589
589 def init_instance_attrs(self):
590 def init_instance_attrs(self):
590 self.more = False
591 self.more = False
591
592
592 # command compiler
593 # command compiler
593 self.compile = CachingCompiler()
594 self.compile = CachingCompiler()
594
595
595 # Make an empty namespace, which extension writers can rely on both
596 # Make an empty namespace, which extension writers can rely on both
596 # existing and NEVER being used by ipython itself. This gives them a
597 # existing and NEVER being used by ipython itself. This gives them a
597 # convenient location for storing additional information and state
598 # convenient location for storing additional information and state
598 # their extensions may require, without fear of collisions with other
599 # their extensions may require, without fear of collisions with other
599 # ipython names that may develop later.
600 # ipython names that may develop later.
600 self.meta = Struct()
601 self.meta = Struct()
601
602
602 # Temporary files used for various purposes. Deleted at exit.
603 # Temporary files used for various purposes. Deleted at exit.
603 self.tempfiles = []
604 self.tempfiles = []
604 self.tempdirs = []
605 self.tempdirs = []
605
606
606 # Keep track of readline usage (later set by init_readline)
607 # Keep track of readline usage (later set by init_readline)
607 self.has_readline = False
608 self.has_readline = False
608
609
609 # keep track of where we started running (mainly for crash post-mortem)
610 # keep track of where we started running (mainly for crash post-mortem)
610 # This is not being used anywhere currently.
611 # This is not being used anywhere currently.
611 self.starting_dir = py3compat.getcwd()
612 self.starting_dir = py3compat.getcwd()
612
613
613 # Indentation management
614 # Indentation management
614 self.indent_current_nsp = 0
615 self.indent_current_nsp = 0
615
616
616 # Dict to track post-execution functions that have been registered
617 # Dict to track post-execution functions that have been registered
617 self._post_execute = {}
618 self._post_execute = {}
618
619
619 def init_environment(self):
620 def init_environment(self):
620 """Any changes we need to make to the user's environment."""
621 """Any changes we need to make to the user's environment."""
621 pass
622 pass
622
623
623 def init_encoding(self):
624 def init_encoding(self):
624 # Get system encoding at startup time. Certain terminals (like Emacs
625 # Get system encoding at startup time. Certain terminals (like Emacs
625 # under Win32 have it set to None, and we need to have a known valid
626 # under Win32 have it set to None, and we need to have a known valid
626 # encoding to use in the raw_input() method
627 # encoding to use in the raw_input() method
627 try:
628 try:
628 self.stdin_encoding = sys.stdin.encoding or 'ascii'
629 self.stdin_encoding = sys.stdin.encoding or 'ascii'
629 except AttributeError:
630 except AttributeError:
630 self.stdin_encoding = 'ascii'
631 self.stdin_encoding = 'ascii'
631
632
632 def init_syntax_highlighting(self):
633 def init_syntax_highlighting(self):
633 # Python source parser/formatter for syntax highlighting
634 # Python source parser/formatter for syntax highlighting
634 pyformat = PyColorize.Parser().format
635 pyformat = PyColorize.Parser().format
635 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
636 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
636
637
637 def init_pushd_popd_magic(self):
638 def init_pushd_popd_magic(self):
638 # for pushd/popd management
639 # for pushd/popd management
639 self.home_dir = get_home_dir()
640 self.home_dir = get_home_dir()
640
641
641 self.dir_stack = []
642 self.dir_stack = []
642
643
643 def init_logger(self):
644 def init_logger(self):
644 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
645 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
645 logmode='rotate')
646 logmode='rotate')
646
647
647 def init_logstart(self):
648 def init_logstart(self):
648 """Initialize logging in case it was requested at the command line.
649 """Initialize logging in case it was requested at the command line.
649 """
650 """
650 if self.logappend:
651 if self.logappend:
651 self.magic('logstart %s append' % self.logappend)
652 self.magic('logstart %s append' % self.logappend)
652 elif self.logfile:
653 elif self.logfile:
653 self.magic('logstart %s' % self.logfile)
654 self.magic('logstart %s' % self.logfile)
654 elif self.logstart:
655 elif self.logstart:
655 self.magic('logstart')
656 self.magic('logstart')
656
657
657 def init_builtins(self):
658 def init_builtins(self):
658 # A single, static flag that we set to True. Its presence indicates
659 # A single, static flag that we set to True. Its presence indicates
659 # that an IPython shell has been created, and we make no attempts at
660 # that an IPython shell has been created, and we make no attempts at
660 # removing on exit or representing the existence of more than one
661 # removing on exit or representing the existence of more than one
661 # IPython at a time.
662 # IPython at a time.
662 builtin_mod.__dict__['__IPYTHON__'] = True
663 builtin_mod.__dict__['__IPYTHON__'] = True
663
664
664 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
665 # In 0.11 we introduced '__IPYTHON__active' as an integer we'd try to
665 # manage on enter/exit, but with all our shells it's virtually
666 # manage on enter/exit, but with all our shells it's virtually
666 # impossible to get all the cases right. We're leaving the name in for
667 # impossible to get all the cases right. We're leaving the name in for
667 # those who adapted their codes to check for this flag, but will
668 # those who adapted their codes to check for this flag, but will
668 # eventually remove it after a few more releases.
669 # eventually remove it after a few more releases.
669 builtin_mod.__dict__['__IPYTHON__active'] = \
670 builtin_mod.__dict__['__IPYTHON__active'] = \
670 'Deprecated, check for __IPYTHON__'
671 'Deprecated, check for __IPYTHON__'
671
672
672 self.builtin_trap = BuiltinTrap(shell=self)
673 self.builtin_trap = BuiltinTrap(shell=self)
673
674
674 def init_inspector(self):
675 def init_inspector(self):
675 # Object inspector
676 # Object inspector
676 self.inspector = oinspect.Inspector(oinspect.InspectColors,
677 self.inspector = oinspect.Inspector(oinspect.InspectColors,
677 PyColorize.ANSICodeColors,
678 PyColorize.ANSICodeColors,
678 'NoColor',
679 'NoColor',
679 self.object_info_string_level)
680 self.object_info_string_level)
680
681
681 def init_io(self):
682 def init_io(self):
682 # This will just use sys.stdout and sys.stderr. If you want to
683 # This will just use sys.stdout and sys.stderr. If you want to
683 # override sys.stdout and sys.stderr themselves, you need to do that
684 # override sys.stdout and sys.stderr themselves, you need to do that
684 # *before* instantiating this class, because io holds onto
685 # *before* instantiating this class, because io holds onto
685 # references to the underlying streams.
686 # references to the underlying streams.
686 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
687 if (sys.platform == 'win32' or sys.platform == 'cli') and self.has_readline:
687 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
688 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
688 else:
689 else:
689 io.stdout = io.IOStream(sys.stdout)
690 io.stdout = io.IOStream(sys.stdout)
690 io.stderr = io.IOStream(sys.stderr)
691 io.stderr = io.IOStream(sys.stderr)
691
692
692 def init_prompts(self):
693 def init_prompts(self):
693 self.prompt_manager = PromptManager(shell=self, parent=self)
694 self.prompt_manager = PromptManager(shell=self, parent=self)
694 self.configurables.append(self.prompt_manager)
695 self.configurables.append(self.prompt_manager)
695 # Set system prompts, so that scripts can decide if they are running
696 # Set system prompts, so that scripts can decide if they are running
696 # interactively.
697 # interactively.
697 sys.ps1 = 'In : '
698 sys.ps1 = 'In : '
698 sys.ps2 = '...: '
699 sys.ps2 = '...: '
699 sys.ps3 = 'Out: '
700 sys.ps3 = 'Out: '
700
701
701 def init_display_formatter(self):
702 def init_display_formatter(self):
702 self.display_formatter = DisplayFormatter(parent=self)
703 self.display_formatter = DisplayFormatter(parent=self)
703 self.configurables.append(self.display_formatter)
704 self.configurables.append(self.display_formatter)
704
705
705 def init_display_pub(self):
706 def init_display_pub(self):
706 self.display_pub = self.display_pub_class(parent=self)
707 self.display_pub = self.display_pub_class(parent=self)
707 self.configurables.append(self.display_pub)
708 self.configurables.append(self.display_pub)
708
709
709 def init_data_pub(self):
710 def init_data_pub(self):
710 if not self.data_pub_class:
711 if not self.data_pub_class:
711 self.data_pub = None
712 self.data_pub = None
712 return
713 return
713 self.data_pub = self.data_pub_class(parent=self)
714 self.data_pub = self.data_pub_class(parent=self)
714 self.configurables.append(self.data_pub)
715 self.configurables.append(self.data_pub)
715
716
716 def init_displayhook(self):
717 def init_displayhook(self):
717 # Initialize displayhook, set in/out prompts and printing system
718 # Initialize displayhook, set in/out prompts and printing system
718 self.displayhook = self.displayhook_class(
719 self.displayhook = self.displayhook_class(
719 parent=self,
720 parent=self,
720 shell=self,
721 shell=self,
721 cache_size=self.cache_size,
722 cache_size=self.cache_size,
722 )
723 )
723 self.configurables.append(self.displayhook)
724 self.configurables.append(self.displayhook)
724 # This is a context manager that installs/revmoes the displayhook at
725 # This is a context manager that installs/revmoes the displayhook at
725 # the appropriate time.
726 # the appropriate time.
726 self.display_trap = DisplayTrap(hook=self.displayhook)
727 self.display_trap = DisplayTrap(hook=self.displayhook)
727
728
728 def init_virtualenv(self):
729 def init_virtualenv(self):
729 """Add a virtualenv to sys.path so the user can import modules from it.
730 """Add a virtualenv to sys.path so the user can import modules from it.
730 This isn't perfect: it doesn't use the Python interpreter with which the
731 This isn't perfect: it doesn't use the Python interpreter with which the
731 virtualenv was built, and it ignores the --no-site-packages option. A
732 virtualenv was built, and it ignores the --no-site-packages option. A
732 warning will appear suggesting the user installs IPython in the
733 warning will appear suggesting the user installs IPython in the
733 virtualenv, but for many cases, it probably works well enough.
734 virtualenv, but for many cases, it probably works well enough.
734
735
735 Adapted from code snippets online.
736 Adapted from code snippets online.
736
737
737 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
738 http://blog.ufsoft.org/2009/1/29/ipython-and-virtualenv
738 """
739 """
739 if 'VIRTUAL_ENV' not in os.environ:
740 if 'VIRTUAL_ENV' not in os.environ:
740 # Not in a virtualenv
741 # Not in a virtualenv
741 return
742 return
742
743
743 # venv detection:
744 # venv detection:
744 # stdlib venv may symlink sys.executable, so we can't use realpath.
745 # stdlib venv may symlink sys.executable, so we can't use realpath.
745 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
746 # but others can symlink *to* the venv Python, so we can't just use sys.executable.
746 # So we just check every item in the symlink tree (generally <= 3)
747 # So we just check every item in the symlink tree (generally <= 3)
747 p = os.path.normcase(sys.executable)
748 p = os.path.normcase(sys.executable)
748 paths = [p]
749 paths = [p]
749 while os.path.islink(p):
750 while os.path.islink(p):
750 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
751 p = os.path.normcase(os.path.join(os.path.dirname(p), os.readlink(p)))
751 paths.append(p)
752 paths.append(p)
752 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
753 p_venv = os.path.normcase(os.environ['VIRTUAL_ENV'])
753 if any(p.startswith(p_venv) for p in paths):
754 if any(p.startswith(p_venv) for p in paths):
754 # Running properly in the virtualenv, don't need to do anything
755 # Running properly in the virtualenv, don't need to do anything
755 return
756 return
756
757
757 warn("Attempting to work in a virtualenv. If you encounter problems, please "
758 warn("Attempting to work in a virtualenv. If you encounter problems, please "
758 "install IPython inside the virtualenv.")
759 "install IPython inside the virtualenv.")
759 if sys.platform == "win32":
760 if sys.platform == "win32":
760 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
761 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'Lib', 'site-packages')
761 else:
762 else:
762 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
763 virtual_env = os.path.join(os.environ['VIRTUAL_ENV'], 'lib',
763 'python%d.%d' % sys.version_info[:2], 'site-packages')
764 'python%d.%d' % sys.version_info[:2], 'site-packages')
764
765
765 import site
766 import site
766 sys.path.insert(0, virtual_env)
767 sys.path.insert(0, virtual_env)
767 site.addsitedir(virtual_env)
768 site.addsitedir(virtual_env)
768
769
769 #-------------------------------------------------------------------------
770 #-------------------------------------------------------------------------
770 # Things related to injections into the sys module
771 # Things related to injections into the sys module
771 #-------------------------------------------------------------------------
772 #-------------------------------------------------------------------------
772
773
773 def save_sys_module_state(self):
774 def save_sys_module_state(self):
774 """Save the state of hooks in the sys module.
775 """Save the state of hooks in the sys module.
775
776
776 This has to be called after self.user_module is created.
777 This has to be called after self.user_module is created.
777 """
778 """
778 self._orig_sys_module_state = {}
779 self._orig_sys_module_state = {}
779 self._orig_sys_module_state['stdin'] = sys.stdin
780 self._orig_sys_module_state['stdin'] = sys.stdin
780 self._orig_sys_module_state['stdout'] = sys.stdout
781 self._orig_sys_module_state['stdout'] = sys.stdout
781 self._orig_sys_module_state['stderr'] = sys.stderr
782 self._orig_sys_module_state['stderr'] = sys.stderr
782 self._orig_sys_module_state['excepthook'] = sys.excepthook
783 self._orig_sys_module_state['excepthook'] = sys.excepthook
783 self._orig_sys_modules_main_name = self.user_module.__name__
784 self._orig_sys_modules_main_name = self.user_module.__name__
784 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
785 self._orig_sys_modules_main_mod = sys.modules.get(self.user_module.__name__)
785
786
786 def restore_sys_module_state(self):
787 def restore_sys_module_state(self):
787 """Restore the state of the sys module."""
788 """Restore the state of the sys module."""
788 try:
789 try:
789 for k, v in iteritems(self._orig_sys_module_state):
790 for k, v in iteritems(self._orig_sys_module_state):
790 setattr(sys, k, v)
791 setattr(sys, k, v)
791 except AttributeError:
792 except AttributeError:
792 pass
793 pass
793 # Reset what what done in self.init_sys_modules
794 # Reset what what done in self.init_sys_modules
794 if self._orig_sys_modules_main_mod is not None:
795 if self._orig_sys_modules_main_mod is not None:
795 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
796 sys.modules[self._orig_sys_modules_main_name] = self._orig_sys_modules_main_mod
796
797
797 #-------------------------------------------------------------------------
798 #-------------------------------------------------------------------------
798 # Things related to the banner
799 # Things related to the banner
799 #-------------------------------------------------------------------------
800 #-------------------------------------------------------------------------
800
801
801 @property
802 @property
802 def banner(self):
803 def banner(self):
803 banner = self.banner1
804 banner = self.banner1
804 if self.profile and self.profile != 'default':
805 if self.profile and self.profile != 'default':
805 banner += '\nIPython profile: %s\n' % self.profile
806 banner += '\nIPython profile: %s\n' % self.profile
806 if self.banner2:
807 if self.banner2:
807 banner += '\n' + self.banner2
808 banner += '\n' + self.banner2
808 return banner
809 return banner
809
810
810 def show_banner(self, banner=None):
811 def show_banner(self, banner=None):
811 if banner is None:
812 if banner is None:
812 banner = self.banner
813 banner = self.banner
813 self.write(banner)
814 self.write(banner)
814
815
815 #-------------------------------------------------------------------------
816 #-------------------------------------------------------------------------
816 # Things related to hooks
817 # Things related to hooks
817 #-------------------------------------------------------------------------
818 #-------------------------------------------------------------------------
818
819
819 def init_hooks(self):
820 def init_hooks(self):
820 # hooks holds pointers used for user-side customizations
821 # hooks holds pointers used for user-side customizations
821 self.hooks = Struct()
822 self.hooks = Struct()
822
823
823 self.strdispatchers = {}
824 self.strdispatchers = {}
824
825
825 # Set all default hooks, defined in the IPython.hooks module.
826 # Set all default hooks, defined in the IPython.hooks module.
826 hooks = IPython.core.hooks
827 hooks = IPython.core.hooks
827 for hook_name in hooks.__all__:
828 for hook_name in hooks.__all__:
828 # default hooks have priority 100, i.e. low; user hooks should have
829 # default hooks have priority 100, i.e. low; user hooks should have
829 # 0-100 priority
830 # 0-100 priority
830 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
831 self.set_hook(hook_name,getattr(hooks,hook_name), 100, _warn_deprecated=False)
831
832
832 if self.display_page:
833 if self.display_page:
833 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
834 self.set_hook('show_in_pager', page.as_hook(page.display_page), 90)
834
835
835 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
836 def set_hook(self,name,hook, priority=50, str_key=None, re_key=None,
836 _warn_deprecated=True):
837 _warn_deprecated=True):
837 """set_hook(name,hook) -> sets an internal IPython hook.
838 """set_hook(name,hook) -> sets an internal IPython hook.
838
839
839 IPython exposes some of its internal API as user-modifiable hooks. By
840 IPython exposes some of its internal API as user-modifiable hooks. By
840 adding your function to one of these hooks, you can modify IPython's
841 adding your function to one of these hooks, you can modify IPython's
841 behavior to call at runtime your own routines."""
842 behavior to call at runtime your own routines."""
842
843
843 # At some point in the future, this should validate the hook before it
844 # At some point in the future, this should validate the hook before it
844 # accepts it. Probably at least check that the hook takes the number
845 # accepts it. Probably at least check that the hook takes the number
845 # of args it's supposed to.
846 # of args it's supposed to.
846
847
847 f = types.MethodType(hook,self)
848 f = types.MethodType(hook,self)
848
849
849 # check if the hook is for strdispatcher first
850 # check if the hook is for strdispatcher first
850 if str_key is not None:
851 if str_key is not None:
851 sdp = self.strdispatchers.get(name, StrDispatch())
852 sdp = self.strdispatchers.get(name, StrDispatch())
852 sdp.add_s(str_key, f, priority )
853 sdp.add_s(str_key, f, priority )
853 self.strdispatchers[name] = sdp
854 self.strdispatchers[name] = sdp
854 return
855 return
855 if re_key is not None:
856 if re_key is not None:
856 sdp = self.strdispatchers.get(name, StrDispatch())
857 sdp = self.strdispatchers.get(name, StrDispatch())
857 sdp.add_re(re.compile(re_key), f, priority )
858 sdp.add_re(re.compile(re_key), f, priority )
858 self.strdispatchers[name] = sdp
859 self.strdispatchers[name] = sdp
859 return
860 return
860
861
861 dp = getattr(self.hooks, name, None)
862 dp = getattr(self.hooks, name, None)
862 if name not in IPython.core.hooks.__all__:
863 if name not in IPython.core.hooks.__all__:
863 print("Warning! Hook '%s' is not one of %s" % \
864 print("Warning! Hook '%s' is not one of %s" % \
864 (name, IPython.core.hooks.__all__ ))
865 (name, IPython.core.hooks.__all__ ))
865
866
866 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
867 if _warn_deprecated and (name in IPython.core.hooks.deprecated):
867 alternative = IPython.core.hooks.deprecated[name]
868 alternative = IPython.core.hooks.deprecated[name]
868 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative))
869 warn("Hook {} is deprecated. Use {} instead.".format(name, alternative))
869
870
870 if not dp:
871 if not dp:
871 dp = IPython.core.hooks.CommandChainDispatcher()
872 dp = IPython.core.hooks.CommandChainDispatcher()
872
873
873 try:
874 try:
874 dp.add(f,priority)
875 dp.add(f,priority)
875 except AttributeError:
876 except AttributeError:
876 # it was not commandchain, plain old func - replace
877 # it was not commandchain, plain old func - replace
877 dp = f
878 dp = f
878
879
879 setattr(self.hooks,name, dp)
880 setattr(self.hooks,name, dp)
880
881
881 #-------------------------------------------------------------------------
882 #-------------------------------------------------------------------------
882 # Things related to events
883 # Things related to events
883 #-------------------------------------------------------------------------
884 #-------------------------------------------------------------------------
884
885
885 def init_events(self):
886 def init_events(self):
886 self.events = EventManager(self, available_events)
887 self.events = EventManager(self, available_events)
887
888
888 self.events.register("pre_execute", self._clear_warning_registry)
889 self.events.register("pre_execute", self._clear_warning_registry)
889
890
890 def register_post_execute(self, func):
891 def register_post_execute(self, func):
891 """DEPRECATED: Use ip.events.register('post_run_cell', func)
892 """DEPRECATED: Use ip.events.register('post_run_cell', func)
892
893
893 Register a function for calling after code execution.
894 Register a function for calling after code execution.
894 """
895 """
895 warn("ip.register_post_execute is deprecated, use "
896 warn("ip.register_post_execute is deprecated, use "
896 "ip.events.register('post_run_cell', func) instead.")
897 "ip.events.register('post_run_cell', func) instead.")
897 self.events.register('post_run_cell', func)
898 self.events.register('post_run_cell', func)
898
899
899 def _clear_warning_registry(self):
900 def _clear_warning_registry(self):
900 # clear the warning registry, so that different code blocks with
901 # clear the warning registry, so that different code blocks with
901 # overlapping line number ranges don't cause spurious suppression of
902 # overlapping line number ranges don't cause spurious suppression of
902 # warnings (see gh-6611 for details)
903 # warnings (see gh-6611 for details)
903 if "__warningregistry__" in self.user_global_ns:
904 if "__warningregistry__" in self.user_global_ns:
904 del self.user_global_ns["__warningregistry__"]
905 del self.user_global_ns["__warningregistry__"]
905
906
906 #-------------------------------------------------------------------------
907 #-------------------------------------------------------------------------
907 # Things related to the "main" module
908 # Things related to the "main" module
908 #-------------------------------------------------------------------------
909 #-------------------------------------------------------------------------
909
910
910 def new_main_mod(self, filename, modname):
911 def new_main_mod(self, filename, modname):
911 """Return a new 'main' module object for user code execution.
912 """Return a new 'main' module object for user code execution.
912
913
913 ``filename`` should be the path of the script which will be run in the
914 ``filename`` should be the path of the script which will be run in the
914 module. Requests with the same filename will get the same module, with
915 module. Requests with the same filename will get the same module, with
915 its namespace cleared.
916 its namespace cleared.
916
917
917 ``modname`` should be the module name - normally either '__main__' or
918 ``modname`` should be the module name - normally either '__main__' or
918 the basename of the file without the extension.
919 the basename of the file without the extension.
919
920
920 When scripts are executed via %run, we must keep a reference to their
921 When scripts are executed via %run, we must keep a reference to their
921 __main__ module around so that Python doesn't
922 __main__ module around so that Python doesn't
922 clear it, rendering references to module globals useless.
923 clear it, rendering references to module globals useless.
923
924
924 This method keeps said reference in a private dict, keyed by the
925 This method keeps said reference in a private dict, keyed by the
925 absolute path of the script. This way, for multiple executions of the
926 absolute path of the script. This way, for multiple executions of the
926 same script we only keep one copy of the namespace (the last one),
927 same script we only keep one copy of the namespace (the last one),
927 thus preventing memory leaks from old references while allowing the
928 thus preventing memory leaks from old references while allowing the
928 objects from the last execution to be accessible.
929 objects from the last execution to be accessible.
929 """
930 """
930 filename = os.path.abspath(filename)
931 filename = os.path.abspath(filename)
931 try:
932 try:
932 main_mod = self._main_mod_cache[filename]
933 main_mod = self._main_mod_cache[filename]
933 except KeyError:
934 except KeyError:
934 main_mod = self._main_mod_cache[filename] = types.ModuleType(
935 main_mod = self._main_mod_cache[filename] = types.ModuleType(
935 py3compat.cast_bytes_py2(modname),
936 py3compat.cast_bytes_py2(modname),
936 doc="Module created for script run in IPython")
937 doc="Module created for script run in IPython")
937 else:
938 else:
938 main_mod.__dict__.clear()
939 main_mod.__dict__.clear()
939 main_mod.__name__ = modname
940 main_mod.__name__ = modname
940
941
941 main_mod.__file__ = filename
942 main_mod.__file__ = filename
942 # It seems pydoc (and perhaps others) needs any module instance to
943 # It seems pydoc (and perhaps others) needs any module instance to
943 # implement a __nonzero__ method
944 # implement a __nonzero__ method
944 main_mod.__nonzero__ = lambda : True
945 main_mod.__nonzero__ = lambda : True
945
946
946 return main_mod
947 return main_mod
947
948
948 def clear_main_mod_cache(self):
949 def clear_main_mod_cache(self):
949 """Clear the cache of main modules.
950 """Clear the cache of main modules.
950
951
951 Mainly for use by utilities like %reset.
952 Mainly for use by utilities like %reset.
952
953
953 Examples
954 Examples
954 --------
955 --------
955
956
956 In [15]: import IPython
957 In [15]: import IPython
957
958
958 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
959 In [16]: m = _ip.new_main_mod(IPython.__file__, 'IPython')
959
960
960 In [17]: len(_ip._main_mod_cache) > 0
961 In [17]: len(_ip._main_mod_cache) > 0
961 Out[17]: True
962 Out[17]: True
962
963
963 In [18]: _ip.clear_main_mod_cache()
964 In [18]: _ip.clear_main_mod_cache()
964
965
965 In [19]: len(_ip._main_mod_cache) == 0
966 In [19]: len(_ip._main_mod_cache) == 0
966 Out[19]: True
967 Out[19]: True
967 """
968 """
968 self._main_mod_cache.clear()
969 self._main_mod_cache.clear()
969
970
970 #-------------------------------------------------------------------------
971 #-------------------------------------------------------------------------
971 # Things related to debugging
972 # Things related to debugging
972 #-------------------------------------------------------------------------
973 #-------------------------------------------------------------------------
973
974
974 def init_pdb(self):
975 def init_pdb(self):
975 # Set calling of pdb on exceptions
976 # Set calling of pdb on exceptions
976 # self.call_pdb is a property
977 # self.call_pdb is a property
977 self.call_pdb = self.pdb
978 self.call_pdb = self.pdb
978
979
979 def _get_call_pdb(self):
980 def _get_call_pdb(self):
980 return self._call_pdb
981 return self._call_pdb
981
982
982 def _set_call_pdb(self,val):
983 def _set_call_pdb(self,val):
983
984
984 if val not in (0,1,False,True):
985 if val not in (0,1,False,True):
985 raise ValueError('new call_pdb value must be boolean')
986 raise ValueError('new call_pdb value must be boolean')
986
987
987 # store value in instance
988 # store value in instance
988 self._call_pdb = val
989 self._call_pdb = val
989
990
990 # notify the actual exception handlers
991 # notify the actual exception handlers
991 self.InteractiveTB.call_pdb = val
992 self.InteractiveTB.call_pdb = val
992
993
993 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
994 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
994 'Control auto-activation of pdb at exceptions')
995 'Control auto-activation of pdb at exceptions')
995
996
996 def debugger(self,force=False):
997 def debugger(self,force=False):
997 """Call the pydb/pdb debugger.
998 """Call the pydb/pdb debugger.
998
999
999 Keywords:
1000 Keywords:
1000
1001
1001 - force(False): by default, this routine checks the instance call_pdb
1002 - force(False): by default, this routine checks the instance call_pdb
1002 flag and does not actually invoke the debugger if the flag is false.
1003 flag and does not actually invoke the debugger if the flag is false.
1003 The 'force' option forces the debugger to activate even if the flag
1004 The 'force' option forces the debugger to activate even if the flag
1004 is false.
1005 is false.
1005 """
1006 """
1006
1007
1007 if not (force or self.call_pdb):
1008 if not (force or self.call_pdb):
1008 return
1009 return
1009
1010
1010 if not hasattr(sys,'last_traceback'):
1011 if not hasattr(sys,'last_traceback'):
1011 error('No traceback has been produced, nothing to debug.')
1012 error('No traceback has been produced, nothing to debug.')
1012 return
1013 return
1013
1014
1014 # use pydb if available
1015 # use pydb if available
1015 if debugger.has_pydb:
1016 if debugger.has_pydb:
1016 from pydb import pm
1017 from pydb import pm
1017 else:
1018 else:
1018 # fallback to our internal debugger
1019 # fallback to our internal debugger
1019 pm = lambda : self.InteractiveTB.debugger(force=True)
1020 pm = lambda : self.InteractiveTB.debugger(force=True)
1020
1021
1021 with self.readline_no_record:
1022 with self.readline_no_record:
1022 pm()
1023 pm()
1023
1024
1024 #-------------------------------------------------------------------------
1025 #-------------------------------------------------------------------------
1025 # Things related to IPython's various namespaces
1026 # Things related to IPython's various namespaces
1026 #-------------------------------------------------------------------------
1027 #-------------------------------------------------------------------------
1027 default_user_namespaces = True
1028 default_user_namespaces = True
1028
1029
1029 def init_create_namespaces(self, user_module=None, user_ns=None):
1030 def init_create_namespaces(self, user_module=None, user_ns=None):
1030 # Create the namespace where the user will operate. user_ns is
1031 # Create the namespace where the user will operate. user_ns is
1031 # normally the only one used, and it is passed to the exec calls as
1032 # normally the only one used, and it is passed to the exec calls as
1032 # the locals argument. But we do carry a user_global_ns namespace
1033 # the locals argument. But we do carry a user_global_ns namespace
1033 # given as the exec 'globals' argument, This is useful in embedding
1034 # given as the exec 'globals' argument, This is useful in embedding
1034 # situations where the ipython shell opens in a context where the
1035 # situations where the ipython shell opens in a context where the
1035 # distinction between locals and globals is meaningful. For
1036 # distinction between locals and globals is meaningful. For
1036 # non-embedded contexts, it is just the same object as the user_ns dict.
1037 # non-embedded contexts, it is just the same object as the user_ns dict.
1037
1038
1038 # FIXME. For some strange reason, __builtins__ is showing up at user
1039 # FIXME. For some strange reason, __builtins__ is showing up at user
1039 # level as a dict instead of a module. This is a manual fix, but I
1040 # level as a dict instead of a module. This is a manual fix, but I
1040 # should really track down where the problem is coming from. Alex
1041 # should really track down where the problem is coming from. Alex
1041 # Schmolck reported this problem first.
1042 # Schmolck reported this problem first.
1042
1043
1043 # A useful post by Alex Martelli on this topic:
1044 # A useful post by Alex Martelli on this topic:
1044 # Re: inconsistent value from __builtins__
1045 # Re: inconsistent value from __builtins__
1045 # Von: Alex Martelli <aleaxit@yahoo.com>
1046 # Von: Alex Martelli <aleaxit@yahoo.com>
1046 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1047 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
1047 # Gruppen: comp.lang.python
1048 # Gruppen: comp.lang.python
1048
1049
1049 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1050 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
1050 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1051 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
1051 # > <type 'dict'>
1052 # > <type 'dict'>
1052 # > >>> print type(__builtins__)
1053 # > >>> print type(__builtins__)
1053 # > <type 'module'>
1054 # > <type 'module'>
1054 # > Is this difference in return value intentional?
1055 # > Is this difference in return value intentional?
1055
1056
1056 # Well, it's documented that '__builtins__' can be either a dictionary
1057 # Well, it's documented that '__builtins__' can be either a dictionary
1057 # or a module, and it's been that way for a long time. Whether it's
1058 # or a module, and it's been that way for a long time. Whether it's
1058 # intentional (or sensible), I don't know. In any case, the idea is
1059 # intentional (or sensible), I don't know. In any case, the idea is
1059 # that if you need to access the built-in namespace directly, you
1060 # that if you need to access the built-in namespace directly, you
1060 # should start with "import __builtin__" (note, no 's') which will
1061 # should start with "import __builtin__" (note, no 's') which will
1061 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1062 # definitely give you a module. Yeah, it's somewhat confusing:-(.
1062
1063
1063 # These routines return a properly built module and dict as needed by
1064 # These routines return a properly built module and dict as needed by
1064 # the rest of the code, and can also be used by extension writers to
1065 # the rest of the code, and can also be used by extension writers to
1065 # generate properly initialized namespaces.
1066 # generate properly initialized namespaces.
1066 if (user_ns is not None) or (user_module is not None):
1067 if (user_ns is not None) or (user_module is not None):
1067 self.default_user_namespaces = False
1068 self.default_user_namespaces = False
1068 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1069 self.user_module, self.user_ns = self.prepare_user_module(user_module, user_ns)
1069
1070
1070 # A record of hidden variables we have added to the user namespace, so
1071 # A record of hidden variables we have added to the user namespace, so
1071 # we can list later only variables defined in actual interactive use.
1072 # we can list later only variables defined in actual interactive use.
1072 self.user_ns_hidden = {}
1073 self.user_ns_hidden = {}
1073
1074
1074 # Now that FakeModule produces a real module, we've run into a nasty
1075 # Now that FakeModule produces a real module, we've run into a nasty
1075 # problem: after script execution (via %run), the module where the user
1076 # problem: after script execution (via %run), the module where the user
1076 # code ran is deleted. Now that this object is a true module (needed
1077 # code ran is deleted. Now that this object is a true module (needed
1077 # so docetst and other tools work correctly), the Python module
1078 # so docetst and other tools work correctly), the Python module
1078 # teardown mechanism runs over it, and sets to None every variable
1079 # teardown mechanism runs over it, and sets to None every variable
1079 # present in that module. Top-level references to objects from the
1080 # present in that module. Top-level references to objects from the
1080 # script survive, because the user_ns is updated with them. However,
1081 # script survive, because the user_ns is updated with them. However,
1081 # calling functions defined in the script that use other things from
1082 # calling functions defined in the script that use other things from
1082 # the script will fail, because the function's closure had references
1083 # the script will fail, because the function's closure had references
1083 # to the original objects, which are now all None. So we must protect
1084 # to the original objects, which are now all None. So we must protect
1084 # these modules from deletion by keeping a cache.
1085 # these modules from deletion by keeping a cache.
1085 #
1086 #
1086 # To avoid keeping stale modules around (we only need the one from the
1087 # To avoid keeping stale modules around (we only need the one from the
1087 # last run), we use a dict keyed with the full path to the script, so
1088 # last run), we use a dict keyed with the full path to the script, so
1088 # only the last version of the module is held in the cache. Note,
1089 # only the last version of the module is held in the cache. Note,
1089 # however, that we must cache the module *namespace contents* (their
1090 # however, that we must cache the module *namespace contents* (their
1090 # __dict__). Because if we try to cache the actual modules, old ones
1091 # __dict__). Because if we try to cache the actual modules, old ones
1091 # (uncached) could be destroyed while still holding references (such as
1092 # (uncached) could be destroyed while still holding references (such as
1092 # those held by GUI objects that tend to be long-lived)>
1093 # those held by GUI objects that tend to be long-lived)>
1093 #
1094 #
1094 # The %reset command will flush this cache. See the cache_main_mod()
1095 # The %reset command will flush this cache. See the cache_main_mod()
1095 # and clear_main_mod_cache() methods for details on use.
1096 # and clear_main_mod_cache() methods for details on use.
1096
1097
1097 # This is the cache used for 'main' namespaces
1098 # This is the cache used for 'main' namespaces
1098 self._main_mod_cache = {}
1099 self._main_mod_cache = {}
1099
1100
1100 # A table holding all the namespaces IPython deals with, so that
1101 # A table holding all the namespaces IPython deals with, so that
1101 # introspection facilities can search easily.
1102 # introspection facilities can search easily.
1102 self.ns_table = {'user_global':self.user_module.__dict__,
1103 self.ns_table = {'user_global':self.user_module.__dict__,
1103 'user_local':self.user_ns,
1104 'user_local':self.user_ns,
1104 'builtin':builtin_mod.__dict__
1105 'builtin':builtin_mod.__dict__
1105 }
1106 }
1106
1107
1107 @property
1108 @property
1108 def user_global_ns(self):
1109 def user_global_ns(self):
1109 return self.user_module.__dict__
1110 return self.user_module.__dict__
1110
1111
1111 def prepare_user_module(self, user_module=None, user_ns=None):
1112 def prepare_user_module(self, user_module=None, user_ns=None):
1112 """Prepare the module and namespace in which user code will be run.
1113 """Prepare the module and namespace in which user code will be run.
1113
1114
1114 When IPython is started normally, both parameters are None: a new module
1115 When IPython is started normally, both parameters are None: a new module
1115 is created automatically, and its __dict__ used as the namespace.
1116 is created automatically, and its __dict__ used as the namespace.
1116
1117
1117 If only user_module is provided, its __dict__ is used as the namespace.
1118 If only user_module is provided, its __dict__ is used as the namespace.
1118 If only user_ns is provided, a dummy module is created, and user_ns
1119 If only user_ns is provided, a dummy module is created, and user_ns
1119 becomes the global namespace. If both are provided (as they may be
1120 becomes the global namespace. If both are provided (as they may be
1120 when embedding), user_ns is the local namespace, and user_module
1121 when embedding), user_ns is the local namespace, and user_module
1121 provides the global namespace.
1122 provides the global namespace.
1122
1123
1123 Parameters
1124 Parameters
1124 ----------
1125 ----------
1125 user_module : module, optional
1126 user_module : module, optional
1126 The current user module in which IPython is being run. If None,
1127 The current user module in which IPython is being run. If None,
1127 a clean module will be created.
1128 a clean module will be created.
1128 user_ns : dict, optional
1129 user_ns : dict, optional
1129 A namespace in which to run interactive commands.
1130 A namespace in which to run interactive commands.
1130
1131
1131 Returns
1132 Returns
1132 -------
1133 -------
1133 A tuple of user_module and user_ns, each properly initialised.
1134 A tuple of user_module and user_ns, each properly initialised.
1134 """
1135 """
1135 if user_module is None and user_ns is not None:
1136 if user_module is None and user_ns is not None:
1136 user_ns.setdefault("__name__", "__main__")
1137 user_ns.setdefault("__name__", "__main__")
1137 user_module = DummyMod()
1138 user_module = DummyMod()
1138 user_module.__dict__ = user_ns
1139 user_module.__dict__ = user_ns
1139
1140
1140 if user_module is None:
1141 if user_module is None:
1141 user_module = types.ModuleType("__main__",
1142 user_module = types.ModuleType("__main__",
1142 doc="Automatically created module for IPython interactive environment")
1143 doc="Automatically created module for IPython interactive environment")
1143
1144
1144 # We must ensure that __builtin__ (without the final 's') is always
1145 # We must ensure that __builtin__ (without the final 's') is always
1145 # available and pointing to the __builtin__ *module*. For more details:
1146 # available and pointing to the __builtin__ *module*. For more details:
1146 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1147 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1147 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1148 user_module.__dict__.setdefault('__builtin__', builtin_mod)
1148 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1149 user_module.__dict__.setdefault('__builtins__', builtin_mod)
1149
1150
1150 if user_ns is None:
1151 if user_ns is None:
1151 user_ns = user_module.__dict__
1152 user_ns = user_module.__dict__
1152
1153
1153 return user_module, user_ns
1154 return user_module, user_ns
1154
1155
1155 def init_sys_modules(self):
1156 def init_sys_modules(self):
1156 # We need to insert into sys.modules something that looks like a
1157 # We need to insert into sys.modules something that looks like a
1157 # module but which accesses the IPython namespace, for shelve and
1158 # module but which accesses the IPython namespace, for shelve and
1158 # pickle to work interactively. Normally they rely on getting
1159 # pickle to work interactively. Normally they rely on getting
1159 # everything out of __main__, but for embedding purposes each IPython
1160 # everything out of __main__, but for embedding purposes each IPython
1160 # instance has its own private namespace, so we can't go shoving
1161 # instance has its own private namespace, so we can't go shoving
1161 # everything into __main__.
1162 # everything into __main__.
1162
1163
1163 # note, however, that we should only do this for non-embedded
1164 # note, however, that we should only do this for non-embedded
1164 # ipythons, which really mimic the __main__.__dict__ with their own
1165 # ipythons, which really mimic the __main__.__dict__ with their own
1165 # namespace. Embedded instances, on the other hand, should not do
1166 # namespace. Embedded instances, on the other hand, should not do
1166 # this because they need to manage the user local/global namespaces
1167 # this because they need to manage the user local/global namespaces
1167 # only, but they live within a 'normal' __main__ (meaning, they
1168 # only, but they live within a 'normal' __main__ (meaning, they
1168 # shouldn't overtake the execution environment of the script they're
1169 # shouldn't overtake the execution environment of the script they're
1169 # embedded in).
1170 # embedded in).
1170
1171
1171 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1172 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1172 main_name = self.user_module.__name__
1173 main_name = self.user_module.__name__
1173 sys.modules[main_name] = self.user_module
1174 sys.modules[main_name] = self.user_module
1174
1175
1175 def init_user_ns(self):
1176 def init_user_ns(self):
1176 """Initialize all user-visible namespaces to their minimum defaults.
1177 """Initialize all user-visible namespaces to their minimum defaults.
1177
1178
1178 Certain history lists are also initialized here, as they effectively
1179 Certain history lists are also initialized here, as they effectively
1179 act as user namespaces.
1180 act as user namespaces.
1180
1181
1181 Notes
1182 Notes
1182 -----
1183 -----
1183 All data structures here are only filled in, they are NOT reset by this
1184 All data structures here are only filled in, they are NOT reset by this
1184 method. If they were not empty before, data will simply be added to
1185 method. If they were not empty before, data will simply be added to
1185 therm.
1186 therm.
1186 """
1187 """
1187 # This function works in two parts: first we put a few things in
1188 # This function works in two parts: first we put a few things in
1188 # user_ns, and we sync that contents into user_ns_hidden so that these
1189 # user_ns, and we sync that contents into user_ns_hidden so that these
1189 # initial variables aren't shown by %who. After the sync, we add the
1190 # initial variables aren't shown by %who. After the sync, we add the
1190 # rest of what we *do* want the user to see with %who even on a new
1191 # rest of what we *do* want the user to see with %who even on a new
1191 # session (probably nothing, so theye really only see their own stuff)
1192 # session (probably nothing, so theye really only see their own stuff)
1192
1193
1193 # The user dict must *always* have a __builtin__ reference to the
1194 # The user dict must *always* have a __builtin__ reference to the
1194 # Python standard __builtin__ namespace, which must be imported.
1195 # Python standard __builtin__ namespace, which must be imported.
1195 # This is so that certain operations in prompt evaluation can be
1196 # This is so that certain operations in prompt evaluation can be
1196 # reliably executed with builtins. Note that we can NOT use
1197 # reliably executed with builtins. Note that we can NOT use
1197 # __builtins__ (note the 's'), because that can either be a dict or a
1198 # __builtins__ (note the 's'), because that can either be a dict or a
1198 # module, and can even mutate at runtime, depending on the context
1199 # module, and can even mutate at runtime, depending on the context
1199 # (Python makes no guarantees on it). In contrast, __builtin__ is
1200 # (Python makes no guarantees on it). In contrast, __builtin__ is
1200 # always a module object, though it must be explicitly imported.
1201 # always a module object, though it must be explicitly imported.
1201
1202
1202 # For more details:
1203 # For more details:
1203 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1204 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1204 ns = dict()
1205 ns = dict()
1205
1206
1206 # make global variables for user access to the histories
1207 # make global variables for user access to the histories
1207 ns['_ih'] = self.history_manager.input_hist_parsed
1208 ns['_ih'] = self.history_manager.input_hist_parsed
1208 ns['_oh'] = self.history_manager.output_hist
1209 ns['_oh'] = self.history_manager.output_hist
1209 ns['_dh'] = self.history_manager.dir_hist
1210 ns['_dh'] = self.history_manager.dir_hist
1210
1211
1211 ns['_sh'] = shadowns
1212 ns['_sh'] = shadowns
1212
1213
1213 # user aliases to input and output histories. These shouldn't show up
1214 # user aliases to input and output histories. These shouldn't show up
1214 # in %who, as they can have very large reprs.
1215 # in %who, as they can have very large reprs.
1215 ns['In'] = self.history_manager.input_hist_parsed
1216 ns['In'] = self.history_manager.input_hist_parsed
1216 ns['Out'] = self.history_manager.output_hist
1217 ns['Out'] = self.history_manager.output_hist
1217
1218
1218 # Store myself as the public api!!!
1219 # Store myself as the public api!!!
1219 ns['get_ipython'] = self.get_ipython
1220 ns['get_ipython'] = self.get_ipython
1220
1221
1221 ns['exit'] = self.exiter
1222 ns['exit'] = self.exiter
1222 ns['quit'] = self.exiter
1223 ns['quit'] = self.exiter
1223
1224
1224 # Sync what we've added so far to user_ns_hidden so these aren't seen
1225 # Sync what we've added so far to user_ns_hidden so these aren't seen
1225 # by %who
1226 # by %who
1226 self.user_ns_hidden.update(ns)
1227 self.user_ns_hidden.update(ns)
1227
1228
1228 # Anything put into ns now would show up in %who. Think twice before
1229 # Anything put into ns now would show up in %who. Think twice before
1229 # putting anything here, as we really want %who to show the user their
1230 # putting anything here, as we really want %who to show the user their
1230 # stuff, not our variables.
1231 # stuff, not our variables.
1231
1232
1232 # Finally, update the real user's namespace
1233 # Finally, update the real user's namespace
1233 self.user_ns.update(ns)
1234 self.user_ns.update(ns)
1234
1235
1235 @property
1236 @property
1236 def all_ns_refs(self):
1237 def all_ns_refs(self):
1237 """Get a list of references to all the namespace dictionaries in which
1238 """Get a list of references to all the namespace dictionaries in which
1238 IPython might store a user-created object.
1239 IPython might store a user-created object.
1239
1240
1240 Note that this does not include the displayhook, which also caches
1241 Note that this does not include the displayhook, which also caches
1241 objects from the output."""
1242 objects from the output."""
1242 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1243 return [self.user_ns, self.user_global_ns, self.user_ns_hidden] + \
1243 [m.__dict__ for m in self._main_mod_cache.values()]
1244 [m.__dict__ for m in self._main_mod_cache.values()]
1244
1245
1245 def reset(self, new_session=True):
1246 def reset(self, new_session=True):
1246 """Clear all internal namespaces, and attempt to release references to
1247 """Clear all internal namespaces, and attempt to release references to
1247 user objects.
1248 user objects.
1248
1249
1249 If new_session is True, a new history session will be opened.
1250 If new_session is True, a new history session will be opened.
1250 """
1251 """
1251 # Clear histories
1252 # Clear histories
1252 self.history_manager.reset(new_session)
1253 self.history_manager.reset(new_session)
1253 # Reset counter used to index all histories
1254 # Reset counter used to index all histories
1254 if new_session:
1255 if new_session:
1255 self.execution_count = 1
1256 self.execution_count = 1
1256
1257
1257 # Flush cached output items
1258 # Flush cached output items
1258 if self.displayhook.do_full_cache:
1259 if self.displayhook.do_full_cache:
1259 self.displayhook.flush()
1260 self.displayhook.flush()
1260
1261
1261 # The main execution namespaces must be cleared very carefully,
1262 # The main execution namespaces must be cleared very carefully,
1262 # skipping the deletion of the builtin-related keys, because doing so
1263 # skipping the deletion of the builtin-related keys, because doing so
1263 # would cause errors in many object's __del__ methods.
1264 # would cause errors in many object's __del__ methods.
1264 if self.user_ns is not self.user_global_ns:
1265 if self.user_ns is not self.user_global_ns:
1265 self.user_ns.clear()
1266 self.user_ns.clear()
1266 ns = self.user_global_ns
1267 ns = self.user_global_ns
1267 drop_keys = set(ns.keys())
1268 drop_keys = set(ns.keys())
1268 drop_keys.discard('__builtin__')
1269 drop_keys.discard('__builtin__')
1269 drop_keys.discard('__builtins__')
1270 drop_keys.discard('__builtins__')
1270 drop_keys.discard('__name__')
1271 drop_keys.discard('__name__')
1271 for k in drop_keys:
1272 for k in drop_keys:
1272 del ns[k]
1273 del ns[k]
1273
1274
1274 self.user_ns_hidden.clear()
1275 self.user_ns_hidden.clear()
1275
1276
1276 # Restore the user namespaces to minimal usability
1277 # Restore the user namespaces to minimal usability
1277 self.init_user_ns()
1278 self.init_user_ns()
1278
1279
1279 # Restore the default and user aliases
1280 # Restore the default and user aliases
1280 self.alias_manager.clear_aliases()
1281 self.alias_manager.clear_aliases()
1281 self.alias_manager.init_aliases()
1282 self.alias_manager.init_aliases()
1282
1283
1283 # Flush the private list of module references kept for script
1284 # Flush the private list of module references kept for script
1284 # execution protection
1285 # execution protection
1285 self.clear_main_mod_cache()
1286 self.clear_main_mod_cache()
1286
1287
1287 def del_var(self, varname, by_name=False):
1288 def del_var(self, varname, by_name=False):
1288 """Delete a variable from the various namespaces, so that, as
1289 """Delete a variable from the various namespaces, so that, as
1289 far as possible, we're not keeping any hidden references to it.
1290 far as possible, we're not keeping any hidden references to it.
1290
1291
1291 Parameters
1292 Parameters
1292 ----------
1293 ----------
1293 varname : str
1294 varname : str
1294 The name of the variable to delete.
1295 The name of the variable to delete.
1295 by_name : bool
1296 by_name : bool
1296 If True, delete variables with the given name in each
1297 If True, delete variables with the given name in each
1297 namespace. If False (default), find the variable in the user
1298 namespace. If False (default), find the variable in the user
1298 namespace, and delete references to it.
1299 namespace, and delete references to it.
1299 """
1300 """
1300 if varname in ('__builtin__', '__builtins__'):
1301 if varname in ('__builtin__', '__builtins__'):
1301 raise ValueError("Refusing to delete %s" % varname)
1302 raise ValueError("Refusing to delete %s" % varname)
1302
1303
1303 ns_refs = self.all_ns_refs
1304 ns_refs = self.all_ns_refs
1304
1305
1305 if by_name: # Delete by name
1306 if by_name: # Delete by name
1306 for ns in ns_refs:
1307 for ns in ns_refs:
1307 try:
1308 try:
1308 del ns[varname]
1309 del ns[varname]
1309 except KeyError:
1310 except KeyError:
1310 pass
1311 pass
1311 else: # Delete by object
1312 else: # Delete by object
1312 try:
1313 try:
1313 obj = self.user_ns[varname]
1314 obj = self.user_ns[varname]
1314 except KeyError:
1315 except KeyError:
1315 raise NameError("name '%s' is not defined" % varname)
1316 raise NameError("name '%s' is not defined" % varname)
1316 # Also check in output history
1317 # Also check in output history
1317 ns_refs.append(self.history_manager.output_hist)
1318 ns_refs.append(self.history_manager.output_hist)
1318 for ns in ns_refs:
1319 for ns in ns_refs:
1319 to_delete = [n for n, o in iteritems(ns) if o is obj]
1320 to_delete = [n for n, o in iteritems(ns) if o is obj]
1320 for name in to_delete:
1321 for name in to_delete:
1321 del ns[name]
1322 del ns[name]
1322
1323
1323 # displayhook keeps extra references, but not in a dictionary
1324 # displayhook keeps extra references, but not in a dictionary
1324 for name in ('_', '__', '___'):
1325 for name in ('_', '__', '___'):
1325 if getattr(self.displayhook, name) is obj:
1326 if getattr(self.displayhook, name) is obj:
1326 setattr(self.displayhook, name, None)
1327 setattr(self.displayhook, name, None)
1327
1328
1328 def reset_selective(self, regex=None):
1329 def reset_selective(self, regex=None):
1329 """Clear selective variables from internal namespaces based on a
1330 """Clear selective variables from internal namespaces based on a
1330 specified regular expression.
1331 specified regular expression.
1331
1332
1332 Parameters
1333 Parameters
1333 ----------
1334 ----------
1334 regex : string or compiled pattern, optional
1335 regex : string or compiled pattern, optional
1335 A regular expression pattern that will be used in searching
1336 A regular expression pattern that will be used in searching
1336 variable names in the users namespaces.
1337 variable names in the users namespaces.
1337 """
1338 """
1338 if regex is not None:
1339 if regex is not None:
1339 try:
1340 try:
1340 m = re.compile(regex)
1341 m = re.compile(regex)
1341 except TypeError:
1342 except TypeError:
1342 raise TypeError('regex must be a string or compiled pattern')
1343 raise TypeError('regex must be a string or compiled pattern')
1343 # Search for keys in each namespace that match the given regex
1344 # Search for keys in each namespace that match the given regex
1344 # If a match is found, delete the key/value pair.
1345 # If a match is found, delete the key/value pair.
1345 for ns in self.all_ns_refs:
1346 for ns in self.all_ns_refs:
1346 for var in ns:
1347 for var in ns:
1347 if m.search(var):
1348 if m.search(var):
1348 del ns[var]
1349 del ns[var]
1349
1350
1350 def push(self, variables, interactive=True):
1351 def push(self, variables, interactive=True):
1351 """Inject a group of variables into the IPython user namespace.
1352 """Inject a group of variables into the IPython user namespace.
1352
1353
1353 Parameters
1354 Parameters
1354 ----------
1355 ----------
1355 variables : dict, str or list/tuple of str
1356 variables : dict, str or list/tuple of str
1356 The variables to inject into the user's namespace. If a dict, a
1357 The variables to inject into the user's namespace. If a dict, a
1357 simple update is done. If a str, the string is assumed to have
1358 simple update is done. If a str, the string is assumed to have
1358 variable names separated by spaces. A list/tuple of str can also
1359 variable names separated by spaces. A list/tuple of str can also
1359 be used to give the variable names. If just the variable names are
1360 be used to give the variable names. If just the variable names are
1360 give (list/tuple/str) then the variable values looked up in the
1361 give (list/tuple/str) then the variable values looked up in the
1361 callers frame.
1362 callers frame.
1362 interactive : bool
1363 interactive : bool
1363 If True (default), the variables will be listed with the ``who``
1364 If True (default), the variables will be listed with the ``who``
1364 magic.
1365 magic.
1365 """
1366 """
1366 vdict = None
1367 vdict = None
1367
1368
1368 # We need a dict of name/value pairs to do namespace updates.
1369 # We need a dict of name/value pairs to do namespace updates.
1369 if isinstance(variables, dict):
1370 if isinstance(variables, dict):
1370 vdict = variables
1371 vdict = variables
1371 elif isinstance(variables, string_types+(list, tuple)):
1372 elif isinstance(variables, string_types+(list, tuple)):
1372 if isinstance(variables, string_types):
1373 if isinstance(variables, string_types):
1373 vlist = variables.split()
1374 vlist = variables.split()
1374 else:
1375 else:
1375 vlist = variables
1376 vlist = variables
1376 vdict = {}
1377 vdict = {}
1377 cf = sys._getframe(1)
1378 cf = sys._getframe(1)
1378 for name in vlist:
1379 for name in vlist:
1379 try:
1380 try:
1380 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1381 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1381 except:
1382 except:
1382 print('Could not get variable %s from %s' %
1383 print('Could not get variable %s from %s' %
1383 (name,cf.f_code.co_name))
1384 (name,cf.f_code.co_name))
1384 else:
1385 else:
1385 raise ValueError('variables must be a dict/str/list/tuple')
1386 raise ValueError('variables must be a dict/str/list/tuple')
1386
1387
1387 # Propagate variables to user namespace
1388 # Propagate variables to user namespace
1388 self.user_ns.update(vdict)
1389 self.user_ns.update(vdict)
1389
1390
1390 # And configure interactive visibility
1391 # And configure interactive visibility
1391 user_ns_hidden = self.user_ns_hidden
1392 user_ns_hidden = self.user_ns_hidden
1392 if interactive:
1393 if interactive:
1393 for name in vdict:
1394 for name in vdict:
1394 user_ns_hidden.pop(name, None)
1395 user_ns_hidden.pop(name, None)
1395 else:
1396 else:
1396 user_ns_hidden.update(vdict)
1397 user_ns_hidden.update(vdict)
1397
1398
1398 def drop_by_id(self, variables):
1399 def drop_by_id(self, variables):
1399 """Remove a dict of variables from the user namespace, if they are the
1400 """Remove a dict of variables from the user namespace, if they are the
1400 same as the values in the dictionary.
1401 same as the values in the dictionary.
1401
1402
1402 This is intended for use by extensions: variables that they've added can
1403 This is intended for use by extensions: variables that they've added can
1403 be taken back out if they are unloaded, without removing any that the
1404 be taken back out if they are unloaded, without removing any that the
1404 user has overwritten.
1405 user has overwritten.
1405
1406
1406 Parameters
1407 Parameters
1407 ----------
1408 ----------
1408 variables : dict
1409 variables : dict
1409 A dictionary mapping object names (as strings) to the objects.
1410 A dictionary mapping object names (as strings) to the objects.
1410 """
1411 """
1411 for name, obj in iteritems(variables):
1412 for name, obj in iteritems(variables):
1412 if name in self.user_ns and self.user_ns[name] is obj:
1413 if name in self.user_ns and self.user_ns[name] is obj:
1413 del self.user_ns[name]
1414 del self.user_ns[name]
1414 self.user_ns_hidden.pop(name, None)
1415 self.user_ns_hidden.pop(name, None)
1415
1416
1416 #-------------------------------------------------------------------------
1417 #-------------------------------------------------------------------------
1417 # Things related to object introspection
1418 # Things related to object introspection
1418 #-------------------------------------------------------------------------
1419 #-------------------------------------------------------------------------
1419
1420
1420 def _ofind(self, oname, namespaces=None):
1421 def _ofind(self, oname, namespaces=None):
1421 """Find an object in the available namespaces.
1422 """Find an object in the available namespaces.
1422
1423
1423 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1424 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1424
1425
1425 Has special code to detect magic functions.
1426 Has special code to detect magic functions.
1426 """
1427 """
1427 oname = oname.strip()
1428 oname = oname.strip()
1428 #print '1- oname: <%r>' % oname # dbg
1429 #print '1- oname: <%r>' % oname # dbg
1429 if not oname.startswith(ESC_MAGIC) and \
1430 if not oname.startswith(ESC_MAGIC) and \
1430 not oname.startswith(ESC_MAGIC2) and \
1431 not oname.startswith(ESC_MAGIC2) and \
1431 not py3compat.isidentifier(oname, dotted=True):
1432 not py3compat.isidentifier(oname, dotted=True):
1432 return dict(found=False)
1433 return dict(found=False)
1433
1434
1434 alias_ns = None
1435 alias_ns = None
1435 if namespaces is None:
1436 if namespaces is None:
1436 # Namespaces to search in:
1437 # Namespaces to search in:
1437 # Put them in a list. The order is important so that we
1438 # Put them in a list. The order is important so that we
1438 # find things in the same order that Python finds them.
1439 # find things in the same order that Python finds them.
1439 namespaces = [ ('Interactive', self.user_ns),
1440 namespaces = [ ('Interactive', self.user_ns),
1440 ('Interactive (global)', self.user_global_ns),
1441 ('Interactive (global)', self.user_global_ns),
1441 ('Python builtin', builtin_mod.__dict__),
1442 ('Python builtin', builtin_mod.__dict__),
1442 ]
1443 ]
1443
1444
1444 # initialize results to 'null'
1445 # initialize results to 'null'
1445 found = False; obj = None; ospace = None; ds = None;
1446 found = False; obj = None; ospace = None; ds = None;
1446 ismagic = False; isalias = False; parent = None
1447 ismagic = False; isalias = False; parent = None
1447
1448
1448 # We need to special-case 'print', which as of python2.6 registers as a
1449 # We need to special-case 'print', which as of python2.6 registers as a
1449 # function but should only be treated as one if print_function was
1450 # function but should only be treated as one if print_function was
1450 # loaded with a future import. In this case, just bail.
1451 # loaded with a future import. In this case, just bail.
1451 if (oname == 'print' and not py3compat.PY3 and not \
1452 if (oname == 'print' and not py3compat.PY3 and not \
1452 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1453 (self.compile.compiler_flags & __future__.CO_FUTURE_PRINT_FUNCTION)):
1453 return {'found':found, 'obj':obj, 'namespace':ospace,
1454 return {'found':found, 'obj':obj, 'namespace':ospace,
1454 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1455 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1455
1456
1456 # Look for the given name by splitting it in parts. If the head is
1457 # Look for the given name by splitting it in parts. If the head is
1457 # found, then we look for all the remaining parts as members, and only
1458 # found, then we look for all the remaining parts as members, and only
1458 # declare success if we can find them all.
1459 # declare success if we can find them all.
1459 oname_parts = oname.split('.')
1460 oname_parts = oname.split('.')
1460 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1461 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1461 for nsname,ns in namespaces:
1462 for nsname,ns in namespaces:
1462 try:
1463 try:
1463 obj = ns[oname_head]
1464 obj = ns[oname_head]
1464 except KeyError:
1465 except KeyError:
1465 continue
1466 continue
1466 else:
1467 else:
1467 #print 'oname_rest:', oname_rest # dbg
1468 #print 'oname_rest:', oname_rest # dbg
1468 for idx, part in enumerate(oname_rest):
1469 for idx, part in enumerate(oname_rest):
1469 try:
1470 try:
1470 parent = obj
1471 parent = obj
1471 # The last part is looked up in a special way to avoid
1472 # The last part is looked up in a special way to avoid
1472 # descriptor invocation as it may raise or have side
1473 # descriptor invocation as it may raise or have side
1473 # effects.
1474 # effects.
1474 if idx == len(oname_rest) - 1:
1475 if idx == len(oname_rest) - 1:
1475 obj = self._getattr_property(obj, part)
1476 obj = self._getattr_property(obj, part)
1476 else:
1477 else:
1477 obj = getattr(obj, part)
1478 obj = getattr(obj, part)
1478 except:
1479 except:
1479 # Blanket except b/c some badly implemented objects
1480 # Blanket except b/c some badly implemented objects
1480 # allow __getattr__ to raise exceptions other than
1481 # allow __getattr__ to raise exceptions other than
1481 # AttributeError, which then crashes IPython.
1482 # AttributeError, which then crashes IPython.
1482 break
1483 break
1483 else:
1484 else:
1484 # If we finish the for loop (no break), we got all members
1485 # If we finish the for loop (no break), we got all members
1485 found = True
1486 found = True
1486 ospace = nsname
1487 ospace = nsname
1487 break # namespace loop
1488 break # namespace loop
1488
1489
1489 # Try to see if it's magic
1490 # Try to see if it's magic
1490 if not found:
1491 if not found:
1491 obj = None
1492 obj = None
1492 if oname.startswith(ESC_MAGIC2):
1493 if oname.startswith(ESC_MAGIC2):
1493 oname = oname.lstrip(ESC_MAGIC2)
1494 oname = oname.lstrip(ESC_MAGIC2)
1494 obj = self.find_cell_magic(oname)
1495 obj = self.find_cell_magic(oname)
1495 elif oname.startswith(ESC_MAGIC):
1496 elif oname.startswith(ESC_MAGIC):
1496 oname = oname.lstrip(ESC_MAGIC)
1497 oname = oname.lstrip(ESC_MAGIC)
1497 obj = self.find_line_magic(oname)
1498 obj = self.find_line_magic(oname)
1498 else:
1499 else:
1499 # search without prefix, so run? will find %run?
1500 # search without prefix, so run? will find %run?
1500 obj = self.find_line_magic(oname)
1501 obj = self.find_line_magic(oname)
1501 if obj is None:
1502 if obj is None:
1502 obj = self.find_cell_magic(oname)
1503 obj = self.find_cell_magic(oname)
1503 if obj is not None:
1504 if obj is not None:
1504 found = True
1505 found = True
1505 ospace = 'IPython internal'
1506 ospace = 'IPython internal'
1506 ismagic = True
1507 ismagic = True
1507 isalias = isinstance(obj, Alias)
1508 isalias = isinstance(obj, Alias)
1508
1509
1509 # Last try: special-case some literals like '', [], {}, etc:
1510 # Last try: special-case some literals like '', [], {}, etc:
1510 if not found and oname_head in ["''",'""','[]','{}','()']:
1511 if not found and oname_head in ["''",'""','[]','{}','()']:
1511 obj = eval(oname_head)
1512 obj = eval(oname_head)
1512 found = True
1513 found = True
1513 ospace = 'Interactive'
1514 ospace = 'Interactive'
1514
1515
1515 return {'found':found, 'obj':obj, 'namespace':ospace,
1516 return {'found':found, 'obj':obj, 'namespace':ospace,
1516 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1517 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1517
1518
1518 @staticmethod
1519 @staticmethod
1519 def _getattr_property(obj, attrname):
1520 def _getattr_property(obj, attrname):
1520 """Property-aware getattr to use in object finding.
1521 """Property-aware getattr to use in object finding.
1521
1522
1522 If attrname represents a property, return it unevaluated (in case it has
1523 If attrname represents a property, return it unevaluated (in case it has
1523 side effects or raises an error.
1524 side effects or raises an error.
1524
1525
1525 """
1526 """
1526 if not isinstance(obj, type):
1527 if not isinstance(obj, type):
1527 try:
1528 try:
1528 # `getattr(type(obj), attrname)` is not guaranteed to return
1529 # `getattr(type(obj), attrname)` is not guaranteed to return
1529 # `obj`, but does so for property:
1530 # `obj`, but does so for property:
1530 #
1531 #
1531 # property.__get__(self, None, cls) -> self
1532 # property.__get__(self, None, cls) -> self
1532 #
1533 #
1533 # The universal alternative is to traverse the mro manually
1534 # The universal alternative is to traverse the mro manually
1534 # searching for attrname in class dicts.
1535 # searching for attrname in class dicts.
1535 attr = getattr(type(obj), attrname)
1536 attr = getattr(type(obj), attrname)
1536 except AttributeError:
1537 except AttributeError:
1537 pass
1538 pass
1538 else:
1539 else:
1539 # This relies on the fact that data descriptors (with both
1540 # This relies on the fact that data descriptors (with both
1540 # __get__ & __set__ magic methods) take precedence over
1541 # __get__ & __set__ magic methods) take precedence over
1541 # instance-level attributes:
1542 # instance-level attributes:
1542 #
1543 #
1543 # class A(object):
1544 # class A(object):
1544 # @property
1545 # @property
1545 # def foobar(self): return 123
1546 # def foobar(self): return 123
1546 # a = A()
1547 # a = A()
1547 # a.__dict__['foobar'] = 345
1548 # a.__dict__['foobar'] = 345
1548 # a.foobar # == 123
1549 # a.foobar # == 123
1549 #
1550 #
1550 # So, a property may be returned right away.
1551 # So, a property may be returned right away.
1551 if isinstance(attr, property):
1552 if isinstance(attr, property):
1552 return attr
1553 return attr
1553
1554
1554 # Nothing helped, fall back.
1555 # Nothing helped, fall back.
1555 return getattr(obj, attrname)
1556 return getattr(obj, attrname)
1556
1557
1557 def _object_find(self, oname, namespaces=None):
1558 def _object_find(self, oname, namespaces=None):
1558 """Find an object and return a struct with info about it."""
1559 """Find an object and return a struct with info about it."""
1559 return Struct(self._ofind(oname, namespaces))
1560 return Struct(self._ofind(oname, namespaces))
1560
1561
1561 def _inspect(self, meth, oname, namespaces=None, **kw):
1562 def _inspect(self, meth, oname, namespaces=None, **kw):
1562 """Generic interface to the inspector system.
1563 """Generic interface to the inspector system.
1563
1564
1564 This function is meant to be called by pdef, pdoc & friends."""
1565 This function is meant to be called by pdef, pdoc & friends."""
1565 info = self._object_find(oname, namespaces)
1566 info = self._object_find(oname, namespaces)
1566 if info.found:
1567 if info.found:
1567 pmethod = getattr(self.inspector, meth)
1568 pmethod = getattr(self.inspector, meth)
1568 formatter = format_screen if info.ismagic else None
1569 formatter = format_screen if info.ismagic else None
1569 if meth == 'pdoc':
1570 if meth == 'pdoc':
1570 pmethod(info.obj, oname, formatter)
1571 pmethod(info.obj, oname, formatter)
1571 elif meth == 'pinfo':
1572 elif meth == 'pinfo':
1572 pmethod(info.obj, oname, formatter, info, **kw)
1573 pmethod(info.obj, oname, formatter, info, **kw)
1573 else:
1574 else:
1574 pmethod(info.obj, oname)
1575 pmethod(info.obj, oname)
1575 else:
1576 else:
1576 print('Object `%s` not found.' % oname)
1577 print('Object `%s` not found.' % oname)
1577 return 'not found' # so callers can take other action
1578 return 'not found' # so callers can take other action
1578
1579
1579 def object_inspect(self, oname, detail_level=0):
1580 def object_inspect(self, oname, detail_level=0):
1580 """Get object info about oname"""
1581 """Get object info about oname"""
1581 with self.builtin_trap:
1582 with self.builtin_trap:
1582 info = self._object_find(oname)
1583 info = self._object_find(oname)
1583 if info.found:
1584 if info.found:
1584 return self.inspector.info(info.obj, oname, info=info,
1585 return self.inspector.info(info.obj, oname, info=info,
1585 detail_level=detail_level
1586 detail_level=detail_level
1586 )
1587 )
1587 else:
1588 else:
1588 return oinspect.object_info(name=oname, found=False)
1589 return oinspect.object_info(name=oname, found=False)
1589
1590
1590 def object_inspect_text(self, oname, detail_level=0):
1591 def object_inspect_text(self, oname, detail_level=0):
1591 """Get object info as formatted text"""
1592 """Get object info as formatted text"""
1592 with self.builtin_trap:
1593 with self.builtin_trap:
1593 info = self._object_find(oname)
1594 info = self._object_find(oname)
1594 if info.found:
1595 if info.found:
1595 return self.inspector._format_info(info.obj, oname, info=info,
1596 return self.inspector._format_info(info.obj, oname, info=info,
1596 detail_level=detail_level
1597 detail_level=detail_level
1597 )
1598 )
1598 else:
1599 else:
1599 raise KeyError(oname)
1600 raise KeyError(oname)
1600
1601
1601 #-------------------------------------------------------------------------
1602 #-------------------------------------------------------------------------
1602 # Things related to history management
1603 # Things related to history management
1603 #-------------------------------------------------------------------------
1604 #-------------------------------------------------------------------------
1604
1605
1605 def init_history(self):
1606 def init_history(self):
1606 """Sets up the command history, and starts regular autosaves."""
1607 """Sets up the command history, and starts regular autosaves."""
1607 self.history_manager = HistoryManager(shell=self, parent=self)
1608 self.history_manager = HistoryManager(shell=self, parent=self)
1608 self.configurables.append(self.history_manager)
1609 self.configurables.append(self.history_manager)
1609
1610
1610 #-------------------------------------------------------------------------
1611 #-------------------------------------------------------------------------
1611 # Things related to exception handling and tracebacks (not debugging)
1612 # Things related to exception handling and tracebacks (not debugging)
1612 #-------------------------------------------------------------------------
1613 #-------------------------------------------------------------------------
1613
1614
1614 def init_traceback_handlers(self, custom_exceptions):
1615 def init_traceback_handlers(self, custom_exceptions):
1615 # Syntax error handler.
1616 # Syntax error handler.
1616 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1617 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1617
1618
1618 # The interactive one is initialized with an offset, meaning we always
1619 # The interactive one is initialized with an offset, meaning we always
1619 # want to remove the topmost item in the traceback, which is our own
1620 # want to remove the topmost item in the traceback, which is our own
1620 # internal code. Valid modes: ['Plain','Context','Verbose']
1621 # internal code. Valid modes: ['Plain','Context','Verbose']
1621 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1622 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1622 color_scheme='NoColor',
1623 color_scheme='NoColor',
1623 tb_offset = 1,
1624 tb_offset = 1,
1624 check_cache=check_linecache_ipython)
1625 check_cache=check_linecache_ipython)
1625
1626
1626 # The instance will store a pointer to the system-wide exception hook,
1627 # The instance will store a pointer to the system-wide exception hook,
1627 # so that runtime code (such as magics) can access it. This is because
1628 # so that runtime code (such as magics) can access it. This is because
1628 # during the read-eval loop, it may get temporarily overwritten.
1629 # during the read-eval loop, it may get temporarily overwritten.
1629 self.sys_excepthook = sys.excepthook
1630 self.sys_excepthook = sys.excepthook
1630
1631
1631 # and add any custom exception handlers the user may have specified
1632 # and add any custom exception handlers the user may have specified
1632 self.set_custom_exc(*custom_exceptions)
1633 self.set_custom_exc(*custom_exceptions)
1633
1634
1634 # Set the exception mode
1635 # Set the exception mode
1635 self.InteractiveTB.set_mode(mode=self.xmode)
1636 self.InteractiveTB.set_mode(mode=self.xmode)
1636
1637
1637 def set_custom_exc(self, exc_tuple, handler):
1638 def set_custom_exc(self, exc_tuple, handler):
1638 """set_custom_exc(exc_tuple,handler)
1639 """set_custom_exc(exc_tuple,handler)
1639
1640
1640 Set a custom exception handler, which will be called if any of the
1641 Set a custom exception handler, which will be called if any of the
1641 exceptions in exc_tuple occur in the mainloop (specifically, in the
1642 exceptions in exc_tuple occur in the mainloop (specifically, in the
1642 run_code() method).
1643 run_code() method).
1643
1644
1644 Parameters
1645 Parameters
1645 ----------
1646 ----------
1646
1647
1647 exc_tuple : tuple of exception classes
1648 exc_tuple : tuple of exception classes
1648 A *tuple* of exception classes, for which to call the defined
1649 A *tuple* of exception classes, for which to call the defined
1649 handler. It is very important that you use a tuple, and NOT A
1650 handler. It is very important that you use a tuple, and NOT A
1650 LIST here, because of the way Python's except statement works. If
1651 LIST here, because of the way Python's except statement works. If
1651 you only want to trap a single exception, use a singleton tuple::
1652 you only want to trap a single exception, use a singleton tuple::
1652
1653
1653 exc_tuple == (MyCustomException,)
1654 exc_tuple == (MyCustomException,)
1654
1655
1655 handler : callable
1656 handler : callable
1656 handler must have the following signature::
1657 handler must have the following signature::
1657
1658
1658 def my_handler(self, etype, value, tb, tb_offset=None):
1659 def my_handler(self, etype, value, tb, tb_offset=None):
1659 ...
1660 ...
1660 return structured_traceback
1661 return structured_traceback
1661
1662
1662 Your handler must return a structured traceback (a list of strings),
1663 Your handler must return a structured traceback (a list of strings),
1663 or None.
1664 or None.
1664
1665
1665 This will be made into an instance method (via types.MethodType)
1666 This will be made into an instance method (via types.MethodType)
1666 of IPython itself, and it will be called if any of the exceptions
1667 of IPython itself, and it will be called if any of the exceptions
1667 listed in the exc_tuple are caught. If the handler is None, an
1668 listed in the exc_tuple are caught. If the handler is None, an
1668 internal basic one is used, which just prints basic info.
1669 internal basic one is used, which just prints basic info.
1669
1670
1670 To protect IPython from crashes, if your handler ever raises an
1671 To protect IPython from crashes, if your handler ever raises an
1671 exception or returns an invalid result, it will be immediately
1672 exception or returns an invalid result, it will be immediately
1672 disabled.
1673 disabled.
1673
1674
1674 WARNING: by putting in your own exception handler into IPython's main
1675 WARNING: by putting in your own exception handler into IPython's main
1675 execution loop, you run a very good chance of nasty crashes. This
1676 execution loop, you run a very good chance of nasty crashes. This
1676 facility should only be used if you really know what you are doing."""
1677 facility should only be used if you really know what you are doing."""
1677
1678
1678 assert type(exc_tuple)==type(()) , \
1679 assert type(exc_tuple)==type(()) , \
1679 "The custom exceptions must be given AS A TUPLE."
1680 "The custom exceptions must be given AS A TUPLE."
1680
1681
1681 def dummy_handler(self,etype,value,tb,tb_offset=None):
1682 def dummy_handler(self,etype,value,tb,tb_offset=None):
1682 print('*** Simple custom exception handler ***')
1683 print('*** Simple custom exception handler ***')
1683 print('Exception type :',etype)
1684 print('Exception type :',etype)
1684 print('Exception value:',value)
1685 print('Exception value:',value)
1685 print('Traceback :',tb)
1686 print('Traceback :',tb)
1686 #print 'Source code :','\n'.join(self.buffer)
1687 #print 'Source code :','\n'.join(self.buffer)
1687
1688
1688 def validate_stb(stb):
1689 def validate_stb(stb):
1689 """validate structured traceback return type
1690 """validate structured traceback return type
1690
1691
1691 return type of CustomTB *should* be a list of strings, but allow
1692 return type of CustomTB *should* be a list of strings, but allow
1692 single strings or None, which are harmless.
1693 single strings or None, which are harmless.
1693
1694
1694 This function will *always* return a list of strings,
1695 This function will *always* return a list of strings,
1695 and will raise a TypeError if stb is inappropriate.
1696 and will raise a TypeError if stb is inappropriate.
1696 """
1697 """
1697 msg = "CustomTB must return list of strings, not %r" % stb
1698 msg = "CustomTB must return list of strings, not %r" % stb
1698 if stb is None:
1699 if stb is None:
1699 return []
1700 return []
1700 elif isinstance(stb, string_types):
1701 elif isinstance(stb, string_types):
1701 return [stb]
1702 return [stb]
1702 elif not isinstance(stb, list):
1703 elif not isinstance(stb, list):
1703 raise TypeError(msg)
1704 raise TypeError(msg)
1704 # it's a list
1705 # it's a list
1705 for line in stb:
1706 for line in stb:
1706 # check every element
1707 # check every element
1707 if not isinstance(line, string_types):
1708 if not isinstance(line, string_types):
1708 raise TypeError(msg)
1709 raise TypeError(msg)
1709 return stb
1710 return stb
1710
1711
1711 if handler is None:
1712 if handler is None:
1712 wrapped = dummy_handler
1713 wrapped = dummy_handler
1713 else:
1714 else:
1714 def wrapped(self,etype,value,tb,tb_offset=None):
1715 def wrapped(self,etype,value,tb,tb_offset=None):
1715 """wrap CustomTB handler, to protect IPython from user code
1716 """wrap CustomTB handler, to protect IPython from user code
1716
1717
1717 This makes it harder (but not impossible) for custom exception
1718 This makes it harder (but not impossible) for custom exception
1718 handlers to crash IPython.
1719 handlers to crash IPython.
1719 """
1720 """
1720 try:
1721 try:
1721 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1722 stb = handler(self,etype,value,tb,tb_offset=tb_offset)
1722 return validate_stb(stb)
1723 return validate_stb(stb)
1723 except:
1724 except:
1724 # clear custom handler immediately
1725 # clear custom handler immediately
1725 self.set_custom_exc((), None)
1726 self.set_custom_exc((), None)
1726 print("Custom TB Handler failed, unregistering", file=io.stderr)
1727 print("Custom TB Handler failed, unregistering", file=io.stderr)
1727 # show the exception in handler first
1728 # show the exception in handler first
1728 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1729 stb = self.InteractiveTB.structured_traceback(*sys.exc_info())
1729 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1730 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1730 print("The original exception:", file=io.stdout)
1731 print("The original exception:", file=io.stdout)
1731 stb = self.InteractiveTB.structured_traceback(
1732 stb = self.InteractiveTB.structured_traceback(
1732 (etype,value,tb), tb_offset=tb_offset
1733 (etype,value,tb), tb_offset=tb_offset
1733 )
1734 )
1734 return stb
1735 return stb
1735
1736
1736 self.CustomTB = types.MethodType(wrapped,self)
1737 self.CustomTB = types.MethodType(wrapped,self)
1737 self.custom_exceptions = exc_tuple
1738 self.custom_exceptions = exc_tuple
1738
1739
1739 def excepthook(self, etype, value, tb):
1740 def excepthook(self, etype, value, tb):
1740 """One more defense for GUI apps that call sys.excepthook.
1741 """One more defense for GUI apps that call sys.excepthook.
1741
1742
1742 GUI frameworks like wxPython trap exceptions and call
1743 GUI frameworks like wxPython trap exceptions and call
1743 sys.excepthook themselves. I guess this is a feature that
1744 sys.excepthook themselves. I guess this is a feature that
1744 enables them to keep running after exceptions that would
1745 enables them to keep running after exceptions that would
1745 otherwise kill their mainloop. This is a bother for IPython
1746 otherwise kill their mainloop. This is a bother for IPython
1746 which excepts to catch all of the program exceptions with a try:
1747 which excepts to catch all of the program exceptions with a try:
1747 except: statement.
1748 except: statement.
1748
1749
1749 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1750 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1750 any app directly invokes sys.excepthook, it will look to the user like
1751 any app directly invokes sys.excepthook, it will look to the user like
1751 IPython crashed. In order to work around this, we can disable the
1752 IPython crashed. In order to work around this, we can disable the
1752 CrashHandler and replace it with this excepthook instead, which prints a
1753 CrashHandler and replace it with this excepthook instead, which prints a
1753 regular traceback using our InteractiveTB. In this fashion, apps which
1754 regular traceback using our InteractiveTB. In this fashion, apps which
1754 call sys.excepthook will generate a regular-looking exception from
1755 call sys.excepthook will generate a regular-looking exception from
1755 IPython, and the CrashHandler will only be triggered by real IPython
1756 IPython, and the CrashHandler will only be triggered by real IPython
1756 crashes.
1757 crashes.
1757
1758
1758 This hook should be used sparingly, only in places which are not likely
1759 This hook should be used sparingly, only in places which are not likely
1759 to be true IPython errors.
1760 to be true IPython errors.
1760 """
1761 """
1761 self.showtraceback((etype, value, tb), tb_offset=0)
1762 self.showtraceback((etype, value, tb), tb_offset=0)
1762
1763
1763 def _get_exc_info(self, exc_tuple=None):
1764 def _get_exc_info(self, exc_tuple=None):
1764 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1765 """get exc_info from a given tuple, sys.exc_info() or sys.last_type etc.
1765
1766
1766 Ensures sys.last_type,value,traceback hold the exc_info we found,
1767 Ensures sys.last_type,value,traceback hold the exc_info we found,
1767 from whichever source.
1768 from whichever source.
1768
1769
1769 raises ValueError if none of these contain any information
1770 raises ValueError if none of these contain any information
1770 """
1771 """
1771 if exc_tuple is None:
1772 if exc_tuple is None:
1772 etype, value, tb = sys.exc_info()
1773 etype, value, tb = sys.exc_info()
1773 else:
1774 else:
1774 etype, value, tb = exc_tuple
1775 etype, value, tb = exc_tuple
1775
1776
1776 if etype is None:
1777 if etype is None:
1777 if hasattr(sys, 'last_type'):
1778 if hasattr(sys, 'last_type'):
1778 etype, value, tb = sys.last_type, sys.last_value, \
1779 etype, value, tb = sys.last_type, sys.last_value, \
1779 sys.last_traceback
1780 sys.last_traceback
1780
1781
1781 if etype is None:
1782 if etype is None:
1782 raise ValueError("No exception to find")
1783 raise ValueError("No exception to find")
1783
1784
1784 # Now store the exception info in sys.last_type etc.
1785 # Now store the exception info in sys.last_type etc.
1785 # WARNING: these variables are somewhat deprecated and not
1786 # WARNING: these variables are somewhat deprecated and not
1786 # necessarily safe to use in a threaded environment, but tools
1787 # necessarily safe to use in a threaded environment, but tools
1787 # like pdb depend on their existence, so let's set them. If we
1788 # like pdb depend on their existence, so let's set them. If we
1788 # find problems in the field, we'll need to revisit their use.
1789 # find problems in the field, we'll need to revisit their use.
1789 sys.last_type = etype
1790 sys.last_type = etype
1790 sys.last_value = value
1791 sys.last_value = value
1791 sys.last_traceback = tb
1792 sys.last_traceback = tb
1792
1793
1793 return etype, value, tb
1794 return etype, value, tb
1794
1795
1795 def show_usage_error(self, exc):
1796 def show_usage_error(self, exc):
1796 """Show a short message for UsageErrors
1797 """Show a short message for UsageErrors
1797
1798
1798 These are special exceptions that shouldn't show a traceback.
1799 These are special exceptions that shouldn't show a traceback.
1799 """
1800 """
1800 self.write_err("UsageError: %s" % exc)
1801 self.write_err("UsageError: %s" % exc)
1801
1802
1802 def get_exception_only(self, exc_tuple=None):
1803 def get_exception_only(self, exc_tuple=None):
1803 """
1804 """
1804 Return as a string (ending with a newline) the exception that
1805 Return as a string (ending with a newline) the exception that
1805 just occurred, without any traceback.
1806 just occurred, without any traceback.
1806 """
1807 """
1807 etype, value, tb = self._get_exc_info(exc_tuple)
1808 etype, value, tb = self._get_exc_info(exc_tuple)
1808 msg = traceback.format_exception_only(etype, value)
1809 msg = traceback.format_exception_only(etype, value)
1809 return ''.join(msg)
1810 return ''.join(msg)
1810
1811
1811 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
1812 def showtraceback(self, exc_tuple=None, filename=None, tb_offset=None,
1812 exception_only=False):
1813 exception_only=False):
1813 """Display the exception that just occurred.
1814 """Display the exception that just occurred.
1814
1815
1815 If nothing is known about the exception, this is the method which
1816 If nothing is known about the exception, this is the method which
1816 should be used throughout the code for presenting user tracebacks,
1817 should be used throughout the code for presenting user tracebacks,
1817 rather than directly invoking the InteractiveTB object.
1818 rather than directly invoking the InteractiveTB object.
1818
1819
1819 A specific showsyntaxerror() also exists, but this method can take
1820 A specific showsyntaxerror() also exists, but this method can take
1820 care of calling it if needed, so unless you are explicitly catching a
1821 care of calling it if needed, so unless you are explicitly catching a
1821 SyntaxError exception, don't try to analyze the stack manually and
1822 SyntaxError exception, don't try to analyze the stack manually and
1822 simply call this method."""
1823 simply call this method."""
1823
1824
1824 try:
1825 try:
1825 try:
1826 try:
1826 etype, value, tb = self._get_exc_info(exc_tuple)
1827 etype, value, tb = self._get_exc_info(exc_tuple)
1827 except ValueError:
1828 except ValueError:
1828 self.write_err('No traceback available to show.\n')
1829 self.write_err('No traceback available to show.\n')
1829 return
1830 return
1830
1831
1831 if issubclass(etype, SyntaxError):
1832 if issubclass(etype, SyntaxError):
1832 # Though this won't be called by syntax errors in the input
1833 # Though this won't be called by syntax errors in the input
1833 # line, there may be SyntaxError cases with imported code.
1834 # line, there may be SyntaxError cases with imported code.
1834 self.showsyntaxerror(filename)
1835 self.showsyntaxerror(filename)
1835 elif etype is UsageError:
1836 elif etype is UsageError:
1836 self.show_usage_error(value)
1837 self.show_usage_error(value)
1837 else:
1838 else:
1838 if exception_only:
1839 if exception_only:
1839 stb = ['An exception has occurred, use %tb to see '
1840 stb = ['An exception has occurred, use %tb to see '
1840 'the full traceback.\n']
1841 'the full traceback.\n']
1841 stb.extend(self.InteractiveTB.get_exception_only(etype,
1842 stb.extend(self.InteractiveTB.get_exception_only(etype,
1842 value))
1843 value))
1843 else:
1844 else:
1844 try:
1845 try:
1845 # Exception classes can customise their traceback - we
1846 # Exception classes can customise their traceback - we
1846 # use this in IPython.parallel for exceptions occurring
1847 # use this in IPython.parallel for exceptions occurring
1847 # in the engines. This should return a list of strings.
1848 # in the engines. This should return a list of strings.
1848 stb = value._render_traceback_()
1849 stb = value._render_traceback_()
1849 except Exception:
1850 except Exception:
1850 stb = self.InteractiveTB.structured_traceback(etype,
1851 stb = self.InteractiveTB.structured_traceback(etype,
1851 value, tb, tb_offset=tb_offset)
1852 value, tb, tb_offset=tb_offset)
1852
1853
1853 self._showtraceback(etype, value, stb)
1854 self._showtraceback(etype, value, stb)
1854 if self.call_pdb:
1855 if self.call_pdb:
1855 # drop into debugger
1856 # drop into debugger
1856 self.debugger(force=True)
1857 self.debugger(force=True)
1857 return
1858 return
1858
1859
1859 # Actually show the traceback
1860 # Actually show the traceback
1860 self._showtraceback(etype, value, stb)
1861 self._showtraceback(etype, value, stb)
1861
1862
1862 except KeyboardInterrupt:
1863 except KeyboardInterrupt:
1863 self.write_err('\n' + self.get_exception_only())
1864 self.write_err('\n' + self.get_exception_only())
1864
1865
1865 def _showtraceback(self, etype, evalue, stb):
1866 def _showtraceback(self, etype, evalue, stb):
1866 """Actually show a traceback.
1867 """Actually show a traceback.
1867
1868
1868 Subclasses may override this method to put the traceback on a different
1869 Subclasses may override this method to put the traceback on a different
1869 place, like a side channel.
1870 place, like a side channel.
1870 """
1871 """
1871 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1872 print(self.InteractiveTB.stb2text(stb), file=io.stdout)
1872
1873
1873 def showsyntaxerror(self, filename=None):
1874 def showsyntaxerror(self, filename=None):
1874 """Display the syntax error that just occurred.
1875 """Display the syntax error that just occurred.
1875
1876
1876 This doesn't display a stack trace because there isn't one.
1877 This doesn't display a stack trace because there isn't one.
1877
1878
1878 If a filename is given, it is stuffed in the exception instead
1879 If a filename is given, it is stuffed in the exception instead
1879 of what was there before (because Python's parser always uses
1880 of what was there before (because Python's parser always uses
1880 "<string>" when reading from a string).
1881 "<string>" when reading from a string).
1881 """
1882 """
1882 etype, value, last_traceback = self._get_exc_info()
1883 etype, value, last_traceback = self._get_exc_info()
1883
1884
1884 if filename and issubclass(etype, SyntaxError):
1885 if filename and issubclass(etype, SyntaxError):
1885 try:
1886 try:
1886 value.filename = filename
1887 value.filename = filename
1887 except:
1888 except:
1888 # Not the format we expect; leave it alone
1889 # Not the format we expect; leave it alone
1889 pass
1890 pass
1890
1891
1891 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1892 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1892 self._showtraceback(etype, value, stb)
1893 self._showtraceback(etype, value, stb)
1893
1894
1894 # This is overridden in TerminalInteractiveShell to show a message about
1895 # This is overridden in TerminalInteractiveShell to show a message about
1895 # the %paste magic.
1896 # the %paste magic.
1896 def showindentationerror(self):
1897 def showindentationerror(self):
1897 """Called by run_cell when there's an IndentationError in code entered
1898 """Called by run_cell when there's an IndentationError in code entered
1898 at the prompt.
1899 at the prompt.
1899
1900
1900 This is overridden in TerminalInteractiveShell to show a message about
1901 This is overridden in TerminalInteractiveShell to show a message about
1901 the %paste magic."""
1902 the %paste magic."""
1902 self.showsyntaxerror()
1903 self.showsyntaxerror()
1903
1904
1904 #-------------------------------------------------------------------------
1905 #-------------------------------------------------------------------------
1905 # Things related to readline
1906 # Things related to readline
1906 #-------------------------------------------------------------------------
1907 #-------------------------------------------------------------------------
1907
1908
1908 def init_readline(self):
1909 def init_readline(self):
1909 """Command history completion/saving/reloading."""
1910 """Command history completion/saving/reloading."""
1910
1911
1911 if self.readline_use:
1912 if self.readline_use:
1912 import IPython.utils.rlineimpl as readline
1913 import IPython.utils.rlineimpl as readline
1913
1914
1914 self.rl_next_input = None
1915 self.rl_next_input = None
1915 self.rl_do_indent = False
1916 self.rl_do_indent = False
1916
1917
1917 if not self.readline_use or not readline.have_readline:
1918 if not self.readline_use or not readline.have_readline:
1918 self.has_readline = False
1919 self.has_readline = False
1919 self.readline = None
1920 self.readline = None
1920 # Set a number of methods that depend on readline to be no-op
1921 # Set a number of methods that depend on readline to be no-op
1921 self.readline_no_record = no_op_context
1922 self.readline_no_record = no_op_context
1922 self.set_readline_completer = no_op
1923 self.set_readline_completer = no_op
1923 self.set_custom_completer = no_op
1924 self.set_custom_completer = no_op
1924 if self.readline_use:
1925 if self.readline_use:
1925 warn('Readline services not available or not loaded.')
1926 warn('Readline services not available or not loaded.')
1926 else:
1927 else:
1927 self.has_readline = True
1928 self.has_readline = True
1928 self.readline = readline
1929 self.readline = readline
1929 sys.modules['readline'] = readline
1930 sys.modules['readline'] = readline
1930
1931
1931 # Platform-specific configuration
1932 # Platform-specific configuration
1932 if os.name == 'nt':
1933 if os.name == 'nt':
1933 # FIXME - check with Frederick to see if we can harmonize
1934 # FIXME - check with Frederick to see if we can harmonize
1934 # naming conventions with pyreadline to avoid this
1935 # naming conventions with pyreadline to avoid this
1935 # platform-dependent check
1936 # platform-dependent check
1936 self.readline_startup_hook = readline.set_pre_input_hook
1937 self.readline_startup_hook = readline.set_pre_input_hook
1937 else:
1938 else:
1938 self.readline_startup_hook = readline.set_startup_hook
1939 self.readline_startup_hook = readline.set_startup_hook
1939
1940
1940 # Readline config order:
1941 # Readline config order:
1941 # - IPython config (default value)
1942 # - IPython config (default value)
1942 # - custom inputrc
1943 # - custom inputrc
1943 # - IPython config (user customized)
1944 # - IPython config (user customized)
1944
1945
1945 # load IPython config before inputrc if default
1946 # load IPython config before inputrc if default
1946 # skip if libedit because parse_and_bind syntax is different
1947 # skip if libedit because parse_and_bind syntax is different
1947 if not self._custom_readline_config and not readline.uses_libedit:
1948 if not self._custom_readline_config and not readline.uses_libedit:
1948 for rlcommand in self.readline_parse_and_bind:
1949 for rlcommand in self.readline_parse_and_bind:
1949 readline.parse_and_bind(rlcommand)
1950 readline.parse_and_bind(rlcommand)
1950
1951
1951 # Load user's initrc file (readline config)
1952 # Load user's initrc file (readline config)
1952 # Or if libedit is used, load editrc.
1953 # Or if libedit is used, load editrc.
1953 inputrc_name = os.environ.get('INPUTRC')
1954 inputrc_name = os.environ.get('INPUTRC')
1954 if inputrc_name is None:
1955 if inputrc_name is None:
1955 inputrc_name = '.inputrc'
1956 inputrc_name = '.inputrc'
1956 if readline.uses_libedit:
1957 if readline.uses_libedit:
1957 inputrc_name = '.editrc'
1958 inputrc_name = '.editrc'
1958 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1959 inputrc_name = os.path.join(self.home_dir, inputrc_name)
1959 if os.path.isfile(inputrc_name):
1960 if os.path.isfile(inputrc_name):
1960 try:
1961 try:
1961 readline.read_init_file(inputrc_name)
1962 readline.read_init_file(inputrc_name)
1962 except:
1963 except:
1963 warn('Problems reading readline initialization file <%s>'
1964 warn('Problems reading readline initialization file <%s>'
1964 % inputrc_name)
1965 % inputrc_name)
1965
1966
1966 # load IPython config after inputrc if user has customized
1967 # load IPython config after inputrc if user has customized
1967 if self._custom_readline_config:
1968 if self._custom_readline_config:
1968 for rlcommand in self.readline_parse_and_bind:
1969 for rlcommand in self.readline_parse_and_bind:
1969 readline.parse_and_bind(rlcommand)
1970 readline.parse_and_bind(rlcommand)
1970
1971
1971 # Remove some chars from the delimiters list. If we encounter
1972 # Remove some chars from the delimiters list. If we encounter
1972 # unicode chars, discard them.
1973 # unicode chars, discard them.
1973 delims = readline.get_completer_delims()
1974 delims = readline.get_completer_delims()
1974 if not py3compat.PY3:
1975 if not py3compat.PY3:
1975 delims = delims.encode("ascii", "ignore")
1976 delims = delims.encode("ascii", "ignore")
1976 for d in self.readline_remove_delims:
1977 for d in self.readline_remove_delims:
1977 delims = delims.replace(d, "")
1978 delims = delims.replace(d, "")
1978 delims = delims.replace(ESC_MAGIC, '')
1979 delims = delims.replace(ESC_MAGIC, '')
1979 readline.set_completer_delims(delims)
1980 readline.set_completer_delims(delims)
1980 # Store these so we can restore them if something like rpy2 modifies
1981 # Store these so we can restore them if something like rpy2 modifies
1981 # them.
1982 # them.
1982 self.readline_delims = delims
1983 self.readline_delims = delims
1983 # otherwise we end up with a monster history after a while:
1984 # otherwise we end up with a monster history after a while:
1984 readline.set_history_length(self.history_length)
1985 readline.set_history_length(self.history_length)
1985
1986
1986 self.refill_readline_hist()
1987 self.refill_readline_hist()
1987 self.readline_no_record = ReadlineNoRecord(self)
1988 self.readline_no_record = ReadlineNoRecord(self)
1988
1989
1989 # Configure auto-indent for all platforms
1990 # Configure auto-indent for all platforms
1990 self.set_autoindent(self.autoindent)
1991 self.set_autoindent(self.autoindent)
1991
1992
1992 def refill_readline_hist(self):
1993 def refill_readline_hist(self):
1993 # Load the last 1000 lines from history
1994 # Load the last 1000 lines from history
1994 self.readline.clear_history()
1995 self.readline.clear_history()
1995 stdin_encoding = sys.stdin.encoding or "utf-8"
1996 stdin_encoding = sys.stdin.encoding or "utf-8"
1996 last_cell = u""
1997 last_cell = u""
1997 for _, _, cell in self.history_manager.get_tail(1000,
1998 for _, _, cell in self.history_manager.get_tail(1000,
1998 include_latest=True):
1999 include_latest=True):
1999 # Ignore blank lines and consecutive duplicates
2000 # Ignore blank lines and consecutive duplicates
2000 cell = cell.rstrip()
2001 cell = cell.rstrip()
2001 if cell and (cell != last_cell):
2002 if cell and (cell != last_cell):
2002 try:
2003 try:
2003 if self.multiline_history:
2004 if self.multiline_history:
2004 self.readline.add_history(py3compat.unicode_to_str(cell,
2005 self.readline.add_history(py3compat.unicode_to_str(cell,
2005 stdin_encoding))
2006 stdin_encoding))
2006 else:
2007 else:
2007 for line in cell.splitlines():
2008 for line in cell.splitlines():
2008 self.readline.add_history(py3compat.unicode_to_str(line,
2009 self.readline.add_history(py3compat.unicode_to_str(line,
2009 stdin_encoding))
2010 stdin_encoding))
2010 last_cell = cell
2011 last_cell = cell
2011
2012
2012 except TypeError:
2013 except TypeError:
2013 # The history DB can get corrupted so it returns strings
2014 # The history DB can get corrupted so it returns strings
2014 # containing null bytes, which readline objects to.
2015 # containing null bytes, which readline objects to.
2015 continue
2016 continue
2016
2017
2017 @skip_doctest
2018 @skip_doctest
2018 def set_next_input(self, s, replace=False):
2019 def set_next_input(self, s, replace=False):
2019 """ Sets the 'default' input string for the next command line.
2020 """ Sets the 'default' input string for the next command line.
2020
2021
2021 Requires readline.
2022 Requires readline.
2022
2023
2023 Example::
2024 Example::
2024
2025
2025 In [1]: _ip.set_next_input("Hello Word")
2026 In [1]: _ip.set_next_input("Hello Word")
2026 In [2]: Hello Word_ # cursor is here
2027 In [2]: Hello Word_ # cursor is here
2027 """
2028 """
2028 self.rl_next_input = py3compat.cast_bytes_py2(s)
2029 self.rl_next_input = py3compat.cast_bytes_py2(s)
2029
2030
2030 # Maybe move this to the terminal subclass?
2031 # Maybe move this to the terminal subclass?
2031 def pre_readline(self):
2032 def pre_readline(self):
2032 """readline hook to be used at the start of each line.
2033 """readline hook to be used at the start of each line.
2033
2034
2034 Currently it handles auto-indent only."""
2035 Currently it handles auto-indent only."""
2035
2036
2036 if self.rl_do_indent:
2037 if self.rl_do_indent:
2037 self.readline.insert_text(self._indent_current_str())
2038 self.readline.insert_text(self._indent_current_str())
2038 if self.rl_next_input is not None:
2039 if self.rl_next_input is not None:
2039 self.readline.insert_text(self.rl_next_input)
2040 self.readline.insert_text(self.rl_next_input)
2040 self.rl_next_input = None
2041 self.rl_next_input = None
2041
2042
2042 def _indent_current_str(self):
2043 def _indent_current_str(self):
2043 """return the current level of indentation as a string"""
2044 """return the current level of indentation as a string"""
2044 return self.input_splitter.indent_spaces * ' '
2045 return self.input_splitter.indent_spaces * ' '
2045
2046
2046 #-------------------------------------------------------------------------
2047 #-------------------------------------------------------------------------
2047 # Things related to text completion
2048 # Things related to text completion
2048 #-------------------------------------------------------------------------
2049 #-------------------------------------------------------------------------
2049
2050
2050 def init_completer(self):
2051 def init_completer(self):
2051 """Initialize the completion machinery.
2052 """Initialize the completion machinery.
2052
2053
2053 This creates completion machinery that can be used by client code,
2054 This creates completion machinery that can be used by client code,
2054 either interactively in-process (typically triggered by the readline
2055 either interactively in-process (typically triggered by the readline
2055 library), programatically (such as in test suites) or out-of-prcess
2056 library), programatically (such as in test suites) or out-of-prcess
2056 (typically over the network by remote frontends).
2057 (typically over the network by remote frontends).
2057 """
2058 """
2058 from IPython.core.completer import IPCompleter
2059 from IPython.core.completer import IPCompleter
2059 from IPython.core.completerlib import (module_completer,
2060 from IPython.core.completerlib import (module_completer,
2060 magic_run_completer, cd_completer, reset_completer)
2061 magic_run_completer, cd_completer, reset_completer)
2061
2062
2062 self.Completer = IPCompleter(shell=self,
2063 self.Completer = IPCompleter(shell=self,
2063 namespace=self.user_ns,
2064 namespace=self.user_ns,
2064 global_namespace=self.user_global_ns,
2065 global_namespace=self.user_global_ns,
2065 use_readline=self.has_readline,
2066 use_readline=self.has_readline,
2066 parent=self,
2067 parent=self,
2067 )
2068 )
2068 self.configurables.append(self.Completer)
2069 self.configurables.append(self.Completer)
2069
2070
2070 # Add custom completers to the basic ones built into IPCompleter
2071 # Add custom completers to the basic ones built into IPCompleter
2071 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2072 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
2072 self.strdispatchers['complete_command'] = sdisp
2073 self.strdispatchers['complete_command'] = sdisp
2073 self.Completer.custom_completers = sdisp
2074 self.Completer.custom_completers = sdisp
2074
2075
2075 self.set_hook('complete_command', module_completer, str_key = 'import')
2076 self.set_hook('complete_command', module_completer, str_key = 'import')
2076 self.set_hook('complete_command', module_completer, str_key = 'from')
2077 self.set_hook('complete_command', module_completer, str_key = 'from')
2077 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2078 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
2078 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2079 self.set_hook('complete_command', cd_completer, str_key = '%cd')
2079 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2080 self.set_hook('complete_command', reset_completer, str_key = '%reset')
2080
2081
2081 # Only configure readline if we truly are using readline. IPython can
2082 # Only configure readline if we truly are using readline. IPython can
2082 # do tab-completion over the network, in GUIs, etc, where readline
2083 # do tab-completion over the network, in GUIs, etc, where readline
2083 # itself may be absent
2084 # itself may be absent
2084 if self.has_readline:
2085 if self.has_readline:
2085 self.set_readline_completer()
2086 self.set_readline_completer()
2086
2087
2087 def complete(self, text, line=None, cursor_pos=None):
2088 def complete(self, text, line=None, cursor_pos=None):
2088 """Return the completed text and a list of completions.
2089 """Return the completed text and a list of completions.
2089
2090
2090 Parameters
2091 Parameters
2091 ----------
2092 ----------
2092
2093
2093 text : string
2094 text : string
2094 A string of text to be completed on. It can be given as empty and
2095 A string of text to be completed on. It can be given as empty and
2095 instead a line/position pair are given. In this case, the
2096 instead a line/position pair are given. In this case, the
2096 completer itself will split the line like readline does.
2097 completer itself will split the line like readline does.
2097
2098
2098 line : string, optional
2099 line : string, optional
2099 The complete line that text is part of.
2100 The complete line that text is part of.
2100
2101
2101 cursor_pos : int, optional
2102 cursor_pos : int, optional
2102 The position of the cursor on the input line.
2103 The position of the cursor on the input line.
2103
2104
2104 Returns
2105 Returns
2105 -------
2106 -------
2106 text : string
2107 text : string
2107 The actual text that was completed.
2108 The actual text that was completed.
2108
2109
2109 matches : list
2110 matches : list
2110 A sorted list with all possible completions.
2111 A sorted list with all possible completions.
2111
2112
2112 The optional arguments allow the completion to take more context into
2113 The optional arguments allow the completion to take more context into
2113 account, and are part of the low-level completion API.
2114 account, and are part of the low-level completion API.
2114
2115
2115 This is a wrapper around the completion mechanism, similar to what
2116 This is a wrapper around the completion mechanism, similar to what
2116 readline does at the command line when the TAB key is hit. By
2117 readline does at the command line when the TAB key is hit. By
2117 exposing it as a method, it can be used by other non-readline
2118 exposing it as a method, it can be used by other non-readline
2118 environments (such as GUIs) for text completion.
2119 environments (such as GUIs) for text completion.
2119
2120
2120 Simple usage example:
2121 Simple usage example:
2121
2122
2122 In [1]: x = 'hello'
2123 In [1]: x = 'hello'
2123
2124
2124 In [2]: _ip.complete('x.l')
2125 In [2]: _ip.complete('x.l')
2125 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2126 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
2126 """
2127 """
2127
2128
2128 # Inject names into __builtin__ so we can complete on the added names.
2129 # Inject names into __builtin__ so we can complete on the added names.
2129 with self.builtin_trap:
2130 with self.builtin_trap:
2130 return self.Completer.complete(text, line, cursor_pos)
2131 return self.Completer.complete(text, line, cursor_pos)
2131
2132
2132 def set_custom_completer(self, completer, pos=0):
2133 def set_custom_completer(self, completer, pos=0):
2133 """Adds a new custom completer function.
2134 """Adds a new custom completer function.
2134
2135
2135 The position argument (defaults to 0) is the index in the completers
2136 The position argument (defaults to 0) is the index in the completers
2136 list where you want the completer to be inserted."""
2137 list where you want the completer to be inserted."""
2137
2138
2138 newcomp = types.MethodType(completer,self.Completer)
2139 newcomp = types.MethodType(completer,self.Completer)
2139 self.Completer.matchers.insert(pos,newcomp)
2140 self.Completer.matchers.insert(pos,newcomp)
2140
2141
2141 def set_readline_completer(self):
2142 def set_readline_completer(self):
2142 """Reset readline's completer to be our own."""
2143 """Reset readline's completer to be our own."""
2143 self.readline.set_completer(self.Completer.rlcomplete)
2144 self.readline.set_completer(self.Completer.rlcomplete)
2144
2145
2145 def set_completer_frame(self, frame=None):
2146 def set_completer_frame(self, frame=None):
2146 """Set the frame of the completer."""
2147 """Set the frame of the completer."""
2147 if frame:
2148 if frame:
2148 self.Completer.namespace = frame.f_locals
2149 self.Completer.namespace = frame.f_locals
2149 self.Completer.global_namespace = frame.f_globals
2150 self.Completer.global_namespace = frame.f_globals
2150 else:
2151 else:
2151 self.Completer.namespace = self.user_ns
2152 self.Completer.namespace = self.user_ns
2152 self.Completer.global_namespace = self.user_global_ns
2153 self.Completer.global_namespace = self.user_global_ns
2153
2154
2154 #-------------------------------------------------------------------------
2155 #-------------------------------------------------------------------------
2155 # Things related to magics
2156 # Things related to magics
2156 #-------------------------------------------------------------------------
2157 #-------------------------------------------------------------------------
2157
2158
2158 def init_magics(self):
2159 def init_magics(self):
2159 from IPython.core import magics as m
2160 from IPython.core import magics as m
2160 self.magics_manager = magic.MagicsManager(shell=self,
2161 self.magics_manager = magic.MagicsManager(shell=self,
2161 parent=self,
2162 parent=self,
2162 user_magics=m.UserMagics(self))
2163 user_magics=m.UserMagics(self))
2163 self.configurables.append(self.magics_manager)
2164 self.configurables.append(self.magics_manager)
2164
2165
2165 # Expose as public API from the magics manager
2166 # Expose as public API from the magics manager
2166 self.register_magics = self.magics_manager.register
2167 self.register_magics = self.magics_manager.register
2167 self.define_magic = self.magics_manager.define_magic
2168 self.define_magic = self.magics_manager.define_magic
2168
2169
2169 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2170 self.register_magics(m.AutoMagics, m.BasicMagics, m.CodeMagics,
2170 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2171 m.ConfigMagics, m.DeprecatedMagics, m.DisplayMagics, m.ExecutionMagics,
2171 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2172 m.ExtensionMagics, m.HistoryMagics, m.LoggingMagics,
2172 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2173 m.NamespaceMagics, m.OSMagics, m.PylabMagics, m.ScriptMagics,
2173 )
2174 )
2174
2175
2175 # Register Magic Aliases
2176 # Register Magic Aliases
2176 mman = self.magics_manager
2177 mman = self.magics_manager
2177 # FIXME: magic aliases should be defined by the Magics classes
2178 # FIXME: magic aliases should be defined by the Magics classes
2178 # or in MagicsManager, not here
2179 # or in MagicsManager, not here
2179 mman.register_alias('ed', 'edit')
2180 mman.register_alias('ed', 'edit')
2180 mman.register_alias('hist', 'history')
2181 mman.register_alias('hist', 'history')
2181 mman.register_alias('rep', 'recall')
2182 mman.register_alias('rep', 'recall')
2182 mman.register_alias('SVG', 'svg', 'cell')
2183 mman.register_alias('SVG', 'svg', 'cell')
2183 mman.register_alias('HTML', 'html', 'cell')
2184 mman.register_alias('HTML', 'html', 'cell')
2184 mman.register_alias('file', 'writefile', 'cell')
2185 mman.register_alias('file', 'writefile', 'cell')
2185
2186
2186 # FIXME: Move the color initialization to the DisplayHook, which
2187 # FIXME: Move the color initialization to the DisplayHook, which
2187 # should be split into a prompt manager and displayhook. We probably
2188 # should be split into a prompt manager and displayhook. We probably
2188 # even need a centralize colors management object.
2189 # even need a centralize colors management object.
2189 self.magic('colors %s' % self.colors)
2190 self.magic('colors %s' % self.colors)
2190
2191
2191 # Defined here so that it's included in the documentation
2192 # Defined here so that it's included in the documentation
2192 @functools.wraps(magic.MagicsManager.register_function)
2193 @functools.wraps(magic.MagicsManager.register_function)
2193 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2194 def register_magic_function(self, func, magic_kind='line', magic_name=None):
2194 self.magics_manager.register_function(func,
2195 self.magics_manager.register_function(func,
2195 magic_kind=magic_kind, magic_name=magic_name)
2196 magic_kind=magic_kind, magic_name=magic_name)
2196
2197
2197 def run_line_magic(self, magic_name, line):
2198 def run_line_magic(self, magic_name, line):
2198 """Execute the given line magic.
2199 """Execute the given line magic.
2199
2200
2200 Parameters
2201 Parameters
2201 ----------
2202 ----------
2202 magic_name : str
2203 magic_name : str
2203 Name of the desired magic function, without '%' prefix.
2204 Name of the desired magic function, without '%' prefix.
2204
2205
2205 line : str
2206 line : str
2206 The rest of the input line as a single string.
2207 The rest of the input line as a single string.
2207 """
2208 """
2208 fn = self.find_line_magic(magic_name)
2209 fn = self.find_line_magic(magic_name)
2209 if fn is None:
2210 if fn is None:
2210 cm = self.find_cell_magic(magic_name)
2211 cm = self.find_cell_magic(magic_name)
2211 etpl = "Line magic function `%%%s` not found%s."
2212 etpl = "Line magic function `%%%s` not found%s."
2212 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2213 extra = '' if cm is None else (' (But cell magic `%%%%%s` exists, '
2213 'did you mean that instead?)' % magic_name )
2214 'did you mean that instead?)' % magic_name )
2214 error(etpl % (magic_name, extra))
2215 error(etpl % (magic_name, extra))
2215 else:
2216 else:
2216 # Note: this is the distance in the stack to the user's frame.
2217 # Note: this is the distance in the stack to the user's frame.
2217 # This will need to be updated if the internal calling logic gets
2218 # This will need to be updated if the internal calling logic gets
2218 # refactored, or else we'll be expanding the wrong variables.
2219 # refactored, or else we'll be expanding the wrong variables.
2219 stack_depth = 2
2220 stack_depth = 2
2220 magic_arg_s = self.var_expand(line, stack_depth)
2221 magic_arg_s = self.var_expand(line, stack_depth)
2221 # Put magic args in a list so we can call with f(*a) syntax
2222 # Put magic args in a list so we can call with f(*a) syntax
2222 args = [magic_arg_s]
2223 args = [magic_arg_s]
2223 kwargs = {}
2224 kwargs = {}
2224 # Grab local namespace if we need it:
2225 # Grab local namespace if we need it:
2225 if getattr(fn, "needs_local_scope", False):
2226 if getattr(fn, "needs_local_scope", False):
2226 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2227 kwargs['local_ns'] = sys._getframe(stack_depth).f_locals
2227 with self.builtin_trap:
2228 with self.builtin_trap:
2228 result = fn(*args,**kwargs)
2229 result = fn(*args,**kwargs)
2229 return result
2230 return result
2230
2231
2231 def run_cell_magic(self, magic_name, line, cell):
2232 def run_cell_magic(self, magic_name, line, cell):
2232 """Execute the given cell magic.
2233 """Execute the given cell magic.
2233
2234
2234 Parameters
2235 Parameters
2235 ----------
2236 ----------
2236 magic_name : str
2237 magic_name : str
2237 Name of the desired magic function, without '%' prefix.
2238 Name of the desired magic function, without '%' prefix.
2238
2239
2239 line : str
2240 line : str
2240 The rest of the first input line as a single string.
2241 The rest of the first input line as a single string.
2241
2242
2242 cell : str
2243 cell : str
2243 The body of the cell as a (possibly multiline) string.
2244 The body of the cell as a (possibly multiline) string.
2244 """
2245 """
2245 fn = self.find_cell_magic(magic_name)
2246 fn = self.find_cell_magic(magic_name)
2246 if fn is None:
2247 if fn is None:
2247 lm = self.find_line_magic(magic_name)
2248 lm = self.find_line_magic(magic_name)
2248 etpl = "Cell magic `%%{0}` not found{1}."
2249 etpl = "Cell magic `%%{0}` not found{1}."
2249 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2250 extra = '' if lm is None else (' (But line magic `%{0}` exists, '
2250 'did you mean that instead?)'.format(magic_name))
2251 'did you mean that instead?)'.format(magic_name))
2251 error(etpl.format(magic_name, extra))
2252 error(etpl.format(magic_name, extra))
2252 elif cell == '':
2253 elif cell == '':
2253 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2254 message = '%%{0} is a cell magic, but the cell body is empty.'.format(magic_name)
2254 if self.find_line_magic(magic_name) is not None:
2255 if self.find_line_magic(magic_name) is not None:
2255 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2256 message += ' Did you mean the line magic %{0} (single %)?'.format(magic_name)
2256 raise UsageError(message)
2257 raise UsageError(message)
2257 else:
2258 else:
2258 # Note: this is the distance in the stack to the user's frame.
2259 # Note: this is the distance in the stack to the user's frame.
2259 # This will need to be updated if the internal calling logic gets
2260 # This will need to be updated if the internal calling logic gets
2260 # refactored, or else we'll be expanding the wrong variables.
2261 # refactored, or else we'll be expanding the wrong variables.
2261 stack_depth = 2
2262 stack_depth = 2
2262 magic_arg_s = self.var_expand(line, stack_depth)
2263 magic_arg_s = self.var_expand(line, stack_depth)
2263 with self.builtin_trap:
2264 with self.builtin_trap:
2264 result = fn(magic_arg_s, cell)
2265 result = fn(magic_arg_s, cell)
2265 return result
2266 return result
2266
2267
2267 def find_line_magic(self, magic_name):
2268 def find_line_magic(self, magic_name):
2268 """Find and return a line magic by name.
2269 """Find and return a line magic by name.
2269
2270
2270 Returns None if the magic isn't found."""
2271 Returns None if the magic isn't found."""
2271 return self.magics_manager.magics['line'].get(magic_name)
2272 return self.magics_manager.magics['line'].get(magic_name)
2272
2273
2273 def find_cell_magic(self, magic_name):
2274 def find_cell_magic(self, magic_name):
2274 """Find and return a cell magic by name.
2275 """Find and return a cell magic by name.
2275
2276
2276 Returns None if the magic isn't found."""
2277 Returns None if the magic isn't found."""
2277 return self.magics_manager.magics['cell'].get(magic_name)
2278 return self.magics_manager.magics['cell'].get(magic_name)
2278
2279
2279 def find_magic(self, magic_name, magic_kind='line'):
2280 def find_magic(self, magic_name, magic_kind='line'):
2280 """Find and return a magic of the given type by name.
2281 """Find and return a magic of the given type by name.
2281
2282
2282 Returns None if the magic isn't found."""
2283 Returns None if the magic isn't found."""
2283 return self.magics_manager.magics[magic_kind].get(magic_name)
2284 return self.magics_manager.magics[magic_kind].get(magic_name)
2284
2285
2285 def magic(self, arg_s):
2286 def magic(self, arg_s):
2286 """DEPRECATED. Use run_line_magic() instead.
2287 """DEPRECATED. Use run_line_magic() instead.
2287
2288
2288 Call a magic function by name.
2289 Call a magic function by name.
2289
2290
2290 Input: a string containing the name of the magic function to call and
2291 Input: a string containing the name of the magic function to call and
2291 any additional arguments to be passed to the magic.
2292 any additional arguments to be passed to the magic.
2292
2293
2293 magic('name -opt foo bar') is equivalent to typing at the ipython
2294 magic('name -opt foo bar') is equivalent to typing at the ipython
2294 prompt:
2295 prompt:
2295
2296
2296 In[1]: %name -opt foo bar
2297 In[1]: %name -opt foo bar
2297
2298
2298 To call a magic without arguments, simply use magic('name').
2299 To call a magic without arguments, simply use magic('name').
2299
2300
2300 This provides a proper Python function to call IPython's magics in any
2301 This provides a proper Python function to call IPython's magics in any
2301 valid Python code you can type at the interpreter, including loops and
2302 valid Python code you can type at the interpreter, including loops and
2302 compound statements.
2303 compound statements.
2303 """
2304 """
2304 # TODO: should we issue a loud deprecation warning here?
2305 # TODO: should we issue a loud deprecation warning here?
2305 magic_name, _, magic_arg_s = arg_s.partition(' ')
2306 magic_name, _, magic_arg_s = arg_s.partition(' ')
2306 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2307 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
2307 return self.run_line_magic(magic_name, magic_arg_s)
2308 return self.run_line_magic(magic_name, magic_arg_s)
2308
2309
2309 #-------------------------------------------------------------------------
2310 #-------------------------------------------------------------------------
2310 # Things related to macros
2311 # Things related to macros
2311 #-------------------------------------------------------------------------
2312 #-------------------------------------------------------------------------
2312
2313
2313 def define_macro(self, name, themacro):
2314 def define_macro(self, name, themacro):
2314 """Define a new macro
2315 """Define a new macro
2315
2316
2316 Parameters
2317 Parameters
2317 ----------
2318 ----------
2318 name : str
2319 name : str
2319 The name of the macro.
2320 The name of the macro.
2320 themacro : str or Macro
2321 themacro : str or Macro
2321 The action to do upon invoking the macro. If a string, a new
2322 The action to do upon invoking the macro. If a string, a new
2322 Macro object is created by passing the string to it.
2323 Macro object is created by passing the string to it.
2323 """
2324 """
2324
2325
2325 from IPython.core import macro
2326 from IPython.core import macro
2326
2327
2327 if isinstance(themacro, string_types):
2328 if isinstance(themacro, string_types):
2328 themacro = macro.Macro(themacro)
2329 themacro = macro.Macro(themacro)
2329 if not isinstance(themacro, macro.Macro):
2330 if not isinstance(themacro, macro.Macro):
2330 raise ValueError('A macro must be a string or a Macro instance.')
2331 raise ValueError('A macro must be a string or a Macro instance.')
2331 self.user_ns[name] = themacro
2332 self.user_ns[name] = themacro
2332
2333
2333 #-------------------------------------------------------------------------
2334 #-------------------------------------------------------------------------
2334 # Things related to the running of system commands
2335 # Things related to the running of system commands
2335 #-------------------------------------------------------------------------
2336 #-------------------------------------------------------------------------
2336
2337
2337 def system_piped(self, cmd):
2338 def system_piped(self, cmd):
2338 """Call the given cmd in a subprocess, piping stdout/err
2339 """Call the given cmd in a subprocess, piping stdout/err
2339
2340
2340 Parameters
2341 Parameters
2341 ----------
2342 ----------
2342 cmd : str
2343 cmd : str
2343 Command to execute (can not end in '&', as background processes are
2344 Command to execute (can not end in '&', as background processes are
2344 not supported. Should not be a command that expects input
2345 not supported. Should not be a command that expects input
2345 other than simple text.
2346 other than simple text.
2346 """
2347 """
2347 if cmd.rstrip().endswith('&'):
2348 if cmd.rstrip().endswith('&'):
2348 # this is *far* from a rigorous test
2349 # this is *far* from a rigorous test
2349 # We do not support backgrounding processes because we either use
2350 # We do not support backgrounding processes because we either use
2350 # pexpect or pipes to read from. Users can always just call
2351 # pexpect or pipes to read from. Users can always just call
2351 # os.system() or use ip.system=ip.system_raw
2352 # os.system() or use ip.system=ip.system_raw
2352 # if they really want a background process.
2353 # if they really want a background process.
2353 raise OSError("Background processes not supported.")
2354 raise OSError("Background processes not supported.")
2354
2355
2355 # we explicitly do NOT return the subprocess status code, because
2356 # we explicitly do NOT return the subprocess status code, because
2356 # a non-None value would trigger :func:`sys.displayhook` calls.
2357 # a non-None value would trigger :func:`sys.displayhook` calls.
2357 # Instead, we store the exit_code in user_ns.
2358 # Instead, we store the exit_code in user_ns.
2358 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2359 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=1))
2359
2360
2360 def system_raw(self, cmd):
2361 def system_raw(self, cmd):
2361 """Call the given cmd in a subprocess using os.system on Windows or
2362 """Call the given cmd in a subprocess using os.system on Windows or
2362 subprocess.call using the system shell on other platforms.
2363 subprocess.call using the system shell on other platforms.
2363
2364
2364 Parameters
2365 Parameters
2365 ----------
2366 ----------
2366 cmd : str
2367 cmd : str
2367 Command to execute.
2368 Command to execute.
2368 """
2369 """
2369 cmd = self.var_expand(cmd, depth=1)
2370 cmd = self.var_expand(cmd, depth=1)
2370 # protect os.system from UNC paths on Windows, which it can't handle:
2371 # protect os.system from UNC paths on Windows, which it can't handle:
2371 if sys.platform == 'win32':
2372 if sys.platform == 'win32':
2372 from IPython.utils._process_win32 import AvoidUNCPath
2373 from IPython.utils._process_win32 import AvoidUNCPath
2373 with AvoidUNCPath() as path:
2374 with AvoidUNCPath() as path:
2374 if path is not None:
2375 if path is not None:
2375 cmd = '"pushd %s &&"%s' % (path, cmd)
2376 cmd = '"pushd %s &&"%s' % (path, cmd)
2376 cmd = py3compat.unicode_to_str(cmd)
2377 cmd = py3compat.unicode_to_str(cmd)
2377 try:
2378 try:
2378 ec = os.system(cmd)
2379 ec = os.system(cmd)
2379 except KeyboardInterrupt:
2380 except KeyboardInterrupt:
2380 self.write_err('\n' + self.get_exception_only())
2381 self.write_err('\n' + self.get_exception_only())
2381 ec = -2
2382 ec = -2
2382 else:
2383 else:
2383 cmd = py3compat.unicode_to_str(cmd)
2384 cmd = py3compat.unicode_to_str(cmd)
2384 # For posix the result of the subprocess.call() below is an exit
2385 # For posix the result of the subprocess.call() below is an exit
2385 # code, which by convention is zero for success, positive for
2386 # code, which by convention is zero for success, positive for
2386 # program failure. Exit codes above 128 are reserved for signals,
2387 # program failure. Exit codes above 128 are reserved for signals,
2387 # and the formula for converting a signal to an exit code is usually
2388 # and the formula for converting a signal to an exit code is usually
2388 # signal_number+128. To more easily differentiate between exit
2389 # signal_number+128. To more easily differentiate between exit
2389 # codes and signals, ipython uses negative numbers. For instance
2390 # codes and signals, ipython uses negative numbers. For instance
2390 # since control-c is signal 2 but exit code 130, ipython's
2391 # since control-c is signal 2 but exit code 130, ipython's
2391 # _exit_code variable will read -2. Note that some shells like
2392 # _exit_code variable will read -2. Note that some shells like
2392 # csh and fish don't follow sh/bash conventions for exit codes.
2393 # csh and fish don't follow sh/bash conventions for exit codes.
2393 executable = os.environ.get('SHELL', None)
2394 executable = os.environ.get('SHELL', None)
2394 try:
2395 try:
2395 # Use env shell instead of default /bin/sh
2396 # Use env shell instead of default /bin/sh
2396 ec = subprocess.call(cmd, shell=True, executable=executable)
2397 ec = subprocess.call(cmd, shell=True, executable=executable)
2397 except KeyboardInterrupt:
2398 except KeyboardInterrupt:
2398 # intercept control-C; a long traceback is not useful here
2399 # intercept control-C; a long traceback is not useful here
2399 self.write_err('\n' + self.get_exception_only())
2400 self.write_err('\n' + self.get_exception_only())
2400 ec = 130
2401 ec = 130
2401 if ec > 128:
2402 if ec > 128:
2402 ec = -(ec - 128)
2403 ec = -(ec - 128)
2403
2404
2404 # We explicitly do NOT return the subprocess status code, because
2405 # We explicitly do NOT return the subprocess status code, because
2405 # a non-None value would trigger :func:`sys.displayhook` calls.
2406 # a non-None value would trigger :func:`sys.displayhook` calls.
2406 # Instead, we store the exit_code in user_ns. Note the semantics
2407 # Instead, we store the exit_code in user_ns. Note the semantics
2407 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2408 # of _exit_code: for control-c, _exit_code == -signal.SIGNIT,
2408 # but raising SystemExit(_exit_code) will give status 254!
2409 # but raising SystemExit(_exit_code) will give status 254!
2409 self.user_ns['_exit_code'] = ec
2410 self.user_ns['_exit_code'] = ec
2410
2411
2411 # use piped system by default, because it is better behaved
2412 # use piped system by default, because it is better behaved
2412 system = system_piped
2413 system = system_piped
2413
2414
2414 def getoutput(self, cmd, split=True, depth=0):
2415 def getoutput(self, cmd, split=True, depth=0):
2415 """Get output (possibly including stderr) from a subprocess.
2416 """Get output (possibly including stderr) from a subprocess.
2416
2417
2417 Parameters
2418 Parameters
2418 ----------
2419 ----------
2419 cmd : str
2420 cmd : str
2420 Command to execute (can not end in '&', as background processes are
2421 Command to execute (can not end in '&', as background processes are
2421 not supported.
2422 not supported.
2422 split : bool, optional
2423 split : bool, optional
2423 If True, split the output into an IPython SList. Otherwise, an
2424 If True, split the output into an IPython SList. Otherwise, an
2424 IPython LSString is returned. These are objects similar to normal
2425 IPython LSString is returned. These are objects similar to normal
2425 lists and strings, with a few convenience attributes for easier
2426 lists and strings, with a few convenience attributes for easier
2426 manipulation of line-based output. You can use '?' on them for
2427 manipulation of line-based output. You can use '?' on them for
2427 details.
2428 details.
2428 depth : int, optional
2429 depth : int, optional
2429 How many frames above the caller are the local variables which should
2430 How many frames above the caller are the local variables which should
2430 be expanded in the command string? The default (0) assumes that the
2431 be expanded in the command string? The default (0) assumes that the
2431 expansion variables are in the stack frame calling this function.
2432 expansion variables are in the stack frame calling this function.
2432 """
2433 """
2433 if cmd.rstrip().endswith('&'):
2434 if cmd.rstrip().endswith('&'):
2434 # this is *far* from a rigorous test
2435 # this is *far* from a rigorous test
2435 raise OSError("Background processes not supported.")
2436 raise OSError("Background processes not supported.")
2436 out = getoutput(self.var_expand(cmd, depth=depth+1))
2437 out = getoutput(self.var_expand(cmd, depth=depth+1))
2437 if split:
2438 if split:
2438 out = SList(out.splitlines())
2439 out = SList(out.splitlines())
2439 else:
2440 else:
2440 out = LSString(out)
2441 out = LSString(out)
2441 return out
2442 return out
2442
2443
2443 #-------------------------------------------------------------------------
2444 #-------------------------------------------------------------------------
2444 # Things related to aliases
2445 # Things related to aliases
2445 #-------------------------------------------------------------------------
2446 #-------------------------------------------------------------------------
2446
2447
2447 def init_alias(self):
2448 def init_alias(self):
2448 self.alias_manager = AliasManager(shell=self, parent=self)
2449 self.alias_manager = AliasManager(shell=self, parent=self)
2449 self.configurables.append(self.alias_manager)
2450 self.configurables.append(self.alias_manager)
2450
2451
2451 #-------------------------------------------------------------------------
2452 #-------------------------------------------------------------------------
2452 # Things related to extensions
2453 # Things related to extensions
2453 #-------------------------------------------------------------------------
2454 #-------------------------------------------------------------------------
2454
2455
2455 def init_extension_manager(self):
2456 def init_extension_manager(self):
2456 self.extension_manager = ExtensionManager(shell=self, parent=self)
2457 self.extension_manager = ExtensionManager(shell=self, parent=self)
2457 self.configurables.append(self.extension_manager)
2458 self.configurables.append(self.extension_manager)
2458
2459
2459 #-------------------------------------------------------------------------
2460 #-------------------------------------------------------------------------
2460 # Things related to payloads
2461 # Things related to payloads
2461 #-------------------------------------------------------------------------
2462 #-------------------------------------------------------------------------
2462
2463
2463 def init_payload(self):
2464 def init_payload(self):
2464 self.payload_manager = PayloadManager(parent=self)
2465 self.payload_manager = PayloadManager(parent=self)
2465 self.configurables.append(self.payload_manager)
2466 self.configurables.append(self.payload_manager)
2466
2467
2467 #-------------------------------------------------------------------------
2468 #-------------------------------------------------------------------------
2468 # Things related to the prefilter
2469 # Things related to the prefilter
2469 #-------------------------------------------------------------------------
2470 #-------------------------------------------------------------------------
2470
2471
2471 def init_prefilter(self):
2472 def init_prefilter(self):
2472 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2473 self.prefilter_manager = PrefilterManager(shell=self, parent=self)
2473 self.configurables.append(self.prefilter_manager)
2474 self.configurables.append(self.prefilter_manager)
2474 # Ultimately this will be refactored in the new interpreter code, but
2475 # Ultimately this will be refactored in the new interpreter code, but
2475 # for now, we should expose the main prefilter method (there's legacy
2476 # for now, we should expose the main prefilter method (there's legacy
2476 # code out there that may rely on this).
2477 # code out there that may rely on this).
2477 self.prefilter = self.prefilter_manager.prefilter_lines
2478 self.prefilter = self.prefilter_manager.prefilter_lines
2478
2479
2479 def auto_rewrite_input(self, cmd):
2480 def auto_rewrite_input(self, cmd):
2480 """Print to the screen the rewritten form of the user's command.
2481 """Print to the screen the rewritten form of the user's command.
2481
2482
2482 This shows visual feedback by rewriting input lines that cause
2483 This shows visual feedback by rewriting input lines that cause
2483 automatic calling to kick in, like::
2484 automatic calling to kick in, like::
2484
2485
2485 /f x
2486 /f x
2486
2487
2487 into::
2488 into::
2488
2489
2489 ------> f(x)
2490 ------> f(x)
2490
2491
2491 after the user's input prompt. This helps the user understand that the
2492 after the user's input prompt. This helps the user understand that the
2492 input line was transformed automatically by IPython.
2493 input line was transformed automatically by IPython.
2493 """
2494 """
2494 if not self.show_rewritten_input:
2495 if not self.show_rewritten_input:
2495 return
2496 return
2496
2497
2497 rw = self.prompt_manager.render('rewrite') + cmd
2498 rw = self.prompt_manager.render('rewrite') + cmd
2498
2499
2499 try:
2500 try:
2500 # plain ascii works better w/ pyreadline, on some machines, so
2501 # plain ascii works better w/ pyreadline, on some machines, so
2501 # we use it and only print uncolored rewrite if we have unicode
2502 # we use it and only print uncolored rewrite if we have unicode
2502 rw = str(rw)
2503 rw = str(rw)
2503 print(rw, file=io.stdout)
2504 print(rw, file=io.stdout)
2504 except UnicodeEncodeError:
2505 except UnicodeEncodeError:
2505 print("------> " + cmd)
2506 print("------> " + cmd)
2506
2507
2507 #-------------------------------------------------------------------------
2508 #-------------------------------------------------------------------------
2508 # Things related to extracting values/expressions from kernel and user_ns
2509 # Things related to extracting values/expressions from kernel and user_ns
2509 #-------------------------------------------------------------------------
2510 #-------------------------------------------------------------------------
2510
2511
2511 def _user_obj_error(self):
2512 def _user_obj_error(self):
2512 """return simple exception dict
2513 """return simple exception dict
2513
2514
2514 for use in user_expressions
2515 for use in user_expressions
2515 """
2516 """
2516
2517
2517 etype, evalue, tb = self._get_exc_info()
2518 etype, evalue, tb = self._get_exc_info()
2518 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2519 stb = self.InteractiveTB.get_exception_only(etype, evalue)
2519
2520
2520 exc_info = {
2521 exc_info = {
2521 u'status' : 'error',
2522 u'status' : 'error',
2522 u'traceback' : stb,
2523 u'traceback' : stb,
2523 u'ename' : unicode_type(etype.__name__),
2524 u'ename' : unicode_type(etype.__name__),
2524 u'evalue' : py3compat.safe_unicode(evalue),
2525 u'evalue' : py3compat.safe_unicode(evalue),
2525 }
2526 }
2526
2527
2527 return exc_info
2528 return exc_info
2528
2529
2529 def _format_user_obj(self, obj):
2530 def _format_user_obj(self, obj):
2530 """format a user object to display dict
2531 """format a user object to display dict
2531
2532
2532 for use in user_expressions
2533 for use in user_expressions
2533 """
2534 """
2534
2535
2535 data, md = self.display_formatter.format(obj)
2536 data, md = self.display_formatter.format(obj)
2536 value = {
2537 value = {
2537 'status' : 'ok',
2538 'status' : 'ok',
2538 'data' : data,
2539 'data' : data,
2539 'metadata' : md,
2540 'metadata' : md,
2540 }
2541 }
2541 return value
2542 return value
2542
2543
2543 def user_expressions(self, expressions):
2544 def user_expressions(self, expressions):
2544 """Evaluate a dict of expressions in the user's namespace.
2545 """Evaluate a dict of expressions in the user's namespace.
2545
2546
2546 Parameters
2547 Parameters
2547 ----------
2548 ----------
2548 expressions : dict
2549 expressions : dict
2549 A dict with string keys and string values. The expression values
2550 A dict with string keys and string values. The expression values
2550 should be valid Python expressions, each of which will be evaluated
2551 should be valid Python expressions, each of which will be evaluated
2551 in the user namespace.
2552 in the user namespace.
2552
2553
2553 Returns
2554 Returns
2554 -------
2555 -------
2555 A dict, keyed like the input expressions dict, with the rich mime-typed
2556 A dict, keyed like the input expressions dict, with the rich mime-typed
2556 display_data of each value.
2557 display_data of each value.
2557 """
2558 """
2558 out = {}
2559 out = {}
2559 user_ns = self.user_ns
2560 user_ns = self.user_ns
2560 global_ns = self.user_global_ns
2561 global_ns = self.user_global_ns
2561
2562
2562 for key, expr in iteritems(expressions):
2563 for key, expr in iteritems(expressions):
2563 try:
2564 try:
2564 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2565 value = self._format_user_obj(eval(expr, global_ns, user_ns))
2565 except:
2566 except:
2566 value = self._user_obj_error()
2567 value = self._user_obj_error()
2567 out[key] = value
2568 out[key] = value
2568 return out
2569 return out
2569
2570
2570 #-------------------------------------------------------------------------
2571 #-------------------------------------------------------------------------
2571 # Things related to the running of code
2572 # Things related to the running of code
2572 #-------------------------------------------------------------------------
2573 #-------------------------------------------------------------------------
2573
2574
2574 def ex(self, cmd):
2575 def ex(self, cmd):
2575 """Execute a normal python statement in user namespace."""
2576 """Execute a normal python statement in user namespace."""
2576 with self.builtin_trap:
2577 with self.builtin_trap:
2577 exec(cmd, self.user_global_ns, self.user_ns)
2578 exec(cmd, self.user_global_ns, self.user_ns)
2578
2579
2579 def ev(self, expr):
2580 def ev(self, expr):
2580 """Evaluate python expression expr in user namespace.
2581 """Evaluate python expression expr in user namespace.
2581
2582
2582 Returns the result of evaluation
2583 Returns the result of evaluation
2583 """
2584 """
2584 with self.builtin_trap:
2585 with self.builtin_trap:
2585 return eval(expr, self.user_global_ns, self.user_ns)
2586 return eval(expr, self.user_global_ns, self.user_ns)
2586
2587
2587 def safe_execfile(self, fname, *where, **kw):
2588 def safe_execfile(self, fname, *where, **kw):
2588 """A safe version of the builtin execfile().
2589 """A safe version of the builtin execfile().
2589
2590
2590 This version will never throw an exception, but instead print
2591 This version will never throw an exception, but instead print
2591 helpful error messages to the screen. This only works on pure
2592 helpful error messages to the screen. This only works on pure
2592 Python files with the .py extension.
2593 Python files with the .py extension.
2593
2594
2594 Parameters
2595 Parameters
2595 ----------
2596 ----------
2596 fname : string
2597 fname : string
2597 The name of the file to be executed.
2598 The name of the file to be executed.
2598 where : tuple
2599 where : tuple
2599 One or two namespaces, passed to execfile() as (globals,locals).
2600 One or two namespaces, passed to execfile() as (globals,locals).
2600 If only one is given, it is passed as both.
2601 If only one is given, it is passed as both.
2601 exit_ignore : bool (False)
2602 exit_ignore : bool (False)
2602 If True, then silence SystemExit for non-zero status (it is always
2603 If True, then silence SystemExit for non-zero status (it is always
2603 silenced for zero status, as it is so common).
2604 silenced for zero status, as it is so common).
2604 raise_exceptions : bool (False)
2605 raise_exceptions : bool (False)
2605 If True raise exceptions everywhere. Meant for testing.
2606 If True raise exceptions everywhere. Meant for testing.
2606 shell_futures : bool (False)
2607 shell_futures : bool (False)
2607 If True, the code will share future statements with the interactive
2608 If True, the code will share future statements with the interactive
2608 shell. It will both be affected by previous __future__ imports, and
2609 shell. It will both be affected by previous __future__ imports, and
2609 any __future__ imports in the code will affect the shell. If False,
2610 any __future__ imports in the code will affect the shell. If False,
2610 __future__ imports are not shared in either direction.
2611 __future__ imports are not shared in either direction.
2611
2612
2612 """
2613 """
2613 kw.setdefault('exit_ignore', False)
2614 kw.setdefault('exit_ignore', False)
2614 kw.setdefault('raise_exceptions', False)
2615 kw.setdefault('raise_exceptions', False)
2615 kw.setdefault('shell_futures', False)
2616 kw.setdefault('shell_futures', False)
2616
2617
2617 fname = os.path.abspath(os.path.expanduser(fname))
2618 fname = os.path.abspath(os.path.expanduser(fname))
2618
2619
2619 # Make sure we can open the file
2620 # Make sure we can open the file
2620 try:
2621 try:
2621 with open(fname) as thefile:
2622 with open(fname) as thefile:
2622 pass
2623 pass
2623 except:
2624 except:
2624 warn('Could not open file <%s> for safe execution.' % fname)
2625 warn('Could not open file <%s> for safe execution.' % fname)
2625 return
2626 return
2626
2627
2627 # Find things also in current directory. This is needed to mimic the
2628 # Find things also in current directory. This is needed to mimic the
2628 # behavior of running a script from the system command line, where
2629 # behavior of running a script from the system command line, where
2629 # Python inserts the script's directory into sys.path
2630 # Python inserts the script's directory into sys.path
2630 dname = os.path.dirname(fname)
2631 dname = os.path.dirname(fname)
2631
2632
2632 with prepended_to_syspath(dname):
2633 with prepended_to_syspath(dname):
2633 try:
2634 try:
2634 glob, loc = (where + (None, ))[:2]
2635 glob, loc = (where + (None, ))[:2]
2635 py3compat.execfile(
2636 py3compat.execfile(
2636 fname, glob, loc,
2637 fname, glob, loc,
2637 self.compile if kw['shell_futures'] else None)
2638 self.compile if kw['shell_futures'] else None)
2638 except SystemExit as status:
2639 except SystemExit as status:
2639 # If the call was made with 0 or None exit status (sys.exit(0)
2640 # If the call was made with 0 or None exit status (sys.exit(0)
2640 # or sys.exit() ), don't bother showing a traceback, as both of
2641 # or sys.exit() ), don't bother showing a traceback, as both of
2641 # these are considered normal by the OS:
2642 # these are considered normal by the OS:
2642 # > python -c'import sys;sys.exit(0)'; echo $?
2643 # > python -c'import sys;sys.exit(0)'; echo $?
2643 # 0
2644 # 0
2644 # > python -c'import sys;sys.exit()'; echo $?
2645 # > python -c'import sys;sys.exit()'; echo $?
2645 # 0
2646 # 0
2646 # For other exit status, we show the exception unless
2647 # For other exit status, we show the exception unless
2647 # explicitly silenced, but only in short form.
2648 # explicitly silenced, but only in short form.
2648 if kw['raise_exceptions']:
2649 if kw['raise_exceptions']:
2649 raise
2650 raise
2650 if status.code and not kw['exit_ignore']:
2651 if status.code and not kw['exit_ignore']:
2651 self.showtraceback(exception_only=True)
2652 self.showtraceback(exception_only=True)
2652 except:
2653 except:
2653 if kw['raise_exceptions']:
2654 if kw['raise_exceptions']:
2654 raise
2655 raise
2655 # tb offset is 2 because we wrap execfile
2656 # tb offset is 2 because we wrap execfile
2656 self.showtraceback(tb_offset=2)
2657 self.showtraceback(tb_offset=2)
2657
2658
2658 def safe_execfile_ipy(self, fname, shell_futures=False):
2659 def safe_execfile_ipy(self, fname, shell_futures=False):
2659 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2660 """Like safe_execfile, but for .ipy or .ipynb files with IPython syntax.
2660
2661
2661 Parameters
2662 Parameters
2662 ----------
2663 ----------
2663 fname : str
2664 fname : str
2664 The name of the file to execute. The filename must have a
2665 The name of the file to execute. The filename must have a
2665 .ipy or .ipynb extension.
2666 .ipy or .ipynb extension.
2666 shell_futures : bool (False)
2667 shell_futures : bool (False)
2667 If True, the code will share future statements with the interactive
2668 If True, the code will share future statements with the interactive
2668 shell. It will both be affected by previous __future__ imports, and
2669 shell. It will both be affected by previous __future__ imports, and
2669 any __future__ imports in the code will affect the shell. If False,
2670 any __future__ imports in the code will affect the shell. If False,
2670 __future__ imports are not shared in either direction.
2671 __future__ imports are not shared in either direction.
2671 """
2672 """
2672 fname = os.path.abspath(os.path.expanduser(fname))
2673 fname = os.path.abspath(os.path.expanduser(fname))
2673
2674
2674 # Make sure we can open the file
2675 # Make sure we can open the file
2675 try:
2676 try:
2676 with open(fname) as thefile:
2677 with open(fname) as thefile:
2677 pass
2678 pass
2678 except:
2679 except:
2679 warn('Could not open file <%s> for safe execution.' % fname)
2680 warn('Could not open file <%s> for safe execution.' % fname)
2680 return
2681 return
2681
2682
2682 # Find things also in current directory. This is needed to mimic the
2683 # Find things also in current directory. This is needed to mimic the
2683 # behavior of running a script from the system command line, where
2684 # behavior of running a script from the system command line, where
2684 # Python inserts the script's directory into sys.path
2685 # Python inserts the script's directory into sys.path
2685 dname = os.path.dirname(fname)
2686 dname = os.path.dirname(fname)
2686
2687
2687 def get_cells():
2688 def get_cells():
2688 """generator for sequence of code blocks to run"""
2689 """generator for sequence of code blocks to run"""
2689 if fname.endswith('.ipynb'):
2690 if fname.endswith('.ipynb'):
2690 from IPython.nbformat import read
2691 from IPython.nbformat import read
2691 with io_open(fname) as f:
2692 with io_open(fname) as f:
2692 nb = read(f, as_version=4)
2693 nb = read(f, as_version=4)
2693 if not nb.cells:
2694 if not nb.cells:
2694 return
2695 return
2695 for cell in nb.cells:
2696 for cell in nb.cells:
2696 if cell.cell_type == 'code':
2697 if cell.cell_type == 'code':
2697 yield cell.source
2698 yield cell.source
2698 else:
2699 else:
2699 with open(fname) as f:
2700 with open(fname) as f:
2700 yield f.read()
2701 yield f.read()
2701
2702
2702 with prepended_to_syspath(dname):
2703 with prepended_to_syspath(dname):
2703 try:
2704 try:
2704 for cell in get_cells():
2705 for cell in get_cells():
2705 # self.run_cell currently captures all exceptions
2706 # self.run_cell currently captures all exceptions
2706 # raised in user code. It would be nice if there were
2707 # raised in user code. It would be nice if there were
2707 # versions of run_cell that did raise, so
2708 # versions of run_cell that did raise, so
2708 # we could catch the errors.
2709 # we could catch the errors.
2709 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2710 result = self.run_cell(cell, silent=True, shell_futures=shell_futures)
2710 if not result.success:
2711 if not result.success:
2711 break
2712 break
2712 except:
2713 except:
2713 self.showtraceback()
2714 self.showtraceback()
2714 warn('Unknown failure executing file: <%s>' % fname)
2715 warn('Unknown failure executing file: <%s>' % fname)
2715
2716
2716 def safe_run_module(self, mod_name, where):
2717 def safe_run_module(self, mod_name, where):
2717 """A safe version of runpy.run_module().
2718 """A safe version of runpy.run_module().
2718
2719
2719 This version will never throw an exception, but instead print
2720 This version will never throw an exception, but instead print
2720 helpful error messages to the screen.
2721 helpful error messages to the screen.
2721
2722
2722 `SystemExit` exceptions with status code 0 or None are ignored.
2723 `SystemExit` exceptions with status code 0 or None are ignored.
2723
2724
2724 Parameters
2725 Parameters
2725 ----------
2726 ----------
2726 mod_name : string
2727 mod_name : string
2727 The name of the module to be executed.
2728 The name of the module to be executed.
2728 where : dict
2729 where : dict
2729 The globals namespace.
2730 The globals namespace.
2730 """
2731 """
2731 try:
2732 try:
2732 try:
2733 try:
2733 where.update(
2734 where.update(
2734 runpy.run_module(str(mod_name), run_name="__main__",
2735 runpy.run_module(str(mod_name), run_name="__main__",
2735 alter_sys=True)
2736 alter_sys=True)
2736 )
2737 )
2737 except SystemExit as status:
2738 except SystemExit as status:
2738 if status.code:
2739 if status.code:
2739 raise
2740 raise
2740 except:
2741 except:
2741 self.showtraceback()
2742 self.showtraceback()
2742 warn('Unknown failure executing module: <%s>' % mod_name)
2743 warn('Unknown failure executing module: <%s>' % mod_name)
2743
2744
2744 def _run_cached_cell_magic(self, magic_name, line):
2745 def _run_cached_cell_magic(self, magic_name, line):
2745 """Special method to call a cell magic with the data stored in self.
2746 """Special method to call a cell magic with the data stored in self.
2746 """
2747 """
2747 cell = self._current_cell_magic_body
2748 cell = self._current_cell_magic_body
2748 self._current_cell_magic_body = None
2749 self._current_cell_magic_body = None
2749 return self.run_cell_magic(magic_name, line, cell)
2750 return self.run_cell_magic(magic_name, line, cell)
2750
2751
2751 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2752 def run_cell(self, raw_cell, store_history=False, silent=False, shell_futures=True):
2752 """Run a complete IPython cell.
2753 """Run a complete IPython cell.
2753
2754
2754 Parameters
2755 Parameters
2755 ----------
2756 ----------
2756 raw_cell : str
2757 raw_cell : str
2757 The code (including IPython code such as %magic functions) to run.
2758 The code (including IPython code such as %magic functions) to run.
2758 store_history : bool
2759 store_history : bool
2759 If True, the raw and translated cell will be stored in IPython's
2760 If True, the raw and translated cell will be stored in IPython's
2760 history. For user code calling back into IPython's machinery, this
2761 history. For user code calling back into IPython's machinery, this
2761 should be set to False.
2762 should be set to False.
2762 silent : bool
2763 silent : bool
2763 If True, avoid side-effects, such as implicit displayhooks and
2764 If True, avoid side-effects, such as implicit displayhooks and
2764 and logging. silent=True forces store_history=False.
2765 and logging. silent=True forces store_history=False.
2765 shell_futures : bool
2766 shell_futures : bool
2766 If True, the code will share future statements with the interactive
2767 If True, the code will share future statements with the interactive
2767 shell. It will both be affected by previous __future__ imports, and
2768 shell. It will both be affected by previous __future__ imports, and
2768 any __future__ imports in the code will affect the shell. If False,
2769 any __future__ imports in the code will affect the shell. If False,
2769 __future__ imports are not shared in either direction.
2770 __future__ imports are not shared in either direction.
2770
2771
2771 Returns
2772 Returns
2772 -------
2773 -------
2773 result : :class:`ExecutionResult`
2774 result : :class:`ExecutionResult`
2774 """
2775 """
2775 result = ExecutionResult()
2776 result = ExecutionResult()
2776
2777
2777 if (not raw_cell) or raw_cell.isspace():
2778 if (not raw_cell) or raw_cell.isspace():
2778 return result
2779 return result
2779
2780
2780 if silent:
2781 if silent:
2781 store_history = False
2782 store_history = False
2782
2783
2783 if store_history:
2784 if store_history:
2784 result.execution_count = self.execution_count
2785 result.execution_count = self.execution_count
2785
2786
2786 def error_before_exec(value):
2787 def error_before_exec(value):
2787 result.error_before_exec = value
2788 result.error_before_exec = value
2788 return result
2789 return result
2789
2790
2790 self.events.trigger('pre_execute')
2791 self.events.trigger('pre_execute')
2791 if not silent:
2792 if not silent:
2792 self.events.trigger('pre_run_cell')
2793 self.events.trigger('pre_run_cell')
2793
2794
2794 # If any of our input transformation (input_transformer_manager or
2795 # If any of our input transformation (input_transformer_manager or
2795 # prefilter_manager) raises an exception, we store it in this variable
2796 # prefilter_manager) raises an exception, we store it in this variable
2796 # so that we can display the error after logging the input and storing
2797 # so that we can display the error after logging the input and storing
2797 # it in the history.
2798 # it in the history.
2798 preprocessing_exc_tuple = None
2799 preprocessing_exc_tuple = None
2799 try:
2800 try:
2800 # Static input transformations
2801 # Static input transformations
2801 cell = self.input_transformer_manager.transform_cell(raw_cell)
2802 cell = self.input_transformer_manager.transform_cell(raw_cell)
2802 except SyntaxError:
2803 except SyntaxError:
2803 preprocessing_exc_tuple = sys.exc_info()
2804 preprocessing_exc_tuple = sys.exc_info()
2804 cell = raw_cell # cell has to exist so it can be stored/logged
2805 cell = raw_cell # cell has to exist so it can be stored/logged
2805 else:
2806 else:
2806 if len(cell.splitlines()) == 1:
2807 if len(cell.splitlines()) == 1:
2807 # Dynamic transformations - only applied for single line commands
2808 # Dynamic transformations - only applied for single line commands
2808 with self.builtin_trap:
2809 with self.builtin_trap:
2809 try:
2810 try:
2810 # use prefilter_lines to handle trailing newlines
2811 # use prefilter_lines to handle trailing newlines
2811 # restore trailing newline for ast.parse
2812 # restore trailing newline for ast.parse
2812 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2813 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2813 except Exception:
2814 except Exception:
2814 # don't allow prefilter errors to crash IPython
2815 # don't allow prefilter errors to crash IPython
2815 preprocessing_exc_tuple = sys.exc_info()
2816 preprocessing_exc_tuple = sys.exc_info()
2816
2817
2817 # Store raw and processed history
2818 # Store raw and processed history
2818 if store_history:
2819 if store_history:
2819 self.history_manager.store_inputs(self.execution_count,
2820 self.history_manager.store_inputs(self.execution_count,
2820 cell, raw_cell)
2821 cell, raw_cell)
2821 if not silent:
2822 if not silent:
2822 self.logger.log(cell, raw_cell)
2823 self.logger.log(cell, raw_cell)
2823
2824
2824 # Display the exception if input processing failed.
2825 # Display the exception if input processing failed.
2825 if preprocessing_exc_tuple is not None:
2826 if preprocessing_exc_tuple is not None:
2826 self.showtraceback(preprocessing_exc_tuple)
2827 self.showtraceback(preprocessing_exc_tuple)
2827 if store_history:
2828 if store_history:
2828 self.execution_count += 1
2829 self.execution_count += 1
2829 return error_before_exec(preprocessing_exc_tuple[2])
2830 return error_before_exec(preprocessing_exc_tuple[2])
2830
2831
2831 # Our own compiler remembers the __future__ environment. If we want to
2832 # Our own compiler remembers the __future__ environment. If we want to
2832 # run code with a separate __future__ environment, use the default
2833 # run code with a separate __future__ environment, use the default
2833 # compiler
2834 # compiler
2834 compiler = self.compile if shell_futures else CachingCompiler()
2835 compiler = self.compile if shell_futures else CachingCompiler()
2835
2836
2836 with self.builtin_trap:
2837 with self.builtin_trap:
2837 cell_name = self.compile.cache(cell, self.execution_count)
2838 cell_name = self.compile.cache(cell, self.execution_count)
2838
2839
2839 with self.display_trap:
2840 with self.display_trap:
2840 # Compile to bytecode
2841 # Compile to bytecode
2841 try:
2842 try:
2842 code_ast = compiler.ast_parse(cell, filename=cell_name)
2843 code_ast = compiler.ast_parse(cell, filename=cell_name)
2843 except IndentationError as e:
2844 except IndentationError as e:
2844 self.showindentationerror()
2845 self.showindentationerror()
2845 if store_history:
2846 if store_history:
2846 self.execution_count += 1
2847 self.execution_count += 1
2847 return error_before_exec(e)
2848 return error_before_exec(e)
2848 except (OverflowError, SyntaxError, ValueError, TypeError,
2849 except (OverflowError, SyntaxError, ValueError, TypeError,
2849 MemoryError) as e:
2850 MemoryError) as e:
2850 self.showsyntaxerror()
2851 self.showsyntaxerror()
2851 if store_history:
2852 if store_history:
2852 self.execution_count += 1
2853 self.execution_count += 1
2853 return error_before_exec(e)
2854 return error_before_exec(e)
2854
2855
2855 # Apply AST transformations
2856 # Apply AST transformations
2856 try:
2857 try:
2857 code_ast = self.transform_ast(code_ast)
2858 code_ast = self.transform_ast(code_ast)
2858 except InputRejected as e:
2859 except InputRejected as e:
2859 self.showtraceback()
2860 self.showtraceback()
2860 if store_history:
2861 if store_history:
2861 self.execution_count += 1
2862 self.execution_count += 1
2862 return error_before_exec(e)
2863 return error_before_exec(e)
2863
2864
2864 # Give the displayhook a reference to our ExecutionResult so it
2865 # Give the displayhook a reference to our ExecutionResult so it
2865 # can fill in the output value.
2866 # can fill in the output value.
2866 self.displayhook.exec_result = result
2867 self.displayhook.exec_result = result
2867
2868
2868 # Execute the user code
2869 # Execute the user code
2869 interactivity = "none" if silent else self.ast_node_interactivity
2870 interactivity = "none" if silent else self.ast_node_interactivity
2870 self.run_ast_nodes(code_ast.body, cell_name,
2871 self.run_ast_nodes(code_ast.body, cell_name,
2871 interactivity=interactivity, compiler=compiler, result=result)
2872 interactivity=interactivity, compiler=compiler, result=result)
2872
2873
2873 # Reset this so later displayed values do not modify the
2874 # Reset this so later displayed values do not modify the
2874 # ExecutionResult
2875 # ExecutionResult
2875 self.displayhook.exec_result = None
2876 self.displayhook.exec_result = None
2876
2877
2877 self.events.trigger('post_execute')
2878 self.events.trigger('post_execute')
2878 if not silent:
2879 if not silent:
2879 self.events.trigger('post_run_cell')
2880 self.events.trigger('post_run_cell')
2880
2881
2881 if store_history:
2882 if store_history:
2882 # Write output to the database. Does nothing unless
2883 # Write output to the database. Does nothing unless
2883 # history output logging is enabled.
2884 # history output logging is enabled.
2884 self.history_manager.store_output(self.execution_count)
2885 self.history_manager.store_output(self.execution_count)
2885 # Each cell is a *single* input, regardless of how many lines it has
2886 # Each cell is a *single* input, regardless of how many lines it has
2886 self.execution_count += 1
2887 self.execution_count += 1
2887
2888
2888 return result
2889 return result
2889
2890
2890 def transform_ast(self, node):
2891 def transform_ast(self, node):
2891 """Apply the AST transformations from self.ast_transformers
2892 """Apply the AST transformations from self.ast_transformers
2892
2893
2893 Parameters
2894 Parameters
2894 ----------
2895 ----------
2895 node : ast.Node
2896 node : ast.Node
2896 The root node to be transformed. Typically called with the ast.Module
2897 The root node to be transformed. Typically called with the ast.Module
2897 produced by parsing user input.
2898 produced by parsing user input.
2898
2899
2899 Returns
2900 Returns
2900 -------
2901 -------
2901 An ast.Node corresponding to the node it was called with. Note that it
2902 An ast.Node corresponding to the node it was called with. Note that it
2902 may also modify the passed object, so don't rely on references to the
2903 may also modify the passed object, so don't rely on references to the
2903 original AST.
2904 original AST.
2904 """
2905 """
2905 for transformer in self.ast_transformers:
2906 for transformer in self.ast_transformers:
2906 try:
2907 try:
2907 node = transformer.visit(node)
2908 node = transformer.visit(node)
2908 except InputRejected:
2909 except InputRejected:
2909 # User-supplied AST transformers can reject an input by raising
2910 # User-supplied AST transformers can reject an input by raising
2910 # an InputRejected. Short-circuit in this case so that we
2911 # an InputRejected. Short-circuit in this case so that we
2911 # don't unregister the transform.
2912 # don't unregister the transform.
2912 raise
2913 raise
2913 except Exception:
2914 except Exception:
2914 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2915 warn("AST transformer %r threw an error. It will be unregistered." % transformer)
2915 self.ast_transformers.remove(transformer)
2916 self.ast_transformers.remove(transformer)
2916
2917
2917 if self.ast_transformers:
2918 if self.ast_transformers:
2918 ast.fix_missing_locations(node)
2919 ast.fix_missing_locations(node)
2919 return node
2920 return node
2920
2921
2921
2922
2922 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2923 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr',
2923 compiler=compile, result=None):
2924 compiler=compile, result=None):
2924 """Run a sequence of AST nodes. The execution mode depends on the
2925 """Run a sequence of AST nodes. The execution mode depends on the
2925 interactivity parameter.
2926 interactivity parameter.
2926
2927
2927 Parameters
2928 Parameters
2928 ----------
2929 ----------
2929 nodelist : list
2930 nodelist : list
2930 A sequence of AST nodes to run.
2931 A sequence of AST nodes to run.
2931 cell_name : str
2932 cell_name : str
2932 Will be passed to the compiler as the filename of the cell. Typically
2933 Will be passed to the compiler as the filename of the cell. Typically
2933 the value returned by ip.compile.cache(cell).
2934 the value returned by ip.compile.cache(cell).
2934 interactivity : str
2935 interactivity : str
2935 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2936 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2936 run interactively (displaying output from expressions). 'last_expr'
2937 run interactively (displaying output from expressions). 'last_expr'
2937 will run the last node interactively only if it is an expression (i.e.
2938 will run the last node interactively only if it is an expression (i.e.
2938 expressions in loops or other blocks are not displayed. Other values
2939 expressions in loops or other blocks are not displayed. Other values
2939 for this parameter will raise a ValueError.
2940 for this parameter will raise a ValueError.
2940 compiler : callable
2941 compiler : callable
2941 A function with the same interface as the built-in compile(), to turn
2942 A function with the same interface as the built-in compile(), to turn
2942 the AST nodes into code objects. Default is the built-in compile().
2943 the AST nodes into code objects. Default is the built-in compile().
2943 result : ExecutionResult, optional
2944 result : ExecutionResult, optional
2944 An object to store exceptions that occur during execution.
2945 An object to store exceptions that occur during execution.
2945
2946
2946 Returns
2947 Returns
2947 -------
2948 -------
2948 True if an exception occurred while running code, False if it finished
2949 True if an exception occurred while running code, False if it finished
2949 running.
2950 running.
2950 """
2951 """
2951 if not nodelist:
2952 if not nodelist:
2952 return
2953 return
2953
2954
2954 if interactivity == 'last_expr':
2955 if interactivity == 'last_expr':
2955 if isinstance(nodelist[-1], ast.Expr):
2956 if isinstance(nodelist[-1], ast.Expr):
2956 interactivity = "last"
2957 interactivity = "last"
2957 else:
2958 else:
2958 interactivity = "none"
2959 interactivity = "none"
2959
2960
2960 if interactivity == 'none':
2961 if interactivity == 'none':
2961 to_run_exec, to_run_interactive = nodelist, []
2962 to_run_exec, to_run_interactive = nodelist, []
2962 elif interactivity == 'last':
2963 elif interactivity == 'last':
2963 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2964 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2964 elif interactivity == 'all':
2965 elif interactivity == 'all':
2965 to_run_exec, to_run_interactive = [], nodelist
2966 to_run_exec, to_run_interactive = [], nodelist
2966 else:
2967 else:
2967 raise ValueError("Interactivity was %r" % interactivity)
2968 raise ValueError("Interactivity was %r" % interactivity)
2968
2969
2969 exec_count = self.execution_count
2970 exec_count = self.execution_count
2970
2971
2971 try:
2972 try:
2972 for i, node in enumerate(to_run_exec):
2973 for i, node in enumerate(to_run_exec):
2973 mod = ast.Module([node])
2974 mod = ast.Module([node])
2974 code = compiler(mod, cell_name, "exec")
2975 code = compiler(mod, cell_name, "exec")
2975 if self.run_code(code, result):
2976 if self.run_code(code, result):
2976 return True
2977 return True
2977
2978
2978 for i, node in enumerate(to_run_interactive):
2979 for i, node in enumerate(to_run_interactive):
2979 mod = ast.Interactive([node])
2980 mod = ast.Interactive([node])
2980 code = compiler(mod, cell_name, "single")
2981 code = compiler(mod, cell_name, "single")
2981 if self.run_code(code, result):
2982 if self.run_code(code, result):
2982 return True
2983 return True
2983
2984
2984 # Flush softspace
2985 # Flush softspace
2985 if softspace(sys.stdout, 0):
2986 if softspace(sys.stdout, 0):
2986 print()
2987 print()
2987
2988
2988 except:
2989 except:
2989 # It's possible to have exceptions raised here, typically by
2990 # It's possible to have exceptions raised here, typically by
2990 # compilation of odd code (such as a naked 'return' outside a
2991 # compilation of odd code (such as a naked 'return' outside a
2991 # function) that did parse but isn't valid. Typically the exception
2992 # function) that did parse but isn't valid. Typically the exception
2992 # is a SyntaxError, but it's safest just to catch anything and show
2993 # is a SyntaxError, but it's safest just to catch anything and show
2993 # the user a traceback.
2994 # the user a traceback.
2994
2995
2995 # We do only one try/except outside the loop to minimize the impact
2996 # We do only one try/except outside the loop to minimize the impact
2996 # on runtime, and also because if any node in the node list is
2997 # on runtime, and also because if any node in the node list is
2997 # broken, we should stop execution completely.
2998 # broken, we should stop execution completely.
2998 if result:
2999 if result:
2999 result.error_before_exec = sys.exc_info()[1]
3000 result.error_before_exec = sys.exc_info()[1]
3000 self.showtraceback()
3001 self.showtraceback()
3001 return True
3002 return True
3002
3003
3003 return False
3004 return False
3004
3005
3005 def run_code(self, code_obj, result=None):
3006 def run_code(self, code_obj, result=None):
3006 """Execute a code object.
3007 """Execute a code object.
3007
3008
3008 When an exception occurs, self.showtraceback() is called to display a
3009 When an exception occurs, self.showtraceback() is called to display a
3009 traceback.
3010 traceback.
3010
3011
3011 Parameters
3012 Parameters
3012 ----------
3013 ----------
3013 code_obj : code object
3014 code_obj : code object
3014 A compiled code object, to be executed
3015 A compiled code object, to be executed
3015 result : ExecutionResult, optional
3016 result : ExecutionResult, optional
3016 An object to store exceptions that occur during execution.
3017 An object to store exceptions that occur during execution.
3017
3018
3018 Returns
3019 Returns
3019 -------
3020 -------
3020 False : successful execution.
3021 False : successful execution.
3021 True : an error occurred.
3022 True : an error occurred.
3022 """
3023 """
3023 # Set our own excepthook in case the user code tries to call it
3024 # Set our own excepthook in case the user code tries to call it
3024 # directly, so that the IPython crash handler doesn't get triggered
3025 # directly, so that the IPython crash handler doesn't get triggered
3025 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3026 old_excepthook, sys.excepthook = sys.excepthook, self.excepthook
3026
3027
3027 # we save the original sys.excepthook in the instance, in case config
3028 # we save the original sys.excepthook in the instance, in case config
3028 # code (such as magics) needs access to it.
3029 # code (such as magics) needs access to it.
3029 self.sys_excepthook = old_excepthook
3030 self.sys_excepthook = old_excepthook
3030 outflag = 1 # happens in more places, so it's easier as default
3031 outflag = 1 # happens in more places, so it's easier as default
3031 try:
3032 try:
3032 try:
3033 try:
3033 self.hooks.pre_run_code_hook()
3034 self.hooks.pre_run_code_hook()
3034 #rprint('Running code', repr(code_obj)) # dbg
3035 #rprint('Running code', repr(code_obj)) # dbg
3035 exec(code_obj, self.user_global_ns, self.user_ns)
3036 exec(code_obj, self.user_global_ns, self.user_ns)
3036 finally:
3037 finally:
3037 # Reset our crash handler in place
3038 # Reset our crash handler in place
3038 sys.excepthook = old_excepthook
3039 sys.excepthook = old_excepthook
3039 except SystemExit as e:
3040 except SystemExit as e:
3040 if result is not None:
3041 if result is not None:
3041 result.error_in_exec = e
3042 result.error_in_exec = e
3042 self.showtraceback(exception_only=True)
3043 self.showtraceback(exception_only=True)
3043 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
3044 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
3044 except self.custom_exceptions:
3045 except self.custom_exceptions:
3045 etype, value, tb = sys.exc_info()
3046 etype, value, tb = sys.exc_info()
3046 if result is not None:
3047 if result is not None:
3047 result.error_in_exec = value
3048 result.error_in_exec = value
3048 self.CustomTB(etype, value, tb)
3049 self.CustomTB(etype, value, tb)
3049 except:
3050 except:
3050 if result is not None:
3051 if result is not None:
3051 result.error_in_exec = sys.exc_info()[1]
3052 result.error_in_exec = sys.exc_info()[1]
3052 self.showtraceback()
3053 self.showtraceback()
3053 else:
3054 else:
3054 outflag = 0
3055 outflag = 0
3055 return outflag
3056 return outflag
3056
3057
3057 # For backwards compatibility
3058 # For backwards compatibility
3058 runcode = run_code
3059 runcode = run_code
3059
3060
3060 #-------------------------------------------------------------------------
3061 #-------------------------------------------------------------------------
3061 # Things related to GUI support and pylab
3062 # Things related to GUI support and pylab
3062 #-------------------------------------------------------------------------
3063 #-------------------------------------------------------------------------
3063
3064
3064 def enable_gui(self, gui=None):
3065 def enable_gui(self, gui=None):
3065 raise NotImplementedError('Implement enable_gui in a subclass')
3066 raise NotImplementedError('Implement enable_gui in a subclass')
3066
3067
3067 def enable_matplotlib(self, gui=None):
3068 def enable_matplotlib(self, gui=None):
3068 """Enable interactive matplotlib and inline figure support.
3069 """Enable interactive matplotlib and inline figure support.
3069
3070
3070 This takes the following steps:
3071 This takes the following steps:
3071
3072
3072 1. select the appropriate eventloop and matplotlib backend
3073 1. select the appropriate eventloop and matplotlib backend
3073 2. set up matplotlib for interactive use with that backend
3074 2. set up matplotlib for interactive use with that backend
3074 3. configure formatters for inline figure display
3075 3. configure formatters for inline figure display
3075 4. enable the selected gui eventloop
3076 4. enable the selected gui eventloop
3076
3077
3077 Parameters
3078 Parameters
3078 ----------
3079 ----------
3079 gui : optional, string
3080 gui : optional, string
3080 If given, dictates the choice of matplotlib GUI backend to use
3081 If given, dictates the choice of matplotlib GUI backend to use
3081 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3082 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3082 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3083 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3083 matplotlib (as dictated by the matplotlib build-time options plus the
3084 matplotlib (as dictated by the matplotlib build-time options plus the
3084 user's matplotlibrc configuration file). Note that not all backends
3085 user's matplotlibrc configuration file). Note that not all backends
3085 make sense in all contexts, for example a terminal ipython can't
3086 make sense in all contexts, for example a terminal ipython can't
3086 display figures inline.
3087 display figures inline.
3087 """
3088 """
3088 from IPython.core import pylabtools as pt
3089 from IPython.core import pylabtools as pt
3089 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3090 gui, backend = pt.find_gui_and_backend(gui, self.pylab_gui_select)
3090
3091
3091 if gui != 'inline':
3092 if gui != 'inline':
3092 # If we have our first gui selection, store it
3093 # If we have our first gui selection, store it
3093 if self.pylab_gui_select is None:
3094 if self.pylab_gui_select is None:
3094 self.pylab_gui_select = gui
3095 self.pylab_gui_select = gui
3095 # Otherwise if they are different
3096 # Otherwise if they are different
3096 elif gui != self.pylab_gui_select:
3097 elif gui != self.pylab_gui_select:
3097 print ('Warning: Cannot change to a different GUI toolkit: %s.'
3098 print ('Warning: Cannot change to a different GUI toolkit: %s.'
3098 ' Using %s instead.' % (gui, self.pylab_gui_select))
3099 ' Using %s instead.' % (gui, self.pylab_gui_select))
3099 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3100 gui, backend = pt.find_gui_and_backend(self.pylab_gui_select)
3100
3101
3101 pt.activate_matplotlib(backend)
3102 pt.activate_matplotlib(backend)
3102 pt.configure_inline_support(self, backend)
3103 pt.configure_inline_support(self, backend)
3103
3104
3104 # Now we must activate the gui pylab wants to use, and fix %run to take
3105 # Now we must activate the gui pylab wants to use, and fix %run to take
3105 # plot updates into account
3106 # plot updates into account
3106 self.enable_gui(gui)
3107 self.enable_gui(gui)
3107 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3108 self.magics_manager.registry['ExecutionMagics'].default_runner = \
3108 pt.mpl_runner(self.safe_execfile)
3109 pt.mpl_runner(self.safe_execfile)
3109
3110
3110 return gui, backend
3111 return gui, backend
3111
3112
3112 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3113 def enable_pylab(self, gui=None, import_all=True, welcome_message=False):
3113 """Activate pylab support at runtime.
3114 """Activate pylab support at runtime.
3114
3115
3115 This turns on support for matplotlib, preloads into the interactive
3116 This turns on support for matplotlib, preloads into the interactive
3116 namespace all of numpy and pylab, and configures IPython to correctly
3117 namespace all of numpy and pylab, and configures IPython to correctly
3117 interact with the GUI event loop. The GUI backend to be used can be
3118 interact with the GUI event loop. The GUI backend to be used can be
3118 optionally selected with the optional ``gui`` argument.
3119 optionally selected with the optional ``gui`` argument.
3119
3120
3120 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3121 This method only adds preloading the namespace to InteractiveShell.enable_matplotlib.
3121
3122
3122 Parameters
3123 Parameters
3123 ----------
3124 ----------
3124 gui : optional, string
3125 gui : optional, string
3125 If given, dictates the choice of matplotlib GUI backend to use
3126 If given, dictates the choice of matplotlib GUI backend to use
3126 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3127 (should be one of IPython's supported backends, 'qt', 'osx', 'tk',
3127 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3128 'gtk', 'wx' or 'inline'), otherwise we use the default chosen by
3128 matplotlib (as dictated by the matplotlib build-time options plus the
3129 matplotlib (as dictated by the matplotlib build-time options plus the
3129 user's matplotlibrc configuration file). Note that not all backends
3130 user's matplotlibrc configuration file). Note that not all backends
3130 make sense in all contexts, for example a terminal ipython can't
3131 make sense in all contexts, for example a terminal ipython can't
3131 display figures inline.
3132 display figures inline.
3132 import_all : optional, bool, default: True
3133 import_all : optional, bool, default: True
3133 Whether to do `from numpy import *` and `from pylab import *`
3134 Whether to do `from numpy import *` and `from pylab import *`
3134 in addition to module imports.
3135 in addition to module imports.
3135 welcome_message : deprecated
3136 welcome_message : deprecated
3136 This argument is ignored, no welcome message will be displayed.
3137 This argument is ignored, no welcome message will be displayed.
3137 """
3138 """
3138 from IPython.core.pylabtools import import_pylab
3139 from IPython.core.pylabtools import import_pylab
3139
3140
3140 gui, backend = self.enable_matplotlib(gui)
3141 gui, backend = self.enable_matplotlib(gui)
3141
3142
3142 # We want to prevent the loading of pylab to pollute the user's
3143 # We want to prevent the loading of pylab to pollute the user's
3143 # namespace as shown by the %who* magics, so we execute the activation
3144 # namespace as shown by the %who* magics, so we execute the activation
3144 # code in an empty namespace, and we update *both* user_ns and
3145 # code in an empty namespace, and we update *both* user_ns and
3145 # user_ns_hidden with this information.
3146 # user_ns_hidden with this information.
3146 ns = {}
3147 ns = {}
3147 import_pylab(ns, import_all)
3148 import_pylab(ns, import_all)
3148 # warn about clobbered names
3149 # warn about clobbered names
3149 ignored = set(["__builtins__"])
3150 ignored = set(["__builtins__"])
3150 both = set(ns).intersection(self.user_ns).difference(ignored)
3151 both = set(ns).intersection(self.user_ns).difference(ignored)
3151 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3152 clobbered = [ name for name in both if self.user_ns[name] is not ns[name] ]
3152 self.user_ns.update(ns)
3153 self.user_ns.update(ns)
3153 self.user_ns_hidden.update(ns)
3154 self.user_ns_hidden.update(ns)
3154 return gui, backend, clobbered
3155 return gui, backend, clobbered
3155
3156
3156 #-------------------------------------------------------------------------
3157 #-------------------------------------------------------------------------
3157 # Utilities
3158 # Utilities
3158 #-------------------------------------------------------------------------
3159 #-------------------------------------------------------------------------
3159
3160
3160 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3161 def var_expand(self, cmd, depth=0, formatter=DollarFormatter()):
3161 """Expand python variables in a string.
3162 """Expand python variables in a string.
3162
3163
3163 The depth argument indicates how many frames above the caller should
3164 The depth argument indicates how many frames above the caller should
3164 be walked to look for the local namespace where to expand variables.
3165 be walked to look for the local namespace where to expand variables.
3165
3166
3166 The global namespace for expansion is always the user's interactive
3167 The global namespace for expansion is always the user's interactive
3167 namespace.
3168 namespace.
3168 """
3169 """
3169 ns = self.user_ns.copy()
3170 ns = self.user_ns.copy()
3170 try:
3171 try:
3171 frame = sys._getframe(depth+1)
3172 frame = sys._getframe(depth+1)
3172 except ValueError:
3173 except ValueError:
3173 # This is thrown if there aren't that many frames on the stack,
3174 # This is thrown if there aren't that many frames on the stack,
3174 # e.g. if a script called run_line_magic() directly.
3175 # e.g. if a script called run_line_magic() directly.
3175 pass
3176 pass
3176 else:
3177 else:
3177 ns.update(frame.f_locals)
3178 ns.update(frame.f_locals)
3178
3179
3179 try:
3180 try:
3180 # We have to use .vformat() here, because 'self' is a valid and common
3181 # We have to use .vformat() here, because 'self' is a valid and common
3181 # name, and expanding **ns for .format() would make it collide with
3182 # name, and expanding **ns for .format() would make it collide with
3182 # the 'self' argument of the method.
3183 # the 'self' argument of the method.
3183 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3184 cmd = formatter.vformat(cmd, args=[], kwargs=ns)
3184 except Exception:
3185 except Exception:
3185 # if formatter couldn't format, just let it go untransformed
3186 # if formatter couldn't format, just let it go untransformed
3186 pass
3187 pass
3187 return cmd
3188 return cmd
3188
3189
3189 def mktempfile(self, data=None, prefix='ipython_edit_'):
3190 def mktempfile(self, data=None, prefix='ipython_edit_'):
3190 """Make a new tempfile and return its filename.
3191 """Make a new tempfile and return its filename.
3191
3192
3192 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3193 This makes a call to tempfile.mkstemp (created in a tempfile.mkdtemp),
3193 but it registers the created filename internally so ipython cleans it up
3194 but it registers the created filename internally so ipython cleans it up
3194 at exit time.
3195 at exit time.
3195
3196
3196 Optional inputs:
3197 Optional inputs:
3197
3198
3198 - data(None): if data is given, it gets written out to the temp file
3199 - data(None): if data is given, it gets written out to the temp file
3199 immediately, and the file is closed again."""
3200 immediately, and the file is closed again."""
3200
3201
3201 dirname = tempfile.mkdtemp(prefix=prefix)
3202 dirname = tempfile.mkdtemp(prefix=prefix)
3202 self.tempdirs.append(dirname)
3203 self.tempdirs.append(dirname)
3203
3204
3204 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3205 handle, filename = tempfile.mkstemp('.py', prefix, dir=dirname)
3205 os.close(handle) # On Windows, there can only be one open handle on a file
3206 os.close(handle) # On Windows, there can only be one open handle on a file
3206 self.tempfiles.append(filename)
3207 self.tempfiles.append(filename)
3207
3208
3208 if data:
3209 if data:
3209 tmp_file = open(filename,'w')
3210 tmp_file = open(filename,'w')
3210 tmp_file.write(data)
3211 tmp_file.write(data)
3211 tmp_file.close()
3212 tmp_file.close()
3212 return filename
3213 return filename
3213
3214
3214 # TODO: This should be removed when Term is refactored.
3215 # TODO: This should be removed when Term is refactored.
3215 def write(self,data):
3216 def write(self,data):
3216 """Write a string to the default output"""
3217 """Write a string to the default output"""
3217 io.stdout.write(data)
3218 io.stdout.write(data)
3218
3219
3219 # TODO: This should be removed when Term is refactored.
3220 # TODO: This should be removed when Term is refactored.
3220 def write_err(self,data):
3221 def write_err(self,data):
3221 """Write a string to the default error output"""
3222 """Write a string to the default error output"""
3222 io.stderr.write(data)
3223 io.stderr.write(data)
3223
3224
3224 def ask_yes_no(self, prompt, default=None):
3225 def ask_yes_no(self, prompt, default=None):
3225 if self.quiet:
3226 if self.quiet:
3226 return True
3227 return True
3227 return ask_yes_no(prompt,default)
3228 return ask_yes_no(prompt,default)
3228
3229
3229 def show_usage(self):
3230 def show_usage(self):
3230 """Show a usage message"""
3231 """Show a usage message"""
3231 page.page(IPython.core.usage.interactive_usage)
3232 page.page(IPython.core.usage.interactive_usage)
3232
3233
3233 def extract_input_lines(self, range_str, raw=False):
3234 def extract_input_lines(self, range_str, raw=False):
3234 """Return as a string a set of input history slices.
3235 """Return as a string a set of input history slices.
3235
3236
3236 Parameters
3237 Parameters
3237 ----------
3238 ----------
3238 range_str : string
3239 range_str : string
3239 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3240 The set of slices is given as a string, like "~5/6-~4/2 4:8 9",
3240 since this function is for use by magic functions which get their
3241 since this function is for use by magic functions which get their
3241 arguments as strings. The number before the / is the session
3242 arguments as strings. The number before the / is the session
3242 number: ~n goes n back from the current session.
3243 number: ~n goes n back from the current session.
3243
3244
3244 raw : bool, optional
3245 raw : bool, optional
3245 By default, the processed input is used. If this is true, the raw
3246 By default, the processed input is used. If this is true, the raw
3246 input history is used instead.
3247 input history is used instead.
3247
3248
3248 Notes
3249 Notes
3249 -----
3250 -----
3250
3251
3251 Slices can be described with two notations:
3252 Slices can be described with two notations:
3252
3253
3253 * ``N:M`` -> standard python form, means including items N...(M-1).
3254 * ``N:M`` -> standard python form, means including items N...(M-1).
3254 * ``N-M`` -> include items N..M (closed endpoint).
3255 * ``N-M`` -> include items N..M (closed endpoint).
3255 """
3256 """
3256 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3257 lines = self.history_manager.get_range_by_str(range_str, raw=raw)
3257 return "\n".join(x for _, _, x in lines)
3258 return "\n".join(x for _, _, x in lines)
3258
3259
3259 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3260 def find_user_code(self, target, raw=True, py_only=False, skip_encoding_cookie=True, search_ns=False):
3260 """Get a code string from history, file, url, or a string or macro.
3261 """Get a code string from history, file, url, or a string or macro.
3261
3262
3262 This is mainly used by magic functions.
3263 This is mainly used by magic functions.
3263
3264
3264 Parameters
3265 Parameters
3265 ----------
3266 ----------
3266
3267
3267 target : str
3268 target : str
3268
3269
3269 A string specifying code to retrieve. This will be tried respectively
3270 A string specifying code to retrieve. This will be tried respectively
3270 as: ranges of input history (see %history for syntax), url,
3271 as: ranges of input history (see %history for syntax), url,
3271 correspnding .py file, filename, or an expression evaluating to a
3272 correspnding .py file, filename, or an expression evaluating to a
3272 string or Macro in the user namespace.
3273 string or Macro in the user namespace.
3273
3274
3274 raw : bool
3275 raw : bool
3275 If true (default), retrieve raw history. Has no effect on the other
3276 If true (default), retrieve raw history. Has no effect on the other
3276 retrieval mechanisms.
3277 retrieval mechanisms.
3277
3278
3278 py_only : bool (default False)
3279 py_only : bool (default False)
3279 Only try to fetch python code, do not try alternative methods to decode file
3280 Only try to fetch python code, do not try alternative methods to decode file
3280 if unicode fails.
3281 if unicode fails.
3281
3282
3282 Returns
3283 Returns
3283 -------
3284 -------
3284 A string of code.
3285 A string of code.
3285
3286
3286 ValueError is raised if nothing is found, and TypeError if it evaluates
3287 ValueError is raised if nothing is found, and TypeError if it evaluates
3287 to an object of another type. In each case, .args[0] is a printable
3288 to an object of another type. In each case, .args[0] is a printable
3288 message.
3289 message.
3289 """
3290 """
3290 code = self.extract_input_lines(target, raw=raw) # Grab history
3291 code = self.extract_input_lines(target, raw=raw) # Grab history
3291 if code:
3292 if code:
3292 return code
3293 return code
3293 utarget = unquote_filename(target)
3294 utarget = unquote_filename(target)
3294 try:
3295 try:
3295 if utarget.startswith(('http://', 'https://')):
3296 if utarget.startswith(('http://', 'https://')):
3296 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3297 return openpy.read_py_url(utarget, skip_encoding_cookie=skip_encoding_cookie)
3297 except UnicodeDecodeError:
3298 except UnicodeDecodeError:
3298 if not py_only :
3299 if not py_only :
3299 # Deferred import
3300 # Deferred import
3300 try:
3301 try:
3301 from urllib.request import urlopen # Py3
3302 from urllib.request import urlopen # Py3
3302 except ImportError:
3303 except ImportError:
3303 from urllib import urlopen
3304 from urllib import urlopen
3304 response = urlopen(target)
3305 response = urlopen(target)
3305 return response.read().decode('latin1')
3306 return response.read().decode('latin1')
3306 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3307 raise ValueError(("'%s' seem to be unreadable.") % utarget)
3307
3308
3308 potential_target = [target]
3309 potential_target = [target]
3309 try :
3310 try :
3310 potential_target.insert(0,get_py_filename(target))
3311 potential_target.insert(0,get_py_filename(target))
3311 except IOError:
3312 except IOError:
3312 pass
3313 pass
3313
3314
3314 for tgt in potential_target :
3315 for tgt in potential_target :
3315 if os.path.isfile(tgt): # Read file
3316 if os.path.isfile(tgt): # Read file
3316 try :
3317 try :
3317 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3318 return openpy.read_py_file(tgt, skip_encoding_cookie=skip_encoding_cookie)
3318 except UnicodeDecodeError :
3319 except UnicodeDecodeError :
3319 if not py_only :
3320 if not py_only :
3320 with io_open(tgt,'r', encoding='latin1') as f :
3321 with io_open(tgt,'r', encoding='latin1') as f :
3321 return f.read()
3322 return f.read()
3322 raise ValueError(("'%s' seem to be unreadable.") % target)
3323 raise ValueError(("'%s' seem to be unreadable.") % target)
3323 elif os.path.isdir(os.path.expanduser(tgt)):
3324 elif os.path.isdir(os.path.expanduser(tgt)):
3324 raise ValueError("'%s' is a directory, not a regular file." % target)
3325 raise ValueError("'%s' is a directory, not a regular file." % target)
3325
3326
3326 if search_ns:
3327 if search_ns:
3327 # Inspect namespace to load object source
3328 # Inspect namespace to load object source
3328 object_info = self.object_inspect(target, detail_level=1)
3329 object_info = self.object_inspect(target, detail_level=1)
3329 if object_info['found'] and object_info['source']:
3330 if object_info['found'] and object_info['source']:
3330 return object_info['source']
3331 return object_info['source']
3331
3332
3332 try: # User namespace
3333 try: # User namespace
3333 codeobj = eval(target, self.user_ns)
3334 codeobj = eval(target, self.user_ns)
3334 except Exception:
3335 except Exception:
3335 raise ValueError(("'%s' was not found in history, as a file, url, "
3336 raise ValueError(("'%s' was not found in history, as a file, url, "
3336 "nor in the user namespace.") % target)
3337 "nor in the user namespace.") % target)
3337
3338
3338 if isinstance(codeobj, string_types):
3339 if isinstance(codeobj, string_types):
3339 return codeobj
3340 return codeobj
3340 elif isinstance(codeobj, Macro):
3341 elif isinstance(codeobj, Macro):
3341 return codeobj.value
3342 return codeobj.value
3342
3343
3343 raise TypeError("%s is neither a string nor a macro." % target,
3344 raise TypeError("%s is neither a string nor a macro." % target,
3344 codeobj)
3345 codeobj)
3345
3346
3346 #-------------------------------------------------------------------------
3347 #-------------------------------------------------------------------------
3347 # Things related to IPython exiting
3348 # Things related to IPython exiting
3348 #-------------------------------------------------------------------------
3349 #-------------------------------------------------------------------------
3349 def atexit_operations(self):
3350 def atexit_operations(self):
3350 """This will be executed at the time of exit.
3351 """This will be executed at the time of exit.
3351
3352
3352 Cleanup operations and saving of persistent data that is done
3353 Cleanup operations and saving of persistent data that is done
3353 unconditionally by IPython should be performed here.
3354 unconditionally by IPython should be performed here.
3354
3355
3355 For things that may depend on startup flags or platform specifics (such
3356 For things that may depend on startup flags or platform specifics (such
3356 as having readline or not), register a separate atexit function in the
3357 as having readline or not), register a separate atexit function in the
3357 code that has the appropriate information, rather than trying to
3358 code that has the appropriate information, rather than trying to
3358 clutter
3359 clutter
3359 """
3360 """
3360 # Close the history session (this stores the end time and line count)
3361 # Close the history session (this stores the end time and line count)
3361 # this must be *before* the tempfile cleanup, in case of temporary
3362 # this must be *before* the tempfile cleanup, in case of temporary
3362 # history db
3363 # history db
3363 self.history_manager.end_session()
3364 self.history_manager.end_session()
3364
3365
3365 # Cleanup all tempfiles and folders left around
3366 # Cleanup all tempfiles and folders left around
3366 for tfile in self.tempfiles:
3367 for tfile in self.tempfiles:
3367 try:
3368 try:
3368 os.unlink(tfile)
3369 os.unlink(tfile)
3369 except OSError:
3370 except OSError:
3370 pass
3371 pass
3371
3372
3372 for tdir in self.tempdirs:
3373 for tdir in self.tempdirs:
3373 try:
3374 try:
3374 os.rmdir(tdir)
3375 os.rmdir(tdir)
3375 except OSError:
3376 except OSError:
3376 pass
3377 pass
3377
3378
3378 # Clear all user namespaces to release all references cleanly.
3379 # Clear all user namespaces to release all references cleanly.
3379 self.reset(new_session=False)
3380 self.reset(new_session=False)
3380
3381
3381 # Run user hooks
3382 # Run user hooks
3382 self.hooks.shutdown_hook()
3383 self.hooks.shutdown_hook()
3383
3384
3384 def cleanup(self):
3385 def cleanup(self):
3385 self.restore_sys_module_state()
3386 self.restore_sys_module_state()
3386
3387
3387
3388
3388 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3389 class InteractiveShellABC(with_metaclass(abc.ABCMeta, object)):
3389 """An abstract base class for InteractiveShell."""
3390 """An abstract base class for InteractiveShell."""
3390
3391
3391 InteractiveShellABC.register(InteractiveShell)
3392 InteractiveShellABC.register(InteractiveShell)
@@ -1,702 +1,702 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Magic functions for InteractiveShell.
2 """Magic functions for InteractiveShell.
3 """
3 """
4 from __future__ import print_function
4 from __future__ import print_function
5
5
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
8 # Copyright (C) 2001 Fernando Perez <fperez@colorado.edu>
8 # Copyright (C) 2001 Fernando Perez <fperez@colorado.edu>
9 # Copyright (C) 2008 The IPython Development Team
9 # Copyright (C) 2008 The IPython Development Team
10
10
11 # Distributed under the terms of the BSD License. The full license is in
11 # Distributed under the terms of the BSD License. The full license is in
12 # the file COPYING, distributed as part of this software.
12 # the file COPYING, distributed as part of this software.
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14
14
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 # Imports
16 # Imports
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18 # Stdlib
18 # Stdlib
19 import os
19 import os
20 import re
20 import re
21 import sys
21 import sys
22 import types
22 import types
23 from getopt import getopt, GetoptError
23 from getopt import getopt, GetoptError
24
24
25 # Our own
25 # Our own
26 from IPython.config.configurable import Configurable
26 from IPython.config.configurable import Configurable
27 from IPython.core import oinspect
27 from IPython.core import oinspect
28 from IPython.core.error import UsageError
28 from IPython.core.error import UsageError
29 from IPython.core.inputsplitter import ESC_MAGIC, ESC_MAGIC2
29 from IPython.core.inputsplitter import ESC_MAGIC, ESC_MAGIC2
30 from IPython.external.decorator import decorator
30 from decorator import decorator
31 from IPython.utils.ipstruct import Struct
31 from IPython.utils.ipstruct import Struct
32 from IPython.utils.process import arg_split
32 from IPython.utils.process import arg_split
33 from IPython.utils.py3compat import string_types, iteritems
33 from IPython.utils.py3compat import string_types, iteritems
34 from IPython.utils.text import dedent
34 from IPython.utils.text import dedent
35 from IPython.utils.traitlets import Bool, Dict, Instance, MetaHasTraits
35 from IPython.utils.traitlets import Bool, Dict, Instance, MetaHasTraits
36 from IPython.utils.warn import error
36 from IPython.utils.warn import error
37
37
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39 # Globals
39 # Globals
40 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
41
41
42 # A dict we'll use for each class that has magics, used as temporary storage to
42 # A dict we'll use for each class that has magics, used as temporary storage to
43 # pass information between the @line/cell_magic method decorators and the
43 # pass information between the @line/cell_magic method decorators and the
44 # @magics_class class decorator, because the method decorators have no
44 # @magics_class class decorator, because the method decorators have no
45 # access to the class when they run. See for more details:
45 # access to the class when they run. See for more details:
46 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
46 # http://stackoverflow.com/questions/2366713/can-a-python-decorator-of-an-instance-method-access-the-class
47
47
48 magics = dict(line={}, cell={})
48 magics = dict(line={}, cell={})
49
49
50 magic_kinds = ('line', 'cell')
50 magic_kinds = ('line', 'cell')
51 magic_spec = ('line', 'cell', 'line_cell')
51 magic_spec = ('line', 'cell', 'line_cell')
52 magic_escapes = dict(line=ESC_MAGIC, cell=ESC_MAGIC2)
52 magic_escapes = dict(line=ESC_MAGIC, cell=ESC_MAGIC2)
53
53
54 #-----------------------------------------------------------------------------
54 #-----------------------------------------------------------------------------
55 # Utility classes and functions
55 # Utility classes and functions
56 #-----------------------------------------------------------------------------
56 #-----------------------------------------------------------------------------
57
57
58 class Bunch: pass
58 class Bunch: pass
59
59
60
60
61 def on_off(tag):
61 def on_off(tag):
62 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
62 """Return an ON/OFF string for a 1/0 input. Simple utility function."""
63 return ['OFF','ON'][tag]
63 return ['OFF','ON'][tag]
64
64
65
65
66 def compress_dhist(dh):
66 def compress_dhist(dh):
67 """Compress a directory history into a new one with at most 20 entries.
67 """Compress a directory history into a new one with at most 20 entries.
68
68
69 Return a new list made from the first and last 10 elements of dhist after
69 Return a new list made from the first and last 10 elements of dhist after
70 removal of duplicates.
70 removal of duplicates.
71 """
71 """
72 head, tail = dh[:-10], dh[-10:]
72 head, tail = dh[:-10], dh[-10:]
73
73
74 newhead = []
74 newhead = []
75 done = set()
75 done = set()
76 for h in head:
76 for h in head:
77 if h in done:
77 if h in done:
78 continue
78 continue
79 newhead.append(h)
79 newhead.append(h)
80 done.add(h)
80 done.add(h)
81
81
82 return newhead + tail
82 return newhead + tail
83
83
84
84
85 def needs_local_scope(func):
85 def needs_local_scope(func):
86 """Decorator to mark magic functions which need to local scope to run."""
86 """Decorator to mark magic functions which need to local scope to run."""
87 func.needs_local_scope = True
87 func.needs_local_scope = True
88 return func
88 return func
89
89
90 #-----------------------------------------------------------------------------
90 #-----------------------------------------------------------------------------
91 # Class and method decorators for registering magics
91 # Class and method decorators for registering magics
92 #-----------------------------------------------------------------------------
92 #-----------------------------------------------------------------------------
93
93
94 def magics_class(cls):
94 def magics_class(cls):
95 """Class decorator for all subclasses of the main Magics class.
95 """Class decorator for all subclasses of the main Magics class.
96
96
97 Any class that subclasses Magics *must* also apply this decorator, to
97 Any class that subclasses Magics *must* also apply this decorator, to
98 ensure that all the methods that have been decorated as line/cell magics
98 ensure that all the methods that have been decorated as line/cell magics
99 get correctly registered in the class instance. This is necessary because
99 get correctly registered in the class instance. This is necessary because
100 when method decorators run, the class does not exist yet, so they
100 when method decorators run, the class does not exist yet, so they
101 temporarily store their information into a module global. Application of
101 temporarily store their information into a module global. Application of
102 this class decorator copies that global data to the class instance and
102 this class decorator copies that global data to the class instance and
103 clears the global.
103 clears the global.
104
104
105 Obviously, this mechanism is not thread-safe, which means that the
105 Obviously, this mechanism is not thread-safe, which means that the
106 *creation* of subclasses of Magic should only be done in a single-thread
106 *creation* of subclasses of Magic should only be done in a single-thread
107 context. Instantiation of the classes has no restrictions. Given that
107 context. Instantiation of the classes has no restrictions. Given that
108 these classes are typically created at IPython startup time and before user
108 these classes are typically created at IPython startup time and before user
109 application code becomes active, in practice this should not pose any
109 application code becomes active, in practice this should not pose any
110 problems.
110 problems.
111 """
111 """
112 cls.registered = True
112 cls.registered = True
113 cls.magics = dict(line = magics['line'],
113 cls.magics = dict(line = magics['line'],
114 cell = magics['cell'])
114 cell = magics['cell'])
115 magics['line'] = {}
115 magics['line'] = {}
116 magics['cell'] = {}
116 magics['cell'] = {}
117 return cls
117 return cls
118
118
119
119
120 def record_magic(dct, magic_kind, magic_name, func):
120 def record_magic(dct, magic_kind, magic_name, func):
121 """Utility function to store a function as a magic of a specific kind.
121 """Utility function to store a function as a magic of a specific kind.
122
122
123 Parameters
123 Parameters
124 ----------
124 ----------
125 dct : dict
125 dct : dict
126 A dictionary with 'line' and 'cell' subdicts.
126 A dictionary with 'line' and 'cell' subdicts.
127
127
128 magic_kind : str
128 magic_kind : str
129 Kind of magic to be stored.
129 Kind of magic to be stored.
130
130
131 magic_name : str
131 magic_name : str
132 Key to store the magic as.
132 Key to store the magic as.
133
133
134 func : function
134 func : function
135 Callable object to store.
135 Callable object to store.
136 """
136 """
137 if magic_kind == 'line_cell':
137 if magic_kind == 'line_cell':
138 dct['line'][magic_name] = dct['cell'][magic_name] = func
138 dct['line'][magic_name] = dct['cell'][magic_name] = func
139 else:
139 else:
140 dct[magic_kind][magic_name] = func
140 dct[magic_kind][magic_name] = func
141
141
142
142
143 def validate_type(magic_kind):
143 def validate_type(magic_kind):
144 """Ensure that the given magic_kind is valid.
144 """Ensure that the given magic_kind is valid.
145
145
146 Check that the given magic_kind is one of the accepted spec types (stored
146 Check that the given magic_kind is one of the accepted spec types (stored
147 in the global `magic_spec`), raise ValueError otherwise.
147 in the global `magic_spec`), raise ValueError otherwise.
148 """
148 """
149 if magic_kind not in magic_spec:
149 if magic_kind not in magic_spec:
150 raise ValueError('magic_kind must be one of %s, %s given' %
150 raise ValueError('magic_kind must be one of %s, %s given' %
151 magic_kinds, magic_kind)
151 magic_kinds, magic_kind)
152
152
153
153
154 # The docstrings for the decorator below will be fairly similar for the two
154 # The docstrings for the decorator below will be fairly similar for the two
155 # types (method and function), so we generate them here once and reuse the
155 # types (method and function), so we generate them here once and reuse the
156 # templates below.
156 # templates below.
157 _docstring_template = \
157 _docstring_template = \
158 """Decorate the given {0} as {1} magic.
158 """Decorate the given {0} as {1} magic.
159
159
160 The decorator can be used with or without arguments, as follows.
160 The decorator can be used with or without arguments, as follows.
161
161
162 i) without arguments: it will create a {1} magic named as the {0} being
162 i) without arguments: it will create a {1} magic named as the {0} being
163 decorated::
163 decorated::
164
164
165 @deco
165 @deco
166 def foo(...)
166 def foo(...)
167
167
168 will create a {1} magic named `foo`.
168 will create a {1} magic named `foo`.
169
169
170 ii) with one string argument: which will be used as the actual name of the
170 ii) with one string argument: which will be used as the actual name of the
171 resulting magic::
171 resulting magic::
172
172
173 @deco('bar')
173 @deco('bar')
174 def foo(...)
174 def foo(...)
175
175
176 will create a {1} magic named `bar`.
176 will create a {1} magic named `bar`.
177 """
177 """
178
178
179 # These two are decorator factories. While they are conceptually very similar,
179 # These two are decorator factories. While they are conceptually very similar,
180 # there are enough differences in the details that it's simpler to have them
180 # there are enough differences in the details that it's simpler to have them
181 # written as completely standalone functions rather than trying to share code
181 # written as completely standalone functions rather than trying to share code
182 # and make a single one with convoluted logic.
182 # and make a single one with convoluted logic.
183
183
184 def _method_magic_marker(magic_kind):
184 def _method_magic_marker(magic_kind):
185 """Decorator factory for methods in Magics subclasses.
185 """Decorator factory for methods in Magics subclasses.
186 """
186 """
187
187
188 validate_type(magic_kind)
188 validate_type(magic_kind)
189
189
190 # This is a closure to capture the magic_kind. We could also use a class,
190 # This is a closure to capture the magic_kind. We could also use a class,
191 # but it's overkill for just that one bit of state.
191 # but it's overkill for just that one bit of state.
192 def magic_deco(arg):
192 def magic_deco(arg):
193 call = lambda f, *a, **k: f(*a, **k)
193 call = lambda f, *a, **k: f(*a, **k)
194
194
195 if callable(arg):
195 if callable(arg):
196 # "Naked" decorator call (just @foo, no args)
196 # "Naked" decorator call (just @foo, no args)
197 func = arg
197 func = arg
198 name = func.__name__
198 name = func.__name__
199 retval = decorator(call, func)
199 retval = decorator(call, func)
200 record_magic(magics, magic_kind, name, name)
200 record_magic(magics, magic_kind, name, name)
201 elif isinstance(arg, string_types):
201 elif isinstance(arg, string_types):
202 # Decorator called with arguments (@foo('bar'))
202 # Decorator called with arguments (@foo('bar'))
203 name = arg
203 name = arg
204 def mark(func, *a, **kw):
204 def mark(func, *a, **kw):
205 record_magic(magics, magic_kind, name, func.__name__)
205 record_magic(magics, magic_kind, name, func.__name__)
206 return decorator(call, func)
206 return decorator(call, func)
207 retval = mark
207 retval = mark
208 else:
208 else:
209 raise TypeError("Decorator can only be called with "
209 raise TypeError("Decorator can only be called with "
210 "string or function")
210 "string or function")
211 return retval
211 return retval
212
212
213 # Ensure the resulting decorator has a usable docstring
213 # Ensure the resulting decorator has a usable docstring
214 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
214 magic_deco.__doc__ = _docstring_template.format('method', magic_kind)
215 return magic_deco
215 return magic_deco
216
216
217
217
218 def _function_magic_marker(magic_kind):
218 def _function_magic_marker(magic_kind):
219 """Decorator factory for standalone functions.
219 """Decorator factory for standalone functions.
220 """
220 """
221 validate_type(magic_kind)
221 validate_type(magic_kind)
222
222
223 # This is a closure to capture the magic_kind. We could also use a class,
223 # This is a closure to capture the magic_kind. We could also use a class,
224 # but it's overkill for just that one bit of state.
224 # but it's overkill for just that one bit of state.
225 def magic_deco(arg):
225 def magic_deco(arg):
226 call = lambda f, *a, **k: f(*a, **k)
226 call = lambda f, *a, **k: f(*a, **k)
227
227
228 # Find get_ipython() in the caller's namespace
228 # Find get_ipython() in the caller's namespace
229 caller = sys._getframe(1)
229 caller = sys._getframe(1)
230 for ns in ['f_locals', 'f_globals', 'f_builtins']:
230 for ns in ['f_locals', 'f_globals', 'f_builtins']:
231 get_ipython = getattr(caller, ns).get('get_ipython')
231 get_ipython = getattr(caller, ns).get('get_ipython')
232 if get_ipython is not None:
232 if get_ipython is not None:
233 break
233 break
234 else:
234 else:
235 raise NameError('Decorator can only run in context where '
235 raise NameError('Decorator can only run in context where '
236 '`get_ipython` exists')
236 '`get_ipython` exists')
237
237
238 ip = get_ipython()
238 ip = get_ipython()
239
239
240 if callable(arg):
240 if callable(arg):
241 # "Naked" decorator call (just @foo, no args)
241 # "Naked" decorator call (just @foo, no args)
242 func = arg
242 func = arg
243 name = func.__name__
243 name = func.__name__
244 ip.register_magic_function(func, magic_kind, name)
244 ip.register_magic_function(func, magic_kind, name)
245 retval = decorator(call, func)
245 retval = decorator(call, func)
246 elif isinstance(arg, string_types):
246 elif isinstance(arg, string_types):
247 # Decorator called with arguments (@foo('bar'))
247 # Decorator called with arguments (@foo('bar'))
248 name = arg
248 name = arg
249 def mark(func, *a, **kw):
249 def mark(func, *a, **kw):
250 ip.register_magic_function(func, magic_kind, name)
250 ip.register_magic_function(func, magic_kind, name)
251 return decorator(call, func)
251 return decorator(call, func)
252 retval = mark
252 retval = mark
253 else:
253 else:
254 raise TypeError("Decorator can only be called with "
254 raise TypeError("Decorator can only be called with "
255 "string or function")
255 "string or function")
256 return retval
256 return retval
257
257
258 # Ensure the resulting decorator has a usable docstring
258 # Ensure the resulting decorator has a usable docstring
259 ds = _docstring_template.format('function', magic_kind)
259 ds = _docstring_template.format('function', magic_kind)
260
260
261 ds += dedent("""
261 ds += dedent("""
262 Note: this decorator can only be used in a context where IPython is already
262 Note: this decorator can only be used in a context where IPython is already
263 active, so that the `get_ipython()` call succeeds. You can therefore use
263 active, so that the `get_ipython()` call succeeds. You can therefore use
264 it in your startup files loaded after IPython initializes, but *not* in the
264 it in your startup files loaded after IPython initializes, but *not* in the
265 IPython configuration file itself, which is executed before IPython is
265 IPython configuration file itself, which is executed before IPython is
266 fully up and running. Any file located in the `startup` subdirectory of
266 fully up and running. Any file located in the `startup` subdirectory of
267 your configuration profile will be OK in this sense.
267 your configuration profile will be OK in this sense.
268 """)
268 """)
269
269
270 magic_deco.__doc__ = ds
270 magic_deco.__doc__ = ds
271 return magic_deco
271 return magic_deco
272
272
273
273
274 # Create the actual decorators for public use
274 # Create the actual decorators for public use
275
275
276 # These three are used to decorate methods in class definitions
276 # These three are used to decorate methods in class definitions
277 line_magic = _method_magic_marker('line')
277 line_magic = _method_magic_marker('line')
278 cell_magic = _method_magic_marker('cell')
278 cell_magic = _method_magic_marker('cell')
279 line_cell_magic = _method_magic_marker('line_cell')
279 line_cell_magic = _method_magic_marker('line_cell')
280
280
281 # These three decorate standalone functions and perform the decoration
281 # These three decorate standalone functions and perform the decoration
282 # immediately. They can only run where get_ipython() works
282 # immediately. They can only run where get_ipython() works
283 register_line_magic = _function_magic_marker('line')
283 register_line_magic = _function_magic_marker('line')
284 register_cell_magic = _function_magic_marker('cell')
284 register_cell_magic = _function_magic_marker('cell')
285 register_line_cell_magic = _function_magic_marker('line_cell')
285 register_line_cell_magic = _function_magic_marker('line_cell')
286
286
287 #-----------------------------------------------------------------------------
287 #-----------------------------------------------------------------------------
288 # Core Magic classes
288 # Core Magic classes
289 #-----------------------------------------------------------------------------
289 #-----------------------------------------------------------------------------
290
290
291 class MagicsManager(Configurable):
291 class MagicsManager(Configurable):
292 """Object that handles all magic-related functionality for IPython.
292 """Object that handles all magic-related functionality for IPython.
293 """
293 """
294 # Non-configurable class attributes
294 # Non-configurable class attributes
295
295
296 # A two-level dict, first keyed by magic type, then by magic function, and
296 # A two-level dict, first keyed by magic type, then by magic function, and
297 # holding the actual callable object as value. This is the dict used for
297 # holding the actual callable object as value. This is the dict used for
298 # magic function dispatch
298 # magic function dispatch
299 magics = Dict
299 magics = Dict
300
300
301 # A registry of the original objects that we've been given holding magics.
301 # A registry of the original objects that we've been given holding magics.
302 registry = Dict
302 registry = Dict
303
303
304 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
304 shell = Instance('IPython.core.interactiveshell.InteractiveShellABC')
305
305
306 auto_magic = Bool(True, config=True, help=
306 auto_magic = Bool(True, config=True, help=
307 "Automatically call line magics without requiring explicit % prefix")
307 "Automatically call line magics without requiring explicit % prefix")
308
308
309 def _auto_magic_changed(self, name, value):
309 def _auto_magic_changed(self, name, value):
310 self.shell.automagic = value
310 self.shell.automagic = value
311
311
312 _auto_status = [
312 _auto_status = [
313 'Automagic is OFF, % prefix IS needed for line magics.',
313 'Automagic is OFF, % prefix IS needed for line magics.',
314 'Automagic is ON, % prefix IS NOT needed for line magics.']
314 'Automagic is ON, % prefix IS NOT needed for line magics.']
315
315
316 user_magics = Instance('IPython.core.magics.UserMagics')
316 user_magics = Instance('IPython.core.magics.UserMagics')
317
317
318 def __init__(self, shell=None, config=None, user_magics=None, **traits):
318 def __init__(self, shell=None, config=None, user_magics=None, **traits):
319
319
320 super(MagicsManager, self).__init__(shell=shell, config=config,
320 super(MagicsManager, self).__init__(shell=shell, config=config,
321 user_magics=user_magics, **traits)
321 user_magics=user_magics, **traits)
322 self.magics = dict(line={}, cell={})
322 self.magics = dict(line={}, cell={})
323 # Let's add the user_magics to the registry for uniformity, so *all*
323 # Let's add the user_magics to the registry for uniformity, so *all*
324 # registered magic containers can be found there.
324 # registered magic containers can be found there.
325 self.registry[user_magics.__class__.__name__] = user_magics
325 self.registry[user_magics.__class__.__name__] = user_magics
326
326
327 def auto_status(self):
327 def auto_status(self):
328 """Return descriptive string with automagic status."""
328 """Return descriptive string with automagic status."""
329 return self._auto_status[self.auto_magic]
329 return self._auto_status[self.auto_magic]
330
330
331 def lsmagic(self):
331 def lsmagic(self):
332 """Return a dict of currently available magic functions.
332 """Return a dict of currently available magic functions.
333
333
334 The return dict has the keys 'line' and 'cell', corresponding to the
334 The return dict has the keys 'line' and 'cell', corresponding to the
335 two types of magics we support. Each value is a list of names.
335 two types of magics we support. Each value is a list of names.
336 """
336 """
337 return self.magics
337 return self.magics
338
338
339 def lsmagic_docs(self, brief=False, missing=''):
339 def lsmagic_docs(self, brief=False, missing=''):
340 """Return dict of documentation of magic functions.
340 """Return dict of documentation of magic functions.
341
341
342 The return dict has the keys 'line' and 'cell', corresponding to the
342 The return dict has the keys 'line' and 'cell', corresponding to the
343 two types of magics we support. Each value is a dict keyed by magic
343 two types of magics we support. Each value is a dict keyed by magic
344 name whose value is the function docstring. If a docstring is
344 name whose value is the function docstring. If a docstring is
345 unavailable, the value of `missing` is used instead.
345 unavailable, the value of `missing` is used instead.
346
346
347 If brief is True, only the first line of each docstring will be returned.
347 If brief is True, only the first line of each docstring will be returned.
348 """
348 """
349 docs = {}
349 docs = {}
350 for m_type in self.magics:
350 for m_type in self.magics:
351 m_docs = {}
351 m_docs = {}
352 for m_name, m_func in iteritems(self.magics[m_type]):
352 for m_name, m_func in iteritems(self.magics[m_type]):
353 if m_func.__doc__:
353 if m_func.__doc__:
354 if brief:
354 if brief:
355 m_docs[m_name] = m_func.__doc__.split('\n', 1)[0]
355 m_docs[m_name] = m_func.__doc__.split('\n', 1)[0]
356 else:
356 else:
357 m_docs[m_name] = m_func.__doc__.rstrip()
357 m_docs[m_name] = m_func.__doc__.rstrip()
358 else:
358 else:
359 m_docs[m_name] = missing
359 m_docs[m_name] = missing
360 docs[m_type] = m_docs
360 docs[m_type] = m_docs
361 return docs
361 return docs
362
362
363 def register(self, *magic_objects):
363 def register(self, *magic_objects):
364 """Register one or more instances of Magics.
364 """Register one or more instances of Magics.
365
365
366 Take one or more classes or instances of classes that subclass the main
366 Take one or more classes or instances of classes that subclass the main
367 `core.Magic` class, and register them with IPython to use the magic
367 `core.Magic` class, and register them with IPython to use the magic
368 functions they provide. The registration process will then ensure that
368 functions they provide. The registration process will then ensure that
369 any methods that have decorated to provide line and/or cell magics will
369 any methods that have decorated to provide line and/or cell magics will
370 be recognized with the `%x`/`%%x` syntax as a line/cell magic
370 be recognized with the `%x`/`%%x` syntax as a line/cell magic
371 respectively.
371 respectively.
372
372
373 If classes are given, they will be instantiated with the default
373 If classes are given, they will be instantiated with the default
374 constructor. If your classes need a custom constructor, you should
374 constructor. If your classes need a custom constructor, you should
375 instanitate them first and pass the instance.
375 instanitate them first and pass the instance.
376
376
377 The provided arguments can be an arbitrary mix of classes and instances.
377 The provided arguments can be an arbitrary mix of classes and instances.
378
378
379 Parameters
379 Parameters
380 ----------
380 ----------
381 magic_objects : one or more classes or instances
381 magic_objects : one or more classes or instances
382 """
382 """
383 # Start by validating them to ensure they have all had their magic
383 # Start by validating them to ensure they have all had their magic
384 # methods registered at the instance level
384 # methods registered at the instance level
385 for m in magic_objects:
385 for m in magic_objects:
386 if not m.registered:
386 if not m.registered:
387 raise ValueError("Class of magics %r was constructed without "
387 raise ValueError("Class of magics %r was constructed without "
388 "the @register_magics class decorator")
388 "the @register_magics class decorator")
389 if type(m) in (type, MetaHasTraits):
389 if type(m) in (type, MetaHasTraits):
390 # If we're given an uninstantiated class
390 # If we're given an uninstantiated class
391 m = m(shell=self.shell)
391 m = m(shell=self.shell)
392
392
393 # Now that we have an instance, we can register it and update the
393 # Now that we have an instance, we can register it and update the
394 # table of callables
394 # table of callables
395 self.registry[m.__class__.__name__] = m
395 self.registry[m.__class__.__name__] = m
396 for mtype in magic_kinds:
396 for mtype in magic_kinds:
397 self.magics[mtype].update(m.magics[mtype])
397 self.magics[mtype].update(m.magics[mtype])
398
398
399 def register_function(self, func, magic_kind='line', magic_name=None):
399 def register_function(self, func, magic_kind='line', magic_name=None):
400 """Expose a standalone function as magic function for IPython.
400 """Expose a standalone function as magic function for IPython.
401
401
402 This will create an IPython magic (line, cell or both) from a
402 This will create an IPython magic (line, cell or both) from a
403 standalone function. The functions should have the following
403 standalone function. The functions should have the following
404 signatures:
404 signatures:
405
405
406 * For line magics: `def f(line)`
406 * For line magics: `def f(line)`
407 * For cell magics: `def f(line, cell)`
407 * For cell magics: `def f(line, cell)`
408 * For a function that does both: `def f(line, cell=None)`
408 * For a function that does both: `def f(line, cell=None)`
409
409
410 In the latter case, the function will be called with `cell==None` when
410 In the latter case, the function will be called with `cell==None` when
411 invoked as `%f`, and with cell as a string when invoked as `%%f`.
411 invoked as `%f`, and with cell as a string when invoked as `%%f`.
412
412
413 Parameters
413 Parameters
414 ----------
414 ----------
415 func : callable
415 func : callable
416 Function to be registered as a magic.
416 Function to be registered as a magic.
417
417
418 magic_kind : str
418 magic_kind : str
419 Kind of magic, one of 'line', 'cell' or 'line_cell'
419 Kind of magic, one of 'line', 'cell' or 'line_cell'
420
420
421 magic_name : optional str
421 magic_name : optional str
422 If given, the name the magic will have in the IPython namespace. By
422 If given, the name the magic will have in the IPython namespace. By
423 default, the name of the function itself is used.
423 default, the name of the function itself is used.
424 """
424 """
425
425
426 # Create the new method in the user_magics and register it in the
426 # Create the new method in the user_magics and register it in the
427 # global table
427 # global table
428 validate_type(magic_kind)
428 validate_type(magic_kind)
429 magic_name = func.__name__ if magic_name is None else magic_name
429 magic_name = func.__name__ if magic_name is None else magic_name
430 setattr(self.user_magics, magic_name, func)
430 setattr(self.user_magics, magic_name, func)
431 record_magic(self.magics, magic_kind, magic_name, func)
431 record_magic(self.magics, magic_kind, magic_name, func)
432
432
433 def define_magic(self, name, func):
433 def define_magic(self, name, func):
434 """[Deprecated] Expose own function as magic function for IPython.
434 """[Deprecated] Expose own function as magic function for IPython.
435
435
436 Example::
436 Example::
437
437
438 def foo_impl(self, parameter_s=''):
438 def foo_impl(self, parameter_s=''):
439 'My very own magic!. (Use docstrings, IPython reads them).'
439 'My very own magic!. (Use docstrings, IPython reads them).'
440 print 'Magic function. Passed parameter is between < >:'
440 print 'Magic function. Passed parameter is between < >:'
441 print '<%s>' % parameter_s
441 print '<%s>' % parameter_s
442 print 'The self object is:', self
442 print 'The self object is:', self
443
443
444 ip.define_magic('foo',foo_impl)
444 ip.define_magic('foo',foo_impl)
445 """
445 """
446 meth = types.MethodType(func, self.user_magics)
446 meth = types.MethodType(func, self.user_magics)
447 setattr(self.user_magics, name, meth)
447 setattr(self.user_magics, name, meth)
448 record_magic(self.magics, 'line', name, meth)
448 record_magic(self.magics, 'line', name, meth)
449
449
450 def register_alias(self, alias_name, magic_name, magic_kind='line'):
450 def register_alias(self, alias_name, magic_name, magic_kind='line'):
451 """Register an alias to a magic function.
451 """Register an alias to a magic function.
452
452
453 The alias is an instance of :class:`MagicAlias`, which holds the
453 The alias is an instance of :class:`MagicAlias`, which holds the
454 name and kind of the magic it should call. Binding is done at
454 name and kind of the magic it should call. Binding is done at
455 call time, so if the underlying magic function is changed the alias
455 call time, so if the underlying magic function is changed the alias
456 will call the new function.
456 will call the new function.
457
457
458 Parameters
458 Parameters
459 ----------
459 ----------
460 alias_name : str
460 alias_name : str
461 The name of the magic to be registered.
461 The name of the magic to be registered.
462
462
463 magic_name : str
463 magic_name : str
464 The name of an existing magic.
464 The name of an existing magic.
465
465
466 magic_kind : str
466 magic_kind : str
467 Kind of magic, one of 'line' or 'cell'
467 Kind of magic, one of 'line' or 'cell'
468 """
468 """
469
469
470 # `validate_type` is too permissive, as it allows 'line_cell'
470 # `validate_type` is too permissive, as it allows 'line_cell'
471 # which we do not handle.
471 # which we do not handle.
472 if magic_kind not in magic_kinds:
472 if magic_kind not in magic_kinds:
473 raise ValueError('magic_kind must be one of %s, %s given' %
473 raise ValueError('magic_kind must be one of %s, %s given' %
474 magic_kinds, magic_kind)
474 magic_kinds, magic_kind)
475
475
476 alias = MagicAlias(self.shell, magic_name, magic_kind)
476 alias = MagicAlias(self.shell, magic_name, magic_kind)
477 setattr(self.user_magics, alias_name, alias)
477 setattr(self.user_magics, alias_name, alias)
478 record_magic(self.magics, magic_kind, alias_name, alias)
478 record_magic(self.magics, magic_kind, alias_name, alias)
479
479
480 # Key base class that provides the central functionality for magics.
480 # Key base class that provides the central functionality for magics.
481
481
482
482
483 class Magics(Configurable):
483 class Magics(Configurable):
484 """Base class for implementing magic functions.
484 """Base class for implementing magic functions.
485
485
486 Shell functions which can be reached as %function_name. All magic
486 Shell functions which can be reached as %function_name. All magic
487 functions should accept a string, which they can parse for their own
487 functions should accept a string, which they can parse for their own
488 needs. This can make some functions easier to type, eg `%cd ../`
488 needs. This can make some functions easier to type, eg `%cd ../`
489 vs. `%cd("../")`
489 vs. `%cd("../")`
490
490
491 Classes providing magic functions need to subclass this class, and they
491 Classes providing magic functions need to subclass this class, and they
492 MUST:
492 MUST:
493
493
494 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
494 - Use the method decorators `@line_magic` and `@cell_magic` to decorate
495 individual methods as magic functions, AND
495 individual methods as magic functions, AND
496
496
497 - Use the class decorator `@magics_class` to ensure that the magic
497 - Use the class decorator `@magics_class` to ensure that the magic
498 methods are properly registered at the instance level upon instance
498 methods are properly registered at the instance level upon instance
499 initialization.
499 initialization.
500
500
501 See :mod:`magic_functions` for examples of actual implementation classes.
501 See :mod:`magic_functions` for examples of actual implementation classes.
502 """
502 """
503 # Dict holding all command-line options for each magic.
503 # Dict holding all command-line options for each magic.
504 options_table = None
504 options_table = None
505 # Dict for the mapping of magic names to methods, set by class decorator
505 # Dict for the mapping of magic names to methods, set by class decorator
506 magics = None
506 magics = None
507 # Flag to check that the class decorator was properly applied
507 # Flag to check that the class decorator was properly applied
508 registered = False
508 registered = False
509 # Instance of IPython shell
509 # Instance of IPython shell
510 shell = None
510 shell = None
511
511
512 def __init__(self, shell=None, **kwargs):
512 def __init__(self, shell=None, **kwargs):
513 if not(self.__class__.registered):
513 if not(self.__class__.registered):
514 raise ValueError('Magics subclass without registration - '
514 raise ValueError('Magics subclass without registration - '
515 'did you forget to apply @magics_class?')
515 'did you forget to apply @magics_class?')
516 if shell is not None:
516 if shell is not None:
517 if hasattr(shell, 'configurables'):
517 if hasattr(shell, 'configurables'):
518 shell.configurables.append(self)
518 shell.configurables.append(self)
519 if hasattr(shell, 'config'):
519 if hasattr(shell, 'config'):
520 kwargs.setdefault('parent', shell)
520 kwargs.setdefault('parent', shell)
521 kwargs['shell'] = shell
521 kwargs['shell'] = shell
522
522
523 self.shell = shell
523 self.shell = shell
524 self.options_table = {}
524 self.options_table = {}
525 # The method decorators are run when the instance doesn't exist yet, so
525 # The method decorators are run when the instance doesn't exist yet, so
526 # they can only record the names of the methods they are supposed to
526 # they can only record the names of the methods they are supposed to
527 # grab. Only now, that the instance exists, can we create the proper
527 # grab. Only now, that the instance exists, can we create the proper
528 # mapping to bound methods. So we read the info off the original names
528 # mapping to bound methods. So we read the info off the original names
529 # table and replace each method name by the actual bound method.
529 # table and replace each method name by the actual bound method.
530 # But we mustn't clobber the *class* mapping, in case of multiple instances.
530 # But we mustn't clobber the *class* mapping, in case of multiple instances.
531 class_magics = self.magics
531 class_magics = self.magics
532 self.magics = {}
532 self.magics = {}
533 for mtype in magic_kinds:
533 for mtype in magic_kinds:
534 tab = self.magics[mtype] = {}
534 tab = self.magics[mtype] = {}
535 cls_tab = class_magics[mtype]
535 cls_tab = class_magics[mtype]
536 for magic_name, meth_name in iteritems(cls_tab):
536 for magic_name, meth_name in iteritems(cls_tab):
537 if isinstance(meth_name, string_types):
537 if isinstance(meth_name, string_types):
538 # it's a method name, grab it
538 # it's a method name, grab it
539 tab[magic_name] = getattr(self, meth_name)
539 tab[magic_name] = getattr(self, meth_name)
540 else:
540 else:
541 # it's the real thing
541 # it's the real thing
542 tab[magic_name] = meth_name
542 tab[magic_name] = meth_name
543 # Configurable **needs** to be initiated at the end or the config
543 # Configurable **needs** to be initiated at the end or the config
544 # magics get screwed up.
544 # magics get screwed up.
545 super(Magics, self).__init__(**kwargs)
545 super(Magics, self).__init__(**kwargs)
546
546
547 def arg_err(self,func):
547 def arg_err(self,func):
548 """Print docstring if incorrect arguments were passed"""
548 """Print docstring if incorrect arguments were passed"""
549 print('Error in arguments:')
549 print('Error in arguments:')
550 print(oinspect.getdoc(func))
550 print(oinspect.getdoc(func))
551
551
552 def format_latex(self, strng):
552 def format_latex(self, strng):
553 """Format a string for latex inclusion."""
553 """Format a string for latex inclusion."""
554
554
555 # Characters that need to be escaped for latex:
555 # Characters that need to be escaped for latex:
556 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
556 escape_re = re.compile(r'(%|_|\$|#|&)',re.MULTILINE)
557 # Magic command names as headers:
557 # Magic command names as headers:
558 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
558 cmd_name_re = re.compile(r'^(%s.*?):' % ESC_MAGIC,
559 re.MULTILINE)
559 re.MULTILINE)
560 # Magic commands
560 # Magic commands
561 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
561 cmd_re = re.compile(r'(?P<cmd>%s.+?\b)(?!\}\}:)' % ESC_MAGIC,
562 re.MULTILINE)
562 re.MULTILINE)
563 # Paragraph continue
563 # Paragraph continue
564 par_re = re.compile(r'\\$',re.MULTILINE)
564 par_re = re.compile(r'\\$',re.MULTILINE)
565
565
566 # The "\n" symbol
566 # The "\n" symbol
567 newline_re = re.compile(r'\\n')
567 newline_re = re.compile(r'\\n')
568
568
569 # Now build the string for output:
569 # Now build the string for output:
570 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
570 #strng = cmd_name_re.sub(r'\n\\texttt{\\textsl{\\large \1}}:',strng)
571 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
571 strng = cmd_name_re.sub(r'\n\\bigskip\n\\texttt{\\textbf{ \1}}:',
572 strng)
572 strng)
573 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
573 strng = cmd_re.sub(r'\\texttt{\g<cmd>}',strng)
574 strng = par_re.sub(r'\\\\',strng)
574 strng = par_re.sub(r'\\\\',strng)
575 strng = escape_re.sub(r'\\\1',strng)
575 strng = escape_re.sub(r'\\\1',strng)
576 strng = newline_re.sub(r'\\textbackslash{}n',strng)
576 strng = newline_re.sub(r'\\textbackslash{}n',strng)
577 return strng
577 return strng
578
578
579 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
579 def parse_options(self, arg_str, opt_str, *long_opts, **kw):
580 """Parse options passed to an argument string.
580 """Parse options passed to an argument string.
581
581
582 The interface is similar to that of :func:`getopt.getopt`, but it
582 The interface is similar to that of :func:`getopt.getopt`, but it
583 returns a :class:`~IPython.utils.struct.Struct` with the options as keys
583 returns a :class:`~IPython.utils.struct.Struct` with the options as keys
584 and the stripped argument string still as a string.
584 and the stripped argument string still as a string.
585
585
586 arg_str is quoted as a true sys.argv vector by using shlex.split.
586 arg_str is quoted as a true sys.argv vector by using shlex.split.
587 This allows us to easily expand variables, glob files, quote
587 This allows us to easily expand variables, glob files, quote
588 arguments, etc.
588 arguments, etc.
589
589
590 Parameters
590 Parameters
591 ----------
591 ----------
592
592
593 arg_str : str
593 arg_str : str
594 The arguments to parse.
594 The arguments to parse.
595
595
596 opt_str : str
596 opt_str : str
597 The options specification.
597 The options specification.
598
598
599 mode : str, default 'string'
599 mode : str, default 'string'
600 If given as 'list', the argument string is returned as a list (split
600 If given as 'list', the argument string is returned as a list (split
601 on whitespace) instead of a string.
601 on whitespace) instead of a string.
602
602
603 list_all : bool, default False
603 list_all : bool, default False
604 Put all option values in lists. Normally only options
604 Put all option values in lists. Normally only options
605 appearing more than once are put in a list.
605 appearing more than once are put in a list.
606
606
607 posix : bool, default True
607 posix : bool, default True
608 Whether to split the input line in POSIX mode or not, as per the
608 Whether to split the input line in POSIX mode or not, as per the
609 conventions outlined in the :mod:`shlex` module from the standard
609 conventions outlined in the :mod:`shlex` module from the standard
610 library.
610 library.
611 """
611 """
612
612
613 # inject default options at the beginning of the input line
613 # inject default options at the beginning of the input line
614 caller = sys._getframe(1).f_code.co_name
614 caller = sys._getframe(1).f_code.co_name
615 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
615 arg_str = '%s %s' % (self.options_table.get(caller,''),arg_str)
616
616
617 mode = kw.get('mode','string')
617 mode = kw.get('mode','string')
618 if mode not in ['string','list']:
618 if mode not in ['string','list']:
619 raise ValueError('incorrect mode given: %s' % mode)
619 raise ValueError('incorrect mode given: %s' % mode)
620 # Get options
620 # Get options
621 list_all = kw.get('list_all',0)
621 list_all = kw.get('list_all',0)
622 posix = kw.get('posix', os.name == 'posix')
622 posix = kw.get('posix', os.name == 'posix')
623 strict = kw.get('strict', True)
623 strict = kw.get('strict', True)
624
624
625 # Check if we have more than one argument to warrant extra processing:
625 # Check if we have more than one argument to warrant extra processing:
626 odict = {} # Dictionary with options
626 odict = {} # Dictionary with options
627 args = arg_str.split()
627 args = arg_str.split()
628 if len(args) >= 1:
628 if len(args) >= 1:
629 # If the list of inputs only has 0 or 1 thing in it, there's no
629 # If the list of inputs only has 0 or 1 thing in it, there's no
630 # need to look for options
630 # need to look for options
631 argv = arg_split(arg_str, posix, strict)
631 argv = arg_split(arg_str, posix, strict)
632 # Do regular option processing
632 # Do regular option processing
633 try:
633 try:
634 opts,args = getopt(argv, opt_str, long_opts)
634 opts,args = getopt(argv, opt_str, long_opts)
635 except GetoptError as e:
635 except GetoptError as e:
636 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
636 raise UsageError('%s ( allowed: "%s" %s)' % (e.msg,opt_str,
637 " ".join(long_opts)))
637 " ".join(long_opts)))
638 for o,a in opts:
638 for o,a in opts:
639 if o.startswith('--'):
639 if o.startswith('--'):
640 o = o[2:]
640 o = o[2:]
641 else:
641 else:
642 o = o[1:]
642 o = o[1:]
643 try:
643 try:
644 odict[o].append(a)
644 odict[o].append(a)
645 except AttributeError:
645 except AttributeError:
646 odict[o] = [odict[o],a]
646 odict[o] = [odict[o],a]
647 except KeyError:
647 except KeyError:
648 if list_all:
648 if list_all:
649 odict[o] = [a]
649 odict[o] = [a]
650 else:
650 else:
651 odict[o] = a
651 odict[o] = a
652
652
653 # Prepare opts,args for return
653 # Prepare opts,args for return
654 opts = Struct(odict)
654 opts = Struct(odict)
655 if mode == 'string':
655 if mode == 'string':
656 args = ' '.join(args)
656 args = ' '.join(args)
657
657
658 return opts,args
658 return opts,args
659
659
660 def default_option(self, fn, optstr):
660 def default_option(self, fn, optstr):
661 """Make an entry in the options_table for fn, with value optstr"""
661 """Make an entry in the options_table for fn, with value optstr"""
662
662
663 if fn not in self.lsmagic():
663 if fn not in self.lsmagic():
664 error("%s is not a magic function" % fn)
664 error("%s is not a magic function" % fn)
665 self.options_table[fn] = optstr
665 self.options_table[fn] = optstr
666
666
667
667
668 class MagicAlias(object):
668 class MagicAlias(object):
669 """An alias to another magic function.
669 """An alias to another magic function.
670
670
671 An alias is determined by its magic name and magic kind. Lookup
671 An alias is determined by its magic name and magic kind. Lookup
672 is done at call time, so if the underlying magic changes the alias
672 is done at call time, so if the underlying magic changes the alias
673 will call the new function.
673 will call the new function.
674
674
675 Use the :meth:`MagicsManager.register_alias` method or the
675 Use the :meth:`MagicsManager.register_alias` method or the
676 `%alias_magic` magic function to create and register a new alias.
676 `%alias_magic` magic function to create and register a new alias.
677 """
677 """
678 def __init__(self, shell, magic_name, magic_kind):
678 def __init__(self, shell, magic_name, magic_kind):
679 self.shell = shell
679 self.shell = shell
680 self.magic_name = magic_name
680 self.magic_name = magic_name
681 self.magic_kind = magic_kind
681 self.magic_kind = magic_kind
682
682
683 self.pretty_target = '%s%s' % (magic_escapes[self.magic_kind], self.magic_name)
683 self.pretty_target = '%s%s' % (magic_escapes[self.magic_kind], self.magic_name)
684 self.__doc__ = "Alias for `%s`." % self.pretty_target
684 self.__doc__ = "Alias for `%s`." % self.pretty_target
685
685
686 self._in_call = False
686 self._in_call = False
687
687
688 def __call__(self, *args, **kwargs):
688 def __call__(self, *args, **kwargs):
689 """Call the magic alias."""
689 """Call the magic alias."""
690 fn = self.shell.find_magic(self.magic_name, self.magic_kind)
690 fn = self.shell.find_magic(self.magic_name, self.magic_kind)
691 if fn is None:
691 if fn is None:
692 raise UsageError("Magic `%s` not found." % self.pretty_target)
692 raise UsageError("Magic `%s` not found." % self.pretty_target)
693
693
694 # Protect against infinite recursion.
694 # Protect against infinite recursion.
695 if self._in_call:
695 if self._in_call:
696 raise UsageError("Infinite recursion detected; "
696 raise UsageError("Infinite recursion detected; "
697 "magic aliases cannot call themselves.")
697 "magic aliases cannot call themselves.")
698 self._in_call = True
698 self._in_call = True
699 try:
699 try:
700 return fn(*args, **kwargs)
700 return fn(*args, **kwargs)
701 finally:
701 finally:
702 self._in_call = False
702 self._in_call = False
@@ -1,382 +1,382 b''
1 """Tests for the object inspection functionality.
1 """Tests for the object inspection functionality.
2 """
2 """
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (C) 2010-2011 The IPython Development Team.
4 # Copyright (C) 2010-2011 The IPython Development Team.
5 #
5 #
6 # Distributed under the terms of the BSD License.
6 # Distributed under the terms of the BSD License.
7 #
7 #
8 # The full license is in the file COPYING.txt, distributed with this software.
8 # The full license is in the file COPYING.txt, distributed with this software.
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Imports
12 # Imports
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 from __future__ import print_function
14 from __future__ import print_function
15
15
16 # Stdlib imports
16 # Stdlib imports
17 import os
17 import os
18 import re
18 import re
19
19
20 # Third-party imports
20 # Third-party imports
21 import nose.tools as nt
21 import nose.tools as nt
22
22
23 # Our own imports
23 # Our own imports
24 from .. import oinspect
24 from .. import oinspect
25 from IPython.core.magic import (Magics, magics_class, line_magic,
25 from IPython.core.magic import (Magics, magics_class, line_magic,
26 cell_magic, line_cell_magic,
26 cell_magic, line_cell_magic,
27 register_line_magic, register_cell_magic,
27 register_line_magic, register_cell_magic,
28 register_line_cell_magic)
28 register_line_cell_magic)
29 from IPython.external.decorator import decorator
29 from decorator import decorator
30 from IPython.testing.decorators import skipif
30 from IPython.testing.decorators import skipif
31 from IPython.testing.tools import AssertPrints
31 from IPython.testing.tools import AssertPrints
32 from IPython.utils.path import compress_user
32 from IPython.utils.path import compress_user
33 from IPython.utils import py3compat
33 from IPython.utils import py3compat
34
34
35
35
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37 # Globals and constants
37 # Globals and constants
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39
39
40 inspector = oinspect.Inspector()
40 inspector = oinspect.Inspector()
41 ip = get_ipython()
41 ip = get_ipython()
42
42
43 #-----------------------------------------------------------------------------
43 #-----------------------------------------------------------------------------
44 # Local utilities
44 # Local utilities
45 #-----------------------------------------------------------------------------
45 #-----------------------------------------------------------------------------
46
46
47 # WARNING: since this test checks the line number where a function is
47 # WARNING: since this test checks the line number where a function is
48 # defined, if any code is inserted above, the following line will need to be
48 # defined, if any code is inserted above, the following line will need to be
49 # updated. Do NOT insert any whitespace between the next line and the function
49 # updated. Do NOT insert any whitespace between the next line and the function
50 # definition below.
50 # definition below.
51 THIS_LINE_NUMBER = 51 # Put here the actual number of this line
51 THIS_LINE_NUMBER = 51 # Put here the actual number of this line
52 def test_find_source_lines():
52 def test_find_source_lines():
53 nt.assert_equal(oinspect.find_source_lines(test_find_source_lines),
53 nt.assert_equal(oinspect.find_source_lines(test_find_source_lines),
54 THIS_LINE_NUMBER+1)
54 THIS_LINE_NUMBER+1)
55
55
56
56
57 # A couple of utilities to ensure these tests work the same from a source or a
57 # A couple of utilities to ensure these tests work the same from a source or a
58 # binary install
58 # binary install
59 def pyfile(fname):
59 def pyfile(fname):
60 return os.path.normcase(re.sub('.py[co]$', '.py', fname))
60 return os.path.normcase(re.sub('.py[co]$', '.py', fname))
61
61
62
62
63 def match_pyfiles(f1, f2):
63 def match_pyfiles(f1, f2):
64 nt.assert_equal(pyfile(f1), pyfile(f2))
64 nt.assert_equal(pyfile(f1), pyfile(f2))
65
65
66
66
67 def test_find_file():
67 def test_find_file():
68 match_pyfiles(oinspect.find_file(test_find_file), os.path.abspath(__file__))
68 match_pyfiles(oinspect.find_file(test_find_file), os.path.abspath(__file__))
69
69
70
70
71 def test_find_file_decorated1():
71 def test_find_file_decorated1():
72
72
73 @decorator
73 @decorator
74 def noop1(f):
74 def noop1(f):
75 def wrapper():
75 def wrapper():
76 return f(*a, **kw)
76 return f(*a, **kw)
77 return wrapper
77 return wrapper
78
78
79 @noop1
79 @noop1
80 def f(x):
80 def f(x):
81 "My docstring"
81 "My docstring"
82
82
83 match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__))
83 match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__))
84 nt.assert_equal(f.__doc__, "My docstring")
84 nt.assert_equal(f.__doc__, "My docstring")
85
85
86
86
87 def test_find_file_decorated2():
87 def test_find_file_decorated2():
88
88
89 @decorator
89 @decorator
90 def noop2(f, *a, **kw):
90 def noop2(f, *a, **kw):
91 return f(*a, **kw)
91 return f(*a, **kw)
92
92
93 @noop2
93 @noop2
94 def f(x):
94 def f(x):
95 "My docstring 2"
95 "My docstring 2"
96
96
97 match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__))
97 match_pyfiles(oinspect.find_file(f), os.path.abspath(__file__))
98 nt.assert_equal(f.__doc__, "My docstring 2")
98 nt.assert_equal(f.__doc__, "My docstring 2")
99
99
100
100
101 def test_find_file_magic():
101 def test_find_file_magic():
102 run = ip.find_line_magic('run')
102 run = ip.find_line_magic('run')
103 nt.assert_not_equal(oinspect.find_file(run), None)
103 nt.assert_not_equal(oinspect.find_file(run), None)
104
104
105
105
106 # A few generic objects we can then inspect in the tests below
106 # A few generic objects we can then inspect in the tests below
107
107
108 class Call(object):
108 class Call(object):
109 """This is the class docstring."""
109 """This is the class docstring."""
110
110
111 def __init__(self, x, y=1):
111 def __init__(self, x, y=1):
112 """This is the constructor docstring."""
112 """This is the constructor docstring."""
113
113
114 def __call__(self, *a, **kw):
114 def __call__(self, *a, **kw):
115 """This is the call docstring."""
115 """This is the call docstring."""
116
116
117 def method(self, x, z=2):
117 def method(self, x, z=2):
118 """Some method's docstring"""
118 """Some method's docstring"""
119
119
120 class SimpleClass(object):
120 class SimpleClass(object):
121 def method(self, x, z=2):
121 def method(self, x, z=2):
122 """Some method's docstring"""
122 """Some method's docstring"""
123
123
124
124
125 class OldStyle:
125 class OldStyle:
126 """An old-style class for testing."""
126 """An old-style class for testing."""
127 pass
127 pass
128
128
129
129
130 def f(x, y=2, *a, **kw):
130 def f(x, y=2, *a, **kw):
131 """A simple function."""
131 """A simple function."""
132
132
133
133
134 def g(y, z=3, *a, **kw):
134 def g(y, z=3, *a, **kw):
135 pass # no docstring
135 pass # no docstring
136
136
137
137
138 @register_line_magic
138 @register_line_magic
139 def lmagic(line):
139 def lmagic(line):
140 "A line magic"
140 "A line magic"
141
141
142
142
143 @register_cell_magic
143 @register_cell_magic
144 def cmagic(line, cell):
144 def cmagic(line, cell):
145 "A cell magic"
145 "A cell magic"
146
146
147
147
148 @register_line_cell_magic
148 @register_line_cell_magic
149 def lcmagic(line, cell=None):
149 def lcmagic(line, cell=None):
150 "A line/cell magic"
150 "A line/cell magic"
151
151
152
152
153 @magics_class
153 @magics_class
154 class SimpleMagics(Magics):
154 class SimpleMagics(Magics):
155 @line_magic
155 @line_magic
156 def Clmagic(self, cline):
156 def Clmagic(self, cline):
157 "A class-based line magic"
157 "A class-based line magic"
158
158
159 @cell_magic
159 @cell_magic
160 def Ccmagic(self, cline, ccell):
160 def Ccmagic(self, cline, ccell):
161 "A class-based cell magic"
161 "A class-based cell magic"
162
162
163 @line_cell_magic
163 @line_cell_magic
164 def Clcmagic(self, cline, ccell=None):
164 def Clcmagic(self, cline, ccell=None):
165 "A class-based line/cell magic"
165 "A class-based line/cell magic"
166
166
167
167
168 class Awkward(object):
168 class Awkward(object):
169 def __getattr__(self, name):
169 def __getattr__(self, name):
170 raise Exception(name)
170 raise Exception(name)
171
171
172
172
173 def check_calltip(obj, name, call, docstring):
173 def check_calltip(obj, name, call, docstring):
174 """Generic check pattern all calltip tests will use"""
174 """Generic check pattern all calltip tests will use"""
175 info = inspector.info(obj, name)
175 info = inspector.info(obj, name)
176 call_line, ds = oinspect.call_tip(info)
176 call_line, ds = oinspect.call_tip(info)
177 nt.assert_equal(call_line, call)
177 nt.assert_equal(call_line, call)
178 nt.assert_equal(ds, docstring)
178 nt.assert_equal(ds, docstring)
179
179
180 #-----------------------------------------------------------------------------
180 #-----------------------------------------------------------------------------
181 # Tests
181 # Tests
182 #-----------------------------------------------------------------------------
182 #-----------------------------------------------------------------------------
183
183
184 def test_calltip_class():
184 def test_calltip_class():
185 check_calltip(Call, 'Call', 'Call(x, y=1)', Call.__init__.__doc__)
185 check_calltip(Call, 'Call', 'Call(x, y=1)', Call.__init__.__doc__)
186
186
187
187
188 def test_calltip_instance():
188 def test_calltip_instance():
189 c = Call(1)
189 c = Call(1)
190 check_calltip(c, 'c', 'c(*a, **kw)', c.__call__.__doc__)
190 check_calltip(c, 'c', 'c(*a, **kw)', c.__call__.__doc__)
191
191
192
192
193 def test_calltip_method():
193 def test_calltip_method():
194 c = Call(1)
194 c = Call(1)
195 check_calltip(c.method, 'c.method', 'c.method(x, z=2)', c.method.__doc__)
195 check_calltip(c.method, 'c.method', 'c.method(x, z=2)', c.method.__doc__)
196
196
197
197
198 def test_calltip_function():
198 def test_calltip_function():
199 check_calltip(f, 'f', 'f(x, y=2, *a, **kw)', f.__doc__)
199 check_calltip(f, 'f', 'f(x, y=2, *a, **kw)', f.__doc__)
200
200
201
201
202 def test_calltip_function2():
202 def test_calltip_function2():
203 check_calltip(g, 'g', 'g(y, z=3, *a, **kw)', '<no docstring>')
203 check_calltip(g, 'g', 'g(y, z=3, *a, **kw)', '<no docstring>')
204
204
205
205
206 def test_calltip_builtin():
206 def test_calltip_builtin():
207 check_calltip(sum, 'sum', None, sum.__doc__)
207 check_calltip(sum, 'sum', None, sum.__doc__)
208
208
209
209
210 def test_calltip_line_magic():
210 def test_calltip_line_magic():
211 check_calltip(lmagic, 'lmagic', 'lmagic(line)', "A line magic")
211 check_calltip(lmagic, 'lmagic', 'lmagic(line)', "A line magic")
212
212
213
213
214 def test_calltip_cell_magic():
214 def test_calltip_cell_magic():
215 check_calltip(cmagic, 'cmagic', 'cmagic(line, cell)', "A cell magic")
215 check_calltip(cmagic, 'cmagic', 'cmagic(line, cell)', "A cell magic")
216
216
217
217
218 def test_calltip_line_cell_magic():
218 def test_calltip_line_cell_magic():
219 check_calltip(lcmagic, 'lcmagic', 'lcmagic(line, cell=None)',
219 check_calltip(lcmagic, 'lcmagic', 'lcmagic(line, cell=None)',
220 "A line/cell magic")
220 "A line/cell magic")
221
221
222
222
223 def test_class_magics():
223 def test_class_magics():
224 cm = SimpleMagics(ip)
224 cm = SimpleMagics(ip)
225 ip.register_magics(cm)
225 ip.register_magics(cm)
226 check_calltip(cm.Clmagic, 'Clmagic', 'Clmagic(cline)',
226 check_calltip(cm.Clmagic, 'Clmagic', 'Clmagic(cline)',
227 "A class-based line magic")
227 "A class-based line magic")
228 check_calltip(cm.Ccmagic, 'Ccmagic', 'Ccmagic(cline, ccell)',
228 check_calltip(cm.Ccmagic, 'Ccmagic', 'Ccmagic(cline, ccell)',
229 "A class-based cell magic")
229 "A class-based cell magic")
230 check_calltip(cm.Clcmagic, 'Clcmagic', 'Clcmagic(cline, ccell=None)',
230 check_calltip(cm.Clcmagic, 'Clcmagic', 'Clcmagic(cline, ccell=None)',
231 "A class-based line/cell magic")
231 "A class-based line/cell magic")
232
232
233
233
234 def test_info():
234 def test_info():
235 "Check that Inspector.info fills out various fields as expected."
235 "Check that Inspector.info fills out various fields as expected."
236 i = inspector.info(Call, oname='Call')
236 i = inspector.info(Call, oname='Call')
237 nt.assert_equal(i['type_name'], 'type')
237 nt.assert_equal(i['type_name'], 'type')
238 expted_class = str(type(type)) # <class 'type'> (Python 3) or <type 'type'>
238 expted_class = str(type(type)) # <class 'type'> (Python 3) or <type 'type'>
239 nt.assert_equal(i['base_class'], expted_class)
239 nt.assert_equal(i['base_class'], expted_class)
240 nt.assert_equal(i['string_form'], "<class 'IPython.core.tests.test_oinspect.Call'>")
240 nt.assert_equal(i['string_form'], "<class 'IPython.core.tests.test_oinspect.Call'>")
241 fname = __file__
241 fname = __file__
242 if fname.endswith(".pyc"):
242 if fname.endswith(".pyc"):
243 fname = fname[:-1]
243 fname = fname[:-1]
244 # case-insensitive comparison needed on some filesystems
244 # case-insensitive comparison needed on some filesystems
245 # e.g. Windows:
245 # e.g. Windows:
246 nt.assert_equal(i['file'].lower(), compress_user(fname).lower())
246 nt.assert_equal(i['file'].lower(), compress_user(fname).lower())
247 nt.assert_equal(i['definition'], None)
247 nt.assert_equal(i['definition'], None)
248 nt.assert_equal(i['docstring'], Call.__doc__)
248 nt.assert_equal(i['docstring'], Call.__doc__)
249 nt.assert_equal(i['source'], None)
249 nt.assert_equal(i['source'], None)
250 nt.assert_true(i['isclass'])
250 nt.assert_true(i['isclass'])
251 nt.assert_equal(i['init_definition'], "Call(self, x, y=1)\n")
251 nt.assert_equal(i['init_definition'], "Call(self, x, y=1)\n")
252 nt.assert_equal(i['init_docstring'], Call.__init__.__doc__)
252 nt.assert_equal(i['init_docstring'], Call.__init__.__doc__)
253
253
254 i = inspector.info(Call, detail_level=1)
254 i = inspector.info(Call, detail_level=1)
255 nt.assert_not_equal(i['source'], None)
255 nt.assert_not_equal(i['source'], None)
256 nt.assert_equal(i['docstring'], None)
256 nt.assert_equal(i['docstring'], None)
257
257
258 c = Call(1)
258 c = Call(1)
259 c.__doc__ = "Modified instance docstring"
259 c.__doc__ = "Modified instance docstring"
260 i = inspector.info(c)
260 i = inspector.info(c)
261 nt.assert_equal(i['type_name'], 'Call')
261 nt.assert_equal(i['type_name'], 'Call')
262 nt.assert_equal(i['docstring'], "Modified instance docstring")
262 nt.assert_equal(i['docstring'], "Modified instance docstring")
263 nt.assert_equal(i['class_docstring'], Call.__doc__)
263 nt.assert_equal(i['class_docstring'], Call.__doc__)
264 nt.assert_equal(i['init_docstring'], Call.__init__.__doc__)
264 nt.assert_equal(i['init_docstring'], Call.__init__.__doc__)
265 nt.assert_equal(i['call_docstring'], Call.__call__.__doc__)
265 nt.assert_equal(i['call_docstring'], Call.__call__.__doc__)
266
266
267 # Test old-style classes, which for example may not have an __init__ method.
267 # Test old-style classes, which for example may not have an __init__ method.
268 if not py3compat.PY3:
268 if not py3compat.PY3:
269 i = inspector.info(OldStyle)
269 i = inspector.info(OldStyle)
270 nt.assert_equal(i['type_name'], 'classobj')
270 nt.assert_equal(i['type_name'], 'classobj')
271
271
272 i = inspector.info(OldStyle())
272 i = inspector.info(OldStyle())
273 nt.assert_equal(i['type_name'], 'instance')
273 nt.assert_equal(i['type_name'], 'instance')
274 nt.assert_equal(i['docstring'], OldStyle.__doc__)
274 nt.assert_equal(i['docstring'], OldStyle.__doc__)
275
275
276 def test_info_awkward():
276 def test_info_awkward():
277 # Just test that this doesn't throw an error.
277 # Just test that this doesn't throw an error.
278 i = inspector.info(Awkward())
278 i = inspector.info(Awkward())
279
279
280 def test_calldef_none():
280 def test_calldef_none():
281 # We should ignore __call__ for all of these.
281 # We should ignore __call__ for all of these.
282 for obj in [f, SimpleClass().method, any, str.upper]:
282 for obj in [f, SimpleClass().method, any, str.upper]:
283 print(obj)
283 print(obj)
284 i = inspector.info(obj)
284 i = inspector.info(obj)
285 nt.assert_is(i['call_def'], None)
285 nt.assert_is(i['call_def'], None)
286
286
287 if py3compat.PY3:
287 if py3compat.PY3:
288 exec("def f_kwarg(pos, *, kwonly): pass")
288 exec("def f_kwarg(pos, *, kwonly): pass")
289
289
290 @skipif(not py3compat.PY3)
290 @skipif(not py3compat.PY3)
291 def test_definition_kwonlyargs():
291 def test_definition_kwonlyargs():
292 i = inspector.info(f_kwarg, oname='f_kwarg') # analysis:ignore
292 i = inspector.info(f_kwarg, oname='f_kwarg') # analysis:ignore
293 nt.assert_equal(i['definition'], "f_kwarg(pos, *, kwonly)\n")
293 nt.assert_equal(i['definition'], "f_kwarg(pos, *, kwonly)\n")
294
294
295 def test_getdoc():
295 def test_getdoc():
296 class A(object):
296 class A(object):
297 """standard docstring"""
297 """standard docstring"""
298 pass
298 pass
299
299
300 class B(object):
300 class B(object):
301 """standard docstring"""
301 """standard docstring"""
302 def getdoc(self):
302 def getdoc(self):
303 return "custom docstring"
303 return "custom docstring"
304
304
305 class C(object):
305 class C(object):
306 """standard docstring"""
306 """standard docstring"""
307 def getdoc(self):
307 def getdoc(self):
308 return None
308 return None
309
309
310 a = A()
310 a = A()
311 b = B()
311 b = B()
312 c = C()
312 c = C()
313
313
314 nt.assert_equal(oinspect.getdoc(a), "standard docstring")
314 nt.assert_equal(oinspect.getdoc(a), "standard docstring")
315 nt.assert_equal(oinspect.getdoc(b), "custom docstring")
315 nt.assert_equal(oinspect.getdoc(b), "custom docstring")
316 nt.assert_equal(oinspect.getdoc(c), "standard docstring")
316 nt.assert_equal(oinspect.getdoc(c), "standard docstring")
317
317
318
318
319 def test_empty_property_has_no_source():
319 def test_empty_property_has_no_source():
320 i = inspector.info(property(), detail_level=1)
320 i = inspector.info(property(), detail_level=1)
321 nt.assert_is(i['source'], None)
321 nt.assert_is(i['source'], None)
322
322
323
323
324 def test_property_sources():
324 def test_property_sources():
325 import zlib
325 import zlib
326
326
327 class A(object):
327 class A(object):
328 @property
328 @property
329 def foo(self):
329 def foo(self):
330 return 'bar'
330 return 'bar'
331
331
332 foo = foo.setter(lambda self, v: setattr(self, 'bar', v))
332 foo = foo.setter(lambda self, v: setattr(self, 'bar', v))
333
333
334 id = property(id)
334 id = property(id)
335 compress = property(zlib.compress)
335 compress = property(zlib.compress)
336
336
337 i = inspector.info(A.foo, detail_level=1)
337 i = inspector.info(A.foo, detail_level=1)
338 nt.assert_in('def foo(self):', i['source'])
338 nt.assert_in('def foo(self):', i['source'])
339 nt.assert_in('lambda self, v:', i['source'])
339 nt.assert_in('lambda self, v:', i['source'])
340
340
341 i = inspector.info(A.id, detail_level=1)
341 i = inspector.info(A.id, detail_level=1)
342 nt.assert_in('fget = <function id>', i['source'])
342 nt.assert_in('fget = <function id>', i['source'])
343
343
344 i = inspector.info(A.compress, detail_level=1)
344 i = inspector.info(A.compress, detail_level=1)
345 nt.assert_in('fget = <function zlib.compress>', i['source'])
345 nt.assert_in('fget = <function zlib.compress>', i['source'])
346
346
347
347
348 def test_property_docstring_is_in_info_for_detail_level_0():
348 def test_property_docstring_is_in_info_for_detail_level_0():
349 class A(object):
349 class A(object):
350 @property
350 @property
351 def foobar():
351 def foobar():
352 """This is `foobar` property."""
352 """This is `foobar` property."""
353 pass
353 pass
354
354
355 ip.user_ns['a_obj'] = A()
355 ip.user_ns['a_obj'] = A()
356 nt.assert_equals(
356 nt.assert_equals(
357 'This is `foobar` property.',
357 'This is `foobar` property.',
358 ip.object_inspect('a_obj.foobar', detail_level=0)['docstring'])
358 ip.object_inspect('a_obj.foobar', detail_level=0)['docstring'])
359
359
360 ip.user_ns['a_cls'] = A
360 ip.user_ns['a_cls'] = A
361 nt.assert_equals(
361 nt.assert_equals(
362 'This is `foobar` property.',
362 'This is `foobar` property.',
363 ip.object_inspect('a_cls.foobar', detail_level=0)['docstring'])
363 ip.object_inspect('a_cls.foobar', detail_level=0)['docstring'])
364
364
365
365
366 def test_pdef():
366 def test_pdef():
367 # See gh-1914
367 # See gh-1914
368 def foo(): pass
368 def foo(): pass
369 inspector.pdef(foo, 'foo')
369 inspector.pdef(foo, 'foo')
370
370
371 def test_pinfo_nonascii():
371 def test_pinfo_nonascii():
372 # See gh-1177
372 # See gh-1177
373 from . import nonascii2
373 from . import nonascii2
374 ip.user_ns['nonascii2'] = nonascii2
374 ip.user_ns['nonascii2'] = nonascii2
375 ip._inspect('pinfo', 'nonascii2', detail_level=1)
375 ip._inspect('pinfo', 'nonascii2', detail_level=1)
376
376
377 def test_pinfo_magic():
377 def test_pinfo_magic():
378 with AssertPrints('Docstring:'):
378 with AssertPrints('Docstring:'):
379 ip._inspect('pinfo', 'lsmagic', detail_level=0)
379 ip._inspect('pinfo', 'lsmagic', detail_level=0)
380
380
381 with AssertPrints('Source:'):
381 with AssertPrints('Source:'):
382 ip._inspect('pinfo', 'lsmagic', detail_level=1)
382 ip._inspect('pinfo', 'lsmagic', detail_level=1)
@@ -1,707 +1,707 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 ======
3 ======
4 Rmagic
4 Rmagic
5 ======
5 ======
6
6
7 Magic command interface for interactive work with R via rpy2
7 Magic command interface for interactive work with R via rpy2
8
8
9 .. note::
9 .. note::
10
10
11 The ``rpy2`` package needs to be installed separately. It
11 The ``rpy2`` package needs to be installed separately. It
12 can be obtained using ``easy_install`` or ``pip``.
12 can be obtained using ``easy_install`` or ``pip``.
13
13
14 You will also need a working copy of R.
14 You will also need a working copy of R.
15
15
16 Usage
16 Usage
17 =====
17 =====
18
18
19 To enable the magics below, execute ``%load_ext rmagic``.
19 To enable the magics below, execute ``%load_ext rmagic``.
20
20
21 ``%R``
21 ``%R``
22
22
23 {R_DOC}
23 {R_DOC}
24
24
25 ``%Rpush``
25 ``%Rpush``
26
26
27 {RPUSH_DOC}
27 {RPUSH_DOC}
28
28
29 ``%Rpull``
29 ``%Rpull``
30
30
31 {RPULL_DOC}
31 {RPULL_DOC}
32
32
33 ``%Rget``
33 ``%Rget``
34
34
35 {RGET_DOC}
35 {RGET_DOC}
36
36
37 """
37 """
38 from __future__ import print_function
38 from __future__ import print_function
39
39
40 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
41 # Copyright (C) 2012 The IPython Development Team
41 # Copyright (C) 2012 The IPython Development Team
42 #
42 #
43 # Distributed under the terms of the BSD License. The full license is in
43 # Distributed under the terms of the BSD License. The full license is in
44 # the file COPYING, distributed as part of this software.
44 # the file COPYING, distributed as part of this software.
45 #-----------------------------------------------------------------------------
45 #-----------------------------------------------------------------------------
46
46
47 import sys
47 import sys
48 import tempfile
48 import tempfile
49 from glob import glob
49 from glob import glob
50 from shutil import rmtree
50 from shutil import rmtree
51 import warnings
51 import warnings
52
52
53 # numpy and rpy2 imports
53 # numpy and rpy2 imports
54
54
55 import numpy as np
55 import numpy as np
56
56
57 import rpy2.rinterface as ri
57 import rpy2.rinterface as ri
58 import rpy2.robjects as ro
58 import rpy2.robjects as ro
59 try:
59 try:
60 from rpy2.robjects import pandas2ri
60 from rpy2.robjects import pandas2ri
61 pandas2ri.activate()
61 pandas2ri.activate()
62 except ImportError:
62 except ImportError:
63 pandas2ri = None
63 pandas2ri = None
64 from rpy2.robjects import numpy2ri
64 from rpy2.robjects import numpy2ri
65 numpy2ri.activate()
65 numpy2ri.activate()
66
66
67 # IPython imports
67 # IPython imports
68
68
69 from IPython.core.displaypub import publish_display_data
69 from IPython.core.displaypub import publish_display_data
70 from IPython.core.magic import (Magics, magics_class, line_magic,
70 from IPython.core.magic import (Magics, magics_class, line_magic,
71 line_cell_magic, needs_local_scope)
71 line_cell_magic, needs_local_scope)
72 from IPython.testing.skipdoctest import skip_doctest
72 from IPython.testing.skipdoctest import skip_doctest
73 from IPython.core.magic_arguments import (
73 from IPython.core.magic_arguments import (
74 argument, magic_arguments, parse_argstring
74 argument, magic_arguments, parse_argstring
75 )
75 )
76 from IPython.external.simplegeneric import generic
76 from simplegeneric import generic
77 from IPython.utils.py3compat import (str_to_unicode, unicode_to_str, PY3,
77 from IPython.utils.py3compat import (str_to_unicode, unicode_to_str, PY3,
78 unicode_type)
78 unicode_type)
79 from IPython.utils.text import dedent
79 from IPython.utils.text import dedent
80
80
81 class RInterpreterError(ri.RRuntimeError):
81 class RInterpreterError(ri.RRuntimeError):
82 """An error when running R code in a %%R magic cell."""
82 """An error when running R code in a %%R magic cell."""
83 def __init__(self, line, err, stdout):
83 def __init__(self, line, err, stdout):
84 self.line = line
84 self.line = line
85 self.err = err.rstrip()
85 self.err = err.rstrip()
86 self.stdout = stdout.rstrip()
86 self.stdout = stdout.rstrip()
87
87
88 def __unicode__(self):
88 def __unicode__(self):
89 s = 'Failed to parse and evaluate line %r.\nR error message: %r' % \
89 s = 'Failed to parse and evaluate line %r.\nR error message: %r' % \
90 (self.line, self.err)
90 (self.line, self.err)
91 if self.stdout and (self.stdout != self.err):
91 if self.stdout and (self.stdout != self.err):
92 s += '\nR stdout:\n' + self.stdout
92 s += '\nR stdout:\n' + self.stdout
93 return s
93 return s
94
94
95 if PY3:
95 if PY3:
96 __str__ = __unicode__
96 __str__ = __unicode__
97 else:
97 else:
98 def __str__(self):
98 def __str__(self):
99 return unicode_to_str(unicode(self), 'utf-8')
99 return unicode_to_str(unicode(self), 'utf-8')
100
100
101 def Rconverter(Robj, dataframe=False):
101 def Rconverter(Robj, dataframe=False):
102 """
102 """
103 Convert an object in R's namespace to one suitable
103 Convert an object in R's namespace to one suitable
104 for ipython's namespace.
104 for ipython's namespace.
105
105
106 For a data.frame, it tries to return a structured array.
106 For a data.frame, it tries to return a structured array.
107 It first checks for colnames, then names.
107 It first checks for colnames, then names.
108 If all are NULL, it returns np.asarray(Robj), else
108 If all are NULL, it returns np.asarray(Robj), else
109 it tries to construct a recarray
109 it tries to construct a recarray
110
110
111 Parameters
111 Parameters
112 ----------
112 ----------
113
113
114 Robj: an R object returned from rpy2
114 Robj: an R object returned from rpy2
115 """
115 """
116 is_data_frame = ro.r('is.data.frame')
116 is_data_frame = ro.r('is.data.frame')
117 colnames = ro.r('colnames')
117 colnames = ro.r('colnames')
118 rownames = ro.r('rownames') # with pandas, these could be used for the index
118 rownames = ro.r('rownames') # with pandas, these could be used for the index
119 names = ro.r('names')
119 names = ro.r('names')
120
120
121 if dataframe:
121 if dataframe:
122 as_data_frame = ro.r('as.data.frame')
122 as_data_frame = ro.r('as.data.frame')
123 cols = colnames(Robj)
123 cols = colnames(Robj)
124 _names = names(Robj)
124 _names = names(Robj)
125 if cols != ri.NULL:
125 if cols != ri.NULL:
126 Robj = as_data_frame(Robj)
126 Robj = as_data_frame(Robj)
127 names = tuple(np.array(cols))
127 names = tuple(np.array(cols))
128 elif _names != ri.NULL:
128 elif _names != ri.NULL:
129 names = tuple(np.array(_names))
129 names = tuple(np.array(_names))
130 else: # failed to find names
130 else: # failed to find names
131 return np.asarray(Robj)
131 return np.asarray(Robj)
132 Robj = np.rec.fromarrays(Robj, names = names)
132 Robj = np.rec.fromarrays(Robj, names = names)
133 return np.asarray(Robj)
133 return np.asarray(Robj)
134
134
135 @generic
135 @generic
136 def pyconverter(pyobj):
136 def pyconverter(pyobj):
137 """Convert Python objects to R objects. Add types using the decorator:
137 """Convert Python objects to R objects. Add types using the decorator:
138
138
139 @pyconverter.when_type
139 @pyconverter.when_type
140 """
140 """
141 return pyobj
141 return pyobj
142
142
143 # The default conversion for lists seems to make them a nested list. That has
143 # The default conversion for lists seems to make them a nested list. That has
144 # some advantages, but is rarely convenient, so for interactive use, we convert
144 # some advantages, but is rarely convenient, so for interactive use, we convert
145 # lists to a numpy array, which becomes an R vector.
145 # lists to a numpy array, which becomes an R vector.
146 @pyconverter.when_type(list)
146 @pyconverter.when_type(list)
147 def pyconverter_list(pyobj):
147 def pyconverter_list(pyobj):
148 return np.asarray(pyobj)
148 return np.asarray(pyobj)
149
149
150 if pandas2ri is None:
150 if pandas2ri is None:
151 # pandas2ri was new in rpy2 2.3.3, so for now we'll fallback to pandas'
151 # pandas2ri was new in rpy2 2.3.3, so for now we'll fallback to pandas'
152 # conversion function.
152 # conversion function.
153 try:
153 try:
154 from pandas import DataFrame
154 from pandas import DataFrame
155 from pandas.rpy.common import convert_to_r_dataframe
155 from pandas.rpy.common import convert_to_r_dataframe
156 @pyconverter.when_type(DataFrame)
156 @pyconverter.when_type(DataFrame)
157 def pyconverter_dataframe(pyobj):
157 def pyconverter_dataframe(pyobj):
158 return convert_to_r_dataframe(pyobj, strings_as_factors=True)
158 return convert_to_r_dataframe(pyobj, strings_as_factors=True)
159 except ImportError:
159 except ImportError:
160 pass
160 pass
161
161
162 @magics_class
162 @magics_class
163 class RMagics(Magics):
163 class RMagics(Magics):
164 """A set of magics useful for interactive work with R via rpy2.
164 """A set of magics useful for interactive work with R via rpy2.
165 """
165 """
166
166
167 def __init__(self, shell, Rconverter=Rconverter,
167 def __init__(self, shell, Rconverter=Rconverter,
168 pyconverter=pyconverter,
168 pyconverter=pyconverter,
169 cache_display_data=False):
169 cache_display_data=False):
170 """
170 """
171 Parameters
171 Parameters
172 ----------
172 ----------
173
173
174 shell : IPython shell
174 shell : IPython shell
175
175
176 Rconverter : callable
176 Rconverter : callable
177 To be called on values taken from R before putting them in the
177 To be called on values taken from R before putting them in the
178 IPython namespace.
178 IPython namespace.
179
179
180 pyconverter : callable
180 pyconverter : callable
181 To be called on values in ipython namespace before
181 To be called on values in ipython namespace before
182 assigning to variables in rpy2.
182 assigning to variables in rpy2.
183
183
184 cache_display_data : bool
184 cache_display_data : bool
185 If True, the published results of the final call to R are
185 If True, the published results of the final call to R are
186 cached in the variable 'display_cache'.
186 cached in the variable 'display_cache'.
187
187
188 """
188 """
189 super(RMagics, self).__init__(shell)
189 super(RMagics, self).__init__(shell)
190 self.cache_display_data = cache_display_data
190 self.cache_display_data = cache_display_data
191
191
192 self.r = ro.R()
192 self.r = ro.R()
193
193
194 self.Rstdout_cache = []
194 self.Rstdout_cache = []
195 self.pyconverter = pyconverter
195 self.pyconverter = pyconverter
196 self.Rconverter = Rconverter
196 self.Rconverter = Rconverter
197
197
198 def eval(self, line):
198 def eval(self, line):
199 '''
199 '''
200 Parse and evaluate a line of R code with rpy2.
200 Parse and evaluate a line of R code with rpy2.
201 Returns the output to R's stdout() connection,
201 Returns the output to R's stdout() connection,
202 the value generated by evaluating the code, and a
202 the value generated by evaluating the code, and a
203 boolean indicating whether the return value would be
203 boolean indicating whether the return value would be
204 visible if the line of code were evaluated in an R REPL.
204 visible if the line of code were evaluated in an R REPL.
205
205
206 R Code evaluation and visibility determination are
206 R Code evaluation and visibility determination are
207 done via an R call of the form withVisible({<code>})
207 done via an R call of the form withVisible({<code>})
208
208
209 '''
209 '''
210 old_writeconsole = ri.get_writeconsole()
210 old_writeconsole = ri.get_writeconsole()
211 ri.set_writeconsole(self.write_console)
211 ri.set_writeconsole(self.write_console)
212 try:
212 try:
213 res = ro.r("withVisible({%s\n})" % line)
213 res = ro.r("withVisible({%s\n})" % line)
214 value = res[0] #value (R object)
214 value = res[0] #value (R object)
215 visible = ro.conversion.ri2py(res[1])[0] #visible (boolean)
215 visible = ro.conversion.ri2py(res[1])[0] #visible (boolean)
216 except (ri.RRuntimeError, ValueError) as exception:
216 except (ri.RRuntimeError, ValueError) as exception:
217 warning_or_other_msg = self.flush() # otherwise next return seems to have copy of error
217 warning_or_other_msg = self.flush() # otherwise next return seems to have copy of error
218 raise RInterpreterError(line, str_to_unicode(str(exception)), warning_or_other_msg)
218 raise RInterpreterError(line, str_to_unicode(str(exception)), warning_or_other_msg)
219 text_output = self.flush()
219 text_output = self.flush()
220 ri.set_writeconsole(old_writeconsole)
220 ri.set_writeconsole(old_writeconsole)
221 return text_output, value, visible
221 return text_output, value, visible
222
222
223 def write_console(self, output):
223 def write_console(self, output):
224 '''
224 '''
225 A hook to capture R's stdout in a cache.
225 A hook to capture R's stdout in a cache.
226 '''
226 '''
227 self.Rstdout_cache.append(output)
227 self.Rstdout_cache.append(output)
228
228
229 def flush(self):
229 def flush(self):
230 '''
230 '''
231 Flush R's stdout cache to a string, returning the string.
231 Flush R's stdout cache to a string, returning the string.
232 '''
232 '''
233 value = ''.join([str_to_unicode(s, 'utf-8') for s in self.Rstdout_cache])
233 value = ''.join([str_to_unicode(s, 'utf-8') for s in self.Rstdout_cache])
234 self.Rstdout_cache = []
234 self.Rstdout_cache = []
235 return value
235 return value
236
236
237 @skip_doctest
237 @skip_doctest
238 @needs_local_scope
238 @needs_local_scope
239 @line_magic
239 @line_magic
240 def Rpush(self, line, local_ns=None):
240 def Rpush(self, line, local_ns=None):
241 '''
241 '''
242 A line-level magic for R that pushes
242 A line-level magic for R that pushes
243 variables from python to rpy2. The line should be made up
243 variables from python to rpy2. The line should be made up
244 of whitespace separated variable names in the IPython
244 of whitespace separated variable names in the IPython
245 namespace::
245 namespace::
246
246
247 In [7]: import numpy as np
247 In [7]: import numpy as np
248
248
249 In [8]: X = np.array([4.5,6.3,7.9])
249 In [8]: X = np.array([4.5,6.3,7.9])
250
250
251 In [9]: X.mean()
251 In [9]: X.mean()
252 Out[9]: 6.2333333333333343
252 Out[9]: 6.2333333333333343
253
253
254 In [10]: %Rpush X
254 In [10]: %Rpush X
255
255
256 In [11]: %R mean(X)
256 In [11]: %R mean(X)
257 Out[11]: array([ 6.23333333])
257 Out[11]: array([ 6.23333333])
258
258
259 '''
259 '''
260 if local_ns is None:
260 if local_ns is None:
261 local_ns = {}
261 local_ns = {}
262
262
263 inputs = line.split(' ')
263 inputs = line.split(' ')
264 for input in inputs:
264 for input in inputs:
265 try:
265 try:
266 val = local_ns[input]
266 val = local_ns[input]
267 except KeyError:
267 except KeyError:
268 try:
268 try:
269 val = self.shell.user_ns[input]
269 val = self.shell.user_ns[input]
270 except KeyError:
270 except KeyError:
271 # reraise the KeyError as a NameError so that it looks like
271 # reraise the KeyError as a NameError so that it looks like
272 # the standard python behavior when you use an unnamed
272 # the standard python behavior when you use an unnamed
273 # variable
273 # variable
274 raise NameError("name '%s' is not defined" % input)
274 raise NameError("name '%s' is not defined" % input)
275
275
276 self.r.assign(input, self.pyconverter(val))
276 self.r.assign(input, self.pyconverter(val))
277
277
278 @skip_doctest
278 @skip_doctest
279 @magic_arguments()
279 @magic_arguments()
280 @argument(
280 @argument(
281 '-d', '--as_dataframe', action='store_true',
281 '-d', '--as_dataframe', action='store_true',
282 default=False,
282 default=False,
283 help='Convert objects to data.frames before returning to ipython.'
283 help='Convert objects to data.frames before returning to ipython.'
284 )
284 )
285 @argument(
285 @argument(
286 'outputs',
286 'outputs',
287 nargs='*',
287 nargs='*',
288 )
288 )
289 @line_magic
289 @line_magic
290 def Rpull(self, line):
290 def Rpull(self, line):
291 '''
291 '''
292 A line-level magic for R that pulls
292 A line-level magic for R that pulls
293 variables from python to rpy2::
293 variables from python to rpy2::
294
294
295 In [18]: _ = %R x = c(3,4,6.7); y = c(4,6,7); z = c('a',3,4)
295 In [18]: _ = %R x = c(3,4,6.7); y = c(4,6,7); z = c('a',3,4)
296
296
297 In [19]: %Rpull x y z
297 In [19]: %Rpull x y z
298
298
299 In [20]: x
299 In [20]: x
300 Out[20]: array([ 3. , 4. , 6.7])
300 Out[20]: array([ 3. , 4. , 6.7])
301
301
302 In [21]: y
302 In [21]: y
303 Out[21]: array([ 4., 6., 7.])
303 Out[21]: array([ 4., 6., 7.])
304
304
305 In [22]: z
305 In [22]: z
306 Out[22]:
306 Out[22]:
307 array(['a', '3', '4'],
307 array(['a', '3', '4'],
308 dtype='|S1')
308 dtype='|S1')
309
309
310
310
311 If --as_dataframe, then each object is returned as a structured array
311 If --as_dataframe, then each object is returned as a structured array
312 after first passed through "as.data.frame" in R before
312 after first passed through "as.data.frame" in R before
313 being calling self.Rconverter.
313 being calling self.Rconverter.
314 This is useful when a structured array is desired as output, or
314 This is useful when a structured array is desired as output, or
315 when the object in R has mixed data types.
315 when the object in R has mixed data types.
316 See the %%R docstring for more examples.
316 See the %%R docstring for more examples.
317
317
318 Notes
318 Notes
319 -----
319 -----
320
320
321 Beware that R names can have '.' so this is not fool proof.
321 Beware that R names can have '.' so this is not fool proof.
322 To avoid this, don't name your R objects with '.'s...
322 To avoid this, don't name your R objects with '.'s...
323
323
324 '''
324 '''
325 args = parse_argstring(self.Rpull, line)
325 args = parse_argstring(self.Rpull, line)
326 outputs = args.outputs
326 outputs = args.outputs
327 for output in outputs:
327 for output in outputs:
328 self.shell.push({output:self.Rconverter(self.r(output),dataframe=args.as_dataframe)})
328 self.shell.push({output:self.Rconverter(self.r(output),dataframe=args.as_dataframe)})
329
329
330 @skip_doctest
330 @skip_doctest
331 @magic_arguments()
331 @magic_arguments()
332 @argument(
332 @argument(
333 '-d', '--as_dataframe', action='store_true',
333 '-d', '--as_dataframe', action='store_true',
334 default=False,
334 default=False,
335 help='Convert objects to data.frames before returning to ipython.'
335 help='Convert objects to data.frames before returning to ipython.'
336 )
336 )
337 @argument(
337 @argument(
338 'output',
338 'output',
339 nargs=1,
339 nargs=1,
340 type=str,
340 type=str,
341 )
341 )
342 @line_magic
342 @line_magic
343 def Rget(self, line):
343 def Rget(self, line):
344 '''
344 '''
345 Return an object from rpy2, possibly as a structured array (if possible).
345 Return an object from rpy2, possibly as a structured array (if possible).
346 Similar to Rpull except only one argument is accepted and the value is
346 Similar to Rpull except only one argument is accepted and the value is
347 returned rather than pushed to self.shell.user_ns::
347 returned rather than pushed to self.shell.user_ns::
348
348
349 In [3]: dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')]
349 In [3]: dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')]
350
350
351 In [4]: datapy = np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5, 'e')], dtype=dtype)
351 In [4]: datapy = np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5, 'e')], dtype=dtype)
352
352
353 In [5]: %R -i datapy
353 In [5]: %R -i datapy
354
354
355 In [6]: %Rget datapy
355 In [6]: %Rget datapy
356 Out[6]:
356 Out[6]:
357 array([['1', '2', '3', '4'],
357 array([['1', '2', '3', '4'],
358 ['2', '3', '2', '5'],
358 ['2', '3', '2', '5'],
359 ['a', 'b', 'c', 'e']],
359 ['a', 'b', 'c', 'e']],
360 dtype='|S1')
360 dtype='|S1')
361
361
362 In [7]: %Rget -d datapy
362 In [7]: %Rget -d datapy
363 Out[7]:
363 Out[7]:
364 array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5.0, 'e')],
364 array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5.0, 'e')],
365 dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])
365 dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])
366
366
367 '''
367 '''
368 args = parse_argstring(self.Rget, line)
368 args = parse_argstring(self.Rget, line)
369 output = args.output
369 output = args.output
370 return self.Rconverter(self.r(output[0]),dataframe=args.as_dataframe)
370 return self.Rconverter(self.r(output[0]),dataframe=args.as_dataframe)
371
371
372
372
373 @skip_doctest
373 @skip_doctest
374 @magic_arguments()
374 @magic_arguments()
375 @argument(
375 @argument(
376 '-i', '--input', action='append',
376 '-i', '--input', action='append',
377 help='Names of input variable from shell.user_ns to be assigned to R variables of the same names after calling self.pyconverter. Multiple names can be passed separated only by commas with no whitespace.'
377 help='Names of input variable from shell.user_ns to be assigned to R variables of the same names after calling self.pyconverter. Multiple names can be passed separated only by commas with no whitespace.'
378 )
378 )
379 @argument(
379 @argument(
380 '-o', '--output', action='append',
380 '-o', '--output', action='append',
381 help='Names of variables to be pushed from rpy2 to shell.user_ns after executing cell body and applying self.Rconverter. Multiple names can be passed separated only by commas with no whitespace.'
381 help='Names of variables to be pushed from rpy2 to shell.user_ns after executing cell body and applying self.Rconverter. Multiple names can be passed separated only by commas with no whitespace.'
382 )
382 )
383 @argument(
383 @argument(
384 '-w', '--width', type=int,
384 '-w', '--width', type=int,
385 help='Width of png plotting device sent as an argument to *png* in R.'
385 help='Width of png plotting device sent as an argument to *png* in R.'
386 )
386 )
387 @argument(
387 @argument(
388 '-h', '--height', type=int,
388 '-h', '--height', type=int,
389 help='Height of png plotting device sent as an argument to *png* in R.'
389 help='Height of png plotting device sent as an argument to *png* in R.'
390 )
390 )
391
391
392 @argument(
392 @argument(
393 '-d', '--dataframe', action='append',
393 '-d', '--dataframe', action='append',
394 help='Convert these objects to data.frames and return as structured arrays.'
394 help='Convert these objects to data.frames and return as structured arrays.'
395 )
395 )
396 @argument(
396 @argument(
397 '-u', '--units', type=unicode_type, choices=["px", "in", "cm", "mm"],
397 '-u', '--units', type=unicode_type, choices=["px", "in", "cm", "mm"],
398 help='Units of png plotting device sent as an argument to *png* in R. One of ["px", "in", "cm", "mm"].'
398 help='Units of png plotting device sent as an argument to *png* in R. One of ["px", "in", "cm", "mm"].'
399 )
399 )
400 @argument(
400 @argument(
401 '-r', '--res', type=int,
401 '-r', '--res', type=int,
402 help='Resolution of png plotting device sent as an argument to *png* in R. Defaults to 72 if *units* is one of ["in", "cm", "mm"].'
402 help='Resolution of png plotting device sent as an argument to *png* in R. Defaults to 72 if *units* is one of ["in", "cm", "mm"].'
403 )
403 )
404 @argument(
404 @argument(
405 '-p', '--pointsize', type=int,
405 '-p', '--pointsize', type=int,
406 help='Pointsize of png plotting device sent as an argument to *png* in R.'
406 help='Pointsize of png plotting device sent as an argument to *png* in R.'
407 )
407 )
408 @argument(
408 @argument(
409 '-b', '--bg',
409 '-b', '--bg',
410 help='Background of png plotting device sent as an argument to *png* in R.'
410 help='Background of png plotting device sent as an argument to *png* in R.'
411 )
411 )
412 @argument(
412 @argument(
413 '-n', '--noreturn',
413 '-n', '--noreturn',
414 help='Force the magic to not return anything.',
414 help='Force the magic to not return anything.',
415 action='store_true',
415 action='store_true',
416 default=False
416 default=False
417 )
417 )
418 @argument(
418 @argument(
419 'code',
419 'code',
420 nargs='*',
420 nargs='*',
421 )
421 )
422 @needs_local_scope
422 @needs_local_scope
423 @line_cell_magic
423 @line_cell_magic
424 def R(self, line, cell=None, local_ns=None):
424 def R(self, line, cell=None, local_ns=None):
425 '''
425 '''
426 Execute code in R, and pull some of the results back into the Python namespace.
426 Execute code in R, and pull some of the results back into the Python namespace.
427
427
428 In line mode, this will evaluate an expression and convert the returned value to a Python object.
428 In line mode, this will evaluate an expression and convert the returned value to a Python object.
429 The return value is determined by rpy2's behaviour of returning the result of evaluating the
429 The return value is determined by rpy2's behaviour of returning the result of evaluating the
430 final line.
430 final line.
431
431
432 Multiple R lines can be executed by joining them with semicolons::
432 Multiple R lines can be executed by joining them with semicolons::
433
433
434 In [9]: %R X=c(1,4,5,7); sd(X); mean(X)
434 In [9]: %R X=c(1,4,5,7); sd(X); mean(X)
435 Out[9]: array([ 4.25])
435 Out[9]: array([ 4.25])
436
436
437 In cell mode, this will run a block of R code. The resulting value
437 In cell mode, this will run a block of R code. The resulting value
438 is printed if it would printed be when evaluating the same code
438 is printed if it would printed be when evaluating the same code
439 within a standard R REPL.
439 within a standard R REPL.
440
440
441 Nothing is returned to python by default in cell mode::
441 Nothing is returned to python by default in cell mode::
442
442
443 In [10]: %%R
443 In [10]: %%R
444 ....: Y = c(2,4,3,9)
444 ....: Y = c(2,4,3,9)
445 ....: summary(lm(Y~X))
445 ....: summary(lm(Y~X))
446
446
447 Call:
447 Call:
448 lm(formula = Y ~ X)
448 lm(formula = Y ~ X)
449
449
450 Residuals:
450 Residuals:
451 1 2 3 4
451 1 2 3 4
452 0.88 -0.24 -2.28 1.64
452 0.88 -0.24 -2.28 1.64
453
453
454 Coefficients:
454 Coefficients:
455 Estimate Std. Error t value Pr(>|t|)
455 Estimate Std. Error t value Pr(>|t|)
456 (Intercept) 0.0800 2.3000 0.035 0.975
456 (Intercept) 0.0800 2.3000 0.035 0.975
457 X 1.0400 0.4822 2.157 0.164
457 X 1.0400 0.4822 2.157 0.164
458
458
459 Residual standard error: 2.088 on 2 degrees of freedom
459 Residual standard error: 2.088 on 2 degrees of freedom
460 Multiple R-squared: 0.6993,Adjusted R-squared: 0.549
460 Multiple R-squared: 0.6993,Adjusted R-squared: 0.549
461 F-statistic: 4.651 on 1 and 2 DF, p-value: 0.1638
461 F-statistic: 4.651 on 1 and 2 DF, p-value: 0.1638
462
462
463 In the notebook, plots are published as the output of the cell::
463 In the notebook, plots are published as the output of the cell::
464
464
465 %R plot(X, Y)
465 %R plot(X, Y)
466
466
467 will create a scatter plot of X bs Y.
467 will create a scatter plot of X bs Y.
468
468
469 If cell is not None and line has some R code, it is prepended to
469 If cell is not None and line has some R code, it is prepended to
470 the R code in cell.
470 the R code in cell.
471
471
472 Objects can be passed back and forth between rpy2 and python via the -i -o flags in line::
472 Objects can be passed back and forth between rpy2 and python via the -i -o flags in line::
473
473
474 In [14]: Z = np.array([1,4,5,10])
474 In [14]: Z = np.array([1,4,5,10])
475
475
476 In [15]: %R -i Z mean(Z)
476 In [15]: %R -i Z mean(Z)
477 Out[15]: array([ 5.])
477 Out[15]: array([ 5.])
478
478
479
479
480 In [16]: %R -o W W=Z*mean(Z)
480 In [16]: %R -o W W=Z*mean(Z)
481 Out[16]: array([ 5., 20., 25., 50.])
481 Out[16]: array([ 5., 20., 25., 50.])
482
482
483 In [17]: W
483 In [17]: W
484 Out[17]: array([ 5., 20., 25., 50.])
484 Out[17]: array([ 5., 20., 25., 50.])
485
485
486 The return value is determined by these rules:
486 The return value is determined by these rules:
487
487
488 * If the cell is not None, the magic returns None.
488 * If the cell is not None, the magic returns None.
489
489
490 * If the cell evaluates as False, the resulting value is returned
490 * If the cell evaluates as False, the resulting value is returned
491 unless the final line prints something to the console, in
491 unless the final line prints something to the console, in
492 which case None is returned.
492 which case None is returned.
493
493
494 * If the final line results in a NULL value when evaluated
494 * If the final line results in a NULL value when evaluated
495 by rpy2, then None is returned.
495 by rpy2, then None is returned.
496
496
497 * No attempt is made to convert the final value to a structured array.
497 * No attempt is made to convert the final value to a structured array.
498 Use the --dataframe flag or %Rget to push / return a structured array.
498 Use the --dataframe flag or %Rget to push / return a structured array.
499
499
500 * If the -n flag is present, there is no return value.
500 * If the -n flag is present, there is no return value.
501
501
502 * A trailing ';' will also result in no return value as the last
502 * A trailing ';' will also result in no return value as the last
503 value in the line is an empty string.
503 value in the line is an empty string.
504
504
505 The --dataframe argument will attempt to return structured arrays.
505 The --dataframe argument will attempt to return structured arrays.
506 This is useful for dataframes with
506 This is useful for dataframes with
507 mixed data types. Note also that for a data.frame,
507 mixed data types. Note also that for a data.frame,
508 if it is returned as an ndarray, it is transposed::
508 if it is returned as an ndarray, it is transposed::
509
509
510 In [18]: dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')]
510 In [18]: dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')]
511
511
512 In [19]: datapy = np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5, 'e')], dtype=dtype)
512 In [19]: datapy = np.array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5, 'e')], dtype=dtype)
513
513
514 In [20]: %%R -o datar
514 In [20]: %%R -o datar
515 datar = datapy
515 datar = datapy
516 ....:
516 ....:
517
517
518 In [21]: datar
518 In [21]: datar
519 Out[21]:
519 Out[21]:
520 array([['1', '2', '3', '4'],
520 array([['1', '2', '3', '4'],
521 ['2', '3', '2', '5'],
521 ['2', '3', '2', '5'],
522 ['a', 'b', 'c', 'e']],
522 ['a', 'b', 'c', 'e']],
523 dtype='|S1')
523 dtype='|S1')
524
524
525 In [22]: %%R -d datar
525 In [22]: %%R -d datar
526 datar = datapy
526 datar = datapy
527 ....:
527 ....:
528
528
529 In [23]: datar
529 In [23]: datar
530 Out[23]:
530 Out[23]:
531 array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5.0, 'e')],
531 array([(1, 2.9, 'a'), (2, 3.5, 'b'), (3, 2.1, 'c'), (4, 5.0, 'e')],
532 dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])
532 dtype=[('x', '<i4'), ('y', '<f8'), ('z', '|S1')])
533
533
534 The --dataframe argument first tries colnames, then names.
534 The --dataframe argument first tries colnames, then names.
535 If both are NULL, it returns an ndarray (i.e. unstructured)::
535 If both are NULL, it returns an ndarray (i.e. unstructured)::
536
536
537 In [1]: %R mydata=c(4,6,8.3); NULL
537 In [1]: %R mydata=c(4,6,8.3); NULL
538
538
539 In [2]: %R -d mydata
539 In [2]: %R -d mydata
540
540
541 In [3]: mydata
541 In [3]: mydata
542 Out[3]: array([ 4. , 6. , 8.3])
542 Out[3]: array([ 4. , 6. , 8.3])
543
543
544 In [4]: %R names(mydata) = c('a','b','c'); NULL
544 In [4]: %R names(mydata) = c('a','b','c'); NULL
545
545
546 In [5]: %R -d mydata
546 In [5]: %R -d mydata
547
547
548 In [6]: mydata
548 In [6]: mydata
549 Out[6]:
549 Out[6]:
550 array((4.0, 6.0, 8.3),
550 array((4.0, 6.0, 8.3),
551 dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])
551 dtype=[('a', '<f8'), ('b', '<f8'), ('c', '<f8')])
552
552
553 In [7]: %R -o mydata
553 In [7]: %R -o mydata
554
554
555 In [8]: mydata
555 In [8]: mydata
556 Out[8]: array([ 4. , 6. , 8.3])
556 Out[8]: array([ 4. , 6. , 8.3])
557
557
558 '''
558 '''
559
559
560 args = parse_argstring(self.R, line)
560 args = parse_argstring(self.R, line)
561
561
562 # arguments 'code' in line are prepended to
562 # arguments 'code' in line are prepended to
563 # the cell lines
563 # the cell lines
564
564
565 if cell is None:
565 if cell is None:
566 code = ''
566 code = ''
567 return_output = True
567 return_output = True
568 line_mode = True
568 line_mode = True
569 else:
569 else:
570 code = cell
570 code = cell
571 return_output = False
571 return_output = False
572 line_mode = False
572 line_mode = False
573
573
574 code = ' '.join(args.code) + code
574 code = ' '.join(args.code) + code
575
575
576 # if there is no local namespace then default to an empty dict
576 # if there is no local namespace then default to an empty dict
577 if local_ns is None:
577 if local_ns is None:
578 local_ns = {}
578 local_ns = {}
579
579
580 if args.input:
580 if args.input:
581 for input in ','.join(args.input).split(','):
581 for input in ','.join(args.input).split(','):
582 try:
582 try:
583 val = local_ns[input]
583 val = local_ns[input]
584 except KeyError:
584 except KeyError:
585 try:
585 try:
586 val = self.shell.user_ns[input]
586 val = self.shell.user_ns[input]
587 except KeyError:
587 except KeyError:
588 raise NameError("name '%s' is not defined" % input)
588 raise NameError("name '%s' is not defined" % input)
589 self.r.assign(input, self.pyconverter(val))
589 self.r.assign(input, self.pyconverter(val))
590
590
591 if getattr(args, 'units') is not None:
591 if getattr(args, 'units') is not None:
592 if args.units != "px" and getattr(args, 'res') is None:
592 if args.units != "px" and getattr(args, 'res') is None:
593 args.res = 72
593 args.res = 72
594 args.units = '"%s"' % args.units
594 args.units = '"%s"' % args.units
595
595
596 png_argdict = dict([(n, getattr(args, n)) for n in ['units', 'res', 'height', 'width', 'bg', 'pointsize']])
596 png_argdict = dict([(n, getattr(args, n)) for n in ['units', 'res', 'height', 'width', 'bg', 'pointsize']])
597 png_args = ','.join(['%s=%s' % (o,v) for o, v in png_argdict.items() if v is not None])
597 png_args = ','.join(['%s=%s' % (o,v) for o, v in png_argdict.items() if v is not None])
598 # execute the R code in a temporary directory
598 # execute the R code in a temporary directory
599
599
600 tmpd = tempfile.mkdtemp()
600 tmpd = tempfile.mkdtemp()
601 self.r('png("%s/Rplots%%03d.png",%s)' % (tmpd.replace('\\', '/'), png_args))
601 self.r('png("%s/Rplots%%03d.png",%s)' % (tmpd.replace('\\', '/'), png_args))
602
602
603 text_output = ''
603 text_output = ''
604 try:
604 try:
605 if line_mode:
605 if line_mode:
606 for line in code.split(';'):
606 for line in code.split(';'):
607 text_result, result, visible = self.eval(line)
607 text_result, result, visible = self.eval(line)
608 text_output += text_result
608 text_output += text_result
609 if text_result:
609 if text_result:
610 # the last line printed something to the console so we won't return it
610 # the last line printed something to the console so we won't return it
611 return_output = False
611 return_output = False
612 else:
612 else:
613 text_result, result, visible = self.eval(code)
613 text_result, result, visible = self.eval(code)
614 text_output += text_result
614 text_output += text_result
615 if visible:
615 if visible:
616 old_writeconsole = ri.get_writeconsole()
616 old_writeconsole = ri.get_writeconsole()
617 ri.set_writeconsole(self.write_console)
617 ri.set_writeconsole(self.write_console)
618 ro.r.show(result)
618 ro.r.show(result)
619 text_output += self.flush()
619 text_output += self.flush()
620 ri.set_writeconsole(old_writeconsole)
620 ri.set_writeconsole(old_writeconsole)
621
621
622 except RInterpreterError as e:
622 except RInterpreterError as e:
623 print(e.stdout)
623 print(e.stdout)
624 if not e.stdout.endswith(e.err):
624 if not e.stdout.endswith(e.err):
625 print(e.err)
625 print(e.err)
626 rmtree(tmpd)
626 rmtree(tmpd)
627 return
627 return
628 finally:
628 finally:
629 self.r('dev.off()')
629 self.r('dev.off()')
630
630
631 # read out all the saved .png files
631 # read out all the saved .png files
632
632
633 images = [open(imgfile, 'rb').read() for imgfile in glob("%s/Rplots*png" % tmpd)]
633 images = [open(imgfile, 'rb').read() for imgfile in glob("%s/Rplots*png" % tmpd)]
634
634
635 # now publish the images
635 # now publish the images
636 # mimicking IPython/zmq/pylab/backend_inline.py
636 # mimicking IPython/zmq/pylab/backend_inline.py
637 fmt = 'png'
637 fmt = 'png'
638 mimetypes = { 'png' : 'image/png', 'svg' : 'image/svg+xml' }
638 mimetypes = { 'png' : 'image/png', 'svg' : 'image/svg+xml' }
639 mime = mimetypes[fmt]
639 mime = mimetypes[fmt]
640
640
641 # publish the printed R objects, if any
641 # publish the printed R objects, if any
642
642
643 display_data = []
643 display_data = []
644 if text_output:
644 if text_output:
645 display_data.append(('RMagic.R', {'text/plain':text_output}))
645 display_data.append(('RMagic.R', {'text/plain':text_output}))
646
646
647 # flush text streams before sending figures, helps a little with output
647 # flush text streams before sending figures, helps a little with output
648 for image in images:
648 for image in images:
649 # synchronization in the console (though it's a bandaid, not a real sln)
649 # synchronization in the console (though it's a bandaid, not a real sln)
650 sys.stdout.flush(); sys.stderr.flush()
650 sys.stdout.flush(); sys.stderr.flush()
651 display_data.append(('RMagic.R', {mime: image}))
651 display_data.append(('RMagic.R', {mime: image}))
652
652
653 # kill the temporary directory
653 # kill the temporary directory
654 rmtree(tmpd)
654 rmtree(tmpd)
655
655
656 # try to turn every output into a numpy array
656 # try to turn every output into a numpy array
657 # this means that output are assumed to be castable
657 # this means that output are assumed to be castable
658 # as numpy arrays
658 # as numpy arrays
659
659
660 if args.output:
660 if args.output:
661 for output in ','.join(args.output).split(','):
661 for output in ','.join(args.output).split(','):
662 self.shell.push({output:self.Rconverter(self.r(output), dataframe=False)})
662 self.shell.push({output:self.Rconverter(self.r(output), dataframe=False)})
663
663
664 if args.dataframe:
664 if args.dataframe:
665 for output in ','.join(args.dataframe).split(','):
665 for output in ','.join(args.dataframe).split(','):
666 self.shell.push({output:self.Rconverter(self.r(output), dataframe=True)})
666 self.shell.push({output:self.Rconverter(self.r(output), dataframe=True)})
667
667
668 for tag, disp_d in display_data:
668 for tag, disp_d in display_data:
669 publish_display_data(data=disp_d, source=tag)
669 publish_display_data(data=disp_d, source=tag)
670
670
671 # this will keep a reference to the display_data
671 # this will keep a reference to the display_data
672 # which might be useful to other objects who happen to use
672 # which might be useful to other objects who happen to use
673 # this method
673 # this method
674
674
675 if self.cache_display_data:
675 if self.cache_display_data:
676 self.display_cache = display_data
676 self.display_cache = display_data
677
677
678 # if in line mode and return_output, return the result as an ndarray
678 # if in line mode and return_output, return the result as an ndarray
679 if return_output and not args.noreturn:
679 if return_output and not args.noreturn:
680 if result != ri.NULL:
680 if result != ri.NULL:
681 return self.Rconverter(result, dataframe=False)
681 return self.Rconverter(result, dataframe=False)
682
682
683 __doc__ = __doc__.format(
683 __doc__ = __doc__.format(
684 R_DOC = dedent(RMagics.R.__doc__),
684 R_DOC = dedent(RMagics.R.__doc__),
685 RPUSH_DOC = dedent(RMagics.Rpush.__doc__),
685 RPUSH_DOC = dedent(RMagics.Rpush.__doc__),
686 RPULL_DOC = dedent(RMagics.Rpull.__doc__),
686 RPULL_DOC = dedent(RMagics.Rpull.__doc__),
687 RGET_DOC = dedent(RMagics.Rget.__doc__)
687 RGET_DOC = dedent(RMagics.Rget.__doc__)
688 )
688 )
689
689
690
690
691 def load_ipython_extension(ip):
691 def load_ipython_extension(ip):
692 """Load the extension in IPython."""
692 """Load the extension in IPython."""
693 warnings.warn("The rmagic extension in IPython is deprecated in favour of "
693 warnings.warn("The rmagic extension in IPython is deprecated in favour of "
694 "rpy2.ipython. If available, that will be loaded instead.\n"
694 "rpy2.ipython. If available, that will be loaded instead.\n"
695 "http://rpy.sourceforge.net/")
695 "http://rpy.sourceforge.net/")
696 try:
696 try:
697 import rpy2.ipython
697 import rpy2.ipython
698 except ImportError:
698 except ImportError:
699 pass # Fall back to our own implementation for now
699 pass # Fall back to our own implementation for now
700 else:
700 else:
701 return rpy2.ipython.load_ipython_extension(ip)
701 return rpy2.ipython.load_ipython_extension(ip)
702
702
703 ip.register_magics(RMagics)
703 ip.register_magics(RMagics)
704 # Initialising rpy2 interferes with readline. Since, at this point, we've
704 # Initialising rpy2 interferes with readline. Since, at this point, we've
705 # probably just loaded rpy2, we reset the delimiters. See issue gh-2759.
705 # probably just loaded rpy2, we reset the delimiters. See issue gh-2759.
706 if ip.has_readline:
706 if ip.has_readline:
707 ip.readline.set_completer_delims(ip.readline_delims)
707 ip.readline.set_completer_delims(ip.readline_delims)
@@ -1,278 +1,273 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """Event loop integration for the ZeroMQ-based kernels."""
2 """Event loop integration for the ZeroMQ-based kernels."""
3
3
4 # Copyright (c) IPython Development Team.
4 # Copyright (c) IPython Development Team.
5 # Distributed under the terms of the Modified BSD License.
5 # Distributed under the terms of the Modified BSD License.
6
6
7 import os
7 import os
8 import sys
8 import sys
9
9
10 import zmq
10 import zmq
11
11
12 from IPython.config.application import Application
12 from IPython.config.application import Application
13 from IPython.utils import io
13 from IPython.utils import io
14
14 from IPython.lib.inputhook import _use_appnope
15
16 def _on_os_x_10_9():
17 import platform
18 from distutils.version import LooseVersion as V
19 return sys.platform == 'darwin' and V(platform.mac_ver()[0]) >= V('10.9')
20
15
21 def _notify_stream_qt(kernel, stream):
16 def _notify_stream_qt(kernel, stream):
22
17
23 from IPython.external.qt_for_kernel import QtCore
18 from IPython.external.qt_for_kernel import QtCore
24
19
25 if _on_os_x_10_9() and kernel._darwin_app_nap:
20 if _use_appnope() and kernel._darwin_app_nap:
26 from IPython.external.appnope import nope_scope as context
21 from appnope import nope_scope as context
27 else:
22 else:
28 from IPython.core.interactiveshell import NoOpContext as context
23 from IPython.core.interactiveshell import NoOpContext as context
29
24
30 def process_stream_events():
25 def process_stream_events():
31 while stream.getsockopt(zmq.EVENTS) & zmq.POLLIN:
26 while stream.getsockopt(zmq.EVENTS) & zmq.POLLIN:
32 with context():
27 with context():
33 kernel.do_one_iteration()
28 kernel.do_one_iteration()
34
29
35 fd = stream.getsockopt(zmq.FD)
30 fd = stream.getsockopt(zmq.FD)
36 notifier = QtCore.QSocketNotifier(fd, QtCore.QSocketNotifier.Read, kernel.app)
31 notifier = QtCore.QSocketNotifier(fd, QtCore.QSocketNotifier.Read, kernel.app)
37 notifier.activated.connect(process_stream_events)
32 notifier.activated.connect(process_stream_events)
38
33
39 # mapping of keys to loop functions
34 # mapping of keys to loop functions
40 loop_map = {
35 loop_map = {
41 'inline': None,
36 'inline': None,
42 'nbagg': None,
37 'nbagg': None,
43 'notebook': None,
38 'notebook': None,
44 None : None,
39 None : None,
45 }
40 }
46
41
47 def register_integration(*toolkitnames):
42 def register_integration(*toolkitnames):
48 """Decorator to register an event loop to integrate with the IPython kernel
43 """Decorator to register an event loop to integrate with the IPython kernel
49
44
50 The decorator takes names to register the event loop as for the %gui magic.
45 The decorator takes names to register the event loop as for the %gui magic.
51 You can provide alternative names for the same toolkit.
46 You can provide alternative names for the same toolkit.
52
47
53 The decorated function should take a single argument, the IPython kernel
48 The decorated function should take a single argument, the IPython kernel
54 instance, arrange for the event loop to call ``kernel.do_one_iteration()``
49 instance, arrange for the event loop to call ``kernel.do_one_iteration()``
55 at least every ``kernel._poll_interval`` seconds, and start the event loop.
50 at least every ``kernel._poll_interval`` seconds, and start the event loop.
56
51
57 :mod:`IPython.kernel.zmq.eventloops` provides and registers such functions
52 :mod:`IPython.kernel.zmq.eventloops` provides and registers such functions
58 for a few common event loops.
53 for a few common event loops.
59 """
54 """
60 def decorator(func):
55 def decorator(func):
61 for name in toolkitnames:
56 for name in toolkitnames:
62 loop_map[name] = func
57 loop_map[name] = func
63 return func
58 return func
64
59
65 return decorator
60 return decorator
66
61
67
62
68 @register_integration('qt', 'qt4')
63 @register_integration('qt', 'qt4')
69 def loop_qt4(kernel):
64 def loop_qt4(kernel):
70 """Start a kernel with PyQt4 event loop integration."""
65 """Start a kernel with PyQt4 event loop integration."""
71
66
72 from IPython.lib.guisupport import get_app_qt4, start_event_loop_qt4
67 from IPython.lib.guisupport import get_app_qt4, start_event_loop_qt4
73
68
74 kernel.app = get_app_qt4([" "])
69 kernel.app = get_app_qt4([" "])
75 kernel.app.setQuitOnLastWindowClosed(False)
70 kernel.app.setQuitOnLastWindowClosed(False)
76
71
77 for s in kernel.shell_streams:
72 for s in kernel.shell_streams:
78 _notify_stream_qt(kernel, s)
73 _notify_stream_qt(kernel, s)
79
74
80 start_event_loop_qt4(kernel.app)
75 start_event_loop_qt4(kernel.app)
81
76
82 @register_integration('qt5')
77 @register_integration('qt5')
83 def loop_qt5(kernel):
78 def loop_qt5(kernel):
84 """Start a kernel with PyQt5 event loop integration."""
79 """Start a kernel with PyQt5 event loop integration."""
85 os.environ['QT_API'] = 'pyqt5'
80 os.environ['QT_API'] = 'pyqt5'
86 return loop_qt4(kernel)
81 return loop_qt4(kernel)
87
82
88
83
89 @register_integration('wx')
84 @register_integration('wx')
90 def loop_wx(kernel):
85 def loop_wx(kernel):
91 """Start a kernel with wx event loop support."""
86 """Start a kernel with wx event loop support."""
92
87
93 import wx
88 import wx
94 from IPython.lib.guisupport import start_event_loop_wx
89 from IPython.lib.guisupport import start_event_loop_wx
95
90
96 if _on_os_x_10_9() and kernel._darwin_app_nap:
91 if _use_appnope() and kernel._darwin_app_nap:
97 # we don't hook up App Nap contexts for Wx,
92 # we don't hook up App Nap contexts for Wx,
98 # just disable it outright.
93 # just disable it outright.
99 from IPython.external.appnope import nope
94 from appnope import nope
100 nope()
95 nope()
101
96
102 doi = kernel.do_one_iteration
97 doi = kernel.do_one_iteration
103 # Wx uses milliseconds
98 # Wx uses milliseconds
104 poll_interval = int(1000*kernel._poll_interval)
99 poll_interval = int(1000*kernel._poll_interval)
105
100
106 # We have to put the wx.Timer in a wx.Frame for it to fire properly.
101 # We have to put the wx.Timer in a wx.Frame for it to fire properly.
107 # We make the Frame hidden when we create it in the main app below.
102 # We make the Frame hidden when we create it in the main app below.
108 class TimerFrame(wx.Frame):
103 class TimerFrame(wx.Frame):
109 def __init__(self, func):
104 def __init__(self, func):
110 wx.Frame.__init__(self, None, -1)
105 wx.Frame.__init__(self, None, -1)
111 self.timer = wx.Timer(self)
106 self.timer = wx.Timer(self)
112 # Units for the timer are in milliseconds
107 # Units for the timer are in milliseconds
113 self.timer.Start(poll_interval)
108 self.timer.Start(poll_interval)
114 self.Bind(wx.EVT_TIMER, self.on_timer)
109 self.Bind(wx.EVT_TIMER, self.on_timer)
115 self.func = func
110 self.func = func
116
111
117 def on_timer(self, event):
112 def on_timer(self, event):
118 self.func()
113 self.func()
119
114
120 # We need a custom wx.App to create our Frame subclass that has the
115 # We need a custom wx.App to create our Frame subclass that has the
121 # wx.Timer to drive the ZMQ event loop.
116 # wx.Timer to drive the ZMQ event loop.
122 class IPWxApp(wx.App):
117 class IPWxApp(wx.App):
123 def OnInit(self):
118 def OnInit(self):
124 self.frame = TimerFrame(doi)
119 self.frame = TimerFrame(doi)
125 self.frame.Show(False)
120 self.frame.Show(False)
126 return True
121 return True
127
122
128 # The redirect=False here makes sure that wx doesn't replace
123 # The redirect=False here makes sure that wx doesn't replace
129 # sys.stdout/stderr with its own classes.
124 # sys.stdout/stderr with its own classes.
130 kernel.app = IPWxApp(redirect=False)
125 kernel.app = IPWxApp(redirect=False)
131
126
132 # The import of wx on Linux sets the handler for signal.SIGINT
127 # The import of wx on Linux sets the handler for signal.SIGINT
133 # to 0. This is a bug in wx or gtk. We fix by just setting it
128 # to 0. This is a bug in wx or gtk. We fix by just setting it
134 # back to the Python default.
129 # back to the Python default.
135 import signal
130 import signal
136 if not callable(signal.getsignal(signal.SIGINT)):
131 if not callable(signal.getsignal(signal.SIGINT)):
137 signal.signal(signal.SIGINT, signal.default_int_handler)
132 signal.signal(signal.SIGINT, signal.default_int_handler)
138
133
139 start_event_loop_wx(kernel.app)
134 start_event_loop_wx(kernel.app)
140
135
141
136
142 @register_integration('tk')
137 @register_integration('tk')
143 def loop_tk(kernel):
138 def loop_tk(kernel):
144 """Start a kernel with the Tk event loop."""
139 """Start a kernel with the Tk event loop."""
145
140
146 try:
141 try:
147 from tkinter import Tk # Py 3
142 from tkinter import Tk # Py 3
148 except ImportError:
143 except ImportError:
149 from Tkinter import Tk # Py 2
144 from Tkinter import Tk # Py 2
150 doi = kernel.do_one_iteration
145 doi = kernel.do_one_iteration
151 # Tk uses milliseconds
146 # Tk uses milliseconds
152 poll_interval = int(1000*kernel._poll_interval)
147 poll_interval = int(1000*kernel._poll_interval)
153 # For Tkinter, we create a Tk object and call its withdraw method.
148 # For Tkinter, we create a Tk object and call its withdraw method.
154 class Timer(object):
149 class Timer(object):
155 def __init__(self, func):
150 def __init__(self, func):
156 self.app = Tk()
151 self.app = Tk()
157 self.app.withdraw()
152 self.app.withdraw()
158 self.func = func
153 self.func = func
159
154
160 def on_timer(self):
155 def on_timer(self):
161 self.func()
156 self.func()
162 self.app.after(poll_interval, self.on_timer)
157 self.app.after(poll_interval, self.on_timer)
163
158
164 def start(self):
159 def start(self):
165 self.on_timer() # Call it once to get things going.
160 self.on_timer() # Call it once to get things going.
166 self.app.mainloop()
161 self.app.mainloop()
167
162
168 kernel.timer = Timer(doi)
163 kernel.timer = Timer(doi)
169 kernel.timer.start()
164 kernel.timer.start()
170
165
171
166
172 @register_integration('gtk')
167 @register_integration('gtk')
173 def loop_gtk(kernel):
168 def loop_gtk(kernel):
174 """Start the kernel, coordinating with the GTK event loop"""
169 """Start the kernel, coordinating with the GTK event loop"""
175 from .gui.gtkembed import GTKEmbed
170 from .gui.gtkembed import GTKEmbed
176
171
177 gtk_kernel = GTKEmbed(kernel)
172 gtk_kernel = GTKEmbed(kernel)
178 gtk_kernel.start()
173 gtk_kernel.start()
179
174
180
175
181 @register_integration('gtk3')
176 @register_integration('gtk3')
182 def loop_gtk3(kernel):
177 def loop_gtk3(kernel):
183 """Start the kernel, coordinating with the GTK event loop"""
178 """Start the kernel, coordinating with the GTK event loop"""
184 from .gui.gtk3embed import GTKEmbed
179 from .gui.gtk3embed import GTKEmbed
185
180
186 gtk_kernel = GTKEmbed(kernel)
181 gtk_kernel = GTKEmbed(kernel)
187 gtk_kernel.start()
182 gtk_kernel.start()
188
183
189
184
190 @register_integration('osx')
185 @register_integration('osx')
191 def loop_cocoa(kernel):
186 def loop_cocoa(kernel):
192 """Start the kernel, coordinating with the Cocoa CFRunLoop event loop
187 """Start the kernel, coordinating with the Cocoa CFRunLoop event loop
193 via the matplotlib MacOSX backend.
188 via the matplotlib MacOSX backend.
194 """
189 """
195 import matplotlib
190 import matplotlib
196 if matplotlib.__version__ < '1.1.0':
191 if matplotlib.__version__ < '1.1.0':
197 kernel.log.warn(
192 kernel.log.warn(
198 "MacOSX backend in matplotlib %s doesn't have a Timer, "
193 "MacOSX backend in matplotlib %s doesn't have a Timer, "
199 "falling back on Tk for CFRunLoop integration. Note that "
194 "falling back on Tk for CFRunLoop integration. Note that "
200 "even this won't work if Tk is linked against X11 instead of "
195 "even this won't work if Tk is linked against X11 instead of "
201 "Cocoa (e.g. EPD). To use the MacOSX backend in the kernel, "
196 "Cocoa (e.g. EPD). To use the MacOSX backend in the kernel, "
202 "you must use matplotlib >= 1.1.0, or a native libtk."
197 "you must use matplotlib >= 1.1.0, or a native libtk."
203 )
198 )
204 return loop_tk(kernel)
199 return loop_tk(kernel)
205
200
206 from matplotlib.backends.backend_macosx import TimerMac, show
201 from matplotlib.backends.backend_macosx import TimerMac, show
207
202
208 # scale interval for sec->ms
203 # scale interval for sec->ms
209 poll_interval = int(1000*kernel._poll_interval)
204 poll_interval = int(1000*kernel._poll_interval)
210
205
211 real_excepthook = sys.excepthook
206 real_excepthook = sys.excepthook
212 def handle_int(etype, value, tb):
207 def handle_int(etype, value, tb):
213 """don't let KeyboardInterrupts look like crashes"""
208 """don't let KeyboardInterrupts look like crashes"""
214 if etype is KeyboardInterrupt:
209 if etype is KeyboardInterrupt:
215 io.raw_print("KeyboardInterrupt caught in CFRunLoop")
210 io.raw_print("KeyboardInterrupt caught in CFRunLoop")
216 else:
211 else:
217 real_excepthook(etype, value, tb)
212 real_excepthook(etype, value, tb)
218
213
219 # add doi() as a Timer to the CFRunLoop
214 # add doi() as a Timer to the CFRunLoop
220 def doi():
215 def doi():
221 # restore excepthook during IPython code
216 # restore excepthook during IPython code
222 sys.excepthook = real_excepthook
217 sys.excepthook = real_excepthook
223 kernel.do_one_iteration()
218 kernel.do_one_iteration()
224 # and back:
219 # and back:
225 sys.excepthook = handle_int
220 sys.excepthook = handle_int
226
221
227 t = TimerMac(poll_interval)
222 t = TimerMac(poll_interval)
228 t.add_callback(doi)
223 t.add_callback(doi)
229 t.start()
224 t.start()
230
225
231 # but still need a Poller for when there are no active windows,
226 # but still need a Poller for when there are no active windows,
232 # during which time mainloop() returns immediately
227 # during which time mainloop() returns immediately
233 poller = zmq.Poller()
228 poller = zmq.Poller()
234 if kernel.control_stream:
229 if kernel.control_stream:
235 poller.register(kernel.control_stream.socket, zmq.POLLIN)
230 poller.register(kernel.control_stream.socket, zmq.POLLIN)
236 for stream in kernel.shell_streams:
231 for stream in kernel.shell_streams:
237 poller.register(stream.socket, zmq.POLLIN)
232 poller.register(stream.socket, zmq.POLLIN)
238
233
239 while True:
234 while True:
240 try:
235 try:
241 # double nested try/except, to properly catch KeyboardInterrupt
236 # double nested try/except, to properly catch KeyboardInterrupt
242 # due to pyzmq Issue #130
237 # due to pyzmq Issue #130
243 try:
238 try:
244 # don't let interrupts during mainloop invoke crash_handler:
239 # don't let interrupts during mainloop invoke crash_handler:
245 sys.excepthook = handle_int
240 sys.excepthook = handle_int
246 show.mainloop()
241 show.mainloop()
247 sys.excepthook = real_excepthook
242 sys.excepthook = real_excepthook
248 # use poller if mainloop returned (no windows)
243 # use poller if mainloop returned (no windows)
249 # scale by extra factor of 10, since it's a real poll
244 # scale by extra factor of 10, since it's a real poll
250 poller.poll(10*poll_interval)
245 poller.poll(10*poll_interval)
251 kernel.do_one_iteration()
246 kernel.do_one_iteration()
252 except:
247 except:
253 raise
248 raise
254 except KeyboardInterrupt:
249 except KeyboardInterrupt:
255 # Ctrl-C shouldn't crash the kernel
250 # Ctrl-C shouldn't crash the kernel
256 io.raw_print("KeyboardInterrupt caught in kernel")
251 io.raw_print("KeyboardInterrupt caught in kernel")
257 finally:
252 finally:
258 # ensure excepthook is restored
253 # ensure excepthook is restored
259 sys.excepthook = real_excepthook
254 sys.excepthook = real_excepthook
260
255
261
256
262
257
263 def enable_gui(gui, kernel=None):
258 def enable_gui(gui, kernel=None):
264 """Enable integration with a given GUI"""
259 """Enable integration with a given GUI"""
265 if gui not in loop_map:
260 if gui not in loop_map:
266 e = "Invalid GUI request %r, valid ones are:%s" % (gui, loop_map.keys())
261 e = "Invalid GUI request %r, valid ones are:%s" % (gui, loop_map.keys())
267 raise ValueError(e)
262 raise ValueError(e)
268 if kernel is None:
263 if kernel is None:
269 if Application.initialized():
264 if Application.initialized():
270 kernel = getattr(Application.instance(), 'kernel', None)
265 kernel = getattr(Application.instance(), 'kernel', None)
271 if kernel is None:
266 if kernel is None:
272 raise RuntimeError("You didn't specify a kernel,"
267 raise RuntimeError("You didn't specify a kernel,"
273 " and no IPython Application with a kernel appears to be running."
268 " and no IPython Application with a kernel appears to be running."
274 )
269 )
275 loop = loop_map[gui]
270 loop = loop_map[gui]
276 if loop and kernel.eventloop is not None and kernel.eventloop is not loop:
271 if loop and kernel.eventloop is not None and kernel.eventloop is not loop:
277 raise RuntimeError("Cannot activate multiple GUI eventloops")
272 raise RuntimeError("Cannot activate multiple GUI eventloops")
278 kernel.eventloop = loop
273 kernel.eventloop = loop
@@ -1,584 +1,587 b''
1 # coding: utf-8
1 # coding: utf-8
2 """
2 """
3 Inputhook management for GUI event loop integration.
3 Inputhook management for GUI event loop integration.
4 """
4 """
5
5
6 #-----------------------------------------------------------------------------
6 # Copyright (c) IPython Development Team.
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Distributed under the terms of the Modified BSD License.
8 #
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
12
13 #-----------------------------------------------------------------------------
14 # Imports
15 #-----------------------------------------------------------------------------
16
8
17 try:
9 try:
18 import ctypes
10 import ctypes
19 except ImportError:
11 except ImportError:
20 ctypes = None
12 ctypes = None
21 except SystemError: # IronPython issue, 2/8/2014
13 except SystemError: # IronPython issue, 2/8/2014
22 ctypes = None
14 ctypes = None
23 import os
15 import os
16 import platform
24 import sys
17 import sys
25 from distutils.version import LooseVersion as V
18 from distutils.version import LooseVersion as V
26
19
27 from IPython.utils.warn import warn
20 from IPython.utils.warn import warn
28
21
29 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
30 # Constants
23 # Constants
31 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
32
25
33 # Constants for identifying the GUI toolkits.
26 # Constants for identifying the GUI toolkits.
34 GUI_WX = 'wx'
27 GUI_WX = 'wx'
35 GUI_QT = 'qt'
28 GUI_QT = 'qt'
36 GUI_QT4 = 'qt4'
29 GUI_QT4 = 'qt4'
37 GUI_GTK = 'gtk'
30 GUI_GTK = 'gtk'
38 GUI_TK = 'tk'
31 GUI_TK = 'tk'
39 GUI_OSX = 'osx'
32 GUI_OSX = 'osx'
40 GUI_GLUT = 'glut'
33 GUI_GLUT = 'glut'
41 GUI_PYGLET = 'pyglet'
34 GUI_PYGLET = 'pyglet'
42 GUI_GTK3 = 'gtk3'
35 GUI_GTK3 = 'gtk3'
43 GUI_NONE = 'none' # i.e. disable
36 GUI_NONE = 'none' # i.e. disable
44
37
45 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
46 # Utilities
39 # Utilities
47 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
48
41
49 def _stdin_ready_posix():
42 def _stdin_ready_posix():
50 """Return True if there's something to read on stdin (posix version)."""
43 """Return True if there's something to read on stdin (posix version)."""
51 infds, outfds, erfds = select.select([sys.stdin],[],[],0)
44 infds, outfds, erfds = select.select([sys.stdin],[],[],0)
52 return bool(infds)
45 return bool(infds)
53
46
54 def _stdin_ready_nt():
47 def _stdin_ready_nt():
55 """Return True if there's something to read on stdin (nt version)."""
48 """Return True if there's something to read on stdin (nt version)."""
56 return msvcrt.kbhit()
49 return msvcrt.kbhit()
57
50
58 def _stdin_ready_other():
51 def _stdin_ready_other():
59 """Return True, assuming there's something to read on stdin."""
52 """Return True, assuming there's something to read on stdin."""
60 return True #
53 return True
54
55 def _use_appnope():
56 """Should we use appnope for dealing with OS X app nap?
61
57
58 Checks if we are on OS X 10.9 or greater.
59 """
60 return sys.platform == 'darwin' and V(platform.mac_ver()[0]) >= V('10.9')
62
61
63 def _ignore_CTRL_C_posix():
62 def _ignore_CTRL_C_posix():
64 """Ignore CTRL+C (SIGINT)."""
63 """Ignore CTRL+C (SIGINT)."""
65 signal.signal(signal.SIGINT, signal.SIG_IGN)
64 signal.signal(signal.SIGINT, signal.SIG_IGN)
66
65
67 def _allow_CTRL_C_posix():
66 def _allow_CTRL_C_posix():
68 """Take CTRL+C into account (SIGINT)."""
67 """Take CTRL+C into account (SIGINT)."""
69 signal.signal(signal.SIGINT, signal.default_int_handler)
68 signal.signal(signal.SIGINT, signal.default_int_handler)
70
69
71 def _ignore_CTRL_C_other():
70 def _ignore_CTRL_C_other():
72 """Ignore CTRL+C (not implemented)."""
71 """Ignore CTRL+C (not implemented)."""
73 pass
72 pass
74
73
75 def _allow_CTRL_C_other():
74 def _allow_CTRL_C_other():
76 """Take CTRL+C into account (not implemented)."""
75 """Take CTRL+C into account (not implemented)."""
77 pass
76 pass
78
77
79 if os.name == 'posix':
78 if os.name == 'posix':
80 import select
79 import select
81 import signal
80 import signal
82 stdin_ready = _stdin_ready_posix
81 stdin_ready = _stdin_ready_posix
83 ignore_CTRL_C = _ignore_CTRL_C_posix
82 ignore_CTRL_C = _ignore_CTRL_C_posix
84 allow_CTRL_C = _allow_CTRL_C_posix
83 allow_CTRL_C = _allow_CTRL_C_posix
85 elif os.name == 'nt':
84 elif os.name == 'nt':
86 import msvcrt
85 import msvcrt
87 stdin_ready = _stdin_ready_nt
86 stdin_ready = _stdin_ready_nt
88 ignore_CTRL_C = _ignore_CTRL_C_other
87 ignore_CTRL_C = _ignore_CTRL_C_other
89 allow_CTRL_C = _allow_CTRL_C_other
88 allow_CTRL_C = _allow_CTRL_C_other
90 else:
89 else:
91 stdin_ready = _stdin_ready_other
90 stdin_ready = _stdin_ready_other
92 ignore_CTRL_C = _ignore_CTRL_C_other
91 ignore_CTRL_C = _ignore_CTRL_C_other
93 allow_CTRL_C = _allow_CTRL_C_other
92 allow_CTRL_C = _allow_CTRL_C_other
94
93
95
94
96 #-----------------------------------------------------------------------------
95 #-----------------------------------------------------------------------------
97 # Main InputHookManager class
96 # Main InputHookManager class
98 #-----------------------------------------------------------------------------
97 #-----------------------------------------------------------------------------
99
98
100
99
101 class InputHookManager(object):
100 class InputHookManager(object):
102 """Manage PyOS_InputHook for different GUI toolkits.
101 """Manage PyOS_InputHook for different GUI toolkits.
103
102
104 This class installs various hooks under ``PyOSInputHook`` to handle
103 This class installs various hooks under ``PyOSInputHook`` to handle
105 GUI event loop integration.
104 GUI event loop integration.
106 """
105 """
107
106
108 def __init__(self):
107 def __init__(self):
109 if ctypes is None:
108 if ctypes is None:
110 warn("IPython GUI event loop requires ctypes, %gui will not be available")
109 warn("IPython GUI event loop requires ctypes, %gui will not be available")
111 return
110 return
112 self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int)
111 self.PYFUNC = ctypes.PYFUNCTYPE(ctypes.c_int)
113 self.guihooks = {}
112 self.guihooks = {}
114 self.aliases = {}
113 self.aliases = {}
115 self.apps = {}
114 self.apps = {}
116 self._reset()
115 self._reset()
117
116
118 def _reset(self):
117 def _reset(self):
119 self._callback_pyfunctype = None
118 self._callback_pyfunctype = None
120 self._callback = None
119 self._callback = None
121 self._installed = False
120 self._installed = False
122 self._current_gui = None
121 self._current_gui = None
123
122
124 def get_pyos_inputhook(self):
123 def get_pyos_inputhook(self):
125 """Return the current PyOS_InputHook as a ctypes.c_void_p."""
124 """Return the current PyOS_InputHook as a ctypes.c_void_p."""
126 return ctypes.c_void_p.in_dll(ctypes.pythonapi,"PyOS_InputHook")
125 return ctypes.c_void_p.in_dll(ctypes.pythonapi,"PyOS_InputHook")
127
126
128 def get_pyos_inputhook_as_func(self):
127 def get_pyos_inputhook_as_func(self):
129 """Return the current PyOS_InputHook as a ctypes.PYFUNCYPE."""
128 """Return the current PyOS_InputHook as a ctypes.PYFUNCYPE."""
130 return self.PYFUNC.in_dll(ctypes.pythonapi,"PyOS_InputHook")
129 return self.PYFUNC.in_dll(ctypes.pythonapi,"PyOS_InputHook")
131
130
132 def set_inputhook(self, callback):
131 def set_inputhook(self, callback):
133 """Set PyOS_InputHook to callback and return the previous one."""
132 """Set PyOS_InputHook to callback and return the previous one."""
134 # On platforms with 'readline' support, it's all too likely to
133 # On platforms with 'readline' support, it's all too likely to
135 # have a KeyboardInterrupt signal delivered *even before* an
134 # have a KeyboardInterrupt signal delivered *even before* an
136 # initial ``try:`` clause in the callback can be executed, so
135 # initial ``try:`` clause in the callback can be executed, so
137 # we need to disable CTRL+C in this situation.
136 # we need to disable CTRL+C in this situation.
138 ignore_CTRL_C()
137 ignore_CTRL_C()
139 self._callback = callback
138 self._callback = callback
140 self._callback_pyfunctype = self.PYFUNC(callback)
139 self._callback_pyfunctype = self.PYFUNC(callback)
141 pyos_inputhook_ptr = self.get_pyos_inputhook()
140 pyos_inputhook_ptr = self.get_pyos_inputhook()
142 original = self.get_pyos_inputhook_as_func()
141 original = self.get_pyos_inputhook_as_func()
143 pyos_inputhook_ptr.value = \
142 pyos_inputhook_ptr.value = \
144 ctypes.cast(self._callback_pyfunctype, ctypes.c_void_p).value
143 ctypes.cast(self._callback_pyfunctype, ctypes.c_void_p).value
145 self._installed = True
144 self._installed = True
146 return original
145 return original
147
146
148 def clear_inputhook(self, app=None):
147 def clear_inputhook(self, app=None):
149 """Set PyOS_InputHook to NULL and return the previous one.
148 """Set PyOS_InputHook to NULL and return the previous one.
150
149
151 Parameters
150 Parameters
152 ----------
151 ----------
153 app : optional, ignored
152 app : optional, ignored
154 This parameter is allowed only so that clear_inputhook() can be
153 This parameter is allowed only so that clear_inputhook() can be
155 called with a similar interface as all the ``enable_*`` methods. But
154 called with a similar interface as all the ``enable_*`` methods. But
156 the actual value of the parameter is ignored. This uniform interface
155 the actual value of the parameter is ignored. This uniform interface
157 makes it easier to have user-level entry points in the main IPython
156 makes it easier to have user-level entry points in the main IPython
158 app like :meth:`enable_gui`."""
157 app like :meth:`enable_gui`."""
159 pyos_inputhook_ptr = self.get_pyos_inputhook()
158 pyos_inputhook_ptr = self.get_pyos_inputhook()
160 original = self.get_pyos_inputhook_as_func()
159 original = self.get_pyos_inputhook_as_func()
161 pyos_inputhook_ptr.value = ctypes.c_void_p(None).value
160 pyos_inputhook_ptr.value = ctypes.c_void_p(None).value
162 allow_CTRL_C()
161 allow_CTRL_C()
163 self._reset()
162 self._reset()
164 return original
163 return original
165
164
166 def clear_app_refs(self, gui=None):
165 def clear_app_refs(self, gui=None):
167 """Clear IPython's internal reference to an application instance.
166 """Clear IPython's internal reference to an application instance.
168
167
169 Whenever we create an app for a user on qt4 or wx, we hold a
168 Whenever we create an app for a user on qt4 or wx, we hold a
170 reference to the app. This is needed because in some cases bad things
169 reference to the app. This is needed because in some cases bad things
171 can happen if a user doesn't hold a reference themselves. This
170 can happen if a user doesn't hold a reference themselves. This
172 method is provided to clear the references we are holding.
171 method is provided to clear the references we are holding.
173
172
174 Parameters
173 Parameters
175 ----------
174 ----------
176 gui : None or str
175 gui : None or str
177 If None, clear all app references. If ('wx', 'qt4') clear
176 If None, clear all app references. If ('wx', 'qt4') clear
178 the app for that toolkit. References are not held for gtk or tk
177 the app for that toolkit. References are not held for gtk or tk
179 as those toolkits don't have the notion of an app.
178 as those toolkits don't have the notion of an app.
180 """
179 """
181 if gui is None:
180 if gui is None:
182 self.apps = {}
181 self.apps = {}
183 elif gui in self.apps:
182 elif gui in self.apps:
184 del self.apps[gui]
183 del self.apps[gui]
185
184
186 def register(self, toolkitname, *aliases):
185 def register(self, toolkitname, *aliases):
187 """Register a class to provide the event loop for a given GUI.
186 """Register a class to provide the event loop for a given GUI.
188
187
189 This is intended to be used as a class decorator. It should be passed
188 This is intended to be used as a class decorator. It should be passed
190 the names with which to register this GUI integration. The classes
189 the names with which to register this GUI integration. The classes
191 themselves should subclass :class:`InputHookBase`.
190 themselves should subclass :class:`InputHookBase`.
192
191
193 ::
192 ::
194
193
195 @inputhook_manager.register('qt')
194 @inputhook_manager.register('qt')
196 class QtInputHook(InputHookBase):
195 class QtInputHook(InputHookBase):
197 def enable(self, app=None):
196 def enable(self, app=None):
198 ...
197 ...
199 """
198 """
200 def decorator(cls):
199 def decorator(cls):
201 inst = cls(self)
200 inst = cls(self)
202 self.guihooks[toolkitname] = inst
201 self.guihooks[toolkitname] = inst
203 for a in aliases:
202 for a in aliases:
204 self.aliases[a] = toolkitname
203 self.aliases[a] = toolkitname
205 return cls
204 return cls
206 return decorator
205 return decorator
207
206
208 def current_gui(self):
207 def current_gui(self):
209 """Return a string indicating the currently active GUI or None."""
208 """Return a string indicating the currently active GUI or None."""
210 return self._current_gui
209 return self._current_gui
211
210
212 def enable_gui(self, gui=None, app=None):
211 def enable_gui(self, gui=None, app=None):
213 """Switch amongst GUI input hooks by name.
212 """Switch amongst GUI input hooks by name.
214
213
215 This is a higher level method than :meth:`set_inputhook` - it uses the
214 This is a higher level method than :meth:`set_inputhook` - it uses the
216 GUI name to look up a registered object which enables the input hook
215 GUI name to look up a registered object which enables the input hook
217 for that GUI.
216 for that GUI.
218
217
219 Parameters
218 Parameters
220 ----------
219 ----------
221 gui : optional, string or None
220 gui : optional, string or None
222 If None (or 'none'), clears input hook, otherwise it must be one
221 If None (or 'none'), clears input hook, otherwise it must be one
223 of the recognized GUI names (see ``GUI_*`` constants in module).
222 of the recognized GUI names (see ``GUI_*`` constants in module).
224
223
225 app : optional, existing application object.
224 app : optional, existing application object.
226 For toolkits that have the concept of a global app, you can supply an
225 For toolkits that have the concept of a global app, you can supply an
227 existing one. If not given, the toolkit will be probed for one, and if
226 existing one. If not given, the toolkit will be probed for one, and if
228 none is found, a new one will be created. Note that GTK does not have
227 none is found, a new one will be created. Note that GTK does not have
229 this concept, and passing an app if ``gui=="GTK"`` will raise an error.
228 this concept, and passing an app if ``gui=="GTK"`` will raise an error.
230
229
231 Returns
230 Returns
232 -------
231 -------
233 The output of the underlying gui switch routine, typically the actual
232 The output of the underlying gui switch routine, typically the actual
234 PyOS_InputHook wrapper object or the GUI toolkit app created, if there was
233 PyOS_InputHook wrapper object or the GUI toolkit app created, if there was
235 one.
234 one.
236 """
235 """
237 if gui in (None, GUI_NONE):
236 if gui in (None, GUI_NONE):
238 return self.disable_gui()
237 return self.disable_gui()
239
238
240 if gui in self.aliases:
239 if gui in self.aliases:
241 return self.enable_gui(self.aliases[gui], app)
240 return self.enable_gui(self.aliases[gui], app)
242
241
243 try:
242 try:
244 gui_hook = self.guihooks[gui]
243 gui_hook = self.guihooks[gui]
245 except KeyError:
244 except KeyError:
246 e = "Invalid GUI request {!r}, valid ones are: {}"
245 e = "Invalid GUI request {!r}, valid ones are: {}"
247 raise ValueError(e.format(gui, ', '.join(self.guihooks)))
246 raise ValueError(e.format(gui, ', '.join(self.guihooks)))
248 self._current_gui = gui
247 self._current_gui = gui
249
248
250 app = gui_hook.enable(app)
249 app = gui_hook.enable(app)
251 if app is not None:
250 if app is not None:
252 app._in_event_loop = True
251 app._in_event_loop = True
253 self.apps[gui] = app
252 self.apps[gui] = app
254 return app
253 return app
255
254
256 def disable_gui(self):
255 def disable_gui(self):
257 """Disable GUI event loop integration.
256 """Disable GUI event loop integration.
258
257
259 If an application was registered, this sets its ``_in_event_loop``
258 If an application was registered, this sets its ``_in_event_loop``
260 attribute to False. It then calls :meth:`clear_inputhook`.
259 attribute to False. It then calls :meth:`clear_inputhook`.
261 """
260 """
262 gui = self._current_gui
261 gui = self._current_gui
263 if gui in self.apps:
262 if gui in self.apps:
264 self.apps[gui]._in_event_loop = False
263 self.apps[gui]._in_event_loop = False
265 return self.clear_inputhook()
264 return self.clear_inputhook()
266
265
267 class InputHookBase(object):
266 class InputHookBase(object):
268 """Base class for input hooks for specific toolkits.
267 """Base class for input hooks for specific toolkits.
269
268
270 Subclasses should define an :meth:`enable` method with one argument, ``app``,
269 Subclasses should define an :meth:`enable` method with one argument, ``app``,
271 which will either be an instance of the toolkit's application class, or None.
270 which will either be an instance of the toolkit's application class, or None.
272 They may also define a :meth:`disable` method with no arguments.
271 They may also define a :meth:`disable` method with no arguments.
273 """
272 """
274 def __init__(self, manager):
273 def __init__(self, manager):
275 self.manager = manager
274 self.manager = manager
276
275
277 def disable(self):
276 def disable(self):
278 pass
277 pass
279
278
280 inputhook_manager = InputHookManager()
279 inputhook_manager = InputHookManager()
281
280
282 @inputhook_manager.register('osx')
281 @inputhook_manager.register('osx')
283 class NullInputHook(InputHookBase):
282 class NullInputHook(InputHookBase):
284 """A null inputhook that doesn't need to do anything"""
283 """A null inputhook that doesn't need to do anything"""
285 def enable(self, app=None):
284 def enable(self, app=None):
286 pass
285 pass
287
286
288 @inputhook_manager.register('wx')
287 @inputhook_manager.register('wx')
289 class WxInputHook(InputHookBase):
288 class WxInputHook(InputHookBase):
290 def enable(self, app=None):
289 def enable(self, app=None):
291 """Enable event loop integration with wxPython.
290 """Enable event loop integration with wxPython.
292
291
293 Parameters
292 Parameters
294 ----------
293 ----------
295 app : WX Application, optional.
294 app : WX Application, optional.
296 Running application to use. If not given, we probe WX for an
295 Running application to use. If not given, we probe WX for an
297 existing application object, and create a new one if none is found.
296 existing application object, and create a new one if none is found.
298
297
299 Notes
298 Notes
300 -----
299 -----
301 This methods sets the ``PyOS_InputHook`` for wxPython, which allows
300 This methods sets the ``PyOS_InputHook`` for wxPython, which allows
302 the wxPython to integrate with terminal based applications like
301 the wxPython to integrate with terminal based applications like
303 IPython.
302 IPython.
304
303
305 If ``app`` is not given we probe for an existing one, and return it if
304 If ``app`` is not given we probe for an existing one, and return it if
306 found. If no existing app is found, we create an :class:`wx.App` as
305 found. If no existing app is found, we create an :class:`wx.App` as
307 follows::
306 follows::
308
307
309 import wx
308 import wx
310 app = wx.App(redirect=False, clearSigInt=False)
309 app = wx.App(redirect=False, clearSigInt=False)
311 """
310 """
312 import wx
311 import wx
313
312
314 wx_version = V(wx.__version__).version
313 wx_version = V(wx.__version__).version
315
314
316 if wx_version < [2, 8]:
315 if wx_version < [2, 8]:
317 raise ValueError("requires wxPython >= 2.8, but you have %s" % wx.__version__)
316 raise ValueError("requires wxPython >= 2.8, but you have %s" % wx.__version__)
318
317
319 from IPython.lib.inputhookwx import inputhook_wx
318 from IPython.lib.inputhookwx import inputhook_wx
320 from IPython.external.appnope import nope
321 self.manager.set_inputhook(inputhook_wx)
319 self.manager.set_inputhook(inputhook_wx)
322 nope()
320 if _use_appnope():
321 from appnope import nope
322 nope()
323
323
324 import wx
324 import wx
325 if app is None:
325 if app is None:
326 app = wx.GetApp()
326 app = wx.GetApp()
327 if app is None:
327 if app is None:
328 app = wx.App(redirect=False, clearSigInt=False)
328 app = wx.App(redirect=False, clearSigInt=False)
329
329
330 return app
330 return app
331
331
332 def disable(self):
332 def disable(self):
333 """Disable event loop integration with wxPython.
333 """Disable event loop integration with wxPython.
334
334
335 This restores appnapp on OS X
335 This restores appnapp on OS X
336 """
336 """
337 from IPython.external.appnope import nap
337 if _use_appnope():
338 nap()
338 from appnope import nap
339 nap()
339
340
340 @inputhook_manager.register('qt', 'qt4')
341 @inputhook_manager.register('qt', 'qt4')
341 class Qt4InputHook(InputHookBase):
342 class Qt4InputHook(InputHookBase):
342 def enable(self, app=None):
343 def enable(self, app=None):
343 """Enable event loop integration with PyQt4.
344 """Enable event loop integration with PyQt4.
344
345
345 Parameters
346 Parameters
346 ----------
347 ----------
347 app : Qt Application, optional.
348 app : Qt Application, optional.
348 Running application to use. If not given, we probe Qt for an
349 Running application to use. If not given, we probe Qt for an
349 existing application object, and create a new one if none is found.
350 existing application object, and create a new one if none is found.
350
351
351 Notes
352 Notes
352 -----
353 -----
353 This methods sets the PyOS_InputHook for PyQt4, which allows
354 This methods sets the PyOS_InputHook for PyQt4, which allows
354 the PyQt4 to integrate with terminal based applications like
355 the PyQt4 to integrate with terminal based applications like
355 IPython.
356 IPython.
356
357
357 If ``app`` is not given we probe for an existing one, and return it if
358 If ``app`` is not given we probe for an existing one, and return it if
358 found. If no existing app is found, we create an :class:`QApplication`
359 found. If no existing app is found, we create an :class:`QApplication`
359 as follows::
360 as follows::
360
361
361 from PyQt4 import QtCore
362 from PyQt4 import QtCore
362 app = QtGui.QApplication(sys.argv)
363 app = QtGui.QApplication(sys.argv)
363 """
364 """
364 from IPython.lib.inputhookqt4 import create_inputhook_qt4
365 from IPython.lib.inputhookqt4 import create_inputhook_qt4
365 from IPython.external.appnope import nope
366 app, inputhook_qt4 = create_inputhook_qt4(self, app)
366 app, inputhook_qt4 = create_inputhook_qt4(self.manager, app)
367 self.manager.set_inputhook(inputhook_qt4)
367 self.manager.set_inputhook(inputhook_qt4)
368 nope()
368 if _use_appnope():
369 from appnope import nope
370 nope()
369
371
370 return app
372 return app
371
373
372 def disable_qt4(self):
374 def disable_qt4(self):
373 """Disable event loop integration with PyQt4.
375 """Disable event loop integration with PyQt4.
374
376
375 This restores appnapp on OS X
377 This restores appnapp on OS X
376 """
378 """
377 from IPython.external.appnope import nap
379 if _use_appnope():
378 nap()
380 from appnope import nap
381 nap()
379
382
380
383
381 @inputhook_manager.register('qt5')
384 @inputhook_manager.register('qt5')
382 class Qt5InputHook(Qt4InputHook):
385 class Qt5InputHook(Qt4InputHook):
383 def enable(self, app=None):
386 def enable(self, app=None):
384 os.environ['QT_API'] = 'pyqt5'
387 os.environ['QT_API'] = 'pyqt5'
385 return Qt4InputHook.enable(self, app)
388 return Qt4InputHook.enable(self, app)
386
389
387
390
388 @inputhook_manager.register('gtk')
391 @inputhook_manager.register('gtk')
389 class GtkInputHook(InputHookBase):
392 class GtkInputHook(InputHookBase):
390 def enable(self, app=None):
393 def enable(self, app=None):
391 """Enable event loop integration with PyGTK.
394 """Enable event loop integration with PyGTK.
392
395
393 Parameters
396 Parameters
394 ----------
397 ----------
395 app : ignored
398 app : ignored
396 Ignored, it's only a placeholder to keep the call signature of all
399 Ignored, it's only a placeholder to keep the call signature of all
397 gui activation methods consistent, which simplifies the logic of
400 gui activation methods consistent, which simplifies the logic of
398 supporting magics.
401 supporting magics.
399
402
400 Notes
403 Notes
401 -----
404 -----
402 This methods sets the PyOS_InputHook for PyGTK, which allows
405 This methods sets the PyOS_InputHook for PyGTK, which allows
403 the PyGTK to integrate with terminal based applications like
406 the PyGTK to integrate with terminal based applications like
404 IPython.
407 IPython.
405 """
408 """
406 import gtk
409 import gtk
407 try:
410 try:
408 gtk.set_interactive(True)
411 gtk.set_interactive(True)
409 except AttributeError:
412 except AttributeError:
410 # For older versions of gtk, use our own ctypes version
413 # For older versions of gtk, use our own ctypes version
411 from IPython.lib.inputhookgtk import inputhook_gtk
414 from IPython.lib.inputhookgtk import inputhook_gtk
412 self.manager.set_inputhook(inputhook_gtk)
415 self.manager.set_inputhook(inputhook_gtk)
413
416
414
417
415 @inputhook_manager.register('tk')
418 @inputhook_manager.register('tk')
416 class TkInputHook(InputHookBase):
419 class TkInputHook(InputHookBase):
417 def enable(self, app=None):
420 def enable(self, app=None):
418 """Enable event loop integration with Tk.
421 """Enable event loop integration with Tk.
419
422
420 Parameters
423 Parameters
421 ----------
424 ----------
422 app : toplevel :class:`Tkinter.Tk` widget, optional.
425 app : toplevel :class:`Tkinter.Tk` widget, optional.
423 Running toplevel widget to use. If not given, we probe Tk for an
426 Running toplevel widget to use. If not given, we probe Tk for an
424 existing one, and create a new one if none is found.
427 existing one, and create a new one if none is found.
425
428
426 Notes
429 Notes
427 -----
430 -----
428 If you have already created a :class:`Tkinter.Tk` object, the only
431 If you have already created a :class:`Tkinter.Tk` object, the only
429 thing done by this method is to register with the
432 thing done by this method is to register with the
430 :class:`InputHookManager`, since creating that object automatically
433 :class:`InputHookManager`, since creating that object automatically
431 sets ``PyOS_InputHook``.
434 sets ``PyOS_InputHook``.
432 """
435 """
433 if app is None:
436 if app is None:
434 try:
437 try:
435 from tkinter import Tk # Py 3
438 from tkinter import Tk # Py 3
436 except ImportError:
439 except ImportError:
437 from Tkinter import Tk # Py 2
440 from Tkinter import Tk # Py 2
438 app = Tk()
441 app = Tk()
439 app.withdraw()
442 app.withdraw()
440 self.manager.apps[GUI_TK] = app
443 self.manager.apps[GUI_TK] = app
441 return app
444 return app
442
445
443
446
444 @inputhook_manager.register('glut')
447 @inputhook_manager.register('glut')
445 class GlutInputHook(InputHookBase):
448 class GlutInputHook(InputHookBase):
446 def enable(self, app=None):
449 def enable(self, app=None):
447 """Enable event loop integration with GLUT.
450 """Enable event loop integration with GLUT.
448
451
449 Parameters
452 Parameters
450 ----------
453 ----------
451
454
452 app : ignored
455 app : ignored
453 Ignored, it's only a placeholder to keep the call signature of all
456 Ignored, it's only a placeholder to keep the call signature of all
454 gui activation methods consistent, which simplifies the logic of
457 gui activation methods consistent, which simplifies the logic of
455 supporting magics.
458 supporting magics.
456
459
457 Notes
460 Notes
458 -----
461 -----
459
462
460 This methods sets the PyOS_InputHook for GLUT, which allows the GLUT to
463 This methods sets the PyOS_InputHook for GLUT, which allows the GLUT to
461 integrate with terminal based applications like IPython. Due to GLUT
464 integrate with terminal based applications like IPython. Due to GLUT
462 limitations, it is currently not possible to start the event loop
465 limitations, it is currently not possible to start the event loop
463 without first creating a window. You should thus not create another
466 without first creating a window. You should thus not create another
464 window but use instead the created one. See 'gui-glut.py' in the
467 window but use instead the created one. See 'gui-glut.py' in the
465 docs/examples/lib directory.
468 docs/examples/lib directory.
466
469
467 The default screen mode is set to:
470 The default screen mode is set to:
468 glut.GLUT_DOUBLE | glut.GLUT_RGBA | glut.GLUT_DEPTH
471 glut.GLUT_DOUBLE | glut.GLUT_RGBA | glut.GLUT_DEPTH
469 """
472 """
470
473
471 import OpenGL.GLUT as glut
474 import OpenGL.GLUT as glut
472 from IPython.lib.inputhookglut import glut_display_mode, \
475 from IPython.lib.inputhookglut import glut_display_mode, \
473 glut_close, glut_display, \
476 glut_close, glut_display, \
474 glut_idle, inputhook_glut
477 glut_idle, inputhook_glut
475
478
476 if GUI_GLUT not in self.manager.apps:
479 if GUI_GLUT not in self.manager.apps:
477 glut.glutInit( sys.argv )
480 glut.glutInit( sys.argv )
478 glut.glutInitDisplayMode( glut_display_mode )
481 glut.glutInitDisplayMode( glut_display_mode )
479 # This is specific to freeglut
482 # This is specific to freeglut
480 if bool(glut.glutSetOption):
483 if bool(glut.glutSetOption):
481 glut.glutSetOption( glut.GLUT_ACTION_ON_WINDOW_CLOSE,
484 glut.glutSetOption( glut.GLUT_ACTION_ON_WINDOW_CLOSE,
482 glut.GLUT_ACTION_GLUTMAINLOOP_RETURNS )
485 glut.GLUT_ACTION_GLUTMAINLOOP_RETURNS )
483 glut.glutCreateWindow( sys.argv[0] )
486 glut.glutCreateWindow( sys.argv[0] )
484 glut.glutReshapeWindow( 1, 1 )
487 glut.glutReshapeWindow( 1, 1 )
485 glut.glutHideWindow( )
488 glut.glutHideWindow( )
486 glut.glutWMCloseFunc( glut_close )
489 glut.glutWMCloseFunc( glut_close )
487 glut.glutDisplayFunc( glut_display )
490 glut.glutDisplayFunc( glut_display )
488 glut.glutIdleFunc( glut_idle )
491 glut.glutIdleFunc( glut_idle )
489 else:
492 else:
490 glut.glutWMCloseFunc( glut_close )
493 glut.glutWMCloseFunc( glut_close )
491 glut.glutDisplayFunc( glut_display )
494 glut.glutDisplayFunc( glut_display )
492 glut.glutIdleFunc( glut_idle)
495 glut.glutIdleFunc( glut_idle)
493 self.manager.set_inputhook( inputhook_glut )
496 self.manager.set_inputhook( inputhook_glut )
494
497
495
498
496 def disable(self):
499 def disable(self):
497 """Disable event loop integration with glut.
500 """Disable event loop integration with glut.
498
501
499 This sets PyOS_InputHook to NULL and set the display function to a
502 This sets PyOS_InputHook to NULL and set the display function to a
500 dummy one and set the timer to a dummy timer that will be triggered
503 dummy one and set the timer to a dummy timer that will be triggered
501 very far in the future.
504 very far in the future.
502 """
505 """
503 import OpenGL.GLUT as glut
506 import OpenGL.GLUT as glut
504 from glut_support import glutMainLoopEvent
507 from glut_support import glutMainLoopEvent
505
508
506 glut.glutHideWindow() # This is an event to be processed below
509 glut.glutHideWindow() # This is an event to be processed below
507 glutMainLoopEvent()
510 glutMainLoopEvent()
508 super(GlutInputHook, self).disable()
511 super(GlutInputHook, self).disable()
509
512
510 @inputhook_manager.register('pyglet')
513 @inputhook_manager.register('pyglet')
511 class PygletInputHook(InputHookBase):
514 class PygletInputHook(InputHookBase):
512 def enable(self, app=None):
515 def enable(self, app=None):
513 """Enable event loop integration with pyglet.
516 """Enable event loop integration with pyglet.
514
517
515 Parameters
518 Parameters
516 ----------
519 ----------
517 app : ignored
520 app : ignored
518 Ignored, it's only a placeholder to keep the call signature of all
521 Ignored, it's only a placeholder to keep the call signature of all
519 gui activation methods consistent, which simplifies the logic of
522 gui activation methods consistent, which simplifies the logic of
520 supporting magics.
523 supporting magics.
521
524
522 Notes
525 Notes
523 -----
526 -----
524 This methods sets the ``PyOS_InputHook`` for pyglet, which allows
527 This methods sets the ``PyOS_InputHook`` for pyglet, which allows
525 pyglet to integrate with terminal based applications like
528 pyglet to integrate with terminal based applications like
526 IPython.
529 IPython.
527
530
528 """
531 """
529 from IPython.lib.inputhookpyglet import inputhook_pyglet
532 from IPython.lib.inputhookpyglet import inputhook_pyglet
530 self.manager.set_inputhook(inputhook_pyglet)
533 self.manager.set_inputhook(inputhook_pyglet)
531 return app
534 return app
532
535
533
536
534 @inputhook_manager.register('gtk3')
537 @inputhook_manager.register('gtk3')
535 class Gtk3InputHook(InputHookBase):
538 class Gtk3InputHook(InputHookBase):
536 def enable(self, app=None):
539 def enable(self, app=None):
537 """Enable event loop integration with Gtk3 (gir bindings).
540 """Enable event loop integration with Gtk3 (gir bindings).
538
541
539 Parameters
542 Parameters
540 ----------
543 ----------
541 app : ignored
544 app : ignored
542 Ignored, it's only a placeholder to keep the call signature of all
545 Ignored, it's only a placeholder to keep the call signature of all
543 gui activation methods consistent, which simplifies the logic of
546 gui activation methods consistent, which simplifies the logic of
544 supporting magics.
547 supporting magics.
545
548
546 Notes
549 Notes
547 -----
550 -----
548 This methods sets the PyOS_InputHook for Gtk3, which allows
551 This methods sets the PyOS_InputHook for Gtk3, which allows
549 the Gtk3 to integrate with terminal based applications like
552 the Gtk3 to integrate with terminal based applications like
550 IPython.
553 IPython.
551 """
554 """
552 from IPython.lib.inputhookgtk3 import inputhook_gtk3
555 from IPython.lib.inputhookgtk3 import inputhook_gtk3
553 self.manager.set_inputhook(inputhook_gtk3)
556 self.manager.set_inputhook(inputhook_gtk3)
554
557
555
558
556 clear_inputhook = inputhook_manager.clear_inputhook
559 clear_inputhook = inputhook_manager.clear_inputhook
557 set_inputhook = inputhook_manager.set_inputhook
560 set_inputhook = inputhook_manager.set_inputhook
558 current_gui = inputhook_manager.current_gui
561 current_gui = inputhook_manager.current_gui
559 clear_app_refs = inputhook_manager.clear_app_refs
562 clear_app_refs = inputhook_manager.clear_app_refs
560 enable_gui = inputhook_manager.enable_gui
563 enable_gui = inputhook_manager.enable_gui
561 disable_gui = inputhook_manager.disable_gui
564 disable_gui = inputhook_manager.disable_gui
562 register = inputhook_manager.register
565 register = inputhook_manager.register
563 guis = inputhook_manager.guihooks
566 guis = inputhook_manager.guihooks
564
567
565 # Deprecated methods: kept for backwards compatibility, do not use in new code
568 # Deprecated methods: kept for backwards compatibility, do not use in new code
566 def _make_deprecated_enable(name):
569 def _make_deprecated_enable(name):
567 def enable_toolkit(app=None):
570 def enable_toolkit(app=None):
568 warn("This function is deprecated - use enable_gui(%r) instead" % name)
571 warn("This function is deprecated - use enable_gui(%r) instead" % name)
569 inputhook_manager.enable_gui(name, app)
572 inputhook_manager.enable_gui(name, app)
570
573
571 enable_osx = _make_deprecated_enable('osx')
574 enable_osx = _make_deprecated_enable('osx')
572 enable_wx = _make_deprecated_enable('wx')
575 enable_wx = _make_deprecated_enable('wx')
573 enable_qt4 = _make_deprecated_enable('qt4')
576 enable_qt4 = _make_deprecated_enable('qt4')
574 enable_gtk = _make_deprecated_enable('gtk')
577 enable_gtk = _make_deprecated_enable('gtk')
575 enable_tk = _make_deprecated_enable('tk')
578 enable_tk = _make_deprecated_enable('tk')
576 enable_glut = _make_deprecated_enable('glut')
579 enable_glut = _make_deprecated_enable('glut')
577 enable_pyglet = _make_deprecated_enable('pyglet')
580 enable_pyglet = _make_deprecated_enable('pyglet')
578 enable_gtk3 = _make_deprecated_enable('gtk3')
581 enable_gtk3 = _make_deprecated_enable('gtk3')
579
582
580 def _deprecated_disable():
583 def _deprecated_disable():
581 warn("This function is deprecated: use disable_gui() instead")
584 warn("This function is deprecated: use disable_gui() instead")
582 inputhook_manager.disable_gui()
585 inputhook_manager.disable_gui()
583 disable_wx = disable_qt4 = disable_gtk = disable_gtk3 = disable_glut = \
586 disable_wx = disable_qt4 = disable_gtk = disable_gtk3 = disable_glut = \
584 disable_pyglet = disable_osx = _deprecated_disable
587 disable_pyglet = disable_osx = _deprecated_disable
@@ -1,703 +1,703 b''
1 """AsyncResult objects for the client"""
1 """AsyncResult objects for the client"""
2
2
3 # Copyright (c) IPython Development Team.
3 # Copyright (c) IPython Development Team.
4 # Distributed under the terms of the Modified BSD License.
4 # Distributed under the terms of the Modified BSD License.
5
5
6 from __future__ import print_function
6 from __future__ import print_function
7
7
8 import sys
8 import sys
9 import time
9 import time
10 from datetime import datetime
10 from datetime import datetime
11
11
12 from zmq import MessageTracker
12 from zmq import MessageTracker
13
13
14 from IPython.core.display import clear_output, display, display_pretty
14 from IPython.core.display import clear_output, display, display_pretty
15 from IPython.external.decorator import decorator
15 from decorator import decorator
16 from IPython.parallel import error
16 from IPython.parallel import error
17 from IPython.utils.py3compat import string_types
17 from IPython.utils.py3compat import string_types
18
18
19
19
20 def _raw_text(s):
20 def _raw_text(s):
21 display_pretty(s, raw=True)
21 display_pretty(s, raw=True)
22
22
23
23
24 # global empty tracker that's always done:
24 # global empty tracker that's always done:
25 finished_tracker = MessageTracker()
25 finished_tracker = MessageTracker()
26
26
27 @decorator
27 @decorator
28 def check_ready(f, self, *args, **kwargs):
28 def check_ready(f, self, *args, **kwargs):
29 """Call spin() to sync state prior to calling the method."""
29 """Call spin() to sync state prior to calling the method."""
30 self.wait(0)
30 self.wait(0)
31 if not self._ready:
31 if not self._ready:
32 raise error.TimeoutError("result not ready")
32 raise error.TimeoutError("result not ready")
33 return f(self, *args, **kwargs)
33 return f(self, *args, **kwargs)
34
34
35 class AsyncResult(object):
35 class AsyncResult(object):
36 """Class for representing results of non-blocking calls.
36 """Class for representing results of non-blocking calls.
37
37
38 Provides the same interface as :py:class:`multiprocessing.pool.AsyncResult`.
38 Provides the same interface as :py:class:`multiprocessing.pool.AsyncResult`.
39 """
39 """
40
40
41 msg_ids = None
41 msg_ids = None
42 _targets = None
42 _targets = None
43 _tracker = None
43 _tracker = None
44 _single_result = False
44 _single_result = False
45 owner = False,
45 owner = False,
46
46
47 def __init__(self, client, msg_ids, fname='unknown', targets=None, tracker=None,
47 def __init__(self, client, msg_ids, fname='unknown', targets=None, tracker=None,
48 owner=False,
48 owner=False,
49 ):
49 ):
50 if isinstance(msg_ids, string_types):
50 if isinstance(msg_ids, string_types):
51 # always a list
51 # always a list
52 msg_ids = [msg_ids]
52 msg_ids = [msg_ids]
53 self._single_result = True
53 self._single_result = True
54 else:
54 else:
55 self._single_result = False
55 self._single_result = False
56 if tracker is None:
56 if tracker is None:
57 # default to always done
57 # default to always done
58 tracker = finished_tracker
58 tracker = finished_tracker
59 self._client = client
59 self._client = client
60 self.msg_ids = msg_ids
60 self.msg_ids = msg_ids
61 self._fname=fname
61 self._fname=fname
62 self._targets = targets
62 self._targets = targets
63 self._tracker = tracker
63 self._tracker = tracker
64 self.owner = owner
64 self.owner = owner
65
65
66 self._ready = False
66 self._ready = False
67 self._outputs_ready = False
67 self._outputs_ready = False
68 self._success = None
68 self._success = None
69 self._metadata = [self._client.metadata[id] for id in self.msg_ids]
69 self._metadata = [self._client.metadata[id] for id in self.msg_ids]
70
70
71 def __repr__(self):
71 def __repr__(self):
72 if self._ready:
72 if self._ready:
73 return "<%s: finished>"%(self.__class__.__name__)
73 return "<%s: finished>"%(self.__class__.__name__)
74 else:
74 else:
75 return "<%s: %s>"%(self.__class__.__name__,self._fname)
75 return "<%s: %s>"%(self.__class__.__name__,self._fname)
76
76
77
77
78 def _reconstruct_result(self, res):
78 def _reconstruct_result(self, res):
79 """Reconstruct our result from actual result list (always a list)
79 """Reconstruct our result from actual result list (always a list)
80
80
81 Override me in subclasses for turning a list of results
81 Override me in subclasses for turning a list of results
82 into the expected form.
82 into the expected form.
83 """
83 """
84 if self._single_result:
84 if self._single_result:
85 return res[0]
85 return res[0]
86 else:
86 else:
87 return res
87 return res
88
88
89 def get(self, timeout=-1):
89 def get(self, timeout=-1):
90 """Return the result when it arrives.
90 """Return the result when it arrives.
91
91
92 If `timeout` is not ``None`` and the result does not arrive within
92 If `timeout` is not ``None`` and the result does not arrive within
93 `timeout` seconds then ``TimeoutError`` is raised. If the
93 `timeout` seconds then ``TimeoutError`` is raised. If the
94 remote call raised an exception then that exception will be reraised
94 remote call raised an exception then that exception will be reraised
95 by get() inside a `RemoteError`.
95 by get() inside a `RemoteError`.
96 """
96 """
97 if not self.ready():
97 if not self.ready():
98 self.wait(timeout)
98 self.wait(timeout)
99
99
100 if self._ready:
100 if self._ready:
101 if self._success:
101 if self._success:
102 return self._result
102 return self._result
103 else:
103 else:
104 raise self._exception
104 raise self._exception
105 else:
105 else:
106 raise error.TimeoutError("Result not ready.")
106 raise error.TimeoutError("Result not ready.")
107
107
108 def _check_ready(self):
108 def _check_ready(self):
109 if not self.ready():
109 if not self.ready():
110 raise error.TimeoutError("Result not ready.")
110 raise error.TimeoutError("Result not ready.")
111
111
112 def ready(self):
112 def ready(self):
113 """Return whether the call has completed."""
113 """Return whether the call has completed."""
114 if not self._ready:
114 if not self._ready:
115 self.wait(0)
115 self.wait(0)
116 elif not self._outputs_ready:
116 elif not self._outputs_ready:
117 self._wait_for_outputs(0)
117 self._wait_for_outputs(0)
118
118
119 return self._ready
119 return self._ready
120
120
121 def wait(self, timeout=-1):
121 def wait(self, timeout=-1):
122 """Wait until the result is available or until `timeout` seconds pass.
122 """Wait until the result is available or until `timeout` seconds pass.
123
123
124 This method always returns None.
124 This method always returns None.
125 """
125 """
126 if self._ready:
126 if self._ready:
127 self._wait_for_outputs(timeout)
127 self._wait_for_outputs(timeout)
128 return
128 return
129 self._ready = self._client.wait(self.msg_ids, timeout)
129 self._ready = self._client.wait(self.msg_ids, timeout)
130 if self._ready:
130 if self._ready:
131 try:
131 try:
132 results = list(map(self._client.results.get, self.msg_ids))
132 results = list(map(self._client.results.get, self.msg_ids))
133 self._result = results
133 self._result = results
134 if self._single_result:
134 if self._single_result:
135 r = results[0]
135 r = results[0]
136 if isinstance(r, Exception):
136 if isinstance(r, Exception):
137 raise r
137 raise r
138 else:
138 else:
139 results = error.collect_exceptions(results, self._fname)
139 results = error.collect_exceptions(results, self._fname)
140 self._result = self._reconstruct_result(results)
140 self._result = self._reconstruct_result(results)
141 except Exception as e:
141 except Exception as e:
142 self._exception = e
142 self._exception = e
143 self._success = False
143 self._success = False
144 else:
144 else:
145 self._success = True
145 self._success = True
146 finally:
146 finally:
147 if timeout is None or timeout < 0:
147 if timeout is None or timeout < 0:
148 # cutoff infinite wait at 10s
148 # cutoff infinite wait at 10s
149 timeout = 10
149 timeout = 10
150 self._wait_for_outputs(timeout)
150 self._wait_for_outputs(timeout)
151
151
152 if self.owner:
152 if self.owner:
153
153
154 self._metadata = [self._client.metadata.pop(mid) for mid in self.msg_ids]
154 self._metadata = [self._client.metadata.pop(mid) for mid in self.msg_ids]
155 [self._client.results.pop(mid) for mid in self.msg_ids]
155 [self._client.results.pop(mid) for mid in self.msg_ids]
156
156
157
157
158
158
159 def successful(self):
159 def successful(self):
160 """Return whether the call completed without raising an exception.
160 """Return whether the call completed without raising an exception.
161
161
162 Will raise ``AssertionError`` if the result is not ready.
162 Will raise ``AssertionError`` if the result is not ready.
163 """
163 """
164 assert self.ready()
164 assert self.ready()
165 return self._success
165 return self._success
166
166
167 #----------------------------------------------------------------
167 #----------------------------------------------------------------
168 # Extra methods not in mp.pool.AsyncResult
168 # Extra methods not in mp.pool.AsyncResult
169 #----------------------------------------------------------------
169 #----------------------------------------------------------------
170
170
171 def get_dict(self, timeout=-1):
171 def get_dict(self, timeout=-1):
172 """Get the results as a dict, keyed by engine_id.
172 """Get the results as a dict, keyed by engine_id.
173
173
174 timeout behavior is described in `get()`.
174 timeout behavior is described in `get()`.
175 """
175 """
176
176
177 results = self.get(timeout)
177 results = self.get(timeout)
178 if self._single_result:
178 if self._single_result:
179 results = [results]
179 results = [results]
180 engine_ids = [ md['engine_id'] for md in self._metadata ]
180 engine_ids = [ md['engine_id'] for md in self._metadata ]
181
181
182
182
183 rdict = {}
183 rdict = {}
184 for engine_id, result in zip(engine_ids, results):
184 for engine_id, result in zip(engine_ids, results):
185 if engine_id in rdict:
185 if engine_id in rdict:
186 raise ValueError("Cannot build dict, %i jobs ran on engine #%i" % (
186 raise ValueError("Cannot build dict, %i jobs ran on engine #%i" % (
187 engine_ids.count(engine_id), engine_id)
187 engine_ids.count(engine_id), engine_id)
188 )
188 )
189 else:
189 else:
190 rdict[engine_id] = result
190 rdict[engine_id] = result
191
191
192 return rdict
192 return rdict
193
193
194 @property
194 @property
195 def result(self):
195 def result(self):
196 """result property wrapper for `get(timeout=-1)`."""
196 """result property wrapper for `get(timeout=-1)`."""
197 return self.get()
197 return self.get()
198
198
199 # abbreviated alias:
199 # abbreviated alias:
200 r = result
200 r = result
201
201
202 @property
202 @property
203 def metadata(self):
203 def metadata(self):
204 """property for accessing execution metadata."""
204 """property for accessing execution metadata."""
205 if self._single_result:
205 if self._single_result:
206 return self._metadata[0]
206 return self._metadata[0]
207 else:
207 else:
208 return self._metadata
208 return self._metadata
209
209
210 @property
210 @property
211 def result_dict(self):
211 def result_dict(self):
212 """result property as a dict."""
212 """result property as a dict."""
213 return self.get_dict()
213 return self.get_dict()
214
214
215 def __dict__(self):
215 def __dict__(self):
216 return self.get_dict(0)
216 return self.get_dict(0)
217
217
218 def abort(self):
218 def abort(self):
219 """abort my tasks."""
219 """abort my tasks."""
220 assert not self.ready(), "Can't abort, I am already done!"
220 assert not self.ready(), "Can't abort, I am already done!"
221 return self._client.abort(self.msg_ids, targets=self._targets, block=True)
221 return self._client.abort(self.msg_ids, targets=self._targets, block=True)
222
222
223 @property
223 @property
224 def sent(self):
224 def sent(self):
225 """check whether my messages have been sent."""
225 """check whether my messages have been sent."""
226 return self._tracker.done
226 return self._tracker.done
227
227
228 def wait_for_send(self, timeout=-1):
228 def wait_for_send(self, timeout=-1):
229 """wait for pyzmq send to complete.
229 """wait for pyzmq send to complete.
230
230
231 This is necessary when sending arrays that you intend to edit in-place.
231 This is necessary when sending arrays that you intend to edit in-place.
232 `timeout` is in seconds, and will raise TimeoutError if it is reached
232 `timeout` is in seconds, and will raise TimeoutError if it is reached
233 before the send completes.
233 before the send completes.
234 """
234 """
235 return self._tracker.wait(timeout)
235 return self._tracker.wait(timeout)
236
236
237 #-------------------------------------
237 #-------------------------------------
238 # dict-access
238 # dict-access
239 #-------------------------------------
239 #-------------------------------------
240
240
241 def __getitem__(self, key):
241 def __getitem__(self, key):
242 """getitem returns result value(s) if keyed by int/slice, or metadata if key is str.
242 """getitem returns result value(s) if keyed by int/slice, or metadata if key is str.
243 """
243 """
244 if isinstance(key, int):
244 if isinstance(key, int):
245 self._check_ready()
245 self._check_ready()
246 return error.collect_exceptions([self._result[key]], self._fname)[0]
246 return error.collect_exceptions([self._result[key]], self._fname)[0]
247 elif isinstance(key, slice):
247 elif isinstance(key, slice):
248 self._check_ready()
248 self._check_ready()
249 return error.collect_exceptions(self._result[key], self._fname)
249 return error.collect_exceptions(self._result[key], self._fname)
250 elif isinstance(key, string_types):
250 elif isinstance(key, string_types):
251 # metadata proxy *does not* require that results are done
251 # metadata proxy *does not* require that results are done
252 self.wait(0)
252 self.wait(0)
253 values = [ md[key] for md in self._metadata ]
253 values = [ md[key] for md in self._metadata ]
254 if self._single_result:
254 if self._single_result:
255 return values[0]
255 return values[0]
256 else:
256 else:
257 return values
257 return values
258 else:
258 else:
259 raise TypeError("Invalid key type %r, must be 'int','slice', or 'str'"%type(key))
259 raise TypeError("Invalid key type %r, must be 'int','slice', or 'str'"%type(key))
260
260
261 def __getattr__(self, key):
261 def __getattr__(self, key):
262 """getattr maps to getitem for convenient attr access to metadata."""
262 """getattr maps to getitem for convenient attr access to metadata."""
263 try:
263 try:
264 return self.__getitem__(key)
264 return self.__getitem__(key)
265 except (error.TimeoutError, KeyError):
265 except (error.TimeoutError, KeyError):
266 raise AttributeError("%r object has no attribute %r"%(
266 raise AttributeError("%r object has no attribute %r"%(
267 self.__class__.__name__, key))
267 self.__class__.__name__, key))
268
268
269 # asynchronous iterator:
269 # asynchronous iterator:
270 def __iter__(self):
270 def __iter__(self):
271 if self._single_result:
271 if self._single_result:
272 raise TypeError("AsyncResults with a single result are not iterable.")
272 raise TypeError("AsyncResults with a single result are not iterable.")
273 try:
273 try:
274 rlist = self.get(0)
274 rlist = self.get(0)
275 except error.TimeoutError:
275 except error.TimeoutError:
276 # wait for each result individually
276 # wait for each result individually
277 for msg_id in self.msg_ids:
277 for msg_id in self.msg_ids:
278 ar = AsyncResult(self._client, msg_id, self._fname)
278 ar = AsyncResult(self._client, msg_id, self._fname)
279 yield ar.get()
279 yield ar.get()
280 else:
280 else:
281 # already done
281 # already done
282 for r in rlist:
282 for r in rlist:
283 yield r
283 yield r
284
284
285 def __len__(self):
285 def __len__(self):
286 return len(self.msg_ids)
286 return len(self.msg_ids)
287
287
288 #-------------------------------------
288 #-------------------------------------
289 # Sugar methods and attributes
289 # Sugar methods and attributes
290 #-------------------------------------
290 #-------------------------------------
291
291
292 def timedelta(self, start, end, start_key=min, end_key=max):
292 def timedelta(self, start, end, start_key=min, end_key=max):
293 """compute the difference between two sets of timestamps
293 """compute the difference between two sets of timestamps
294
294
295 The default behavior is to use the earliest of the first
295 The default behavior is to use the earliest of the first
296 and the latest of the second list, but this can be changed
296 and the latest of the second list, but this can be changed
297 by passing a different
297 by passing a different
298
298
299 Parameters
299 Parameters
300 ----------
300 ----------
301
301
302 start : one or more datetime objects (e.g. ar.submitted)
302 start : one or more datetime objects (e.g. ar.submitted)
303 end : one or more datetime objects (e.g. ar.received)
303 end : one or more datetime objects (e.g. ar.received)
304 start_key : callable
304 start_key : callable
305 Function to call on `start` to extract the relevant
305 Function to call on `start` to extract the relevant
306 entry [defalt: min]
306 entry [defalt: min]
307 end_key : callable
307 end_key : callable
308 Function to call on `end` to extract the relevant
308 Function to call on `end` to extract the relevant
309 entry [default: max]
309 entry [default: max]
310
310
311 Returns
311 Returns
312 -------
312 -------
313
313
314 dt : float
314 dt : float
315 The time elapsed (in seconds) between the two selected timestamps.
315 The time elapsed (in seconds) between the two selected timestamps.
316 """
316 """
317 if not isinstance(start, datetime):
317 if not isinstance(start, datetime):
318 # handle single_result AsyncResults, where ar.stamp is single object,
318 # handle single_result AsyncResults, where ar.stamp is single object,
319 # not a list
319 # not a list
320 start = start_key(start)
320 start = start_key(start)
321 if not isinstance(end, datetime):
321 if not isinstance(end, datetime):
322 # handle single_result AsyncResults, where ar.stamp is single object,
322 # handle single_result AsyncResults, where ar.stamp is single object,
323 # not a list
323 # not a list
324 end = end_key(end)
324 end = end_key(end)
325 return (end - start).total_seconds()
325 return (end - start).total_seconds()
326
326
327 @property
327 @property
328 def progress(self):
328 def progress(self):
329 """the number of tasks which have been completed at this point.
329 """the number of tasks which have been completed at this point.
330
330
331 Fractional progress would be given by 1.0 * ar.progress / len(ar)
331 Fractional progress would be given by 1.0 * ar.progress / len(ar)
332 """
332 """
333 self.wait(0)
333 self.wait(0)
334 return len(self) - len(set(self.msg_ids).intersection(self._client.outstanding))
334 return len(self) - len(set(self.msg_ids).intersection(self._client.outstanding))
335
335
336 @property
336 @property
337 def elapsed(self):
337 def elapsed(self):
338 """elapsed time since initial submission"""
338 """elapsed time since initial submission"""
339 if self.ready():
339 if self.ready():
340 return self.wall_time
340 return self.wall_time
341
341
342 now = submitted = datetime.now()
342 now = submitted = datetime.now()
343 for msg_id in self.msg_ids:
343 for msg_id in self.msg_ids:
344 if msg_id in self._client.metadata:
344 if msg_id in self._client.metadata:
345 stamp = self._client.metadata[msg_id]['submitted']
345 stamp = self._client.metadata[msg_id]['submitted']
346 if stamp and stamp < submitted:
346 if stamp and stamp < submitted:
347 submitted = stamp
347 submitted = stamp
348 return (now-submitted).total_seconds()
348 return (now-submitted).total_seconds()
349
349
350 @property
350 @property
351 @check_ready
351 @check_ready
352 def serial_time(self):
352 def serial_time(self):
353 """serial computation time of a parallel calculation
353 """serial computation time of a parallel calculation
354
354
355 Computed as the sum of (completed-started) of each task
355 Computed as the sum of (completed-started) of each task
356 """
356 """
357 t = 0
357 t = 0
358 for md in self._metadata:
358 for md in self._metadata:
359 t += (md['completed'] - md['started']).total_seconds()
359 t += (md['completed'] - md['started']).total_seconds()
360 return t
360 return t
361
361
362 @property
362 @property
363 @check_ready
363 @check_ready
364 def wall_time(self):
364 def wall_time(self):
365 """actual computation time of a parallel calculation
365 """actual computation time of a parallel calculation
366
366
367 Computed as the time between the latest `received` stamp
367 Computed as the time between the latest `received` stamp
368 and the earliest `submitted`.
368 and the earliest `submitted`.
369
369
370 Only reliable if Client was spinning/waiting when the task finished, because
370 Only reliable if Client was spinning/waiting when the task finished, because
371 the `received` timestamp is created when a result is pulled off of the zmq queue,
371 the `received` timestamp is created when a result is pulled off of the zmq queue,
372 which happens as a result of `client.spin()`.
372 which happens as a result of `client.spin()`.
373
373
374 For similar comparison of other timestamp pairs, check out AsyncResult.timedelta.
374 For similar comparison of other timestamp pairs, check out AsyncResult.timedelta.
375
375
376 """
376 """
377 return self.timedelta(self.submitted, self.received)
377 return self.timedelta(self.submitted, self.received)
378
378
379 def wait_interactive(self, interval=1., timeout=-1):
379 def wait_interactive(self, interval=1., timeout=-1):
380 """interactive wait, printing progress at regular intervals"""
380 """interactive wait, printing progress at regular intervals"""
381 if timeout is None:
381 if timeout is None:
382 timeout = -1
382 timeout = -1
383 N = len(self)
383 N = len(self)
384 tic = time.time()
384 tic = time.time()
385 while not self.ready() and (timeout < 0 or time.time() - tic <= timeout):
385 while not self.ready() and (timeout < 0 or time.time() - tic <= timeout):
386 self.wait(interval)
386 self.wait(interval)
387 clear_output(wait=True)
387 clear_output(wait=True)
388 print("%4i/%i tasks finished after %4i s" % (self.progress, N, self.elapsed), end="")
388 print("%4i/%i tasks finished after %4i s" % (self.progress, N, self.elapsed), end="")
389 sys.stdout.flush()
389 sys.stdout.flush()
390 print()
390 print()
391 print("done")
391 print("done")
392
392
393 def _republish_displaypub(self, content, eid):
393 def _republish_displaypub(self, content, eid):
394 """republish individual displaypub content dicts"""
394 """republish individual displaypub content dicts"""
395 try:
395 try:
396 ip = get_ipython()
396 ip = get_ipython()
397 except NameError:
397 except NameError:
398 # displaypub is meaningless outside IPython
398 # displaypub is meaningless outside IPython
399 return
399 return
400 md = content['metadata'] or {}
400 md = content['metadata'] or {}
401 md['engine'] = eid
401 md['engine'] = eid
402 ip.display_pub.publish(data=content['data'], metadata=md)
402 ip.display_pub.publish(data=content['data'], metadata=md)
403
403
404 def _display_stream(self, text, prefix='', file=None):
404 def _display_stream(self, text, prefix='', file=None):
405 if not text:
405 if not text:
406 # nothing to display
406 # nothing to display
407 return
407 return
408 if file is None:
408 if file is None:
409 file = sys.stdout
409 file = sys.stdout
410 end = '' if text.endswith('\n') else '\n'
410 end = '' if text.endswith('\n') else '\n'
411
411
412 multiline = text.count('\n') > int(text.endswith('\n'))
412 multiline = text.count('\n') > int(text.endswith('\n'))
413 if prefix and multiline and not text.startswith('\n'):
413 if prefix and multiline and not text.startswith('\n'):
414 prefix = prefix + '\n'
414 prefix = prefix + '\n'
415 print("%s%s" % (prefix, text), file=file, end=end)
415 print("%s%s" % (prefix, text), file=file, end=end)
416
416
417
417
418 def _display_single_result(self):
418 def _display_single_result(self):
419 self._display_stream(self.stdout)
419 self._display_stream(self.stdout)
420 self._display_stream(self.stderr, file=sys.stderr)
420 self._display_stream(self.stderr, file=sys.stderr)
421
421
422 try:
422 try:
423 get_ipython()
423 get_ipython()
424 except NameError:
424 except NameError:
425 # displaypub is meaningless outside IPython
425 # displaypub is meaningless outside IPython
426 return
426 return
427
427
428 for output in self.outputs:
428 for output in self.outputs:
429 self._republish_displaypub(output, self.engine_id)
429 self._republish_displaypub(output, self.engine_id)
430
430
431 if self.execute_result is not None:
431 if self.execute_result is not None:
432 display(self.get())
432 display(self.get())
433
433
434 def _wait_for_outputs(self, timeout=-1):
434 def _wait_for_outputs(self, timeout=-1):
435 """wait for the 'status=idle' message that indicates we have all outputs
435 """wait for the 'status=idle' message that indicates we have all outputs
436 """
436 """
437 if self._outputs_ready or not self._success:
437 if self._outputs_ready or not self._success:
438 # don't wait on errors
438 # don't wait on errors
439 return
439 return
440
440
441 # cast None to -1 for infinite timeout
441 # cast None to -1 for infinite timeout
442 if timeout is None:
442 if timeout is None:
443 timeout = -1
443 timeout = -1
444
444
445 tic = time.time()
445 tic = time.time()
446 while True:
446 while True:
447 self._client._flush_iopub(self._client._iopub_socket)
447 self._client._flush_iopub(self._client._iopub_socket)
448 self._outputs_ready = all(md['outputs_ready']
448 self._outputs_ready = all(md['outputs_ready']
449 for md in self._metadata)
449 for md in self._metadata)
450 if self._outputs_ready or \
450 if self._outputs_ready or \
451 (timeout >= 0 and time.time() > tic + timeout):
451 (timeout >= 0 and time.time() > tic + timeout):
452 break
452 break
453 time.sleep(0.01)
453 time.sleep(0.01)
454
454
455 @check_ready
455 @check_ready
456 def display_outputs(self, groupby="type"):
456 def display_outputs(self, groupby="type"):
457 """republish the outputs of the computation
457 """republish the outputs of the computation
458
458
459 Parameters
459 Parameters
460 ----------
460 ----------
461
461
462 groupby : str [default: type]
462 groupby : str [default: type]
463 if 'type':
463 if 'type':
464 Group outputs by type (show all stdout, then all stderr, etc.):
464 Group outputs by type (show all stdout, then all stderr, etc.):
465
465
466 [stdout:1] foo
466 [stdout:1] foo
467 [stdout:2] foo
467 [stdout:2] foo
468 [stderr:1] bar
468 [stderr:1] bar
469 [stderr:2] bar
469 [stderr:2] bar
470 if 'engine':
470 if 'engine':
471 Display outputs for each engine before moving on to the next:
471 Display outputs for each engine before moving on to the next:
472
472
473 [stdout:1] foo
473 [stdout:1] foo
474 [stderr:1] bar
474 [stderr:1] bar
475 [stdout:2] foo
475 [stdout:2] foo
476 [stderr:2] bar
476 [stderr:2] bar
477
477
478 if 'order':
478 if 'order':
479 Like 'type', but further collate individual displaypub
479 Like 'type', but further collate individual displaypub
480 outputs. This is meant for cases of each command producing
480 outputs. This is meant for cases of each command producing
481 several plots, and you would like to see all of the first
481 several plots, and you would like to see all of the first
482 plots together, then all of the second plots, and so on.
482 plots together, then all of the second plots, and so on.
483 """
483 """
484 if self._single_result:
484 if self._single_result:
485 self._display_single_result()
485 self._display_single_result()
486 return
486 return
487
487
488 stdouts = self.stdout
488 stdouts = self.stdout
489 stderrs = self.stderr
489 stderrs = self.stderr
490 execute_results = self.execute_result
490 execute_results = self.execute_result
491 output_lists = self.outputs
491 output_lists = self.outputs
492 results = self.get()
492 results = self.get()
493
493
494 targets = self.engine_id
494 targets = self.engine_id
495
495
496 if groupby == "engine":
496 if groupby == "engine":
497 for eid,stdout,stderr,outputs,r,execute_result in zip(
497 for eid,stdout,stderr,outputs,r,execute_result in zip(
498 targets, stdouts, stderrs, output_lists, results, execute_results
498 targets, stdouts, stderrs, output_lists, results, execute_results
499 ):
499 ):
500 self._display_stream(stdout, '[stdout:%i] ' % eid)
500 self._display_stream(stdout, '[stdout:%i] ' % eid)
501 self._display_stream(stderr, '[stderr:%i] ' % eid, file=sys.stderr)
501 self._display_stream(stderr, '[stderr:%i] ' % eid, file=sys.stderr)
502
502
503 try:
503 try:
504 get_ipython()
504 get_ipython()
505 except NameError:
505 except NameError:
506 # displaypub is meaningless outside IPython
506 # displaypub is meaningless outside IPython
507 return
507 return
508
508
509 if outputs or execute_result is not None:
509 if outputs or execute_result is not None:
510 _raw_text('[output:%i]' % eid)
510 _raw_text('[output:%i]' % eid)
511
511
512 for output in outputs:
512 for output in outputs:
513 self._republish_displaypub(output, eid)
513 self._republish_displaypub(output, eid)
514
514
515 if execute_result is not None:
515 if execute_result is not None:
516 display(r)
516 display(r)
517
517
518 elif groupby in ('type', 'order'):
518 elif groupby in ('type', 'order'):
519 # republish stdout:
519 # republish stdout:
520 for eid,stdout in zip(targets, stdouts):
520 for eid,stdout in zip(targets, stdouts):
521 self._display_stream(stdout, '[stdout:%i] ' % eid)
521 self._display_stream(stdout, '[stdout:%i] ' % eid)
522
522
523 # republish stderr:
523 # republish stderr:
524 for eid,stderr in zip(targets, stderrs):
524 for eid,stderr in zip(targets, stderrs):
525 self._display_stream(stderr, '[stderr:%i] ' % eid, file=sys.stderr)
525 self._display_stream(stderr, '[stderr:%i] ' % eid, file=sys.stderr)
526
526
527 try:
527 try:
528 get_ipython()
528 get_ipython()
529 except NameError:
529 except NameError:
530 # displaypub is meaningless outside IPython
530 # displaypub is meaningless outside IPython
531 return
531 return
532
532
533 if groupby == 'order':
533 if groupby == 'order':
534 output_dict = dict((eid, outputs) for eid,outputs in zip(targets, output_lists))
534 output_dict = dict((eid, outputs) for eid,outputs in zip(targets, output_lists))
535 N = max(len(outputs) for outputs in output_lists)
535 N = max(len(outputs) for outputs in output_lists)
536 for i in range(N):
536 for i in range(N):
537 for eid in targets:
537 for eid in targets:
538 outputs = output_dict[eid]
538 outputs = output_dict[eid]
539 if len(outputs) >= N:
539 if len(outputs) >= N:
540 _raw_text('[output:%i]' % eid)
540 _raw_text('[output:%i]' % eid)
541 self._republish_displaypub(outputs[i], eid)
541 self._republish_displaypub(outputs[i], eid)
542 else:
542 else:
543 # republish displaypub output
543 # republish displaypub output
544 for eid,outputs in zip(targets, output_lists):
544 for eid,outputs in zip(targets, output_lists):
545 if outputs:
545 if outputs:
546 _raw_text('[output:%i]' % eid)
546 _raw_text('[output:%i]' % eid)
547 for output in outputs:
547 for output in outputs:
548 self._republish_displaypub(output, eid)
548 self._republish_displaypub(output, eid)
549
549
550 # finally, add execute_result:
550 # finally, add execute_result:
551 for eid,r,execute_result in zip(targets, results, execute_results):
551 for eid,r,execute_result in zip(targets, results, execute_results):
552 if execute_result is not None:
552 if execute_result is not None:
553 display(r)
553 display(r)
554
554
555 else:
555 else:
556 raise ValueError("groupby must be one of 'type', 'engine', 'collate', not %r" % groupby)
556 raise ValueError("groupby must be one of 'type', 'engine', 'collate', not %r" % groupby)
557
557
558
558
559
559
560
560
561 class AsyncMapResult(AsyncResult):
561 class AsyncMapResult(AsyncResult):
562 """Class for representing results of non-blocking gathers.
562 """Class for representing results of non-blocking gathers.
563
563
564 This will properly reconstruct the gather.
564 This will properly reconstruct the gather.
565
565
566 This class is iterable at any time, and will wait on results as they come.
566 This class is iterable at any time, and will wait on results as they come.
567
567
568 If ordered=False, then the first results to arrive will come first, otherwise
568 If ordered=False, then the first results to arrive will come first, otherwise
569 results will be yielded in the order they were submitted.
569 results will be yielded in the order they were submitted.
570
570
571 """
571 """
572
572
573 def __init__(self, client, msg_ids, mapObject, fname='', ordered=True):
573 def __init__(self, client, msg_ids, mapObject, fname='', ordered=True):
574 AsyncResult.__init__(self, client, msg_ids, fname=fname)
574 AsyncResult.__init__(self, client, msg_ids, fname=fname)
575 self._mapObject = mapObject
575 self._mapObject = mapObject
576 self._single_result = False
576 self._single_result = False
577 self.ordered = ordered
577 self.ordered = ordered
578
578
579 def _reconstruct_result(self, res):
579 def _reconstruct_result(self, res):
580 """Perform the gather on the actual results."""
580 """Perform the gather on the actual results."""
581 return self._mapObject.joinPartitions(res)
581 return self._mapObject.joinPartitions(res)
582
582
583 # asynchronous iterator:
583 # asynchronous iterator:
584 def __iter__(self):
584 def __iter__(self):
585 it = self._ordered_iter if self.ordered else self._unordered_iter
585 it = self._ordered_iter if self.ordered else self._unordered_iter
586 for r in it():
586 for r in it():
587 yield r
587 yield r
588
588
589 # asynchronous ordered iterator:
589 # asynchronous ordered iterator:
590 def _ordered_iter(self):
590 def _ordered_iter(self):
591 """iterator for results *as they arrive*, preserving submission order."""
591 """iterator for results *as they arrive*, preserving submission order."""
592 try:
592 try:
593 rlist = self.get(0)
593 rlist = self.get(0)
594 except error.TimeoutError:
594 except error.TimeoutError:
595 # wait for each result individually
595 # wait for each result individually
596 for msg_id in self.msg_ids:
596 for msg_id in self.msg_ids:
597 ar = AsyncResult(self._client, msg_id, self._fname)
597 ar = AsyncResult(self._client, msg_id, self._fname)
598 rlist = ar.get()
598 rlist = ar.get()
599 try:
599 try:
600 for r in rlist:
600 for r in rlist:
601 yield r
601 yield r
602 except TypeError:
602 except TypeError:
603 # flattened, not a list
603 # flattened, not a list
604 # this could get broken by flattened data that returns iterables
604 # this could get broken by flattened data that returns iterables
605 # but most calls to map do not expose the `flatten` argument
605 # but most calls to map do not expose the `flatten` argument
606 yield rlist
606 yield rlist
607 else:
607 else:
608 # already done
608 # already done
609 for r in rlist:
609 for r in rlist:
610 yield r
610 yield r
611
611
612 # asynchronous unordered iterator:
612 # asynchronous unordered iterator:
613 def _unordered_iter(self):
613 def _unordered_iter(self):
614 """iterator for results *as they arrive*, on FCFS basis, ignoring submission order."""
614 """iterator for results *as they arrive*, on FCFS basis, ignoring submission order."""
615 try:
615 try:
616 rlist = self.get(0)
616 rlist = self.get(0)
617 except error.TimeoutError:
617 except error.TimeoutError:
618 pending = set(self.msg_ids)
618 pending = set(self.msg_ids)
619 while pending:
619 while pending:
620 try:
620 try:
621 self._client.wait(pending, 1e-3)
621 self._client.wait(pending, 1e-3)
622 except error.TimeoutError:
622 except error.TimeoutError:
623 # ignore timeout error, because that only means
623 # ignore timeout error, because that only means
624 # *some* jobs are outstanding
624 # *some* jobs are outstanding
625 pass
625 pass
626 # update ready set with those no longer outstanding:
626 # update ready set with those no longer outstanding:
627 ready = pending.difference(self._client.outstanding)
627 ready = pending.difference(self._client.outstanding)
628 # update pending to exclude those that are finished
628 # update pending to exclude those that are finished
629 pending = pending.difference(ready)
629 pending = pending.difference(ready)
630 while ready:
630 while ready:
631 msg_id = ready.pop()
631 msg_id = ready.pop()
632 ar = AsyncResult(self._client, msg_id, self._fname)
632 ar = AsyncResult(self._client, msg_id, self._fname)
633 rlist = ar.get()
633 rlist = ar.get()
634 try:
634 try:
635 for r in rlist:
635 for r in rlist:
636 yield r
636 yield r
637 except TypeError:
637 except TypeError:
638 # flattened, not a list
638 # flattened, not a list
639 # this could get broken by flattened data that returns iterables
639 # this could get broken by flattened data that returns iterables
640 # but most calls to map do not expose the `flatten` argument
640 # but most calls to map do not expose the `flatten` argument
641 yield rlist
641 yield rlist
642 else:
642 else:
643 # already done
643 # already done
644 for r in rlist:
644 for r in rlist:
645 yield r
645 yield r
646
646
647
647
648 class AsyncHubResult(AsyncResult):
648 class AsyncHubResult(AsyncResult):
649 """Class to wrap pending results that must be requested from the Hub.
649 """Class to wrap pending results that must be requested from the Hub.
650
650
651 Note that waiting/polling on these objects requires polling the Hubover the network,
651 Note that waiting/polling on these objects requires polling the Hubover the network,
652 so use `AsyncHubResult.wait()` sparingly.
652 so use `AsyncHubResult.wait()` sparingly.
653 """
653 """
654
654
655 def _wait_for_outputs(self, timeout=-1):
655 def _wait_for_outputs(self, timeout=-1):
656 """no-op, because HubResults are never incomplete"""
656 """no-op, because HubResults are never incomplete"""
657 self._outputs_ready = True
657 self._outputs_ready = True
658
658
659 def wait(self, timeout=-1):
659 def wait(self, timeout=-1):
660 """wait for result to complete."""
660 """wait for result to complete."""
661 start = time.time()
661 start = time.time()
662 if self._ready:
662 if self._ready:
663 return
663 return
664 local_ids = [m for m in self.msg_ids if m in self._client.outstanding]
664 local_ids = [m for m in self.msg_ids if m in self._client.outstanding]
665 local_ready = self._client.wait(local_ids, timeout)
665 local_ready = self._client.wait(local_ids, timeout)
666 if local_ready:
666 if local_ready:
667 remote_ids = [m for m in self.msg_ids if m not in self._client.results]
667 remote_ids = [m for m in self.msg_ids if m not in self._client.results]
668 if not remote_ids:
668 if not remote_ids:
669 self._ready = True
669 self._ready = True
670 else:
670 else:
671 rdict = self._client.result_status(remote_ids, status_only=False)
671 rdict = self._client.result_status(remote_ids, status_only=False)
672 pending = rdict['pending']
672 pending = rdict['pending']
673 while pending and (timeout < 0 or time.time() < start+timeout):
673 while pending and (timeout < 0 or time.time() < start+timeout):
674 rdict = self._client.result_status(remote_ids, status_only=False)
674 rdict = self._client.result_status(remote_ids, status_only=False)
675 pending = rdict['pending']
675 pending = rdict['pending']
676 if pending:
676 if pending:
677 time.sleep(0.1)
677 time.sleep(0.1)
678 if not pending:
678 if not pending:
679 self._ready = True
679 self._ready = True
680 if self._ready:
680 if self._ready:
681 try:
681 try:
682 results = list(map(self._client.results.get, self.msg_ids))
682 results = list(map(self._client.results.get, self.msg_ids))
683 self._result = results
683 self._result = results
684 if self._single_result:
684 if self._single_result:
685 r = results[0]
685 r = results[0]
686 if isinstance(r, Exception):
686 if isinstance(r, Exception):
687 raise r
687 raise r
688 else:
688 else:
689 results = error.collect_exceptions(results, self._fname)
689 results = error.collect_exceptions(results, self._fname)
690 self._result = self._reconstruct_result(results)
690 self._result = self._reconstruct_result(results)
691 except Exception as e:
691 except Exception as e:
692 self._exception = e
692 self._exception = e
693 self._success = False
693 self._success = False
694 else:
694 else:
695 self._success = True
695 self._success = True
696 finally:
696 finally:
697 self._metadata = [self._client.metadata[mid] for mid in self.msg_ids]
697 self._metadata = [self._client.metadata[mid] for mid in self.msg_ids]
698 if self.owner:
698 if self.owner:
699 [self._client.metadata.pop(mid) for mid in self.msg_ids]
699 [self._client.metadata.pop(mid) for mid in self.msg_ids]
700 [self._client.results.pop(mid) for mid in self.msg_ids]
700 [self._client.results.pop(mid) for mid in self.msg_ids]
701
701
702
702
703 __all__ = ['AsyncResult', 'AsyncMapResult', 'AsyncHubResult']
703 __all__ = ['AsyncResult', 'AsyncMapResult', 'AsyncHubResult']
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (1267 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
This diff has been collapsed as it changes many lines, (2123 lines changed) Show them Hide them
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file was removed
NO CONTENT: file was removed
The requested commit or file is too big and content was truncated. Show full diff
General Comments 0
You need to be logged in to leave comments. Login now