##// END OF EJS Templates
Work to address the review comments on Fernando's branch....
Brian Granger -
Show More

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

1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: new file 100644
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,67 +1,67 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 IPython.
5 5
6 6 IPython is a set of tools for interactive and exploratory computing in Python.
7 7 """
8 8
9 9 #-----------------------------------------------------------------------------
10 10 # Copyright (C) 2008-2009 The IPython Development Team
11 11 #
12 12 # Distributed under the terms of the BSD License. The full license is in
13 13 # the file COPYING, distributed as part of this software.
14 14 #-----------------------------------------------------------------------------
15 15
16 16 #-----------------------------------------------------------------------------
17 17 # Imports
18 18 #-----------------------------------------------------------------------------
19 19 from __future__ import absolute_import
20 20
21 21 import os
22 22 import sys
23 23
24 24 #-----------------------------------------------------------------------------
25 25 # Setup everything
26 26 #-----------------------------------------------------------------------------
27 27
28 28 if sys.version[0:3] < '2.5':
29 29 raise ImportError('Python Version 2.5 or above is required for IPython.')
30 30
31 31
32 32 # Make it easy to import extensions - they are always directly on pythonpath.
33 # Therefore, non-IPython modules can be added to extensions directory
33 # Therefore, non-IPython modules can be added to extensions directory.
34 # This should probably be in ipapp.py.
34 35 sys.path.append(os.path.join(os.path.dirname(__file__), "extensions"))
35 36
36 37 #-----------------------------------------------------------------------------
37 38 # Setup the top level names
38 39 #-----------------------------------------------------------------------------
39 40
40 # In some cases, these are causing circular imports.
41 41 from .config.loader import Config
42 42 from .core import release
43 43 from .core.application import Application
44 44 from .core.ipapp import IPythonApp
45 45 from .core.embed import embed
46 46 from .core.error import TryNext
47 47 from .core.iplib import InteractiveShell
48 48 from .testing import test
49 49
50 50 from .lib import (
51 51 enable_wx, disable_wx,
52 52 enable_gtk, disable_gtk,
53 53 enable_qt4, disable_qt4,
54 54 enable_tk, disable_tk,
55 55 set_inputhook, clear_inputhook,
56 56 current_gui, spin,
57 57 appstart_qt4, appstart_wx,
58 58 appstart_gtk, appstart_tk
59 59 )
60 60
61 61 # Release data
62 62 __author__ = ''
63 63 for author, email in release.authors.values():
64 64 __author__ += author + ' <' + email + '>\n'
65 65 __license__ = release.license
66 66 __version__ = release.version
67 67 __revision__ = release.revision
@@ -1,377 +1,377 b''
1 1 # coding: utf-8
2 2 """A simple configuration system.
3 3
4 4 Authors
5 5 -------
6 6 * Brian Granger
7 7 * Fernando Perez
8 8 """
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Copyright (C) 2008-2009 The IPython Development Team
12 12 #
13 13 # Distributed under the terms of the BSD License. The full license is in
14 14 # the file COPYING, distributed as part of this software.
15 15 #-----------------------------------------------------------------------------
16 16
17 17 #-----------------------------------------------------------------------------
18 18 # Imports
19 19 #-----------------------------------------------------------------------------
20 20
21 21 import __builtin__
22 22 import os
23 23 import sys
24 24
25 25 from IPython.external import argparse
26 from IPython.utils.genutils import filefind
26 from IPython.utils.path import filefind
27 27
28 28 #-----------------------------------------------------------------------------
29 29 # Exceptions
30 30 #-----------------------------------------------------------------------------
31 31
32 32
33 33 class ConfigError(Exception):
34 34 pass
35 35
36 36
37 37 class ConfigLoaderError(ConfigError):
38 38 pass
39 39
40 40 #-----------------------------------------------------------------------------
41 41 # Argparse fix
42 42 #-----------------------------------------------------------------------------
43 43 # Unfortunately argparse by default prints help messages to stderr instead of
44 44 # stdout. This makes it annoying to capture long help screens at the command
45 45 # line, since one must know how to pipe stderr, which many users don't know how
46 46 # to do. So we override the print_help method with one that defaults to
47 47 # stdout and use our class instead.
48 48
49 49 class ArgumentParser(argparse.ArgumentParser):
50 50 """Simple argparse subclass that prints help to stdout by default."""
51 51
52 52 def print_help(self, file=None):
53 53 if file is None:
54 54 file = sys.stdout
55 55 return super(ArgumentParser, self).print_help(file)
56 56
57 57 print_help.__doc__ = argparse.ArgumentParser.print_help.__doc__
58 58
59 59 #-----------------------------------------------------------------------------
60 60 # Config class for holding config information
61 61 #-----------------------------------------------------------------------------
62 62
63 63
64 64 class Config(dict):
65 65 """An attribute based dict that can do smart merges."""
66 66
67 67 def __init__(self, *args, **kwds):
68 68 dict.__init__(self, *args, **kwds)
69 69 # This sets self.__dict__ = self, but it has to be done this way
70 70 # because we are also overriding __setattr__.
71 71 dict.__setattr__(self, '__dict__', self)
72 72
73 73 def _merge(self, other):
74 74 to_update = {}
75 75 for k, v in other.items():
76 76 if not self.has_key(k):
77 77 to_update[k] = v
78 78 else: # I have this key
79 79 if isinstance(v, Config):
80 80 # Recursively merge common sub Configs
81 81 self[k]._merge(v)
82 82 else:
83 83 # Plain updates for non-Configs
84 84 to_update[k] = v
85 85
86 86 self.update(to_update)
87 87
88 88 def _is_section_key(self, key):
89 89 if key[0].upper()==key[0] and not key.startswith('_'):
90 90 return True
91 91 else:
92 92 return False
93 93
94 94 def has_key(self, key):
95 95 if self._is_section_key(key):
96 96 return True
97 97 else:
98 98 return dict.has_key(self, key)
99 99
100 100 def _has_section(self, key):
101 101 if self._is_section_key(key):
102 102 if dict.has_key(self, key):
103 103 return True
104 104 return False
105 105
106 106 def copy(self):
107 107 return type(self)(dict.copy(self))
108 108
109 109 def __copy__(self):
110 110 return self.copy()
111 111
112 112 def __deepcopy__(self, memo):
113 113 import copy
114 114 return type(self)(copy.deepcopy(self.items()))
115 115
116 116 def __getitem__(self, key):
117 117 # Because we use this for an exec namespace, we need to delegate
118 118 # the lookup of names in __builtin__ to itself. This means
119 119 # that you can't have section or attribute names that are
120 120 # builtins.
121 121 try:
122 122 return getattr(__builtin__, key)
123 123 except AttributeError:
124 124 pass
125 125 if self._is_section_key(key):
126 126 try:
127 127 return dict.__getitem__(self, key)
128 128 except KeyError:
129 129 c = Config()
130 130 dict.__setitem__(self, key, c)
131 131 return c
132 132 else:
133 133 return dict.__getitem__(self, key)
134 134
135 135 def __setitem__(self, key, value):
136 136 # Don't allow names in __builtin__ to be modified.
137 137 if hasattr(__builtin__, key):
138 138 raise ConfigError('Config variable names cannot have the same name '
139 139 'as a Python builtin: %s' % key)
140 140 if self._is_section_key(key):
141 141 if not isinstance(value, Config):
142 142 raise ValueError('values whose keys begin with an uppercase '
143 143 'char must be Config instances: %r, %r' % (key, value))
144 144 else:
145 145 dict.__setitem__(self, key, value)
146 146
147 147 def __getattr__(self, key):
148 148 try:
149 149 return self.__getitem__(key)
150 150 except KeyError, e:
151 151 raise AttributeError(e)
152 152
153 153 def __setattr__(self, key, value):
154 154 try:
155 155 self.__setitem__(key, value)
156 156 except KeyError, e:
157 157 raise AttributeError(e)
158 158
159 159 def __delattr__(self, key):
160 160 try:
161 161 dict.__delitem__(self, key)
162 162 except KeyError, e:
163 163 raise AttributeError(e)
164 164
165 165
166 166 #-----------------------------------------------------------------------------
167 167 # Config loading classes
168 168 #-----------------------------------------------------------------------------
169 169
170 170
171 171 class ConfigLoader(object):
172 172 """A object for loading configurations from just about anywhere.
173 173
174 174 The resulting configuration is packaged as a :class:`Struct`.
175 175
176 176 Notes
177 177 -----
178 178 A :class:`ConfigLoader` does one thing: load a config from a source
179 179 (file, command line arguments) and returns the data as a :class:`Struct`.
180 180 There are lots of things that :class:`ConfigLoader` does not do. It does
181 181 not implement complex logic for finding config files. It does not handle
182 182 default values or merge multiple configs. These things need to be
183 183 handled elsewhere.
184 184 """
185 185
186 186 def __init__(self):
187 187 """A base class for config loaders.
188 188
189 189 Examples
190 190 --------
191 191
192 192 >>> cl = ConfigLoader()
193 193 >>> config = cl.load_config()
194 194 >>> config
195 195 {}
196 196 """
197 197 self.clear()
198 198
199 199 def clear(self):
200 200 self.config = Config()
201 201
202 202 def load_config(self):
203 203 """Load a config from somewhere, return a Struct.
204 204
205 205 Usually, this will cause self.config to be set and then returned.
206 206 """
207 207 return self.config
208 208
209 209
210 210 class FileConfigLoader(ConfigLoader):
211 211 """A base class for file based configurations.
212 212
213 213 As we add more file based config loaders, the common logic should go
214 214 here.
215 215 """
216 216 pass
217 217
218 218
219 219 class PyFileConfigLoader(FileConfigLoader):
220 220 """A config loader for pure python files.
221 221
222 222 This calls execfile on a plain python file and looks for attributes
223 223 that are all caps. These attribute are added to the config Struct.
224 224 """
225 225
226 226 def __init__(self, filename, path=None):
227 227 """Build a config loader for a filename and path.
228 228
229 229 Parameters
230 230 ----------
231 231 filename : str
232 232 The file name of the config file.
233 233 path : str, list, tuple
234 234 The path to search for the config file on, or a sequence of
235 235 paths to try in order.
236 236 """
237 237 super(PyFileConfigLoader, self).__init__()
238 238 self.filename = filename
239 239 self.path = path
240 240 self.full_filename = ''
241 241 self.data = None
242 242
243 243 def load_config(self):
244 244 """Load the config from a file and return it as a Struct."""
245 245 self._find_file()
246 246 self._read_file_as_dict()
247 247 self._convert_to_config()
248 248 return self.config
249 249
250 250 def _find_file(self):
251 251 """Try to find the file by searching the paths."""
252 252 self.full_filename = filefind(self.filename, self.path)
253 253
254 254 def _read_file_as_dict(self):
255 255 """Load the config file into self.config, with recursive loading."""
256 256 # This closure is made available in the namespace that is used
257 257 # to exec the config file. This allows users to call
258 258 # load_subconfig('myconfig.py') to load config files recursively.
259 259 # It needs to be a closure because it has references to self.path
260 260 # and self.config. The sub-config is loaded with the same path
261 261 # as the parent, but it uses an empty config which is then merged
262 262 # with the parents.
263 263 def load_subconfig(fname):
264 264 loader = PyFileConfigLoader(fname, self.path)
265 265 try:
266 266 sub_config = loader.load_config()
267 267 except IOError:
268 268 # Pass silently if the sub config is not there. This happens
269 269 # when a user us using a profile, but not the default config.
270 270 pass
271 271 else:
272 272 self.config._merge(sub_config)
273 273
274 274 # Again, this needs to be a closure and should be used in config
275 275 # files to get the config being loaded.
276 276 def get_config():
277 277 return self.config
278 278
279 279 namespace = dict(load_subconfig=load_subconfig, get_config=get_config)
280 280 execfile(self.full_filename, namespace)
281 281
282 282 def _convert_to_config(self):
283 283 if self.data is None:
284 284 ConfigLoaderError('self.data does not exist')
285 285
286 286
287 287 class CommandLineConfigLoader(ConfigLoader):
288 288 """A config loader for command line arguments.
289 289
290 290 As we add more command line based loaders, the common logic should go
291 291 here.
292 292 """
293 293
294 294
295 295 class __NoConfigDefault(object): pass
296 296 NoConfigDefault = __NoConfigDefault()
297 297
298 298
299 299 class ArgParseConfigLoader(CommandLineConfigLoader):
300 300 #: Global default for arguments (see argparse docs for details)
301 301 argument_default = NoConfigDefault
302 302
303 303 def __init__(self, argv=None, arguments=(), *args, **kw):
304 304 """Create a config loader for use with argparse.
305 305
306 306 With the exception of ``argv`` and ``arguments``, other args and kwargs
307 307 arguments here are passed onto the constructor of
308 308 :class:`argparse.ArgumentParser`.
309 309
310 310 Parameters
311 311 ----------
312 312
313 313 argv : optional, list
314 314 If given, used to read command-line arguments from, otherwise
315 315 sys.argv[1:] is used.
316 316
317 317 arguments : optional, tuple
318 318 Description of valid command-line arguments, to be called in sequence
319 319 with parser.add_argument() to configure the parser.
320 320 """
321 321 super(CommandLineConfigLoader, self).__init__()
322 322 if argv == None:
323 323 argv = sys.argv[1:]
324 324 self.argv = argv
325 325 self.arguments = arguments
326 326 self.args = args
327 327 kwargs = dict(argument_default=self.argument_default)
328 328 kwargs.update(kw)
329 329 self.kw = kwargs
330 330
331 331 def load_config(self, args=None):
332 332 """Parse command line arguments and return as a Struct.
333 333
334 334 Parameters
335 335 ----------
336 336
337 337 args : optional, list
338 338 If given, a list with the structure of sys.argv[1:] to parse arguments
339 339 from. If not given, the instance's self.argv attribute (given at
340 340 construction time) is used."""
341 341
342 342 if args is None:
343 343 args = self.argv
344 344 self._create_parser()
345 345 self._parse_args(args)
346 346 self._convert_to_config()
347 347 return self.config
348 348
349 349 def get_extra_args(self):
350 350 if hasattr(self, 'extra_args'):
351 351 return self.extra_args
352 352 else:
353 353 return []
354 354
355 355 def _create_parser(self):
356 356 self.parser = ArgumentParser(*self.args, **self.kw)
357 357 self._add_arguments()
358 358 self._add_other_arguments()
359 359
360 360 def _add_arguments(self):
361 361 for argument in self.arguments:
362 362 self.parser.add_argument(*argument[0],**argument[1])
363 363
364 364 def _add_other_arguments(self):
365 365 """Meant for subclasses to add their own arguments."""
366 366 pass
367 367
368 368 def _parse_args(self, args):
369 369 """self.parser->self.parsed_data"""
370 370 self.parsed_data, self.extra_args = self.parser.parse_known_args(args)
371 371
372 372 def _convert_to_config(self):
373 373 """self.parsed_data->self.config"""
374 374 for k, v in vars(self.parsed_data).items():
375 375 if v is not NoConfigDefault:
376 376 exec_str = 'self.config.' + k + '= v'
377 377 exec exec_str in locals(), globals()
@@ -1,262 +1,262 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 IPython's alias component
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 """
10 10
11 11 #-----------------------------------------------------------------------------
12 12 # Copyright (C) 2008-2009 The IPython Development Team
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #-----------------------------------------------------------------------------
17 17
18 18 #-----------------------------------------------------------------------------
19 19 # Imports
20 20 #-----------------------------------------------------------------------------
21 21
22 22 import __builtin__
23 23 import keyword
24 24 import os
25 25 import re
26 26 import sys
27 27
28 28 from IPython.core.component import Component
29 29 from IPython.core.splitinput import split_user_input
30 30
31 from IPython.utils.traitlets import CBool, List, Instance
32 from IPython.utils.genutils import error
31 from IPython.utils.traitlets import List
33 32 from IPython.utils.autoattr import auto_attr
33 from IPython.utils.warn import warn, error
34 34
35 35 #-----------------------------------------------------------------------------
36 36 # Utilities
37 37 #-----------------------------------------------------------------------------
38 38
39 39 # This is used as the pattern for calls to split_user_input.
40 40 shell_line_split = re.compile(r'^(\s*)(\S*\s*)(.*$)')
41 41
42 42 def default_aliases():
43 43 # Make some aliases automatically
44 44 # Prepare list of shell aliases to auto-define
45 45 if os.name == 'posix':
46 46 default_aliases = ('mkdir mkdir', 'rmdir rmdir',
47 47 'mv mv -i','rm rm -i','cp cp -i',
48 48 'cat cat','less less','clear clear',
49 49 # a better ls
50 50 'ls ls -F',
51 51 # long ls
52 52 'll ls -lF')
53 53 # Extra ls aliases with color, which need special treatment on BSD
54 54 # variants
55 55 ls_extra = ( # color ls
56 56 'lc ls -F -o --color',
57 57 # ls normal files only
58 58 'lf ls -F -o --color %l | grep ^-',
59 59 # ls symbolic links
60 60 'lk ls -F -o --color %l | grep ^l',
61 61 # directories or links to directories,
62 62 'ldir ls -F -o --color %l | grep /$',
63 63 # things which are executable
64 64 'lx ls -F -o --color %l | grep ^-..x',
65 65 )
66 66 # The BSDs don't ship GNU ls, so they don't understand the
67 67 # --color switch out of the box
68 68 if 'bsd' in sys.platform:
69 69 ls_extra = ( # ls normal files only
70 70 'lf ls -lF | grep ^-',
71 71 # ls symbolic links
72 72 'lk ls -lF | grep ^l',
73 73 # directories or links to directories,
74 74 'ldir ls -lF | grep /$',
75 75 # things which are executable
76 76 'lx ls -lF | grep ^-..x',
77 77 )
78 78 default_aliases = default_aliases + ls_extra
79 79 elif os.name in ['nt','dos']:
80 80 default_aliases = ('ls dir /on',
81 81 'ddir dir /ad /on', 'ldir dir /ad /on',
82 82 'mkdir mkdir','rmdir rmdir','echo echo',
83 83 'ren ren','cls cls','copy copy')
84 84 else:
85 85 default_aliases = ()
86 86 return [s.split(None,1) for s in default_aliases]
87 87
88 88
89 89 class AliasError(Exception):
90 90 pass
91 91
92 92
93 93 class InvalidAliasError(AliasError):
94 94 pass
95 95
96 96
97 97 #-----------------------------------------------------------------------------
98 98 # Main AliasManager class
99 99 #-----------------------------------------------------------------------------
100 100
101 101
102 102 class AliasManager(Component):
103 103
104 104 default_aliases = List(default_aliases(), config=True)
105 105 user_aliases = List(default_value=[], config=True)
106 106
107 107 def __init__(self, parent, config=None):
108 108 super(AliasManager, self).__init__(parent, config=config)
109 109 self.alias_table = {}
110 110 self.exclude_aliases()
111 111 self.init_aliases()
112 112
113 113 @auto_attr
114 114 def shell(self):
115 115 return Component.get_instances(
116 116 root=self.root,
117 117 klass='IPython.core.iplib.InteractiveShell')[0]
118 118
119 119 def __contains__(self, name):
120 120 if name in self.alias_table:
121 121 return True
122 122 else:
123 123 return False
124 124
125 125 @property
126 126 def aliases(self):
127 127 return [(item[0], item[1][1]) for item in self.alias_table.iteritems()]
128 128
129 129 def exclude_aliases(self):
130 130 # set of things NOT to alias (keywords, builtins and some magics)
131 131 no_alias = set(['cd','popd','pushd','dhist','alias','unalias'])
132 132 no_alias.update(set(keyword.kwlist))
133 133 no_alias.update(set(__builtin__.__dict__.keys()))
134 134 self.no_alias = no_alias
135 135
136 136 def init_aliases(self):
137 137 # Load default aliases
138 138 for name, cmd in self.default_aliases:
139 139 self.soft_define_alias(name, cmd)
140 140
141 141 # Load user aliases
142 142 for name, cmd in self.user_aliases:
143 143 self.soft_define_alias(name, cmd)
144 144
145 145 def clear_aliases(self):
146 146 self.alias_table.clear()
147 147
148 148 def soft_define_alias(self, name, cmd):
149 149 """Define an alias, but don't raise on an AliasError."""
150 150 try:
151 151 self.define_alias(name, cmd)
152 152 except AliasError, e:
153 153 error("Invalid alias: %s" % e)
154 154
155 155 def define_alias(self, name, cmd):
156 156 """Define a new alias after validating it.
157 157
158 158 This will raise an :exc:`AliasError` if there are validation
159 159 problems.
160 160 """
161 161 nargs = self.validate_alias(name, cmd)
162 162 self.alias_table[name] = (nargs, cmd)
163 163
164 164 def undefine_alias(self, name):
165 165 if self.alias_table.has_key(name):
166 166 del self.alias_table[name]
167 167
168 168 def validate_alias(self, name, cmd):
169 169 """Validate an alias and return the its number of arguments."""
170 170 if name in self.no_alias:
171 171 raise InvalidAliasError("The name %s can't be aliased "
172 172 "because it is a keyword or builtin." % name)
173 173 if not (isinstance(cmd, basestring)):
174 174 raise InvalidAliasError("An alias command must be a string, "
175 175 "got: %r" % name)
176 176 nargs = cmd.count('%s')
177 177 if nargs>0 and cmd.find('%l')>=0:
178 178 raise InvalidAliasError('The %s and %l specifiers are mutually '
179 179 'exclusive in alias definitions.')
180 180 return nargs
181 181
182 182 def call_alias(self, alias, rest=''):
183 183 """Call an alias given its name and the rest of the line."""
184 184 cmd = self.transform_alias(alias, rest)
185 185 try:
186 186 self.shell.system(cmd)
187 187 except:
188 188 self.shell.showtraceback()
189 189
190 190 def transform_alias(self, alias,rest=''):
191 191 """Transform alias to system command string."""
192 192 nargs, cmd = self.alias_table[alias]
193 193
194 194 if ' ' in cmd and os.path.isfile(cmd):
195 195 cmd = '"%s"' % cmd
196 196
197 197 # Expand the %l special to be the user's input line
198 198 if cmd.find('%l') >= 0:
199 199 cmd = cmd.replace('%l', rest)
200 200 rest = ''
201 201 if nargs==0:
202 202 # Simple, argument-less aliases
203 203 cmd = '%s %s' % (cmd, rest)
204 204 else:
205 205 # Handle aliases with positional arguments
206 206 args = rest.split(None, nargs)
207 207 if len(args) < nargs:
208 208 raise AliasError('Alias <%s> requires %s arguments, %s given.' %
209 209 (alias, nargs, len(args)))
210 210 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
211 211 return cmd
212 212
213 213 def expand_alias(self, line):
214 214 """ Expand an alias in the command line
215 215
216 216 Returns the provided command line, possibly with the first word
217 217 (command) translated according to alias expansion rules.
218 218
219 219 [ipython]|16> _ip.expand_aliases("np myfile.txt")
220 220 <16> 'q:/opt/np/notepad++.exe myfile.txt'
221 221 """
222 222
223 223 pre,fn,rest = split_user_input(line)
224 224 res = pre + self.expand_aliases(fn, rest)
225 225 return res
226 226
227 227 def expand_aliases(self, fn, rest):
228 228 """Expand multiple levels of aliases:
229 229
230 230 if:
231 231
232 232 alias foo bar /tmp
233 233 alias baz foo
234 234
235 235 then:
236 236
237 237 baz huhhahhei -> bar /tmp huhhahhei
238 238
239 239 """
240 240 line = fn + " " + rest
241 241
242 242 done = set()
243 243 while 1:
244 244 pre,fn,rest = split_user_input(line, shell_line_split)
245 245 if fn in self.alias_table:
246 246 if fn in done:
247 247 warn("Cyclic alias definition, repeated '%s'" % fn)
248 248 return ""
249 249 done.add(fn)
250 250
251 251 l2 = self.transform_alias(fn, rest)
252 252 if l2 == line:
253 253 break
254 254 # ls -> ls -F should not recurse forever
255 255 if l2.split(None,1)[0] == line.split(None,1)[0]:
256 256 line = l2
257 257 break
258 258 line=l2
259 259 else:
260 260 break
261 261
262 262 return line
@@ -1,489 +1,489 b''
1 1 # encoding: utf-8
2 2 """
3 3 An application for IPython.
4 4
5 5 All top-level applications should use the classes in this module for
6 6 handling configuration and creating componenets.
7 7
8 8 The job of an :class:`Application` is to create the master configuration
9 9 object and then create the components, passing the config to them.
10 10
11 11 Authors:
12 12
13 13 * Brian Granger
14 14 * Fernando Perez
15 15
16 16 Notes
17 17 -----
18 18 """
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Copyright (C) 2008-2009 The IPython Development Team
22 22 #
23 23 # Distributed under the terms of the BSD License. The full license is in
24 24 # the file COPYING, distributed as part of this software.
25 25 #-----------------------------------------------------------------------------
26 26
27 27 #-----------------------------------------------------------------------------
28 28 # Imports
29 29 #-----------------------------------------------------------------------------
30 30
31 31 import logging
32 32 import os
33 33 import sys
34 34
35 35 from IPython.core import release, crashhandler
36 from IPython.utils.genutils import get_ipython_dir, get_ipython_package_dir
36 from IPython.utils.path import get_ipython_dir, get_ipython_package_dir
37 37 from IPython.config.loader import (
38 38 PyFileConfigLoader,
39 39 ArgParseConfigLoader,
40 40 Config,
41 41 )
42 42
43 43 #-----------------------------------------------------------------------------
44 44 # Classes and functions
45 45 #-----------------------------------------------------------------------------
46 46
47 47 class ApplicationError(Exception):
48 48 pass
49 49
50 50
51 51 app_cl_args = (
52 52 (('--ipython-dir', ), dict(
53 53 dest='Global.ipython_dir',type=unicode,
54 54 help=
55 55 """Set to override default location of the IPython directory
56 56 IPYTHON_DIR, stored as Global.ipython_dir. This can also be specified
57 57 through the environment variable IPYTHON_DIR.""",
58 58 metavar='Global.ipython_dir') ),
59 59 (('-p', '--profile',), dict(
60 60 dest='Global.profile',type=unicode,
61 61 help=
62 62 """The string name of the ipython profile to be used. Assume that your
63 63 config file is ipython_config-<name>.py (looks in current dir first,
64 64 then in IPYTHON_DIR). This is a quick way to keep and load multiple
65 65 config files for different tasks, especially if include your basic one
66 66 in your more specialized ones. You can keep a basic
67 67 IPYTHON_DIR/ipython_config.py file and then have other 'profiles' which
68 68 include this one and load extra things for particular tasks.""",
69 69 metavar='Global.profile') ),
70 70 (('--log-level',), dict(
71 71 dest="Global.log_level",type=int,
72 72 help='Set the log level (0,10,20,30,40,50). Default is 30.',
73 73 metavar='Global.log_level')),
74 74 (('--config-file',), dict(
75 75 dest='Global.config_file',type=unicode,
76 76 help=
77 77 """Set the config file name to override default. Normally IPython
78 78 loads ipython_config.py (from current directory) or
79 79 IPYTHON_DIR/ipython_config.py. If the loading of your config file
80 80 fails, IPython starts with a bare bones configuration (no modules
81 81 loaded at all).""",
82 82 metavar='Global.config_file')),
83 83 )
84 84
85 85 class Application(object):
86 86 """Load a config, construct components and set them running.
87 87
88 88 The configuration of an application can be done via four different Config
89 89 objects, which are loaded and ultimately merged into a single one used from
90 90 that point on by the app. These are:
91 91
92 92 1. default_config: internal defaults, implemented in code.
93 93 2. file_config: read from the filesystem.
94 94 3. command_line_config: read from the system's command line flags.
95 95 4. constructor_config: passed parametrically to the constructor.
96 96
97 97 During initialization, 3 is actually read before 2, since at the
98 98 command-line one may override the location of the file to be read. But the
99 99 above is the order in which the merge is made.
100 100
101 101 There is a final config object can be created and passed to the
102 102 constructor: override_config. If it exists, this completely overrides the
103 103 configs 2-4 above (the default is still used to ensure that all needed
104 104 fields at least are created). This makes it easier to create
105 105 parametrically (e.g. in testing or sphinx plugins) objects with a known
106 106 configuration, that are unaffected by whatever arguments may be present in
107 107 sys.argv or files in the user's various directories.
108 108 """
109 109
110 110 name = u'ipython'
111 111 description = 'IPython: an enhanced interactive Python shell.'
112 112 #: usage message printed by argparse. If None, auto-generate
113 113 usage = None
114 114 config_file_name = u'ipython_config.py'
115 115 #: Track the default and actual separately because some messages are
116 116 #: only printed if we aren't using the default.
117 117 default_config_file_name = config_file_name
118 118 default_log_level = logging.WARN
119 119 #: Set by --profile option
120 120 profile_name = None
121 121 #: User's ipython directory, typically ~/.ipython/
122 122 ipython_dir = None
123 123 #: internal defaults, implemented in code.
124 124 default_config = None
125 125 #: read from the filesystem
126 126 file_config = None
127 127 #: read from the system's command line flags
128 128 command_line_config = None
129 129 #: passed parametrically to the constructor.
130 130 constructor_config = None
131 131 #: final override, if given supercedes file/command/constructor configs
132 132 override_config = None
133 133 #: A reference to the argv to be used (typically ends up being sys.argv[1:])
134 134 argv = None
135 135 #: Default command line arguments. Subclasses should create a new tuple
136 136 #: that *includes* these.
137 137 cl_arguments = app_cl_args
138 138
139 139 #: extra arguments computed by the command-line loader
140 140 extra_args = None
141 141
142 142 # Private attributes
143 143 _exiting = False
144 144 _initialized = False
145 145
146 146 # Class choices for things that will be instantiated at runtime.
147 147 _CrashHandler = crashhandler.CrashHandler
148 148
149 149 def __init__(self, argv=None, constructor_config=None, override_config=None):
150 150 self.argv = sys.argv[1:] if argv is None else argv
151 151 self.constructor_config = constructor_config
152 152 self.override_config = override_config
153 153 self.init_logger()
154 154
155 155 def init_logger(self):
156 156 self.log = logging.getLogger(self.__class__.__name__)
157 157 # This is used as the default until the command line arguments are read.
158 158 self.log.setLevel(self.default_log_level)
159 159 self._log_handler = logging.StreamHandler()
160 160 self._log_formatter = logging.Formatter("[%(name)s] %(message)s")
161 161 self._log_handler.setFormatter(self._log_formatter)
162 162 self.log.addHandler(self._log_handler)
163 163
164 164 def _set_log_level(self, level):
165 165 self.log.setLevel(level)
166 166
167 167 def _get_log_level(self):
168 168 return self.log.level
169 169
170 170 log_level = property(_get_log_level, _set_log_level)
171 171
172 172 def initialize(self):
173 173 """Initialize the application.
174 174
175 175 Loads all configuration information and sets all application state, but
176 176 does not start any relevant processing (typically some kind of event
177 177 loop).
178 178
179 179 Once this method has been called, the application is flagged as
180 180 initialized and the method becomes a no-op."""
181 181
182 182 if self._initialized:
183 183 return
184 184
185 185 # The first part is protected with an 'attempt' wrapper, that will log
186 186 # failures with the basic system traceback machinery. Once our crash
187 187 # handler is in place, we can let any subsequent exception propagate,
188 188 # as our handler will log it with much better detail than the default.
189 189 self.attempt(self.create_crash_handler)
190 190
191 191 # Configuration phase
192 192 # Default config (internally hardwired in application code)
193 193 self.create_default_config()
194 194 self.log_default_config()
195 195 self.set_default_config_log_level()
196 196
197 197 if self.override_config is None:
198 198 # Command-line config
199 199 self.pre_load_command_line_config()
200 200 self.load_command_line_config()
201 201 self.set_command_line_config_log_level()
202 202 self.post_load_command_line_config()
203 203 self.log_command_line_config()
204 204
205 205 # Find resources needed for filesystem access, using information from
206 206 # the above two
207 207 self.find_ipython_dir()
208 208 self.find_resources()
209 209 self.find_config_file_name()
210 210 self.find_config_file_paths()
211 211
212 212 if self.override_config is None:
213 213 # File-based config
214 214 self.pre_load_file_config()
215 215 self.load_file_config()
216 216 self.set_file_config_log_level()
217 217 self.post_load_file_config()
218 218 self.log_file_config()
219 219
220 220 # Merge all config objects into a single one the app can then use
221 221 self.merge_configs()
222 222 self.log_master_config()
223 223
224 224 # Construction phase
225 225 self.pre_construct()
226 226 self.construct()
227 227 self.post_construct()
228 228
229 229 # Done, flag as such and
230 230 self._initialized = True
231 231
232 232 def start(self):
233 233 """Start the application."""
234 234 self.initialize()
235 235 self.start_app()
236 236
237 237 #-------------------------------------------------------------------------
238 238 # Various stages of Application creation
239 239 #-------------------------------------------------------------------------
240 240
241 241 def create_crash_handler(self):
242 242 """Create a crash handler, typically setting sys.excepthook to it."""
243 243 self.crash_handler = self._CrashHandler(self, self.name)
244 244 sys.excepthook = self.crash_handler
245 245
246 246 def create_default_config(self):
247 247 """Create defaults that can't be set elsewhere.
248 248
249 249 For the most part, we try to set default in the class attributes
250 250 of Components. But, defaults the top-level Application (which is
251 251 not a HasTraitlets or Component) are not set in this way. Instead
252 252 we set them here. The Global section is for variables like this that
253 253 don't belong to a particular component.
254 254 """
255 255 c = Config()
256 256 c.Global.ipython_dir = get_ipython_dir()
257 257 c.Global.log_level = self.log_level
258 258 self.default_config = c
259 259
260 260 def log_default_config(self):
261 261 self.log.debug('Default config loaded:')
262 262 self.log.debug(repr(self.default_config))
263 263
264 264 def set_default_config_log_level(self):
265 265 try:
266 266 self.log_level = self.default_config.Global.log_level
267 267 except AttributeError:
268 268 # Fallback to the default_log_level class attribute
269 269 pass
270 270
271 271 def create_command_line_config(self):
272 272 """Create and return a command line config loader."""
273 273 return ArgParseConfigLoader(self.argv, self.cl_arguments,
274 274 description=self.description,
275 275 version=release.version,
276 276 usage=self.usage,
277 277 )
278 278
279 279 def pre_load_command_line_config(self):
280 280 """Do actions just before loading the command line config."""
281 281 pass
282 282
283 283 def load_command_line_config(self):
284 284 """Load the command line config."""
285 285 loader = self.create_command_line_config()
286 286 self.command_line_config = loader.load_config()
287 287 self.extra_args = loader.get_extra_args()
288 288
289 289 def set_command_line_config_log_level(self):
290 290 try:
291 291 self.log_level = self.command_line_config.Global.log_level
292 292 except AttributeError:
293 293 pass
294 294
295 295 def post_load_command_line_config(self):
296 296 """Do actions just after loading the command line config."""
297 297 pass
298 298
299 299 def log_command_line_config(self):
300 300 self.log.debug("Command line config loaded:")
301 301 self.log.debug(repr(self.command_line_config))
302 302
303 303 def find_ipython_dir(self):
304 304 """Set the IPython directory.
305 305
306 306 This sets ``self.ipython_dir``, but the actual value that is passed to
307 307 the application is kept in either ``self.default_config`` or
308 308 ``self.command_line_config``. This also adds ``self.ipython_dir`` to
309 309 ``sys.path`` so config files there can be referenced by other config
310 310 files.
311 311 """
312 312
313 313 try:
314 314 self.ipython_dir = self.command_line_config.Global.ipython_dir
315 315 except AttributeError:
316 316 self.ipython_dir = self.default_config.Global.ipython_dir
317 317 sys.path.append(os.path.abspath(self.ipython_dir))
318 318 if not os.path.isdir(self.ipython_dir):
319 319 os.makedirs(self.ipython_dir, mode=0777)
320 320 self.log.debug("IPYTHON_DIR set to: %s" % self.ipython_dir)
321 321
322 322 def find_resources(self):
323 323 """Find other resources that need to be in place.
324 324
325 325 Things like cluster directories need to be in place to find the
326 326 config file. These happen right after the IPython directory has
327 327 been set.
328 328 """
329 329 pass
330 330
331 331 def find_config_file_name(self):
332 332 """Find the config file name for this application.
333 333
334 334 This must set ``self.config_file_name`` to the filename of the
335 335 config file to use (just the filename). The search paths for the
336 336 config file are set in :meth:`find_config_file_paths` and then passed
337 337 to the config file loader where they are resolved to an absolute path.
338 338
339 339 If a profile has been set at the command line, this will resolve it.
340 340 """
341 341
342 342 try:
343 343 self.config_file_name = self.command_line_config.Global.config_file
344 344 except AttributeError:
345 345 pass
346 346
347 347 try:
348 348 self.profile_name = self.command_line_config.Global.profile
349 349 except AttributeError:
350 350 pass
351 351 else:
352 352 name_parts = self.config_file_name.split('.')
353 353 name_parts.insert(1, u'_' + self.profile_name + u'.')
354 354 self.config_file_name = ''.join(name_parts)
355 355
356 356 def find_config_file_paths(self):
357 357 """Set the search paths for resolving the config file.
358 358
359 359 This must set ``self.config_file_paths`` to a sequence of search
360 360 paths to pass to the config file loader.
361 361 """
362 362 # Include our own profiles directory last, so that users can still find
363 363 # our shipped copies of builtin profiles even if they don't have them
364 364 # in their local ipython directory.
365 365 prof_dir = os.path.join(get_ipython_package_dir(), 'config', 'profile')
366 366 self.config_file_paths = (os.getcwd(), self.ipython_dir, prof_dir)
367 367
368 368 def pre_load_file_config(self):
369 369 """Do actions before the config file is loaded."""
370 370 pass
371 371
372 372 def load_file_config(self):
373 373 """Load the config file.
374 374
375 375 This tries to load the config file from disk. If successful, the
376 376 ``CONFIG_FILE`` config variable is set to the resolved config file
377 377 location. If not successful, an empty config is used.
378 378 """
379 379 self.log.debug("Attempting to load config file: %s" %
380 380 self.config_file_name)
381 381 loader = PyFileConfigLoader(self.config_file_name,
382 382 path=self.config_file_paths)
383 383 try:
384 384 self.file_config = loader.load_config()
385 385 self.file_config.Global.config_file = loader.full_filename
386 386 except IOError:
387 387 # Only warn if the default config file was NOT being used.
388 388 if not self.config_file_name==self.default_config_file_name:
389 389 self.log.warn("Config file not found, skipping: %s" %
390 390 self.config_file_name, exc_info=True)
391 391 self.file_config = Config()
392 392 except:
393 393 self.log.warn("Error loading config file: %s" %
394 394 self.config_file_name, exc_info=True)
395 395 self.file_config = Config()
396 396
397 397 def set_file_config_log_level(self):
398 398 # We need to keeep self.log_level updated. But we only use the value
399 399 # of the file_config if a value was not specified at the command
400 400 # line, because the command line overrides everything.
401 401 if not hasattr(self.command_line_config.Global, 'log_level'):
402 402 try:
403 403 self.log_level = self.file_config.Global.log_level
404 404 except AttributeError:
405 405 pass # Use existing value
406 406
407 407 def post_load_file_config(self):
408 408 """Do actions after the config file is loaded."""
409 409 pass
410 410
411 411 def log_file_config(self):
412 412 if hasattr(self.file_config.Global, 'config_file'):
413 413 self.log.debug("Config file loaded: %s" %
414 414 self.file_config.Global.config_file)
415 415 self.log.debug(repr(self.file_config))
416 416
417 417 def merge_configs(self):
418 418 """Merge the default, command line and file config objects."""
419 419 config = Config()
420 420 config._merge(self.default_config)
421 421 if self.override_config is None:
422 422 config._merge(self.file_config)
423 423 config._merge(self.command_line_config)
424 424 if self.constructor_config is not None:
425 425 config._merge(self.constructor_config)
426 426 else:
427 427 config._merge(self.override_config)
428 428 # XXX fperez - propose to Brian we rename master_config to simply
429 429 # config, I think this is going to be heavily used in examples and
430 430 # application code and the name is shorter/easier to find/remember.
431 431 # For now, just alias it...
432 432 self.master_config = config
433 433 self.config = config
434 434
435 435 def log_master_config(self):
436 436 self.log.debug("Master config created:")
437 437 self.log.debug(repr(self.master_config))
438 438
439 439 def pre_construct(self):
440 440 """Do actions after the config has been built, but before construct."""
441 441 pass
442 442
443 443 def construct(self):
444 444 """Construct the main components that make up this app."""
445 445 self.log.debug("Constructing components for application")
446 446
447 447 def post_construct(self):
448 448 """Do actions after construct, but before starting the app."""
449 449 pass
450 450
451 451 def start_app(self):
452 452 """Actually start the app."""
453 453 self.log.debug("Starting application")
454 454
455 455 #-------------------------------------------------------------------------
456 456 # Utility methods
457 457 #-------------------------------------------------------------------------
458 458
459 459 def abort(self):
460 460 """Abort the starting of the application."""
461 461 if self._exiting:
462 462 pass
463 463 else:
464 464 self.log.critical("Aborting application: %s" % self.name, exc_info=True)
465 465 self._exiting = True
466 466 sys.exit(1)
467 467
468 468 def exit(self, exit_status=0):
469 469 if self._exiting:
470 470 pass
471 471 else:
472 472 self.log.debug("Exiting application: %s" % self.name)
473 473 self._exiting = True
474 474 sys.exit(exit_status)
475 475
476 476 def attempt(self, func, action='abort'):
477 477 try:
478 478 func()
479 479 except SystemExit:
480 480 raise
481 481 except:
482 482 if action == 'abort':
483 483 self.log.critical("Aborting application: %s" % self.name,
484 484 exc_info=True)
485 485 self.abort()
486 486 raise
487 487 elif action == 'exit':
488 488 self.exit(0)
489 489
@@ -1,658 +1,658 b''
1 1 """Word completion for IPython.
2 2
3 3 This module is a fork of the rlcompleter module in the Python standard
4 4 library. The original enhancements made to rlcompleter have been sent
5 5 upstream and were accepted as of Python 2.3, but we need a lot more
6 6 functionality specific to IPython, so this module will continue to live as an
7 7 IPython-specific utility.
8 8
9 9 Original rlcompleter documentation:
10 10
11 11 This requires the latest extension to the readline module (the
12 12 completes keywords, built-ins and globals in __main__; when completing
13 13 NAME.NAME..., it evaluates (!) the expression up to the last dot and
14 14 completes its attributes.
15 15
16 16 It's very cool to do "import string" type "string.", hit the
17 17 completion key (twice), and see the list of names defined by the
18 18 string module!
19 19
20 20 Tip: to use the tab key as the completion key, call
21 21
22 22 readline.parse_and_bind("tab: complete")
23 23
24 24 Notes:
25 25
26 26 - Exceptions raised by the completer function are *ignored* (and
27 27 generally cause the completion to fail). This is a feature -- since
28 28 readline sets the tty device in raw (or cbreak) mode, printing a
29 29 traceback wouldn't work well without some complicated hoopla to save,
30 30 reset and restore the tty state.
31 31
32 32 - The evaluation of the NAME.NAME... form may cause arbitrary
33 33 application defined code to be executed if an object with a
34 34 __getattr__ hook is found. Since it is the responsibility of the
35 35 application (or the user) to enable this feature, I consider this an
36 36 acceptable risk. More complicated expressions (e.g. function calls or
37 37 indexing operations) are *not* evaluated.
38 38
39 39 - GNU readline is also used by the built-in functions input() and
40 40 raw_input(), and thus these also benefit/suffer from the completer
41 41 features. Clearly an interactive application can benefit by
42 42 specifying its own completer function and using raw_input() for all
43 43 its input.
44 44
45 45 - When the original stdin is not a tty device, GNU readline is never
46 46 used, and this module (and the readline module) are silently inactive.
47 47 """
48 48
49 49 #*****************************************************************************
50 50 #
51 51 # Since this file is essentially a minimally modified copy of the rlcompleter
52 52 # module which is part of the standard Python distribution, I assume that the
53 53 # proper procedure is to maintain its copyright as belonging to the Python
54 54 # Software Foundation (in addition to my own, for all new code).
55 55 #
56 56 # Copyright (C) 2008-2010 IPython Development Team
57 57 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
58 58 # Copyright (C) 2001 Python Software Foundation, www.python.org
59 59 #
60 60 # Distributed under the terms of the BSD License. The full license is in
61 61 # the file COPYING, distributed as part of this software.
62 62 #
63 63 #*****************************************************************************
64 64
65 65 #-----------------------------------------------------------------------------
66 66 # Imports
67 67 #-----------------------------------------------------------------------------
68 68
69 69 import __builtin__
70 70 import __main__
71 71 import glob
72 import inspect
72 73 import itertools
73 74 import keyword
74 75 import os
75 76 import re
76 77 import shlex
77 78 import sys
78 import types
79 79
80 import IPython.utils.rlineimpl as readline
81 80 from IPython.core.error import TryNext
82 81 from IPython.core.prefilter import ESC_MAGIC
83 82 from IPython.utils import generics
84 from IPython.utils.genutils import debugx, dir2
83 from IPython.utils.frame import debugx
84 from IPython.utils.dir2 import dir2
85 import IPython.utils.rlineimpl as readline
85 86
86 87 #-----------------------------------------------------------------------------
87 88 # Globals
88 89 #-----------------------------------------------------------------------------
89 90
90 91 # Public API
91 92 __all__ = ['Completer','IPCompleter']
92 93
93 94 if sys.platform == 'win32':
94 95 PROTECTABLES = ' '
95 96 else:
96 97 PROTECTABLES = ' ()'
97 98
98 99 #-----------------------------------------------------------------------------
99 100 # Main functions and classes
100 101 #-----------------------------------------------------------------------------
101 102
102 103 def protect_filename(s):
103 104 """Escape a string to protect certain characters."""
104 105
105 106 return "".join([(ch in PROTECTABLES and '\\' + ch or ch)
106 107 for ch in s])
107 108
108 109
109 110 def single_dir_expand(matches):
110 111 "Recursively expand match lists containing a single dir."
111 112
112 113 if len(matches) == 1 and os.path.isdir(matches[0]):
113 114 # Takes care of links to directories also. Use '/'
114 115 # explicitly, even under Windows, so that name completions
115 116 # don't end up escaped.
116 117 d = matches[0]
117 118 if d[-1] in ['/','\\']:
118 119 d = d[:-1]
119 120
120 121 subdirs = os.listdir(d)
121 122 if subdirs:
122 123 matches = [ (d + '/' + p) for p in subdirs]
123 124 return single_dir_expand(matches)
124 125 else:
125 126 return matches
126 127 else:
127 128 return matches
128 129
129 130 class Bunch: pass
130 131
131 132 class Completer:
132 133 def __init__(self,namespace=None,global_namespace=None):
133 134 """Create a new completer for the command line.
134 135
135 136 Completer([namespace,global_namespace]) -> completer instance.
136 137
137 138 If unspecified, the default namespace where completions are performed
138 139 is __main__ (technically, __main__.__dict__). Namespaces should be
139 140 given as dictionaries.
140 141
141 142 An optional second namespace can be given. This allows the completer
142 143 to handle cases where both the local and global scopes need to be
143 144 distinguished.
144 145
145 146 Completer instances should be used as the completion mechanism of
146 147 readline via the set_completer() call:
147 148
148 149 readline.set_completer(Completer(my_namespace).complete)
149 150 """
150 151
151 152 # Don't bind to namespace quite yet, but flag whether the user wants a
152 153 # specific namespace or to use __main__.__dict__. This will allow us
153 154 # to bind to __main__.__dict__ at completion time, not now.
154 155 if namespace is None:
155 156 self.use_main_ns = 1
156 157 else:
157 158 self.use_main_ns = 0
158 159 self.namespace = namespace
159 160
160 161 # The global namespace, if given, can be bound directly
161 162 if global_namespace is None:
162 163 self.global_namespace = {}
163 164 else:
164 165 self.global_namespace = global_namespace
165 166
166 167 def complete(self, text, state):
167 168 """Return the next possible completion for 'text'.
168 169
169 170 This is called successively with state == 0, 1, 2, ... until it
170 171 returns None. The completion should begin with 'text'.
171 172
172 173 """
173 174 if self.use_main_ns:
174 175 self.namespace = __main__.__dict__
175 176
176 177 if state == 0:
177 178 if "." in text:
178 179 self.matches = self.attr_matches(text)
179 180 else:
180 181 self.matches = self.global_matches(text)
181 182 try:
182 183 return self.matches[state]
183 184 except IndexError:
184 185 return None
185 186
186 187 def global_matches(self, text):
187 188 """Compute matches when text is a simple name.
188 189
189 190 Return a list of all keywords, built-in functions and names currently
190 191 defined in self.namespace or self.global_namespace that match.
191 192
192 193 """
193 194 #print 'Completer->global_matches, txt=%r' % text # dbg
194 195 matches = []
195 196 match_append = matches.append
196 197 n = len(text)
197 198 for lst in [keyword.kwlist,
198 199 __builtin__.__dict__.keys(),
199 200 self.namespace.keys(),
200 201 self.global_namespace.keys()]:
201 202 for word in lst:
202 203 if word[:n] == text and word != "__builtins__":
203 204 match_append(word)
204 205 return matches
205 206
206 207 def attr_matches(self, text):
207 208 """Compute matches when text contains a dot.
208 209
209 210 Assuming the text is of the form NAME.NAME....[NAME], and is
210 211 evaluatable in self.namespace or self.global_namespace, it will be
211 212 evaluated and its attributes (as revealed by dir()) are used as
212 213 possible completions. (For class instances, class members are are
213 214 also considered.)
214 215
215 216 WARNING: this can still invoke arbitrary C code, if an object
216 217 with a __getattr__ hook is evaluated.
217 218
218 219 """
219 import re
220 220
221 221 #print 'Completer->attr_matches, txt=%r' % text # dbg
222 222 # Another option, seems to work great. Catches things like ''.<tab>
223 223 m = re.match(r"(\S+(\.\w+)*)\.(\w*)$", text)
224 224
225 225 if not m:
226 226 return []
227 227
228 228 expr, attr = m.group(1, 3)
229 229 try:
230 230 obj = eval(expr, self.namespace)
231 231 except:
232 232 try:
233 233 obj = eval(expr, self.global_namespace)
234 234 except:
235 235 return []
236 236
237 237 words = dir2(obj)
238 238
239 239 try:
240 240 words = generics.complete_object(obj, words)
241 241 except TryNext:
242 242 pass
243 243 # Build match list to return
244 244 n = len(attr)
245 245 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
246 246 return res
247 247
248 248
249 249 class IPCompleter(Completer):
250 250 """Extension of the completer class with IPython-specific features"""
251 251
252 252 def __init__(self,shell,namespace=None,global_namespace=None,
253 253 omit__names=0,alias_table=None):
254 254 """IPCompleter() -> completer
255 255
256 256 Return a completer object suitable for use by the readline library
257 257 via readline.set_completer().
258 258
259 259 Inputs:
260 260
261 261 - shell: a pointer to the ipython shell itself. This is needed
262 262 because this completer knows about magic functions, and those can
263 263 only be accessed via the ipython instance.
264 264
265 265 - namespace: an optional dict where completions are performed.
266 266
267 267 - global_namespace: secondary optional dict for completions, to
268 268 handle cases (such as IPython embedded inside functions) where
269 269 both Python scopes are visible.
270 270
271 271 - The optional omit__names parameter sets the completer to omit the
272 272 'magic' names (__magicname__) for python objects unless the text
273 273 to be completed explicitly starts with one or more underscores.
274 274
275 275 - If alias_table is supplied, it should be a dictionary of aliases
276 276 to complete. """
277 277
278 278 Completer.__init__(self,namespace,global_namespace)
279 279
280 280 self.magic_escape = ESC_MAGIC
281 281 self.readline = readline
282 282 delims = self.readline.get_completer_delims()
283 283 delims = delims.replace(self.magic_escape,'')
284 284 self.readline.set_completer_delims(delims)
285 285 self.get_line_buffer = self.readline.get_line_buffer
286 286 self.get_endidx = self.readline.get_endidx
287 287 self.omit__names = omit__names
288 288 self.merge_completions = shell.readline_merge_completions
289 289 self.shell = shell.shell
290 290 if alias_table is None:
291 291 alias_table = {}
292 292 self.alias_table = alias_table
293 293 # Regexp to split filenames with spaces in them
294 294 self.space_name_re = re.compile(r'([^\\] )')
295 295 # Hold a local ref. to glob.glob for speed
296 296 self.glob = glob.glob
297 297
298 298 # Determine if we are running on 'dumb' terminals, like (X)Emacs
299 299 # buffers, to avoid completion problems.
300 300 term = os.environ.get('TERM','xterm')
301 301 self.dumb_terminal = term in ['dumb','emacs']
302 302
303 303 # Special handling of backslashes needed in win32 platforms
304 304 if sys.platform == "win32":
305 305 self.clean_glob = self._clean_glob_win32
306 306 else:
307 307 self.clean_glob = self._clean_glob
308 308
309 309 # All active matcher routines for completion
310 310 self.matchers = [self.python_matches,
311 311 self.file_matches,
312 312 self.magic_matches,
313 313 self.alias_matches,
314 314 self.python_func_kw_matches]
315 315
316 316 # Code contributed by Alex Schmolck, for ipython/emacs integration
317 317 def all_completions(self, text):
318 318 """Return all possible completions for the benefit of emacs."""
319 319
320 320 completions = []
321 321 comp_append = completions.append
322 322 try:
323 323 for i in xrange(sys.maxint):
324 324 res = self.complete(text, i)
325 325 if not res:
326 326 break
327 327 comp_append(res)
328 328 #XXX workaround for ``notDefined.<tab>``
329 329 except NameError:
330 330 pass
331 331 return completions
332 332 # /end Alex Schmolck code.
333 333
334 334 def _clean_glob(self,text):
335 335 return self.glob("%s*" % text)
336 336
337 337 def _clean_glob_win32(self,text):
338 338 return [f.replace("\\","/")
339 339 for f in self.glob("%s*" % text)]
340 340
341 341 def file_matches(self, text):
342 342 """Match filenames, expanding ~USER type strings.
343 343
344 344 Most of the seemingly convoluted logic in this completer is an
345 345 attempt to handle filenames with spaces in them. And yet it's not
346 346 quite perfect, because Python's readline doesn't expose all of the
347 347 GNU readline details needed for this to be done correctly.
348 348
349 349 For a filename with a space in it, the printed completions will be
350 350 only the parts after what's already been typed (instead of the
351 351 full completions, as is normally done). I don't think with the
352 352 current (as of Python 2.3) Python readline it's possible to do
353 353 better."""
354 354
355 355 #print 'Completer->file_matches: <%s>' % text # dbg
356 356
357 357 # chars that require escaping with backslash - i.e. chars
358 358 # that readline treats incorrectly as delimiters, but we
359 359 # don't want to treat as delimiters in filename matching
360 360 # when escaped with backslash
361 361
362 362 if text.startswith('!'):
363 363 text = text[1:]
364 364 text_prefix = '!'
365 365 else:
366 366 text_prefix = ''
367 367
368 368 lbuf = self.lbuf
369 369 open_quotes = 0 # track strings with open quotes
370 370 try:
371 371 lsplit = shlex.split(lbuf)[-1]
372 372 except ValueError:
373 373 # typically an unmatched ", or backslash without escaped char.
374 374 if lbuf.count('"')==1:
375 375 open_quotes = 1
376 376 lsplit = lbuf.split('"')[-1]
377 377 elif lbuf.count("'")==1:
378 378 open_quotes = 1
379 379 lsplit = lbuf.split("'")[-1]
380 380 else:
381 381 return []
382 382 except IndexError:
383 383 # tab pressed on empty line
384 384 lsplit = ""
385 385
386 386 if lsplit != protect_filename(lsplit):
387 387 # if protectables are found, do matching on the whole escaped
388 388 # name
389 389 has_protectables = 1
390 390 text0,text = text,lsplit
391 391 else:
392 392 has_protectables = 0
393 393 text = os.path.expanduser(text)
394 394
395 395 if text == "":
396 396 return [text_prefix + protect_filename(f) for f in self.glob("*")]
397 397
398 398 m0 = self.clean_glob(text.replace('\\',''))
399 399 if has_protectables:
400 400 # If we had protectables, we need to revert our changes to the
401 401 # beginning of filename so that we don't double-write the part
402 402 # of the filename we have so far
403 403 len_lsplit = len(lsplit)
404 404 matches = [text_prefix + text0 +
405 405 protect_filename(f[len_lsplit:]) for f in m0]
406 406 else:
407 407 if open_quotes:
408 408 # if we have a string with an open quote, we don't need to
409 409 # protect the names at all (and we _shouldn't_, as it
410 410 # would cause bugs when the filesystem call is made).
411 411 matches = m0
412 412 else:
413 413 matches = [text_prefix +
414 414 protect_filename(f) for f in m0]
415 415
416 416 #print 'mm',matches # dbg
417 417 return single_dir_expand(matches)
418 418
419 419 def magic_matches(self, text):
420 420 """Match magics"""
421 421 #print 'Completer->magic_matches:',text,'lb',self.lbuf # dbg
422 422 # Get all shell magics now rather than statically, so magics loaded at
423 423 # runtime show up too
424 424 magics = self.shell.lsmagic()
425 425 pre = self.magic_escape
426 426 baretext = text.lstrip(pre)
427 427 return [ pre+m for m in magics if m.startswith(baretext)]
428 428
429 429 def alias_matches(self, text):
430 430 """Match internal system aliases"""
431 431 #print 'Completer->alias_matches:',text,'lb',self.lbuf # dbg
432 432
433 433 # if we are not in the first 'item', alias matching
434 434 # doesn't make sense - unless we are starting with 'sudo' command.
435 435 if ' ' in self.lbuf.lstrip() and \
436 436 not self.lbuf.lstrip().startswith('sudo'):
437 437 return []
438 438 text = os.path.expanduser(text)
439 439 aliases = self.alias_table.keys()
440 440 if text == "":
441 441 return aliases
442 442 else:
443 443 return [alias for alias in aliases if alias.startswith(text)]
444 444
445 445 def python_matches(self,text):
446 446 """Match attributes or global python names"""
447 447
448 448 #print 'Completer->python_matches, txt=%r' % text # dbg
449 449 if "." in text:
450 450 try:
451 451 matches = self.attr_matches(text)
452 452 if text.endswith('.') and self.omit__names:
453 453 if self.omit__names == 1:
454 454 # true if txt is _not_ a __ name, false otherwise:
455 455 no__name = (lambda txt:
456 456 re.match(r'.*\.__.*?__',txt) is None)
457 457 else:
458 458 # true if txt is _not_ a _ name, false otherwise:
459 459 no__name = (lambda txt:
460 460 re.match(r'.*\._.*?',txt) is None)
461 461 matches = filter(no__name, matches)
462 462 except NameError:
463 463 # catches <undefined attributes>.<tab>
464 464 matches = []
465 465 else:
466 466 matches = self.global_matches(text)
467 467
468 468 return matches
469 469
470 470 def _default_arguments(self, obj):
471 471 """Return the list of default arguments of obj if it is callable,
472 472 or empty list otherwise."""
473 473
474 474 if not (inspect.isfunction(obj) or inspect.ismethod(obj)):
475 475 # for classes, check for __init__,__new__
476 476 if inspect.isclass(obj):
477 477 obj = (getattr(obj,'__init__',None) or
478 478 getattr(obj,'__new__',None))
479 479 # for all others, check if they are __call__able
480 480 elif hasattr(obj, '__call__'):
481 481 obj = obj.__call__
482 482 # XXX: is there a way to handle the builtins ?
483 483 try:
484 484 args,_,_1,defaults = inspect.getargspec(obj)
485 485 if defaults:
486 486 return args[-len(defaults):]
487 487 except TypeError: pass
488 488 return []
489 489
490 490 def python_func_kw_matches(self,text):
491 491 """Match named parameters (kwargs) of the last open function"""
492 492
493 493 if "." in text: # a parameter cannot be dotted
494 494 return []
495 495 try: regexp = self.__funcParamsRegex
496 496 except AttributeError:
497 497 regexp = self.__funcParamsRegex = re.compile(r'''
498 498 '.*?' | # single quoted strings or
499 499 ".*?" | # double quoted strings or
500 500 \w+ | # identifier
501 501 \S # other characters
502 502 ''', re.VERBOSE | re.DOTALL)
503 503 # 1. find the nearest identifier that comes before an unclosed
504 504 # parenthesis e.g. for "foo (1+bar(x), pa", the candidate is "foo"
505 505 tokens = regexp.findall(self.get_line_buffer())
506 506 tokens.reverse()
507 507 iterTokens = iter(tokens); openPar = 0
508 508 for token in iterTokens:
509 509 if token == ')':
510 510 openPar -= 1
511 511 elif token == '(':
512 512 openPar += 1
513 513 if openPar > 0:
514 514 # found the last unclosed parenthesis
515 515 break
516 516 else:
517 517 return []
518 518 # 2. Concatenate dotted names ("foo.bar" for "foo.bar(x, pa" )
519 519 ids = []
520 520 isId = re.compile(r'\w+$').match
521 521 while True:
522 522 try:
523 523 ids.append(iterTokens.next())
524 524 if not isId(ids[-1]):
525 525 ids.pop(); break
526 526 if not iterTokens.next() == '.':
527 527 break
528 528 except StopIteration:
529 529 break
530 530 # lookup the candidate callable matches either using global_matches
531 531 # or attr_matches for dotted names
532 532 if len(ids) == 1:
533 533 callableMatches = self.global_matches(ids[0])
534 534 else:
535 535 callableMatches = self.attr_matches('.'.join(ids[::-1]))
536 536 argMatches = []
537 537 for callableMatch in callableMatches:
538 538 try:
539 539 namedArgs = self._default_arguments(eval(callableMatch,
540 540 self.namespace))
541 541 except:
542 542 continue
543 543 for namedArg in namedArgs:
544 544 if namedArg.startswith(text):
545 545 argMatches.append("%s=" %namedArg)
546 546 return argMatches
547 547
548 548 def dispatch_custom_completer(self,text):
549 549 #print "Custom! '%s' %s" % (text, self.custom_completers) # dbg
550 550 line = self.full_lbuf
551 551 if not line.strip():
552 552 return None
553 553
554 554 event = Bunch()
555 555 event.line = line
556 556 event.symbol = text
557 557 cmd = line.split(None,1)[0]
558 558 event.command = cmd
559 559 #print "\ncustom:{%s]\n" % event # dbg
560 560
561 561 # for foo etc, try also to find completer for %foo
562 562 if not cmd.startswith(self.magic_escape):
563 563 try_magic = self.custom_completers.s_matches(
564 564 self.magic_escape + cmd)
565 565 else:
566 566 try_magic = []
567 567
568 568 for c in itertools.chain(self.custom_completers.s_matches(cmd),
569 569 try_magic,
570 570 self.custom_completers.flat_matches(self.lbuf)):
571 571 #print "try",c # dbg
572 572 try:
573 573 res = c(event)
574 574 # first, try case sensitive match
575 575 withcase = [r for r in res if r.startswith(text)]
576 576 if withcase:
577 577 return withcase
578 578 # if none, then case insensitive ones are ok too
579 579 text_low = text.lower()
580 580 return [r for r in res if r.lower().startswith(text_low)]
581 581 except TryNext:
582 582 pass
583 583
584 584 return None
585 585
586 586 def complete(self, text, state,line_buffer=None):
587 587 """Return the next possible completion for 'text'.
588 588
589 589 This is called successively with state == 0, 1, 2, ... until it
590 590 returns None. The completion should begin with 'text'.
591 591
592 592 :Keywords:
593 593 - line_buffer: string
594 594 If not given, the completer attempts to obtain the current line buffer
595 595 via readline. This keyword allows clients which are requesting for
596 596 text completions in non-readline contexts to inform the completer of
597 597 the entire text.
598 598 """
599 599
600 600 #print '\n*** COMPLETE: <%s> (%s)' % (text,state) # dbg
601 601
602 602 # if there is only a tab on a line with only whitespace, instead
603 603 # of the mostly useless 'do you want to see all million
604 604 # completions' message, just do the right thing and give the user
605 605 # his tab! Incidentally, this enables pasting of tabbed text from
606 606 # an editor (as long as autoindent is off).
607 607
608 608 # It should be noted that at least pyreadline still shows
609 609 # file completions - is there a way around it?
610 610
611 611 # don't apply this on 'dumb' terminals, such as emacs buffers, so we
612 612 # don't interfere with their own tab-completion mechanism.
613 613 if line_buffer is None:
614 614 self.full_lbuf = self.get_line_buffer()
615 615 else:
616 616 self.full_lbuf = line_buffer
617 617
618 618 if not (self.dumb_terminal or self.full_lbuf.strip()):
619 619 self.readline.insert_text('\t')
620 620 return None
621 621
622 622 magic_escape = self.magic_escape
623 623
624 624 self.lbuf = self.full_lbuf[:self.get_endidx()]
625 625
626 626 try:
627 627 if text.startswith('~'):
628 628 text = os.path.expanduser(text)
629 629 if state == 0:
630 630 custom_res = self.dispatch_custom_completer(text)
631 631 if custom_res is not None:
632 632 # did custom completers produce something?
633 633 self.matches = custom_res
634 634 else:
635 635 # Extend the list of completions with the results of each
636 636 # matcher, so we return results to the user from all
637 637 # namespaces.
638 638 if self.merge_completions:
639 639 self.matches = []
640 640 for matcher in self.matchers:
641 641 self.matches.extend(matcher(text))
642 642 else:
643 643 for matcher in self.matchers:
644 644 self.matches = matcher(text)
645 645 if self.matches:
646 646 break
647 647 self.matches = list(set(self.matches))
648 648 try:
649 649 #print "MATCH: %r" % self.matches[state] # dbg
650 650 return self.matches[state]
651 651 except IndexError:
652 652 return None
653 653 except:
654 654 #from IPython.core.ultratb import AutoFormattedTB; # dbg
655 655 #tb=AutoFormattedTB('Verbose');tb() #dbg
656 656
657 657 # If completion fails, don't annoy the user.
658 658 return None
@@ -1,346 +1,346 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 A lightweight component system for IPython.
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 * Fernando Perez
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2009 The IPython Development Team
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 from copy import deepcopy
24 24 import datetime
25 25 from weakref import WeakValueDictionary
26 26
27 27 from IPython.utils.importstring import import_item
28 28 from IPython.config.loader import Config
29 29 from IPython.utils.traitlets import (
30 HasTraitlets, TraitletError, MetaHasTraitlets, Instance, This
30 HasTraitlets, MetaHasTraitlets, Instance, This
31 31 )
32 32
33 33
34 34 #-----------------------------------------------------------------------------
35 35 # Helper classes for Components
36 36 #-----------------------------------------------------------------------------
37 37
38 38
39 39 class ComponentError(Exception):
40 40 pass
41 41
42 42 class MetaComponentTracker(type):
43 43 """A metaclass that tracks instances of Components and its subclasses."""
44 44
45 45 def __init__(cls, name, bases, d):
46 46 super(MetaComponentTracker, cls).__init__(name, bases, d)
47 47 cls.__instance_refs = WeakValueDictionary()
48 48 cls.__numcreated = 0
49 49
50 50 def __call__(cls, *args, **kw):
51 51 """Called when a class is called (instantiated)!!!
52 52
53 53 When a Component or subclass is instantiated, this is called and
54 54 the instance is saved in a WeakValueDictionary for tracking.
55 55 """
56 56 instance = cls.__new__(cls, *args, **kw)
57 57
58 58 # Register the instance before __init__ is called so get_instances
59 59 # works inside __init__ methods!
60 60 indices = cls.register_instance(instance)
61 61
62 62 # This is in a try/except because of the __init__ method fails, the
63 63 # instance is discarded and shouldn't be tracked.
64 64 try:
65 65 if isinstance(instance, cls):
66 66 cls.__init__(instance, *args, **kw)
67 67 except:
68 68 # Unregister the instance because __init__ failed!
69 69 cls.unregister_instances(indices)
70 70 raise
71 71 else:
72 72 return instance
73 73
74 74 def register_instance(cls, instance):
75 75 """Register instance with cls and its subclasses."""
76 76 # indices is a list of the keys used to register the instance
77 77 # with. This list is needed if the instance needs to be unregistered.
78 78 indices = []
79 79 for c in cls.__mro__:
80 80 if issubclass(cls, c) and issubclass(c, Component):
81 81 c.__numcreated += 1
82 82 indices.append(c.__numcreated)
83 83 c.__instance_refs[c.__numcreated] = instance
84 84 else:
85 85 break
86 86 return indices
87 87
88 88 def unregister_instances(cls, indices):
89 89 """Unregister instance with cls and its subclasses."""
90 90 for c, index in zip(cls.__mro__, indices):
91 91 try:
92 92 del c.__instance_refs[index]
93 93 except KeyError:
94 94 pass
95 95
96 96 def clear_instances(cls):
97 97 """Clear all instances tracked by cls."""
98 98 cls.__instance_refs.clear()
99 99 cls.__numcreated = 0
100 100
101 101 def get_instances(cls, name=None, root=None, klass=None):
102 102 """Get all instances of cls and its subclasses.
103 103
104 104 Parameters
105 105 ----------
106 106 name : str
107 107 Limit to components with this name.
108 108 root : Component or subclass
109 109 Limit to components having this root.
110 110 klass : class or str
111 111 Limits to instances of the class or its subclasses. If a str
112 112 is given ut must be in the form 'foo.bar.MyClass'. The str
113 113 form of this argument is useful for forward declarations.
114 114 """
115 115 if klass is not None:
116 116 if isinstance(klass, basestring):
117 117 klass = import_item(klass)
118 118 # Limit search to instances of klass for performance
119 119 if issubclass(klass, Component):
120 120 return klass.get_instances(name=name, root=root)
121 121 instances = cls.__instance_refs.values()
122 122 if name is not None:
123 123 instances = [i for i in instances if i.name == name]
124 124 if klass is not None:
125 125 instances = [i for i in instances if isinstance(i, klass)]
126 126 if root is not None:
127 127 instances = [i for i in instances if i.root == root]
128 128 return instances
129 129
130 130 def get_instances_by_condition(cls, call, name=None, root=None,
131 131 klass=None):
132 132 """Get all instances of cls, i such that call(i)==True.
133 133
134 134 This also takes the ``name`` and ``root`` and ``classname``
135 135 arguments of :meth:`get_instance`
136 136 """
137 137 return [i for i in cls.get_instances(name, root, klass) if call(i)]
138 138
139 139
140 140 def masquerade_as(instance, cls):
141 141 """Let instance masquerade as an instance of cls.
142 142
143 143 Sometimes, such as in testing code, it is useful to let a class
144 144 masquerade as another. Python, being duck typed, allows this by
145 145 default. But, instances of components are tracked by their class type.
146 146
147 147 After calling this, ``cls.get_instances()`` will return ``instance``. This
148 148 does not, however, cause ``isinstance(instance, cls)`` to return ``True``.
149 149
150 150 Parameters
151 151 ----------
152 152 instance : an instance of a Component or Component subclass
153 153 The instance that will pretend to be a cls.
154 154 cls : subclass of Component
155 155 The Component subclass that instance will pretend to be.
156 156 """
157 157 cls.register_instance(instance)
158 158
159 159
160 160 class __ComponentNameGenerator(object):
161 161 """A Singleton to generate unique component names."""
162 162
163 163 def __init__(self, prefix):
164 164 self.prefix = prefix
165 165 self.i = 0
166 166
167 167 def __call__(self):
168 168 count = self.i
169 169 self.i += 1
170 170 return "%s%s" % (self.prefix, count)
171 171
172 172
173 173 ComponentNameGenerator = __ComponentNameGenerator('ipython.component')
174 174
175 175
176 176 class MetaComponent(MetaHasTraitlets, MetaComponentTracker):
177 177 pass
178 178
179 179
180 180 #-----------------------------------------------------------------------------
181 181 # Component implementation
182 182 #-----------------------------------------------------------------------------
183 183
184 184
185 185 class Component(HasTraitlets):
186 186
187 187 __metaclass__ = MetaComponent
188 188
189 189 # Traitlets are fun!
190 190 config = Instance(Config,(),{})
191 191 parent = This()
192 192 root = This()
193 193 created = None
194 194
195 195 def __init__(self, parent, name=None, config=None):
196 196 """Create a component given a parent and possibly and name and config.
197 197
198 198 Parameters
199 199 ----------
200 200 parent : Component subclass
201 201 The parent in the component graph. The parent is used
202 202 to get the root of the component graph.
203 203 name : str
204 204 The unique name of the component. If empty, then a unique
205 205 one will be autogenerated.
206 206 config : Config
207 207 If this is empty, self.config = parent.config, otherwise
208 208 self.config = config and root.config is ignored. This argument
209 209 should only be used to *override* the automatic inheritance of
210 210 parent.config. If a caller wants to modify parent.config
211 211 (not override), the caller should make a copy and change
212 212 attributes and then pass the copy to this argument.
213 213
214 214 Notes
215 215 -----
216 216 Subclasses of Component must call the :meth:`__init__` method of
217 217 :class:`Component` *before* doing anything else and using
218 218 :func:`super`::
219 219
220 220 class MyComponent(Component):
221 221 def __init__(self, parent, name=None, config=None):
222 222 super(MyComponent, self).__init__(parent, name, config)
223 223 # Then any other code you need to finish initialization.
224 224
225 225 This ensures that the :attr:`parent`, :attr:`name` and :attr:`config`
226 226 attributes are handled properly.
227 227 """
228 228 super(Component, self).__init__()
229 229 self._children = []
230 230 if name is None:
231 231 self.name = ComponentNameGenerator()
232 232 else:
233 233 self.name = name
234 234 self.root = self # This is the default, it is set when parent is set
235 235 self.parent = parent
236 236 if config is not None:
237 237 self.config = config
238 238 # We used to deepcopy, but for now we are trying to just save
239 239 # by reference. This *could* have side effects as all components
240 240 # will share config. In fact, I did find such a side effect in
241 241 # _config_changed below. If a config attribute value was a mutable type
242 242 # all instances of a component were getting the same copy, effectively
243 243 # making that a class attribute.
244 244 # self.config = deepcopy(config)
245 245 else:
246 246 if self.parent is not None:
247 247 self.config = self.parent.config
248 248 # We used to deepcopy, but for now we are trying to just save
249 249 # by reference. This *could* have side effects as all components
250 250 # will share config. In fact, I did find such a side effect in
251 251 # _config_changed below. If a config attribute value was a mutable type
252 252 # all instances of a component were getting the same copy, effectively
253 253 # making that a class attribute.
254 254 # self.config = deepcopy(self.parent.config)
255 255
256 256 self.created = datetime.datetime.now()
257 257
258 258 #-------------------------------------------------------------------------
259 259 # Static traitlet notifiations
260 260 #-------------------------------------------------------------------------
261 261
262 262 def _parent_changed(self, name, old, new):
263 263 if old is not None:
264 264 old._remove_child(self)
265 265 if new is not None:
266 266 new._add_child(self)
267 267
268 268 if new is None:
269 269 self.root = self
270 270 else:
271 271 self.root = new.root
272 272
273 273 def _root_changed(self, name, old, new):
274 274 if self.parent is None:
275 275 if not (new is self):
276 276 raise ComponentError("Root not self, but parent is None.")
277 277 else:
278 278 if not self.parent.root is new:
279 279 raise ComponentError("Error in setting the root attribute: "
280 280 "root != parent.root")
281 281
282 282 def _config_changed(self, name, old, new):
283 283 """Update all the class traits having ``config=True`` as metadata.
284 284
285 285 For any class traitlet with a ``config`` metadata attribute that is
286 286 ``True``, we update the traitlet with the value of the corresponding
287 287 config entry.
288 288 """
289 289 # Get all traitlets with a config metadata entry that is True
290 290 traitlets = self.traitlets(config=True)
291 291
292 292 # We auto-load config section for this class as well as any parent
293 293 # classes that are Component subclasses. This starts with Component
294 294 # and works down the mro loading the config for each section.
295 295 section_names = [cls.__name__ for cls in \
296 296 reversed(self.__class__.__mro__) if
297 297 issubclass(cls, Component) and issubclass(self.__class__, cls)]
298 298
299 299 for sname in section_names:
300 300 # Don't do a blind getattr as that would cause the config to
301 301 # dynamically create the section with name self.__class__.__name__.
302 302 if new._has_section(sname):
303 303 my_config = new[sname]
304 304 for k, v in traitlets.items():
305 305 # Don't allow traitlets with config=True to start with
306 306 # uppercase. Otherwise, they are confused with Config
307 307 # subsections. But, developers shouldn't have uppercase
308 308 # attributes anyways! (PEP 6)
309 309 if k[0].upper()==k[0] and not k.startswith('_'):
310 310 raise ComponentError('Component traitlets with '
311 311 'config=True must start with a lowercase so they are '
312 312 'not confused with Config subsections: %s.%s' % \
313 313 (self.__class__.__name__, k))
314 314 try:
315 315 # Here we grab the value from the config
316 316 # If k has the naming convention of a config
317 317 # section, it will be auto created.
318 318 config_value = my_config[k]
319 319 except KeyError:
320 320 pass
321 321 else:
322 322 # print "Setting %s.%s from %s.%s=%r" % \
323 323 # (self.__class__.__name__,k,sname,k,config_value)
324 324 # We have to do a deepcopy here if we don't deepcopy the entire
325 325 # config object. If we don't, a mutable config_value will be
326 326 # shared by all instances, effectively making it a class attribute.
327 327 setattr(self, k, deepcopy(config_value))
328 328
329 329 @property
330 330 def children(self):
331 331 """A list of all my child components."""
332 332 return self._children
333 333
334 334 def _remove_child(self, child):
335 335 """A private method for removing children components."""
336 336 if child in self._children:
337 337 index = self._children.index(child)
338 338 del self._children[index]
339 339
340 340 def _add_child(self, child):
341 341 """A private method for adding children components."""
342 342 if child not in self._children:
343 343 self._children.append(child)
344 344
345 345 def __repr__(self):
346 346 return "<%s('%s')>" % (self.__class__.__name__, self.name)
@@ -1,223 +1,223 b''
1 1 # -*- coding: utf-8 -*-
2 2 """sys.excepthook for IPython itself, leaves a detailed report on disk.
3 3
4 4
5 5 Authors
6 6 -------
7 7 - Fernando Perez <Fernando.Perez@berkeley.edu>
8 8 """
9 9
10 10 #*****************************************************************************
11 11 # Copyright (C) 2008-2009 The IPython Development Team
12 12 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
13 13 #
14 14 # Distributed under the terms of the BSD License. The full license is in
15 15 # the file COPYING, distributed as part of this software.
16 16 #*****************************************************************************
17 17
18 18 #****************************************************************************
19 19 # Required modules
20 20
21 21 # From the standard library
22 22 import os
23 23 import sys
24 24 from pprint import pformat
25 25
26 26 # Our own
27 27 from IPython.core import release
28 28 from IPython.core import ultratb
29 from IPython.utils.genutils import sys_info
29 from IPython.utils.sysinfo import sys_info
30 30
31 31 from IPython.external.Itpl import itpl
32 32
33 33 #****************************************************************************
34 34
35 35 class CrashHandler(object):
36 36 """Customizable crash handlers for IPython-based systems.
37 37
38 38 Instances of this class provide a __call__ method which can be used as a
39 39 sys.excepthook, i.e., the __call__ signature is:
40 40
41 41 def __call__(self,etype, evalue, etb)
42 42
43 43 """
44 44
45 45 def __init__(self,app, app_name, contact_name=None, contact_email=None,
46 46 bug_tracker=None, crash_report_fname='CrashReport.txt',
47 47 show_crash_traceback=True, call_pdb=False):
48 48 """New crash handler.
49 49
50 50 Inputs:
51 51
52 52 - app: a running application instance, which will be queried at crash
53 53 time for internal information.
54 54
55 55 - app_name: a string containing the name of your application.
56 56
57 57 - contact_name: a string with the name of the person to contact.
58 58
59 59 - contact_email: a string with the email address of the contact.
60 60
61 61 - bug_tracker: a string with the URL for your project's bug tracker.
62 62
63 63 - crash_report_fname: a string with the filename for the crash report
64 64 to be saved in. These reports are left in the ipython user directory
65 65 as determined by the running IPython instance.
66 66
67 67 Optional inputs:
68 68
69 69 - show_crash_traceback(True): if false, don't print the crash
70 70 traceback on stderr, only generate the on-disk report
71 71
72 72
73 73 Non-argument instance attributes:
74 74
75 75 These instances contain some non-argument attributes which allow for
76 76 further customization of the crash handler's behavior. Please see the
77 77 source for further details.
78 78 """
79 79
80 80 # apply args into instance
81 81 self.app = app
82 82 self.app_name = app_name
83 83 self.contact_name = contact_name
84 84 self.contact_email = contact_email
85 85 self.bug_tracker = bug_tracker
86 86 self.crash_report_fname = crash_report_fname
87 87 self.show_crash_traceback = show_crash_traceback
88 88 self.section_sep = '\n\n'+'*'*75+'\n\n'
89 89 self.call_pdb = call_pdb
90 90 #self.call_pdb = True # dbg
91 91
92 92 # Hardcoded defaults, which can be overridden either by subclasses or
93 93 # at runtime for the instance.
94 94
95 95 # Template for the user message. Subclasses which completely override
96 96 # this, or user apps, can modify it to suit their tastes. It gets
97 97 # expanded using itpl, so calls of the kind $self.foo are valid.
98 98 self.user_message_template = """
99 99 Oops, $self.app_name crashed. We do our best to make it stable, but...
100 100
101 101 A crash report was automatically generated with the following information:
102 102 - A verbatim copy of the crash traceback.
103 103 - A copy of your input history during this session.
104 104 - Data on your current $self.app_name configuration.
105 105
106 106 It was left in the file named:
107 107 \t'$self.crash_report_fname'
108 108 If you can email this file to the developers, the information in it will help
109 109 them in understanding and correcting the problem.
110 110
111 111 You can mail it to: $self.contact_name at $self.contact_email
112 112 with the subject '$self.app_name Crash Report'.
113 113
114 114 If you want to do it now, the following command will work (under Unix):
115 115 mail -s '$self.app_name Crash Report' $self.contact_email < $self.crash_report_fname
116 116
117 117 To ensure accurate tracking of this issue, please file a report about it at:
118 118 $self.bug_tracker
119 119 """
120 120
121 121 def __call__(self,etype, evalue, etb):
122 122 """Handle an exception, call for compatible with sys.excepthook"""
123 123
124 124 # Report tracebacks shouldn't use color in general (safer for users)
125 125 color_scheme = 'NoColor'
126 126
127 127 # Use this ONLY for developer debugging (keep commented out for release)
128 128 #color_scheme = 'Linux' # dbg
129 129
130 130 try:
131 131 rptdir = self.app.ipython_dir
132 132 except:
133 133 rptdir = os.getcwd()
134 134 if not os.path.isdir(rptdir):
135 135 rptdir = os.getcwd()
136 136 report_name = os.path.join(rptdir,self.crash_report_fname)
137 137 # write the report filename into the instance dict so it can get
138 138 # properly expanded out in the user message template
139 139 self.crash_report_fname = report_name
140 140 TBhandler = ultratb.VerboseTB(color_scheme=color_scheme,
141 141 long_header=1,
142 142 call_pdb=self.call_pdb,
143 143 )
144 144 if self.call_pdb:
145 145 TBhandler(etype,evalue,etb)
146 146 return
147 147 else:
148 148 traceback = TBhandler.text(etype,evalue,etb,context=31)
149 149
150 150 # print traceback to screen
151 151 if self.show_crash_traceback:
152 152 print >> sys.stderr, traceback
153 153
154 154 # and generate a complete report on disk
155 155 try:
156 156 report = open(report_name,'w')
157 157 except:
158 158 print >> sys.stderr, 'Could not create crash report on disk.'
159 159 return
160 160
161 161 # Inform user on stderr of what happened
162 162 msg = itpl('\n'+'*'*70+'\n'+self.user_message_template)
163 163 print >> sys.stderr, msg
164 164
165 165 # Construct report on disk
166 166 report.write(self.make_report(traceback))
167 167 report.close()
168 168 raw_input("Hit <Enter> to quit this message (your terminal may close):")
169 169
170 170 def make_report(self,traceback):
171 171 """Return a string containing a crash report."""
172 172
173 173 sec_sep = self.section_sep
174 174
175 175 report = ['*'*75+'\n\n'+'IPython post-mortem report\n\n']
176 176 rpt_add = report.append
177 177 rpt_add(sys_info())
178 178
179 179 try:
180 180 config = pformat(self.app.config)
181 181 rpt_add(sec_sep+'Current user configuration structure:\n\n')
182 182 rpt_add(config)
183 183 except:
184 184 pass
185 185 rpt_add(sec_sep+'Crash traceback:\n\n' + traceback)
186 186
187 187 return ''.join(report)
188 188
189 189
190 190 class IPythonCrashHandler(CrashHandler):
191 191 """sys.excepthook for IPython itself, leaves a detailed report on disk."""
192 192
193 193 def __init__(self, app, app_name='IPython'):
194 194
195 195 # Set here which of the IPython authors should be listed as contact
196 196 AUTHOR_CONTACT = 'Fernando'
197 197
198 198 # Set argument defaults
199 199 bug_tracker = 'https://bugs.launchpad.net/ipython/+filebug'
200 200 contact_name,contact_email = release.authors[AUTHOR_CONTACT][:2]
201 201 crash_report_fname = 'IPython_crash_report.txt'
202 202 # Call parent constructor
203 203 CrashHandler.__init__(self,app,app_name,contact_name,contact_email,
204 204 bug_tracker,crash_report_fname)
205 205
206 206 def make_report(self,traceback):
207 207 """Return a string containing a crash report."""
208 208
209 209 sec_sep = self.section_sep
210 210 # Start with parent report
211 211 report = [super(IPythonCrashHandler, self).make_report(traceback)]
212 212 # Add interactive-specific info we may have
213 213 rpt_add = report.append
214 214 try:
215 215 rpt_add(sec_sep+"History of session input:")
216 216 for line in self.app.shell.user_ns['_ih']:
217 217 rpt_add(line)
218 218 rpt_add('\n*** Last line of input (may not be in above history):\n')
219 219 rpt_add(self.app.shell._last_input_line+'\n')
220 220 except:
221 221 pass
222 222
223 223 return ''.join(report)
@@ -1,512 +1,510 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Pdb debugger class.
4 4
5 5 Modified from the standard pdb.Pdb class to avoid including readline, so that
6 6 the command line completion of other programs which include this isn't
7 7 damaged.
8 8
9 9 In the future, this class will be expanded with improvements over the standard
10 10 pdb.
11 11
12 12 The code in this file is mainly lifted out of cmd.py in Python 2.2, with minor
13 13 changes. Licensing should therefore be under the standard Python terms. For
14 14 details on the PSF (Python Software Foundation) standard license, see:
15 15
16 16 http://www.python.org/2.2.3/license.html"""
17 17
18 18 #*****************************************************************************
19 19 #
20 20 # This file is licensed under the PSF license.
21 21 #
22 22 # Copyright (C) 2001 Python Software Foundation, www.python.org
23 23 # Copyright (C) 2005-2006 Fernando Perez. <fperez@colorado.edu>
24 24 #
25 25 #
26 26 #*****************************************************************************
27 27
28 28 import bdb
29 import cmd
30 29 import linecache
31 import os
32 30 import sys
33 31
34 32 from IPython.utils import PyColorize
35 33 from IPython.core import ipapi
36 34 from IPython.utils import coloransi
37 from IPython.utils.genutils import Term
35 from IPython.utils.io import Term
38 36 from IPython.core.excolors import exception_colors
39 37
40 38 # See if we can use pydb.
41 39 has_pydb = False
42 40 prompt = 'ipdb> '
43 41 #We have to check this directly from sys.argv, config struct not yet available
44 42 if '-pydb' in sys.argv:
45 43 try:
46 44 import pydb
47 45 if hasattr(pydb.pydb, "runl") and pydb.version>'1.17':
48 46 # Version 1.17 is broken, and that's what ships with Ubuntu Edgy, so we
49 47 # better protect against it.
50 48 has_pydb = True
51 49 except ImportError:
52 50 print "Pydb (http://bashdb.sourceforge.net/pydb/) does not seem to be available"
53 51
54 52 if has_pydb:
55 53 from pydb import Pdb as OldPdb
56 54 #print "Using pydb for %run -d and post-mortem" #dbg
57 55 prompt = 'ipydb> '
58 56 else:
59 57 from pdb import Pdb as OldPdb
60 58
61 59 # Allow the set_trace code to operate outside of an ipython instance, even if
62 60 # it does so with some limitations. The rest of this support is implemented in
63 61 # the Tracer constructor.
64 62 def BdbQuit_excepthook(et,ev,tb):
65 63 if et==bdb.BdbQuit:
66 64 print 'Exiting Debugger.'
67 65 else:
68 66 BdbQuit_excepthook.excepthook_ori(et,ev,tb)
69 67
70 68 def BdbQuit_IPython_excepthook(self,et,ev,tb):
71 69 print 'Exiting Debugger.'
72 70
73 71
74 72 class Tracer(object):
75 73 """Class for local debugging, similar to pdb.set_trace.
76 74
77 75 Instances of this class, when called, behave like pdb.set_trace, but
78 76 providing IPython's enhanced capabilities.
79 77
80 78 This is implemented as a class which must be initialized in your own code
81 79 and not as a standalone function because we need to detect at runtime
82 80 whether IPython is already active or not. That detection is done in the
83 81 constructor, ensuring that this code plays nicely with a running IPython,
84 82 while functioning acceptably (though with limitations) if outside of it.
85 83 """
86 84
87 85 def __init__(self,colors=None):
88 86 """Create a local debugger instance.
89 87
90 88 :Parameters:
91 89
92 90 - `colors` (None): a string containing the name of the color scheme to
93 91 use, it must be one of IPython's valid color schemes. If not given, the
94 92 function will default to the current IPython scheme when running inside
95 93 IPython, and to 'NoColor' otherwise.
96 94
97 95 Usage example:
98 96
99 97 from IPython.core.debugger import Tracer; debug_here = Tracer()
100 98
101 99 ... later in your code
102 100 debug_here() # -> will open up the debugger at that point.
103 101
104 102 Once the debugger activates, you can use all of its regular commands to
105 103 step through code, set breakpoints, etc. See the pdb documentation
106 104 from the Python standard library for usage details.
107 105 """
108 106
109 107 try:
110 108 ip = ipapi.get()
111 109 except:
112 110 # Outside of ipython, we set our own exception hook manually
113 111 BdbQuit_excepthook.excepthook_ori = sys.excepthook
114 112 sys.excepthook = BdbQuit_excepthook
115 113 def_colors = 'NoColor'
116 114 try:
117 115 # Limited tab completion support
118 116 import readline
119 117 readline.parse_and_bind('tab: complete')
120 118 except ImportError:
121 119 pass
122 120 else:
123 121 # In ipython, we use its custom exception handler mechanism
124 122 def_colors = ip.colors
125 123 ip.set_custom_exc((bdb.BdbQuit,), BdbQuit_IPython_excepthook)
126 124
127 125 if colors is None:
128 126 colors = def_colors
129 127 self.debugger = Pdb(colors)
130 128
131 129 def __call__(self):
132 130 """Starts an interactive debugger at the point where called.
133 131
134 132 This is similar to the pdb.set_trace() function from the std lib, but
135 133 using IPython's enhanced debugger."""
136 134
137 135 self.debugger.set_trace(sys._getframe().f_back)
138 136
139 137
140 138 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
141 139 """Make new_fn have old_fn's doc string. This is particularly useful
142 140 for the do_... commands that hook into the help system.
143 141 Adapted from from a comp.lang.python posting
144 142 by Duncan Booth."""
145 143 def wrapper(*args, **kw):
146 144 return new_fn(*args, **kw)
147 145 if old_fn.__doc__:
148 146 wrapper.__doc__ = old_fn.__doc__ + additional_text
149 147 return wrapper
150 148
151 149
152 150 def _file_lines(fname):
153 151 """Return the contents of a named file as a list of lines.
154 152
155 153 This function never raises an IOError exception: if the file can't be
156 154 read, it simply returns an empty list."""
157 155
158 156 try:
159 157 outfile = open(fname)
160 158 except IOError:
161 159 return []
162 160 else:
163 161 out = outfile.readlines()
164 162 outfile.close()
165 163 return out
166 164
167 165
168 166 class Pdb(OldPdb):
169 167 """Modified Pdb class, does not load readline."""
170 168
171 169 def __init__(self,color_scheme='NoColor',completekey=None,
172 170 stdin=None, stdout=None):
173 171
174 172 # Parent constructor:
175 173 if has_pydb and completekey is None:
176 174 OldPdb.__init__(self,stdin=stdin,stdout=Term.cout)
177 175 else:
178 176 OldPdb.__init__(self,completekey,stdin,stdout)
179 177
180 178 self.prompt = prompt # The default prompt is '(Pdb)'
181 179
182 180 # IPython changes...
183 181 self.is_pydb = has_pydb
184 182
185 183 self.shell = ipapi.get()
186 184
187 185 if self.is_pydb:
188 186
189 187 # iplib.py's ipalias seems to want pdb's checkline
190 188 # which located in pydb.fn
191 189 import pydb.fns
192 190 self.checkline = lambda filename, lineno: \
193 191 pydb.fns.checkline(self, filename, lineno)
194 192
195 193 self.curframe = None
196 194 self.do_restart = self.new_do_restart
197 195
198 196 self.old_all_completions = self.shell.Completer.all_completions
199 197 self.shell.Completer.all_completions=self.all_completions
200 198
201 199 self.do_list = decorate_fn_with_doc(self.list_command_pydb,
202 200 OldPdb.do_list)
203 201 self.do_l = self.do_list
204 202 self.do_frame = decorate_fn_with_doc(self.new_do_frame,
205 203 OldPdb.do_frame)
206 204
207 205 self.aliases = {}
208 206
209 207 # Create color table: we copy the default one from the traceback
210 208 # module and add a few attributes needed for debugging
211 209 self.color_scheme_table = exception_colors()
212 210
213 211 # shorthands
214 212 C = coloransi.TermColors
215 213 cst = self.color_scheme_table
216 214
217 215 cst['NoColor'].colors.breakpoint_enabled = C.NoColor
218 216 cst['NoColor'].colors.breakpoint_disabled = C.NoColor
219 217
220 218 cst['Linux'].colors.breakpoint_enabled = C.LightRed
221 219 cst['Linux'].colors.breakpoint_disabled = C.Red
222 220
223 221 cst['LightBG'].colors.breakpoint_enabled = C.LightRed
224 222 cst['LightBG'].colors.breakpoint_disabled = C.Red
225 223
226 224 self.set_colors(color_scheme)
227 225
228 226 # Add a python parser so we can syntax highlight source while
229 227 # debugging.
230 228 self.parser = PyColorize.Parser()
231 229
232 230 def set_colors(self, scheme):
233 231 """Shorthand access to the color table scheme selector method."""
234 232 self.color_scheme_table.set_active_scheme(scheme)
235 233
236 234 def interaction(self, frame, traceback):
237 235 self.shell.set_completer_frame(frame)
238 236 OldPdb.interaction(self, frame, traceback)
239 237
240 238 def new_do_up(self, arg):
241 239 OldPdb.do_up(self, arg)
242 240 self.shell.set_completer_frame(self.curframe)
243 241 do_u = do_up = decorate_fn_with_doc(new_do_up, OldPdb.do_up)
244 242
245 243 def new_do_down(self, arg):
246 244 OldPdb.do_down(self, arg)
247 245 self.shell.set_completer_frame(self.curframe)
248 246
249 247 do_d = do_down = decorate_fn_with_doc(new_do_down, OldPdb.do_down)
250 248
251 249 def new_do_frame(self, arg):
252 250 OldPdb.do_frame(self, arg)
253 251 self.shell.set_completer_frame(self.curframe)
254 252
255 253 def new_do_quit(self, arg):
256 254
257 255 if hasattr(self, 'old_all_completions'):
258 256 self.shell.Completer.all_completions=self.old_all_completions
259 257
260 258
261 259 return OldPdb.do_quit(self, arg)
262 260
263 261 do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
264 262
265 263 def new_do_restart(self, arg):
266 264 """Restart command. In the context of ipython this is exactly the same
267 265 thing as 'quit'."""
268 266 self.msg("Restart doesn't make sense here. Using 'quit' instead.")
269 267 return self.do_quit(arg)
270 268
271 269 def postloop(self):
272 270 self.shell.set_completer_frame(None)
273 271
274 272 def print_stack_trace(self):
275 273 try:
276 274 for frame_lineno in self.stack:
277 275 self.print_stack_entry(frame_lineno, context = 5)
278 276 except KeyboardInterrupt:
279 277 pass
280 278
281 279 def print_stack_entry(self,frame_lineno,prompt_prefix='\n-> ',
282 280 context = 3):
283 281 #frame, lineno = frame_lineno
284 282 print >>Term.cout, self.format_stack_entry(frame_lineno, '', context)
285 283
286 284 # vds: >>
287 285 frame, lineno = frame_lineno
288 286 filename = frame.f_code.co_filename
289 287 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
290 288 # vds: <<
291 289
292 290 def format_stack_entry(self, frame_lineno, lprefix=': ', context = 3):
293 291 import linecache, repr
294 292
295 293 ret = []
296 294
297 295 Colors = self.color_scheme_table.active_colors
298 296 ColorsNormal = Colors.Normal
299 297 tpl_link = '%s%%s%s' % (Colors.filenameEm, ColorsNormal)
300 298 tpl_call = '%s%%s%s%%s%s' % (Colors.vName, Colors.valEm, ColorsNormal)
301 299 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
302 300 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line,
303 301 ColorsNormal)
304 302
305 303 frame, lineno = frame_lineno
306 304
307 305 return_value = ''
308 306 if '__return__' in frame.f_locals:
309 307 rv = frame.f_locals['__return__']
310 308 #return_value += '->'
311 309 return_value += repr.repr(rv) + '\n'
312 310 ret.append(return_value)
313 311
314 312 #s = filename + '(' + `lineno` + ')'
315 313 filename = self.canonic(frame.f_code.co_filename)
316 314 link = tpl_link % filename
317 315
318 316 if frame.f_code.co_name:
319 317 func = frame.f_code.co_name
320 318 else:
321 319 func = "<lambda>"
322 320
323 321 call = ''
324 322 if func != '?':
325 323 if '__args__' in frame.f_locals:
326 324 args = repr.repr(frame.f_locals['__args__'])
327 325 else:
328 326 args = '()'
329 327 call = tpl_call % (func, args)
330 328
331 329 # The level info should be generated in the same format pdb uses, to
332 330 # avoid breaking the pdbtrack functionality of python-mode in *emacs.
333 331 if frame is self.curframe:
334 332 ret.append('> ')
335 333 else:
336 334 ret.append(' ')
337 335 ret.append('%s(%s)%s\n' % (link,lineno,call))
338 336
339 337 start = lineno - 1 - context//2
340 338 lines = linecache.getlines(filename)
341 339 start = max(start, 0)
342 340 start = min(start, len(lines) - context)
343 341 lines = lines[start : start + context]
344 342
345 343 for i,line in enumerate(lines):
346 344 show_arrow = (start + 1 + i == lineno)
347 345 linetpl = (frame is self.curframe or show_arrow) \
348 346 and tpl_line_em \
349 347 or tpl_line
350 348 ret.append(self.__format_line(linetpl, filename,
351 349 start + 1 + i, line,
352 350 arrow = show_arrow) )
353 351
354 352 return ''.join(ret)
355 353
356 354 def __format_line(self, tpl_line, filename, lineno, line, arrow = False):
357 355 bp_mark = ""
358 356 bp_mark_color = ""
359 357
360 358 scheme = self.color_scheme_table.active_scheme_name
361 359 new_line, err = self.parser.format2(line, 'str', scheme)
362 360 if not err: line = new_line
363 361
364 362 bp = None
365 363 if lineno in self.get_file_breaks(filename):
366 364 bps = self.get_breaks(filename, lineno)
367 365 bp = bps[-1]
368 366
369 367 if bp:
370 368 Colors = self.color_scheme_table.active_colors
371 369 bp_mark = str(bp.number)
372 370 bp_mark_color = Colors.breakpoint_enabled
373 371 if not bp.enabled:
374 372 bp_mark_color = Colors.breakpoint_disabled
375 373
376 374 numbers_width = 7
377 375 if arrow:
378 376 # This is the line with the error
379 377 pad = numbers_width - len(str(lineno)) - len(bp_mark)
380 378 if pad >= 3:
381 379 marker = '-'*(pad-3) + '-> '
382 380 elif pad == 2:
383 381 marker = '> '
384 382 elif pad == 1:
385 383 marker = '>'
386 384 else:
387 385 marker = ''
388 386 num = '%s%s' % (marker, str(lineno))
389 387 line = tpl_line % (bp_mark_color + bp_mark, num, line)
390 388 else:
391 389 num = '%*s' % (numbers_width - len(bp_mark), str(lineno))
392 390 line = tpl_line % (bp_mark_color + bp_mark, num, line)
393 391
394 392 return line
395 393
396 394 def list_command_pydb(self, arg):
397 395 """List command to use if we have a newer pydb installed"""
398 396 filename, first, last = OldPdb.parse_list_cmd(self, arg)
399 397 if filename is not None:
400 398 self.print_list_lines(filename, first, last)
401 399
402 400 def print_list_lines(self, filename, first, last):
403 401 """The printing (as opposed to the parsing part of a 'list'
404 402 command."""
405 403 try:
406 404 Colors = self.color_scheme_table.active_colors
407 405 ColorsNormal = Colors.Normal
408 406 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
409 407 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
410 408 src = []
411 409 for lineno in range(first, last+1):
412 410 line = linecache.getline(filename, lineno)
413 411 if not line:
414 412 break
415 413
416 414 if lineno == self.curframe.f_lineno:
417 415 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
418 416 else:
419 417 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
420 418
421 419 src.append(line)
422 420 self.lineno = lineno
423 421
424 422 print >>Term.cout, ''.join(src)
425 423
426 424 except KeyboardInterrupt:
427 425 pass
428 426
429 427 def do_list(self, arg):
430 428 self.lastcmd = 'list'
431 429 last = None
432 430 if arg:
433 431 try:
434 432 x = eval(arg, {}, {})
435 433 if type(x) == type(()):
436 434 first, last = x
437 435 first = int(first)
438 436 last = int(last)
439 437 if last < first:
440 438 # Assume it's a count
441 439 last = first + last
442 440 else:
443 441 first = max(1, int(x) - 5)
444 442 except:
445 443 print '*** Error in argument:', `arg`
446 444 return
447 445 elif self.lineno is None:
448 446 first = max(1, self.curframe.f_lineno - 5)
449 447 else:
450 448 first = self.lineno + 1
451 449 if last is None:
452 450 last = first + 10
453 451 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
454 452
455 453 # vds: >>
456 454 lineno = first
457 455 filename = self.curframe.f_code.co_filename
458 456 self.shell.hooks.synchronize_with_editor(filename, lineno, 0)
459 457 # vds: <<
460 458
461 459 do_l = do_list
462 460
463 461 def do_pdef(self, arg):
464 462 """The debugger interface to magic_pdef"""
465 463 namespaces = [('Locals', self.curframe.f_locals),
466 464 ('Globals', self.curframe.f_globals)]
467 465 self.shell.magic_pdef(arg, namespaces=namespaces)
468 466
469 467 def do_pdoc(self, arg):
470 468 """The debugger interface to magic_pdoc"""
471 469 namespaces = [('Locals', self.curframe.f_locals),
472 470 ('Globals', self.curframe.f_globals)]
473 471 self.shell.magic_pdoc(arg, namespaces=namespaces)
474 472
475 473 def do_pinfo(self, arg):
476 474 """The debugger equivalant of ?obj"""
477 475 namespaces = [('Locals', self.curframe.f_locals),
478 476 ('Globals', self.curframe.f_globals)]
479 477 self.shell.magic_pinfo("pinfo %s" % arg, namespaces=namespaces)
480 478
481 479 def checkline(self, filename, lineno):
482 480 """Check whether specified line seems to be executable.
483 481
484 482 Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
485 483 line or EOF). Warning: testing is not comprehensive.
486 484 """
487 485 #######################################################################
488 486 # XXX Hack! Use python-2.5 compatible code for this call, because with
489 487 # all of our changes, we've drifted from the pdb api in 2.6. For now,
490 488 # changing:
491 489 #
492 490 #line = linecache.getline(filename, lineno, self.curframe.f_globals)
493 491 # to:
494 492 #
495 493 line = linecache.getline(filename, lineno)
496 494 #
497 495 # does the trick. But in reality, we need to fix this by reconciling
498 496 # our updates with the new Pdb APIs in Python 2.6.
499 497 #
500 498 # End hack. The rest of this method is copied verbatim from 2.6 pdb.py
501 499 #######################################################################
502 500
503 501 if not line:
504 502 print >>self.stdout, 'End of file'
505 503 return 0
506 504 line = line.strip()
507 505 # Don't allow setting breakpoint at a blank line
508 506 if (not line or (line[0] == '#') or
509 507 (line[:3] == '"""') or line[:3] == "'''"):
510 508 print >>self.stdout, '*** Blank or comment'
511 509 return 0
512 510 return lineno
@@ -1,77 +1,75 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 A context manager for handling sys.displayhook.
5 5
6 6 Authors:
7 7
8 8 * Robert Kern
9 9 * Brian Granger
10 10 """
11 11
12 12 #-----------------------------------------------------------------------------
13 13 # Copyright (C) 2008-2009 The IPython Development Team
14 14 #
15 15 # Distributed under the terms of the BSD License. The full license is in
16 16 # the file COPYING, distributed as part of this software.
17 17 #-----------------------------------------------------------------------------
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Imports
21 21 #-----------------------------------------------------------------------------
22 22
23 23 import sys
24 24
25 25 from IPython.core.component import Component
26 26
27 from IPython.utils.autoattr import auto_attr
28
29 27 #-----------------------------------------------------------------------------
30 28 # Classes and functions
31 29 #-----------------------------------------------------------------------------
32 30
33 31
34 32 class DisplayTrap(Component):
35 33 """Object to manage sys.displayhook.
36 34
37 35 This came from IPython.core.kernel.display_hook, but is simplified
38 36 (no callbacks or formatters) until more of the core is refactored.
39 37 """
40 38
41 39 def __init__(self, parent, hook):
42 40 super(DisplayTrap, self).__init__(parent, None, None)
43 41 self.hook = hook
44 42 self.old_hook = None
45 43 # We define this to track if a single BuiltinTrap is nested.
46 44 # Only turn off the trap when the outermost call to __exit__ is made.
47 45 self._nested_level = 0
48 46
49 47 # @auto_attr
50 48 # def shell(self):
51 49 # return Component.get_instances(
52 50 # root=self.root,
53 51 # klass='IPython.core.iplib.InteractiveShell')[0]
54 52
55 53 def __enter__(self):
56 54 if self._nested_level == 0:
57 55 self.set()
58 56 self._nested_level += 1
59 57 return self
60 58
61 59 def __exit__(self, type, value, traceback):
62 60 if self._nested_level == 1:
63 61 self.unset()
64 62 self._nested_level -= 1
65 63 # Returning False will cause exceptions to propagate
66 64 return False
67 65
68 66 def set(self):
69 67 """Set the hook."""
70 68 if sys.displayhook is not self.hook:
71 69 self.old_hook = sys.displayhook
72 70 sys.displayhook = self.hook
73 71
74 72 def unset(self):
75 73 """Unset the hook."""
76 74 sys.displayhook = self.old_hook
77 75
@@ -1,272 +1,273 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 An embedded IPython shell.
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 * Fernando Perez
10 10
11 11 Notes
12 12 -----
13 13 """
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Copyright (C) 2008-2009 The IPython Development Team
17 17 #
18 18 # Distributed under the terms of the BSD License. The full license is in
19 19 # the file COPYING, distributed as part of this software.
20 20 #-----------------------------------------------------------------------------
21 21
22 22 #-----------------------------------------------------------------------------
23 23 # Imports
24 24 #-----------------------------------------------------------------------------
25 25
26 26 from __future__ import with_statement
27 import __main__
27 28
28 29 import sys
29 30 from contextlib import nested
30 31
31 32 from IPython.core import ultratb
32 33 from IPython.core.iplib import InteractiveShell
33 34 from IPython.core.ipapp import load_default_config
34 35
35 36 from IPython.utils.traitlets import Bool, Str, CBool
36 from IPython.utils.genutils import ask_yes_no
37 from IPython.utils.io import ask_yes_no
37 38
38 39
39 40 #-----------------------------------------------------------------------------
40 41 # Classes and functions
41 42 #-----------------------------------------------------------------------------
42 43
43 44 # This is an additional magic that is exposed in embedded shells.
44 45 def kill_embedded(self,parameter_s=''):
45 46 """%kill_embedded : deactivate for good the current embedded IPython.
46 47
47 48 This function (after asking for confirmation) sets an internal flag so that
48 49 an embedded IPython will never activate again. This is useful to
49 50 permanently disable a shell that is being called inside a loop: once you've
50 51 figured out what you needed from it, you may then kill it and the program
51 52 will then continue to run without the interactive shell interfering again.
52 53 """
53 54
54 55 kill = ask_yes_no("Are you sure you want to kill this embedded instance "
55 56 "(y/n)? [y/N] ",'n')
56 57 if kill:
57 58 self.embedded_active = False
58 59 print "This embedded IPython will not reactivate anymore once you exit."
59 60
60 61
61 62 class InteractiveShellEmbed(InteractiveShell):
62 63
63 64 dummy_mode = Bool(False)
64 65 exit_msg = Str('')
65 66 embedded = CBool(True)
66 67 embedded_active = CBool(True)
67 68 # Like the base class display_banner is not configurable, but here it
68 69 # is True by default.
69 70 display_banner = CBool(True)
70 71
71 72 def __init__(self, parent=None, config=None, ipython_dir=None, usage=None,
72 73 user_ns=None, user_global_ns=None,
73 74 banner1=None, banner2=None, display_banner=None,
74 75 custom_exceptions=((),None), exit_msg=''):
75 76
76 77 self.save_sys_ipcompleter()
77 78
78 79 super(InteractiveShellEmbed,self).__init__(
79 80 parent=parent, config=config, ipython_dir=ipython_dir, usage=usage,
80 81 user_ns=user_ns, user_global_ns=user_global_ns,
81 82 banner1=banner1, banner2=banner2, display_banner=display_banner,
82 83 custom_exceptions=custom_exceptions)
83 84
84 85 self.exit_msg = exit_msg
85 86 self.define_magic("kill_embedded", kill_embedded)
86 87
87 88 # don't use the ipython crash handler so that user exceptions aren't
88 89 # trapped
89 90 sys.excepthook = ultratb.FormattedTB(color_scheme=self.colors,
90 91 mode=self.xmode,
91 92 call_pdb=self.pdb)
92 93
93 94 self.restore_sys_ipcompleter()
94 95
95 96 def init_sys_modules(self):
96 97 pass
97 98
98 99 def save_sys_ipcompleter(self):
99 100 """Save readline completer status."""
100 101 try:
101 102 #print 'Save completer',sys.ipcompleter # dbg
102 103 self.sys_ipcompleter_orig = sys.ipcompleter
103 104 except:
104 105 pass # not nested with IPython
105 106
106 107 def restore_sys_ipcompleter(self):
107 108 """Restores the readline completer which was in place.
108 109
109 110 This allows embedded IPython within IPython not to disrupt the
110 111 parent's completion.
111 112 """
112 113 try:
113 114 self.readline.set_completer(self.sys_ipcompleter_orig)
114 115 sys.ipcompleter = self.sys_ipcompleter_orig
115 116 except:
116 117 pass
117 118
118 119 def __call__(self, header='', local_ns=None, global_ns=None, dummy=None,
119 120 stack_depth=1):
120 121 """Activate the interactive interpreter.
121 122
122 123 __call__(self,header='',local_ns=None,global_ns,dummy=None) -> Start
123 124 the interpreter shell with the given local and global namespaces, and
124 125 optionally print a header string at startup.
125 126
126 127 The shell can be globally activated/deactivated using the
127 128 set/get_dummy_mode methods. This allows you to turn off a shell used
128 129 for debugging globally.
129 130
130 131 However, *each* time you call the shell you can override the current
131 132 state of dummy_mode with the optional keyword parameter 'dummy'. For
132 133 example, if you set dummy mode on with IPShell.set_dummy_mode(1), you
133 134 can still have a specific call work by making it as IPShell(dummy=0).
134 135
135 136 The optional keyword parameter dummy controls whether the call
136 137 actually does anything.
137 138 """
138 139
139 140 # If the user has turned it off, go away
140 141 if not self.embedded_active:
141 142 return
142 143
143 144 # Normal exits from interactive mode set this flag, so the shell can't
144 145 # re-enter (it checks this variable at the start of interactive mode).
145 146 self.exit_now = False
146 147
147 148 # Allow the dummy parameter to override the global __dummy_mode
148 149 if dummy or (dummy != 0 and self.dummy_mode):
149 150 return
150 151
151 152 if self.has_readline:
152 153 self.set_completer()
153 154
154 155 # self.banner is auto computed
155 156 if header:
156 157 self.old_banner2 = self.banner2
157 158 self.banner2 = self.banner2 + '\n' + header + '\n'
158 159
159 160 # Call the embedding code with a stack depth of 1 so it can skip over
160 161 # our call and get the original caller's namespaces.
161 162 self.mainloop(local_ns, global_ns, stack_depth=stack_depth)
162 163
163 164 self.banner2 = self.old_banner2
164 165
165 166 if self.exit_msg is not None:
166 167 print self.exit_msg
167 168
168 169 self.restore_sys_ipcompleter()
169 170
170 171 def mainloop(self, local_ns=None, global_ns=None, stack_depth=0,
171 172 display_banner=None):
172 173 """Embeds IPython into a running python program.
173 174
174 175 Input:
175 176
176 177 - header: An optional header message can be specified.
177 178
178 179 - local_ns, global_ns: working namespaces. If given as None, the
179 180 IPython-initialized one is updated with __main__.__dict__, so that
180 181 program variables become visible but user-specific configuration
181 182 remains possible.
182 183
183 184 - stack_depth: specifies how many levels in the stack to go to
184 185 looking for namespaces (when local_ns and global_ns are None). This
185 186 allows an intermediate caller to make sure that this function gets
186 187 the namespace from the intended level in the stack. By default (0)
187 188 it will get its locals and globals from the immediate caller.
188 189
189 190 Warning: it's possible to use this in a program which is being run by
190 191 IPython itself (via %run), but some funny things will happen (a few
191 192 globals get overwritten). In the future this will be cleaned up, as
192 193 there is no fundamental reason why it can't work perfectly."""
193 194
194 195 # Get locals and globals from caller
195 196 if local_ns is None or global_ns is None:
196 197 call_frame = sys._getframe(stack_depth).f_back
197 198
198 199 if local_ns is None:
199 200 local_ns = call_frame.f_locals
200 201 if global_ns is None:
201 202 global_ns = call_frame.f_globals
202 203
203 204 # Update namespaces and fire up interpreter
204 205
205 206 # The global one is easy, we can just throw it in
206 207 self.user_global_ns = global_ns
207 208
208 209 # but the user/local one is tricky: ipython needs it to store internal
209 210 # data, but we also need the locals. We'll copy locals in the user
210 211 # one, but will track what got copied so we can delete them at exit.
211 212 # This is so that a later embedded call doesn't see locals from a
212 213 # previous call (which most likely existed in a separate scope).
213 214 local_varnames = local_ns.keys()
214 215 self.user_ns.update(local_ns)
215 216 #self.user_ns['local_ns'] = local_ns # dbg
216 217
217 218 # Patch for global embedding to make sure that things don't overwrite
218 219 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
219 220 # FIXME. Test this a bit more carefully (the if.. is new)
220 221 if local_ns is None and global_ns is None:
221 222 self.user_global_ns.update(__main__.__dict__)
222 223
223 224 # make sure the tab-completer has the correct frame information, so it
224 225 # actually completes using the frame's locals/globals
225 226 self.set_completer_frame()
226 227
227 228 with nested(self.builtin_trap, self.display_trap):
228 229 self.interact(display_banner=display_banner)
229 230
230 231 # now, purge out the user namespace from anything we might have added
231 232 # from the caller's local namespace
232 233 delvar = self.user_ns.pop
233 234 for var in local_varnames:
234 235 delvar(var,None)
235 236
236 237
237 238 _embedded_shell = None
238 239
239 240
240 241 def embed(header='', config=None, usage=None, banner1=None, banner2=None,
241 242 display_banner=True, exit_msg=''):
242 243 """Call this to embed IPython at the current point in your program.
243 244
244 245 The first invocation of this will create an :class:`InteractiveShellEmbed`
245 246 instance and then call it. Consecutive calls just call the already
246 247 created instance.
247 248
248 249 Here is a simple example::
249 250
250 251 from IPython import embed
251 252 a = 10
252 253 b = 20
253 254 embed('First time')
254 255 c = 30
255 256 d = 40
256 257 embed
257 258
258 259 Full customization can be done by passing a :class:`Struct` in as the
259 260 config argument.
260 261 """
261 262 if config is None:
262 263 config = load_default_config()
263 264 config.InteractiveShellEmbed = config.InteractiveShell
264 265 global _embedded_shell
265 266 if _embedded_shell is None:
266 267 _embedded_shell = InteractiveShellEmbed(
267 268 config=config, usage=usage,
268 269 banner1=banner1, banner2=banner2,
269 270 display_banner=display_banner, exit_msg=exit_msg
270 271 )
271 272 _embedded_shell(header=header, stack_depth=2)
272 273
@@ -1,137 +1,135 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Color schemes for exception handling code in IPython.
4 4 """
5 5
6 6 #*****************************************************************************
7 7 # Copyright (C) 2005-2006 Fernando Perez <fperez@colorado.edu>
8 8 #
9 9 # Distributed under the terms of the BSD License. The full license is in
10 10 # the file COPYING, distributed as part of this software.
11 11 #*****************************************************************************
12 12
13 #****************************************************************************
14 # Required modules
15 13 from IPython.utils.coloransi import ColorSchemeTable, TermColors, ColorScheme
16 14
17 15 def exception_colors():
18 16 """Return a color table with fields for exception reporting.
19 17
20 18 The table is an instance of ColorSchemeTable with schemes added for
21 19 'Linux', 'LightBG' and 'NoColor' and fields for exception handling filled
22 20 in.
23 21
24 22 Examples:
25 23
26 24 >>> ec = exception_colors()
27 25 >>> ec.active_scheme_name
28 26 ''
29 27 >>> print ec.active_colors
30 28 None
31 29
32 30 Now we activate a color scheme:
33 31 >>> ec.set_active_scheme('NoColor')
34 32 >>> ec.active_scheme_name
35 33 'NoColor'
36 34 >>> ec.active_colors.keys()
37 35 ['em', 'filenameEm', 'excName', 'valEm', 'nameEm', 'line', 'topline',
38 36 'name', 'caret', 'val', 'vName', 'Normal', 'filename', 'linenoEm',
39 37 'lineno', 'normalEm']
40 38 """
41 39
42 40 ex_colors = ColorSchemeTable()
43 41
44 42 # Populate it with color schemes
45 43 C = TermColors # shorthand and local lookup
46 44 ex_colors.add_scheme(ColorScheme(
47 45 'NoColor',
48 46 # The color to be used for the top line
49 47 topline = C.NoColor,
50 48
51 49 # The colors to be used in the traceback
52 50 filename = C.NoColor,
53 51 lineno = C.NoColor,
54 52 name = C.NoColor,
55 53 vName = C.NoColor,
56 54 val = C.NoColor,
57 55 em = C.NoColor,
58 56
59 57 # Emphasized colors for the last frame of the traceback
60 58 normalEm = C.NoColor,
61 59 filenameEm = C.NoColor,
62 60 linenoEm = C.NoColor,
63 61 nameEm = C.NoColor,
64 62 valEm = C.NoColor,
65 63
66 64 # Colors for printing the exception
67 65 excName = C.NoColor,
68 66 line = C.NoColor,
69 67 caret = C.NoColor,
70 68 Normal = C.NoColor
71 69 ))
72 70
73 71 # make some schemes as instances so we can copy them for modification easily
74 72 ex_colors.add_scheme(ColorScheme(
75 73 'Linux',
76 74 # The color to be used for the top line
77 75 topline = C.LightRed,
78 76
79 77 # The colors to be used in the traceback
80 78 filename = C.Green,
81 79 lineno = C.Green,
82 80 name = C.Purple,
83 81 vName = C.Cyan,
84 82 val = C.Green,
85 83 em = C.LightCyan,
86 84
87 85 # Emphasized colors for the last frame of the traceback
88 86 normalEm = C.LightCyan,
89 87 filenameEm = C.LightGreen,
90 88 linenoEm = C.LightGreen,
91 89 nameEm = C.LightPurple,
92 90 valEm = C.LightBlue,
93 91
94 92 # Colors for printing the exception
95 93 excName = C.LightRed,
96 94 line = C.Yellow,
97 95 caret = C.White,
98 96 Normal = C.Normal
99 97 ))
100 98
101 99 # For light backgrounds, swap dark/light colors
102 100 ex_colors.add_scheme(ColorScheme(
103 101 'LightBG',
104 102 # The color to be used for the top line
105 103 topline = C.Red,
106 104
107 105 # The colors to be used in the traceback
108 106 filename = C.LightGreen,
109 107 lineno = C.LightGreen,
110 108 name = C.LightPurple,
111 109 vName = C.Cyan,
112 110 val = C.LightGreen,
113 111 em = C.Cyan,
114 112
115 113 # Emphasized colors for the last frame of the traceback
116 114 normalEm = C.Cyan,
117 115 filenameEm = C.Green,
118 116 linenoEm = C.Green,
119 117 nameEm = C.Purple,
120 118 valEm = C.Blue,
121 119
122 120 # Colors for printing the exception
123 121 excName = C.Red,
124 122 #line = C.Brown, # brown often is displayed as yellow
125 123 line = C.Red,
126 124 caret = C.Normal,
127 125 Normal = C.Normal,
128 126 ))
129 127
130 128 return ex_colors
131 129
132 130
133 131 # For backwards compatibility, keep around a single global object. Note that
134 132 # this should NOT be used, the factory function should be used instead, since
135 133 # these objects are stateful and it's very easy to get strange bugs if any code
136 134 # modifies the module-level object's state.
137 135 ExceptionColors = exception_colors()
@@ -1,276 +1,277 b''
1 1 # -*- coding: utf-8 -*-
2 2 """ History related magics and functionality """
3 3
4 4 # Stdlib imports
5 5 import fnmatch
6 6 import os
7 7
8 from IPython.utils.genutils import Term, ask_yes_no, warn
8 from IPython.utils.io import Term, ask_yes_no
9 from IPython.utils.warn import warn
9 10 from IPython.core import ipapi
10 11
11 12 def magic_history(self, parameter_s = ''):
12 13 """Print input history (_i<n> variables), with most recent last.
13 14
14 15 %history -> print at most 40 inputs (some may be multi-line)\\
15 16 %history n -> print at most n inputs\\
16 17 %history n1 n2 -> print inputs between n1 and n2 (n2 not included)\\
17 18
18 19 By default, input history is printed without line numbers so it can be
19 20 directly pasted into an editor.
20 21
21 22 With -n, each input's number <n> is shown, and is accessible as the
22 23 automatically generated variable _i<n> as well as In[<n>]. Multi-line
23 24 statements are printed starting at a new line for easy copy/paste.
24 25
25 26 Options:
26 27
27 28 -n: print line numbers for each input.
28 29 This feature is only available if numbered prompts are in use.
29 30
30 31 -o: also print outputs for each input.
31 32
32 33 -p: print classic '>>>' python prompts before each input. This is useful
33 34 for making documentation, and in conjunction with -o, for producing
34 35 doctest-ready output.
35 36
36 37 -t: (default) print the 'translated' history, as IPython understands it.
37 38 IPython filters your input and converts it all into valid Python source
38 39 before executing it (things like magics or aliases are turned into
39 40 function calls, for example). With this option, you'll see the native
40 41 history instead of the user-entered version: '%cd /' will be seen as
41 42 '_ip.magic("%cd /")' instead of '%cd /'.
42 43
43 44 -r: print the 'raw' history, i.e. the actual commands you typed.
44 45
45 46 -g: treat the arg as a pattern to grep for in (full) history.
46 47 This includes the "shadow history" (almost all commands ever written).
47 48 Use '%hist -g' to show full shadow history (may be very long).
48 49 In shadow history, every index nuwber starts with 0.
49 50
50 51 -f FILENAME: instead of printing the output to the screen, redirect it to
51 52 the given file. The file is always overwritten, though IPython asks for
52 53 confirmation first if it already exists.
53 54 """
54 55
55 56 if not self.outputcache.do_full_cache:
56 57 print 'This feature is only available if numbered prompts are in use.'
57 58 return
58 59 opts,args = self.parse_options(parameter_s,'gnoptsrf:',mode='list')
59 60
60 61 # Check if output to specific file was requested.
61 62 try:
62 63 outfname = opts['f']
63 64 except KeyError:
64 65 outfile = Term.cout # default
65 66 # We don't want to close stdout at the end!
66 67 close_at_end = False
67 68 else:
68 69 if os.path.exists(outfname):
69 70 if not ask_yes_no("File %r exists. Overwrite?" % outfname):
70 71 print 'Aborting.'
71 72 return
72 73
73 74 outfile = open(outfname,'w')
74 75 close_at_end = True
75 76
76 77 if 't' in opts:
77 78 input_hist = self.input_hist
78 79 elif 'r' in opts:
79 80 input_hist = self.input_hist_raw
80 81 else:
81 82 input_hist = self.input_hist
82 83
83 84 default_length = 40
84 85 pattern = None
85 86 if 'g' in opts:
86 87 init = 1
87 88 final = len(input_hist)
88 89 parts = parameter_s.split(None, 1)
89 90 if len(parts) == 1:
90 91 parts += '*'
91 92 head, pattern = parts
92 93 pattern = "*" + pattern + "*"
93 94 elif len(args) == 0:
94 95 final = len(input_hist)-1
95 96 init = max(1,final-default_length)
96 97 elif len(args) == 1:
97 98 final = len(input_hist)
98 99 init = max(1, final-int(args[0]))
99 100 elif len(args) == 2:
100 101 init, final = map(int, args)
101 102 else:
102 103 warn('%hist takes 0, 1 or 2 arguments separated by spaces.')
103 104 print >> Term.cout, self.magic_hist.__doc__
104 105 return
105 106
106 107 width = len(str(final))
107 108 line_sep = ['','\n']
108 109 print_nums = 'n' in opts
109 110 print_outputs = 'o' in opts
110 111 pyprompts = 'p' in opts
111 112
112 113 found = False
113 114 if pattern is not None:
114 115 sh = self.shadowhist.all()
115 116 for idx, s in sh:
116 117 if fnmatch.fnmatch(s, pattern):
117 118 print >> outfile, "0%d: %s" %(idx, s)
118 119 found = True
119 120
120 121 if found:
121 122 print >> outfile, "==="
122 123 print >> outfile, \
123 124 "shadow history ends, fetch by %rep <number> (must start with 0)"
124 125 print >> outfile, "=== start of normal history ==="
125 126
126 127 for in_num in range(init,final):
127 128 inline = input_hist[in_num]
128 129 if pattern is not None and not fnmatch.fnmatch(inline, pattern):
129 130 continue
130 131
131 132 multiline = int(inline.count('\n') > 1)
132 133 if print_nums:
133 134 print >> outfile, \
134 135 '%s:%s' % (str(in_num).ljust(width), line_sep[multiline]),
135 136 if pyprompts:
136 137 print >> outfile, '>>>',
137 138 if multiline:
138 139 lines = inline.splitlines()
139 140 print >> outfile, '\n... '.join(lines)
140 141 print >> outfile, '... '
141 142 else:
142 143 print >> outfile, inline,
143 144 else:
144 145 print >> outfile, inline,
145 146 if print_outputs:
146 147 output = self.shell.user_ns['Out'].get(in_num)
147 148 if output is not None:
148 149 print >> outfile, repr(output)
149 150
150 151 if close_at_end:
151 152 outfile.close()
152 153
153 154
154 155 def magic_hist(self, parameter_s=''):
155 156 """Alternate name for %history."""
156 157 return self.magic_history(parameter_s)
157 158
158 159
159 160 def rep_f(self, arg):
160 161 r""" Repeat a command, or get command to input line for editing
161 162
162 163 - %rep (no arguments):
163 164
164 165 Place a string version of last computation result (stored in the special '_'
165 166 variable) to the next input prompt. Allows you to create elaborate command
166 167 lines without using copy-paste::
167 168
168 169 $ l = ["hei", "vaan"]
169 170 $ "".join(l)
170 171 ==> heivaan
171 172 $ %rep
172 173 $ heivaan_ <== cursor blinking
173 174
174 175 %rep 45
175 176
176 177 Place history line 45 to next input prompt. Use %hist to find out the
177 178 number.
178 179
179 180 %rep 1-4 6-7 3
180 181
181 182 Repeat the specified lines immediately. Input slice syntax is the same as
182 183 in %macro and %save.
183 184
184 185 %rep foo
185 186
186 187 Place the most recent line that has the substring "foo" to next input.
187 188 (e.g. 'svn ci -m foobar').
188 189 """
189 190
190 191 opts,args = self.parse_options(arg,'',mode='list')
191 192 if not args:
192 193 self.set_next_input(str(self.user_ns["_"]))
193 194 return
194 195
195 196 if len(args) == 1 and not '-' in args[0]:
196 197 arg = args[0]
197 198 if len(arg) > 1 and arg.startswith('0'):
198 199 # get from shadow hist
199 200 num = int(arg[1:])
200 201 line = self.shadowhist.get(num)
201 202 self.set_next_input(str(line))
202 203 return
203 204 try:
204 205 num = int(args[0])
205 206 self.set_next_input(str(self.input_hist_raw[num]).rstrip())
206 207 return
207 208 except ValueError:
208 209 pass
209 210
210 211 for h in reversed(self.input_hist_raw):
211 212 if 'rep' in h:
212 213 continue
213 214 if fnmatch.fnmatch(h,'*' + arg + '*'):
214 215 self.set_next_input(str(h).rstrip())
215 216 return
216 217
217 218 try:
218 219 lines = self.extract_input_slices(args, True)
219 220 print "lines",lines
220 221 self.runlines(lines)
221 222 except ValueError:
222 223 print "Not found in recent history:", args
223 224
224 225
225 226 _sentinel = object()
226 227
227 228 class ShadowHist(object):
228 229 def __init__(self,db):
229 230 # cmd => idx mapping
230 231 self.curidx = 0
231 232 self.db = db
232 233 self.disabled = False
233 234
234 235 def inc_idx(self):
235 236 idx = self.db.get('shadowhist_idx', 1)
236 237 self.db['shadowhist_idx'] = idx + 1
237 238 return idx
238 239
239 240 def add(self, ent):
240 241 if self.disabled:
241 242 return
242 243 try:
243 244 old = self.db.hget('shadowhist', ent, _sentinel)
244 245 if old is not _sentinel:
245 246 return
246 247 newidx = self.inc_idx()
247 248 #print "new",newidx # dbg
248 249 self.db.hset('shadowhist',ent, newidx)
249 250 except:
250 251 ipapi.get().showtraceback()
251 252 print "WARNING: disabling shadow history"
252 253 self.disabled = True
253 254
254 255 def all(self):
255 256 d = self.db.hdict('shadowhist')
256 257 items = [(i,s) for (s,i) in d.items()]
257 258 items.sort()
258 259 return items
259 260
260 261 def get(self, idx):
261 262 all = self.all()
262 263
263 264 for k, v in all:
264 265 #print k,v
265 266 if k == idx:
266 267 return v
267 268
268 269
269 270 def init_ipython(ip):
270 271 ip.define_magic("rep",rep_f)
271 272 ip.define_magic("hist",magic_hist)
272 273 ip.define_magic("history",magic_history)
273 274
274 275 # XXX - ipy_completers are in quarantine, need to be updated to new apis
275 276 #import ipy_completers
276 277 #ipy_completers.quick_completer('%hist' ,'-g -t -r -n')
@@ -1,273 +1,276 b''
1 1 """hooks for IPython.
2 2
3 3 In Python, it is possible to overwrite any method of any object if you really
4 4 want to. But IPython exposes a few 'hooks', methods which are _designed_ to
5 5 be overwritten by users for customization purposes. This module defines the
6 6 default versions of all such hooks, which get used by IPython if not
7 7 overridden by the user.
8 8
9 9 hooks are simple functions, but they should be declared with 'self' as their
10 10 first argument, because when activated they are registered into IPython as
11 11 instance methods. The self argument will be the IPython running instance
12 12 itself, so hooks have full access to the entire IPython object.
13 13
14 14 If you wish to define a new hook and activate it, you need to put the
15 15 necessary code into a python file which can be either imported or execfile()'d
16 16 from within your ipythonrc configuration.
17 17
18 18 For example, suppose that you have a module called 'myiphooks' in your
19 19 PYTHONPATH, which contains the following definition:
20 20
21 21 import os
22 22 from IPython.core import ipapi
23 23 ip = ipapi.get()
24 24
25 25 def calljed(self,filename, linenum):
26 26 "My editor hook calls the jed editor directly."
27 27 print "Calling my own editor, jed ..."
28 28 if os.system('jed +%d %s' % (linenum,filename)) != 0:
29 29 raise TryNext()
30 30
31 31 ip.set_hook('editor', calljed)
32 32
33 33 You can then enable the functionality by doing 'import myiphooks'
34 34 somewhere in your configuration files or ipython command line.
35 35 """
36 36
37 37 #*****************************************************************************
38 38 # Copyright (C) 2005 Fernando Perez. <fperez@colorado.edu>
39 39 #
40 40 # Distributed under the terms of the BSD License. The full license is in
41 41 # the file COPYING, distributed as part of this software.
42 42 #*****************************************************************************
43 43
44 44 import os, bisect
45 45 import sys
46 from IPython.utils.genutils import Term, shell
46
47 47 from pprint import PrettyPrinter
48 48
49 from IPython.utils.io import Term
50 from IPython.utils.process import shell
51
49 52 from IPython.core.error import TryNext
50 53
51 54 # List here all the default hooks. For now it's just the editor functions
52 55 # but over time we'll move here all the public API for user-accessible things.
53 56
54 57 __all__ = ['editor', 'fix_error_editor', 'synchronize_with_editor', 'result_display',
55 58 'input_prefilter', 'shutdown_hook', 'late_startup_hook',
56 59 'generate_prompt', 'generate_output_prompt','shell_hook',
57 60 'show_in_pager','pre_prompt_hook', 'pre_runcode_hook',
58 61 'clipboard_get']
59 62
60 63 pformat = PrettyPrinter().pformat
61 64
62 65 def editor(self,filename, linenum=None):
63 66 """Open the default editor at the given filename and linenumber.
64 67
65 68 This is IPython's default editor hook, you can use it as an example to
66 69 write your own modified one. To set your own editor function as the
67 70 new editor hook, call ip.set_hook('editor',yourfunc)."""
68 71
69 72 # IPython configures a default editor at startup by reading $EDITOR from
70 73 # the environment, and falling back on vi (unix) or notepad (win32).
71 74 editor = self.editor
72 75
73 76 # marker for at which line to open the file (for existing objects)
74 77 if linenum is None or editor=='notepad':
75 78 linemark = ''
76 79 else:
77 80 linemark = '+%d' % int(linenum)
78 81
79 82 # Enclose in quotes if necessary and legal
80 83 if ' ' in editor and os.path.isfile(editor) and editor[0] != '"':
81 84 editor = '"%s"' % editor
82 85
83 86 # Call the actual editor
84 87 if os.system('%s %s %s' % (editor,linemark,filename)) != 0:
85 88 raise TryNext()
86 89
87 90 import tempfile
88 91 def fix_error_editor(self,filename,linenum,column,msg):
89 92 """Open the editor at the given filename, linenumber, column and
90 93 show an error message. This is used for correcting syntax errors.
91 94 The current implementation only has special support for the VIM editor,
92 95 and falls back on the 'editor' hook if VIM is not used.
93 96
94 97 Call ip.set_hook('fix_error_editor',youfunc) to use your own function,
95 98 """
96 99 def vim_quickfix_file():
97 100 t = tempfile.NamedTemporaryFile()
98 101 t.write('%s:%d:%d:%s\n' % (filename,linenum,column,msg))
99 102 t.flush()
100 103 return t
101 104 if os.path.basename(self.editor) != 'vim':
102 105 self.hooks.editor(filename,linenum)
103 106 return
104 107 t = vim_quickfix_file()
105 108 try:
106 109 if os.system('vim --cmd "set errorformat=%f:%l:%c:%m" -q ' + t.name):
107 110 raise TryNext()
108 111 finally:
109 112 t.close()
110 113
111 114
112 115 def synchronize_with_editor(self, filename, linenum, column):
113 116 pass
114 117
115 118
116 119 class CommandChainDispatcher:
117 120 """ Dispatch calls to a chain of commands until some func can handle it
118 121
119 122 Usage: instantiate, execute "add" to add commands (with optional
120 123 priority), execute normally via f() calling mechanism.
121 124
122 125 """
123 126 def __init__(self,commands=None):
124 127 if commands is None:
125 128 self.chain = []
126 129 else:
127 130 self.chain = commands
128 131
129 132
130 133 def __call__(self,*args, **kw):
131 134 """ Command chain is called just like normal func.
132 135
133 136 This will call all funcs in chain with the same args as were given to this
134 137 function, and return the result of first func that didn't raise
135 138 TryNext """
136 139
137 140 for prio,cmd in self.chain:
138 141 #print "prio",prio,"cmd",cmd #dbg
139 142 try:
140 143 return cmd(*args, **kw)
141 144 except TryNext, exc:
142 145 if exc.args or exc.kwargs:
143 146 args = exc.args
144 147 kw = exc.kwargs
145 148 # if no function will accept it, raise TryNext up to the caller
146 149 raise TryNext
147 150
148 151 def __str__(self):
149 152 return str(self.chain)
150 153
151 154 def add(self, func, priority=0):
152 155 """ Add a func to the cmd chain with given priority """
153 156 bisect.insort(self.chain,(priority,func))
154 157
155 158 def __iter__(self):
156 159 """ Return all objects in chain.
157 160
158 161 Handy if the objects are not callable.
159 162 """
160 163 return iter(self.chain)
161 164
162 165
163 166 def result_display(self,arg):
164 167 """ Default display hook.
165 168
166 169 Called for displaying the result to the user.
167 170 """
168 171
169 172 if self.pprint:
170 173 out = pformat(arg)
171 174 if '\n' in out:
172 175 # So that multi-line strings line up with the left column of
173 176 # the screen, instead of having the output prompt mess up
174 177 # their first line.
175 178 Term.cout.write('\n')
176 179 print >>Term.cout, out
177 180 else:
178 181 # By default, the interactive prompt uses repr() to display results,
179 182 # so we should honor this. Users who'd rather use a different
180 183 # mechanism can easily override this hook.
181 184 print >>Term.cout, repr(arg)
182 185 # the default display hook doesn't manipulate the value to put in history
183 186 return None
184 187
185 188
186 189 def input_prefilter(self,line):
187 190 """ Default input prefilter
188 191
189 192 This returns the line as unchanged, so that the interpreter
190 193 knows that nothing was done and proceeds with "classic" prefiltering
191 194 (%magics, !shell commands etc.).
192 195
193 196 Note that leading whitespace is not passed to this hook. Prefilter
194 197 can't alter indentation.
195 198
196 199 """
197 200 #print "attempt to rewrite",line #dbg
198 201 return line
199 202
200 203
201 204 def shutdown_hook(self):
202 205 """ default shutdown hook
203 206
204 207 Typically, shotdown hooks should raise TryNext so all shutdown ops are done
205 208 """
206 209
207 210 #print "default shutdown hook ok" # dbg
208 211 return
209 212
210 213
211 214 def late_startup_hook(self):
212 215 """ Executed after ipython has been constructed and configured
213 216
214 217 """
215 218 #print "default startup hook ok" # dbg
216 219
217 220
218 221 def generate_prompt(self, is_continuation):
219 222 """ calculate and return a string with the prompt to display """
220 223 if is_continuation:
221 224 return str(self.outputcache.prompt2)
222 225 return str(self.outputcache.prompt1)
223 226
224 227
225 228 def generate_output_prompt(self):
226 229 return str(self.outputcache.prompt_out)
227 230
228 231
229 232 def shell_hook(self,cmd):
230 233 """ Run system/shell command a'la os.system() """
231 234
232 235 shell(cmd, header=self.system_header, verbose=self.system_verbose)
233 236
234 237
235 238 def show_in_pager(self,s):
236 239 """ Run a string through pager """
237 240 # raising TryNext here will use the default paging functionality
238 241 raise TryNext
239 242
240 243
241 244 def pre_prompt_hook(self):
242 245 """ Run before displaying the next prompt
243 246
244 247 Use this e.g. to display output from asynchronous operations (in order
245 248 to not mess up text entry)
246 249 """
247 250
248 251 return None
249 252
250 253
251 254 def pre_runcode_hook(self):
252 255 """ Executed before running the (prefiltered) code in IPython """
253 256 return None
254 257
255 258
256 259 def clipboard_get(self):
257 260 """ Get text from the clipboard.
258 261 """
259 262 from IPython.lib.clipboard import (
260 263 osx_clipboard_get, tkinter_clipboard_get,
261 264 win32_clipboard_get
262 265 )
263 266 if sys.platform == 'win32':
264 267 chain = [win32_clipboard_get, tkinter_clipboard_get]
265 268 elif sys.platform == 'darwin':
266 269 chain = [osx_clipboard_get, tkinter_clipboard_get]
267 270 else:
268 271 chain = [tkinter_clipboard_get]
269 272 dispatcher = CommandChainDispatcher()
270 273 for func in chain:
271 274 dispatcher.add(func)
272 275 text = dispatcher()
273 276 return text
@@ -1,38 +1,36 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 This module is *completely* deprecated and should no longer be used for
5 5 any purpose. Currently, we have a few parts of the core that have
6 6 not been componentized and thus, still rely on this module. When everything
7 7 has been made into a component, this module will be sent to deathrow.
8 8 """
9 9
10 10 #-----------------------------------------------------------------------------
11 11 # Copyright (C) 2008-2009 The IPython Development Team
12 12 #
13 13 # Distributed under the terms of the BSD License. The full license is in
14 14 # the file COPYING, distributed as part of this software.
15 15 #-----------------------------------------------------------------------------
16 16
17 17 #-----------------------------------------------------------------------------
18 18 # Imports
19 19 #-----------------------------------------------------------------------------
20 20
21 from IPython.core.error import TryNext, UsageError, IPythonCoreError
22
23 21 #-----------------------------------------------------------------------------
24 22 # Classes and functions
25 23 #-----------------------------------------------------------------------------
26 24
27 25
28 26 def get():
29 27 """Get the most recently created InteractiveShell instance."""
30 28 from IPython.core.iplib import InteractiveShell
31 29 insts = InteractiveShell.get_instances()
32 30 if len(insts)==0:
33 31 return None
34 32 most_recent = insts[0]
35 33 for inst in insts[1:]:
36 34 if inst.created > most_recent.created:
37 35 most_recent = inst
38 36 return most_recent
@@ -1,655 +1,649 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 The :class:`~IPython.core.application.Application` object for the command
5 5 line :command:`ipython` program.
6 6
7 7 Authors
8 8 -------
9 9
10 10 * Brian Granger
11 11 * Fernando Perez
12 12 """
13 13
14 14 #-----------------------------------------------------------------------------
15 15 # Copyright (C) 2008-2010 The IPython Development Team
16 16 #
17 17 # Distributed under the terms of the BSD License. The full license is in
18 18 # the file COPYING, distributed as part of this software.
19 19 #-----------------------------------------------------------------------------
20 20
21 21 #-----------------------------------------------------------------------------
22 22 # Imports
23 23 #-----------------------------------------------------------------------------
24 24 from __future__ import absolute_import
25 25
26 26 import logging
27 27 import os
28 28 import sys
29 29
30 30 from IPython.core import crashhandler
31 31 from IPython.core.application import Application
32 32 from IPython.core.iplib import InteractiveShell
33 33 from IPython.config.loader import (
34 34 Config,
35 35 PyFileConfigLoader,
36 36 # NoConfigDefault,
37 37 )
38 38 from IPython.lib import inputhook
39 from IPython.utils.genutils import filefind, get_ipython_dir
39 from IPython.utils.path import filefind, get_ipython_dir
40 40 from . import usage
41 41
42 42 #-----------------------------------------------------------------------------
43 43 # Globals, utilities and helpers
44 44 #-----------------------------------------------------------------------------
45 45
46 46 default_config_file_name = u'ipython_config.py'
47 47
48 48 cl_args = (
49 49 (('--autocall',), dict(
50 50 type=int, dest='InteractiveShell.autocall',
51 51 help=
52 52 """Make IPython automatically call any callable object even if you
53 53 didn't type explicit parentheses. For example, 'str 43' becomes
54 54 'str(43)' automatically. The value can be '0' to disable the feature,
55 55 '1' for 'smart' autocall, where it is not applied if there are no more
56 56 arguments on the line, and '2' for 'full' autocall, where all callable
57 57 objects are automatically called (even if no arguments are present).
58 58 The default is '1'.""",
59 59 metavar='InteractiveShell.autocall')
60 60 ),
61 61 (('--autoindent',), dict(
62 62 action='store_true', dest='InteractiveShell.autoindent',
63 63 help='Turn on autoindenting.')
64 64 ),
65 65 (('--no-autoindent',), dict(
66 66 action='store_false', dest='InteractiveShell.autoindent',
67 67 help='Turn off autoindenting.')
68 68 ),
69 69 (('--automagic',), dict(
70 70 action='store_true', dest='InteractiveShell.automagic',
71 71 help='Turn on the auto calling of magic commands.'
72 72 'Type %%magic at the IPython prompt for more information.')
73 73 ),
74 74 (('--no-automagic',), dict(
75 75 action='store_false', dest='InteractiveShell.automagic',
76 76 help='Turn off the auto calling of magic commands.')
77 77 ),
78 78 (('--autoedit-syntax',), dict(
79 79 action='store_true', dest='InteractiveShell.autoedit_syntax',
80 80 help='Turn on auto editing of files with syntax errors.')
81 81 ),
82 82 (('--no-autoedit-syntax',), dict(
83 83 action='store_false', dest='InteractiveShell.autoedit_syntax',
84 84 help='Turn off auto editing of files with syntax errors.')
85 85 ),
86 86 (('--banner',), dict(
87 87 action='store_true', dest='Global.display_banner',
88 88 help='Display a banner upon starting IPython.')
89 89 ),
90 90 (('--no-banner',), dict(
91 91 action='store_false', dest='Global.display_banner',
92 92 help="Don't display a banner upon starting IPython.")
93 93 ),
94 94 (('--cache-size',), dict(
95 95 type=int, dest='InteractiveShell.cache_size',
96 96 help=
97 97 """Set the size of the output cache. The default is 1000, you can
98 98 change it permanently in your config file. Setting it to 0 completely
99 99 disables the caching system, and the minimum value accepted is 20 (if
100 100 you provide a value less than 20, it is reset to 0 and a warning is
101 101 issued). This limit is defined because otherwise you'll spend more
102 102 time re-flushing a too small cache than working.
103 103 """,
104 104 metavar='InteractiveShell.cache_size')
105 105 ),
106 106 (('--classic',), dict(
107 107 action='store_true', dest='Global.classic',
108 108 help="Gives IPython a similar feel to the classic Python prompt.")
109 109 ),
110 110 (('--colors',), dict(
111 111 type=str, dest='InteractiveShell.colors',
112 112 help="Set the color scheme (NoColor, Linux, and LightBG).",
113 113 metavar='InteractiveShell.colors')
114 114 ),
115 115 (('--color-info',), dict(
116 116 action='store_true', dest='InteractiveShell.color_info',
117 117 help=
118 118 """IPython can display information about objects via a set of func-
119 119 tions, and optionally can use colors for this, syntax highlighting
120 120 source code and various other elements. However, because this
121 121 information is passed through a pager (like 'less') and many pagers get
122 122 confused with color codes, this option is off by default. You can test
123 123 it and turn it on permanently in your ipython_config.py file if it
124 124 works for you. Test it and turn it on permanently if it works with
125 125 your system. The magic function %%color_info allows you to toggle this
126 126 inter- actively for testing."""
127 127 )
128 128 ),
129 129 (('--no-color-info',), dict(
130 130 action='store_false', dest='InteractiveShell.color_info',
131 131 help="Disable using colors for info related things.")
132 132 ),
133 133 (('--confirm-exit',), dict(
134 134 action='store_true', dest='InteractiveShell.confirm_exit',
135 135 help=
136 136 """Set to confirm when you try to exit IPython with an EOF (Control-D
137 137 in Unix, Control-Z/Enter in Windows). By typing 'exit', 'quit' or
138 138 '%%Exit', you can force a direct exit without any confirmation.
139 139 """
140 140 )
141 141 ),
142 142 (('--no-confirm-exit',), dict(
143 143 action='store_false', dest='InteractiveShell.confirm_exit',
144 144 help="Don't prompt the user when exiting.")
145 145 ),
146 146 (('--deep-reload',), dict(
147 147 action='store_true', dest='InteractiveShell.deep_reload',
148 148 help=
149 149 """Enable deep (recursive) reloading by default. IPython can use the
150 150 deep_reload module which reloads changes in modules recursively (it
151 151 replaces the reload() function, so you don't need to change anything to
152 152 use it). deep_reload() forces a full reload of modules whose code may
153 153 have changed, which the default reload() function does not. When
154 154 deep_reload is off, IPython will use the normal reload(), but
155 155 deep_reload will still be available as dreload(). This fea- ture is off
156 156 by default [which means that you have both normal reload() and
157 157 dreload()].""")
158 158 ),
159 159 (('--no-deep-reload',), dict(
160 160 action='store_false', dest='InteractiveShell.deep_reload',
161 161 help="Disable deep (recursive) reloading by default.")
162 162 ),
163 163 (('--editor',), dict(
164 164 type=str, dest='InteractiveShell.editor',
165 165 help="Set the editor used by IPython (default to $EDITOR/vi/notepad).",
166 166 metavar='InteractiveShell.editor')
167 167 ),
168 168 (('--log','-l'), dict(
169 169 action='store_true', dest='InteractiveShell.logstart',
170 170 help="Start logging to the default log file (./ipython_log.py).")
171 171 ),
172 172 (('--logfile','-lf'), dict(
173 173 type=unicode, dest='InteractiveShell.logfile',
174 174 help="Start logging to logfile with this name.",
175 175 metavar='InteractiveShell.logfile')
176 176 ),
177 177 (('--log-append','-la'), dict(
178 178 type=unicode, dest='InteractiveShell.logappend',
179 179 help="Start logging to the given file in append mode.",
180 180 metavar='InteractiveShell.logfile')
181 181 ),
182 182 (('--pdb',), dict(
183 183 action='store_true', dest='InteractiveShell.pdb',
184 184 help="Enable auto calling the pdb debugger after every exception.")
185 185 ),
186 186 (('--no-pdb',), dict(
187 187 action='store_false', dest='InteractiveShell.pdb',
188 188 help="Disable auto calling the pdb debugger after every exception.")
189 189 ),
190 190 (('--pprint',), dict(
191 191 action='store_true', dest='InteractiveShell.pprint',
192 192 help="Enable auto pretty printing of results.")
193 193 ),
194 194 (('--no-pprint',), dict(
195 195 action='store_false', dest='InteractiveShell.pprint',
196 196 help="Disable auto auto pretty printing of results.")
197 197 ),
198 198 (('--prompt-in1','-pi1'), dict(
199 199 type=str, dest='InteractiveShell.prompt_in1',
200 200 help=
201 201 """Set the main input prompt ('In [\#]: '). Note that if you are using
202 202 numbered prompts, the number is represented with a '\#' in the string.
203 203 Don't forget to quote strings with spaces embedded in them. Most
204 204 bash-like escapes can be used to customize IPython's prompts, as well
205 205 as a few additional ones which are IPython-spe- cific. All valid
206 206 prompt escapes are described in detail in the Customization section of
207 207 the IPython manual.""",
208 208 metavar='InteractiveShell.prompt_in1')
209 209 ),
210 210 (('--prompt-in2','-pi2'), dict(
211 211 type=str, dest='InteractiveShell.prompt_in2',
212 212 help=
213 213 """Set the secondary input prompt (' .\D.: '). Similar to the previous
214 214 option, but used for the continuation prompts. The special sequence
215 215 '\D' is similar to '\#', but with all digits replaced by dots (so you
216 216 can have your continuation prompt aligned with your input prompt).
217 217 Default: ' .\D.: ' (note three spaces at the start for alignment with
218 218 'In [\#]')""",
219 219 metavar='InteractiveShell.prompt_in2')
220 220 ),
221 221 (('--prompt-out','-po'), dict(
222 222 type=str, dest='InteractiveShell.prompt_out',
223 223 help="Set the output prompt ('Out[\#]:')",
224 224 metavar='InteractiveShell.prompt_out')
225 225 ),
226 226 (('--quick',), dict(
227 227 action='store_true', dest='Global.quick',
228 228 help="Enable quick startup with no config files.")
229 229 ),
230 230 (('--readline',), dict(
231 231 action='store_true', dest='InteractiveShell.readline_use',
232 232 help="Enable readline for command line usage.")
233 233 ),
234 234 (('--no-readline',), dict(
235 235 action='store_false', dest='InteractiveShell.readline_use',
236 236 help="Disable readline for command line usage.")
237 237 ),
238 238 (('--screen-length','-sl'), dict(
239 239 type=int, dest='InteractiveShell.screen_length',
240 240 help=
241 241 """Number of lines of your screen, used to control printing of very
242 242 long strings. Strings longer than this number of lines will be sent
243 243 through a pager instead of directly printed. The default value for
244 244 this is 0, which means IPython will auto-detect your screen size every
245 245 time it needs to print certain potentially long strings (this doesn't
246 246 change the behavior of the 'print' keyword, it's only triggered
247 247 internally). If for some reason this isn't working well (it needs
248 248 curses support), specify it yourself. Otherwise don't change the
249 249 default.""",
250 250 metavar='InteractiveShell.screen_length')
251 251 ),
252 252 (('--separate-in','-si'), dict(
253 253 type=str, dest='InteractiveShell.separate_in',
254 254 help="Separator before input prompts. Default '\\n'.",
255 255 metavar='InteractiveShell.separate_in')
256 256 ),
257 257 (('--separate-out','-so'), dict(
258 258 type=str, dest='InteractiveShell.separate_out',
259 259 help="Separator before output prompts. Default 0 (nothing).",
260 260 metavar='InteractiveShell.separate_out')
261 261 ),
262 262 (('--separate-out2','-so2'), dict(
263 263 type=str, dest='InteractiveShell.separate_out2',
264 264 help="Separator after output prompts. Default 0 (nonight).",
265 265 metavar='InteractiveShell.separate_out2')
266 266 ),
267 267 (('-no-sep',), dict(
268 268 action='store_true', dest='Global.nosep',
269 269 help="Eliminate all spacing between prompts.")
270 270 ),
271 271 (('--term-title',), dict(
272 272 action='store_true', dest='InteractiveShell.term_title',
273 273 help="Enable auto setting the terminal title.")
274 274 ),
275 275 (('--no-term-title',), dict(
276 276 action='store_false', dest='InteractiveShell.term_title',
277 277 help="Disable auto setting the terminal title.")
278 278 ),
279 279 (('--xmode',), dict(
280 280 type=str, dest='InteractiveShell.xmode',
281 281 help=
282 282 """Exception reporting mode ('Plain','Context','Verbose'). Plain:
283 283 similar to python's normal traceback printing. Context: prints 5 lines
284 284 of context source code around each line in the traceback. Verbose:
285 285 similar to Context, but additionally prints the variables currently
286 286 visible where the exception happened (shortening their strings if too
287 287 long). This can potentially be very slow, if you happen to have a huge
288 288 data structure whose string representation is complex to compute.
289 289 Your computer may appear to freeze for a while with cpu usage at 100%%.
290 290 If this occurs, you can cancel the traceback with Ctrl-C (maybe hitting
291 291 it more than once).
292 292 """,
293 293 metavar='InteractiveShell.xmode')
294 294 ),
295 295 (('--ext',), dict(
296 296 type=str, dest='Global.extra_extension',
297 297 help="The dotted module name of an IPython extension to load.",
298 298 metavar='Global.extra_extension')
299 299 ),
300 300 (('-c',), dict(
301 301 type=str, dest='Global.code_to_run',
302 302 help="Execute the given command string.",
303 303 metavar='Global.code_to_run')
304 304 ),
305 305 (('-i',), dict(
306 306 action='store_true', dest='Global.force_interact',
307 307 help=
308 308 "If running code from the command line, become interactive afterwards."
309 309 )
310 310 ),
311 311
312 312 # Options to start with GUI control enabled from the beginning
313 313 (('--gui',), dict(
314 314 type=str, dest='Global.gui',
315 315 help="Enable GUI event loop integration ('qt', 'wx', 'gtk').",
316 316 metavar='gui-mode')
317 317 ),
318 318
319 319 (('--pylab','-pylab'), dict(
320 320 type=str, dest='Global.pylab',
321 321 nargs='?', const='auto', metavar='gui-mode',
322 322 help="Pre-load matplotlib and numpy for interactive use. "+
323 323 "If no value is given, the gui backend is matplotlib's, else use "+
324 324 "one of: ['tk', 'qt', 'wx', 'gtk'].")
325 325 ),
326 326
327 327 # Legacy GUI options. Leave them in for backwards compatibility, but the
328 328 # 'thread' names are really a misnomer now.
329 329 (('--wthread','-wthread'), dict(
330 330 action='store_true', dest='Global.wthread',
331 331 help="Enable wxPython event loop integration "+
332 332 "(DEPRECATED, use --gui wx)")
333 333 ),
334 334 (('--q4thread','--qthread','-q4thread','-qthread'), dict(
335 335 action='store_true', dest='Global.q4thread',
336 336 help="Enable Qt4 event loop integration. Qt3 is no longer supported. "+
337 337 "(DEPRECATED, use --gui qt)")
338 338 ),
339 339 (('--gthread','-gthread'), dict(
340 340 action='store_true', dest='Global.gthread',
341 341 help="Enable GTK event loop integration. "+
342 342 "(DEPRECATED, use --gui gtk)")
343 343 ),
344 344 )
345 345
346 346 #-----------------------------------------------------------------------------
347 347 # Main classes and functions
348 348 #-----------------------------------------------------------------------------
349 349
350 350 class IPythonApp(Application):
351 351 name = u'ipython'
352 352 #: argparse formats better the 'usage' than the 'description' field
353 353 description = None
354 354 #: usage message printed by argparse. If None, auto-generate
355 355 usage = usage.cl_usage
356 356
357 357 config_file_name = default_config_file_name
358 358
359 359 cl_arguments = Application.cl_arguments + cl_args
360 360
361 361 # Private and configuration attributes
362 362 _CrashHandler = crashhandler.IPythonCrashHandler
363 363
364 364 def __init__(self, argv=None,
365 365 constructor_config=None, override_config=None,
366 366 **shell_params):
367 367 """Create a new IPythonApp.
368 368
369 369 See the parent class for details on how configuration is handled.
370 370
371 371 Parameters
372 372 ----------
373 373 argv : optional, list
374 374 If given, used as the command-line argv environment to read arguments
375 375 from.
376 376
377 377 constructor_config : optional, Config
378 378 If given, additional config that is merged last, after internal
379 379 defaults, command-line and file-based configs.
380 380
381 381 override_config : optional, Config
382 382 If given, config that overrides all others unconditionally (except
383 383 for internal defaults, which ensure that all parameters exist).
384 384
385 385 shell_params : optional, dict
386 386 All other keywords are passed to the :class:`iplib.InteractiveShell`
387 387 constructor.
388 388 """
389 389 super(IPythonApp, self).__init__(argv, constructor_config,
390 390 override_config)
391 391 self.shell_params = shell_params
392 392
393 393 def create_default_config(self):
394 394 super(IPythonApp, self).create_default_config()
395 395 # Eliminate multiple lookups
396 396 Global = self.default_config.Global
397 397
398 398 # Set all default values
399 399 Global.display_banner = True
400 400
401 401 # If the -c flag is given or a file is given to run at the cmd line
402 402 # like "ipython foo.py", normally we exit without starting the main
403 403 # loop. The force_interact config variable allows a user to override
404 404 # this and interact. It is also set by the -i cmd line flag, just
405 405 # like Python.
406 406 Global.force_interact = False
407 407
408 408 # By default always interact by starting the IPython mainloop.
409 409 Global.interact = True
410 410
411 411 # No GUI integration by default
412 412 Global.gui = False
413 413 # Pylab off by default
414 414 Global.pylab = False
415 415
416 416 # Deprecated versions of gui support that used threading, we support
417 417 # them just for bacwards compatibility as an alternate spelling for
418 418 # '--gui X'
419 419 Global.qthread = False
420 420 Global.q4thread = False
421 421 Global.wthread = False
422 422 Global.gthread = False
423 423
424 424 def load_file_config(self):
425 425 if hasattr(self.command_line_config.Global, 'quick'):
426 426 if self.command_line_config.Global.quick:
427 427 self.file_config = Config()
428 428 return
429 429 super(IPythonApp, self).load_file_config()
430 430
431 431 def post_load_file_config(self):
432 432 if hasattr(self.command_line_config.Global, 'extra_extension'):
433 433 if not hasattr(self.file_config.Global, 'extensions'):
434 434 self.file_config.Global.extensions = []
435 435 self.file_config.Global.extensions.append(
436 436 self.command_line_config.Global.extra_extension)
437 437 del self.command_line_config.Global.extra_extension
438 438
439 439 def pre_construct(self):
440 440 config = self.master_config
441 441
442 442 if hasattr(config.Global, 'classic'):
443 443 if config.Global.classic:
444 444 config.InteractiveShell.cache_size = 0
445 445 config.InteractiveShell.pprint = 0
446 446 config.InteractiveShell.prompt_in1 = '>>> '
447 447 config.InteractiveShell.prompt_in2 = '... '
448 448 config.InteractiveShell.prompt_out = ''
449 449 config.InteractiveShell.separate_in = \
450 450 config.InteractiveShell.separate_out = \
451 451 config.InteractiveShell.separate_out2 = ''
452 452 config.InteractiveShell.colors = 'NoColor'
453 453 config.InteractiveShell.xmode = 'Plain'
454 454
455 455 if hasattr(config.Global, 'nosep'):
456 456 if config.Global.nosep:
457 457 config.InteractiveShell.separate_in = \
458 458 config.InteractiveShell.separate_out = \
459 459 config.InteractiveShell.separate_out2 = ''
460 460
461 461 # if there is code of files to run from the cmd line, don't interact
462 462 # unless the -i flag (Global.force_interact) is true.
463 463 code_to_run = config.Global.get('code_to_run','')
464 464 file_to_run = False
465 465 if self.extra_args and self.extra_args[0]:
466 466 file_to_run = True
467 467 if file_to_run or code_to_run:
468 468 if not config.Global.force_interact:
469 469 config.Global.interact = False
470 470
471 471 def construct(self):
472 472 # I am a little hesitant to put these into InteractiveShell itself.
473 473 # But that might be the place for them
474 474 sys.path.insert(0, '')
475 475
476 476 # Create an InteractiveShell instance
477 477 self.shell = InteractiveShell(None, self.master_config,
478 478 **self.shell_params )
479 479
480 480 def post_construct(self):
481 481 """Do actions after construct, but before starting the app."""
482 482 config = self.master_config
483 483
484 484 # shell.display_banner should always be False for the terminal
485 485 # based app, because we call shell.show_banner() by hand below
486 486 # so the banner shows *before* all extension loading stuff.
487 487 self.shell.display_banner = False
488 488
489 489 if config.Global.display_banner and \
490 490 config.Global.interact:
491 491 self.shell.show_banner()
492 492
493 493 # Make sure there is a space below the banner.
494 494 if self.log_level <= logging.INFO: print
495 495
496 496 # Now a variety of things that happen after the banner is printed.
497 497 self._enable_gui_pylab()
498 498 self._load_extensions()
499 499 self._run_exec_lines()
500 500 self._run_exec_files()
501 501 self._run_cmd_line_code()
502 self._configure_xmode()
503 502
504 503 def _enable_gui_pylab(self):
505 504 """Enable GUI event loop integration, taking pylab into account."""
506 505 Global = self.master_config.Global
507 506
508 507 # Select which gui to use
509 508 if Global.gui:
510 509 gui = Global.gui
511 510 # The following are deprecated, but there's likely to be a lot of use
512 511 # of this form out there, so we might as well support it for now. But
513 512 # the --gui option above takes precedence.
514 513 elif Global.wthread:
515 514 gui = inputhook.GUI_WX
516 515 elif Global.qthread:
517 516 gui = inputhook.GUI_QT
518 517 elif Global.gthread:
519 518 gui = inputhook.GUI_GTK
520 519 else:
521 520 gui = None
522 521
523 522 # Using --pylab will also require gui activation, though which toolkit
524 523 # to use may be chosen automatically based on mpl configuration.
525 524 if Global.pylab:
526 525 activate = self.shell.enable_pylab
527 526 if Global.pylab == 'auto':
528 527 gui = None
529 528 else:
530 529 gui = Global.pylab
531 530 else:
532 531 # Enable only GUI integration, no pylab
533 532 activate = inputhook.enable_gui
534 533
535 534 if gui or Global.pylab:
536 535 try:
537 536 self.log.info("Enabling GUI event loop integration, "
538 537 "toolkit=%s, pylab=%s" % (gui, Global.pylab) )
539 538 activate(gui)
540 539 except:
541 540 self.log.warn("Error in enabling GUI event loop integration:")
542 541 self.shell.showtraceback()
543 542
544 543 def _load_extensions(self):
545 544 """Load all IPython extensions in Global.extensions.
546 545
547 546 This uses the :meth:`InteractiveShell.load_extensions` to load all
548 547 the extensions listed in ``self.master_config.Global.extensions``.
549 548 """
550 549 try:
551 550 if hasattr(self.master_config.Global, 'extensions'):
552 551 self.log.debug("Loading IPython extensions...")
553 552 extensions = self.master_config.Global.extensions
554 553 for ext in extensions:
555 554 try:
556 555 self.log.info("Loading IPython extension: %s" % ext)
557 556 self.shell.load_extension(ext)
558 557 except:
559 558 self.log.warn("Error in loading extension: %s" % ext)
560 559 self.shell.showtraceback()
561 560 except:
562 561 self.log.warn("Unknown error in loading extensions:")
563 562 self.shell.showtraceback()
564 563
565 564 def _run_exec_lines(self):
566 565 """Run lines of code in Global.exec_lines in the user's namespace."""
567 566 try:
568 567 if hasattr(self.master_config.Global, 'exec_lines'):
569 568 self.log.debug("Running code from Global.exec_lines...")
570 569 exec_lines = self.master_config.Global.exec_lines
571 570 for line in exec_lines:
572 571 try:
573 572 self.log.info("Running code in user namespace: %s" % line)
574 573 self.shell.runlines(line)
575 574 except:
576 575 self.log.warn("Error in executing line in user namespace: %s" % line)
577 576 self.shell.showtraceback()
578 577 except:
579 578 self.log.warn("Unknown error in handling Global.exec_lines:")
580 579 self.shell.showtraceback()
581 580
582 581 def _exec_file(self, fname):
583 582 full_filename = filefind(fname, [u'.', self.ipython_dir])
584 583 if os.path.isfile(full_filename):
585 584 if full_filename.endswith(u'.py'):
586 585 self.log.info("Running file in user namespace: %s" % full_filename)
587 586 self.shell.safe_execfile(full_filename, self.shell.user_ns)
588 587 elif full_filename.endswith('.ipy'):
589 588 self.log.info("Running file in user namespace: %s" % full_filename)
590 589 self.shell.safe_execfile_ipy(full_filename)
591 590 else:
592 591 self.log.warn("File does not have a .py or .ipy extension: <%s>" % full_filename)
593 592
594 593 def _run_exec_files(self):
595 594 try:
596 595 if hasattr(self.master_config.Global, 'exec_files'):
597 596 self.log.debug("Running files in Global.exec_files...")
598 597 exec_files = self.master_config.Global.exec_files
599 598 for fname in exec_files:
600 599 self._exec_file(fname)
601 600 except:
602 601 self.log.warn("Unknown error in handling Global.exec_files:")
603 602 self.shell.showtraceback()
604 603
605 604 def _run_cmd_line_code(self):
606 605 if hasattr(self.master_config.Global, 'code_to_run'):
607 606 line = self.master_config.Global.code_to_run
608 607 try:
609 608 self.log.info("Running code given at command line (-c): %s" % line)
610 609 self.shell.runlines(line)
611 610 except:
612 611 self.log.warn("Error in executing line in user namespace: %s" % line)
613 612 self.shell.showtraceback()
614 613 return
615 614 # Like Python itself, ignore the second if the first of these is present
616 615 try:
617 616 fname = self.extra_args[0]
618 617 except:
619 618 pass
620 619 else:
621 620 try:
622 621 self._exec_file(fname)
623 622 except:
624 623 self.log.warn("Error in executing file in user namespace: %s" % fname)
625 624 self.shell.showtraceback()
626 625
627 def _configure_xmode(self):
628 # XXX - shouldn't this be read from the config? I'm still a little
629 # lost with all the details of handling the new config guys...
630 self.shell.InteractiveTB.set_mode(mode=self.shell.xmode)
631
632 626 def start_app(self):
633 627 if self.master_config.Global.interact:
634 628 self.log.debug("Starting IPython's mainloop...")
635 629 self.shell.mainloop()
636 630 else:
637 631 self.log.debug("IPython not interactive, start_app is no-op...")
638 632
639 633
640 634 def load_default_config(ipython_dir=None):
641 635 """Load the default config file from the default ipython_dir.
642 636
643 637 This is useful for embedded shells.
644 638 """
645 639 if ipython_dir is None:
646 640 ipython_dir = get_ipython_dir()
647 641 cl = PyFileConfigLoader(default_config_file_name, ipython_dir)
648 642 config = cl.load_config()
649 643 return config
650 644
651 645
652 646 def launch_new_instance():
653 647 """Create and run a full blown IPython instance"""
654 648 app = IPythonApp()
655 649 app.start()
@@ -1,2549 +1,2558 b''
1 1 # -*- coding: utf-8 -*-
2 2 """
3 3 Main IPython Component
4 4 """
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
8 8 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
9 9 # Copyright (C) 2008-2009 The IPython Development Team
10 10 #
11 11 # Distributed under the terms of the BSD License. The full license is in
12 12 # the file COPYING, distributed as part of this software.
13 13 #-----------------------------------------------------------------------------
14 14
15 15 #-----------------------------------------------------------------------------
16 16 # Imports
17 17 #-----------------------------------------------------------------------------
18 18
19 19 from __future__ import with_statement
20 20 from __future__ import absolute_import
21 21
22 22 import __builtin__
23 import StringIO
24 23 import bdb
25 24 import codeop
26 25 import exceptions
27 26 import new
28 27 import os
29 28 import re
30 29 import string
31 30 import sys
32 31 import tempfile
33 32 from contextlib import nested
34 33
35 34 from IPython.core import debugger, oinspect
36 35 from IPython.core import history as ipcorehist
37 36 from IPython.core import prefilter
38 37 from IPython.core import shadowns
39 38 from IPython.core import ultratb
40 39 from IPython.core.alias import AliasManager
41 40 from IPython.core.builtin_trap import BuiltinTrap
42 41 from IPython.core.component import Component
43 42 from IPython.core.display_trap import DisplayTrap
44 43 from IPython.core.error import TryNext, UsageError
45 44 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
46 45 from IPython.core.logger import Logger
47 46 from IPython.core.magic import Magic
48 47 from IPython.core.prefilter import PrefilterManager
49 48 from IPython.core.prompts import CachedOutput
50 from IPython.core.pylabtools import pylab_activate
51 49 from IPython.core.usage import interactive_usage, default_banner
50 import IPython.core.hooks
52 51 from IPython.external.Itpl import ItplNS
53 52 from IPython.lib.inputhook import enable_gui
54 53 from IPython.lib.backgroundjobs import BackgroundJobManager
54 from IPython.lib.pylabtools import pylab_activate
55 55 from IPython.utils import PyColorize
56 56 from IPython.utils import pickleshare
57 from IPython.utils.genutils import get_ipython_dir
57 from IPython.utils.doctestreload import doctest_reload
58 58 from IPython.utils.ipstruct import Struct
59 from IPython.utils.platutils import toggle_set_term_title, set_term_title
59 from IPython.utils.io import Term, ask_yes_no
60 from IPython.utils.path import get_home_dir, get_ipython_dir, HomeDirError
61 from IPython.utils.process import (
62 abbrev_cwd,
63 getoutput,
64 getoutputerror
65 )
66 # import IPython.utils.rlineimpl as readline
60 67 from IPython.utils.strdispatch import StrDispatch
61 68 from IPython.utils.syspathcontext import prepended_to_syspath
62
63 # XXX - need to clean up this import * line
64 from IPython.utils.genutils import *
65
66 # from IPython.utils import growl
67 # growl.start("IPython")
68
69 from IPython.utils.terminal import toggle_set_term_title, set_term_title
70 from IPython.utils.warn import warn, error, fatal
69 71 from IPython.utils.traitlets import (
70 72 Int, Str, CBool, CaselessStrEnum, Enum, List, Unicode
71 73 )
72 74
75 # from IPython.utils import growl
76 # growl.start("IPython")
77
73 78 #-----------------------------------------------------------------------------
74 79 # Globals
75 80 #-----------------------------------------------------------------------------
76 81
77 82 # store the builtin raw_input globally, and use this always, in case user code
78 83 # overwrites it (like wx.py.PyShell does)
79 84 raw_input_original = raw_input
80 85
81 86 # compiled regexps for autoindent management
82 87 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
83 88
84 89 #-----------------------------------------------------------------------------
85 90 # Utilities
86 91 #-----------------------------------------------------------------------------
87 92
88 93 ini_spaces_re = re.compile(r'^(\s+)')
89 94
90 95
91 96 def num_ini_spaces(strng):
92 97 """Return the number of initial spaces in a string"""
93 98
94 99 ini_spaces = ini_spaces_re.match(strng)
95 100 if ini_spaces:
96 101 return ini_spaces.end()
97 102 else:
98 103 return 0
99 104
100 105
101 106 def softspace(file, newvalue):
102 107 """Copied from code.py, to remove the dependency"""
103 108
104 109 oldvalue = 0
105 110 try:
106 111 oldvalue = file.softspace
107 112 except AttributeError:
108 113 pass
109 114 try:
110 115 file.softspace = newvalue
111 116 except (AttributeError, TypeError):
112 117 # "attribute-less object" or "read-only attributes"
113 118 pass
114 119 return oldvalue
115 120
116 121
117 122 def no_op(*a, **kw): pass
118 123
119 124 class SpaceInInput(exceptions.Exception): pass
120 125
121 126 class Bunch: pass
122 127
123 128 class InputList(list):
124 129 """Class to store user input.
125 130
126 131 It's basically a list, but slices return a string instead of a list, thus
127 132 allowing things like (assuming 'In' is an instance):
128 133
129 134 exec In[4:7]
130 135
131 136 or
132 137
133 138 exec In[5:9] + In[14] + In[21:25]"""
134 139
135 140 def __getslice__(self,i,j):
136 141 return ''.join(list.__getslice__(self,i,j))
137 142
138 143
139 144 class SyntaxTB(ultratb.ListTB):
140 145 """Extension which holds some state: the last exception value"""
141 146
142 147 def __init__(self,color_scheme = 'NoColor'):
143 148 ultratb.ListTB.__init__(self,color_scheme)
144 149 self.last_syntax_error = None
145 150
146 151 def __call__(self, etype, value, elist):
147 152 self.last_syntax_error = value
148 153 ultratb.ListTB.__call__(self,etype,value,elist)
149 154
150 155 def clear_err_state(self):
151 156 """Return the current error state and clear it"""
152 157 e = self.last_syntax_error
153 158 self.last_syntax_error = None
154 159 return e
155 160
156 161
157 162 def get_default_editor():
158 163 try:
159 164 ed = os.environ['EDITOR']
160 165 except KeyError:
161 166 if os.name == 'posix':
162 167 ed = 'vi' # the only one guaranteed to be there!
163 168 else:
164 169 ed = 'notepad' # same in Windows!
165 170 return ed
166 171
167 172
168 173 def get_default_colors():
169 174 if sys.platform=='darwin':
170 175 return "LightBG"
171 176 elif os.name=='nt':
172 177 return 'Linux'
173 178 else:
174 179 return 'Linux'
175 180
176 181
177 182 class SeparateStr(Str):
178 183 """A Str subclass to validate separate_in, separate_out, etc.
179 184
180 185 This is a Str based traitlet that converts '0'->'' and '\\n'->'\n'.
181 186 """
182 187
183 188 def validate(self, obj, value):
184 189 if value == '0': value = ''
185 190 value = value.replace('\\n','\n')
186 191 return super(SeparateStr, self).validate(obj, value)
187 192
188 193
189 194 def make_user_namespaces(user_ns=None, user_global_ns=None):
190 195 """Return a valid local and global user interactive namespaces.
191 196
192 197 This builds a dict with the minimal information needed to operate as a
193 198 valid IPython user namespace, which you can pass to the various
194 199 embedding classes in ipython. The default implementation returns the
195 200 same dict for both the locals and the globals to allow functions to
196 201 refer to variables in the namespace. Customized implementations can
197 202 return different dicts. The locals dictionary can actually be anything
198 203 following the basic mapping protocol of a dict, but the globals dict
199 204 must be a true dict, not even a subclass. It is recommended that any
200 205 custom object for the locals namespace synchronize with the globals
201 206 dict somehow.
202 207
203 208 Raises TypeError if the provided globals namespace is not a true dict.
204 209
205 210 Parameters
206 211 ----------
207 212 user_ns : dict-like, optional
208 213 The current user namespace. The items in this namespace should
209 214 be included in the output. If None, an appropriate blank
210 215 namespace should be created.
211 216 user_global_ns : dict, optional
212 217 The current user global namespace. The items in this namespace
213 218 should be included in the output. If None, an appropriate
214 219 blank namespace should be created.
215 220
216 221 Returns
217 222 -------
218 223 A pair of dictionary-like object to be used as the local namespace
219 224 of the interpreter and a dict to be used as the global namespace.
220 225 """
221 226
222 227
223 228 # We must ensure that __builtin__ (without the final 's') is always
224 229 # available and pointing to the __builtin__ *module*. For more details:
225 230 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
226 231
227 232 if user_ns is None:
228 233 # Set __name__ to __main__ to better match the behavior of the
229 234 # normal interpreter.
230 235 user_ns = {'__name__' :'__main__',
231 236 '__builtin__' : __builtin__,
232 237 '__builtins__' : __builtin__,
233 238 }
234 239 else:
235 240 user_ns.setdefault('__name__','__main__')
236 241 user_ns.setdefault('__builtin__',__builtin__)
237 242 user_ns.setdefault('__builtins__',__builtin__)
238 243
239 244 if user_global_ns is None:
240 245 user_global_ns = user_ns
241 246 if type(user_global_ns) is not dict:
242 247 raise TypeError("user_global_ns must be a true dict; got %r"
243 248 % type(user_global_ns))
244 249
245 250 return user_ns, user_global_ns
246 251
247 252 #-----------------------------------------------------------------------------
248 253 # Main IPython class
249 254 #-----------------------------------------------------------------------------
250 255
251 256
252 257 class InteractiveShell(Component, Magic):
253 258 """An enhanced, interactive shell for Python."""
254 259
255 260 autocall = Enum((0,1,2), default_value=1, config=True)
256 261 autoedit_syntax = CBool(False, config=True)
257 262 autoindent = CBool(True, config=True)
258 263 automagic = CBool(True, config=True)
259 264 banner = Str('')
260 265 banner1 = Str(default_banner, config=True)
261 266 banner2 = Str('', config=True)
262 267 cache_size = Int(1000, config=True)
263 268 color_info = CBool(True, config=True)
264 269 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
265 270 default_value=get_default_colors(), config=True)
266 271 confirm_exit = CBool(True, config=True)
267 272 debug = CBool(False, config=True)
268 273 deep_reload = CBool(False, config=True)
269 274 # This display_banner only controls whether or not self.show_banner()
270 275 # is called when mainloop/interact are called. The default is False
271 276 # because for the terminal based application, the banner behavior
272 277 # is controlled by Global.display_banner, which IPythonApp looks at
273 278 # to determine if *it* should call show_banner() by hand or not.
274 279 display_banner = CBool(False) # This isn't configurable!
275 280 embedded = CBool(False)
276 281 embedded_active = CBool(False)
277 282 editor = Str(get_default_editor(), config=True)
278 283 filename = Str("<ipython console>")
279 284 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
280 285 logstart = CBool(False, config=True)
281 286 logfile = Str('', config=True)
282 287 logappend = Str('', config=True)
283 288 object_info_string_level = Enum((0,1,2), default_value=0,
284 289 config=True)
285 290 pager = Str('less', config=True)
286 291 pdb = CBool(False, config=True)
287 292 pprint = CBool(True, config=True)
288 293 profile = Str('', config=True)
289 294 prompt_in1 = Str('In [\\#]: ', config=True)
290 295 prompt_in2 = Str(' .\\D.: ', config=True)
291 296 prompt_out = Str('Out[\\#]: ', config=True)
292 297 prompts_pad_left = CBool(True, config=True)
293 298 quiet = CBool(False, config=True)
294 299
295 300 readline_use = CBool(True, config=True)
296 301 readline_merge_completions = CBool(True, config=True)
297 302 readline_omit__names = Enum((0,1,2), default_value=0, config=True)
298 303 readline_remove_delims = Str('-/~', config=True)
299 304 readline_parse_and_bind = List([
300 305 'tab: complete',
301 306 '"\C-l": possible-completions',
302 307 'set show-all-if-ambiguous on',
303 308 '"\C-o": tab-insert',
304 309 '"\M-i": " "',
305 310 '"\M-o": "\d\d\d\d"',
306 311 '"\M-I": "\d\d\d\d"',
307 312 '"\C-r": reverse-search-history',
308 313 '"\C-s": forward-search-history',
309 314 '"\C-p": history-search-backward',
310 315 '"\C-n": history-search-forward',
311 316 '"\e[A": history-search-backward',
312 317 '"\e[B": history-search-forward',
313 318 '"\C-k": kill-line',
314 319 '"\C-u": unix-line-discard',
315 320 ], allow_none=False, config=True)
316 321
317 322 screen_length = Int(0, config=True)
318 323
319 324 # Use custom TraitletTypes that convert '0'->'' and '\\n'->'\n'
320 325 separate_in = SeparateStr('\n', config=True)
321 326 separate_out = SeparateStr('', config=True)
322 327 separate_out2 = SeparateStr('', config=True)
323 328
324 329 system_header = Str('IPython system call: ', config=True)
325 330 system_verbose = CBool(False, config=True)
326 331 term_title = CBool(False, config=True)
327 332 wildcards_case_sensitive = CBool(True, config=True)
328 333 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
329 334 default_value='Context', config=True)
330 335
331 336 autoexec = List(allow_none=False)
332 337
333 338 # class attribute to indicate whether the class supports threads or not.
334 339 # Subclasses with thread support should override this as needed.
335 340 isthreaded = False
336 341
337 342 def __init__(self, parent=None, config=None, ipython_dir=None, usage=None,
338 343 user_ns=None, user_global_ns=None,
339 344 banner1=None, banner2=None, display_banner=None,
340 345 custom_exceptions=((),None)):
341 346
342 347 # This is where traitlets with a config_key argument are updated
343 348 # from the values on config.
344 349 super(InteractiveShell, self).__init__(parent, config=config)
345 350
346 351 # These are relatively independent and stateless
347 352 self.init_ipython_dir(ipython_dir)
348 353 self.init_instance_attrs()
349 354 self.init_term_title()
350 355 self.init_usage(usage)
351 356 self.init_banner(banner1, banner2, display_banner)
352 357
353 358 # Create namespaces (user_ns, user_global_ns, etc.)
354 359 self.init_create_namespaces(user_ns, user_global_ns)
355 360 # This has to be done after init_create_namespaces because it uses
356 361 # something in self.user_ns, but before init_sys_modules, which
357 362 # is the first thing to modify sys.
358 363 self.save_sys_module_state()
359 364 self.init_sys_modules()
360 365
361 366 self.init_history()
362 367 self.init_encoding()
363 368 self.init_prefilter()
364 369
365 370 Magic.__init__(self, self)
366 371
367 372 self.init_syntax_highlighting()
368 373 self.init_hooks()
369 374 self.init_pushd_popd_magic()
370 375 self.init_traceback_handlers(custom_exceptions)
371 376 self.init_user_ns()
372 377 self.init_logger()
373 378 self.init_alias()
374 379 self.init_builtins()
375 380
376 381 # pre_config_initialization
377 382 self.init_shadow_hist()
378 383
379 384 # The next section should contain averything that was in ipmaker.
380 385 self.init_logstart()
381 386
382 387 # The following was in post_config_initialization
383 388 self.init_inspector()
384 389 self.init_readline()
385 390 self.init_prompts()
386 391 self.init_displayhook()
387 392 self.init_reload_doctest()
388 393 self.init_magics()
389 394 self.init_pdb()
390 395 self.hooks.late_startup_hook()
391 396
392 397 def get_ipython(self):
393 398 """Return the currently running IPython instance."""
394 399 return self
395 400
396 401 #-------------------------------------------------------------------------
397 402 # Traitlet changed handlers
398 403 #-------------------------------------------------------------------------
399 404
400 405 def _banner1_changed(self):
401 406 self.compute_banner()
402 407
403 408 def _banner2_changed(self):
404 409 self.compute_banner()
405 410
406 411 def _ipython_dir_changed(self, name, new):
407 412 if not os.path.isdir(new):
408 413 os.makedirs(new, mode = 0777)
409 414 if not os.path.isdir(self.ipython_extension_dir):
410 415 os.makedirs(self.ipython_extension_dir, mode = 0777)
411 416
412 417 @property
413 418 def ipython_extension_dir(self):
414 419 return os.path.join(self.ipython_dir, 'extensions')
415 420
416 421 @property
417 422 def usable_screen_length(self):
418 423 if self.screen_length == 0:
419 424 return 0
420 425 else:
421 426 num_lines_bot = self.separate_in.count('\n')+1
422 427 return self.screen_length - num_lines_bot
423 428
424 429 def _term_title_changed(self, name, new_value):
425 430 self.init_term_title()
426 431
427 432 def set_autoindent(self,value=None):
428 433 """Set the autoindent flag, checking for readline support.
429 434
430 435 If called with no arguments, it acts as a toggle."""
431 436
432 437 if not self.has_readline:
433 438 if os.name == 'posix':
434 439 warn("The auto-indent feature requires the readline library")
435 440 self.autoindent = 0
436 441 return
437 442 if value is None:
438 443 self.autoindent = not self.autoindent
439 444 else:
440 445 self.autoindent = value
441 446
442 447 #-------------------------------------------------------------------------
443 448 # init_* methods called by __init__
444 449 #-------------------------------------------------------------------------
445 450
446 451 def init_ipython_dir(self, ipython_dir):
447 452 if ipython_dir is not None:
448 453 self.ipython_dir = ipython_dir
449 454 self.config.Global.ipython_dir = self.ipython_dir
450 455 return
451 456
452 457 if hasattr(self.config.Global, 'ipython_dir'):
453 458 self.ipython_dir = self.config.Global.ipython_dir
454 459 else:
455 460 self.ipython_dir = get_ipython_dir()
456 461
457 462 # All children can just read this
458 463 self.config.Global.ipython_dir = self.ipython_dir
459 464
460 465 def init_instance_attrs(self):
461 466 self.jobs = BackgroundJobManager()
462 467 self.more = False
463 468
464 469 # command compiler
465 470 self.compile = codeop.CommandCompiler()
466 471
467 472 # User input buffer
468 473 self.buffer = []
469 474
470 475 # Make an empty namespace, which extension writers can rely on both
471 476 # existing and NEVER being used by ipython itself. This gives them a
472 477 # convenient location for storing additional information and state
473 478 # their extensions may require, without fear of collisions with other
474 479 # ipython names that may develop later.
475 480 self.meta = Struct()
476 481
477 482 # Object variable to store code object waiting execution. This is
478 483 # used mainly by the multithreaded shells, but it can come in handy in
479 484 # other situations. No need to use a Queue here, since it's a single
480 485 # item which gets cleared once run.
481 486 self.code_to_run = None
482 487
483 488 # Flag to mark unconditional exit
484 489 self.exit_now = False
485 490
486 491 # Temporary files used for various purposes. Deleted at exit.
487 492 self.tempfiles = []
488 493
489 494 # Keep track of readline usage (later set by init_readline)
490 495 self.has_readline = False
491 496
492 497 # keep track of where we started running (mainly for crash post-mortem)
493 498 # This is not being used anywhere currently.
494 499 self.starting_dir = os.getcwd()
495 500
496 501 # Indentation management
497 502 self.indent_current_nsp = 0
498 503
499 504 def init_term_title(self):
500 505 # Enable or disable the terminal title.
501 506 if self.term_title:
502 507 toggle_set_term_title(True)
503 508 set_term_title('IPython: ' + abbrev_cwd())
504 509 else:
505 510 toggle_set_term_title(False)
506 511
507 512 def init_usage(self, usage=None):
508 513 if usage is None:
509 514 self.usage = interactive_usage
510 515 else:
511 516 self.usage = usage
512 517
513 518 def init_encoding(self):
514 519 # Get system encoding at startup time. Certain terminals (like Emacs
515 520 # under Win32 have it set to None, and we need to have a known valid
516 521 # encoding to use in the raw_input() method
517 522 try:
518 523 self.stdin_encoding = sys.stdin.encoding or 'ascii'
519 524 except AttributeError:
520 525 self.stdin_encoding = 'ascii'
521 526
522 527 def init_syntax_highlighting(self):
523 528 # Python source parser/formatter for syntax highlighting
524 529 pyformat = PyColorize.Parser().format
525 530 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
526 531
527 532 def init_pushd_popd_magic(self):
528 533 # for pushd/popd management
529 534 try:
530 535 self.home_dir = get_home_dir()
531 536 except HomeDirError, msg:
532 537 fatal(msg)
533 538
534 539 self.dir_stack = []
535 540
536 541 def init_logger(self):
537 542 self.logger = Logger(self, logfname='ipython_log.py', logmode='rotate')
538 543 # local shortcut, this is used a LOT
539 544 self.log = self.logger.log
540 545
541 546 def init_logstart(self):
542 547 if self.logappend:
543 548 self.magic_logstart(self.logappend + ' append')
544 549 elif self.logfile:
545 550 self.magic_logstart(self.logfile)
546 551 elif self.logstart:
547 552 self.magic_logstart()
548 553
549 554 def init_builtins(self):
550 555 self.builtin_trap = BuiltinTrap(self)
551 556
552 557 def init_inspector(self):
553 558 # Object inspector
554 559 self.inspector = oinspect.Inspector(oinspect.InspectColors,
555 560 PyColorize.ANSICodeColors,
556 561 'NoColor',
557 562 self.object_info_string_level)
558 563
559 564 def init_prompts(self):
560 565 # Initialize cache, set in/out prompts and printing system
561 566 self.outputcache = CachedOutput(self,
562 567 self.cache_size,
563 568 self.pprint,
564 569 input_sep = self.separate_in,
565 570 output_sep = self.separate_out,
566 571 output_sep2 = self.separate_out2,
567 572 ps1 = self.prompt_in1,
568 573 ps2 = self.prompt_in2,
569 574 ps_out = self.prompt_out,
570 575 pad_left = self.prompts_pad_left)
571 576
572 577 # user may have over-ridden the default print hook:
573 578 try:
574 579 self.outputcache.__class__.display = self.hooks.display
575 580 except AttributeError:
576 581 pass
577 582
578 583 def init_displayhook(self):
579 584 self.display_trap = DisplayTrap(self, self.outputcache)
580 585
581 586 def init_reload_doctest(self):
582 587 # Do a proper resetting of doctest, including the necessary displayhook
583 588 # monkeypatching
584 589 try:
585 590 doctest_reload()
586 591 except ImportError:
587 592 warn("doctest module does not exist.")
588 593
589 594 #-------------------------------------------------------------------------
590 595 # Things related to the banner
591 596 #-------------------------------------------------------------------------
592 597
593 598 def init_banner(self, banner1, banner2, display_banner):
594 599 if banner1 is not None:
595 600 self.banner1 = banner1
596 601 if banner2 is not None:
597 602 self.banner2 = banner2
598 603 if display_banner is not None:
599 604 self.display_banner = display_banner
600 605 self.compute_banner()
601 606
602 607 def show_banner(self, banner=None):
603 608 if banner is None:
604 609 banner = self.banner
605 610 self.write(banner)
606 611
607 612 def compute_banner(self):
608 613 self.banner = self.banner1 + '\n'
609 614 if self.profile:
610 615 self.banner += '\nIPython profile: %s\n' % self.profile
611 616 if self.banner2:
612 617 self.banner += '\n' + self.banner2 + '\n'
613 618
614 619 #-------------------------------------------------------------------------
615 620 # Things related to injections into the sys module
616 621 #-------------------------------------------------------------------------
617 622
618 623 def save_sys_module_state(self):
619 624 """Save the state of hooks in the sys module.
620 625
621 626 This has to be called after self.user_ns is created.
622 627 """
623 628 self._orig_sys_module_state = {}
624 629 self._orig_sys_module_state['stdin'] = sys.stdin
625 630 self._orig_sys_module_state['stdout'] = sys.stdout
626 631 self._orig_sys_module_state['stderr'] = sys.stderr
627 632 self._orig_sys_module_state['excepthook'] = sys.excepthook
628 633 try:
629 634 self._orig_sys_modules_main_name = self.user_ns['__name__']
630 635 except KeyError:
631 636 pass
632 637
633 638 def restore_sys_module_state(self):
634 639 """Restore the state of the sys module."""
635 640 try:
636 641 for k, v in self._orig_sys_module_state.items():
637 642 setattr(sys, k, v)
638 643 except AttributeError:
639 644 pass
640 645 try:
641 646 delattr(sys, 'ipcompleter')
642 647 except AttributeError:
643 648 pass
644 649 # Reset what what done in self.init_sys_modules
645 650 try:
646 651 sys.modules[self.user_ns['__name__']] = self._orig_sys_modules_main_name
647 652 except (AttributeError, KeyError):
648 653 pass
649 654
650 655 #-------------------------------------------------------------------------
651 656 # Things related to hooks
652 657 #-------------------------------------------------------------------------
653 658
654 659 def init_hooks(self):
655 660 # hooks holds pointers used for user-side customizations
656 661 self.hooks = Struct()
657 662
658 663 self.strdispatchers = {}
659 664
660 665 # Set all default hooks, defined in the IPython.hooks module.
661 import IPython.core.hooks
662 666 hooks = IPython.core.hooks
663 667 for hook_name in hooks.__all__:
664 668 # default hooks have priority 100, i.e. low; user hooks should have
665 669 # 0-100 priority
666 670 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
667 671
668 672 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
669 673 """set_hook(name,hook) -> sets an internal IPython hook.
670 674
671 675 IPython exposes some of its internal API as user-modifiable hooks. By
672 676 adding your function to one of these hooks, you can modify IPython's
673 677 behavior to call at runtime your own routines."""
674 678
675 679 # At some point in the future, this should validate the hook before it
676 680 # accepts it. Probably at least check that the hook takes the number
677 681 # of args it's supposed to.
678 682
679 683 f = new.instancemethod(hook,self,self.__class__)
680 684
681 685 # check if the hook is for strdispatcher first
682 686 if str_key is not None:
683 687 sdp = self.strdispatchers.get(name, StrDispatch())
684 688 sdp.add_s(str_key, f, priority )
685 689 self.strdispatchers[name] = sdp
686 690 return
687 691 if re_key is not None:
688 692 sdp = self.strdispatchers.get(name, StrDispatch())
689 693 sdp.add_re(re.compile(re_key), f, priority )
690 694 self.strdispatchers[name] = sdp
691 695 return
692 696
693 697 dp = getattr(self.hooks, name, None)
694 698 if name not in IPython.core.hooks.__all__:
695 699 print "Warning! Hook '%s' is not one of %s" % (name, IPython.core.hooks.__all__ )
696 700 if not dp:
697 701 dp = IPython.core.hooks.CommandChainDispatcher()
698 702
699 703 try:
700 704 dp.add(f,priority)
701 705 except AttributeError:
702 706 # it was not commandchain, plain old func - replace
703 707 dp = f
704 708
705 709 setattr(self.hooks,name, dp)
706 710
707 711 #-------------------------------------------------------------------------
708 712 # Things related to the "main" module
709 713 #-------------------------------------------------------------------------
710 714
711 715 def new_main_mod(self,ns=None):
712 716 """Return a new 'main' module object for user code execution.
713 717 """
714 718 main_mod = self._user_main_module
715 719 init_fakemod_dict(main_mod,ns)
716 720 return main_mod
717 721
718 722 def cache_main_mod(self,ns,fname):
719 723 """Cache a main module's namespace.
720 724
721 725 When scripts are executed via %run, we must keep a reference to the
722 726 namespace of their __main__ module (a FakeModule instance) around so
723 727 that Python doesn't clear it, rendering objects defined therein
724 728 useless.
725 729
726 730 This method keeps said reference in a private dict, keyed by the
727 731 absolute path of the module object (which corresponds to the script
728 732 path). This way, for multiple executions of the same script we only
729 733 keep one copy of the namespace (the last one), thus preventing memory
730 734 leaks from old references while allowing the objects from the last
731 735 execution to be accessible.
732 736
733 737 Note: we can not allow the actual FakeModule instances to be deleted,
734 738 because of how Python tears down modules (it hard-sets all their
735 739 references to None without regard for reference counts). This method
736 740 must therefore make a *copy* of the given namespace, to allow the
737 741 original module's __dict__ to be cleared and reused.
738 742
739 743
740 744 Parameters
741 745 ----------
742 746 ns : a namespace (a dict, typically)
743 747
744 748 fname : str
745 749 Filename associated with the namespace.
746 750
747 751 Examples
748 752 --------
749 753
750 754 In [10]: import IPython
751 755
752 756 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
753 757
754 758 In [12]: IPython.__file__ in _ip._main_ns_cache
755 759 Out[12]: True
756 760 """
757 761 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
758 762
759 763 def clear_main_mod_cache(self):
760 764 """Clear the cache of main modules.
761 765
762 766 Mainly for use by utilities like %reset.
763 767
764 768 Examples
765 769 --------
766 770
767 771 In [15]: import IPython
768 772
769 773 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
770 774
771 775 In [17]: len(_ip._main_ns_cache) > 0
772 776 Out[17]: True
773 777
774 778 In [18]: _ip.clear_main_mod_cache()
775 779
776 780 In [19]: len(_ip._main_ns_cache) == 0
777 781 Out[19]: True
778 782 """
779 783 self._main_ns_cache.clear()
780 784
781 785 #-------------------------------------------------------------------------
782 786 # Things related to debugging
783 787 #-------------------------------------------------------------------------
784 788
785 789 def init_pdb(self):
786 790 # Set calling of pdb on exceptions
787 791 # self.call_pdb is a property
788 792 self.call_pdb = self.pdb
789 793
790 794 def _get_call_pdb(self):
791 795 return self._call_pdb
792 796
793 797 def _set_call_pdb(self,val):
794 798
795 799 if val not in (0,1,False,True):
796 800 raise ValueError,'new call_pdb value must be boolean'
797 801
798 802 # store value in instance
799 803 self._call_pdb = val
800 804
801 805 # notify the actual exception handlers
802 806 self.InteractiveTB.call_pdb = val
803 807 if self.isthreaded:
804 808 try:
805 809 self.sys_excepthook.call_pdb = val
806 810 except:
807 811 warn('Failed to activate pdb for threaded exception handler')
808 812
809 813 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
810 814 'Control auto-activation of pdb at exceptions')
811 815
812 816 def debugger(self,force=False):
813 817 """Call the pydb/pdb debugger.
814 818
815 819 Keywords:
816 820
817 821 - force(False): by default, this routine checks the instance call_pdb
818 822 flag and does not actually invoke the debugger if the flag is false.
819 823 The 'force' option forces the debugger to activate even if the flag
820 824 is false.
821 825 """
822 826
823 827 if not (force or self.call_pdb):
824 828 return
825 829
826 830 if not hasattr(sys,'last_traceback'):
827 831 error('No traceback has been produced, nothing to debug.')
828 832 return
829 833
830 834 # use pydb if available
831 835 if debugger.has_pydb:
832 836 from pydb import pm
833 837 else:
834 838 # fallback to our internal debugger
835 839 pm = lambda : self.InteractiveTB.debugger(force=True)
836 840 self.history_saving_wrapper(pm)()
837 841
838 842 #-------------------------------------------------------------------------
839 843 # Things related to IPython's various namespaces
840 844 #-------------------------------------------------------------------------
841 845
842 846 def init_create_namespaces(self, user_ns=None, user_global_ns=None):
843 847 # Create the namespace where the user will operate. user_ns is
844 848 # normally the only one used, and it is passed to the exec calls as
845 849 # the locals argument. But we do carry a user_global_ns namespace
846 850 # given as the exec 'globals' argument, This is useful in embedding
847 851 # situations where the ipython shell opens in a context where the
848 852 # distinction between locals and globals is meaningful. For
849 853 # non-embedded contexts, it is just the same object as the user_ns dict.
850 854
851 855 # FIXME. For some strange reason, __builtins__ is showing up at user
852 856 # level as a dict instead of a module. This is a manual fix, but I
853 857 # should really track down where the problem is coming from. Alex
854 858 # Schmolck reported this problem first.
855 859
856 860 # A useful post by Alex Martelli on this topic:
857 861 # Re: inconsistent value from __builtins__
858 862 # Von: Alex Martelli <aleaxit@yahoo.com>
859 863 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
860 864 # Gruppen: comp.lang.python
861 865
862 866 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
863 867 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
864 868 # > <type 'dict'>
865 869 # > >>> print type(__builtins__)
866 870 # > <type 'module'>
867 871 # > Is this difference in return value intentional?
868 872
869 873 # Well, it's documented that '__builtins__' can be either a dictionary
870 874 # or a module, and it's been that way for a long time. Whether it's
871 875 # intentional (or sensible), I don't know. In any case, the idea is
872 876 # that if you need to access the built-in namespace directly, you
873 877 # should start with "import __builtin__" (note, no 's') which will
874 878 # definitely give you a module. Yeah, it's somewhat confusing:-(.
875 879
876 880 # These routines return properly built dicts as needed by the rest of
877 881 # the code, and can also be used by extension writers to generate
878 882 # properly initialized namespaces.
879 883 user_ns, user_global_ns = make_user_namespaces(user_ns, user_global_ns)
880 884
881 885 # Assign namespaces
882 886 # This is the namespace where all normal user variables live
883 887 self.user_ns = user_ns
884 888 self.user_global_ns = user_global_ns
885 889
886 890 # An auxiliary namespace that checks what parts of the user_ns were
887 891 # loaded at startup, so we can list later only variables defined in
888 892 # actual interactive use. Since it is always a subset of user_ns, it
889 893 # doesn't need to be separately tracked in the ns_table.
890 894 self.user_config_ns = {}
891 895
892 896 # A namespace to keep track of internal data structures to prevent
893 897 # them from cluttering user-visible stuff. Will be updated later
894 898 self.internal_ns = {}
895 899
896 900 # Now that FakeModule produces a real module, we've run into a nasty
897 901 # problem: after script execution (via %run), the module where the user
898 902 # code ran is deleted. Now that this object is a true module (needed
899 903 # so docetst and other tools work correctly), the Python module
900 904 # teardown mechanism runs over it, and sets to None every variable
901 905 # present in that module. Top-level references to objects from the
902 906 # script survive, because the user_ns is updated with them. However,
903 907 # calling functions defined in the script that use other things from
904 908 # the script will fail, because the function's closure had references
905 909 # to the original objects, which are now all None. So we must protect
906 910 # these modules from deletion by keeping a cache.
907 911 #
908 912 # To avoid keeping stale modules around (we only need the one from the
909 913 # last run), we use a dict keyed with the full path to the script, so
910 914 # only the last version of the module is held in the cache. Note,
911 915 # however, that we must cache the module *namespace contents* (their
912 916 # __dict__). Because if we try to cache the actual modules, old ones
913 917 # (uncached) could be destroyed while still holding references (such as
914 918 # those held by GUI objects that tend to be long-lived)>
915 919 #
916 920 # The %reset command will flush this cache. See the cache_main_mod()
917 921 # and clear_main_mod_cache() methods for details on use.
918 922
919 923 # This is the cache used for 'main' namespaces
920 924 self._main_ns_cache = {}
921 925 # And this is the single instance of FakeModule whose __dict__ we keep
922 926 # copying and clearing for reuse on each %run
923 927 self._user_main_module = FakeModule()
924 928
925 929 # A table holding all the namespaces IPython deals with, so that
926 930 # introspection facilities can search easily.
927 931 self.ns_table = {'user':user_ns,
928 932 'user_global':user_global_ns,
929 933 'internal':self.internal_ns,
930 934 'builtin':__builtin__.__dict__
931 935 }
932 936
933 937 # Similarly, track all namespaces where references can be held and that
934 938 # we can safely clear (so it can NOT include builtin). This one can be
935 939 # a simple list.
936 940 self.ns_refs_table = [ user_ns, user_global_ns, self.user_config_ns,
937 941 self.internal_ns, self._main_ns_cache ]
938 942
939 943 def init_sys_modules(self):
940 944 # We need to insert into sys.modules something that looks like a
941 945 # module but which accesses the IPython namespace, for shelve and
942 946 # pickle to work interactively. Normally they rely on getting
943 947 # everything out of __main__, but for embedding purposes each IPython
944 948 # instance has its own private namespace, so we can't go shoving
945 949 # everything into __main__.
946 950
947 951 # note, however, that we should only do this for non-embedded
948 952 # ipythons, which really mimic the __main__.__dict__ with their own
949 953 # namespace. Embedded instances, on the other hand, should not do
950 954 # this because they need to manage the user local/global namespaces
951 955 # only, but they live within a 'normal' __main__ (meaning, they
952 956 # shouldn't overtake the execution environment of the script they're
953 957 # embedded in).
954 958
955 959 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
956 960
957 961 try:
958 962 main_name = self.user_ns['__name__']
959 963 except KeyError:
960 964 raise KeyError('user_ns dictionary MUST have a "__name__" key')
961 965 else:
962 966 sys.modules[main_name] = FakeModule(self.user_ns)
963 967
964 968 def init_user_ns(self):
965 969 """Initialize all user-visible namespaces to their minimum defaults.
966 970
967 971 Certain history lists are also initialized here, as they effectively
968 972 act as user namespaces.
969 973
970 974 Notes
971 975 -----
972 976 All data structures here are only filled in, they are NOT reset by this
973 977 method. If they were not empty before, data will simply be added to
974 978 therm.
975 979 """
976 980 # This function works in two parts: first we put a few things in
977 981 # user_ns, and we sync that contents into user_config_ns so that these
978 982 # initial variables aren't shown by %who. After the sync, we add the
979 983 # rest of what we *do* want the user to see with %who even on a new
980 984 # session (probably nothing, so theye really only see their own stuff)
981 985
982 986 # The user dict must *always* have a __builtin__ reference to the
983 987 # Python standard __builtin__ namespace, which must be imported.
984 988 # This is so that certain operations in prompt evaluation can be
985 989 # reliably executed with builtins. Note that we can NOT use
986 990 # __builtins__ (note the 's'), because that can either be a dict or a
987 991 # module, and can even mutate at runtime, depending on the context
988 992 # (Python makes no guarantees on it). In contrast, __builtin__ is
989 993 # always a module object, though it must be explicitly imported.
990 994
991 995 # For more details:
992 996 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
993 997 ns = dict(__builtin__ = __builtin__)
994 998
995 999 # Put 'help' in the user namespace
996 1000 try:
997 1001 from site import _Helper
998 1002 ns['help'] = _Helper()
999 1003 except ImportError:
1000 1004 warn('help() not available - check site.py')
1001 1005
1002 1006 # make global variables for user access to the histories
1003 1007 ns['_ih'] = self.input_hist
1004 1008 ns['_oh'] = self.output_hist
1005 1009 ns['_dh'] = self.dir_hist
1006 1010
1007 1011 ns['_sh'] = shadowns
1008 1012
1009 1013 # user aliases to input and output histories. These shouldn't show up
1010 1014 # in %who, as they can have very large reprs.
1011 1015 ns['In'] = self.input_hist
1012 1016 ns['Out'] = self.output_hist
1013 1017
1014 1018 # Store myself as the public api!!!
1015 1019 ns['get_ipython'] = self.get_ipython
1016 1020
1017 1021 # Sync what we've added so far to user_config_ns so these aren't seen
1018 1022 # by %who
1019 1023 self.user_config_ns.update(ns)
1020 1024
1021 1025 # Anything put into ns now would show up in %who. Think twice before
1022 1026 # putting anything here, as we really want %who to show the user their
1023 1027 # stuff, not our variables.
1024 1028
1025 1029 # Finally, update the real user's namespace
1026 1030 self.user_ns.update(ns)
1027 1031
1028 1032
1029 1033 def reset(self):
1030 1034 """Clear all internal namespaces.
1031 1035
1032 1036 Note that this is much more aggressive than %reset, since it clears
1033 1037 fully all namespaces, as well as all input/output lists.
1034 1038 """
1035 1039 for ns in self.ns_refs_table:
1036 1040 ns.clear()
1037 1041
1038 1042 self.alias_manager.clear_aliases()
1039 1043
1040 1044 # Clear input and output histories
1041 1045 self.input_hist[:] = []
1042 1046 self.input_hist_raw[:] = []
1043 1047 self.output_hist.clear()
1044 1048
1045 1049 # Restore the user namespaces to minimal usability
1046 1050 self.init_user_ns()
1047 1051
1048 1052 # Restore the default and user aliases
1049 1053 self.alias_manager.init_aliases()
1050 1054
1051 1055 def push(self, variables, interactive=True):
1052 1056 """Inject a group of variables into the IPython user namespace.
1053 1057
1054 1058 Parameters
1055 1059 ----------
1056 1060 variables : dict, str or list/tuple of str
1057 1061 The variables to inject into the user's namespace. If a dict,
1058 1062 a simple update is done. If a str, the string is assumed to
1059 1063 have variable names separated by spaces. A list/tuple of str
1060 1064 can also be used to give the variable names. If just the variable
1061 1065 names are give (list/tuple/str) then the variable values looked
1062 1066 up in the callers frame.
1063 1067 interactive : bool
1064 1068 If True (default), the variables will be listed with the ``who``
1065 1069 magic.
1066 1070 """
1067 1071 vdict = None
1068 1072
1069 1073 # We need a dict of name/value pairs to do namespace updates.
1070 1074 if isinstance(variables, dict):
1071 1075 vdict = variables
1072 1076 elif isinstance(variables, (basestring, list, tuple)):
1073 1077 if isinstance(variables, basestring):
1074 1078 vlist = variables.split()
1075 1079 else:
1076 1080 vlist = variables
1077 1081 vdict = {}
1078 1082 cf = sys._getframe(1)
1079 1083 for name in vlist:
1080 1084 try:
1081 1085 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1082 1086 except:
1083 1087 print ('Could not get variable %s from %s' %
1084 1088 (name,cf.f_code.co_name))
1085 1089 else:
1086 1090 raise ValueError('variables must be a dict/str/list/tuple')
1087 1091
1088 1092 # Propagate variables to user namespace
1089 1093 self.user_ns.update(vdict)
1090 1094
1091 1095 # And configure interactive visibility
1092 1096 config_ns = self.user_config_ns
1093 1097 if interactive:
1094 1098 for name, val in vdict.iteritems():
1095 1099 config_ns.pop(name, None)
1096 1100 else:
1097 1101 for name,val in vdict.iteritems():
1098 1102 config_ns[name] = val
1099 1103
1100 1104 #-------------------------------------------------------------------------
1101 1105 # Things related to history management
1102 1106 #-------------------------------------------------------------------------
1103 1107
1104 1108 def init_history(self):
1105 1109 # List of input with multi-line handling.
1106 1110 self.input_hist = InputList()
1107 1111 # This one will hold the 'raw' input history, without any
1108 1112 # pre-processing. This will allow users to retrieve the input just as
1109 1113 # it was exactly typed in by the user, with %hist -r.
1110 1114 self.input_hist_raw = InputList()
1111 1115
1112 1116 # list of visited directories
1113 1117 try:
1114 1118 self.dir_hist = [os.getcwd()]
1115 1119 except OSError:
1116 1120 self.dir_hist = []
1117 1121
1118 1122 # dict of output history
1119 1123 self.output_hist = {}
1120 1124
1121 1125 # Now the history file
1122 1126 if self.profile:
1123 1127 histfname = 'history-%s' % self.profile
1124 1128 else:
1125 1129 histfname = 'history'
1126 1130 self.histfile = os.path.join(self.ipython_dir, histfname)
1127 1131
1128 1132 # Fill the history zero entry, user counter starts at 1
1129 1133 self.input_hist.append('\n')
1130 1134 self.input_hist_raw.append('\n')
1131 1135
1132 1136 def init_shadow_hist(self):
1133 1137 try:
1134 1138 self.db = pickleshare.PickleShareDB(self.ipython_dir + "/db")
1135 1139 except exceptions.UnicodeDecodeError:
1136 1140 print "Your ipython_dir can't be decoded to unicode!"
1137 1141 print "Please set HOME environment variable to something that"
1138 1142 print r"only has ASCII characters, e.g. c:\home"
1139 1143 print "Now it is", self.ipython_dir
1140 1144 sys.exit()
1141 1145 self.shadowhist = ipcorehist.ShadowHist(self.db)
1142 1146
1143 1147 def savehist(self):
1144 1148 """Save input history to a file (via readline library)."""
1145 1149
1146 1150 try:
1147 1151 self.readline.write_history_file(self.histfile)
1148 1152 except:
1149 1153 print 'Unable to save IPython command history to file: ' + \
1150 1154 `self.histfile`
1151 1155
1152 1156 def reloadhist(self):
1153 1157 """Reload the input history from disk file."""
1154 1158
1155 1159 try:
1156 1160 self.readline.clear_history()
1157 1161 self.readline.read_history_file(self.shell.histfile)
1158 1162 except AttributeError:
1159 1163 pass
1160 1164
1161 1165 def history_saving_wrapper(self, func):
1162 1166 """ Wrap func for readline history saving
1163 1167
1164 1168 Convert func into callable that saves & restores
1165 1169 history around the call """
1166 1170
1167 if not self.has_readline:
1171 if self.has_readline:
1172 from IPython.utils import rlineimpl as readline
1173 else:
1168 1174 return func
1169 1175
1170 1176 def wrapper():
1171 1177 self.savehist()
1172 1178 try:
1173 1179 func()
1174 1180 finally:
1175 1181 readline.read_history_file(self.histfile)
1176 1182 return wrapper
1177 1183
1178 1184 #-------------------------------------------------------------------------
1179 1185 # Things related to exception handling and tracebacks (not debugging)
1180 1186 #-------------------------------------------------------------------------
1181 1187
1182 1188 def init_traceback_handlers(self, custom_exceptions):
1183 1189 # Syntax error handler.
1184 1190 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
1185 1191
1186 1192 # The interactive one is initialized with an offset, meaning we always
1187 1193 # want to remove the topmost item in the traceback, which is our own
1188 1194 # internal code. Valid modes: ['Plain','Context','Verbose']
1189 1195 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1190 1196 color_scheme='NoColor',
1191 1197 tb_offset = 1)
1192 1198
1193 1199 # The instance will store a pointer to the system-wide exception hook,
1194 1200 # so that runtime code (such as magics) can access it. This is because
1195 1201 # during the read-eval loop, it may get temporarily overwritten.
1196 1202 self.sys_excepthook = sys.excepthook
1197 1203
1198 1204 # and add any custom exception handlers the user may have specified
1199 1205 self.set_custom_exc(*custom_exceptions)
1200 1206
1207 # Set the exception mode
1208 self.InteractiveTB.set_mode(mode=self.xmode)
1209
1201 1210 def set_custom_exc(self,exc_tuple,handler):
1202 1211 """set_custom_exc(exc_tuple,handler)
1203 1212
1204 1213 Set a custom exception handler, which will be called if any of the
1205 1214 exceptions in exc_tuple occur in the mainloop (specifically, in the
1206 1215 runcode() method.
1207 1216
1208 1217 Inputs:
1209 1218
1210 1219 - exc_tuple: a *tuple* of valid exceptions to call the defined
1211 1220 handler for. It is very important that you use a tuple, and NOT A
1212 1221 LIST here, because of the way Python's except statement works. If
1213 1222 you only want to trap a single exception, use a singleton tuple:
1214 1223
1215 1224 exc_tuple == (MyCustomException,)
1216 1225
1217 1226 - handler: this must be defined as a function with the following
1218 1227 basic interface: def my_handler(self,etype,value,tb).
1219 1228
1220 1229 This will be made into an instance method (via new.instancemethod)
1221 1230 of IPython itself, and it will be called if any of the exceptions
1222 1231 listed in the exc_tuple are caught. If the handler is None, an
1223 1232 internal basic one is used, which just prints basic info.
1224 1233
1225 1234 WARNING: by putting in your own exception handler into IPython's main
1226 1235 execution loop, you run a very good chance of nasty crashes. This
1227 1236 facility should only be used if you really know what you are doing."""
1228 1237
1229 1238 assert type(exc_tuple)==type(()) , \
1230 1239 "The custom exceptions must be given AS A TUPLE."
1231 1240
1232 1241 def dummy_handler(self,etype,value,tb):
1233 1242 print '*** Simple custom exception handler ***'
1234 1243 print 'Exception type :',etype
1235 1244 print 'Exception value:',value
1236 1245 print 'Traceback :',tb
1237 1246 print 'Source code :','\n'.join(self.buffer)
1238 1247
1239 1248 if handler is None: handler = dummy_handler
1240 1249
1241 1250 self.CustomTB = new.instancemethod(handler,self,self.__class__)
1242 1251 self.custom_exceptions = exc_tuple
1243 1252
1244 1253 def excepthook(self, etype, value, tb):
1245 1254 """One more defense for GUI apps that call sys.excepthook.
1246 1255
1247 1256 GUI frameworks like wxPython trap exceptions and call
1248 1257 sys.excepthook themselves. I guess this is a feature that
1249 1258 enables them to keep running after exceptions that would
1250 1259 otherwise kill their mainloop. This is a bother for IPython
1251 1260 which excepts to catch all of the program exceptions with a try:
1252 1261 except: statement.
1253 1262
1254 1263 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1255 1264 any app directly invokes sys.excepthook, it will look to the user like
1256 1265 IPython crashed. In order to work around this, we can disable the
1257 1266 CrashHandler and replace it with this excepthook instead, which prints a
1258 1267 regular traceback using our InteractiveTB. In this fashion, apps which
1259 1268 call sys.excepthook will generate a regular-looking exception from
1260 1269 IPython, and the CrashHandler will only be triggered by real IPython
1261 1270 crashes.
1262 1271
1263 1272 This hook should be used sparingly, only in places which are not likely
1264 1273 to be true IPython errors.
1265 1274 """
1266 1275 self.showtraceback((etype,value,tb),tb_offset=0)
1267 1276
1268 1277 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1269 1278 exception_only=False):
1270 1279 """Display the exception that just occurred.
1271 1280
1272 1281 If nothing is known about the exception, this is the method which
1273 1282 should be used throughout the code for presenting user tracebacks,
1274 1283 rather than directly invoking the InteractiveTB object.
1275 1284
1276 1285 A specific showsyntaxerror() also exists, but this method can take
1277 1286 care of calling it if needed, so unless you are explicitly catching a
1278 1287 SyntaxError exception, don't try to analyze the stack manually and
1279 1288 simply call this method."""
1280 1289
1281 1290 try:
1282 1291 if exc_tuple is None:
1283 1292 etype, value, tb = sys.exc_info()
1284 1293 else:
1285 1294 etype, value, tb = exc_tuple
1286 1295
1287 1296 if etype is None:
1288 1297 if hasattr(sys, 'last_type'):
1289 1298 etype, value, tb = sys.last_type, sys.last_value, \
1290 1299 sys.last_traceback
1291 1300 else:
1292 1301 self.write('No traceback available to show.\n')
1293 1302 return
1294 1303
1295 1304 if etype is SyntaxError:
1296 1305 # Though this won't be called by syntax errors in the input
1297 1306 # line, there may be SyntaxError cases whith imported code.
1298 1307 self.showsyntaxerror(filename)
1299 1308 elif etype is UsageError:
1300 1309 print "UsageError:", value
1301 1310 else:
1302 1311 # WARNING: these variables are somewhat deprecated and not
1303 1312 # necessarily safe to use in a threaded environment, but tools
1304 1313 # like pdb depend on their existence, so let's set them. If we
1305 1314 # find problems in the field, we'll need to revisit their use.
1306 1315 sys.last_type = etype
1307 1316 sys.last_value = value
1308 1317 sys.last_traceback = tb
1309 1318
1310 1319 if etype in self.custom_exceptions:
1311 1320 self.CustomTB(etype,value,tb)
1312 1321 else:
1313 1322 if exception_only:
1314 1323 m = ('An exception has occurred, use %tb to see the '
1315 1324 'full traceback.')
1316 1325 print m
1317 1326 self.InteractiveTB.show_exception_only(etype, value)
1318 1327 else:
1319 1328 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1320 1329 if self.InteractiveTB.call_pdb:
1321 1330 # pdb mucks up readline, fix it back
1322 1331 self.set_completer()
1323 1332
1324 1333 except KeyboardInterrupt:
1325 1334 self.write("\nKeyboardInterrupt\n")
1326 1335
1327 1336
1328 1337 def showsyntaxerror(self, filename=None):
1329 1338 """Display the syntax error that just occurred.
1330 1339
1331 1340 This doesn't display a stack trace because there isn't one.
1332 1341
1333 1342 If a filename is given, it is stuffed in the exception instead
1334 1343 of what was there before (because Python's parser always uses
1335 1344 "<string>" when reading from a string).
1336 1345 """
1337 1346 etype, value, last_traceback = sys.exc_info()
1338 1347
1339 1348 # See note about these variables in showtraceback() above
1340 1349 sys.last_type = etype
1341 1350 sys.last_value = value
1342 1351 sys.last_traceback = last_traceback
1343 1352
1344 1353 if filename and etype is SyntaxError:
1345 1354 # Work hard to stuff the correct filename in the exception
1346 1355 try:
1347 1356 msg, (dummy_filename, lineno, offset, line) = value
1348 1357 except:
1349 1358 # Not the format we expect; leave it alone
1350 1359 pass
1351 1360 else:
1352 1361 # Stuff in the right filename
1353 1362 try:
1354 1363 # Assume SyntaxError is a class exception
1355 1364 value = SyntaxError(msg, (filename, lineno, offset, line))
1356 1365 except:
1357 1366 # If that failed, assume SyntaxError is a string
1358 1367 value = msg, (filename, lineno, offset, line)
1359 1368 self.SyntaxTB(etype,value,[])
1360 1369
1361 1370 def edit_syntax_error(self):
1362 1371 """The bottom half of the syntax error handler called in the main loop.
1363 1372
1364 1373 Loop until syntax error is fixed or user cancels.
1365 1374 """
1366 1375
1367 1376 while self.SyntaxTB.last_syntax_error:
1368 1377 # copy and clear last_syntax_error
1369 1378 err = self.SyntaxTB.clear_err_state()
1370 1379 if not self._should_recompile(err):
1371 1380 return
1372 1381 try:
1373 1382 # may set last_syntax_error again if a SyntaxError is raised
1374 1383 self.safe_execfile(err.filename,self.user_ns)
1375 1384 except:
1376 1385 self.showtraceback()
1377 1386 else:
1378 1387 try:
1379 1388 f = file(err.filename)
1380 1389 try:
1381 1390 # This should be inside a display_trap block and I
1382 1391 # think it is.
1383 1392 sys.displayhook(f.read())
1384 1393 finally:
1385 1394 f.close()
1386 1395 except:
1387 1396 self.showtraceback()
1388 1397
1389 1398 def _should_recompile(self,e):
1390 1399 """Utility routine for edit_syntax_error"""
1391 1400
1392 1401 if e.filename in ('<ipython console>','<input>','<string>',
1393 1402 '<console>','<BackgroundJob compilation>',
1394 1403 None):
1395 1404
1396 1405 return False
1397 1406 try:
1398 1407 if (self.autoedit_syntax and
1399 1408 not self.ask_yes_no('Return to editor to correct syntax error? '
1400 1409 '[Y/n] ','y')):
1401 1410 return False
1402 1411 except EOFError:
1403 1412 return False
1404 1413
1405 1414 def int0(x):
1406 1415 try:
1407 1416 return int(x)
1408 1417 except TypeError:
1409 1418 return 0
1410 1419 # always pass integer line and offset values to editor hook
1411 1420 try:
1412 1421 self.hooks.fix_error_editor(e.filename,
1413 1422 int0(e.lineno),int0(e.offset),e.msg)
1414 1423 except TryNext:
1415 1424 warn('Could not open editor')
1416 1425 return False
1417 1426 return True
1418 1427
1419 1428 #-------------------------------------------------------------------------
1420 1429 # Things related to tab completion
1421 1430 #-------------------------------------------------------------------------
1422 1431
1423 1432 def complete(self, text):
1424 1433 """Return a sorted list of all possible completions on text.
1425 1434
1426 1435 Inputs:
1427 1436
1428 1437 - text: a string of text to be completed on.
1429 1438
1430 1439 This is a wrapper around the completion mechanism, similar to what
1431 1440 readline does at the command line when the TAB key is hit. By
1432 1441 exposing it as a method, it can be used by other non-readline
1433 1442 environments (such as GUIs) for text completion.
1434 1443
1435 1444 Simple usage example:
1436 1445
1437 1446 In [7]: x = 'hello'
1438 1447
1439 1448 In [8]: x
1440 1449 Out[8]: 'hello'
1441 1450
1442 1451 In [9]: print x
1443 1452 hello
1444 1453
1445 1454 In [10]: _ip.complete('x.l')
1446 1455 Out[10]: ['x.ljust', 'x.lower', 'x.lstrip']
1447 1456 """
1448 1457
1449 1458 # Inject names into __builtin__ so we can complete on the added names.
1450 1459 with self.builtin_trap:
1451 1460 complete = self.Completer.complete
1452 1461 state = 0
1453 1462 # use a dict so we get unique keys, since ipyhton's multiple
1454 1463 # completers can return duplicates. When we make 2.4 a requirement,
1455 1464 # start using sets instead, which are faster.
1456 1465 comps = {}
1457 1466 while True:
1458 1467 newcomp = complete(text,state,line_buffer=text)
1459 1468 if newcomp is None:
1460 1469 break
1461 1470 comps[newcomp] = 1
1462 1471 state += 1
1463 1472 outcomps = comps.keys()
1464 1473 outcomps.sort()
1465 1474 #print "T:",text,"OC:",outcomps # dbg
1466 1475 #print "vars:",self.user_ns.keys()
1467 1476 return outcomps
1468 1477
1469 1478 def set_custom_completer(self,completer,pos=0):
1470 1479 """Adds a new custom completer function.
1471 1480
1472 1481 The position argument (defaults to 0) is the index in the completers
1473 1482 list where you want the completer to be inserted."""
1474 1483
1475 1484 newcomp = new.instancemethod(completer,self.Completer,
1476 1485 self.Completer.__class__)
1477 1486 self.Completer.matchers.insert(pos,newcomp)
1478 1487
1479 1488 def set_completer(self):
1480 1489 """Reset readline's completer to be our own."""
1481 1490 self.readline.set_completer(self.Completer.complete)
1482 1491
1483 1492 def set_completer_frame(self, frame=None):
1484 1493 """Set the frame of the completer."""
1485 1494 if frame:
1486 1495 self.Completer.namespace = frame.f_locals
1487 1496 self.Completer.global_namespace = frame.f_globals
1488 1497 else:
1489 1498 self.Completer.namespace = self.user_ns
1490 1499 self.Completer.global_namespace = self.user_global_ns
1491 1500
1492 1501 #-------------------------------------------------------------------------
1493 1502 # Things related to readline
1494 1503 #-------------------------------------------------------------------------
1495 1504
1496 1505 def init_readline(self):
1497 1506 """Command history completion/saving/reloading."""
1498 1507
1499 1508 if self.readline_use:
1500 1509 import IPython.utils.rlineimpl as readline
1501 1510
1502 1511 self.rl_next_input = None
1503 1512 self.rl_do_indent = False
1504 1513
1505 1514 if not self.readline_use or not readline.have_readline:
1506 1515 self.has_readline = False
1507 1516 self.readline = None
1508 1517 # Set a number of methods that depend on readline to be no-op
1509 1518 self.savehist = no_op
1510 1519 self.reloadhist = no_op
1511 1520 self.set_completer = no_op
1512 1521 self.set_custom_completer = no_op
1513 1522 self.set_completer_frame = no_op
1514 1523 warn('Readline services not available or not loaded.')
1515 1524 else:
1516 1525 self.has_readline = True
1517 1526 self.readline = readline
1518 1527 sys.modules['readline'] = readline
1519 1528 import atexit
1520 1529 from IPython.core.completer import IPCompleter
1521 1530 self.Completer = IPCompleter(self,
1522 1531 self.user_ns,
1523 1532 self.user_global_ns,
1524 1533 self.readline_omit__names,
1525 1534 self.alias_manager.alias_table)
1526 1535 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1527 1536 self.strdispatchers['complete_command'] = sdisp
1528 1537 self.Completer.custom_completers = sdisp
1529 1538 # Platform-specific configuration
1530 1539 if os.name == 'nt':
1531 1540 self.readline_startup_hook = readline.set_pre_input_hook
1532 1541 else:
1533 1542 self.readline_startup_hook = readline.set_startup_hook
1534 1543
1535 1544 # Load user's initrc file (readline config)
1536 1545 # Or if libedit is used, load editrc.
1537 1546 inputrc_name = os.environ.get('INPUTRC')
1538 1547 if inputrc_name is None:
1539 1548 home_dir = get_home_dir()
1540 1549 if home_dir is not None:
1541 1550 inputrc_name = '.inputrc'
1542 1551 if readline.uses_libedit:
1543 1552 inputrc_name = '.editrc'
1544 1553 inputrc_name = os.path.join(home_dir, inputrc_name)
1545 1554 if os.path.isfile(inputrc_name):
1546 1555 try:
1547 1556 readline.read_init_file(inputrc_name)
1548 1557 except:
1549 1558 warn('Problems reading readline initialization file <%s>'
1550 1559 % inputrc_name)
1551 1560
1552 1561 # save this in sys so embedded copies can restore it properly
1553 1562 sys.ipcompleter = self.Completer.complete
1554 1563 self.set_completer()
1555 1564
1556 1565 # Configure readline according to user's prefs
1557 1566 # This is only done if GNU readline is being used. If libedit
1558 1567 # is being used (as on Leopard) the readline config is
1559 1568 # not run as the syntax for libedit is different.
1560 1569 if not readline.uses_libedit:
1561 1570 for rlcommand in self.readline_parse_and_bind:
1562 1571 #print "loading rl:",rlcommand # dbg
1563 1572 readline.parse_and_bind(rlcommand)
1564 1573
1565 1574 # Remove some chars from the delimiters list. If we encounter
1566 1575 # unicode chars, discard them.
1567 1576 delims = readline.get_completer_delims().encode("ascii", "ignore")
1568 1577 delims = delims.translate(string._idmap,
1569 1578 self.readline_remove_delims)
1570 1579 readline.set_completer_delims(delims)
1571 1580 # otherwise we end up with a monster history after a while:
1572 1581 readline.set_history_length(1000)
1573 1582 try:
1574 1583 #print '*** Reading readline history' # dbg
1575 1584 readline.read_history_file(self.histfile)
1576 1585 except IOError:
1577 1586 pass # It doesn't exist yet.
1578 1587
1579 1588 atexit.register(self.atexit_operations)
1580 1589 del atexit
1581 1590
1582 1591 # Configure auto-indent for all platforms
1583 1592 self.set_autoindent(self.autoindent)
1584 1593
1585 1594 def set_next_input(self, s):
1586 1595 """ Sets the 'default' input string for the next command line.
1587 1596
1588 1597 Requires readline.
1589 1598
1590 1599 Example:
1591 1600
1592 1601 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1593 1602 [D:\ipython]|2> Hello Word_ # cursor is here
1594 1603 """
1595 1604
1596 1605 self.rl_next_input = s
1597 1606
1598 1607 def pre_readline(self):
1599 1608 """readline hook to be used at the start of each line.
1600 1609
1601 1610 Currently it handles auto-indent only."""
1602 1611
1603 1612 #debugx('self.indent_current_nsp','pre_readline:')
1604 1613
1605 1614 if self.rl_do_indent:
1606 1615 self.readline.insert_text(self._indent_current_str())
1607 1616 if self.rl_next_input is not None:
1608 1617 self.readline.insert_text(self.rl_next_input)
1609 1618 self.rl_next_input = None
1610 1619
1611 1620 def _indent_current_str(self):
1612 1621 """return the current level of indentation as a string"""
1613 1622 return self.indent_current_nsp * ' '
1614 1623
1615 1624 #-------------------------------------------------------------------------
1616 1625 # Things related to magics
1617 1626 #-------------------------------------------------------------------------
1618 1627
1619 1628 def init_magics(self):
1620 1629 # Set user colors (don't do it in the constructor above so that it
1621 1630 # doesn't crash if colors option is invalid)
1622 1631 self.magic_colors(self.colors)
1623 1632 # History was moved to a separate module
1624 1633 from . import history
1625 1634 history.init_ipython(self)
1626 1635
1627 1636 def magic(self,arg_s):
1628 1637 """Call a magic function by name.
1629 1638
1630 1639 Input: a string containing the name of the magic function to call and any
1631 1640 additional arguments to be passed to the magic.
1632 1641
1633 1642 magic('name -opt foo bar') is equivalent to typing at the ipython
1634 1643 prompt:
1635 1644
1636 1645 In[1]: %name -opt foo bar
1637 1646
1638 1647 To call a magic without arguments, simply use magic('name').
1639 1648
1640 1649 This provides a proper Python function to call IPython's magics in any
1641 1650 valid Python code you can type at the interpreter, including loops and
1642 1651 compound statements.
1643 1652 """
1644 1653 args = arg_s.split(' ',1)
1645 1654 magic_name = args[0]
1646 1655 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
1647 1656
1648 1657 try:
1649 1658 magic_args = args[1]
1650 1659 except IndexError:
1651 1660 magic_args = ''
1652 1661 fn = getattr(self,'magic_'+magic_name,None)
1653 1662 if fn is None:
1654 1663 error("Magic function `%s` not found." % magic_name)
1655 1664 else:
1656 1665 magic_args = self.var_expand(magic_args,1)
1657 1666 with nested(self.builtin_trap,):
1658 1667 result = fn(magic_args)
1659 1668 return result
1660 1669
1661 1670 def define_magic(self, magicname, func):
1662 1671 """Expose own function as magic function for ipython
1663 1672
1664 1673 def foo_impl(self,parameter_s=''):
1665 1674 'My very own magic!. (Use docstrings, IPython reads them).'
1666 1675 print 'Magic function. Passed parameter is between < >:'
1667 1676 print '<%s>' % parameter_s
1668 1677 print 'The self object is:',self
1669 1678
1670 1679 self.define_magic('foo',foo_impl)
1671 1680 """
1672 1681
1673 1682 import new
1674 1683 im = new.instancemethod(func,self, self.__class__)
1675 1684 old = getattr(self, "magic_" + magicname, None)
1676 1685 setattr(self, "magic_" + magicname, im)
1677 1686 return old
1678 1687
1679 1688 #-------------------------------------------------------------------------
1680 1689 # Things related to macros
1681 1690 #-------------------------------------------------------------------------
1682 1691
1683 1692 def define_macro(self, name, themacro):
1684 1693 """Define a new macro
1685 1694
1686 1695 Parameters
1687 1696 ----------
1688 1697 name : str
1689 1698 The name of the macro.
1690 1699 themacro : str or Macro
1691 1700 The action to do upon invoking the macro. If a string, a new
1692 1701 Macro object is created by passing the string to it.
1693 1702 """
1694 1703
1695 1704 from IPython.core import macro
1696 1705
1697 1706 if isinstance(themacro, basestring):
1698 1707 themacro = macro.Macro(themacro)
1699 1708 if not isinstance(themacro, macro.Macro):
1700 1709 raise ValueError('A macro must be a string or a Macro instance.')
1701 1710 self.user_ns[name] = themacro
1702 1711
1703 1712 #-------------------------------------------------------------------------
1704 1713 # Things related to the running of system commands
1705 1714 #-------------------------------------------------------------------------
1706 1715
1707 1716 def system(self, cmd):
1708 1717 """Make a system call, using IPython."""
1709 1718 return self.hooks.shell_hook(self.var_expand(cmd, depth=2))
1710 1719
1711 1720 #-------------------------------------------------------------------------
1712 1721 # Things related to aliases
1713 1722 #-------------------------------------------------------------------------
1714 1723
1715 1724 def init_alias(self):
1716 1725 self.alias_manager = AliasManager(self, config=self.config)
1717 1726 self.ns_table['alias'] = self.alias_manager.alias_table,
1718 1727
1719 1728 #-------------------------------------------------------------------------
1720 1729 # Things related to the running of code
1721 1730 #-------------------------------------------------------------------------
1722 1731
1723 1732 def ex(self, cmd):
1724 1733 """Execute a normal python statement in user namespace."""
1725 1734 with nested(self.builtin_trap,):
1726 1735 exec cmd in self.user_global_ns, self.user_ns
1727 1736
1728 1737 def ev(self, expr):
1729 1738 """Evaluate python expression expr in user namespace.
1730 1739
1731 1740 Returns the result of evaluation
1732 1741 """
1733 1742 with nested(self.builtin_trap,):
1734 1743 return eval(expr, self.user_global_ns, self.user_ns)
1735 1744
1736 1745 def mainloop(self, display_banner=None):
1737 1746 """Start the mainloop.
1738 1747
1739 1748 If an optional banner argument is given, it will override the
1740 1749 internally created default banner.
1741 1750 """
1742 1751
1743 1752 with nested(self.builtin_trap, self.display_trap):
1744 1753
1745 1754 # if you run stuff with -c <cmd>, raw hist is not updated
1746 1755 # ensure that it's in sync
1747 1756 if len(self.input_hist) != len (self.input_hist_raw):
1748 1757 self.input_hist_raw = InputList(self.input_hist)
1749 1758
1750 1759 while 1:
1751 1760 try:
1752 1761 self.interact(display_banner=display_banner)
1753 1762 #self.interact_with_readline()
1754 1763 # XXX for testing of a readline-decoupled repl loop, call
1755 1764 # interact_with_readline above
1756 1765 break
1757 1766 except KeyboardInterrupt:
1758 1767 # this should not be necessary, but KeyboardInterrupt
1759 1768 # handling seems rather unpredictable...
1760 1769 self.write("\nKeyboardInterrupt in interact()\n")
1761 1770
1762 1771 def interact_prompt(self):
1763 1772 """ Print the prompt (in read-eval-print loop)
1764 1773
1765 1774 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1766 1775 used in standard IPython flow.
1767 1776 """
1768 1777 if self.more:
1769 1778 try:
1770 1779 prompt = self.hooks.generate_prompt(True)
1771 1780 except:
1772 1781 self.showtraceback()
1773 1782 if self.autoindent:
1774 1783 self.rl_do_indent = True
1775 1784
1776 1785 else:
1777 1786 try:
1778 1787 prompt = self.hooks.generate_prompt(False)
1779 1788 except:
1780 1789 self.showtraceback()
1781 1790 self.write(prompt)
1782 1791
1783 1792 def interact_handle_input(self,line):
1784 1793 """ Handle the input line (in read-eval-print loop)
1785 1794
1786 1795 Provided for those who want to implement their own read-eval-print loop (e.g. GUIs), not
1787 1796 used in standard IPython flow.
1788 1797 """
1789 1798 if line.lstrip() == line:
1790 1799 self.shadowhist.add(line.strip())
1791 1800 lineout = self.prefilter_manager.prefilter_lines(line,self.more)
1792 1801
1793 1802 if line.strip():
1794 1803 if self.more:
1795 1804 self.input_hist_raw[-1] += '%s\n' % line
1796 1805 else:
1797 1806 self.input_hist_raw.append('%s\n' % line)
1798 1807
1799 1808
1800 1809 self.more = self.push_line(lineout)
1801 1810 if (self.SyntaxTB.last_syntax_error and
1802 1811 self.autoedit_syntax):
1803 1812 self.edit_syntax_error()
1804 1813
1805 1814 def interact_with_readline(self):
1806 1815 """ Demo of using interact_handle_input, interact_prompt
1807 1816
1808 1817 This is the main read-eval-print loop. If you need to implement your own (e.g. for GUI),
1809 1818 it should work like this.
1810 1819 """
1811 1820 self.readline_startup_hook(self.pre_readline)
1812 1821 while not self.exit_now:
1813 1822 self.interact_prompt()
1814 1823 if self.more:
1815 1824 self.rl_do_indent = True
1816 1825 else:
1817 1826 self.rl_do_indent = False
1818 1827 line = raw_input_original().decode(self.stdin_encoding)
1819 1828 self.interact_handle_input(line)
1820 1829
1821 1830 def interact(self, display_banner=None):
1822 1831 """Closely emulate the interactive Python console."""
1823 1832
1824 1833 # batch run -> do not interact
1825 1834 if self.exit_now:
1826 1835 return
1827 1836
1828 1837 if display_banner is None:
1829 1838 display_banner = self.display_banner
1830 1839 if display_banner:
1831 1840 self.show_banner()
1832 1841
1833 1842 more = 0
1834 1843
1835 1844 # Mark activity in the builtins
1836 1845 __builtin__.__dict__['__IPYTHON__active'] += 1
1837 1846
1838 1847 if self.has_readline:
1839 1848 self.readline_startup_hook(self.pre_readline)
1840 1849 # exit_now is set by a call to %Exit or %Quit, through the
1841 1850 # ask_exit callback.
1842 1851
1843 1852 while not self.exit_now:
1844 1853 self.hooks.pre_prompt_hook()
1845 1854 if more:
1846 1855 try:
1847 1856 prompt = self.hooks.generate_prompt(True)
1848 1857 except:
1849 1858 self.showtraceback()
1850 1859 if self.autoindent:
1851 1860 self.rl_do_indent = True
1852 1861
1853 1862 else:
1854 1863 try:
1855 1864 prompt = self.hooks.generate_prompt(False)
1856 1865 except:
1857 1866 self.showtraceback()
1858 1867 try:
1859 1868 line = self.raw_input(prompt, more)
1860 1869 if self.exit_now:
1861 1870 # quick exit on sys.std[in|out] close
1862 1871 break
1863 1872 if self.autoindent:
1864 1873 self.rl_do_indent = False
1865 1874
1866 1875 except KeyboardInterrupt:
1867 1876 #double-guard against keyboardinterrupts during kbdint handling
1868 1877 try:
1869 1878 self.write('\nKeyboardInterrupt\n')
1870 1879 self.resetbuffer()
1871 1880 # keep cache in sync with the prompt counter:
1872 1881 self.outputcache.prompt_count -= 1
1873 1882
1874 1883 if self.autoindent:
1875 1884 self.indent_current_nsp = 0
1876 1885 more = 0
1877 1886 except KeyboardInterrupt:
1878 1887 pass
1879 1888 except EOFError:
1880 1889 if self.autoindent:
1881 1890 self.rl_do_indent = False
1882 1891 if self.has_readline:
1883 1892 self.readline_startup_hook(None)
1884 1893 self.write('\n')
1885 1894 self.exit()
1886 1895 except bdb.BdbQuit:
1887 1896 warn('The Python debugger has exited with a BdbQuit exception.\n'
1888 1897 'Because of how pdb handles the stack, it is impossible\n'
1889 1898 'for IPython to properly format this particular exception.\n'
1890 1899 'IPython will resume normal operation.')
1891 1900 except:
1892 1901 # exceptions here are VERY RARE, but they can be triggered
1893 1902 # asynchronously by signal handlers, for example.
1894 1903 self.showtraceback()
1895 1904 else:
1896 1905 more = self.push_line(line)
1897 1906 if (self.SyntaxTB.last_syntax_error and
1898 1907 self.autoedit_syntax):
1899 1908 self.edit_syntax_error()
1900 1909
1901 1910 # We are off again...
1902 1911 __builtin__.__dict__['__IPYTHON__active'] -= 1
1903 1912
1904 1913 # Turn off the exit flag, so the mainloop can be restarted if desired
1905 1914 self.exit_now = False
1906 1915
1907 1916 def safe_execfile(self, fname, *where, **kw):
1908 1917 """A safe version of the builtin execfile().
1909 1918
1910 1919 This version will never throw an exception, but instead print
1911 1920 helpful error messages to the screen. This only works on pure
1912 1921 Python files with the .py extension.
1913 1922
1914 1923 Parameters
1915 1924 ----------
1916 1925 fname : string
1917 1926 The name of the file to be executed.
1918 1927 where : tuple
1919 1928 One or two namespaces, passed to execfile() as (globals,locals).
1920 1929 If only one is given, it is passed as both.
1921 1930 exit_ignore : bool (False)
1922 1931 If True, then silence SystemExit for non-zero status (it is always
1923 1932 silenced for zero status, as it is so common).
1924 1933 """
1925 1934 kw.setdefault('exit_ignore', False)
1926 1935
1927 1936 fname = os.path.abspath(os.path.expanduser(fname))
1928 1937
1929 1938 # Make sure we have a .py file
1930 1939 if not fname.endswith('.py'):
1931 1940 warn('File must end with .py to be run using execfile: <%s>' % fname)
1932 1941
1933 1942 # Make sure we can open the file
1934 1943 try:
1935 1944 with open(fname) as thefile:
1936 1945 pass
1937 1946 except:
1938 1947 warn('Could not open file <%s> for safe execution.' % fname)
1939 1948 return
1940 1949
1941 1950 # Find things also in current directory. This is needed to mimic the
1942 1951 # behavior of running a script from the system command line, where
1943 1952 # Python inserts the script's directory into sys.path
1944 1953 dname = os.path.dirname(fname)
1945 1954
1946 1955 with prepended_to_syspath(dname):
1947 1956 try:
1948 1957 execfile(fname,*where)
1949 1958 except SystemExit, status:
1950 1959 # If the call was made with 0 or None exit status (sys.exit(0)
1951 1960 # or sys.exit() ), don't bother showing a traceback, as both of
1952 1961 # these are considered normal by the OS:
1953 1962 # > python -c'import sys;sys.exit(0)'; echo $?
1954 1963 # 0
1955 1964 # > python -c'import sys;sys.exit()'; echo $?
1956 1965 # 0
1957 1966 # For other exit status, we show the exception unless
1958 1967 # explicitly silenced, but only in short form.
1959 1968 if status.code not in (0, None) and not kw['exit_ignore']:
1960 1969 self.showtraceback(exception_only=True)
1961 1970 except:
1962 1971 self.showtraceback()
1963 1972
1964 1973 def safe_execfile_ipy(self, fname):
1965 1974 """Like safe_execfile, but for .ipy files with IPython syntax.
1966 1975
1967 1976 Parameters
1968 1977 ----------
1969 1978 fname : str
1970 1979 The name of the file to execute. The filename must have a
1971 1980 .ipy extension.
1972 1981 """
1973 1982 fname = os.path.abspath(os.path.expanduser(fname))
1974 1983
1975 1984 # Make sure we have a .py file
1976 1985 if not fname.endswith('.ipy'):
1977 1986 warn('File must end with .py to be run using execfile: <%s>' % fname)
1978 1987
1979 1988 # Make sure we can open the file
1980 1989 try:
1981 1990 with open(fname) as thefile:
1982 1991 pass
1983 1992 except:
1984 1993 warn('Could not open file <%s> for safe execution.' % fname)
1985 1994 return
1986 1995
1987 1996 # Find things also in current directory. This is needed to mimic the
1988 1997 # behavior of running a script from the system command line, where
1989 1998 # Python inserts the script's directory into sys.path
1990 1999 dname = os.path.dirname(fname)
1991 2000
1992 2001 with prepended_to_syspath(dname):
1993 2002 try:
1994 2003 with open(fname) as thefile:
1995 2004 script = thefile.read()
1996 2005 # self.runlines currently captures all exceptions
1997 2006 # raise in user code. It would be nice if there were
1998 2007 # versions of runlines, execfile that did raise, so
1999 2008 # we could catch the errors.
2000 2009 self.runlines(script, clean=True)
2001 2010 except:
2002 2011 self.showtraceback()
2003 2012 warn('Unknown failure executing file: <%s>' % fname)
2004 2013
2005 2014 def _is_secondary_block_start(self, s):
2006 2015 if not s.endswith(':'):
2007 2016 return False
2008 2017 if (s.startswith('elif') or
2009 2018 s.startswith('else') or
2010 2019 s.startswith('except') or
2011 2020 s.startswith('finally')):
2012 2021 return True
2013 2022
2014 2023 def cleanup_ipy_script(self, script):
2015 2024 """Make a script safe for self.runlines()
2016 2025
2017 2026 Currently, IPython is lines based, with blocks being detected by
2018 2027 empty lines. This is a problem for block based scripts that may
2019 2028 not have empty lines after blocks. This script adds those empty
2020 2029 lines to make scripts safe for running in the current line based
2021 2030 IPython.
2022 2031 """
2023 2032 res = []
2024 2033 lines = script.splitlines()
2025 2034 level = 0
2026 2035
2027 2036 for l in lines:
2028 2037 lstripped = l.lstrip()
2029 2038 stripped = l.strip()
2030 2039 if not stripped:
2031 2040 continue
2032 2041 newlevel = len(l) - len(lstripped)
2033 2042 if level > 0 and newlevel == 0 and \
2034 2043 not self._is_secondary_block_start(stripped):
2035 2044 # add empty line
2036 2045 res.append('')
2037 2046 res.append(l)
2038 2047 level = newlevel
2039 2048
2040 2049 return '\n'.join(res) + '\n'
2041 2050
2042 2051 def runlines(self, lines, clean=False):
2043 2052 """Run a string of one or more lines of source.
2044 2053
2045 2054 This method is capable of running a string containing multiple source
2046 2055 lines, as if they had been entered at the IPython prompt. Since it
2047 2056 exposes IPython's processing machinery, the given strings can contain
2048 2057 magic calls (%magic), special shell access (!cmd), etc.
2049 2058 """
2050 2059
2051 2060 if isinstance(lines, (list, tuple)):
2052 2061 lines = '\n'.join(lines)
2053 2062
2054 2063 if clean:
2055 2064 lines = self.cleanup_ipy_script(lines)
2056 2065
2057 2066 # We must start with a clean buffer, in case this is run from an
2058 2067 # interactive IPython session (via a magic, for example).
2059 2068 self.resetbuffer()
2060 2069 lines = lines.splitlines()
2061 2070 more = 0
2062 2071
2063 2072 with nested(self.builtin_trap, self.display_trap):
2064 2073 for line in lines:
2065 2074 # skip blank lines so we don't mess up the prompt counter, but do
2066 2075 # NOT skip even a blank line if we are in a code block (more is
2067 2076 # true)
2068 2077
2069 2078 if line or more:
2070 2079 # push to raw history, so hist line numbers stay in sync
2071 2080 self.input_hist_raw.append("# " + line + "\n")
2072 2081 prefiltered = self.prefilter_manager.prefilter_lines(line,more)
2073 2082 more = self.push_line(prefiltered)
2074 2083 # IPython's runsource returns None if there was an error
2075 2084 # compiling the code. This allows us to stop processing right
2076 2085 # away, so the user gets the error message at the right place.
2077 2086 if more is None:
2078 2087 break
2079 2088 else:
2080 2089 self.input_hist_raw.append("\n")
2081 2090 # final newline in case the input didn't have it, so that the code
2082 2091 # actually does get executed
2083 2092 if more:
2084 2093 self.push_line('\n')
2085 2094
2086 2095 def runsource(self, source, filename='<input>', symbol='single'):
2087 2096 """Compile and run some source in the interpreter.
2088 2097
2089 2098 Arguments are as for compile_command().
2090 2099
2091 2100 One several things can happen:
2092 2101
2093 2102 1) The input is incorrect; compile_command() raised an
2094 2103 exception (SyntaxError or OverflowError). A syntax traceback
2095 2104 will be printed by calling the showsyntaxerror() method.
2096 2105
2097 2106 2) The input is incomplete, and more input is required;
2098 2107 compile_command() returned None. Nothing happens.
2099 2108
2100 2109 3) The input is complete; compile_command() returned a code
2101 2110 object. The code is executed by calling self.runcode() (which
2102 2111 also handles run-time exceptions, except for SystemExit).
2103 2112
2104 2113 The return value is:
2105 2114
2106 2115 - True in case 2
2107 2116
2108 2117 - False in the other cases, unless an exception is raised, where
2109 2118 None is returned instead. This can be used by external callers to
2110 2119 know whether to continue feeding input or not.
2111 2120
2112 2121 The return value can be used to decide whether to use sys.ps1 or
2113 2122 sys.ps2 to prompt the next line."""
2114 2123
2115 2124 # if the source code has leading blanks, add 'if 1:\n' to it
2116 2125 # this allows execution of indented pasted code. It is tempting
2117 2126 # to add '\n' at the end of source to run commands like ' a=1'
2118 2127 # directly, but this fails for more complicated scenarios
2119 2128 source=source.encode(self.stdin_encoding)
2120 2129 if source[:1] in [' ', '\t']:
2121 2130 source = 'if 1:\n%s' % source
2122 2131
2123 2132 try:
2124 2133 code = self.compile(source,filename,symbol)
2125 2134 except (OverflowError, SyntaxError, ValueError, TypeError, MemoryError):
2126 2135 # Case 1
2127 2136 self.showsyntaxerror(filename)
2128 2137 return None
2129 2138
2130 2139 if code is None:
2131 2140 # Case 2
2132 2141 return True
2133 2142
2134 2143 # Case 3
2135 2144 # We store the code object so that threaded shells and
2136 2145 # custom exception handlers can access all this info if needed.
2137 2146 # The source corresponding to this can be obtained from the
2138 2147 # buffer attribute as '\n'.join(self.buffer).
2139 2148 self.code_to_run = code
2140 2149 # now actually execute the code object
2141 2150 if self.runcode(code) == 0:
2142 2151 return False
2143 2152 else:
2144 2153 return None
2145 2154
2146 2155 def runcode(self,code_obj):
2147 2156 """Execute a code object.
2148 2157
2149 2158 When an exception occurs, self.showtraceback() is called to display a
2150 2159 traceback.
2151 2160
2152 2161 Return value: a flag indicating whether the code to be run completed
2153 2162 successfully:
2154 2163
2155 2164 - 0: successful execution.
2156 2165 - 1: an error occurred.
2157 2166 """
2158 2167
2159 2168 # Set our own excepthook in case the user code tries to call it
2160 2169 # directly, so that the IPython crash handler doesn't get triggered
2161 2170 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2162 2171
2163 2172 # we save the original sys.excepthook in the instance, in case config
2164 2173 # code (such as magics) needs access to it.
2165 2174 self.sys_excepthook = old_excepthook
2166 2175 outflag = 1 # happens in more places, so it's easier as default
2167 2176 try:
2168 2177 try:
2169 2178 self.hooks.pre_runcode_hook()
2170 2179 exec code_obj in self.user_global_ns, self.user_ns
2171 2180 finally:
2172 2181 # Reset our crash handler in place
2173 2182 sys.excepthook = old_excepthook
2174 2183 except SystemExit:
2175 2184 self.resetbuffer()
2176 2185 self.showtraceback(exception_only=True)
2177 2186 warn("To exit: use any of 'exit', 'quit', %Exit or Ctrl-D.", level=1)
2178 2187 except self.custom_exceptions:
2179 2188 etype,value,tb = sys.exc_info()
2180 2189 self.CustomTB(etype,value,tb)
2181 2190 except:
2182 2191 self.showtraceback()
2183 2192 else:
2184 2193 outflag = 0
2185 2194 if softspace(sys.stdout, 0):
2186 2195 print
2187 2196 # Flush out code object which has been run (and source)
2188 2197 self.code_to_run = None
2189 2198 return outflag
2190 2199
2191 2200 def push_line(self, line):
2192 2201 """Push a line to the interpreter.
2193 2202
2194 2203 The line should not have a trailing newline; it may have
2195 2204 internal newlines. The line is appended to a buffer and the
2196 2205 interpreter's runsource() method is called with the
2197 2206 concatenated contents of the buffer as source. If this
2198 2207 indicates that the command was executed or invalid, the buffer
2199 2208 is reset; otherwise, the command is incomplete, and the buffer
2200 2209 is left as it was after the line was appended. The return
2201 2210 value is 1 if more input is required, 0 if the line was dealt
2202 2211 with in some way (this is the same as runsource()).
2203 2212 """
2204 2213
2205 2214 # autoindent management should be done here, and not in the
2206 2215 # interactive loop, since that one is only seen by keyboard input. We
2207 2216 # need this done correctly even for code run via runlines (which uses
2208 2217 # push).
2209 2218
2210 2219 #print 'push line: <%s>' % line # dbg
2211 2220 for subline in line.splitlines():
2212 2221 self._autoindent_update(subline)
2213 2222 self.buffer.append(line)
2214 2223 more = self.runsource('\n'.join(self.buffer), self.filename)
2215 2224 if not more:
2216 2225 self.resetbuffer()
2217 2226 return more
2218 2227
2219 2228 def _autoindent_update(self,line):
2220 2229 """Keep track of the indent level."""
2221 2230
2222 2231 #debugx('line')
2223 2232 #debugx('self.indent_current_nsp')
2224 2233 if self.autoindent:
2225 2234 if line:
2226 2235 inisp = num_ini_spaces(line)
2227 2236 if inisp < self.indent_current_nsp:
2228 2237 self.indent_current_nsp = inisp
2229 2238
2230 2239 if line[-1] == ':':
2231 2240 self.indent_current_nsp += 4
2232 2241 elif dedent_re.match(line):
2233 2242 self.indent_current_nsp -= 4
2234 2243 else:
2235 2244 self.indent_current_nsp = 0
2236 2245
2237 2246 def resetbuffer(self):
2238 2247 """Reset the input buffer."""
2239 2248 self.buffer[:] = []
2240 2249
2241 2250 def raw_input(self,prompt='',continue_prompt=False):
2242 2251 """Write a prompt and read a line.
2243 2252
2244 2253 The returned line does not include the trailing newline.
2245 2254 When the user enters the EOF key sequence, EOFError is raised.
2246 2255
2247 2256 Optional inputs:
2248 2257
2249 2258 - prompt(''): a string to be printed to prompt the user.
2250 2259
2251 2260 - continue_prompt(False): whether this line is the first one or a
2252 2261 continuation in a sequence of inputs.
2253 2262 """
2254 2263 # growl.notify("raw_input: ", "prompt = %r\ncontinue_prompt = %s" % (prompt, continue_prompt))
2255 2264
2256 2265 # Code run by the user may have modified the readline completer state.
2257 2266 # We must ensure that our completer is back in place.
2258 2267
2259 2268 if self.has_readline:
2260 2269 self.set_completer()
2261 2270
2262 2271 try:
2263 2272 line = raw_input_original(prompt).decode(self.stdin_encoding)
2264 2273 except ValueError:
2265 2274 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
2266 2275 " or sys.stdout.close()!\nExiting IPython!")
2267 2276 self.ask_exit()
2268 2277 return ""
2269 2278
2270 2279 # Try to be reasonably smart about not re-indenting pasted input more
2271 2280 # than necessary. We do this by trimming out the auto-indent initial
2272 2281 # spaces, if the user's actual input started itself with whitespace.
2273 2282 #debugx('self.buffer[-1]')
2274 2283
2275 2284 if self.autoindent:
2276 2285 if num_ini_spaces(line) > self.indent_current_nsp:
2277 2286 line = line[self.indent_current_nsp:]
2278 2287 self.indent_current_nsp = 0
2279 2288
2280 2289 # store the unfiltered input before the user has any chance to modify
2281 2290 # it.
2282 2291 if line.strip():
2283 2292 if continue_prompt:
2284 2293 self.input_hist_raw[-1] += '%s\n' % line
2285 2294 if self.has_readline and self.readline_use:
2286 2295 try:
2287 2296 histlen = self.readline.get_current_history_length()
2288 2297 if histlen > 1:
2289 2298 newhist = self.input_hist_raw[-1].rstrip()
2290 2299 self.readline.remove_history_item(histlen-1)
2291 2300 self.readline.replace_history_item(histlen-2,
2292 2301 newhist.encode(self.stdin_encoding))
2293 2302 except AttributeError:
2294 2303 pass # re{move,place}_history_item are new in 2.4.
2295 2304 else:
2296 2305 self.input_hist_raw.append('%s\n' % line)
2297 2306 # only entries starting at first column go to shadow history
2298 2307 if line.lstrip() == line:
2299 2308 self.shadowhist.add(line.strip())
2300 2309 elif not continue_prompt:
2301 2310 self.input_hist_raw.append('\n')
2302 2311 try:
2303 2312 lineout = self.prefilter_manager.prefilter_lines(line,continue_prompt)
2304 2313 except:
2305 2314 # blanket except, in case a user-defined prefilter crashes, so it
2306 2315 # can't take all of ipython with it.
2307 2316 self.showtraceback()
2308 2317 return ''
2309 2318 else:
2310 2319 return lineout
2311 2320
2312 2321 #-------------------------------------------------------------------------
2313 2322 # Working with components
2314 2323 #-------------------------------------------------------------------------
2315 2324
2316 2325 def get_component(self, name=None, klass=None):
2317 2326 """Fetch a component by name and klass in my tree."""
2318 2327 c = Component.get_instances(root=self, name=name, klass=klass)
2319 2328 if len(c) == 0:
2320 2329 return None
2321 2330 if len(c) == 1:
2322 2331 return c[0]
2323 2332 else:
2324 2333 return c
2325 2334
2326 2335 #-------------------------------------------------------------------------
2327 2336 # IPython extensions
2328 2337 #-------------------------------------------------------------------------
2329 2338
2330 2339 def load_extension(self, module_str):
2331 2340 """Load an IPython extension by its module name.
2332 2341
2333 2342 An IPython extension is an importable Python module that has
2334 2343 a function with the signature::
2335 2344
2336 2345 def load_ipython_extension(ipython):
2337 2346 # Do things with ipython
2338 2347
2339 2348 This function is called after your extension is imported and the
2340 2349 currently active :class:`InteractiveShell` instance is passed as
2341 2350 the only argument. You can do anything you want with IPython at
2342 2351 that point, including defining new magic and aliases, adding new
2343 2352 components, etc.
2344 2353
2345 2354 The :func:`load_ipython_extension` will be called again is you
2346 2355 load or reload the extension again. It is up to the extension
2347 2356 author to add code to manage that.
2348 2357
2349 2358 You can put your extension modules anywhere you want, as long as
2350 2359 they can be imported by Python's standard import mechanism. However,
2351 2360 to make it easy to write extensions, you can also put your extensions
2352 2361 in ``os.path.join(self.ipython_dir, 'extensions')``. This directory
2353 2362 is added to ``sys.path`` automatically.
2354 2363 """
2355 2364 from IPython.utils.syspathcontext import prepended_to_syspath
2356 2365
2357 2366 if module_str not in sys.modules:
2358 2367 with prepended_to_syspath(self.ipython_extension_dir):
2359 2368 __import__(module_str)
2360 2369 mod = sys.modules[module_str]
2361 2370 return self._call_load_ipython_extension(mod)
2362 2371
2363 2372 def unload_extension(self, module_str):
2364 2373 """Unload an IPython extension by its module name.
2365 2374
2366 2375 This function looks up the extension's name in ``sys.modules`` and
2367 2376 simply calls ``mod.unload_ipython_extension(self)``.
2368 2377 """
2369 2378 if module_str in sys.modules:
2370 2379 mod = sys.modules[module_str]
2371 2380 self._call_unload_ipython_extension(mod)
2372 2381
2373 2382 def reload_extension(self, module_str):
2374 2383 """Reload an IPython extension by calling reload.
2375 2384
2376 2385 If the module has not been loaded before,
2377 2386 :meth:`InteractiveShell.load_extension` is called. Otherwise
2378 2387 :func:`reload` is called and then the :func:`load_ipython_extension`
2379 2388 function of the module, if it exists is called.
2380 2389 """
2381 2390 from IPython.utils.syspathcontext import prepended_to_syspath
2382 2391
2383 2392 with prepended_to_syspath(self.ipython_extension_dir):
2384 2393 if module_str in sys.modules:
2385 2394 mod = sys.modules[module_str]
2386 2395 reload(mod)
2387 2396 self._call_load_ipython_extension(mod)
2388 2397 else:
2389 2398 self.load_extension(module_str)
2390 2399
2391 2400 def _call_load_ipython_extension(self, mod):
2392 2401 if hasattr(mod, 'load_ipython_extension'):
2393 2402 return mod.load_ipython_extension(self)
2394 2403
2395 2404 def _call_unload_ipython_extension(self, mod):
2396 2405 if hasattr(mod, 'unload_ipython_extension'):
2397 2406 return mod.unload_ipython_extension(self)
2398 2407
2399 2408 #-------------------------------------------------------------------------
2400 2409 # Things related to the prefilter
2401 2410 #-------------------------------------------------------------------------
2402 2411
2403 2412 def init_prefilter(self):
2404 2413 self.prefilter_manager = PrefilterManager(self, config=self.config)
2405 2414 # Ultimately this will be refactored in the new interpreter code, but
2406 2415 # for now, we should expose the main prefilter method (there's legacy
2407 2416 # code out there that may rely on this).
2408 2417 self.prefilter = self.prefilter_manager.prefilter_lines
2409 2418
2410 2419 #-------------------------------------------------------------------------
2411 2420 # Utilities
2412 2421 #-------------------------------------------------------------------------
2413 2422
2414 2423 def getoutput(self, cmd):
2415 2424 return getoutput(self.var_expand(cmd,depth=2),
2416 2425 header=self.system_header,
2417 2426 verbose=self.system_verbose)
2418 2427
2419 2428 def getoutputerror(self, cmd):
2420 2429 return getoutputerror(self.var_expand(cmd,depth=2),
2421 2430 header=self.system_header,
2422 2431 verbose=self.system_verbose)
2423 2432
2424 2433 def var_expand(self,cmd,depth=0):
2425 2434 """Expand python variables in a string.
2426 2435
2427 2436 The depth argument indicates how many frames above the caller should
2428 2437 be walked to look for the local namespace where to expand variables.
2429 2438
2430 2439 The global namespace for expansion is always the user's interactive
2431 2440 namespace.
2432 2441 """
2433 2442
2434 2443 return str(ItplNS(cmd,
2435 2444 self.user_ns, # globals
2436 2445 # Skip our own frame in searching for locals:
2437 2446 sys._getframe(depth+1).f_locals # locals
2438 2447 ))
2439 2448
2440 2449 def mktempfile(self,data=None):
2441 2450 """Make a new tempfile and return its filename.
2442 2451
2443 2452 This makes a call to tempfile.mktemp, but it registers the created
2444 2453 filename internally so ipython cleans it up at exit time.
2445 2454
2446 2455 Optional inputs:
2447 2456
2448 2457 - data(None): if data is given, it gets written out to the temp file
2449 2458 immediately, and the file is closed again."""
2450 2459
2451 2460 filename = tempfile.mktemp('.py','ipython_edit_')
2452 2461 self.tempfiles.append(filename)
2453 2462
2454 2463 if data:
2455 2464 tmp_file = open(filename,'w')
2456 2465 tmp_file.write(data)
2457 2466 tmp_file.close()
2458 2467 return filename
2459 2468
2460 2469 def write(self,data):
2461 2470 """Write a string to the default output"""
2462 2471 Term.cout.write(data)
2463 2472
2464 2473 def write_err(self,data):
2465 2474 """Write a string to the default error output"""
2466 2475 Term.cerr.write(data)
2467 2476
2468 2477 def ask_yes_no(self,prompt,default=True):
2469 2478 if self.quiet:
2470 2479 return True
2471 2480 return ask_yes_no(prompt,default)
2472 2481
2473 2482 #-------------------------------------------------------------------------
2474 2483 # Things related to GUI support and pylab
2475 2484 #-------------------------------------------------------------------------
2476 2485
2477 2486 def enable_pylab(self, gui=None):
2478 2487 """Activate pylab support at runtime.
2479 2488
2480 2489 This turns on support for matplotlib, preloads into the interactive
2481 2490 namespace all of numpy and pylab, and configures IPython to correcdtly
2482 2491 interact with the GUI event loop. The GUI backend to be used can be
2483 2492 optionally selected with the optional :param:`gui` argument.
2484 2493
2485 2494 Parameters
2486 2495 ----------
2487 2496 gui : optional, string
2488 2497
2489 2498 If given, dictates the choice of matplotlib GUI backend to use
2490 2499 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
2491 2500 'gtk'), otherwise we use the default chosen by matplotlib (as
2492 2501 dictated by the matplotlib build-time options plus the user's
2493 2502 matplotlibrc configuration file).
2494 2503 """
2495 2504 # We want to prevent the loading of pylab to pollute the user's
2496 2505 # namespace as shown by the %who* magics, so we execute the activation
2497 2506 # code in an empty namespace, and we update *both* user_ns and
2498 2507 # user_config_ns with this information.
2499 2508 ns = {}
2500 2509 gui = pylab_activate(ns, gui)
2501 2510 self.user_ns.update(ns)
2502 2511 self.user_config_ns.update(ns)
2503 2512 # Now we must activate the gui pylab wants to use, and fix %run to take
2504 2513 # plot updates into account
2505 2514 enable_gui(gui)
2506 2515 self.magic_run = self._pylab_magic_run
2507 2516
2508 2517 #-------------------------------------------------------------------------
2509 2518 # Things related to IPython exiting
2510 2519 #-------------------------------------------------------------------------
2511 2520
2512 2521 def ask_exit(self):
2513 2522 """ Ask the shell to exit. Can be overiden and used as a callback. """
2514 2523 self.exit_now = True
2515 2524
2516 2525 def exit(self):
2517 2526 """Handle interactive exit.
2518 2527
2519 2528 This method calls the ask_exit callback."""
2520 2529 if self.confirm_exit:
2521 2530 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2522 2531 self.ask_exit()
2523 2532 else:
2524 2533 self.ask_exit()
2525 2534
2526 2535 def atexit_operations(self):
2527 2536 """This will be executed at the time of exit.
2528 2537
2529 2538 Saving of persistent data should be performed here.
2530 2539 """
2531 2540 self.savehist()
2532 2541
2533 2542 # Cleanup all tempfiles left around
2534 2543 for tfile in self.tempfiles:
2535 2544 try:
2536 2545 os.unlink(tfile)
2537 2546 except OSError:
2538 2547 pass
2539 2548
2540 2549 # Clear all user namespaces to release all references cleanly.
2541 2550 self.reset()
2542 2551
2543 2552 # Run user hooks
2544 2553 self.hooks.shutdown_hook()
2545 2554
2546 2555 def cleanup(self):
2547 2556 self.restore_sys_module_state()
2548 2557
2549 2558
@@ -1,41 +1,41 b''
1 1 """Support for interactive macros in IPython"""
2 2
3 3 #*****************************************************************************
4 4 # Copyright (C) 2001-2005 Fernando Perez <fperez@colorado.edu>
5 5 #
6 6 # Distributed under the terms of the BSD License. The full license is in
7 7 # the file COPYING, distributed as part of this software.
8 8 #*****************************************************************************
9 9
10 from IPython.utils.genutils import Term
10 from IPython.utils.io import Term
11 11 from IPython.core.autocall import IPyAutocall
12 12
13 13 class Macro(IPyAutocall):
14 14 """Simple class to store the value of macros as strings.
15 15
16 16 Macro is just a callable that executes a string of IPython
17 17 input when called.
18 18
19 19 Args to macro are available in _margv list if you need them.
20 20 """
21 21
22 22 def __init__(self,data):
23 23
24 24 # store the macro value, as a single string which can be evaluated by
25 25 # runlines()
26 26 self.value = ''.join(data).rstrip()+'\n'
27 27
28 28 def __str__(self):
29 29 return self.value
30 30
31 31 def __repr__(self):
32 32 return 'IPython.macro.Macro(%s)' % repr(self.value)
33 33
34 34 def __call__(self,*args):
35 35 Term.cout.flush()
36 36 self._ip.user_ns['_margv'] = args
37 37 self._ip.runlines(self.value)
38 38
39 39 def __getstate__(self):
40 40 """ needed for safe pickling via %store """
41 41 return {'value': self.value}
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,608 +1,609 b''
1 1 # -*- coding: utf-8 -*-
2 2 """Tools for inspecting Python objects.
3 3
4 4 Uses syntax highlighting for presenting the various information elements.
5 5
6 6 Similar in spirit to the inspect module, but all calls take a name argument to
7 7 reference the name under which an object is being read.
8 8 """
9 9
10 10 #*****************************************************************************
11 11 # Copyright (C) 2001-2004 Fernando Perez <fperez@colorado.edu>
12 12 #
13 13 # Distributed under the terms of the BSD License. The full license is in
14 14 # the file COPYING, distributed as part of this software.
15 15 #*****************************************************************************
16 16
17 17 __all__ = ['Inspector','InspectColors']
18 18
19 19 # stdlib modules
20 20 import __builtin__
21 21 import StringIO
22 22 import inspect
23 23 import linecache
24 24 import os
25 25 import string
26 26 import sys
27 27 import types
28 28
29 29 # IPython's own
30 from IPython.utils import PyColorize
31 from IPython.utils.genutils import indent, Term
32 30 from IPython.core.page import page
33 31 from IPython.external.Itpl import itpl
32 from IPython.utils import PyColorize
33 from IPython.utils.io import Term
34 from IPython.utils.text import indent
34 35 from IPython.utils.wildcard import list_namespace
35 36 from IPython.utils.coloransi import *
36 37
37 38 #****************************************************************************
38 39 # HACK!!! This is a crude fix for bugs in python 2.3's inspect module. We
39 40 # simply monkeypatch inspect with code copied from python 2.4.
40 41 if sys.version_info[:2] == (2,3):
41 42 from inspect import ismodule, getabsfile, modulesbyfile
42 43 def getmodule(object):
43 44 """Return the module an object was defined in, or None if not found."""
44 45 if ismodule(object):
45 46 return object
46 47 if hasattr(object, '__module__'):
47 48 return sys.modules.get(object.__module__)
48 49 try:
49 50 file = getabsfile(object)
50 51 except TypeError:
51 52 return None
52 53 if file in modulesbyfile:
53 54 return sys.modules.get(modulesbyfile[file])
54 55 for module in sys.modules.values():
55 56 if hasattr(module, '__file__'):
56 57 modulesbyfile[
57 58 os.path.realpath(
58 59 getabsfile(module))] = module.__name__
59 60 if file in modulesbyfile:
60 61 return sys.modules.get(modulesbyfile[file])
61 62 main = sys.modules['__main__']
62 63 if not hasattr(object, '__name__'):
63 64 return None
64 65 if hasattr(main, object.__name__):
65 66 mainobject = getattr(main, object.__name__)
66 67 if mainobject is object:
67 68 return main
68 69 builtin = sys.modules['__builtin__']
69 70 if hasattr(builtin, object.__name__):
70 71 builtinobject = getattr(builtin, object.__name__)
71 72 if builtinobject is object:
72 73 return builtin
73 74
74 75 inspect.getmodule = getmodule
75 76
76 77 #****************************************************************************
77 78 # Builtin color schemes
78 79
79 80 Colors = TermColors # just a shorthand
80 81
81 82 # Build a few color schemes
82 83 NoColor = ColorScheme(
83 84 'NoColor',{
84 85 'header' : Colors.NoColor,
85 86 'normal' : Colors.NoColor # color off (usu. Colors.Normal)
86 87 } )
87 88
88 89 LinuxColors = ColorScheme(
89 90 'Linux',{
90 91 'header' : Colors.LightRed,
91 92 'normal' : Colors.Normal # color off (usu. Colors.Normal)
92 93 } )
93 94
94 95 LightBGColors = ColorScheme(
95 96 'LightBG',{
96 97 'header' : Colors.Red,
97 98 'normal' : Colors.Normal # color off (usu. Colors.Normal)
98 99 } )
99 100
100 101 # Build table of color schemes (needed by the parser)
101 102 InspectColors = ColorSchemeTable([NoColor,LinuxColors,LightBGColors],
102 103 'Linux')
103 104
104 105 #****************************************************************************
105 106 # Auxiliary functions
106 107 def getdoc(obj):
107 108 """Stable wrapper around inspect.getdoc.
108 109
109 110 This can't crash because of attribute problems.
110 111
111 112 It also attempts to call a getdoc() method on the given object. This
112 113 allows objects which provide their docstrings via non-standard mechanisms
113 114 (like Pyro proxies) to still be inspected by ipython's ? system."""
114 115
115 116 ds = None # default return value
116 117 try:
117 118 ds = inspect.getdoc(obj)
118 119 except:
119 120 # Harden against an inspect failure, which can occur with
120 121 # SWIG-wrapped extensions.
121 122 pass
122 123 # Allow objects to offer customized documentation via a getdoc method:
123 124 try:
124 125 ds2 = obj.getdoc()
125 126 except:
126 127 pass
127 128 else:
128 129 # if we get extra info, we add it to the normal docstring.
129 130 if ds is None:
130 131 ds = ds2
131 132 else:
132 133 ds = '%s\n%s' % (ds,ds2)
133 134 return ds
134 135
135 136
136 137 def getsource(obj,is_binary=False):
137 138 """Wrapper around inspect.getsource.
138 139
139 140 This can be modified by other projects to provide customized source
140 141 extraction.
141 142
142 143 Inputs:
143 144
144 145 - obj: an object whose source code we will attempt to extract.
145 146
146 147 Optional inputs:
147 148
148 149 - is_binary: whether the object is known to come from a binary source.
149 150 This implementation will skip returning any output for binary objects, but
150 151 custom extractors may know how to meaningfully process them."""
151 152
152 153 if is_binary:
153 154 return None
154 155 else:
155 156 try:
156 157 src = inspect.getsource(obj)
157 158 except TypeError:
158 159 if hasattr(obj,'__class__'):
159 160 src = inspect.getsource(obj.__class__)
160 161 return src
161 162
162 163 def getargspec(obj):
163 164 """Get the names and default values of a function's arguments.
164 165
165 166 A tuple of four things is returned: (args, varargs, varkw, defaults).
166 167 'args' is a list of the argument names (it may contain nested lists).
167 168 'varargs' and 'varkw' are the names of the * and ** arguments or None.
168 169 'defaults' is an n-tuple of the default values of the last n arguments.
169 170
170 171 Modified version of inspect.getargspec from the Python Standard
171 172 Library."""
172 173
173 174 if inspect.isfunction(obj):
174 175 func_obj = obj
175 176 elif inspect.ismethod(obj):
176 177 func_obj = obj.im_func
177 178 else:
178 179 raise TypeError, 'arg is not a Python function'
179 180 args, varargs, varkw = inspect.getargs(func_obj.func_code)
180 181 return args, varargs, varkw, func_obj.func_defaults
181 182
182 183 #****************************************************************************
183 184 # Class definitions
184 185
185 186 class myStringIO(StringIO.StringIO):
186 187 """Adds a writeln method to normal StringIO."""
187 188 def writeln(self,*arg,**kw):
188 189 """Does a write() and then a write('\n')"""
189 190 self.write(*arg,**kw)
190 191 self.write('\n')
191 192
192 193
193 194 class Inspector:
194 195 def __init__(self,color_table,code_color_table,scheme,
195 196 str_detail_level=0):
196 197 self.color_table = color_table
197 198 self.parser = PyColorize.Parser(code_color_table,out='str')
198 199 self.format = self.parser.format
199 200 self.str_detail_level = str_detail_level
200 201 self.set_active_scheme(scheme)
201 202
202 203 def __getdef(self,obj,oname=''):
203 204 """Return the definition header for any callable object.
204 205
205 206 If any exception is generated, None is returned instead and the
206 207 exception is suppressed."""
207 208
208 209 try:
209 210 return oname + inspect.formatargspec(*getargspec(obj))
210 211 except:
211 212 return None
212 213
213 214 def __head(self,h):
214 215 """Return a header string with proper colors."""
215 216 return '%s%s%s' % (self.color_table.active_colors.header,h,
216 217 self.color_table.active_colors.normal)
217 218
218 219 def set_active_scheme(self,scheme):
219 220 self.color_table.set_active_scheme(scheme)
220 221 self.parser.color_table.set_active_scheme(scheme)
221 222
222 223 def noinfo(self,msg,oname):
223 224 """Generic message when no information is found."""
224 225 print 'No %s found' % msg,
225 226 if oname:
226 227 print 'for %s' % oname
227 228 else:
228 229 print
229 230
230 231 def pdef(self,obj,oname=''):
231 232 """Print the definition header for any callable object.
232 233
233 234 If the object is a class, print the constructor information."""
234 235
235 236 if not callable(obj):
236 237 print 'Object is not callable.'
237 238 return
238 239
239 240 header = ''
240 241
241 242 if inspect.isclass(obj):
242 243 header = self.__head('Class constructor information:\n')
243 244 obj = obj.__init__
244 245 elif type(obj) is types.InstanceType:
245 246 obj = obj.__call__
246 247
247 248 output = self.__getdef(obj,oname)
248 249 if output is None:
249 250 self.noinfo('definition header',oname)
250 251 else:
251 252 print >>Term.cout, header,self.format(output),
252 253
253 254 def pdoc(self,obj,oname='',formatter = None):
254 255 """Print the docstring for any object.
255 256
256 257 Optional:
257 258 -formatter: a function to run the docstring through for specially
258 259 formatted docstrings."""
259 260
260 261 head = self.__head # so that itpl can find it even if private
261 262 ds = getdoc(obj)
262 263 if formatter:
263 264 ds = formatter(ds)
264 265 if inspect.isclass(obj):
265 266 init_ds = getdoc(obj.__init__)
266 267 output = itpl('$head("Class Docstring:")\n'
267 268 '$indent(ds)\n'
268 269 '$head("Constructor Docstring"):\n'
269 270 '$indent(init_ds)')
270 271 elif (type(obj) is types.InstanceType or isinstance(obj,object)) \
271 272 and hasattr(obj,'__call__'):
272 273 call_ds = getdoc(obj.__call__)
273 274 if call_ds:
274 275 output = itpl('$head("Class Docstring:")\n$indent(ds)\n'
275 276 '$head("Calling Docstring:")\n$indent(call_ds)')
276 277 else:
277 278 output = ds
278 279 else:
279 280 output = ds
280 281 if output is None:
281 282 self.noinfo('documentation',oname)
282 283 return
283 284 page(output)
284 285
285 286 def psource(self,obj,oname=''):
286 287 """Print the source code for an object."""
287 288
288 289 # Flush the source cache because inspect can return out-of-date source
289 290 linecache.checkcache()
290 291 try:
291 292 src = getsource(obj)
292 293 except:
293 294 self.noinfo('source',oname)
294 295 else:
295 296 page(self.format(src))
296 297
297 298 def pfile(self,obj,oname=''):
298 299 """Show the whole file where an object was defined."""
299 300
300 301 try:
301 302 try:
302 303 lineno = inspect.getsourcelines(obj)[1]
303 304 except TypeError:
304 305 # For instances, try the class object like getsource() does
305 306 if hasattr(obj,'__class__'):
306 307 lineno = inspect.getsourcelines(obj.__class__)[1]
307 308 # Adjust the inspected object so getabsfile() below works
308 309 obj = obj.__class__
309 310 except:
310 311 self.noinfo('file',oname)
311 312 return
312 313
313 314 # We only reach this point if object was successfully queried
314 315
315 316 # run contents of file through pager starting at line
316 317 # where the object is defined
317 318 ofile = inspect.getabsfile(obj)
318 319
319 320 if (ofile.endswith('.so') or ofile.endswith('.dll')):
320 321 print 'File %r is binary, not printing.' % ofile
321 322 elif not os.path.isfile(ofile):
322 323 print 'File %r does not exist, not printing.' % ofile
323 324 else:
324 325 # Print only text files, not extension binaries. Note that
325 326 # getsourcelines returns lineno with 1-offset and page() uses
326 327 # 0-offset, so we must adjust.
327 328 page(self.format(open(ofile).read()),lineno-1)
328 329
329 330 def pinfo(self,obj,oname='',formatter=None,info=None,detail_level=0):
330 331 """Show detailed information about an object.
331 332
332 333 Optional arguments:
333 334
334 335 - oname: name of the variable pointing to the object.
335 336
336 337 - formatter: special formatter for docstrings (see pdoc)
337 338
338 339 - info: a structure with some information fields which may have been
339 340 precomputed already.
340 341
341 342 - detail_level: if set to 1, more information is given.
342 343 """
343 344
344 345 obj_type = type(obj)
345 346
346 347 header = self.__head
347 348 if info is None:
348 349 ismagic = 0
349 350 isalias = 0
350 351 ospace = ''
351 352 else:
352 353 ismagic = info.ismagic
353 354 isalias = info.isalias
354 355 ospace = info.namespace
355 356 # Get docstring, special-casing aliases:
356 357 if isalias:
357 358 if not callable(obj):
358 359 try:
359 360 ds = "Alias to the system command:\n %s" % obj[1]
360 361 except:
361 362 ds = "Alias: " + str(obj)
362 363 else:
363 364 ds = "Alias to " + str(obj)
364 365 if obj.__doc__:
365 366 ds += "\nDocstring:\n" + obj.__doc__
366 367 else:
367 368 ds = getdoc(obj)
368 369 if ds is None:
369 370 ds = '<no docstring>'
370 371 if formatter is not None:
371 372 ds = formatter(ds)
372 373
373 374 # store output in a list which gets joined with \n at the end.
374 375 out = myStringIO()
375 376
376 377 string_max = 200 # max size of strings to show (snipped if longer)
377 378 shalf = int((string_max -5)/2)
378 379
379 380 if ismagic:
380 381 obj_type_name = 'Magic function'
381 382 elif isalias:
382 383 obj_type_name = 'System alias'
383 384 else:
384 385 obj_type_name = obj_type.__name__
385 386 out.writeln(header('Type:\t\t')+obj_type_name)
386 387
387 388 try:
388 389 bclass = obj.__class__
389 390 out.writeln(header('Base Class:\t')+str(bclass))
390 391 except: pass
391 392
392 393 # String form, but snip if too long in ? form (full in ??)
393 394 if detail_level >= self.str_detail_level:
394 395 try:
395 396 ostr = str(obj)
396 397 str_head = 'String Form:'
397 398 if not detail_level and len(ostr)>string_max:
398 399 ostr = ostr[:shalf] + ' <...> ' + ostr[-shalf:]
399 400 ostr = ("\n" + " " * len(str_head.expandtabs())).\
400 401 join(map(string.strip,ostr.split("\n")))
401 402 if ostr.find('\n') > -1:
402 403 # Print multi-line strings starting at the next line.
403 404 str_sep = '\n'
404 405 else:
405 406 str_sep = '\t'
406 407 out.writeln("%s%s%s" % (header(str_head),str_sep,ostr))
407 408 except:
408 409 pass
409 410
410 411 if ospace:
411 412 out.writeln(header('Namespace:\t')+ospace)
412 413
413 414 # Length (for strings and lists)
414 415 try:
415 416 length = str(len(obj))
416 417 out.writeln(header('Length:\t\t')+length)
417 418 except: pass
418 419
419 420 # Filename where object was defined
420 421 binary_file = False
421 422 try:
422 423 try:
423 424 fname = inspect.getabsfile(obj)
424 425 except TypeError:
425 426 # For an instance, the file that matters is where its class was
426 427 # declared.
427 428 if hasattr(obj,'__class__'):
428 429 fname = inspect.getabsfile(obj.__class__)
429 430 if fname.endswith('<string>'):
430 431 fname = 'Dynamically generated function. No source code available.'
431 432 if (fname.endswith('.so') or fname.endswith('.dll')):
432 433 binary_file = True
433 434 out.writeln(header('File:\t\t')+fname)
434 435 except:
435 436 # if anything goes wrong, we don't want to show source, so it's as
436 437 # if the file was binary
437 438 binary_file = True
438 439
439 440 # reconstruct the function definition and print it:
440 441 defln = self.__getdef(obj,oname)
441 442 if defln:
442 443 out.write(header('Definition:\t')+self.format(defln))
443 444
444 445 # Docstrings only in detail 0 mode, since source contains them (we
445 446 # avoid repetitions). If source fails, we add them back, see below.
446 447 if ds and detail_level == 0:
447 448 out.writeln(header('Docstring:\n') + indent(ds))
448 449
449 450 # Original source code for any callable
450 451 if detail_level:
451 452 # Flush the source cache because inspect can return out-of-date
452 453 # source
453 454 linecache.checkcache()
454 455 source_success = False
455 456 try:
456 457 try:
457 458 src = getsource(obj,binary_file)
458 459 except TypeError:
459 460 if hasattr(obj,'__class__'):
460 461 src = getsource(obj.__class__,binary_file)
461 462 if src is not None:
462 463 source = self.format(src)
463 464 out.write(header('Source:\n')+source.rstrip())
464 465 source_success = True
465 466 except Exception, msg:
466 467 pass
467 468
468 469 if ds and not source_success:
469 470 out.writeln(header('Docstring [source file open failed]:\n')
470 471 + indent(ds))
471 472
472 473 # Constructor docstring for classes
473 474 if inspect.isclass(obj):
474 475 # reconstruct the function definition and print it:
475 476 try:
476 477 obj_init = obj.__init__
477 478 except AttributeError:
478 479 init_def = init_ds = None
479 480 else:
480 481 init_def = self.__getdef(obj_init,oname)
481 482 init_ds = getdoc(obj_init)
482 483 # Skip Python's auto-generated docstrings
483 484 if init_ds and \
484 485 init_ds.startswith('x.__init__(...) initializes'):
485 486 init_ds = None
486 487
487 488 if init_def or init_ds:
488 489 out.writeln(header('\nConstructor information:'))
489 490 if init_def:
490 491 out.write(header('Definition:\t')+ self.format(init_def))
491 492 if init_ds:
492 493 out.writeln(header('Docstring:\n') + indent(init_ds))
493 494 # and class docstring for instances:
494 495 elif obj_type is types.InstanceType or \
495 496 isinstance(obj,object):
496 497
497 498 # First, check whether the instance docstring is identical to the
498 499 # class one, and print it separately if they don't coincide. In
499 500 # most cases they will, but it's nice to print all the info for
500 501 # objects which use instance-customized docstrings.
501 502 if ds:
502 503 try:
503 504 cls = getattr(obj,'__class__')
504 505 except:
505 506 class_ds = None
506 507 else:
507 508 class_ds = getdoc(cls)
508 509 # Skip Python's auto-generated docstrings
509 510 if class_ds and \
510 511 (class_ds.startswith('function(code, globals[,') or \
511 512 class_ds.startswith('instancemethod(function, instance,') or \
512 513 class_ds.startswith('module(name[,') ):
513 514 class_ds = None
514 515 if class_ds and ds != class_ds:
515 516 out.writeln(header('Class Docstring:\n') +
516 517 indent(class_ds))
517 518
518 519 # Next, try to show constructor docstrings
519 520 try:
520 521 init_ds = getdoc(obj.__init__)
521 522 # Skip Python's auto-generated docstrings
522 523 if init_ds and \
523 524 init_ds.startswith('x.__init__(...) initializes'):
524 525 init_ds = None
525 526 except AttributeError:
526 527 init_ds = None
527 528 if init_ds:
528 529 out.writeln(header('Constructor Docstring:\n') +
529 530 indent(init_ds))
530 531
531 532 # Call form docstring for callable instances
532 533 if hasattr(obj,'__call__'):
533 534 #out.writeln(header('Callable:\t')+'Yes')
534 535 call_def = self.__getdef(obj.__call__,oname)
535 536 #if call_def is None:
536 537 # out.writeln(header('Call def:\t')+
537 538 # 'Calling definition not available.')
538 539 if call_def is not None:
539 540 out.writeln(header('Call def:\t')+self.format(call_def))
540 541 call_ds = getdoc(obj.__call__)
541 542 # Skip Python's auto-generated docstrings
542 543 if call_ds and call_ds.startswith('x.__call__(...) <==> x(...)'):
543 544 call_ds = None
544 545 if call_ds:
545 546 out.writeln(header('Call docstring:\n') + indent(call_ds))
546 547
547 548 # Finally send to printer/pager
548 549 output = out.getvalue()
549 550 if output:
550 551 page(output)
551 552 # end pinfo
552 553
553 554 def psearch(self,pattern,ns_table,ns_search=[],
554 555 ignore_case=False,show_all=False):
555 556 """Search namespaces with wildcards for objects.
556 557
557 558 Arguments:
558 559
559 560 - pattern: string containing shell-like wildcards to use in namespace
560 561 searches and optionally a type specification to narrow the search to
561 562 objects of that type.
562 563
563 564 - ns_table: dict of name->namespaces for search.
564 565
565 566 Optional arguments:
566 567
567 568 - ns_search: list of namespace names to include in search.
568 569
569 570 - ignore_case(False): make the search case-insensitive.
570 571
571 572 - show_all(False): show all names, including those starting with
572 573 underscores.
573 574 """
574 575 #print 'ps pattern:<%r>' % pattern # dbg
575 576
576 577 # defaults
577 578 type_pattern = 'all'
578 579 filter = ''
579 580
580 581 cmds = pattern.split()
581 582 len_cmds = len(cmds)
582 583 if len_cmds == 1:
583 584 # Only filter pattern given
584 585 filter = cmds[0]
585 586 elif len_cmds == 2:
586 587 # Both filter and type specified
587 588 filter,type_pattern = cmds
588 589 else:
589 590 raise ValueError('invalid argument string for psearch: <%s>' %
590 591 pattern)
591 592
592 593 # filter search namespaces
593 594 for name in ns_search:
594 595 if name not in ns_table:
595 596 raise ValueError('invalid namespace <%s>. Valid names: %s' %
596 597 (name,ns_table.keys()))
597 598
598 599 #print 'type_pattern:',type_pattern # dbg
599 600 search_result = []
600 601 for ns_name in ns_search:
601 602 ns = ns_table[ns_name]
602 603 tmp_res = list(list_namespace(ns,type_pattern,filter,
603 604 ignore_case=ignore_case,
604 605 show_all=show_all))
605 606 search_result.extend(tmp_res)
606 607 search_result.sort()
607 608
608 609 page('\n'.join(search_result))
@@ -1,308 +1,306 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 Paging capabilities for IPython.core
5 5
6 6 Authors:
7 7
8 8 * Brian Granger
9 9 * Fernando Perez
10 10
11 11 Notes
12 12 -----
13 13
14 14 For now this uses ipapi, so it can't be in IPython.utils. If we can get
15 15 rid of that dependency, we could move it there.
16 16 -----
17 17 """
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Copyright (C) 2008-2009 The IPython Development Team
21 21 #
22 22 # Distributed under the terms of the BSD License. The full license is in
23 23 # the file COPYING, distributed as part of this software.
24 24 #-----------------------------------------------------------------------------
25 25
26 26 #-----------------------------------------------------------------------------
27 27 # Imports
28 28 #-----------------------------------------------------------------------------
29 29
30 30 import os
31 31 import re
32 32 import sys
33 import tempfile
33 34
34 35 from IPython.core import ipapi
35 36 from IPython.core.error import TryNext
36 from IPython.utils.genutils import (
37 chop, Term, USE_CURSES
38 )
39
40 if os.name == "nt":
41 from IPython.utils.winconsole import get_console_size
37 from IPython.utils.cursesimport import use_curses
38 from IPython.utils.data import chop
39 from IPython.utils.io import Term
40 from IPython.utils.process import xsys
41 from IPython.utils.terminal import get_terminal_size
42 42
43 43
44 44 #-----------------------------------------------------------------------------
45 45 # Classes and functions
46 46 #-----------------------------------------------------------------------------
47 47
48 48 esc_re = re.compile(r"(\x1b[^m]+m)")
49 49
50 def page_dumb(strng,start=0,screen_lines=25):
50 def page_dumb(strng, start=0, screen_lines=25):
51 51 """Very dumb 'pager' in Python, for when nothing else works.
52 52
53 53 Only moves forward, same interface as page(), except for pager_cmd and
54 54 mode."""
55 55
56 56 out_ln = strng.splitlines()[start:]
57 57 screens = chop(out_ln,screen_lines-1)
58 58 if len(screens) == 1:
59 59 print >>Term.cout, os.linesep.join(screens[0])
60 60 else:
61 61 last_escape = ""
62 62 for scr in screens[0:-1]:
63 63 hunk = os.linesep.join(scr)
64 64 print >>Term.cout, last_escape + hunk
65 65 if not page_more():
66 66 return
67 67 esc_list = esc_re.findall(hunk)
68 68 if len(esc_list) > 0:
69 69 last_escape = esc_list[-1]
70 70 print >>Term.cout, last_escape + os.linesep.join(screens[-1])
71 71
72 #----------------------------------------------------------------------------
73 def page(strng,start=0,screen_lines=0,pager_cmd = None):
72
73 def page(strng, start=0, screen_lines=0, pager_cmd=None):
74 74 """Print a string, piping through a pager after a certain length.
75 75
76 76 The screen_lines parameter specifies the number of *usable* lines of your
77 77 terminal screen (total lines minus lines you need to reserve to show other
78 78 information).
79 79
80 80 If you set screen_lines to a number <=0, page() will try to auto-determine
81 81 your screen size and will only use up to (screen_size+screen_lines) for
82 82 printing, paging after that. That is, if you want auto-detection but need
83 83 to reserve the bottom 3 lines of the screen, use screen_lines = -3, and for
84 84 auto-detection without any lines reserved simply use screen_lines = 0.
85 85
86 86 If a string won't fit in the allowed lines, it is sent through the
87 87 specified pager command. If none given, look for PAGER in the environment,
88 88 and ultimately default to less.
89 89
90 90 If no system pager works, the string is sent through a 'dumb pager'
91 91 written in python, very simplistic.
92 92 """
93 93
94 94 # Some routines may auto-compute start offsets incorrectly and pass a
95 95 # negative value. Offset to 0 for robustness.
96 start = max(0,start)
96 start = max(0, start)
97 97
98 98 # first, try the hook
99 99 ip = ipapi.get()
100 100 if ip:
101 101 try:
102 102 ip.hooks.show_in_pager(strng)
103 103 return
104 104 except TryNext:
105 105 pass
106 106
107 107 # Ugly kludge, but calling curses.initscr() flat out crashes in emacs
108 108 TERM = os.environ.get('TERM','dumb')
109 109 if TERM in ['dumb','emacs'] and os.name != 'nt':
110 110 print strng
111 111 return
112 112 # chop off the topmost part of the string we don't want to see
113 113 str_lines = strng.split(os.linesep)[start:]
114 114 str_toprint = os.linesep.join(str_lines)
115 115 num_newlines = len(str_lines)
116 116 len_str = len(str_toprint)
117 117
118 118 # Dumb heuristics to guesstimate number of on-screen lines the string
119 119 # takes. Very basic, but good enough for docstrings in reasonable
120 120 # terminals. If someone later feels like refining it, it's not hard.
121 121 numlines = max(num_newlines,int(len_str/80)+1)
122 122
123 if os.name == "nt":
124 screen_lines_def = get_console_size(defaulty=25)[1]
125 else:
126 screen_lines_def = 25 # default value if we can't auto-determine
123 screen_lines_def = get_terminal_size()[1]
127 124
128 125 # auto-determine screen size
129 126 if screen_lines <= 0:
130 127 if TERM=='xterm' or TERM=='xterm-color':
131 use_curses = USE_CURSES
128 local_use_curses = use_curses
132 129 else:
133 130 # curses causes problems on many terminals other than xterm.
134 use_curses = False
135 if use_curses:
131 local_use_curses = False
132 if local_use_curses:
136 133 import termios
137 134 import curses
138 135 # There is a bug in curses, where *sometimes* it fails to properly
139 136 # initialize, and then after the endwin() call is made, the
140 137 # terminal is left in an unusable state. Rather than trying to
141 138 # check everytime for this (by requesting and comparing termios
142 139 # flags each time), we just save the initial terminal state and
143 140 # unconditionally reset it every time. It's cheaper than making
144 141 # the checks.
145 142 term_flags = termios.tcgetattr(sys.stdout)
146 143 scr = curses.initscr()
147 144 screen_lines_real,screen_cols = scr.getmaxyx()
148 145 curses.endwin()
149 146 # Restore terminal state in case endwin() didn't.
150 147 termios.tcsetattr(sys.stdout,termios.TCSANOW,term_flags)
151 148 # Now we have what we needed: the screen size in rows/columns
152 149 screen_lines += screen_lines_real
153 150 #print '***Screen size:',screen_lines_real,'lines x',\
154 151 #screen_cols,'columns.' # dbg
155 152 else:
156 153 screen_lines += screen_lines_def
157 154
158 155 #print 'numlines',numlines,'screenlines',screen_lines # dbg
159 156 if numlines <= screen_lines :
160 157 #print '*** normal print' # dbg
161 158 print >>Term.cout, str_toprint
162 159 else:
163 160 # Try to open pager and default to internal one if that fails.
164 161 # All failure modes are tagged as 'retval=1', to match the return
165 162 # value of a failed system command. If any intermediate attempt
166 163 # sets retval to 1, at the end we resort to our own page_dumb() pager.
167 164 pager_cmd = get_pager_cmd(pager_cmd)
168 165 pager_cmd += ' ' + get_pager_start(pager_cmd,start)
169 166 if os.name == 'nt':
170 167 if pager_cmd.startswith('type'):
171 168 # The default WinXP 'type' command is failing on complex strings.
172 169 retval = 1
173 170 else:
174 171 tmpname = tempfile.mktemp('.txt')
175 172 tmpfile = file(tmpname,'wt')
176 173 tmpfile.write(strng)
177 174 tmpfile.close()
178 175 cmd = "%s < %s" % (pager_cmd,tmpname)
179 176 if os.system(cmd):
180 177 retval = 1
181 178 else:
182 179 retval = None
183 180 os.remove(tmpname)
184 181 else:
185 182 try:
186 183 retval = None
187 184 # if I use popen4, things hang. No idea why.
188 185 #pager,shell_out = os.popen4(pager_cmd)
189 186 pager = os.popen(pager_cmd,'w')
190 187 pager.write(strng)
191 188 pager.close()
192 189 retval = pager.close() # success returns None
193 190 except IOError,msg: # broken pipe when user quits
194 191 if msg.args == (32,'Broken pipe'):
195 192 retval = None
196 193 else:
197 194 retval = 1
198 195 except OSError:
199 196 # Other strange problems, sometimes seen in Win2k/cygwin
200 197 retval = 1
201 198 if retval is not None:
202 199 page_dumb(strng,screen_lines=screen_lines)
203 200
204 #----------------------------------------------------------------------------
205 def page_file(fname,start = 0, pager_cmd = None):
201
202 def page_file(fname, start=0, pager_cmd=None):
206 203 """Page a file, using an optional pager command and starting line.
207 204 """
208 205
209 206 pager_cmd = get_pager_cmd(pager_cmd)
210 207 pager_cmd += ' ' + get_pager_start(pager_cmd,start)
211 208
212 209 try:
213 210 if os.environ['TERM'] in ['emacs','dumb']:
214 211 raise EnvironmentError
215 212 xsys(pager_cmd + ' ' + fname)
216 213 except:
217 214 try:
218 215 if start > 0:
219 216 start -= 1
220 217 page(open(fname).read(),start)
221 218 except:
222 219 print 'Unable to show file',`fname`
223 220
224 #----------------------------------------------------------------------------
225 def get_pager_cmd(pager_cmd = None):
226 """Return a pager command.
227 221
228 Makes some attempts at finding an OS-correct one."""
222 def get_pager_cmd(pager_cmd=None):
223 """Return a pager command.
229 224
225 Makes some attempts at finding an OS-correct one.
226 """
230 227 if os.name == 'posix':
231 228 default_pager_cmd = 'less -r' # -r for color control sequences
232 229 elif os.name in ['nt','dos']:
233 230 default_pager_cmd = 'type'
234 231
235 232 if pager_cmd is None:
236 233 try:
237 234 pager_cmd = os.environ['PAGER']
238 235 except:
239 236 pager_cmd = default_pager_cmd
240 237 return pager_cmd
241 238
242 #-----------------------------------------------------------------------------
243 def get_pager_start(pager,start):
239
240 def get_pager_start(pager, start):
244 241 """Return the string for paging files with an offset.
245 242
246 243 This is the '+N' argument which less and more (under Unix) accept.
247 244 """
248 245
249 246 if pager in ['less','more']:
250 247 if start:
251 248 start_string = '+' + str(start)
252 249 else:
253 250 start_string = ''
254 251 else:
255 252 start_string = ''
256 253 return start_string
257 254
258 #----------------------------------------------------------------------------
259 # (X)emacs on W32 doesn't like to be bypassed with msvcrt.getch()
255
256 # (X)emacs on win32 doesn't like to be bypassed with msvcrt.getch()
260 257 if os.name == 'nt' and os.environ.get('TERM','dumb') != 'emacs':
261 258 import msvcrt
262 259 def page_more():
263 260 """ Smart pausing between pages
264 261
265 262 @return: True if need print more lines, False if quit
266 263 """
267 264 Term.cout.write('---Return to continue, q to quit--- ')
268 265 ans = msvcrt.getch()
269 266 if ans in ("q", "Q"):
270 267 result = False
271 268 else:
272 269 result = True
273 270 Term.cout.write("\b"*37 + " "*37 + "\b"*37)
274 271 return result
275 272 else:
276 273 def page_more():
277 274 ans = raw_input('---Return to continue, q to quit--- ')
278 275 if ans.lower().startswith('q'):
279 276 return False
280 277 else:
281 278 return True
282 279
283 #----------------------------------------------------------------------------
280
284 281 def snip_print(str,width = 75,print_full = 0,header = ''):
285 282 """Print a string snipping the midsection to fit in width.
286 283
287 284 print_full: mode control:
288 285 - 0: only snip long strings
289 286 - 1: send to page() directly.
290 287 - 2: snip long strings and ask for full length viewing with page()
291 288 Return 1 if snipping was necessary, 0 otherwise."""
292 289
293 290 if print_full == 1:
294 291 page(header+str)
295 292 return 0
296 293
297 294 print header,
298 295 if len(str) < width:
299 296 print str
300 297 snip = 0
301 298 else:
302 299 whalf = int((width -5)/2)
303 300 print str[:whalf] + ' <...> ' + str[-whalf:]
304 301 snip = 1
305 302 if snip and print_full == 2:
306 303 if raw_input(header+' Snipped. View (y/n)? [N]').lower() == 'y':
307 304 page(str)
308 return snip No newline at end of file
305 return snip
306
@@ -1,1052 +1,1051 b''
1 1 #!/usr/bin/env python
2 2 # encoding: utf-8
3 3 """
4 4 Prefiltering components.
5 5
6 6 Prefilters transform user input before it is exec'd by Python. These
7 7 transforms are used to implement additional syntax such as !ls and %magic.
8 8
9 9 Authors:
10 10
11 11 * Brian Granger
12 12 * Fernando Perez
13 13 * Dan Milstein
14 14 * Ville Vainio
15 15 """
16 16
17 17 #-----------------------------------------------------------------------------
18 18 # Copyright (C) 2008-2009 The IPython Development Team
19 19 #
20 20 # Distributed under the terms of the BSD License. The full license is in
21 21 # the file COPYING, distributed as part of this software.
22 22 #-----------------------------------------------------------------------------
23 23
24 24 #-----------------------------------------------------------------------------
25 25 # Imports
26 26 #-----------------------------------------------------------------------------
27 27
28 28 import __builtin__
29 29 import codeop
30 import keyword
31 import os
32 30 import re
33 import sys
34 31
35 32 from IPython.core.alias import AliasManager
36 33 from IPython.core.autocall import IPyAutocall
37 34 from IPython.core.component import Component
38 35 from IPython.core.splitinput import split_user_input
39 36 from IPython.core.page import page
40 37
41 38 from IPython.utils.traitlets import List, Int, Any, Str, CBool, Bool
42 from IPython.utils.genutils import make_quoted_expr, Term
39 from IPython.utils.io import Term
40 from IPython.utils.text import make_quoted_expr
43 41 from IPython.utils.autoattr import auto_attr
44 42
45 43 #-----------------------------------------------------------------------------
46 44 # Global utilities, errors and constants
47 45 #-----------------------------------------------------------------------------
48 46
49 47 # Warning, these cannot be changed unless various regular expressions
50 48 # are updated in a number of places. Not great, but at least we told you.
51 49 ESC_SHELL = '!'
52 50 ESC_SH_CAP = '!!'
53 51 ESC_HELP = '?'
54 52 ESC_MAGIC = '%'
55 53 ESC_QUOTE = ','
56 54 ESC_QUOTE2 = ';'
57 55 ESC_PAREN = '/'
58 56
59 57
60 58 class PrefilterError(Exception):
61 59 pass
62 60
63 61
64 62 # RegExp to identify potential function names
65 63 re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
66 64
67 65 # RegExp to exclude strings with this start from autocalling. In
68 66 # particular, all binary operators should be excluded, so that if foo is
69 67 # callable, foo OP bar doesn't become foo(OP bar), which is invalid. The
70 68 # characters '!=()' don't need to be checked for, as the checkPythonChars
71 69 # routine explicitely does so, to catch direct calls and rebindings of
72 70 # existing names.
73 71
74 72 # Warning: the '-' HAS TO BE AT THE END of the first group, otherwise
75 73 # it affects the rest of the group in square brackets.
76 74 re_exclude_auto = re.compile(r'^[,&^\|\*/\+-]'
77 75 r'|^is |^not |^in |^and |^or ')
78 76
79 77 # try to catch also methods for stuff in lists/tuples/dicts: off
80 78 # (experimental). For this to work, the line_split regexp would need
81 79 # to be modified so it wouldn't break things at '['. That line is
82 80 # nasty enough that I shouldn't change it until I can test it _well_.
83 81 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
84 82
85 83
86 84 # Handler Check Utilities
87 85 def is_shadowed(identifier, ip):
88 86 """Is the given identifier defined in one of the namespaces which shadow
89 87 the alias and magic namespaces? Note that an identifier is different
90 88 than ifun, because it can not contain a '.' character."""
91 89 # This is much safer than calling ofind, which can change state
92 90 return (identifier in ip.user_ns \
93 91 or identifier in ip.internal_ns \
94 92 or identifier in ip.ns_table['builtin'])
95 93
96 94
97 95 #-----------------------------------------------------------------------------
98 96 # The LineInfo class used throughout
99 97 #-----------------------------------------------------------------------------
100 98
101 99
102 100 class LineInfo(object):
103 101 """A single line of input and associated info.
104 102
105 103 Includes the following as properties:
106 104
107 105 line
108 106 The original, raw line
109 107
110 108 continue_prompt
111 109 Is this line a continuation in a sequence of multiline input?
112 110
113 111 pre
114 112 The initial esc character or whitespace.
115 113
116 114 pre_char
117 115 The escape character(s) in pre or the empty string if there isn't one.
118 116 Note that '!!' is a possible value for pre_char. Otherwise it will
119 117 always be a single character.
120 118
121 119 pre_whitespace
122 120 The leading whitespace from pre if it exists. If there is a pre_char,
123 121 this is just ''.
124 122
125 123 ifun
126 124 The 'function part', which is basically the maximal initial sequence
127 125 of valid python identifiers and the '.' character. This is what is
128 126 checked for alias and magic transformations, used for auto-calling,
129 127 etc.
130 128
131 129 the_rest
132 130 Everything else on the line.
133 131 """
134 132 def __init__(self, line, continue_prompt):
135 133 self.line = line
136 134 self.continue_prompt = continue_prompt
137 135 self.pre, self.ifun, self.the_rest = split_user_input(line)
138 136
139 137 self.pre_char = self.pre.strip()
140 138 if self.pre_char:
141 139 self.pre_whitespace = '' # No whitespace allowd before esc chars
142 140 else:
143 141 self.pre_whitespace = self.pre
144 142
145 143 self._oinfo = None
146 144
147 145 def ofind(self, ip):
148 146 """Do a full, attribute-walking lookup of the ifun in the various
149 147 namespaces for the given IPython InteractiveShell instance.
150 148
151 149 Return a dict with keys: found,obj,ospace,ismagic
152 150
153 151 Note: can cause state changes because of calling getattr, but should
154 152 only be run if autocall is on and if the line hasn't matched any
155 153 other, less dangerous handlers.
156 154
157 155 Does cache the results of the call, so can be called multiple times
158 156 without worrying about *further* damaging state.
159 157 """
160 158 if not self._oinfo:
159 # ip.shell._ofind is actually on the Magic class!
161 160 self._oinfo = ip.shell._ofind(self.ifun)
162 161 return self._oinfo
163 162
164 163 def __str__(self):
165 return "Lineinfo [%s|%s|%s]" %(self.pre,self.ifun,self.the_rest)
164 return "Lineinfo [%s|%s|%s]" %(self.pre, self.ifun, self.the_rest)
166 165
167 166
168 167 #-----------------------------------------------------------------------------
169 168 # Main Prefilter manager
170 169 #-----------------------------------------------------------------------------
171 170
172 171
173 172 class PrefilterManager(Component):
174 173 """Main prefilter component.
175 174
176 175 The IPython prefilter is run on all user input before it is run. The
177 176 prefilter consumes lines of input and produces transformed lines of
178 177 input.
179 178
180 179 The iplementation consists of two phases:
181 180
182 181 1. Transformers
183 182 2. Checkers and handlers
184 183
185 184 Over time, we plan on deprecating the checkers and handlers and doing
186 185 everything in the transformers.
187 186
188 187 The transformers are instances of :class:`PrefilterTransformer` and have
189 188 a single method :meth:`transform` that takes a line and returns a
190 189 transformed line. The transformation can be accomplished using any
191 190 tool, but our current ones use regular expressions for speed. We also
192 191 ship :mod:`pyparsing` in :mod:`IPython.external` for use in transformers.
193 192
194 193 After all the transformers have been run, the line is fed to the checkers,
195 194 which are instances of :class:`PrefilterChecker`. The line is passed to
196 195 the :meth:`check` method, which either returns `None` or a
197 196 :class:`PrefilterHandler` instance. If `None` is returned, the other
198 197 checkers are tried. If an :class:`PrefilterHandler` instance is returned,
199 198 the line is passed to the :meth:`handle` method of the returned
200 199 handler and no further checkers are tried.
201 200
202 201 Both transformers and checkers have a `priority` attribute, that determines
203 202 the order in which they are called. Smaller priorities are tried first.
204 203
205 204 Both transformers and checkers also have `enabled` attribute, which is
206 205 a boolean that determines if the instance is used.
207 206
208 207 Users or developers can change the priority or enabled attribute of
209 208 transformers or checkers, but they must call the :meth:`sort_checkers`
210 209 or :meth:`sort_transformers` method after changing the priority.
211 210 """
212 211
213 212 multi_line_specials = CBool(True, config=True)
214 213
215 214 def __init__(self, parent, config=None):
216 215 super(PrefilterManager, self).__init__(parent, config=config)
217 216 self.init_transformers()
218 217 self.init_handlers()
219 218 self.init_checkers()
220 219
221 220 @auto_attr
222 221 def shell(self):
223 222 return Component.get_instances(
224 223 root=self.root,
225 224 klass='IPython.core.iplib.InteractiveShell')[0]
226 225
227 226 #-------------------------------------------------------------------------
228 227 # API for managing transformers
229 228 #-------------------------------------------------------------------------
230 229
231 230 def init_transformers(self):
232 231 """Create the default transformers."""
233 232 self._transformers = []
234 233 for transformer_cls in _default_transformers:
235 234 transformer_cls(self, config=self.config)
236 235
237 236 def sort_transformers(self):
238 237 """Sort the transformers by priority.
239 238
240 239 This must be called after the priority of a transformer is changed.
241 240 The :meth:`register_transformer` method calls this automatically.
242 241 """
243 242 self._transformers.sort(cmp=lambda x,y: x.priority-y.priority)
244 243
245 244 @property
246 245 def transformers(self):
247 246 """Return a list of checkers, sorted by priority."""
248 247 return self._transformers
249 248
250 249 def register_transformer(self, transformer):
251 250 """Register a transformer instance."""
252 251 if transformer not in self._transformers:
253 252 self._transformers.append(transformer)
254 253 self.sort_transformers()
255 254
256 255 def unregister_transformer(self, transformer):
257 256 """Unregister a transformer instance."""
258 257 if transformer in self._transformers:
259 258 self._transformers.remove(transformer)
260 259
261 260 #-------------------------------------------------------------------------
262 261 # API for managing checkers
263 262 #-------------------------------------------------------------------------
264 263
265 264 def init_checkers(self):
266 265 """Create the default checkers."""
267 266 self._checkers = []
268 267 for checker in _default_checkers:
269 268 checker(self, config=self.config)
270 269
271 270 def sort_checkers(self):
272 271 """Sort the checkers by priority.
273 272
274 273 This must be called after the priority of a checker is changed.
275 274 The :meth:`register_checker` method calls this automatically.
276 275 """
277 276 self._checkers.sort(cmp=lambda x,y: x.priority-y.priority)
278 277
279 278 @property
280 279 def checkers(self):
281 280 """Return a list of checkers, sorted by priority."""
282 281 return self._checkers
283 282
284 283 def register_checker(self, checker):
285 284 """Register a checker instance."""
286 285 if checker not in self._checkers:
287 286 self._checkers.append(checker)
288 287 self.sort_checkers()
289 288
290 289 def unregister_checker(self, checker):
291 290 """Unregister a checker instance."""
292 291 if checker in self._checkers:
293 292 self._checkers.remove(checker)
294 293
295 294 #-------------------------------------------------------------------------
296 295 # API for managing checkers
297 296 #-------------------------------------------------------------------------
298 297
299 298 def init_handlers(self):
300 299 """Create the default handlers."""
301 300 self._handlers = {}
302 301 self._esc_handlers = {}
303 302 for handler in _default_handlers:
304 303 handler(self, config=self.config)
305 304
306 305 @property
307 306 def handlers(self):
308 307 """Return a dict of all the handlers."""
309 308 return self._handlers
310 309
311 310 def register_handler(self, name, handler, esc_strings):
312 311 """Register a handler instance by name with esc_strings."""
313 312 self._handlers[name] = handler
314 313 for esc_str in esc_strings:
315 314 self._esc_handlers[esc_str] = handler
316 315
317 316 def unregister_handler(self, name, handler, esc_strings):
318 317 """Unregister a handler instance by name with esc_strings."""
319 318 try:
320 319 del self._handlers[name]
321 320 except KeyError:
322 321 pass
323 322 for esc_str in esc_strings:
324 323 h = self._esc_handlers.get(esc_str)
325 324 if h is handler:
326 325 del self._esc_handlers[esc_str]
327 326
328 327 def get_handler_by_name(self, name):
329 328 """Get a handler by its name."""
330 329 return self._handlers.get(name)
331 330
332 331 def get_handler_by_esc(self, esc_str):
333 332 """Get a handler by its escape string."""
334 333 return self._esc_handlers.get(esc_str)
335 334
336 335 #-------------------------------------------------------------------------
337 336 # Main prefiltering API
338 337 #-------------------------------------------------------------------------
339 338
340 339 def prefilter_line_info(self, line_info):
341 340 """Prefilter a line that has been converted to a LineInfo object.
342 341
343 342 This implements the checker/handler part of the prefilter pipe.
344 343 """
345 344 # print "prefilter_line_info: ", line_info
346 345 handler = self.find_handler(line_info)
347 346 return handler.handle(line_info)
348 347
349 348 def find_handler(self, line_info):
350 349 """Find a handler for the line_info by trying checkers."""
351 350 for checker in self.checkers:
352 351 if checker.enabled:
353 352 handler = checker.check(line_info)
354 353 if handler:
355 354 return handler
356 355 return self.get_handler_by_name('normal')
357 356
358 357 def transform_line(self, line, continue_prompt):
359 358 """Calls the enabled transformers in order of increasing priority."""
360 359 for transformer in self.transformers:
361 360 if transformer.enabled:
362 361 line = transformer.transform(line, continue_prompt)
363 362 return line
364 363
365 364 def prefilter_line(self, line, continue_prompt=False):
366 365 """Prefilter a single input line as text.
367 366
368 367 This method prefilters a single line of text by calling the
369 368 transformers and then the checkers/handlers.
370 369 """
371 370
372 371 # print "prefilter_line: ", line, continue_prompt
373 372 # All handlers *must* return a value, even if it's blank ('').
374 373
375 374 # Lines are NOT logged here. Handlers should process the line as
376 375 # needed, update the cache AND log it (so that the input cache array
377 376 # stays synced).
378 377
379 378 # save the line away in case we crash, so the post-mortem handler can
380 379 # record it
381 380 self.shell._last_input_line = line
382 381
383 382 if not line:
384 383 # Return immediately on purely empty lines, so that if the user
385 384 # previously typed some whitespace that started a continuation
386 385 # prompt, he can break out of that loop with just an empty line.
387 386 # This is how the default python prompt works.
388 387
389 388 # Only return if the accumulated input buffer was just whitespace!
390 389 if ''.join(self.shell.buffer).isspace():
391 390 self.shell.buffer[:] = []
392 391 return ''
393 392
394 393 # At this point, we invoke our transformers.
395 394 if not continue_prompt or (continue_prompt and self.multi_line_specials):
396 395 line = self.transform_line(line, continue_prompt)
397 396
398 397 # Now we compute line_info for the checkers and handlers
399 398 line_info = LineInfo(line, continue_prompt)
400 399
401 400 # the input history needs to track even empty lines
402 401 stripped = line.strip()
403 402
404 403 normal_handler = self.get_handler_by_name('normal')
405 404 if not stripped:
406 405 if not continue_prompt:
407 406 self.shell.outputcache.prompt_count -= 1
408 407
409 408 return normal_handler.handle(line_info)
410 409
411 410 # special handlers are only allowed for single line statements
412 411 if continue_prompt and not self.multi_line_specials:
413 412 return normal_handler.handle(line_info)
414 413
415 414 prefiltered = self.prefilter_line_info(line_info)
416 415 # print "prefiltered line: %r" % prefiltered
417 416 return prefiltered
418 417
419 418 def prefilter_lines(self, lines, continue_prompt=False):
420 419 """Prefilter multiple input lines of text.
421 420
422 421 This is the main entry point for prefiltering multiple lines of
423 422 input. This simply calls :meth:`prefilter_line` for each line of
424 423 input.
425 424
426 425 This covers cases where there are multiple lines in the user entry,
427 426 which is the case when the user goes back to a multiline history
428 427 entry and presses enter.
429 428 """
430 429 llines = lines.rstrip('\n').split('\n')
431 430 # We can get multiple lines in one shot, where multiline input 'blends'
432 431 # into one line, in cases like recalling from the readline history
433 432 # buffer. We need to make sure that in such cases, we correctly
434 433 # communicate downstream which line is first and which are continuation
435 434 # ones.
436 435 if len(llines) > 1:
437 436 out = '\n'.join([self.prefilter_line(line, lnum>0)
438 437 for lnum, line in enumerate(llines) ])
439 438 else:
440 439 out = self.prefilter_line(llines[0], continue_prompt)
441 440
442 441 return out
443 442
444 443 #-----------------------------------------------------------------------------
445 444 # Prefilter transformers
446 445 #-----------------------------------------------------------------------------
447 446
448 447
449 448 class PrefilterTransformer(Component):
450 449 """Transform a line of user input."""
451 450
452 451 priority = Int(100, config=True)
453 452 shell = Any
454 453 prefilter_manager = Any
455 454 enabled = Bool(True, config=True)
456 455
457 456 def __init__(self, parent, config=None):
458 457 super(PrefilterTransformer, self).__init__(parent, config=config)
459 458 self.prefilter_manager.register_transformer(self)
460 459
461 460 @auto_attr
462 461 def shell(self):
463 462 return Component.get_instances(
464 463 root=self.root,
465 464 klass='IPython.core.iplib.InteractiveShell')[0]
466 465
467 466 @auto_attr
468 467 def prefilter_manager(self):
469 468 return PrefilterManager.get_instances(root=self.root)[0]
470 469
471 470 def transform(self, line, continue_prompt):
472 471 """Transform a line, returning the new one."""
473 472 return None
474 473
475 474 def __repr__(self):
476 475 return "<%s(priority=%r, enabled=%r)>" % (
477 476 self.__class__.__name__, self.priority, self.enabled)
478 477
479 478
480 479 _assign_system_re = re.compile(r'(?P<lhs>(\s*)([\w\.]+)((\s*,\s*[\w\.]+)*))'
481 480 r'\s*=\s*!(?P<cmd>.*)')
482 481
483 482
484 483 class AssignSystemTransformer(PrefilterTransformer):
485 484 """Handle the `files = !ls` syntax."""
486 485
487 486 priority = Int(100, config=True)
488 487
489 488 def transform(self, line, continue_prompt):
490 489 m = _assign_system_re.match(line)
491 490 if m is not None:
492 491 cmd = m.group('cmd')
493 492 lhs = m.group('lhs')
494 493 expr = make_quoted_expr("sc -l =%s" % cmd)
495 494 new_line = '%s = get_ipython().magic(%s)' % (lhs, expr)
496 495 return new_line
497 496 return line
498 497
499 498
500 499 _assign_magic_re = re.compile(r'(?P<lhs>(\s*)([\w\.]+)((\s*,\s*[\w\.]+)*))'
501 500 r'\s*=\s*%(?P<cmd>.*)')
502 501
503 502 class AssignMagicTransformer(PrefilterTransformer):
504 503 """Handle the `a = %who` syntax."""
505 504
506 505 priority = Int(200, config=True)
507 506
508 507 def transform(self, line, continue_prompt):
509 508 m = _assign_magic_re.match(line)
510 509 if m is not None:
511 510 cmd = m.group('cmd')
512 511 lhs = m.group('lhs')
513 512 expr = make_quoted_expr(cmd)
514 513 new_line = '%s = get_ipython().magic(%s)' % (lhs, expr)
515 514 return new_line
516 515 return line
517 516
518 517
519 518 _classic_prompt_re = re.compile(r'(^[ \t]*>>> |^[ \t]*\.\.\. )')
520 519
521 520 class PyPromptTransformer(PrefilterTransformer):
522 521 """Handle inputs that start with '>>> ' syntax."""
523 522
524 523 priority = Int(50, config=True)
525 524
526 525 def transform(self, line, continue_prompt):
527 526
528 527 if not line or line.isspace() or line.strip() == '...':
529 528 # This allows us to recognize multiple input prompts separated by
530 529 # blank lines and pasted in a single chunk, very common when
531 530 # pasting doctests or long tutorial passages.
532 531 return ''
533 532 m = _classic_prompt_re.match(line)
534 533 if m:
535 534 return line[len(m.group(0)):]
536 535 else:
537 536 return line
538 537
539 538
540 539 _ipy_prompt_re = re.compile(r'(^[ \t]*In \[\d+\]: |^[ \t]*\ \ \ \.\.\.+: )')
541 540
542 541 class IPyPromptTransformer(PrefilterTransformer):
543 542 """Handle inputs that start classic IPython prompt syntax."""
544 543
545 544 priority = Int(50, config=True)
546 545
547 546 def transform(self, line, continue_prompt):
548 547
549 548 if not line or line.isspace() or line.strip() == '...':
550 549 # This allows us to recognize multiple input prompts separated by
551 550 # blank lines and pasted in a single chunk, very common when
552 551 # pasting doctests or long tutorial passages.
553 552 return ''
554 553 m = _ipy_prompt_re.match(line)
555 554 if m:
556 555 return line[len(m.group(0)):]
557 556 else:
558 557 return line
559 558
560 559 #-----------------------------------------------------------------------------
561 560 # Prefilter checkers
562 561 #-----------------------------------------------------------------------------
563 562
564 563
565 564 class PrefilterChecker(Component):
566 565 """Inspect an input line and return a handler for that line."""
567 566
568 567 priority = Int(100, config=True)
569 568 shell = Any
570 569 prefilter_manager = Any
571 570 enabled = Bool(True, config=True)
572 571
573 572 def __init__(self, parent, config=None):
574 573 super(PrefilterChecker, self).__init__(parent, config=config)
575 574 self.prefilter_manager.register_checker(self)
576 575
577 576 @auto_attr
578 577 def shell(self):
579 578 return Component.get_instances(
580 579 root=self.root,
581 580 klass='IPython.core.iplib.InteractiveShell')[0]
582 581
583 582 @auto_attr
584 583 def prefilter_manager(self):
585 584 return PrefilterManager.get_instances(root=self.root)[0]
586 585
587 586 def check(self, line_info):
588 587 """Inspect line_info and return a handler instance or None."""
589 588 return None
590 589
591 590 def __repr__(self):
592 591 return "<%s(priority=%r, enabled=%r)>" % (
593 592 self.__class__.__name__, self.priority, self.enabled)
594 593
595 594
596 595 class EmacsChecker(PrefilterChecker):
597 596
598 597 priority = Int(100, config=True)
599 598 enabled = Bool(False, config=True)
600 599
601 600 def check(self, line_info):
602 601 "Emacs ipython-mode tags certain input lines."
603 602 if line_info.line.endswith('# PYTHON-MODE'):
604 603 return self.prefilter_manager.get_handler_by_name('emacs')
605 604 else:
606 605 return None
607 606
608 607
609 608 class ShellEscapeChecker(PrefilterChecker):
610 609
611 610 priority = Int(200, config=True)
612 611
613 612 def check(self, line_info):
614 613 if line_info.line.lstrip().startswith(ESC_SHELL):
615 614 return self.prefilter_manager.get_handler_by_name('shell')
616 615
617 616
618 617 class IPyAutocallChecker(PrefilterChecker):
619 618
620 619 priority = Int(300, config=True)
621 620
622 621 def check(self, line_info):
623 622 "Instances of IPyAutocall in user_ns get autocalled immediately"
624 623 obj = self.shell.user_ns.get(line_info.ifun, None)
625 624 if isinstance(obj, IPyAutocall):
626 625 obj.set_ip(self.shell)
627 626 return self.prefilter_manager.get_handler_by_name('auto')
628 627 else:
629 628 return None
630 629
631 630
632 631 class MultiLineMagicChecker(PrefilterChecker):
633 632
634 633 priority = Int(400, config=True)
635 634
636 635 def check(self, line_info):
637 636 "Allow ! and !! in multi-line statements if multi_line_specials is on"
638 637 # Note that this one of the only places we check the first character of
639 638 # ifun and *not* the pre_char. Also note that the below test matches
640 639 # both ! and !!.
641 640 if line_info.continue_prompt \
642 641 and self.prefilter_manager.multi_line_specials:
643 642 if line_info.ifun.startswith(ESC_MAGIC):
644 643 return self.prefilter_manager.get_handler_by_name('magic')
645 644 else:
646 645 return None
647 646
648 647
649 648 class EscCharsChecker(PrefilterChecker):
650 649
651 650 priority = Int(500, config=True)
652 651
653 652 def check(self, line_info):
654 653 """Check for escape character and return either a handler to handle it,
655 654 or None if there is no escape char."""
656 655 if line_info.line[-1] == ESC_HELP \
657 656 and line_info.pre_char != ESC_SHELL \
658 657 and line_info.pre_char != ESC_SH_CAP:
659 658 # the ? can be at the end, but *not* for either kind of shell escape,
660 659 # because a ? can be a vaild final char in a shell cmd
661 660 return self.prefilter_manager.get_handler_by_name('help')
662 661 else:
663 662 # This returns None like it should if no handler exists
664 663 return self.prefilter_manager.get_handler_by_esc(line_info.pre_char)
665 664
666 665
667 666 class AssignmentChecker(PrefilterChecker):
668 667
669 668 priority = Int(600, config=True)
670 669
671 670 def check(self, line_info):
672 671 """Check to see if user is assigning to a var for the first time, in
673 672 which case we want to avoid any sort of automagic / autocall games.
674 673
675 674 This allows users to assign to either alias or magic names true python
676 675 variables (the magic/alias systems always take second seat to true
677 676 python code). E.g. ls='hi', or ls,that=1,2"""
678 677 if line_info.the_rest:
679 678 if line_info.the_rest[0] in '=,':
680 679 return self.prefilter_manager.get_handler_by_name('normal')
681 680 else:
682 681 return None
683 682
684 683
685 684 class AutoMagicChecker(PrefilterChecker):
686 685
687 686 priority = Int(700, config=True)
688 687
689 688 def check(self, line_info):
690 689 """If the ifun is magic, and automagic is on, run it. Note: normal,
691 690 non-auto magic would already have been triggered via '%' in
692 691 check_esc_chars. This just checks for automagic. Also, before
693 692 triggering the magic handler, make sure that there is nothing in the
694 693 user namespace which could shadow it."""
695 694 if not self.shell.automagic or not hasattr(self.shell,'magic_'+line_info.ifun):
696 695 return None
697 696
698 697 # We have a likely magic method. Make sure we should actually call it.
699 698 if line_info.continue_prompt and not self.shell.multi_line_specials:
700 699 return None
701 700
702 701 head = line_info.ifun.split('.',1)[0]
703 702 if is_shadowed(head, self.shell):
704 703 return None
705 704
706 705 return self.prefilter_manager.get_handler_by_name('magic')
707 706
708 707
709 708 class AliasChecker(PrefilterChecker):
710 709
711 710 priority = Int(800, config=True)
712 711
713 712 @auto_attr
714 713 def alias_manager(self):
715 714 return AliasManager.get_instances(root=self.root)[0]
716 715
717 716 def check(self, line_info):
718 717 "Check if the initital identifier on the line is an alias."
719 718 # Note: aliases can not contain '.'
720 719 head = line_info.ifun.split('.',1)[0]
721 720 if line_info.ifun not in self.alias_manager \
722 721 or head not in self.alias_manager \
723 722 or is_shadowed(head, self.shell):
724 723 return None
725 724
726 725 return self.prefilter_manager.get_handler_by_name('alias')
727 726
728 727
729 728 class PythonOpsChecker(PrefilterChecker):
730 729
731 730 priority = Int(900, config=True)
732 731
733 732 def check(self, line_info):
734 733 """If the 'rest' of the line begins with a function call or pretty much
735 734 any python operator, we should simply execute the line (regardless of
736 735 whether or not there's a possible autocall expansion). This avoids
737 736 spurious (and very confusing) geattr() accesses."""
738 737 if line_info.the_rest and line_info.the_rest[0] in '!=()<>,+*/%^&|':
739 738 return self.prefilter_manager.get_handler_by_name('normal')
740 739 else:
741 740 return None
742 741
743 742
744 743 class AutocallChecker(PrefilterChecker):
745 744
746 745 priority = Int(1000, config=True)
747 746
748 747 def check(self, line_info):
749 748 "Check if the initial word/function is callable and autocall is on."
750 749 if not self.shell.autocall:
751 750 return None
752 751
753 752 oinfo = line_info.ofind(self.shell) # This can mutate state via getattr
754 753 if not oinfo['found']:
755 754 return None
756 755
757 756 if callable(oinfo['obj']) \
758 757 and (not re_exclude_auto.match(line_info.the_rest)) \
759 758 and re_fun_name.match(line_info.ifun):
760 759 return self.prefilter_manager.get_handler_by_name('auto')
761 760 else:
762 761 return None
763 762
764 763
765 764 #-----------------------------------------------------------------------------
766 765 # Prefilter handlers
767 766 #-----------------------------------------------------------------------------
768 767
769 768
770 769 class PrefilterHandler(Component):
771 770
772 771 handler_name = Str('normal')
773 772 esc_strings = List([])
774 773 shell = Any
775 774 prefilter_manager = Any
776 775
777 776 def __init__(self, parent, config=None):
778 777 super(PrefilterHandler, self).__init__(parent, config=config)
779 778 self.prefilter_manager.register_handler(
780 779 self.handler_name,
781 780 self,
782 781 self.esc_strings
783 782 )
784 783
785 784 @auto_attr
786 785 def shell(self):
787 786 return Component.get_instances(
788 787 root=self.root,
789 788 klass='IPython.core.iplib.InteractiveShell')[0]
790 789
791 790 @auto_attr
792 791 def prefilter_manager(self):
793 792 return PrefilterManager.get_instances(root=self.root)[0]
794 793
795 794 def handle(self, line_info):
796 795 # print "normal: ", line_info
797 796 """Handle normal input lines. Use as a template for handlers."""
798 797
799 798 # With autoindent on, we need some way to exit the input loop, and I
800 799 # don't want to force the user to have to backspace all the way to
801 800 # clear the line. The rule will be in this case, that either two
802 801 # lines of pure whitespace in a row, or a line of pure whitespace but
803 802 # of a size different to the indent level, will exit the input loop.
804 803 line = line_info.line
805 804 continue_prompt = line_info.continue_prompt
806 805
807 806 if (continue_prompt and
808 807 self.shell.autoindent and
809 808 line.isspace() and
810 809
811 810 (0 < abs(len(line) - self.shell.indent_current_nsp) <= 2
812 811 or
813 812 not self.shell.buffer
814 813 or
815 814 (self.shell.buffer[-1]).isspace()
816 815 )
817 816 ):
818 817 line = ''
819 818
820 819 self.shell.log(line, line, continue_prompt)
821 820 return line
822 821
823 822 def __str__(self):
824 823 return "<%s(name=%s)>" % (self.__class__.__name__, self.handler_name)
825 824
826 825
827 826 class AliasHandler(PrefilterHandler):
828 827
829 828 handler_name = Str('alias')
830 829
831 830 @auto_attr
832 831 def alias_manager(self):
833 832 return AliasManager.get_instances(root=self.root)[0]
834 833
835 834 def handle(self, line_info):
836 835 """Handle alias input lines. """
837 836 transformed = self.alias_manager.expand_aliases(line_info.ifun,line_info.the_rest)
838 837 # pre is needed, because it carries the leading whitespace. Otherwise
839 838 # aliases won't work in indented sections.
840 839 line_out = '%sget_ipython().system(%s)' % (line_info.pre_whitespace,
841 840 make_quoted_expr(transformed))
842 841
843 842 self.shell.log(line_info.line, line_out, line_info.continue_prompt)
844 843 return line_out
845 844
846 845
847 846 class ShellEscapeHandler(PrefilterHandler):
848 847
849 848 handler_name = Str('shell')
850 849 esc_strings = List([ESC_SHELL, ESC_SH_CAP])
851 850
852 851 def handle(self, line_info):
853 852 """Execute the line in a shell, empty return value"""
854 853 magic_handler = self.prefilter_manager.get_handler_by_name('magic')
855 854
856 855 line = line_info.line
857 856 if line.lstrip().startswith(ESC_SH_CAP):
858 857 # rewrite LineInfo's line, ifun and the_rest to properly hold the
859 858 # call to %sx and the actual command to be executed, so
860 859 # handle_magic can work correctly. Note that this works even if
861 860 # the line is indented, so it handles multi_line_specials
862 861 # properly.
863 862 new_rest = line.lstrip()[2:]
864 863 line_info.line = '%ssx %s' % (ESC_MAGIC, new_rest)
865 864 line_info.ifun = 'sx'
866 865 line_info.the_rest = new_rest
867 866 return magic_handler.handle(line_info)
868 867 else:
869 868 cmd = line.lstrip().lstrip(ESC_SHELL)
870 869 line_out = '%sget_ipython().system(%s)' % (line_info.pre_whitespace,
871 870 make_quoted_expr(cmd))
872 871 # update cache/log and return
873 872 self.shell.log(line, line_out, line_info.continue_prompt)
874 873 return line_out
875 874
876 875
877 876 class MagicHandler(PrefilterHandler):
878 877
879 878 handler_name = Str('magic')
880 879 esc_strings = List([ESC_MAGIC])
881 880
882 881 def handle(self, line_info):
883 882 """Execute magic functions."""
884 883 ifun = line_info.ifun
885 884 the_rest = line_info.the_rest
886 885 cmd = '%sget_ipython().magic(%s)' % (line_info.pre_whitespace,
887 886 make_quoted_expr(ifun + " " + the_rest))
888 887 self.shell.log(line_info.line, cmd, line_info.continue_prompt)
889 888 return cmd
890 889
891 890
892 891 class AutoHandler(PrefilterHandler):
893 892
894 893 handler_name = Str('auto')
895 894 esc_strings = List([ESC_PAREN, ESC_QUOTE, ESC_QUOTE2])
896 895
897 896 def handle(self, line_info):
898 897 """Hande lines which can be auto-executed, quoting if requested."""
899 898 line = line_info.line
900 899 ifun = line_info.ifun
901 900 the_rest = line_info.the_rest
902 901 pre = line_info.pre
903 902 continue_prompt = line_info.continue_prompt
904 903 obj = line_info.ofind(self)['obj']
905 904 #print 'pre <%s> ifun <%s> rest <%s>' % (pre,ifun,the_rest) # dbg
906 905
907 906 # This should only be active for single-line input!
908 907 if continue_prompt:
909 908 self.shell.log(line,line,continue_prompt)
910 909 return line
911 910
912 911 force_auto = isinstance(obj, IPyAutocall)
913 912 auto_rewrite = True
914 913
915 914 if pre == ESC_QUOTE:
916 915 # Auto-quote splitting on whitespace
917 916 newcmd = '%s("%s")' % (ifun,'", "'.join(the_rest.split()) )
918 917 elif pre == ESC_QUOTE2:
919 918 # Auto-quote whole string
920 919 newcmd = '%s("%s")' % (ifun,the_rest)
921 920 elif pre == ESC_PAREN:
922 921 newcmd = '%s(%s)' % (ifun,",".join(the_rest.split()))
923 922 else:
924 923 # Auto-paren.
925 924 # We only apply it to argument-less calls if the autocall
926 925 # parameter is set to 2. We only need to check that autocall is <
927 926 # 2, since this function isn't called unless it's at least 1.
928 927 if not the_rest and (self.shell.autocall < 2) and not force_auto:
929 928 newcmd = '%s %s' % (ifun,the_rest)
930 929 auto_rewrite = False
931 930 else:
932 931 if not force_auto and the_rest.startswith('['):
933 932 if hasattr(obj,'__getitem__'):
934 933 # Don't autocall in this case: item access for an object
935 934 # which is BOTH callable and implements __getitem__.
936 935 newcmd = '%s %s' % (ifun,the_rest)
937 936 auto_rewrite = False
938 937 else:
939 938 # if the object doesn't support [] access, go ahead and
940 939 # autocall
941 940 newcmd = '%s(%s)' % (ifun.rstrip(),the_rest)
942 941 elif the_rest.endswith(';'):
943 942 newcmd = '%s(%s);' % (ifun.rstrip(),the_rest[:-1])
944 943 else:
945 944 newcmd = '%s(%s)' % (ifun.rstrip(), the_rest)
946 945
947 946 if auto_rewrite:
948 947 rw = self.shell.outputcache.prompt1.auto_rewrite() + newcmd
949 948
950 949 try:
951 950 # plain ascii works better w/ pyreadline, on some machines, so
952 951 # we use it and only print uncolored rewrite if we have unicode
953 952 rw = str(rw)
954 953 print >>Term.cout, rw
955 954 except UnicodeEncodeError:
956 955 print "-------------->" + newcmd
957 956
958 957 # log what is now valid Python, not the actual user input (without the
959 958 # final newline)
960 959 self.shell.log(line,newcmd,continue_prompt)
961 960 return newcmd
962 961
963 962
964 963 class HelpHandler(PrefilterHandler):
965 964
966 965 handler_name = Str('help')
967 966 esc_strings = List([ESC_HELP])
968 967
969 968 def handle(self, line_info):
970 969 """Try to get some help for the object.
971 970
972 971 obj? or ?obj -> basic information.
973 972 obj?? or ??obj -> more details.
974 973 """
975 974 normal_handler = self.prefilter_manager.get_handler_by_name('normal')
976 975 line = line_info.line
977 976 # We need to make sure that we don't process lines which would be
978 977 # otherwise valid python, such as "x=1 # what?"
979 978 try:
980 979 codeop.compile_command(line)
981 980 except SyntaxError:
982 981 # We should only handle as help stuff which is NOT valid syntax
983 982 if line[0]==ESC_HELP:
984 983 line = line[1:]
985 984 elif line[-1]==ESC_HELP:
986 985 line = line[:-1]
987 986 self.shell.log(line, '#?'+line, line_info.continue_prompt)
988 987 if line:
989 988 #print 'line:<%r>' % line # dbg
990 989 self.shell.magic_pinfo(line)
991 990 else:
992 991 page(self.shell.usage, screen_lines=self.shell.usable_screen_length)
993 992 return '' # Empty string is needed here!
994 993 except:
995 994 raise
996 995 # Pass any other exceptions through to the normal handler
997 996 return normal_handler.handle(line_info)
998 997 else:
999 998 raise
1000 999 # If the code compiles ok, we should handle it normally
1001 1000 return normal_handler.handle(line_info)
1002 1001
1003 1002
1004 1003 class EmacsHandler(PrefilterHandler):
1005 1004
1006 1005 handler_name = Str('emacs')
1007 1006 esc_strings = List([])
1008 1007
1009 1008 def handle(self, line_info):
1010 1009 """Handle input lines marked by python-mode."""
1011 1010
1012 1011 # Currently, nothing is done. Later more functionality can be added
1013 1012 # here if needed.
1014 1013
1015 1014 # The input cache shouldn't be updated
1016 1015 return line_info.line
1017 1016
1018 1017
1019 1018 #-----------------------------------------------------------------------------
1020 1019 # Defaults
1021 1020 #-----------------------------------------------------------------------------
1022 1021
1023 1022
1024 1023 _default_transformers = [
1025 1024 AssignSystemTransformer,
1026 1025 AssignMagicTransformer,
1027 1026 PyPromptTransformer,
1028 1027 IPyPromptTransformer,
1029 1028 ]
1030 1029
1031 1030 _default_checkers = [
1032 1031 EmacsChecker,
1033 1032 ShellEscapeChecker,
1034 1033 IPyAutocallChecker,
1035 1034 MultiLineMagicChecker,
1036 1035 EscCharsChecker,
1037 1036 AssignmentChecker,
1038 1037 AutoMagicChecker,
1039 1038 AliasChecker,
1040 1039 PythonOpsChecker,
1041 1040 AutocallChecker
1042 1041 ]
1043 1042
1044 1043 _default_handlers = [
1045 1044 PrefilterHandler,
1046 1045 AliasHandler,
1047 1046 ShellEscapeHandler,
1048 1047 MagicHandler,
1049 1048 AutoHandler,
1050 1049 HelpHandler,
1051 1050 EmacsHandler
1052 1051 ]
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from IPython/core/pylabtools.py to IPython/lib/pylabtools.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from IPython/utils/tests/test_genutils.py to IPython/utils/tests/test_path.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: file renamed from IPython/utils/tests/test_platutils.py to IPython/utils/tests/test_process.py
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
1 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
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
The requested commit or file is too big and content was truncated. Show full diff
1 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
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