##// END OF EJS Templates
Start using py3compat module.
Thomas Kluyver -
Show More

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

@@ -1,666 +1,660 b''
1 """A simple configuration system.
1 """A simple configuration system.
2
2
3 Authors
3 Authors
4 -------
4 -------
5 * Brian Granger
5 * Brian Granger
6 * Fernando Perez
6 * Fernando Perez
7 * Min RK
7 * Min RK
8 """
8 """
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Copyright (C) 2008-2011 The IPython Development Team
11 # Copyright (C) 2008-2011 The IPython Development Team
12 #
12 #
13 # Distributed under the terms of the BSD License. The full license is in
13 # Distributed under the terms of the BSD License. The full license is in
14 # the file COPYING, distributed as part of this software.
14 # the file COPYING, distributed as part of this software.
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18 # Imports
18 # Imports
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20
20
21 import __builtin__
21 import __builtin__ as builtin_mod
22 import re
22 import re
23 import sys
23 import sys
24
24
25 from IPython.external import argparse
25 from IPython.external import argparse
26 from IPython.utils.path import filefind, get_ipython_dir
26 from IPython.utils.path import filefind, get_ipython_dir
27 from IPython.utils import warn
27 from IPython.utils import py3compat, warn
28
28
29 #-----------------------------------------------------------------------------
29 #-----------------------------------------------------------------------------
30 # Exceptions
30 # Exceptions
31 #-----------------------------------------------------------------------------
31 #-----------------------------------------------------------------------------
32
32
33
33
34 class ConfigError(Exception):
34 class ConfigError(Exception):
35 pass
35 pass
36
36
37
37
38 class ConfigLoaderError(ConfigError):
38 class ConfigLoaderError(ConfigError):
39 pass
39 pass
40
40
41 class ArgumentError(ConfigLoaderError):
41 class ArgumentError(ConfigLoaderError):
42 pass
42 pass
43
43
44 #-----------------------------------------------------------------------------
44 #-----------------------------------------------------------------------------
45 # Argparse fix
45 # Argparse fix
46 #-----------------------------------------------------------------------------
46 #-----------------------------------------------------------------------------
47
47
48 # Unfortunately argparse by default prints help messages to stderr instead of
48 # Unfortunately argparse by default prints help messages to stderr instead of
49 # stdout. This makes it annoying to capture long help screens at the command
49 # stdout. This makes it annoying to capture long help screens at the command
50 # line, since one must know how to pipe stderr, which many users don't know how
50 # line, since one must know how to pipe stderr, which many users don't know how
51 # to do. So we override the print_help method with one that defaults to
51 # to do. So we override the print_help method with one that defaults to
52 # stdout and use our class instead.
52 # stdout and use our class instead.
53
53
54 class ArgumentParser(argparse.ArgumentParser):
54 class ArgumentParser(argparse.ArgumentParser):
55 """Simple argparse subclass that prints help to stdout by default."""
55 """Simple argparse subclass that prints help to stdout by default."""
56
56
57 def print_help(self, file=None):
57 def print_help(self, file=None):
58 if file is None:
58 if file is None:
59 file = sys.stdout
59 file = sys.stdout
60 return super(ArgumentParser, self).print_help(file)
60 return super(ArgumentParser, self).print_help(file)
61
61
62 print_help.__doc__ = argparse.ArgumentParser.print_help.__doc__
62 print_help.__doc__ = argparse.ArgumentParser.print_help.__doc__
63
63
64 #-----------------------------------------------------------------------------
64 #-----------------------------------------------------------------------------
65 # Config class for holding config information
65 # Config class for holding config information
66 #-----------------------------------------------------------------------------
66 #-----------------------------------------------------------------------------
67
67
68
68
69 class Config(dict):
69 class Config(dict):
70 """An attribute based dict that can do smart merges."""
70 """An attribute based dict that can do smart merges."""
71
71
72 def __init__(self, *args, **kwds):
72 def __init__(self, *args, **kwds):
73 dict.__init__(self, *args, **kwds)
73 dict.__init__(self, *args, **kwds)
74 # This sets self.__dict__ = self, but it has to be done this way
74 # This sets self.__dict__ = self, but it has to be done this way
75 # because we are also overriding __setattr__.
75 # because we are also overriding __setattr__.
76 dict.__setattr__(self, '__dict__', self)
76 dict.__setattr__(self, '__dict__', self)
77
77
78 def _merge(self, other):
78 def _merge(self, other):
79 to_update = {}
79 to_update = {}
80 for k, v in other.iteritems():
80 for k, v in other.iteritems():
81 if not self.has_key(k):
81 if not self.has_key(k):
82 to_update[k] = v
82 to_update[k] = v
83 else: # I have this key
83 else: # I have this key
84 if isinstance(v, Config):
84 if isinstance(v, Config):
85 # Recursively merge common sub Configs
85 # Recursively merge common sub Configs
86 self[k]._merge(v)
86 self[k]._merge(v)
87 else:
87 else:
88 # Plain updates for non-Configs
88 # Plain updates for non-Configs
89 to_update[k] = v
89 to_update[k] = v
90
90
91 self.update(to_update)
91 self.update(to_update)
92
92
93 def _is_section_key(self, key):
93 def _is_section_key(self, key):
94 if key[0].upper()==key[0] and not key.startswith('_'):
94 if key[0].upper()==key[0] and not key.startswith('_'):
95 return True
95 return True
96 else:
96 else:
97 return False
97 return False
98
98
99 def __contains__(self, key):
99 def __contains__(self, key):
100 if self._is_section_key(key):
100 if self._is_section_key(key):
101 return True
101 return True
102 else:
102 else:
103 return super(Config, self).__contains__(key)
103 return super(Config, self).__contains__(key)
104 # .has_key is deprecated for dictionaries.
104 # .has_key is deprecated for dictionaries.
105 has_key = __contains__
105 has_key = __contains__
106
106
107 def _has_section(self, key):
107 def _has_section(self, key):
108 if self._is_section_key(key):
108 if self._is_section_key(key):
109 if super(Config, self).__contains__(key):
109 if super(Config, self).__contains__(key):
110 return True
110 return True
111 return False
111 return False
112
112
113 def copy(self):
113 def copy(self):
114 return type(self)(dict.copy(self))
114 return type(self)(dict.copy(self))
115
115
116 def __copy__(self):
116 def __copy__(self):
117 return self.copy()
117 return self.copy()
118
118
119 def __deepcopy__(self, memo):
119 def __deepcopy__(self, memo):
120 import copy
120 import copy
121 return type(self)(copy.deepcopy(self.items()))
121 return type(self)(copy.deepcopy(self.items()))
122
122
123 def __getitem__(self, key):
123 def __getitem__(self, key):
124 # We cannot use directly self._is_section_key, because it triggers
124 # We cannot use directly self._is_section_key, because it triggers
125 # infinite recursion on top of PyPy. Instead, we manually fish the
125 # infinite recursion on top of PyPy. Instead, we manually fish the
126 # bound method.
126 # bound method.
127 is_section_key = self.__class__._is_section_key.__get__(self)
127 is_section_key = self.__class__._is_section_key.__get__(self)
128
128
129 # Because we use this for an exec namespace, we need to delegate
129 # Because we use this for an exec namespace, we need to delegate
130 # the lookup of names in __builtin__ to itself. This means
130 # the lookup of names in __builtin__ to itself. This means
131 # that you can't have section or attribute names that are
131 # that you can't have section or attribute names that are
132 # builtins.
132 # builtins.
133 try:
133 try:
134 return getattr(__builtin__, key)
134 return getattr(builtin_mod, key)
135 except AttributeError:
135 except AttributeError:
136 pass
136 pass
137 if is_section_key(key):
137 if is_section_key(key):
138 try:
138 try:
139 return dict.__getitem__(self, key)
139 return dict.__getitem__(self, key)
140 except KeyError:
140 except KeyError:
141 c = Config()
141 c = Config()
142 dict.__setitem__(self, key, c)
142 dict.__setitem__(self, key, c)
143 return c
143 return c
144 else:
144 else:
145 return dict.__getitem__(self, key)
145 return dict.__getitem__(self, key)
146
146
147 def __setitem__(self, key, value):
147 def __setitem__(self, key, value):
148 # Don't allow names in __builtin__ to be modified.
148 # Don't allow names in __builtin__ to be modified.
149 if hasattr(__builtin__, key):
149 if hasattr(builtin_mod, key):
150 raise ConfigError('Config variable names cannot have the same name '
150 raise ConfigError('Config variable names cannot have the same name '
151 'as a Python builtin: %s' % key)
151 'as a Python builtin: %s' % key)
152 if self._is_section_key(key):
152 if self._is_section_key(key):
153 if not isinstance(value, Config):
153 if not isinstance(value, Config):
154 raise ValueError('values whose keys begin with an uppercase '
154 raise ValueError('values whose keys begin with an uppercase '
155 'char must be Config instances: %r, %r' % (key, value))
155 'char must be Config instances: %r, %r' % (key, value))
156 else:
156 else:
157 dict.__setitem__(self, key, value)
157 dict.__setitem__(self, key, value)
158
158
159 def __getattr__(self, key):
159 def __getattr__(self, key):
160 try:
160 try:
161 return self.__getitem__(key)
161 return self.__getitem__(key)
162 except KeyError, e:
162 except KeyError, e:
163 raise AttributeError(e)
163 raise AttributeError(e)
164
164
165 def __setattr__(self, key, value):
165 def __setattr__(self, key, value):
166 try:
166 try:
167 self.__setitem__(key, value)
167 self.__setitem__(key, value)
168 except KeyError, e:
168 except KeyError, e:
169 raise AttributeError(e)
169 raise AttributeError(e)
170
170
171 def __delattr__(self, key):
171 def __delattr__(self, key):
172 try:
172 try:
173 dict.__delitem__(self, key)
173 dict.__delitem__(self, key)
174 except KeyError, e:
174 except KeyError, e:
175 raise AttributeError(e)
175 raise AttributeError(e)
176
176
177
177
178 #-----------------------------------------------------------------------------
178 #-----------------------------------------------------------------------------
179 # Config loading classes
179 # Config loading classes
180 #-----------------------------------------------------------------------------
180 #-----------------------------------------------------------------------------
181
181
182
182
183 class ConfigLoader(object):
183 class ConfigLoader(object):
184 """A object for loading configurations from just about anywhere.
184 """A object for loading configurations from just about anywhere.
185
185
186 The resulting configuration is packaged as a :class:`Struct`.
186 The resulting configuration is packaged as a :class:`Struct`.
187
187
188 Notes
188 Notes
189 -----
189 -----
190 A :class:`ConfigLoader` does one thing: load a config from a source
190 A :class:`ConfigLoader` does one thing: load a config from a source
191 (file, command line arguments) and returns the data as a :class:`Struct`.
191 (file, command line arguments) and returns the data as a :class:`Struct`.
192 There are lots of things that :class:`ConfigLoader` does not do. It does
192 There are lots of things that :class:`ConfigLoader` does not do. It does
193 not implement complex logic for finding config files. It does not handle
193 not implement complex logic for finding config files. It does not handle
194 default values or merge multiple configs. These things need to be
194 default values or merge multiple configs. These things need to be
195 handled elsewhere.
195 handled elsewhere.
196 """
196 """
197
197
198 def __init__(self):
198 def __init__(self):
199 """A base class for config loaders.
199 """A base class for config loaders.
200
200
201 Examples
201 Examples
202 --------
202 --------
203
203
204 >>> cl = ConfigLoader()
204 >>> cl = ConfigLoader()
205 >>> config = cl.load_config()
205 >>> config = cl.load_config()
206 >>> config
206 >>> config
207 {}
207 {}
208 """
208 """
209 self.clear()
209 self.clear()
210
210
211 def clear(self):
211 def clear(self):
212 self.config = Config()
212 self.config = Config()
213
213
214 def load_config(self):
214 def load_config(self):
215 """Load a config from somewhere, return a :class:`Config` instance.
215 """Load a config from somewhere, return a :class:`Config` instance.
216
216
217 Usually, this will cause self.config to be set and then returned.
217 Usually, this will cause self.config to be set and then returned.
218 However, in most cases, :meth:`ConfigLoader.clear` should be called
218 However, in most cases, :meth:`ConfigLoader.clear` should be called
219 to erase any previous state.
219 to erase any previous state.
220 """
220 """
221 self.clear()
221 self.clear()
222 return self.config
222 return self.config
223
223
224
224
225 class FileConfigLoader(ConfigLoader):
225 class FileConfigLoader(ConfigLoader):
226 """A base class for file based configurations.
226 """A base class for file based configurations.
227
227
228 As we add more file based config loaders, the common logic should go
228 As we add more file based config loaders, the common logic should go
229 here.
229 here.
230 """
230 """
231 pass
231 pass
232
232
233
233
234 class PyFileConfigLoader(FileConfigLoader):
234 class PyFileConfigLoader(FileConfigLoader):
235 """A config loader for pure python files.
235 """A config loader for pure python files.
236
236
237 This calls execfile on a plain python file and looks for attributes
237 This calls execfile on a plain python file and looks for attributes
238 that are all caps. These attribute are added to the config Struct.
238 that are all caps. These attribute are added to the config Struct.
239 """
239 """
240
240
241 def __init__(self, filename, path=None):
241 def __init__(self, filename, path=None):
242 """Build a config loader for a filename and path.
242 """Build a config loader for a filename and path.
243
243
244 Parameters
244 Parameters
245 ----------
245 ----------
246 filename : str
246 filename : str
247 The file name of the config file.
247 The file name of the config file.
248 path : str, list, tuple
248 path : str, list, tuple
249 The path to search for the config file on, or a sequence of
249 The path to search for the config file on, or a sequence of
250 paths to try in order.
250 paths to try in order.
251 """
251 """
252 super(PyFileConfigLoader, self).__init__()
252 super(PyFileConfigLoader, self).__init__()
253 self.filename = filename
253 self.filename = filename
254 self.path = path
254 self.path = path
255 self.full_filename = ''
255 self.full_filename = ''
256 self.data = None
256 self.data = None
257
257
258 def load_config(self):
258 def load_config(self):
259 """Load the config from a file and return it as a Struct."""
259 """Load the config from a file and return it as a Struct."""
260 self.clear()
260 self.clear()
261 self._find_file()
261 self._find_file()
262 self._read_file_as_dict()
262 self._read_file_as_dict()
263 self._convert_to_config()
263 self._convert_to_config()
264 return self.config
264 return self.config
265
265
266 def _find_file(self):
266 def _find_file(self):
267 """Try to find the file by searching the paths."""
267 """Try to find the file by searching the paths."""
268 self.full_filename = filefind(self.filename, self.path)
268 self.full_filename = filefind(self.filename, self.path)
269
269
270 def _read_file_as_dict(self):
270 def _read_file_as_dict(self):
271 """Load the config file into self.config, with recursive loading."""
271 """Load the config file into self.config, with recursive loading."""
272 # This closure is made available in the namespace that is used
272 # This closure is made available in the namespace that is used
273 # to exec the config file. It allows users to call
273 # to exec the config file. It allows users to call
274 # load_subconfig('myconfig.py') to load config files recursively.
274 # load_subconfig('myconfig.py') to load config files recursively.
275 # It needs to be a closure because it has references to self.path
275 # It needs to be a closure because it has references to self.path
276 # and self.config. The sub-config is loaded with the same path
276 # and self.config. The sub-config is loaded with the same path
277 # as the parent, but it uses an empty config which is then merged
277 # as the parent, but it uses an empty config which is then merged
278 # with the parents.
278 # with the parents.
279
279
280 # If a profile is specified, the config file will be loaded
280 # If a profile is specified, the config file will be loaded
281 # from that profile
281 # from that profile
282
282
283 def load_subconfig(fname, profile=None):
283 def load_subconfig(fname, profile=None):
284 # import here to prevent circular imports
284 # import here to prevent circular imports
285 from IPython.core.profiledir import ProfileDir, ProfileDirError
285 from IPython.core.profiledir import ProfileDir, ProfileDirError
286 if profile is not None:
286 if profile is not None:
287 try:
287 try:
288 profile_dir = ProfileDir.find_profile_dir_by_name(
288 profile_dir = ProfileDir.find_profile_dir_by_name(
289 get_ipython_dir(),
289 get_ipython_dir(),
290 profile,
290 profile,
291 )
291 )
292 except ProfileDirError:
292 except ProfileDirError:
293 return
293 return
294 path = profile_dir.location
294 path = profile_dir.location
295 else:
295 else:
296 path = self.path
296 path = self.path
297 loader = PyFileConfigLoader(fname, path)
297 loader = PyFileConfigLoader(fname, path)
298 try:
298 try:
299 sub_config = loader.load_config()
299 sub_config = loader.load_config()
300 except IOError:
300 except IOError:
301 # Pass silently if the sub config is not there. This happens
301 # Pass silently if the sub config is not there. This happens
302 # when a user s using a profile, but not the default config.
302 # when a user s using a profile, but not the default config.
303 pass
303 pass
304 else:
304 else:
305 self.config._merge(sub_config)
305 self.config._merge(sub_config)
306
306
307 # Again, this needs to be a closure and should be used in config
307 # Again, this needs to be a closure and should be used in config
308 # files to get the config being loaded.
308 # files to get the config being loaded.
309 def get_config():
309 def get_config():
310 return self.config
310 return self.config
311
311
312 namespace = dict(load_subconfig=load_subconfig, get_config=get_config)
312 namespace = dict(load_subconfig=load_subconfig, get_config=get_config)
313 fs_encoding = sys.getfilesystemencoding() or 'ascii'
313 fs_encoding = sys.getfilesystemencoding() or 'ascii'
314 conf_filename = self.full_filename.encode(fs_encoding)
314 conf_filename = self.full_filename.encode(fs_encoding)
315 execfile(conf_filename, namespace)
315 py3compat.execfile(conf_filename, namespace)
316
316
317 def _convert_to_config(self):
317 def _convert_to_config(self):
318 if self.data is None:
318 if self.data is None:
319 ConfigLoaderError('self.data does not exist')
319 ConfigLoaderError('self.data does not exist')
320
320
321
321
322 class CommandLineConfigLoader(ConfigLoader):
322 class CommandLineConfigLoader(ConfigLoader):
323 """A config loader for command line arguments.
323 """A config loader for command line arguments.
324
324
325 As we add more command line based loaders, the common logic should go
325 As we add more command line based loaders, the common logic should go
326 here.
326 here.
327 """
327 """
328
328
329 def _exec_config_str(self, lhs, rhs):
329 def _exec_config_str(self, lhs, rhs):
330 exec_str = 'self.config.' + lhs + '=' + rhs
330 exec_str = 'self.config.' + lhs + '=' + rhs
331 try:
331 try:
332 # Try to see if regular Python syntax will work. This
332 # Try to see if regular Python syntax will work. This
333 # won't handle strings as the quote marks are removed
333 # won't handle strings as the quote marks are removed
334 # by the system shell.
334 # by the system shell.
335 exec exec_str in locals(), globals()
335 exec exec_str in locals(), globals()
336 except (NameError, SyntaxError):
336 except (NameError, SyntaxError):
337 # This case happens if the rhs is a string but without
337 # This case happens if the rhs is a string but without
338 # the quote marks. Use repr, to get quote marks, and
338 # the quote marks. Use repr, to get quote marks, and
339 # 'u' prefix and see if
339 # 'u' prefix and see if
340 # it succeeds. If it still fails, we let it raise.
340 # it succeeds. If it still fails, we let it raise.
341 exec_str = u'self.config.' + lhs + '=' + repr(rhs)
341 exec_str = u'self.config.' + lhs + '=' + repr(rhs)
342 exec exec_str in locals(), globals()
342 exec exec_str in locals(), globals()
343
343
344 def _load_flag(self, cfg):
344 def _load_flag(self, cfg):
345 """update self.config from a flag, which can be a dict or Config"""
345 """update self.config from a flag, which can be a dict or Config"""
346 if isinstance(cfg, (dict, Config)):
346 if isinstance(cfg, (dict, Config)):
347 # don't clobber whole config sections, update
347 # don't clobber whole config sections, update
348 # each section from config:
348 # each section from config:
349 for sec,c in cfg.iteritems():
349 for sec,c in cfg.iteritems():
350 self.config[sec].update(c)
350 self.config[sec].update(c)
351 else:
351 else:
352 raise ValueError("Invalid flag: '%s'"%raw)
352 raise ValueError("Invalid flag: '%s'"%raw)
353
353
354 # raw --identifier=value pattern
354 # raw --identifier=value pattern
355 # but *also* accept '-' as wordsep, for aliases
355 # but *also* accept '-' as wordsep, for aliases
356 # accepts: --foo=a
356 # accepts: --foo=a
357 # --Class.trait=value
357 # --Class.trait=value
358 # --alias-name=value
358 # --alias-name=value
359 # rejects: -foo=value
359 # rejects: -foo=value
360 # --foo
360 # --foo
361 # --Class.trait
361 # --Class.trait
362 kv_pattern = re.compile(r'\-\-[A-Za-z][\w\-]*(\.[\w\-]+)*\=.*')
362 kv_pattern = re.compile(r'\-\-[A-Za-z][\w\-]*(\.[\w\-]+)*\=.*')
363
363
364 # just flags, no assignments, with two *or one* leading '-'
364 # just flags, no assignments, with two *or one* leading '-'
365 # accepts: --foo
365 # accepts: --foo
366 # -foo-bar-again
366 # -foo-bar-again
367 # rejects: --anything=anything
367 # rejects: --anything=anything
368 # --two.word
368 # --two.word
369
369
370 flag_pattern = re.compile(r'\-\-?\w+[\-\w]*$')
370 flag_pattern = re.compile(r'\-\-?\w+[\-\w]*$')
371
371
372 class KeyValueConfigLoader(CommandLineConfigLoader):
372 class KeyValueConfigLoader(CommandLineConfigLoader):
373 """A config loader that loads key value pairs from the command line.
373 """A config loader that loads key value pairs from the command line.
374
374
375 This allows command line options to be gives in the following form::
375 This allows command line options to be gives in the following form::
376
376
377 ipython --profile="foo" --InteractiveShell.autocall=False
377 ipython --profile="foo" --InteractiveShell.autocall=False
378 """
378 """
379
379
380 def __init__(self, argv=None, aliases=None, flags=None):
380 def __init__(self, argv=None, aliases=None, flags=None):
381 """Create a key value pair config loader.
381 """Create a key value pair config loader.
382
382
383 Parameters
383 Parameters
384 ----------
384 ----------
385 argv : list
385 argv : list
386 A list that has the form of sys.argv[1:] which has unicode
386 A list that has the form of sys.argv[1:] which has unicode
387 elements of the form u"key=value". If this is None (default),
387 elements of the form u"key=value". If this is None (default),
388 then sys.argv[1:] will be used.
388 then sys.argv[1:] will be used.
389 aliases : dict
389 aliases : dict
390 A dict of aliases for configurable traits.
390 A dict of aliases for configurable traits.
391 Keys are the short aliases, Values are the resolved trait.
391 Keys are the short aliases, Values are the resolved trait.
392 Of the form: `{'alias' : 'Configurable.trait'}`
392 Of the form: `{'alias' : 'Configurable.trait'}`
393 flags : dict
393 flags : dict
394 A dict of flags, keyed by str name. Vaues can be Config objects,
394 A dict of flags, keyed by str name. Vaues can be Config objects,
395 dicts, or "key=value" strings. If Config or dict, when the flag
395 dicts, or "key=value" strings. If Config or dict, when the flag
396 is triggered, The flag is loaded as `self.config.update(m)`.
396 is triggered, The flag is loaded as `self.config.update(m)`.
397
397
398 Returns
398 Returns
399 -------
399 -------
400 config : Config
400 config : Config
401 The resulting Config object.
401 The resulting Config object.
402
402
403 Examples
403 Examples
404 --------
404 --------
405
405
406 >>> from IPython.config.loader import KeyValueConfigLoader
406 >>> from IPython.config.loader import KeyValueConfigLoader
407 >>> cl = KeyValueConfigLoader()
407 >>> cl = KeyValueConfigLoader()
408 >>> cl.load_config(["--A.name='brian'","--B.number=0"])
408 >>> cl.load_config(["--A.name='brian'","--B.number=0"])
409 {'A': {'name': 'brian'}, 'B': {'number': 0}}
409 {'A': {'name': 'brian'}, 'B': {'number': 0}}
410 """
410 """
411 self.clear()
411 self.clear()
412 if argv is None:
412 if argv is None:
413 argv = sys.argv[1:]
413 argv = sys.argv[1:]
414 self.argv = argv
414 self.argv = argv
415 self.aliases = aliases or {}
415 self.aliases = aliases or {}
416 self.flags = flags or {}
416 self.flags = flags or {}
417
417
418
418
419 def clear(self):
419 def clear(self):
420 super(KeyValueConfigLoader, self).clear()
420 super(KeyValueConfigLoader, self).clear()
421 self.extra_args = []
421 self.extra_args = []
422
422
423
423
424 def _decode_argv(self, argv, enc=None):
424 def _decode_argv(self, argv, enc=None):
425 """decode argv if bytes, using stin.encoding, falling back on default enc"""
425 """decode argv if bytes, using stin.encoding, falling back on default enc"""
426 uargv = []
426 uargv = []
427 if enc is None:
427 if enc is None:
428 enc = sys.stdin.encoding or sys.getdefaultencoding()
428 enc = sys.stdin.encoding or sys.getdefaultencoding()
429 for arg in argv:
429 for arg in argv:
430 if not isinstance(arg, unicode):
430 if not isinstance(arg, unicode):
431 # only decode if not already decoded
431 # only decode if not already decoded
432 arg = arg.decode(enc)
432 arg = arg.decode(enc)
433 uargv.append(arg)
433 uargv.append(arg)
434 return uargv
434 return uargv
435
435
436
436
437 def load_config(self, argv=None, aliases=None, flags=None):
437 def load_config(self, argv=None, aliases=None, flags=None):
438 """Parse the configuration and generate the Config object.
438 """Parse the configuration and generate the Config object.
439
439
440 After loading, any arguments that are not key-value or
440 After loading, any arguments that are not key-value or
441 flags will be stored in self.extra_args - a list of
441 flags will be stored in self.extra_args - a list of
442 unparsed command-line arguments. This is used for
442 unparsed command-line arguments. This is used for
443 arguments such as input files or subcommands.
443 arguments such as input files or subcommands.
444
444
445 Parameters
445 Parameters
446 ----------
446 ----------
447 argv : list, optional
447 argv : list, optional
448 A list that has the form of sys.argv[1:] which has unicode
448 A list that has the form of sys.argv[1:] which has unicode
449 elements of the form u"key=value". If this is None (default),
449 elements of the form u"key=value". If this is None (default),
450 then self.argv will be used.
450 then self.argv will be used.
451 aliases : dict
451 aliases : dict
452 A dict of aliases for configurable traits.
452 A dict of aliases for configurable traits.
453 Keys are the short aliases, Values are the resolved trait.
453 Keys are the short aliases, Values are the resolved trait.
454 Of the form: `{'alias' : 'Configurable.trait'}`
454 Of the form: `{'alias' : 'Configurable.trait'}`
455 flags : dict
455 flags : dict
456 A dict of flags, keyed by str name. Values can be Config objects
456 A dict of flags, keyed by str name. Values can be Config objects
457 or dicts. When the flag is triggered, The config is loaded as
457 or dicts. When the flag is triggered, The config is loaded as
458 `self.config.update(cfg)`.
458 `self.config.update(cfg)`.
459 """
459 """
460 from IPython.config.configurable import Configurable
460 from IPython.config.configurable import Configurable
461
461
462 self.clear()
462 self.clear()
463 if argv is None:
463 if argv is None:
464 argv = self.argv
464 argv = self.argv
465 if aliases is None:
465 if aliases is None:
466 aliases = self.aliases
466 aliases = self.aliases
467 if flags is None:
467 if flags is None:
468 flags = self.flags
468 flags = self.flags
469
469
470 # ensure argv is a list of unicode strings:
470 # ensure argv is a list of unicode strings:
471 uargv = self._decode_argv(argv)
471 uargv = self._decode_argv(argv)
472 for idx,raw in enumerate(uargv):
472 for idx,raw in enumerate(uargv):
473 # strip leading '-'
473 # strip leading '-'
474 item = raw.lstrip('-')
474 item = raw.lstrip('-')
475
475
476 if raw == '--':
476 if raw == '--':
477 # don't parse arguments after '--'
477 # don't parse arguments after '--'
478 # this is useful for relaying arguments to scripts, e.g.
478 # this is useful for relaying arguments to scripts, e.g.
479 # ipython -i foo.py --pylab=qt -- args after '--' go-to-foo.py
479 # ipython -i foo.py --pylab=qt -- args after '--' go-to-foo.py
480 self.extra_args.extend(uargv[idx+1:])
480 self.extra_args.extend(uargv[idx+1:])
481 break
481 break
482
482
483 if kv_pattern.match(raw):
483 if kv_pattern.match(raw):
484 lhs,rhs = item.split('=',1)
484 lhs,rhs = item.split('=',1)
485 # Substitute longnames for aliases.
485 # Substitute longnames for aliases.
486 if lhs in aliases:
486 if lhs in aliases:
487 lhs = aliases[lhs]
487 lhs = aliases[lhs]
488 if '.' not in lhs:
488 if '.' not in lhs:
489 # probably a mistyped alias, but not technically illegal
489 # probably a mistyped alias, but not technically illegal
490 warn.warn("Unrecognized alias: '%s', it will probably have no effect."%lhs)
490 warn.warn("Unrecognized alias: '%s', it will probably have no effect."%lhs)
491 self._exec_config_str(lhs, rhs)
491 self._exec_config_str(lhs, rhs)
492
492
493 elif flag_pattern.match(raw):
493 elif flag_pattern.match(raw):
494 if item in flags:
494 if item in flags:
495 cfg,help = flags[item]
495 cfg,help = flags[item]
496 self._load_flag(cfg)
496 self._load_flag(cfg)
497 else:
497 else:
498 raise ArgumentError("Unrecognized flag: '%s'"%raw)
498 raise ArgumentError("Unrecognized flag: '%s'"%raw)
499 elif raw.startswith('-'):
499 elif raw.startswith('-'):
500 kv = '--'+item
500 kv = '--'+item
501 if kv_pattern.match(kv):
501 if kv_pattern.match(kv):
502 raise ArgumentError("Invalid argument: '%s', did you mean '%s'?"%(raw, kv))
502 raise ArgumentError("Invalid argument: '%s', did you mean '%s'?"%(raw, kv))
503 else:
503 else:
504 raise ArgumentError("Invalid argument: '%s'"%raw)
504 raise ArgumentError("Invalid argument: '%s'"%raw)
505 else:
505 else:
506 # keep all args that aren't valid in a list,
506 # keep all args that aren't valid in a list,
507 # in case our parent knows what to do with them.
507 # in case our parent knows what to do with them.
508 self.extra_args.append(item)
508 self.extra_args.append(item)
509 return self.config
509 return self.config
510
510
511 class ArgParseConfigLoader(CommandLineConfigLoader):
511 class ArgParseConfigLoader(CommandLineConfigLoader):
512 """A loader that uses the argparse module to load from the command line."""
512 """A loader that uses the argparse module to load from the command line."""
513
513
514 def __init__(self, argv=None, aliases=None, flags=None, *parser_args, **parser_kw):
514 def __init__(self, argv=None, aliases=None, flags=None, *parser_args, **parser_kw):
515 """Create a config loader for use with argparse.
515 """Create a config loader for use with argparse.
516
516
517 Parameters
517 Parameters
518 ----------
518 ----------
519
519
520 argv : optional, list
520 argv : optional, list
521 If given, used to read command-line arguments from, otherwise
521 If given, used to read command-line arguments from, otherwise
522 sys.argv[1:] is used.
522 sys.argv[1:] is used.
523
523
524 parser_args : tuple
524 parser_args : tuple
525 A tuple of positional arguments that will be passed to the
525 A tuple of positional arguments that will be passed to the
526 constructor of :class:`argparse.ArgumentParser`.
526 constructor of :class:`argparse.ArgumentParser`.
527
527
528 parser_kw : dict
528 parser_kw : dict
529 A tuple of keyword arguments that will be passed to the
529 A tuple of keyword arguments that will be passed to the
530 constructor of :class:`argparse.ArgumentParser`.
530 constructor of :class:`argparse.ArgumentParser`.
531
531
532 Returns
532 Returns
533 -------
533 -------
534 config : Config
534 config : Config
535 The resulting Config object.
535 The resulting Config object.
536 """
536 """
537 super(CommandLineConfigLoader, self).__init__()
537 super(CommandLineConfigLoader, self).__init__()
538 self.clear()
538 self.clear()
539 if argv is None:
539 if argv is None:
540 argv = sys.argv[1:]
540 argv = sys.argv[1:]
541 self.argv = argv
541 self.argv = argv
542 self.aliases = aliases or {}
542 self.aliases = aliases or {}
543 self.flags = flags or {}
543 self.flags = flags or {}
544
544
545 self.parser_args = parser_args
545 self.parser_args = parser_args
546 self.version = parser_kw.pop("version", None)
546 self.version = parser_kw.pop("version", None)
547 kwargs = dict(argument_default=argparse.SUPPRESS)
547 kwargs = dict(argument_default=argparse.SUPPRESS)
548 kwargs.update(parser_kw)
548 kwargs.update(parser_kw)
549 self.parser_kw = kwargs
549 self.parser_kw = kwargs
550
550
551 def load_config(self, argv=None, aliases=None, flags=None):
551 def load_config(self, argv=None, aliases=None, flags=None):
552 """Parse command line arguments and return as a Config object.
552 """Parse command line arguments and return as a Config object.
553
553
554 Parameters
554 Parameters
555 ----------
555 ----------
556
556
557 args : optional, list
557 args : optional, list
558 If given, a list with the structure of sys.argv[1:] to parse
558 If given, a list with the structure of sys.argv[1:] to parse
559 arguments from. If not given, the instance's self.argv attribute
559 arguments from. If not given, the instance's self.argv attribute
560 (given at construction time) is used."""
560 (given at construction time) is used."""
561 self.clear()
561 self.clear()
562 if argv is None:
562 if argv is None:
563 argv = self.argv
563 argv = self.argv
564 if aliases is None:
564 if aliases is None:
565 aliases = self.aliases
565 aliases = self.aliases
566 if flags is None:
566 if flags is None:
567 flags = self.flags
567 flags = self.flags
568 self._create_parser(aliases, flags)
568 self._create_parser(aliases, flags)
569 self._parse_args(argv)
569 self._parse_args(argv)
570 self._convert_to_config()
570 self._convert_to_config()
571 return self.config
571 return self.config
572
572
573 def get_extra_args(self):
573 def get_extra_args(self):
574 if hasattr(self, 'extra_args'):
574 if hasattr(self, 'extra_args'):
575 return self.extra_args
575 return self.extra_args
576 else:
576 else:
577 return []
577 return []
578
578
579 def _create_parser(self, aliases=None, flags=None):
579 def _create_parser(self, aliases=None, flags=None):
580 self.parser = ArgumentParser(*self.parser_args, **self.parser_kw)
580 self.parser = ArgumentParser(*self.parser_args, **self.parser_kw)
581 self._add_arguments(aliases, flags)
581 self._add_arguments(aliases, flags)
582
582
583 def _add_arguments(self, aliases=None, flags=None):
583 def _add_arguments(self, aliases=None, flags=None):
584 raise NotImplementedError("subclasses must implement _add_arguments")
584 raise NotImplementedError("subclasses must implement _add_arguments")
585
585
586 def _parse_args(self, args):
586 def _parse_args(self, args):
587 """self.parser->self.parsed_data"""
587 """self.parser->self.parsed_data"""
588 # decode sys.argv to support unicode command-line options
588 # decode sys.argv to support unicode command-line options
589 uargs = []
589 uargs = [py3compat.cast_unicode(a) for a in args]
590 for a in args:
591 if isinstance(a, str):
592 # don't decode if we already got unicode
593 a = a.decode(sys.stdin.encoding or
594 sys.getdefaultencoding())
595 uargs.append(a)
596 self.parsed_data, self.extra_args = self.parser.parse_known_args(uargs)
590 self.parsed_data, self.extra_args = self.parser.parse_known_args(uargs)
597
591
598 def _convert_to_config(self):
592 def _convert_to_config(self):
599 """self.parsed_data->self.config"""
593 """self.parsed_data->self.config"""
600 for k, v in vars(self.parsed_data).iteritems():
594 for k, v in vars(self.parsed_data).iteritems():
601 exec "self.config.%s = v"%k in locals(), globals()
595 exec "self.config.%s = v"%k in locals(), globals()
602
596
603 class KVArgParseConfigLoader(ArgParseConfigLoader):
597 class KVArgParseConfigLoader(ArgParseConfigLoader):
604 """A config loader that loads aliases and flags with argparse,
598 """A config loader that loads aliases and flags with argparse,
605 but will use KVLoader for the rest. This allows better parsing
599 but will use KVLoader for the rest. This allows better parsing
606 of common args, such as `ipython -c 'print 5'`, but still gets
600 of common args, such as `ipython -c 'print 5'`, but still gets
607 arbitrary config with `ipython --InteractiveShell.use_readline=False`"""
601 arbitrary config with `ipython --InteractiveShell.use_readline=False`"""
608
602
609 def _convert_to_config(self):
603 def _convert_to_config(self):
610 """self.parsed_data->self.config"""
604 """self.parsed_data->self.config"""
611 for k, v in vars(self.parsed_data).iteritems():
605 for k, v in vars(self.parsed_data).iteritems():
612 self._exec_config_str(k, v)
606 self._exec_config_str(k, v)
613
607
614 def _add_arguments(self, aliases=None, flags=None):
608 def _add_arguments(self, aliases=None, flags=None):
615 self.alias_flags = {}
609 self.alias_flags = {}
616 # print aliases, flags
610 # print aliases, flags
617 if aliases is None:
611 if aliases is None:
618 aliases = self.aliases
612 aliases = self.aliases
619 if flags is None:
613 if flags is None:
620 flags = self.flags
614 flags = self.flags
621 paa = self.parser.add_argument
615 paa = self.parser.add_argument
622 for key,value in aliases.iteritems():
616 for key,value in aliases.iteritems():
623 if key in flags:
617 if key in flags:
624 # flags
618 # flags
625 nargs = '?'
619 nargs = '?'
626 else:
620 else:
627 nargs = None
621 nargs = None
628 if len(key) is 1:
622 if len(key) is 1:
629 paa('-'+key, '--'+key, type=str, dest=value, nargs=nargs)
623 paa('-'+key, '--'+key, type=str, dest=value, nargs=nargs)
630 else:
624 else:
631 paa('--'+key, type=str, dest=value, nargs=nargs)
625 paa('--'+key, type=str, dest=value, nargs=nargs)
632 for key, (value, help) in flags.iteritems():
626 for key, (value, help) in flags.iteritems():
633 if key in self.aliases:
627 if key in self.aliases:
634 #
628 #
635 self.alias_flags[self.aliases[key]] = value
629 self.alias_flags[self.aliases[key]] = value
636 continue
630 continue
637 if len(key) is 1:
631 if len(key) is 1:
638 paa('-'+key, '--'+key, action='append_const', dest='_flags', const=value)
632 paa('-'+key, '--'+key, action='append_const', dest='_flags', const=value)
639 else:
633 else:
640 paa('--'+key, action='append_const', dest='_flags', const=value)
634 paa('--'+key, action='append_const', dest='_flags', const=value)
641
635
642 def _convert_to_config(self):
636 def _convert_to_config(self):
643 """self.parsed_data->self.config, parse unrecognized extra args via KVLoader."""
637 """self.parsed_data->self.config, parse unrecognized extra args via KVLoader."""
644 # remove subconfigs list from namespace before transforming the Namespace
638 # remove subconfigs list from namespace before transforming the Namespace
645 if '_flags' in self.parsed_data:
639 if '_flags' in self.parsed_data:
646 subcs = self.parsed_data._flags
640 subcs = self.parsed_data._flags
647 del self.parsed_data._flags
641 del self.parsed_data._flags
648 else:
642 else:
649 subcs = []
643 subcs = []
650
644
651 for k, v in vars(self.parsed_data).iteritems():
645 for k, v in vars(self.parsed_data).iteritems():
652 if v is None:
646 if v is None:
653 # it was a flag that shares the name of an alias
647 # it was a flag that shares the name of an alias
654 subcs.append(self.alias_flags[k])
648 subcs.append(self.alias_flags[k])
655 else:
649 else:
656 # eval the KV assignment
650 # eval the KV assignment
657 self._exec_config_str(k, v)
651 self._exec_config_str(k, v)
658
652
659 for subc in subcs:
653 for subc in subcs:
660 self._load_flag(subc)
654 self._load_flag(subc)
661
655
662 if self.extra_args:
656 if self.extra_args:
663 sub_parser = KeyValueConfigLoader()
657 sub_parser = KeyValueConfigLoader()
664 sub_parser.load_config(self.extra_args)
658 sub_parser.load_config(self.extra_args)
665 self.config._merge(sub_parser.config)
659 self.config._merge(sub_parser.config)
666 self.extra_args = sub_parser.extra_args
660 self.extra_args = sub_parser.extra_args
@@ -1,347 +1,347 b''
1 """Implementations for various useful completers.
1 """Implementations for various useful completers.
2
2
3 These are all loaded by default by IPython.
3 These are all loaded by default by IPython.
4 """
4 """
5 #-----------------------------------------------------------------------------
5 #-----------------------------------------------------------------------------
6 # Copyright (C) 2010 The IPython Development Team.
6 # Copyright (C) 2010 The IPython Development Team.
7 #
7 #
8 # Distributed under the terms of the BSD License.
8 # Distributed under the terms of the BSD License.
9 #
9 #
10 # The full license is in the file COPYING.txt, distributed with this software.
10 # The full license is in the file COPYING.txt, distributed with this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16 from __future__ import print_function
16 from __future__ import print_function
17
17
18 # Stdlib imports
18 # Stdlib imports
19 import glob
19 import glob
20 import inspect
20 import inspect
21 import os
21 import os
22 import re
22 import re
23 import shlex
23 import shlex
24 import sys
24 import sys
25
25
26 # Third-party imports
26 # Third-party imports
27 from time import time
27 from time import time
28 from zipimport import zipimporter
28 from zipimport import zipimporter
29
29
30 # Our own imports
30 # Our own imports
31 from IPython.core.completer import expand_user, compress_user
31 from IPython.core.completer import expand_user, compress_user
32 from IPython.core.error import TryNext
32 from IPython.core.error import TryNext
33 from IPython.utils import py3compat
33
34
34 # FIXME: this should be pulled in with the right call via the component system
35 # FIXME: this should be pulled in with the right call via the component system
35 from IPython.core.ipapi import get as get_ipython
36 from IPython.core.ipapi import get as get_ipython
36
37
37 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
38 # Globals and constants
39 # Globals and constants
39 #-----------------------------------------------------------------------------
40 #-----------------------------------------------------------------------------
40
41
41 # Time in seconds after which the rootmodules will be stored permanently in the
42 # Time in seconds after which the rootmodules will be stored permanently in the
42 # ipython ip.db database (kept in the user's .ipython dir).
43 # ipython ip.db database (kept in the user's .ipython dir).
43 TIMEOUT_STORAGE = 2
44 TIMEOUT_STORAGE = 2
44
45
45 # Time in seconds after which we give up
46 # Time in seconds after which we give up
46 TIMEOUT_GIVEUP = 20
47 TIMEOUT_GIVEUP = 20
47
48
48 # Regular expression for the python import statement
49 # Regular expression for the python import statement
49 import_re = re.compile(r'.*(\.so|\.py[cod]?)$')
50 import_re = re.compile(r'.*(\.so|\.py[cod]?)$')
50
51
51 # RE for the ipython %run command (python + ipython scripts)
52 # RE for the ipython %run command (python + ipython scripts)
52 magic_run_re = re.compile(r'.*(\.ipy|\.py[w]?)$')
53 magic_run_re = re.compile(r'.*(\.ipy|\.py[w]?)$')
53
54
54 #-----------------------------------------------------------------------------
55 #-----------------------------------------------------------------------------
55 # Local utilities
56 # Local utilities
56 #-----------------------------------------------------------------------------
57 #-----------------------------------------------------------------------------
57
58
58 def shlex_split(x):
59 def shlex_split(x):
59 """Helper function to split lines into segments.
60 """Helper function to split lines into segments.
60 """
61 """
61 # shlex.split raises an exception if there is a syntax error in sh syntax
62 # shlex.split raises an exception if there is a syntax error in sh syntax
62 # for example if no closing " is found. This function keeps dropping the
63 # for example if no closing " is found. This function keeps dropping the
63 # last character of the line until shlex.split does not raise
64 # last character of the line until shlex.split does not raise
64 # an exception. It adds end of the line to the result of shlex.split
65 # an exception. It adds end of the line to the result of shlex.split
65 #
66 #
66 # Example:
67 # Example:
67 # %run "c:/python -> ['%run','"c:/python']
68 # %run "c:/python -> ['%run','"c:/python']
68
69
69 # shlex.split has unicode bugs, so encode first to str
70 # shlex.split has unicode bugs in Python 2, so encode first to str
70 if isinstance(x, unicode):
71 if not py3compat.PY3:
71 # don't raise errors on encoding:
72 x = py3compat.cast_bytes(x)
72 x = x.encode(sys.stdin.encoding or sys.getdefaultencoding(), 'replace')
73
73
74 endofline = []
74 endofline = []
75 while x != '':
75 while x != '':
76 try:
76 try:
77 comps = shlex.split(x)
77 comps = shlex.split(x)
78 if len(endofline) >= 1:
78 if len(endofline) >= 1:
79 comps.append(''.join(endofline))
79 comps.append(''.join(endofline))
80 return comps
80 return comps
81
81
82 except ValueError:
82 except ValueError:
83 endofline = [x[-1:]]+endofline
83 endofline = [x[-1:]]+endofline
84 x = x[:-1]
84 x = x[:-1]
85
85
86 return [''.join(endofline)]
86 return [''.join(endofline)]
87
87
88 def module_list(path):
88 def module_list(path):
89 """
89 """
90 Return the list containing the names of the modules available in the given
90 Return the list containing the names of the modules available in the given
91 folder.
91 folder.
92 """
92 """
93
93
94 if os.path.isdir(path):
94 if os.path.isdir(path):
95 folder_list = os.listdir(path)
95 folder_list = os.listdir(path)
96 elif path.endswith('.egg'):
96 elif path.endswith('.egg'):
97 try:
97 try:
98 folder_list = [f for f in zipimporter(path)._files]
98 folder_list = [f for f in zipimporter(path)._files]
99 except:
99 except:
100 folder_list = []
100 folder_list = []
101 else:
101 else:
102 folder_list = []
102 folder_list = []
103
103
104 if not folder_list:
104 if not folder_list:
105 return []
105 return []
106
106
107 # A few local constants to be used in loops below
107 # A few local constants to be used in loops below
108 isfile = os.path.isfile
108 isfile = os.path.isfile
109 pjoin = os.path.join
109 pjoin = os.path.join
110 basename = os.path.basename
110 basename = os.path.basename
111
111
112 # Now find actual path matches for packages or modules
112 # Now find actual path matches for packages or modules
113 folder_list = [p for p in folder_list
113 folder_list = [p for p in folder_list
114 if isfile(pjoin(path, p,'__init__.py'))
114 if isfile(pjoin(path, p,'__init__.py'))
115 or import_re.match(p) ]
115 or import_re.match(p) ]
116
116
117 return [basename(p).split('.')[0] for p in folder_list]
117 return [basename(p).split('.')[0] for p in folder_list]
118
118
119 def get_root_modules():
119 def get_root_modules():
120 """
120 """
121 Returns a list containing the names of all the modules available in the
121 Returns a list containing the names of all the modules available in the
122 folders of the pythonpath.
122 folders of the pythonpath.
123 """
123 """
124 ip = get_ipython()
124 ip = get_ipython()
125
125
126 if 'rootmodules' in ip.db:
126 if 'rootmodules' in ip.db:
127 return ip.db['rootmodules']
127 return ip.db['rootmodules']
128
128
129 t = time()
129 t = time()
130 store = False
130 store = False
131 modules = list(sys.builtin_module_names)
131 modules = list(sys.builtin_module_names)
132 for path in sys.path:
132 for path in sys.path:
133 modules += module_list(path)
133 modules += module_list(path)
134 if time() - t >= TIMEOUT_STORAGE and not store:
134 if time() - t >= TIMEOUT_STORAGE and not store:
135 store = True
135 store = True
136 print("\nCaching the list of root modules, please wait!")
136 print("\nCaching the list of root modules, please wait!")
137 print("(This will only be done once - type '%rehashx' to "
137 print("(This will only be done once - type '%rehashx' to "
138 "reset cache!)\n")
138 "reset cache!)\n")
139 sys.stdout.flush()
139 sys.stdout.flush()
140 if time() - t > TIMEOUT_GIVEUP:
140 if time() - t > TIMEOUT_GIVEUP:
141 print("This is taking too long, we give up.\n")
141 print("This is taking too long, we give up.\n")
142 ip.db['rootmodules'] = []
142 ip.db['rootmodules'] = []
143 return []
143 return []
144
144
145 modules = set(modules)
145 modules = set(modules)
146 if '__init__' in modules:
146 if '__init__' in modules:
147 modules.remove('__init__')
147 modules.remove('__init__')
148 modules = list(modules)
148 modules = list(modules)
149 if store:
149 if store:
150 ip.db['rootmodules'] = modules
150 ip.db['rootmodules'] = modules
151 return modules
151 return modules
152
152
153
153
154 def is_importable(module, attr, only_modules):
154 def is_importable(module, attr, only_modules):
155 if only_modules:
155 if only_modules:
156 return inspect.ismodule(getattr(module, attr))
156 return inspect.ismodule(getattr(module, attr))
157 else:
157 else:
158 return not(attr[:2] == '__' and attr[-2:] == '__')
158 return not(attr[:2] == '__' and attr[-2:] == '__')
159
159
160
160
161 def try_import(mod, only_modules=False):
161 def try_import(mod, only_modules=False):
162 try:
162 try:
163 m = __import__(mod)
163 m = __import__(mod)
164 except:
164 except:
165 return []
165 return []
166 mods = mod.split('.')
166 mods = mod.split('.')
167 for module in mods[1:]:
167 for module in mods[1:]:
168 m = getattr(m, module)
168 m = getattr(m, module)
169
169
170 m_is_init = hasattr(m, '__file__') and '__init__' in m.__file__
170 m_is_init = hasattr(m, '__file__') and '__init__' in m.__file__
171
171
172 completions = []
172 completions = []
173 if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init:
173 if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init:
174 completions.extend( [attr for attr in dir(m) if
174 completions.extend( [attr for attr in dir(m) if
175 is_importable(m, attr, only_modules)])
175 is_importable(m, attr, only_modules)])
176
176
177 completions.extend(getattr(m, '__all__', []))
177 completions.extend(getattr(m, '__all__', []))
178 if m_is_init:
178 if m_is_init:
179 completions.extend(module_list(os.path.dirname(m.__file__)))
179 completions.extend(module_list(os.path.dirname(m.__file__)))
180 completions = set(completions)
180 completions = set(completions)
181 if '__init__' in completions:
181 if '__init__' in completions:
182 completions.remove('__init__')
182 completions.remove('__init__')
183 return list(completions)
183 return list(completions)
184
184
185
185
186 #-----------------------------------------------------------------------------
186 #-----------------------------------------------------------------------------
187 # Completion-related functions.
187 # Completion-related functions.
188 #-----------------------------------------------------------------------------
188 #-----------------------------------------------------------------------------
189
189
190 def quick_completer(cmd, completions):
190 def quick_completer(cmd, completions):
191 """ Easily create a trivial completer for a command.
191 """ Easily create a trivial completer for a command.
192
192
193 Takes either a list of completions, or all completions in string (that will
193 Takes either a list of completions, or all completions in string (that will
194 be split on whitespace).
194 be split on whitespace).
195
195
196 Example::
196 Example::
197
197
198 [d:\ipython]|1> import ipy_completers
198 [d:\ipython]|1> import ipy_completers
199 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
199 [d:\ipython]|2> ipy_completers.quick_completer('foo', ['bar','baz'])
200 [d:\ipython]|3> foo b<TAB>
200 [d:\ipython]|3> foo b<TAB>
201 bar baz
201 bar baz
202 [d:\ipython]|3> foo ba
202 [d:\ipython]|3> foo ba
203 """
203 """
204
204
205 if isinstance(completions, basestring):
205 if isinstance(completions, basestring):
206 completions = completions.split()
206 completions = completions.split()
207
207
208 def do_complete(self, event):
208 def do_complete(self, event):
209 return completions
209 return completions
210
210
211 get_ipython().set_hook('complete_command',do_complete, str_key = cmd)
211 get_ipython().set_hook('complete_command',do_complete, str_key = cmd)
212
212
213
213
214 def module_completion(line):
214 def module_completion(line):
215 """
215 """
216 Returns a list containing the completion possibilities for an import line.
216 Returns a list containing the completion possibilities for an import line.
217
217
218 The line looks like this :
218 The line looks like this :
219 'import xml.d'
219 'import xml.d'
220 'from xml.dom import'
220 'from xml.dom import'
221 """
221 """
222
222
223 words = line.split(' ')
223 words = line.split(' ')
224 nwords = len(words)
224 nwords = len(words)
225
225
226 # from whatever <tab> -> 'import '
226 # from whatever <tab> -> 'import '
227 if nwords == 3 and words[0] == 'from':
227 if nwords == 3 and words[0] == 'from':
228 return ['import ']
228 return ['import ']
229
229
230 # 'from xy<tab>' or 'import xy<tab>'
230 # 'from xy<tab>' or 'import xy<tab>'
231 if nwords < 3 and (words[0] in ['import','from']) :
231 if nwords < 3 and (words[0] in ['import','from']) :
232 if nwords == 1:
232 if nwords == 1:
233 return get_root_modules()
233 return get_root_modules()
234 mod = words[1].split('.')
234 mod = words[1].split('.')
235 if len(mod) < 2:
235 if len(mod) < 2:
236 return get_root_modules()
236 return get_root_modules()
237 completion_list = try_import('.'.join(mod[:-1]), True)
237 completion_list = try_import('.'.join(mod[:-1]), True)
238 return ['.'.join(mod[:-1] + [el]) for el in completion_list]
238 return ['.'.join(mod[:-1] + [el]) for el in completion_list]
239
239
240 # 'from xyz import abc<tab>'
240 # 'from xyz import abc<tab>'
241 if nwords >= 3 and words[0] == 'from':
241 if nwords >= 3 and words[0] == 'from':
242 mod = words[1]
242 mod = words[1]
243 return try_import(mod)
243 return try_import(mod)
244
244
245 #-----------------------------------------------------------------------------
245 #-----------------------------------------------------------------------------
246 # Completers
246 # Completers
247 #-----------------------------------------------------------------------------
247 #-----------------------------------------------------------------------------
248 # These all have the func(self, event) signature to be used as custom
248 # These all have the func(self, event) signature to be used as custom
249 # completers
249 # completers
250
250
251 def module_completer(self,event):
251 def module_completer(self,event):
252 """Give completions after user has typed 'import ...' or 'from ...'"""
252 """Give completions after user has typed 'import ...' or 'from ...'"""
253
253
254 # This works in all versions of python. While 2.5 has
254 # This works in all versions of python. While 2.5 has
255 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
255 # pkgutil.walk_packages(), that particular routine is fairly dangerous,
256 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
256 # since it imports *EVERYTHING* on sys.path. That is: a) very slow b) full
257 # of possibly problematic side effects.
257 # of possibly problematic side effects.
258 # This search the folders in the sys.path for available modules.
258 # This search the folders in the sys.path for available modules.
259
259
260 return module_completion(event.line)
260 return module_completion(event.line)
261
261
262 # FIXME: there's a lot of logic common to the run, cd and builtin file
262 # FIXME: there's a lot of logic common to the run, cd and builtin file
263 # completers, that is currently reimplemented in each.
263 # completers, that is currently reimplemented in each.
264
264
265 def magic_run_completer(self, event):
265 def magic_run_completer(self, event):
266 """Complete files that end in .py or .ipy for the %run command.
266 """Complete files that end in .py or .ipy for the %run command.
267 """
267 """
268 comps = shlex_split(event.line)
268 comps = shlex_split(event.line)
269 relpath = (len(comps) > 1 and comps[-1] or '').strip("'\"")
269 relpath = (len(comps) > 1 and comps[-1] or '').strip("'\"")
270
270
271 #print("\nev=", event) # dbg
271 #print("\nev=", event) # dbg
272 #print("rp=", relpath) # dbg
272 #print("rp=", relpath) # dbg
273 #print('comps=', comps) # dbg
273 #print('comps=', comps) # dbg
274
274
275 lglob = glob.glob
275 lglob = glob.glob
276 isdir = os.path.isdir
276 isdir = os.path.isdir
277 relpath, tilde_expand, tilde_val = expand_user(relpath)
277 relpath, tilde_expand, tilde_val = expand_user(relpath)
278
278
279 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') if isdir(f)]
279 dirs = [f.replace('\\','/') + "/" for f in lglob(relpath+'*') if isdir(f)]
280
280
281 # Find if the user has already typed the first filename, after which we
281 # Find if the user has already typed the first filename, after which we
282 # should complete on all files, since after the first one other files may
282 # should complete on all files, since after the first one other files may
283 # be arguments to the input script.
283 # be arguments to the input script.
284
284
285 if filter(magic_run_re.match, comps):
285 if filter(magic_run_re.match, comps):
286 pys = [f.replace('\\','/') for f in lglob('*')]
286 pys = [f.replace('\\','/') for f in lglob('*')]
287 else:
287 else:
288 pys = [f.replace('\\','/')
288 pys = [f.replace('\\','/')
289 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
289 for f in lglob(relpath+'*.py') + lglob(relpath+'*.ipy') +
290 lglob(relpath + '*.pyw')]
290 lglob(relpath + '*.pyw')]
291 #print('run comp:', dirs+pys) # dbg
291 #print('run comp:', dirs+pys) # dbg
292 return [compress_user(p, tilde_expand, tilde_val) for p in dirs+pys]
292 return [compress_user(p, tilde_expand, tilde_val) for p in dirs+pys]
293
293
294
294
295 def cd_completer(self, event):
295 def cd_completer(self, event):
296 """Completer function for cd, which only returns directories."""
296 """Completer function for cd, which only returns directories."""
297 ip = get_ipython()
297 ip = get_ipython()
298 relpath = event.symbol
298 relpath = event.symbol
299
299
300 #print(event) # dbg
300 #print(event) # dbg
301 if event.line.endswith('-b') or ' -b ' in event.line:
301 if event.line.endswith('-b') or ' -b ' in event.line:
302 # return only bookmark completions
302 # return only bookmark completions
303 bkms = self.db.get('bookmarks', None)
303 bkms = self.db.get('bookmarks', None)
304 if bkms:
304 if bkms:
305 return bkms.keys()
305 return bkms.keys()
306 else:
306 else:
307 return []
307 return []
308
308
309 if event.symbol == '-':
309 if event.symbol == '-':
310 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
310 width_dh = str(len(str(len(ip.user_ns['_dh']) + 1)))
311 # jump in directory history by number
311 # jump in directory history by number
312 fmt = '-%0' + width_dh +'d [%s]'
312 fmt = '-%0' + width_dh +'d [%s]'
313 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
313 ents = [ fmt % (i,s) for i,s in enumerate(ip.user_ns['_dh'])]
314 if len(ents) > 1:
314 if len(ents) > 1:
315 return ents
315 return ents
316 return []
316 return []
317
317
318 if event.symbol.startswith('--'):
318 if event.symbol.startswith('--'):
319 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
319 return ["--" + os.path.basename(d) for d in ip.user_ns['_dh']]
320
320
321 # Expand ~ in path and normalize directory separators.
321 # Expand ~ in path and normalize directory separators.
322 relpath, tilde_expand, tilde_val = expand_user(relpath)
322 relpath, tilde_expand, tilde_val = expand_user(relpath)
323 relpath = relpath.replace('\\','/')
323 relpath = relpath.replace('\\','/')
324
324
325 found = []
325 found = []
326 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
326 for d in [f.replace('\\','/') + '/' for f in glob.glob(relpath+'*')
327 if os.path.isdir(f)]:
327 if os.path.isdir(f)]:
328 if ' ' in d:
328 if ' ' in d:
329 # we don't want to deal with any of that, complex code
329 # we don't want to deal with any of that, complex code
330 # for this is elsewhere
330 # for this is elsewhere
331 raise TryNext
331 raise TryNext
332
332
333 found.append(d)
333 found.append(d)
334
334
335 if not found:
335 if not found:
336 if os.path.isdir(relpath):
336 if os.path.isdir(relpath):
337 return [compress_user(relpath, tilde_expand, tilde_val)]
337 return [compress_user(relpath, tilde_expand, tilde_val)]
338
338
339 # if no completions so far, try bookmarks
339 # if no completions so far, try bookmarks
340 bks = self.db.get('bookmarks',{}).iterkeys()
340 bks = self.db.get('bookmarks',{}).iterkeys()
341 bkmatches = [s for s in bks if s.startswith(event.symbol)]
341 bkmatches = [s for s in bks if s.startswith(event.symbol)]
342 if bkmatches:
342 if bkmatches:
343 return bkmatches
343 return bkmatches
344
344
345 raise TryNext
345 raise TryNext
346
346
347 return [compress_user(p, tilde_expand, tilde_val) for p in found]
347 return [compress_user(p, tilde_expand, tilde_val) for p in found]
@@ -1,2581 +1,2577 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Main IPython class."""
2 """Main IPython class."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Copyright (C) 2008-2011 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 from __future__ import with_statement
17 from __future__ import with_statement
18 from __future__ import absolute_import
18 from __future__ import absolute_import
19
19
20 import __builtin__
20 import __builtin__ as builtin_mod
21 import __future__
21 import __future__
22 import abc
22 import abc
23 import ast
23 import ast
24 import atexit
24 import atexit
25 import codeop
25 import codeop
26 import inspect
26 import inspect
27 import os
27 import os
28 import re
28 import re
29 import sys
29 import sys
30 import tempfile
30 import tempfile
31 import types
31 import types
32 from contextlib import nested
32 from contextlib import nested
33
33
34 from IPython.config.configurable import SingletonConfigurable
34 from IPython.config.configurable import SingletonConfigurable
35 from IPython.core import debugger, oinspect
35 from IPython.core import debugger, oinspect
36 from IPython.core import history as ipcorehist
36 from IPython.core import history as ipcorehist
37 from IPython.core import page
37 from IPython.core import page
38 from IPython.core import prefilter
38 from IPython.core import prefilter
39 from IPython.core import shadowns
39 from IPython.core import shadowns
40 from IPython.core import ultratb
40 from IPython.core import ultratb
41 from IPython.core.alias import AliasManager, AliasError
41 from IPython.core.alias import AliasManager, AliasError
42 from IPython.core.autocall import ExitAutocall
42 from IPython.core.autocall import ExitAutocall
43 from IPython.core.builtin_trap import BuiltinTrap
43 from IPython.core.builtin_trap import BuiltinTrap
44 from IPython.core.compilerop import CachingCompiler
44 from IPython.core.compilerop import CachingCompiler
45 from IPython.core.display_trap import DisplayTrap
45 from IPython.core.display_trap import DisplayTrap
46 from IPython.core.displayhook import DisplayHook
46 from IPython.core.displayhook import DisplayHook
47 from IPython.core.displaypub import DisplayPublisher
47 from IPython.core.displaypub import DisplayPublisher
48 from IPython.core.error import TryNext, UsageError
48 from IPython.core.error import TryNext, UsageError
49 from IPython.core.extensions import ExtensionManager
49 from IPython.core.extensions import ExtensionManager
50 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
50 from IPython.core.fakemodule import FakeModule, init_fakemod_dict
51 from IPython.core.formatters import DisplayFormatter
51 from IPython.core.formatters import DisplayFormatter
52 from IPython.core.history import HistoryManager
52 from IPython.core.history import HistoryManager
53 from IPython.core.inputsplitter import IPythonInputSplitter
53 from IPython.core.inputsplitter import IPythonInputSplitter
54 from IPython.core.logger import Logger
54 from IPython.core.logger import Logger
55 from IPython.core.macro import Macro
55 from IPython.core.macro import Macro
56 from IPython.core.magic import Magic
56 from IPython.core.magic import Magic
57 from IPython.core.payload import PayloadManager
57 from IPython.core.payload import PayloadManager
58 from IPython.core.plugin import PluginManager
58 from IPython.core.plugin import PluginManager
59 from IPython.core.prefilter import PrefilterManager, ESC_MAGIC
59 from IPython.core.prefilter import PrefilterManager, ESC_MAGIC
60 from IPython.core.profiledir import ProfileDir
60 from IPython.core.profiledir import ProfileDir
61 from IPython.external.Itpl import ItplNS
61 from IPython.external.Itpl import ItplNS
62 from IPython.utils import PyColorize
62 from IPython.utils import PyColorize
63 from IPython.utils import io
63 from IPython.utils import io
64 from IPython.utils import py3compat
64 from IPython.utils.doctestreload import doctest_reload
65 from IPython.utils.doctestreload import doctest_reload
65 from IPython.utils.io import ask_yes_no, rprint
66 from IPython.utils.io import ask_yes_no, rprint
66 from IPython.utils.ipstruct import Struct
67 from IPython.utils.ipstruct import Struct
67 from IPython.utils.path import get_home_dir, get_ipython_dir, HomeDirError
68 from IPython.utils.path import get_home_dir, get_ipython_dir, HomeDirError
68 from IPython.utils.pickleshare import PickleShareDB
69 from IPython.utils.pickleshare import PickleShareDB
69 from IPython.utils.process import system, getoutput
70 from IPython.utils.process import system, getoutput
70 from IPython.utils.strdispatch import StrDispatch
71 from IPython.utils.strdispatch import StrDispatch
71 from IPython.utils.syspathcontext import prepended_to_syspath
72 from IPython.utils.syspathcontext import prepended_to_syspath
72 from IPython.utils.text import num_ini_spaces, format_screen, LSString, SList
73 from IPython.utils.text import num_ini_spaces, format_screen, LSString, SList
73 from IPython.utils.traitlets import (Int, CBool, CaselessStrEnum, Enum,
74 from IPython.utils.traitlets import (Int, CBool, CaselessStrEnum, Enum,
74 List, Unicode, Instance, Type)
75 List, Unicode, Instance, Type)
75 from IPython.utils.warn import warn, error, fatal
76 from IPython.utils.warn import warn, error, fatal
76 import IPython.core.hooks
77 import IPython.core.hooks
77
78
78 #-----------------------------------------------------------------------------
79 #-----------------------------------------------------------------------------
79 # Globals
80 # Globals
80 #-----------------------------------------------------------------------------
81 #-----------------------------------------------------------------------------
81
82
82 # compiled regexps for autoindent management
83 # compiled regexps for autoindent management
83 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
84 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
84
85
85 #-----------------------------------------------------------------------------
86 #-----------------------------------------------------------------------------
86 # Utilities
87 # Utilities
87 #-----------------------------------------------------------------------------
88 #-----------------------------------------------------------------------------
88
89
89 def softspace(file, newvalue):
90 def softspace(file, newvalue):
90 """Copied from code.py, to remove the dependency"""
91 """Copied from code.py, to remove the dependency"""
91
92
92 oldvalue = 0
93 oldvalue = 0
93 try:
94 try:
94 oldvalue = file.softspace
95 oldvalue = file.softspace
95 except AttributeError:
96 except AttributeError:
96 pass
97 pass
97 try:
98 try:
98 file.softspace = newvalue
99 file.softspace = newvalue
99 except (AttributeError, TypeError):
100 except (AttributeError, TypeError):
100 # "attribute-less object" or "read-only attributes"
101 # "attribute-less object" or "read-only attributes"
101 pass
102 pass
102 return oldvalue
103 return oldvalue
103
104
104
105
105 def no_op(*a, **kw): pass
106 def no_op(*a, **kw): pass
106
107
107 class SpaceInInput(Exception): pass
108 class SpaceInInput(Exception): pass
108
109
109 class Bunch: pass
110 class Bunch: pass
110
111
111
112
112 def get_default_colors():
113 def get_default_colors():
113 if sys.platform=='darwin':
114 if sys.platform=='darwin':
114 return "LightBG"
115 return "LightBG"
115 elif os.name=='nt':
116 elif os.name=='nt':
116 return 'Linux'
117 return 'Linux'
117 else:
118 else:
118 return 'Linux'
119 return 'Linux'
119
120
120
121
121 class SeparateUnicode(Unicode):
122 class SeparateUnicode(Unicode):
122 """A Unicode subclass to validate separate_in, separate_out, etc.
123 """A Unicode subclass to validate separate_in, separate_out, etc.
123
124
124 This is a Unicode based trait that converts '0'->'' and '\\n'->'\n'.
125 This is a Unicode based trait that converts '0'->'' and '\\n'->'\n'.
125 """
126 """
126
127
127 def validate(self, obj, value):
128 def validate(self, obj, value):
128 if value == '0': value = ''
129 if value == '0': value = ''
129 value = value.replace('\\n','\n')
130 value = value.replace('\\n','\n')
130 return super(SeparateUnicode, self).validate(obj, value)
131 return super(SeparateUnicode, self).validate(obj, value)
131
132
132
133
133 class ReadlineNoRecord(object):
134 class ReadlineNoRecord(object):
134 """Context manager to execute some code, then reload readline history
135 """Context manager to execute some code, then reload readline history
135 so that interactive input to the code doesn't appear when pressing up."""
136 so that interactive input to the code doesn't appear when pressing up."""
136 def __init__(self, shell):
137 def __init__(self, shell):
137 self.shell = shell
138 self.shell = shell
138 self._nested_level = 0
139 self._nested_level = 0
139
140
140 def __enter__(self):
141 def __enter__(self):
141 if self._nested_level == 0:
142 if self._nested_level == 0:
142 try:
143 try:
143 self.orig_length = self.current_length()
144 self.orig_length = self.current_length()
144 self.readline_tail = self.get_readline_tail()
145 self.readline_tail = self.get_readline_tail()
145 except (AttributeError, IndexError): # Can fail with pyreadline
146 except (AttributeError, IndexError): # Can fail with pyreadline
146 self.orig_length, self.readline_tail = 999999, []
147 self.orig_length, self.readline_tail = 999999, []
147 self._nested_level += 1
148 self._nested_level += 1
148
149
149 def __exit__(self, type, value, traceback):
150 def __exit__(self, type, value, traceback):
150 self._nested_level -= 1
151 self._nested_level -= 1
151 if self._nested_level == 0:
152 if self._nested_level == 0:
152 # Try clipping the end if it's got longer
153 # Try clipping the end if it's got longer
153 try:
154 try:
154 e = self.current_length() - self.orig_length
155 e = self.current_length() - self.orig_length
155 if e > 0:
156 if e > 0:
156 for _ in range(e):
157 for _ in range(e):
157 self.shell.readline.remove_history_item(self.orig_length)
158 self.shell.readline.remove_history_item(self.orig_length)
158
159
159 # If it still doesn't match, just reload readline history.
160 # If it still doesn't match, just reload readline history.
160 if self.current_length() != self.orig_length \
161 if self.current_length() != self.orig_length \
161 or self.get_readline_tail() != self.readline_tail:
162 or self.get_readline_tail() != self.readline_tail:
162 self.shell.refill_readline_hist()
163 self.shell.refill_readline_hist()
163 except (AttributeError, IndexError):
164 except (AttributeError, IndexError):
164 pass
165 pass
165 # Returning False will cause exceptions to propagate
166 # Returning False will cause exceptions to propagate
166 return False
167 return False
167
168
168 def current_length(self):
169 def current_length(self):
169 return self.shell.readline.get_current_history_length()
170 return self.shell.readline.get_current_history_length()
170
171
171 def get_readline_tail(self, n=10):
172 def get_readline_tail(self, n=10):
172 """Get the last n items in readline history."""
173 """Get the last n items in readline history."""
173 end = self.shell.readline.get_current_history_length() + 1
174 end = self.shell.readline.get_current_history_length() + 1
174 start = max(end-n, 1)
175 start = max(end-n, 1)
175 ghi = self.shell.readline.get_history_item
176 ghi = self.shell.readline.get_history_item
176 return [ghi(x) for x in range(start, end)]
177 return [ghi(x) for x in range(start, end)]
177
178
178
179
179 _autocall_help = """
180 _autocall_help = """
180 Make IPython automatically call any callable object even if
181 Make IPython automatically call any callable object even if
181 you didn't type explicit parentheses. For example, 'str 43' becomes 'str(43)'
182 you didn't type explicit parentheses. For example, 'str 43' becomes 'str(43)'
182 automatically. The value can be '0' to disable the feature, '1' for 'smart'
183 automatically. The value can be '0' to disable the feature, '1' for 'smart'
183 autocall, where it is not applied if there are no more arguments on the line,
184 autocall, where it is not applied if there are no more arguments on the line,
184 and '2' for 'full' autocall, where all callable objects are automatically
185 and '2' for 'full' autocall, where all callable objects are automatically
185 called (even if no arguments are present). The default is '1'.
186 called (even if no arguments are present). The default is '1'.
186 """
187 """
187
188
188 #-----------------------------------------------------------------------------
189 #-----------------------------------------------------------------------------
189 # Main IPython class
190 # Main IPython class
190 #-----------------------------------------------------------------------------
191 #-----------------------------------------------------------------------------
191
192
192 class InteractiveShell(SingletonConfigurable, Magic):
193 class InteractiveShell(SingletonConfigurable, Magic):
193 """An enhanced, interactive shell for Python."""
194 """An enhanced, interactive shell for Python."""
194
195
195 _instance = None
196 _instance = None
196
197
197 autocall = Enum((0,1,2), default_value=1, config=True, help=
198 autocall = Enum((0,1,2), default_value=1, config=True, help=
198 """
199 """
199 Make IPython automatically call any callable object even if you didn't
200 Make IPython automatically call any callable object even if you didn't
200 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
201 type explicit parentheses. For example, 'str 43' becomes 'str(43)'
201 automatically. The value can be '0' to disable the feature, '1' for
202 automatically. The value can be '0' to disable the feature, '1' for
202 'smart' autocall, where it is not applied if there are no more
203 'smart' autocall, where it is not applied if there are no more
203 arguments on the line, and '2' for 'full' autocall, where all callable
204 arguments on the line, and '2' for 'full' autocall, where all callable
204 objects are automatically called (even if no arguments are present).
205 objects are automatically called (even if no arguments are present).
205 The default is '1'.
206 The default is '1'.
206 """
207 """
207 )
208 )
208 # TODO: remove all autoindent logic and put into frontends.
209 # TODO: remove all autoindent logic and put into frontends.
209 # We can't do this yet because even runlines uses the autoindent.
210 # We can't do this yet because even runlines uses the autoindent.
210 autoindent = CBool(True, config=True, help=
211 autoindent = CBool(True, config=True, help=
211 """
212 """
212 Autoindent IPython code entered interactively.
213 Autoindent IPython code entered interactively.
213 """
214 """
214 )
215 )
215 automagic = CBool(True, config=True, help=
216 automagic = CBool(True, config=True, help=
216 """
217 """
217 Enable magic commands to be called without the leading %.
218 Enable magic commands to be called without the leading %.
218 """
219 """
219 )
220 )
220 cache_size = Int(1000, config=True, help=
221 cache_size = Int(1000, config=True, help=
221 """
222 """
222 Set the size of the output cache. The default is 1000, you can
223 Set the size of the output cache. The default is 1000, you can
223 change it permanently in your config file. Setting it to 0 completely
224 change it permanently in your config file. Setting it to 0 completely
224 disables the caching system, and the minimum value accepted is 20 (if
225 disables the caching system, and the minimum value accepted is 20 (if
225 you provide a value less than 20, it is reset to 0 and a warning is
226 you provide a value less than 20, it is reset to 0 and a warning is
226 issued). This limit is defined because otherwise you'll spend more
227 issued). This limit is defined because otherwise you'll spend more
227 time re-flushing a too small cache than working
228 time re-flushing a too small cache than working
228 """
229 """
229 )
230 )
230 color_info = CBool(True, config=True, help=
231 color_info = CBool(True, config=True, help=
231 """
232 """
232 Use colors for displaying information about objects. Because this
233 Use colors for displaying information about objects. Because this
233 information is passed through a pager (like 'less'), and some pagers
234 information is passed through a pager (like 'less'), and some pagers
234 get confused with color codes, this capability can be turned off.
235 get confused with color codes, this capability can be turned off.
235 """
236 """
236 )
237 )
237 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
238 colors = CaselessStrEnum(('NoColor','LightBG','Linux'),
238 default_value=get_default_colors(), config=True,
239 default_value=get_default_colors(), config=True,
239 help="Set the color scheme (NoColor, Linux, or LightBG)."
240 help="Set the color scheme (NoColor, Linux, or LightBG)."
240 )
241 )
241 debug = CBool(False, config=True)
242 debug = CBool(False, config=True)
242 deep_reload = CBool(False, config=True, help=
243 deep_reload = CBool(False, config=True, help=
243 """
244 """
244 Enable deep (recursive) reloading by default. IPython can use the
245 Enable deep (recursive) reloading by default. IPython can use the
245 deep_reload module which reloads changes in modules recursively (it
246 deep_reload module which reloads changes in modules recursively (it
246 replaces the reload() function, so you don't need to change anything to
247 replaces the reload() function, so you don't need to change anything to
247 use it). deep_reload() forces a full reload of modules whose code may
248 use it). deep_reload() forces a full reload of modules whose code may
248 have changed, which the default reload() function does not. When
249 have changed, which the default reload() function does not. When
249 deep_reload is off, IPython will use the normal reload(), but
250 deep_reload is off, IPython will use the normal reload(), but
250 deep_reload will still be available as dreload().
251 deep_reload will still be available as dreload().
251 """
252 """
252 )
253 )
253 display_formatter = Instance(DisplayFormatter)
254 display_formatter = Instance(DisplayFormatter)
254 displayhook_class = Type(DisplayHook)
255 displayhook_class = Type(DisplayHook)
255 display_pub_class = Type(DisplayPublisher)
256 display_pub_class = Type(DisplayPublisher)
256
257
257 exit_now = CBool(False)
258 exit_now = CBool(False)
258 exiter = Instance(ExitAutocall)
259 exiter = Instance(ExitAutocall)
259 def _exiter_default(self):
260 def _exiter_default(self):
260 return ExitAutocall(self)
261 return ExitAutocall(self)
261 # Monotonically increasing execution counter
262 # Monotonically increasing execution counter
262 execution_count = Int(1)
263 execution_count = Int(1)
263 filename = Unicode("<ipython console>")
264 filename = Unicode("<ipython console>")
264 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
265 ipython_dir= Unicode('', config=True) # Set to get_ipython_dir() in __init__
265
266
266 # Input splitter, to split entire cells of input into either individual
267 # Input splitter, to split entire cells of input into either individual
267 # interactive statements or whole blocks.
268 # interactive statements or whole blocks.
268 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
269 input_splitter = Instance('IPython.core.inputsplitter.IPythonInputSplitter',
269 (), {})
270 (), {})
270 logstart = CBool(False, config=True, help=
271 logstart = CBool(False, config=True, help=
271 """
272 """
272 Start logging to the default log file.
273 Start logging to the default log file.
273 """
274 """
274 )
275 )
275 logfile = Unicode('', config=True, help=
276 logfile = Unicode('', config=True, help=
276 """
277 """
277 The name of the logfile to use.
278 The name of the logfile to use.
278 """
279 """
279 )
280 )
280 logappend = Unicode('', config=True, help=
281 logappend = Unicode('', config=True, help=
281 """
282 """
282 Start logging to the given file in append mode.
283 Start logging to the given file in append mode.
283 """
284 """
284 )
285 )
285 object_info_string_level = Enum((0,1,2), default_value=0,
286 object_info_string_level = Enum((0,1,2), default_value=0,
286 config=True)
287 config=True)
287 pdb = CBool(False, config=True, help=
288 pdb = CBool(False, config=True, help=
288 """
289 """
289 Automatically call the pdb debugger after every exception.
290 Automatically call the pdb debugger after every exception.
290 """
291 """
291 )
292 )
292
293
293 prompt_in1 = Unicode('In [\\#]: ', config=True)
294 prompt_in1 = Unicode('In [\\#]: ', config=True)
294 prompt_in2 = Unicode(' .\\D.: ', config=True)
295 prompt_in2 = Unicode(' .\\D.: ', config=True)
295 prompt_out = Unicode('Out[\\#]: ', config=True)
296 prompt_out = Unicode('Out[\\#]: ', config=True)
296 prompts_pad_left = CBool(True, config=True)
297 prompts_pad_left = CBool(True, config=True)
297 quiet = CBool(False, config=True)
298 quiet = CBool(False, config=True)
298
299
299 history_length = Int(10000, config=True)
300 history_length = Int(10000, config=True)
300
301
301 # The readline stuff will eventually be moved to the terminal subclass
302 # The readline stuff will eventually be moved to the terminal subclass
302 # but for now, we can't do that as readline is welded in everywhere.
303 # but for now, we can't do that as readline is welded in everywhere.
303 readline_use = CBool(True, config=True)
304 readline_use = CBool(True, config=True)
304 readline_merge_completions = CBool(True, config=True)
305 readline_merge_completions = CBool(True, config=True)
305 readline_omit__names = Enum((0,1,2), default_value=2, config=True)
306 readline_omit__names = Enum((0,1,2), default_value=2, config=True)
306 readline_remove_delims = Unicode('-/~', config=True)
307 readline_remove_delims = Unicode('-/~', config=True)
307 # don't use \M- bindings by default, because they
308 # don't use \M- bindings by default, because they
308 # conflict with 8-bit encodings. See gh-58,gh-88
309 # conflict with 8-bit encodings. See gh-58,gh-88
309 readline_parse_and_bind = List([
310 readline_parse_and_bind = List([
310 'tab: complete',
311 'tab: complete',
311 '"\C-l": clear-screen',
312 '"\C-l": clear-screen',
312 'set show-all-if-ambiguous on',
313 'set show-all-if-ambiguous on',
313 '"\C-o": tab-insert',
314 '"\C-o": tab-insert',
314 '"\C-r": reverse-search-history',
315 '"\C-r": reverse-search-history',
315 '"\C-s": forward-search-history',
316 '"\C-s": forward-search-history',
316 '"\C-p": history-search-backward',
317 '"\C-p": history-search-backward',
317 '"\C-n": history-search-forward',
318 '"\C-n": history-search-forward',
318 '"\e[A": history-search-backward',
319 '"\e[A": history-search-backward',
319 '"\e[B": history-search-forward',
320 '"\e[B": history-search-forward',
320 '"\C-k": kill-line',
321 '"\C-k": kill-line',
321 '"\C-u": unix-line-discard',
322 '"\C-u": unix-line-discard',
322 ], allow_none=False, config=True)
323 ], allow_none=False, config=True)
323
324
324 # TODO: this part of prompt management should be moved to the frontends.
325 # TODO: this part of prompt management should be moved to the frontends.
325 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
326 # Use custom TraitTypes that convert '0'->'' and '\\n'->'\n'
326 separate_in = SeparateUnicode('\n', config=True)
327 separate_in = SeparateUnicode('\n', config=True)
327 separate_out = SeparateUnicode('', config=True)
328 separate_out = SeparateUnicode('', config=True)
328 separate_out2 = SeparateUnicode('', config=True)
329 separate_out2 = SeparateUnicode('', config=True)
329 wildcards_case_sensitive = CBool(True, config=True)
330 wildcards_case_sensitive = CBool(True, config=True)
330 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
331 xmode = CaselessStrEnum(('Context','Plain', 'Verbose'),
331 default_value='Context', config=True)
332 default_value='Context', config=True)
332
333
333 # Subcomponents of InteractiveShell
334 # Subcomponents of InteractiveShell
334 alias_manager = Instance('IPython.core.alias.AliasManager')
335 alias_manager = Instance('IPython.core.alias.AliasManager')
335 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
336 prefilter_manager = Instance('IPython.core.prefilter.PrefilterManager')
336 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
337 builtin_trap = Instance('IPython.core.builtin_trap.BuiltinTrap')
337 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
338 display_trap = Instance('IPython.core.display_trap.DisplayTrap')
338 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
339 extension_manager = Instance('IPython.core.extensions.ExtensionManager')
339 plugin_manager = Instance('IPython.core.plugin.PluginManager')
340 plugin_manager = Instance('IPython.core.plugin.PluginManager')
340 payload_manager = Instance('IPython.core.payload.PayloadManager')
341 payload_manager = Instance('IPython.core.payload.PayloadManager')
341 history_manager = Instance('IPython.core.history.HistoryManager')
342 history_manager = Instance('IPython.core.history.HistoryManager')
342
343
343 profile_dir = Instance('IPython.core.application.ProfileDir')
344 profile_dir = Instance('IPython.core.application.ProfileDir')
344 @property
345 @property
345 def profile(self):
346 def profile(self):
346 if self.profile_dir is not None:
347 if self.profile_dir is not None:
347 name = os.path.basename(self.profile_dir.location)
348 name = os.path.basename(self.profile_dir.location)
348 return name.replace('profile_','')
349 return name.replace('profile_','')
349
350
350
351
351 # Private interface
352 # Private interface
352 _post_execute = Instance(dict)
353 _post_execute = Instance(dict)
353
354
354 def __init__(self, config=None, ipython_dir=None, profile_dir=None,
355 def __init__(self, config=None, ipython_dir=None, profile_dir=None,
355 user_ns=None, user_global_ns=None,
356 user_ns=None, user_global_ns=None,
356 custom_exceptions=((), None)):
357 custom_exceptions=((), None)):
357
358
358 # This is where traits with a config_key argument are updated
359 # This is where traits with a config_key argument are updated
359 # from the values on config.
360 # from the values on config.
360 super(InteractiveShell, self).__init__(config=config)
361 super(InteractiveShell, self).__init__(config=config)
361
362
362 # These are relatively independent and stateless
363 # These are relatively independent and stateless
363 self.init_ipython_dir(ipython_dir)
364 self.init_ipython_dir(ipython_dir)
364 self.init_profile_dir(profile_dir)
365 self.init_profile_dir(profile_dir)
365 self.init_instance_attrs()
366 self.init_instance_attrs()
366 self.init_environment()
367 self.init_environment()
367
368
368 # Create namespaces (user_ns, user_global_ns, etc.)
369 # Create namespaces (user_ns, user_global_ns, etc.)
369 self.init_create_namespaces(user_ns, user_global_ns)
370 self.init_create_namespaces(user_ns, user_global_ns)
370 # This has to be done after init_create_namespaces because it uses
371 # This has to be done after init_create_namespaces because it uses
371 # something in self.user_ns, but before init_sys_modules, which
372 # something in self.user_ns, but before init_sys_modules, which
372 # is the first thing to modify sys.
373 # is the first thing to modify sys.
373 # TODO: When we override sys.stdout and sys.stderr before this class
374 # TODO: When we override sys.stdout and sys.stderr before this class
374 # is created, we are saving the overridden ones here. Not sure if this
375 # is created, we are saving the overridden ones here. Not sure if this
375 # is what we want to do.
376 # is what we want to do.
376 self.save_sys_module_state()
377 self.save_sys_module_state()
377 self.init_sys_modules()
378 self.init_sys_modules()
378
379
379 # While we're trying to have each part of the code directly access what
380 # While we're trying to have each part of the code directly access what
380 # it needs without keeping redundant references to objects, we have too
381 # it needs without keeping redundant references to objects, we have too
381 # much legacy code that expects ip.db to exist.
382 # much legacy code that expects ip.db to exist.
382 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
383 self.db = PickleShareDB(os.path.join(self.profile_dir.location, 'db'))
383
384
384 self.init_history()
385 self.init_history()
385 self.init_encoding()
386 self.init_encoding()
386 self.init_prefilter()
387 self.init_prefilter()
387
388
388 Magic.__init__(self, self)
389 Magic.__init__(self, self)
389
390
390 self.init_syntax_highlighting()
391 self.init_syntax_highlighting()
391 self.init_hooks()
392 self.init_hooks()
392 self.init_pushd_popd_magic()
393 self.init_pushd_popd_magic()
393 # self.init_traceback_handlers use to be here, but we moved it below
394 # self.init_traceback_handlers use to be here, but we moved it below
394 # because it and init_io have to come after init_readline.
395 # because it and init_io have to come after init_readline.
395 self.init_user_ns()
396 self.init_user_ns()
396 self.init_logger()
397 self.init_logger()
397 self.init_alias()
398 self.init_alias()
398 self.init_builtins()
399 self.init_builtins()
399
400
400 # pre_config_initialization
401 # pre_config_initialization
401
402
402 # The next section should contain everything that was in ipmaker.
403 # The next section should contain everything that was in ipmaker.
403 self.init_logstart()
404 self.init_logstart()
404
405
405 # The following was in post_config_initialization
406 # The following was in post_config_initialization
406 self.init_inspector()
407 self.init_inspector()
407 # init_readline() must come before init_io(), because init_io uses
408 # init_readline() must come before init_io(), because init_io uses
408 # readline related things.
409 # readline related things.
409 self.init_readline()
410 self.init_readline()
410 # We save this here in case user code replaces raw_input, but it needs
411 # We save this here in case user code replaces raw_input, but it needs
411 # to be after init_readline(), because PyPy's readline works by replacing
412 # to be after init_readline(), because PyPy's readline works by replacing
412 # raw_input.
413 # raw_input.
413 self.raw_input_original = raw_input
414 self.raw_input_original = raw_input
414 # init_completer must come after init_readline, because it needs to
415 # init_completer must come after init_readline, because it needs to
415 # know whether readline is present or not system-wide to configure the
416 # know whether readline is present or not system-wide to configure the
416 # completers, since the completion machinery can now operate
417 # completers, since the completion machinery can now operate
417 # independently of readline (e.g. over the network)
418 # independently of readline (e.g. over the network)
418 self.init_completer()
419 self.init_completer()
419 # TODO: init_io() needs to happen before init_traceback handlers
420 # TODO: init_io() needs to happen before init_traceback handlers
420 # because the traceback handlers hardcode the stdout/stderr streams.
421 # because the traceback handlers hardcode the stdout/stderr streams.
421 # This logic in in debugger.Pdb and should eventually be changed.
422 # This logic in in debugger.Pdb and should eventually be changed.
422 self.init_io()
423 self.init_io()
423 self.init_traceback_handlers(custom_exceptions)
424 self.init_traceback_handlers(custom_exceptions)
424 self.init_prompts()
425 self.init_prompts()
425 self.init_display_formatter()
426 self.init_display_formatter()
426 self.init_display_pub()
427 self.init_display_pub()
427 self.init_displayhook()
428 self.init_displayhook()
428 self.init_reload_doctest()
429 self.init_reload_doctest()
429 self.init_magics()
430 self.init_magics()
430 self.init_pdb()
431 self.init_pdb()
431 self.init_extension_manager()
432 self.init_extension_manager()
432 self.init_plugin_manager()
433 self.init_plugin_manager()
433 self.init_payload()
434 self.init_payload()
434 self.hooks.late_startup_hook()
435 self.hooks.late_startup_hook()
435 atexit.register(self.atexit_operations)
436 atexit.register(self.atexit_operations)
436
437
437 def get_ipython(self):
438 def get_ipython(self):
438 """Return the currently running IPython instance."""
439 """Return the currently running IPython instance."""
439 return self
440 return self
440
441
441 #-------------------------------------------------------------------------
442 #-------------------------------------------------------------------------
442 # Trait changed handlers
443 # Trait changed handlers
443 #-------------------------------------------------------------------------
444 #-------------------------------------------------------------------------
444
445
445 def _ipython_dir_changed(self, name, new):
446 def _ipython_dir_changed(self, name, new):
446 if not os.path.isdir(new):
447 if not os.path.isdir(new):
447 os.makedirs(new, mode = 0777)
448 os.makedirs(new, mode = 0777)
448
449
449 def set_autoindent(self,value=None):
450 def set_autoindent(self,value=None):
450 """Set the autoindent flag, checking for readline support.
451 """Set the autoindent flag, checking for readline support.
451
452
452 If called with no arguments, it acts as a toggle."""
453 If called with no arguments, it acts as a toggle."""
453
454
454 if not self.has_readline:
455 if not self.has_readline:
455 if os.name == 'posix':
456 if os.name == 'posix':
456 warn("The auto-indent feature requires the readline library")
457 warn("The auto-indent feature requires the readline library")
457 self.autoindent = 0
458 self.autoindent = 0
458 return
459 return
459 if value is None:
460 if value is None:
460 self.autoindent = not self.autoindent
461 self.autoindent = not self.autoindent
461 else:
462 else:
462 self.autoindent = value
463 self.autoindent = value
463
464
464 #-------------------------------------------------------------------------
465 #-------------------------------------------------------------------------
465 # init_* methods called by __init__
466 # init_* methods called by __init__
466 #-------------------------------------------------------------------------
467 #-------------------------------------------------------------------------
467
468
468 def init_ipython_dir(self, ipython_dir):
469 def init_ipython_dir(self, ipython_dir):
469 if ipython_dir is not None:
470 if ipython_dir is not None:
470 self.ipython_dir = ipython_dir
471 self.ipython_dir = ipython_dir
471 return
472 return
472
473
473 self.ipython_dir = get_ipython_dir()
474 self.ipython_dir = get_ipython_dir()
474
475
475 def init_profile_dir(self, profile_dir):
476 def init_profile_dir(self, profile_dir):
476 if profile_dir is not None:
477 if profile_dir is not None:
477 self.profile_dir = profile_dir
478 self.profile_dir = profile_dir
478 return
479 return
479 self.profile_dir =\
480 self.profile_dir =\
480 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
481 ProfileDir.create_profile_dir_by_name(self.ipython_dir, 'default')
481
482
482 def init_instance_attrs(self):
483 def init_instance_attrs(self):
483 self.more = False
484 self.more = False
484
485
485 # command compiler
486 # command compiler
486 self.compile = CachingCompiler()
487 self.compile = CachingCompiler()
487
488
488 # Make an empty namespace, which extension writers can rely on both
489 # Make an empty namespace, which extension writers can rely on both
489 # existing and NEVER being used by ipython itself. This gives them a
490 # existing and NEVER being used by ipython itself. This gives them a
490 # convenient location for storing additional information and state
491 # convenient location for storing additional information and state
491 # their extensions may require, without fear of collisions with other
492 # their extensions may require, without fear of collisions with other
492 # ipython names that may develop later.
493 # ipython names that may develop later.
493 self.meta = Struct()
494 self.meta = Struct()
494
495
495 # Temporary files used for various purposes. Deleted at exit.
496 # Temporary files used for various purposes. Deleted at exit.
496 self.tempfiles = []
497 self.tempfiles = []
497
498
498 # Keep track of readline usage (later set by init_readline)
499 # Keep track of readline usage (later set by init_readline)
499 self.has_readline = False
500 self.has_readline = False
500
501
501 # keep track of where we started running (mainly for crash post-mortem)
502 # keep track of where we started running (mainly for crash post-mortem)
502 # This is not being used anywhere currently.
503 # This is not being used anywhere currently.
503 self.starting_dir = os.getcwdu()
504 self.starting_dir = os.getcwdu()
504
505
505 # Indentation management
506 # Indentation management
506 self.indent_current_nsp = 0
507 self.indent_current_nsp = 0
507
508
508 # Dict to track post-execution functions that have been registered
509 # Dict to track post-execution functions that have been registered
509 self._post_execute = {}
510 self._post_execute = {}
510
511
511 def init_environment(self):
512 def init_environment(self):
512 """Any changes we need to make to the user's environment."""
513 """Any changes we need to make to the user's environment."""
513 pass
514 pass
514
515
515 def init_encoding(self):
516 def init_encoding(self):
516 # Get system encoding at startup time. Certain terminals (like Emacs
517 # Get system encoding at startup time. Certain terminals (like Emacs
517 # under Win32 have it set to None, and we need to have a known valid
518 # under Win32 have it set to None, and we need to have a known valid
518 # encoding to use in the raw_input() method
519 # encoding to use in the raw_input() method
519 try:
520 try:
520 self.stdin_encoding = sys.stdin.encoding or 'ascii'
521 self.stdin_encoding = sys.stdin.encoding or 'ascii'
521 except AttributeError:
522 except AttributeError:
522 self.stdin_encoding = 'ascii'
523 self.stdin_encoding = 'ascii'
523
524
524 def init_syntax_highlighting(self):
525 def init_syntax_highlighting(self):
525 # Python source parser/formatter for syntax highlighting
526 # Python source parser/formatter for syntax highlighting
526 pyformat = PyColorize.Parser().format
527 pyformat = PyColorize.Parser().format
527 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
528 self.pycolorize = lambda src: pyformat(src,'str',self.colors)
528
529
529 def init_pushd_popd_magic(self):
530 def init_pushd_popd_magic(self):
530 # for pushd/popd management
531 # for pushd/popd management
531 try:
532 try:
532 self.home_dir = get_home_dir()
533 self.home_dir = get_home_dir()
533 except HomeDirError, msg:
534 except HomeDirError, msg:
534 fatal(msg)
535 fatal(msg)
535
536
536 self.dir_stack = []
537 self.dir_stack = []
537
538
538 def init_logger(self):
539 def init_logger(self):
539 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
540 self.logger = Logger(self.home_dir, logfname='ipython_log.py',
540 logmode='rotate')
541 logmode='rotate')
541
542
542 def init_logstart(self):
543 def init_logstart(self):
543 """Initialize logging in case it was requested at the command line.
544 """Initialize logging in case it was requested at the command line.
544 """
545 """
545 if self.logappend:
546 if self.logappend:
546 self.magic_logstart(self.logappend + ' append')
547 self.magic_logstart(self.logappend + ' append')
547 elif self.logfile:
548 elif self.logfile:
548 self.magic_logstart(self.logfile)
549 self.magic_logstart(self.logfile)
549 elif self.logstart:
550 elif self.logstart:
550 self.magic_logstart()
551 self.magic_logstart()
551
552
552 def init_builtins(self):
553 def init_builtins(self):
553 self.builtin_trap = BuiltinTrap(shell=self)
554 self.builtin_trap = BuiltinTrap(shell=self)
554
555
555 def init_inspector(self):
556 def init_inspector(self):
556 # Object inspector
557 # Object inspector
557 self.inspector = oinspect.Inspector(oinspect.InspectColors,
558 self.inspector = oinspect.Inspector(oinspect.InspectColors,
558 PyColorize.ANSICodeColors,
559 PyColorize.ANSICodeColors,
559 'NoColor',
560 'NoColor',
560 self.object_info_string_level)
561 self.object_info_string_level)
561
562
562 def init_io(self):
563 def init_io(self):
563 # This will just use sys.stdout and sys.stderr. If you want to
564 # This will just use sys.stdout and sys.stderr. If you want to
564 # override sys.stdout and sys.stderr themselves, you need to do that
565 # override sys.stdout and sys.stderr themselves, you need to do that
565 # *before* instantiating this class, because io holds onto
566 # *before* instantiating this class, because io holds onto
566 # references to the underlying streams.
567 # references to the underlying streams.
567 if sys.platform == 'win32' and self.has_readline:
568 if sys.platform == 'win32' and self.has_readline:
568 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
569 io.stdout = io.stderr = io.IOStream(self.readline._outputfile)
569 else:
570 else:
570 io.stdout = io.IOStream(sys.stdout)
571 io.stdout = io.IOStream(sys.stdout)
571 io.stderr = io.IOStream(sys.stderr)
572 io.stderr = io.IOStream(sys.stderr)
572
573
573 def init_prompts(self):
574 def init_prompts(self):
574 # TODO: This is a pass for now because the prompts are managed inside
575 # TODO: This is a pass for now because the prompts are managed inside
575 # the DisplayHook. Once there is a separate prompt manager, this
576 # the DisplayHook. Once there is a separate prompt manager, this
576 # will initialize that object and all prompt related information.
577 # will initialize that object and all prompt related information.
577 pass
578 pass
578
579
579 def init_display_formatter(self):
580 def init_display_formatter(self):
580 self.display_formatter = DisplayFormatter(config=self.config)
581 self.display_formatter = DisplayFormatter(config=self.config)
581
582
582 def init_display_pub(self):
583 def init_display_pub(self):
583 self.display_pub = self.display_pub_class(config=self.config)
584 self.display_pub = self.display_pub_class(config=self.config)
584
585
585 def init_displayhook(self):
586 def init_displayhook(self):
586 # Initialize displayhook, set in/out prompts and printing system
587 # Initialize displayhook, set in/out prompts and printing system
587 self.displayhook = self.displayhook_class(
588 self.displayhook = self.displayhook_class(
588 config=self.config,
589 config=self.config,
589 shell=self,
590 shell=self,
590 cache_size=self.cache_size,
591 cache_size=self.cache_size,
591 input_sep = self.separate_in,
592 input_sep = self.separate_in,
592 output_sep = self.separate_out,
593 output_sep = self.separate_out,
593 output_sep2 = self.separate_out2,
594 output_sep2 = self.separate_out2,
594 ps1 = self.prompt_in1,
595 ps1 = self.prompt_in1,
595 ps2 = self.prompt_in2,
596 ps2 = self.prompt_in2,
596 ps_out = self.prompt_out,
597 ps_out = self.prompt_out,
597 pad_left = self.prompts_pad_left
598 pad_left = self.prompts_pad_left
598 )
599 )
599 # This is a context manager that installs/revmoes the displayhook at
600 # This is a context manager that installs/revmoes the displayhook at
600 # the appropriate time.
601 # the appropriate time.
601 self.display_trap = DisplayTrap(hook=self.displayhook)
602 self.display_trap = DisplayTrap(hook=self.displayhook)
602
603
603 def init_reload_doctest(self):
604 def init_reload_doctest(self):
604 # Do a proper resetting of doctest, including the necessary displayhook
605 # Do a proper resetting of doctest, including the necessary displayhook
605 # monkeypatching
606 # monkeypatching
606 try:
607 try:
607 doctest_reload()
608 doctest_reload()
608 except ImportError:
609 except ImportError:
609 warn("doctest module does not exist.")
610 warn("doctest module does not exist.")
610
611
611 #-------------------------------------------------------------------------
612 #-------------------------------------------------------------------------
612 # Things related to injections into the sys module
613 # Things related to injections into the sys module
613 #-------------------------------------------------------------------------
614 #-------------------------------------------------------------------------
614
615
615 def save_sys_module_state(self):
616 def save_sys_module_state(self):
616 """Save the state of hooks in the sys module.
617 """Save the state of hooks in the sys module.
617
618
618 This has to be called after self.user_ns is created.
619 This has to be called after self.user_ns is created.
619 """
620 """
620 self._orig_sys_module_state = {}
621 self._orig_sys_module_state = {}
621 self._orig_sys_module_state['stdin'] = sys.stdin
622 self._orig_sys_module_state['stdin'] = sys.stdin
622 self._orig_sys_module_state['stdout'] = sys.stdout
623 self._orig_sys_module_state['stdout'] = sys.stdout
623 self._orig_sys_module_state['stderr'] = sys.stderr
624 self._orig_sys_module_state['stderr'] = sys.stderr
624 self._orig_sys_module_state['excepthook'] = sys.excepthook
625 self._orig_sys_module_state['excepthook'] = sys.excepthook
625 try:
626 try:
626 self._orig_sys_modules_main_name = self.user_ns['__name__']
627 self._orig_sys_modules_main_name = self.user_ns['__name__']
627 except KeyError:
628 except KeyError:
628 pass
629 pass
629
630
630 def restore_sys_module_state(self):
631 def restore_sys_module_state(self):
631 """Restore the state of the sys module."""
632 """Restore the state of the sys module."""
632 try:
633 try:
633 for k, v in self._orig_sys_module_state.iteritems():
634 for k, v in self._orig_sys_module_state.iteritems():
634 setattr(sys, k, v)
635 setattr(sys, k, v)
635 except AttributeError:
636 except AttributeError:
636 pass
637 pass
637 # Reset what what done in self.init_sys_modules
638 # Reset what what done in self.init_sys_modules
638 try:
639 try:
639 sys.modules[self.user_ns['__name__']] = self._orig_sys_modules_main_name
640 sys.modules[self.user_ns['__name__']] = self._orig_sys_modules_main_name
640 except (AttributeError, KeyError):
641 except (AttributeError, KeyError):
641 pass
642 pass
642
643
643 #-------------------------------------------------------------------------
644 #-------------------------------------------------------------------------
644 # Things related to hooks
645 # Things related to hooks
645 #-------------------------------------------------------------------------
646 #-------------------------------------------------------------------------
646
647
647 def init_hooks(self):
648 def init_hooks(self):
648 # hooks holds pointers used for user-side customizations
649 # hooks holds pointers used for user-side customizations
649 self.hooks = Struct()
650 self.hooks = Struct()
650
651
651 self.strdispatchers = {}
652 self.strdispatchers = {}
652
653
653 # Set all default hooks, defined in the IPython.hooks module.
654 # Set all default hooks, defined in the IPython.hooks module.
654 hooks = IPython.core.hooks
655 hooks = IPython.core.hooks
655 for hook_name in hooks.__all__:
656 for hook_name in hooks.__all__:
656 # default hooks have priority 100, i.e. low; user hooks should have
657 # default hooks have priority 100, i.e. low; user hooks should have
657 # 0-100 priority
658 # 0-100 priority
658 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
659 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
659
660
660 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
661 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
661 """set_hook(name,hook) -> sets an internal IPython hook.
662 """set_hook(name,hook) -> sets an internal IPython hook.
662
663
663 IPython exposes some of its internal API as user-modifiable hooks. By
664 IPython exposes some of its internal API as user-modifiable hooks. By
664 adding your function to one of these hooks, you can modify IPython's
665 adding your function to one of these hooks, you can modify IPython's
665 behavior to call at runtime your own routines."""
666 behavior to call at runtime your own routines."""
666
667
667 # At some point in the future, this should validate the hook before it
668 # At some point in the future, this should validate the hook before it
668 # accepts it. Probably at least check that the hook takes the number
669 # accepts it. Probably at least check that the hook takes the number
669 # of args it's supposed to.
670 # of args it's supposed to.
670
671
671 f = types.MethodType(hook,self)
672 f = types.MethodType(hook,self)
672
673
673 # check if the hook is for strdispatcher first
674 # check if the hook is for strdispatcher first
674 if str_key is not None:
675 if str_key is not None:
675 sdp = self.strdispatchers.get(name, StrDispatch())
676 sdp = self.strdispatchers.get(name, StrDispatch())
676 sdp.add_s(str_key, f, priority )
677 sdp.add_s(str_key, f, priority )
677 self.strdispatchers[name] = sdp
678 self.strdispatchers[name] = sdp
678 return
679 return
679 if re_key is not None:
680 if re_key is not None:
680 sdp = self.strdispatchers.get(name, StrDispatch())
681 sdp = self.strdispatchers.get(name, StrDispatch())
681 sdp.add_re(re.compile(re_key), f, priority )
682 sdp.add_re(re.compile(re_key), f, priority )
682 self.strdispatchers[name] = sdp
683 self.strdispatchers[name] = sdp
683 return
684 return
684
685
685 dp = getattr(self.hooks, name, None)
686 dp = getattr(self.hooks, name, None)
686 if name not in IPython.core.hooks.__all__:
687 if name not in IPython.core.hooks.__all__:
687 print "Warning! Hook '%s' is not one of %s" % \
688 print "Warning! Hook '%s' is not one of %s" % \
688 (name, IPython.core.hooks.__all__ )
689 (name, IPython.core.hooks.__all__ )
689 if not dp:
690 if not dp:
690 dp = IPython.core.hooks.CommandChainDispatcher()
691 dp = IPython.core.hooks.CommandChainDispatcher()
691
692
692 try:
693 try:
693 dp.add(f,priority)
694 dp.add(f,priority)
694 except AttributeError:
695 except AttributeError:
695 # it was not commandchain, plain old func - replace
696 # it was not commandchain, plain old func - replace
696 dp = f
697 dp = f
697
698
698 setattr(self.hooks,name, dp)
699 setattr(self.hooks,name, dp)
699
700
700 def register_post_execute(self, func):
701 def register_post_execute(self, func):
701 """Register a function for calling after code execution.
702 """Register a function for calling after code execution.
702 """
703 """
703 if not callable(func):
704 if not callable(func):
704 raise ValueError('argument %s must be callable' % func)
705 raise ValueError('argument %s must be callable' % func)
705 self._post_execute[func] = True
706 self._post_execute[func] = True
706
707
707 #-------------------------------------------------------------------------
708 #-------------------------------------------------------------------------
708 # Things related to the "main" module
709 # Things related to the "main" module
709 #-------------------------------------------------------------------------
710 #-------------------------------------------------------------------------
710
711
711 def new_main_mod(self,ns=None):
712 def new_main_mod(self,ns=None):
712 """Return a new 'main' module object for user code execution.
713 """Return a new 'main' module object for user code execution.
713 """
714 """
714 main_mod = self._user_main_module
715 main_mod = self._user_main_module
715 init_fakemod_dict(main_mod,ns)
716 init_fakemod_dict(main_mod,ns)
716 return main_mod
717 return main_mod
717
718
718 def cache_main_mod(self,ns,fname):
719 def cache_main_mod(self,ns,fname):
719 """Cache a main module's namespace.
720 """Cache a main module's namespace.
720
721
721 When scripts are executed via %run, we must keep a reference to the
722 When scripts are executed via %run, we must keep a reference to the
722 namespace of their __main__ module (a FakeModule instance) around so
723 namespace of their __main__ module (a FakeModule instance) around so
723 that Python doesn't clear it, rendering objects defined therein
724 that Python doesn't clear it, rendering objects defined therein
724 useless.
725 useless.
725
726
726 This method keeps said reference in a private dict, keyed by the
727 This method keeps said reference in a private dict, keyed by the
727 absolute path of the module object (which corresponds to the script
728 absolute path of the module object (which corresponds to the script
728 path). This way, for multiple executions of the same script we only
729 path). This way, for multiple executions of the same script we only
729 keep one copy of the namespace (the last one), thus preventing memory
730 keep one copy of the namespace (the last one), thus preventing memory
730 leaks from old references while allowing the objects from the last
731 leaks from old references while allowing the objects from the last
731 execution to be accessible.
732 execution to be accessible.
732
733
733 Note: we can not allow the actual FakeModule instances to be deleted,
734 Note: we can not allow the actual FakeModule instances to be deleted,
734 because of how Python tears down modules (it hard-sets all their
735 because of how Python tears down modules (it hard-sets all their
735 references to None without regard for reference counts). This method
736 references to None without regard for reference counts). This method
736 must therefore make a *copy* of the given namespace, to allow the
737 must therefore make a *copy* of the given namespace, to allow the
737 original module's __dict__ to be cleared and reused.
738 original module's __dict__ to be cleared and reused.
738
739
739
740
740 Parameters
741 Parameters
741 ----------
742 ----------
742 ns : a namespace (a dict, typically)
743 ns : a namespace (a dict, typically)
743
744
744 fname : str
745 fname : str
745 Filename associated with the namespace.
746 Filename associated with the namespace.
746
747
747 Examples
748 Examples
748 --------
749 --------
749
750
750 In [10]: import IPython
751 In [10]: import IPython
751
752
752 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
753 In [11]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
753
754
754 In [12]: IPython.__file__ in _ip._main_ns_cache
755 In [12]: IPython.__file__ in _ip._main_ns_cache
755 Out[12]: True
756 Out[12]: True
756 """
757 """
757 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
758 self._main_ns_cache[os.path.abspath(fname)] = ns.copy()
758
759
759 def clear_main_mod_cache(self):
760 def clear_main_mod_cache(self):
760 """Clear the cache of main modules.
761 """Clear the cache of main modules.
761
762
762 Mainly for use by utilities like %reset.
763 Mainly for use by utilities like %reset.
763
764
764 Examples
765 Examples
765 --------
766 --------
766
767
767 In [15]: import IPython
768 In [15]: import IPython
768
769
769 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
770 In [16]: _ip.cache_main_mod(IPython.__dict__,IPython.__file__)
770
771
771 In [17]: len(_ip._main_ns_cache) > 0
772 In [17]: len(_ip._main_ns_cache) > 0
772 Out[17]: True
773 Out[17]: True
773
774
774 In [18]: _ip.clear_main_mod_cache()
775 In [18]: _ip.clear_main_mod_cache()
775
776
776 In [19]: len(_ip._main_ns_cache) == 0
777 In [19]: len(_ip._main_ns_cache) == 0
777 Out[19]: True
778 Out[19]: True
778 """
779 """
779 self._main_ns_cache.clear()
780 self._main_ns_cache.clear()
780
781
781 #-------------------------------------------------------------------------
782 #-------------------------------------------------------------------------
782 # Things related to debugging
783 # Things related to debugging
783 #-------------------------------------------------------------------------
784 #-------------------------------------------------------------------------
784
785
785 def init_pdb(self):
786 def init_pdb(self):
786 # Set calling of pdb on exceptions
787 # Set calling of pdb on exceptions
787 # self.call_pdb is a property
788 # self.call_pdb is a property
788 self.call_pdb = self.pdb
789 self.call_pdb = self.pdb
789
790
790 def _get_call_pdb(self):
791 def _get_call_pdb(self):
791 return self._call_pdb
792 return self._call_pdb
792
793
793 def _set_call_pdb(self,val):
794 def _set_call_pdb(self,val):
794
795
795 if val not in (0,1,False,True):
796 if val not in (0,1,False,True):
796 raise ValueError,'new call_pdb value must be boolean'
797 raise ValueError,'new call_pdb value must be boolean'
797
798
798 # store value in instance
799 # store value in instance
799 self._call_pdb = val
800 self._call_pdb = val
800
801
801 # notify the actual exception handlers
802 # notify the actual exception handlers
802 self.InteractiveTB.call_pdb = val
803 self.InteractiveTB.call_pdb = val
803
804
804 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
805 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
805 'Control auto-activation of pdb at exceptions')
806 'Control auto-activation of pdb at exceptions')
806
807
807 def debugger(self,force=False):
808 def debugger(self,force=False):
808 """Call the pydb/pdb debugger.
809 """Call the pydb/pdb debugger.
809
810
810 Keywords:
811 Keywords:
811
812
812 - force(False): by default, this routine checks the instance call_pdb
813 - force(False): by default, this routine checks the instance call_pdb
813 flag and does not actually invoke the debugger if the flag is false.
814 flag and does not actually invoke the debugger if the flag is false.
814 The 'force' option forces the debugger to activate even if the flag
815 The 'force' option forces the debugger to activate even if the flag
815 is false.
816 is false.
816 """
817 """
817
818
818 if not (force or self.call_pdb):
819 if not (force or self.call_pdb):
819 return
820 return
820
821
821 if not hasattr(sys,'last_traceback'):
822 if not hasattr(sys,'last_traceback'):
822 error('No traceback has been produced, nothing to debug.')
823 error('No traceback has been produced, nothing to debug.')
823 return
824 return
824
825
825 # use pydb if available
826 # use pydb if available
826 if debugger.has_pydb:
827 if debugger.has_pydb:
827 from pydb import pm
828 from pydb import pm
828 else:
829 else:
829 # fallback to our internal debugger
830 # fallback to our internal debugger
830 pm = lambda : self.InteractiveTB.debugger(force=True)
831 pm = lambda : self.InteractiveTB.debugger(force=True)
831
832
832 with self.readline_no_record:
833 with self.readline_no_record:
833 pm()
834 pm()
834
835
835 #-------------------------------------------------------------------------
836 #-------------------------------------------------------------------------
836 # Things related to IPython's various namespaces
837 # Things related to IPython's various namespaces
837 #-------------------------------------------------------------------------
838 #-------------------------------------------------------------------------
838
839
839 def init_create_namespaces(self, user_ns=None, user_global_ns=None):
840 def init_create_namespaces(self, user_ns=None, user_global_ns=None):
840 # Create the namespace where the user will operate. user_ns is
841 # Create the namespace where the user will operate. user_ns is
841 # normally the only one used, and it is passed to the exec calls as
842 # normally the only one used, and it is passed to the exec calls as
842 # the locals argument. But we do carry a user_global_ns namespace
843 # the locals argument. But we do carry a user_global_ns namespace
843 # given as the exec 'globals' argument, This is useful in embedding
844 # given as the exec 'globals' argument, This is useful in embedding
844 # situations where the ipython shell opens in a context where the
845 # situations where the ipython shell opens in a context where the
845 # distinction between locals and globals is meaningful. For
846 # distinction between locals and globals is meaningful. For
846 # non-embedded contexts, it is just the same object as the user_ns dict.
847 # non-embedded contexts, it is just the same object as the user_ns dict.
847
848
848 # FIXME. For some strange reason, __builtins__ is showing up at user
849 # FIXME. For some strange reason, __builtins__ is showing up at user
849 # level as a dict instead of a module. This is a manual fix, but I
850 # level as a dict instead of a module. This is a manual fix, but I
850 # should really track down where the problem is coming from. Alex
851 # should really track down where the problem is coming from. Alex
851 # Schmolck reported this problem first.
852 # Schmolck reported this problem first.
852
853
853 # A useful post by Alex Martelli on this topic:
854 # A useful post by Alex Martelli on this topic:
854 # Re: inconsistent value from __builtins__
855 # Re: inconsistent value from __builtins__
855 # Von: Alex Martelli <aleaxit@yahoo.com>
856 # Von: Alex Martelli <aleaxit@yahoo.com>
856 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
857 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
857 # Gruppen: comp.lang.python
858 # Gruppen: comp.lang.python
858
859
859 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
860 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
860 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
861 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
861 # > <type 'dict'>
862 # > <type 'dict'>
862 # > >>> print type(__builtins__)
863 # > >>> print type(__builtins__)
863 # > <type 'module'>
864 # > <type 'module'>
864 # > Is this difference in return value intentional?
865 # > Is this difference in return value intentional?
865
866
866 # Well, it's documented that '__builtins__' can be either a dictionary
867 # Well, it's documented that '__builtins__' can be either a dictionary
867 # or a module, and it's been that way for a long time. Whether it's
868 # or a module, and it's been that way for a long time. Whether it's
868 # intentional (or sensible), I don't know. In any case, the idea is
869 # intentional (or sensible), I don't know. In any case, the idea is
869 # that if you need to access the built-in namespace directly, you
870 # that if you need to access the built-in namespace directly, you
870 # should start with "import __builtin__" (note, no 's') which will
871 # should start with "import __builtin__" (note, no 's') which will
871 # definitely give you a module. Yeah, it's somewhat confusing:-(.
872 # definitely give you a module. Yeah, it's somewhat confusing:-(.
872
873
873 # These routines return properly built dicts as needed by the rest of
874 # These routines return properly built dicts as needed by the rest of
874 # the code, and can also be used by extension writers to generate
875 # the code, and can also be used by extension writers to generate
875 # properly initialized namespaces.
876 # properly initialized namespaces.
876 user_ns, user_global_ns = self.make_user_namespaces(user_ns,
877 user_ns, user_global_ns = self.make_user_namespaces(user_ns,
877 user_global_ns)
878 user_global_ns)
878
879
879 # Assign namespaces
880 # Assign namespaces
880 # This is the namespace where all normal user variables live
881 # This is the namespace where all normal user variables live
881 self.user_ns = user_ns
882 self.user_ns = user_ns
882 self.user_global_ns = user_global_ns
883 self.user_global_ns = user_global_ns
883
884
884 # An auxiliary namespace that checks what parts of the user_ns were
885 # An auxiliary namespace that checks what parts of the user_ns were
885 # loaded at startup, so we can list later only variables defined in
886 # loaded at startup, so we can list later only variables defined in
886 # actual interactive use. Since it is always a subset of user_ns, it
887 # actual interactive use. Since it is always a subset of user_ns, it
887 # doesn't need to be separately tracked in the ns_table.
888 # doesn't need to be separately tracked in the ns_table.
888 self.user_ns_hidden = {}
889 self.user_ns_hidden = {}
889
890
890 # A namespace to keep track of internal data structures to prevent
891 # A namespace to keep track of internal data structures to prevent
891 # them from cluttering user-visible stuff. Will be updated later
892 # them from cluttering user-visible stuff. Will be updated later
892 self.internal_ns = {}
893 self.internal_ns = {}
893
894
894 # Now that FakeModule produces a real module, we've run into a nasty
895 # Now that FakeModule produces a real module, we've run into a nasty
895 # problem: after script execution (via %run), the module where the user
896 # problem: after script execution (via %run), the module where the user
896 # code ran is deleted. Now that this object is a true module (needed
897 # code ran is deleted. Now that this object is a true module (needed
897 # so docetst and other tools work correctly), the Python module
898 # so docetst and other tools work correctly), the Python module
898 # teardown mechanism runs over it, and sets to None every variable
899 # teardown mechanism runs over it, and sets to None every variable
899 # present in that module. Top-level references to objects from the
900 # present in that module. Top-level references to objects from the
900 # script survive, because the user_ns is updated with them. However,
901 # script survive, because the user_ns is updated with them. However,
901 # calling functions defined in the script that use other things from
902 # calling functions defined in the script that use other things from
902 # the script will fail, because the function's closure had references
903 # the script will fail, because the function's closure had references
903 # to the original objects, which are now all None. So we must protect
904 # to the original objects, which are now all None. So we must protect
904 # these modules from deletion by keeping a cache.
905 # these modules from deletion by keeping a cache.
905 #
906 #
906 # To avoid keeping stale modules around (we only need the one from the
907 # To avoid keeping stale modules around (we only need the one from the
907 # last run), we use a dict keyed with the full path to the script, so
908 # last run), we use a dict keyed with the full path to the script, so
908 # only the last version of the module is held in the cache. Note,
909 # only the last version of the module is held in the cache. Note,
909 # however, that we must cache the module *namespace contents* (their
910 # however, that we must cache the module *namespace contents* (their
910 # __dict__). Because if we try to cache the actual modules, old ones
911 # __dict__). Because if we try to cache the actual modules, old ones
911 # (uncached) could be destroyed while still holding references (such as
912 # (uncached) could be destroyed while still holding references (such as
912 # those held by GUI objects that tend to be long-lived)>
913 # those held by GUI objects that tend to be long-lived)>
913 #
914 #
914 # The %reset command will flush this cache. See the cache_main_mod()
915 # The %reset command will flush this cache. See the cache_main_mod()
915 # and clear_main_mod_cache() methods for details on use.
916 # and clear_main_mod_cache() methods for details on use.
916
917
917 # This is the cache used for 'main' namespaces
918 # This is the cache used for 'main' namespaces
918 self._main_ns_cache = {}
919 self._main_ns_cache = {}
919 # And this is the single instance of FakeModule whose __dict__ we keep
920 # And this is the single instance of FakeModule whose __dict__ we keep
920 # copying and clearing for reuse on each %run
921 # copying and clearing for reuse on each %run
921 self._user_main_module = FakeModule()
922 self._user_main_module = FakeModule()
922
923
923 # A table holding all the namespaces IPython deals with, so that
924 # A table holding all the namespaces IPython deals with, so that
924 # introspection facilities can search easily.
925 # introspection facilities can search easily.
925 self.ns_table = {'user':user_ns,
926 self.ns_table = {'user':user_ns,
926 'user_global':user_global_ns,
927 'user_global':user_global_ns,
927 'internal':self.internal_ns,
928 'internal':self.internal_ns,
928 'builtin':__builtin__.__dict__
929 'builtin':__builtin__.__dict__
929 }
930 }
930
931
931 # Similarly, track all namespaces where references can be held and that
932 # Similarly, track all namespaces where references can be held and that
932 # we can safely clear (so it can NOT include builtin). This one can be
933 # we can safely clear (so it can NOT include builtin). This one can be
933 # a simple list. Note that the main execution namespaces, user_ns and
934 # a simple list. Note that the main execution namespaces, user_ns and
934 # user_global_ns, can NOT be listed here, as clearing them blindly
935 # user_global_ns, can NOT be listed here, as clearing them blindly
935 # causes errors in object __del__ methods. Instead, the reset() method
936 # causes errors in object __del__ methods. Instead, the reset() method
936 # clears them manually and carefully.
937 # clears them manually and carefully.
937 self.ns_refs_table = [ self.user_ns_hidden,
938 self.ns_refs_table = [ self.user_ns_hidden,
938 self.internal_ns, self._main_ns_cache ]
939 self.internal_ns, self._main_ns_cache ]
939
940
940 def make_user_namespaces(self, user_ns=None, user_global_ns=None):
941 def make_user_namespaces(self, user_ns=None, user_global_ns=None):
941 """Return a valid local and global user interactive namespaces.
942 """Return a valid local and global user interactive namespaces.
942
943
943 This builds a dict with the minimal information needed to operate as a
944 This builds a dict with the minimal information needed to operate as a
944 valid IPython user namespace, which you can pass to the various
945 valid IPython user namespace, which you can pass to the various
945 embedding classes in ipython. The default implementation returns the
946 embedding classes in ipython. The default implementation returns the
946 same dict for both the locals and the globals to allow functions to
947 same dict for both the locals and the globals to allow functions to
947 refer to variables in the namespace. Customized implementations can
948 refer to variables in the namespace. Customized implementations can
948 return different dicts. The locals dictionary can actually be anything
949 return different dicts. The locals dictionary can actually be anything
949 following the basic mapping protocol of a dict, but the globals dict
950 following the basic mapping protocol of a dict, but the globals dict
950 must be a true dict, not even a subclass. It is recommended that any
951 must be a true dict, not even a subclass. It is recommended that any
951 custom object for the locals namespace synchronize with the globals
952 custom object for the locals namespace synchronize with the globals
952 dict somehow.
953 dict somehow.
953
954
954 Raises TypeError if the provided globals namespace is not a true dict.
955 Raises TypeError if the provided globals namespace is not a true dict.
955
956
956 Parameters
957 Parameters
957 ----------
958 ----------
958 user_ns : dict-like, optional
959 user_ns : dict-like, optional
959 The current user namespace. The items in this namespace should
960 The current user namespace. The items in this namespace should
960 be included in the output. If None, an appropriate blank
961 be included in the output. If None, an appropriate blank
961 namespace should be created.
962 namespace should be created.
962 user_global_ns : dict, optional
963 user_global_ns : dict, optional
963 The current user global namespace. The items in this namespace
964 The current user global namespace. The items in this namespace
964 should be included in the output. If None, an appropriate
965 should be included in the output. If None, an appropriate
965 blank namespace should be created.
966 blank namespace should be created.
966
967
967 Returns
968 Returns
968 -------
969 -------
969 A pair of dictionary-like object to be used as the local namespace
970 A pair of dictionary-like object to be used as the local namespace
970 of the interpreter and a dict to be used as the global namespace.
971 of the interpreter and a dict to be used as the global namespace.
971 """
972 """
972
973
973
974
974 # We must ensure that __builtin__ (without the final 's') is always
975 # We must ensure that __builtin__ (without the final 's') is always
975 # available and pointing to the __builtin__ *module*. For more details:
976 # available and pointing to the __builtin__ *module*. For more details:
976 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
977 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
977
978
978 if user_ns is None:
979 if user_ns is None:
979 # Set __name__ to __main__ to better match the behavior of the
980 # Set __name__ to __main__ to better match the behavior of the
980 # normal interpreter.
981 # normal interpreter.
981 user_ns = {'__name__' :'__main__',
982 user_ns = {'__name__' :'__main__',
982 '__builtin__' : __builtin__,
983 py3compat.builtin_mod_name: builtin_mod,
983 '__builtins__' : __builtin__,
984 '__builtins__' : builtin_mod,
984 }
985 }
985 else:
986 else:
986 user_ns.setdefault('__name__','__main__')
987 user_ns.setdefault('__name__','__main__')
987 user_ns.setdefault('__builtin__',__builtin__)
988 user_ns.setdefault(py3compat.builtin_mod_name,builtin_mod)
988 user_ns.setdefault('__builtins__',__builtin__)
989 user_ns.setdefault('__builtins__',builtin_mod)
989
990
990 if user_global_ns is None:
991 if user_global_ns is None:
991 user_global_ns = user_ns
992 user_global_ns = user_ns
992 if type(user_global_ns) is not dict:
993 if type(user_global_ns) is not dict:
993 raise TypeError("user_global_ns must be a true dict; got %r"
994 raise TypeError("user_global_ns must be a true dict; got %r"
994 % type(user_global_ns))
995 % type(user_global_ns))
995
996
996 return user_ns, user_global_ns
997 return user_ns, user_global_ns
997
998
998 def init_sys_modules(self):
999 def init_sys_modules(self):
999 # We need to insert into sys.modules something that looks like a
1000 # We need to insert into sys.modules something that looks like a
1000 # module but which accesses the IPython namespace, for shelve and
1001 # module but which accesses the IPython namespace, for shelve and
1001 # pickle to work interactively. Normally they rely on getting
1002 # pickle to work interactively. Normally they rely on getting
1002 # everything out of __main__, but for embedding purposes each IPython
1003 # everything out of __main__, but for embedding purposes each IPython
1003 # instance has its own private namespace, so we can't go shoving
1004 # instance has its own private namespace, so we can't go shoving
1004 # everything into __main__.
1005 # everything into __main__.
1005
1006
1006 # note, however, that we should only do this for non-embedded
1007 # note, however, that we should only do this for non-embedded
1007 # ipythons, which really mimic the __main__.__dict__ with their own
1008 # ipythons, which really mimic the __main__.__dict__ with their own
1008 # namespace. Embedded instances, on the other hand, should not do
1009 # namespace. Embedded instances, on the other hand, should not do
1009 # this because they need to manage the user local/global namespaces
1010 # this because they need to manage the user local/global namespaces
1010 # only, but they live within a 'normal' __main__ (meaning, they
1011 # only, but they live within a 'normal' __main__ (meaning, they
1011 # shouldn't overtake the execution environment of the script they're
1012 # shouldn't overtake the execution environment of the script they're
1012 # embedded in).
1013 # embedded in).
1013
1014
1014 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1015 # This is overridden in the InteractiveShellEmbed subclass to a no-op.
1015
1016
1016 try:
1017 try:
1017 main_name = self.user_ns['__name__']
1018 main_name = self.user_ns['__name__']
1018 except KeyError:
1019 except KeyError:
1019 raise KeyError('user_ns dictionary MUST have a "__name__" key')
1020 raise KeyError('user_ns dictionary MUST have a "__name__" key')
1020 else:
1021 else:
1021 sys.modules[main_name] = FakeModule(self.user_ns)
1022 sys.modules[main_name] = FakeModule(self.user_ns)
1022
1023
1023 def init_user_ns(self):
1024 def init_user_ns(self):
1024 """Initialize all user-visible namespaces to their minimum defaults.
1025 """Initialize all user-visible namespaces to their minimum defaults.
1025
1026
1026 Certain history lists are also initialized here, as they effectively
1027 Certain history lists are also initialized here, as they effectively
1027 act as user namespaces.
1028 act as user namespaces.
1028
1029
1029 Notes
1030 Notes
1030 -----
1031 -----
1031 All data structures here are only filled in, they are NOT reset by this
1032 All data structures here are only filled in, they are NOT reset by this
1032 method. If they were not empty before, data will simply be added to
1033 method. If they were not empty before, data will simply be added to
1033 therm.
1034 therm.
1034 """
1035 """
1035 # This function works in two parts: first we put a few things in
1036 # This function works in two parts: first we put a few things in
1036 # user_ns, and we sync that contents into user_ns_hidden so that these
1037 # user_ns, and we sync that contents into user_ns_hidden so that these
1037 # initial variables aren't shown by %who. After the sync, we add the
1038 # initial variables aren't shown by %who. After the sync, we add the
1038 # rest of what we *do* want the user to see with %who even on a new
1039 # rest of what we *do* want the user to see with %who even on a new
1039 # session (probably nothing, so theye really only see their own stuff)
1040 # session (probably nothing, so theye really only see their own stuff)
1040
1041
1041 # The user dict must *always* have a __builtin__ reference to the
1042 # The user dict must *always* have a __builtin__ reference to the
1042 # Python standard __builtin__ namespace, which must be imported.
1043 # Python standard __builtin__ namespace, which must be imported.
1043 # This is so that certain operations in prompt evaluation can be
1044 # This is so that certain operations in prompt evaluation can be
1044 # reliably executed with builtins. Note that we can NOT use
1045 # reliably executed with builtins. Note that we can NOT use
1045 # __builtins__ (note the 's'), because that can either be a dict or a
1046 # __builtins__ (note the 's'), because that can either be a dict or a
1046 # module, and can even mutate at runtime, depending on the context
1047 # module, and can even mutate at runtime, depending on the context
1047 # (Python makes no guarantees on it). In contrast, __builtin__ is
1048 # (Python makes no guarantees on it). In contrast, __builtin__ is
1048 # always a module object, though it must be explicitly imported.
1049 # always a module object, though it must be explicitly imported.
1049
1050
1050 # For more details:
1051 # For more details:
1051 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1052 # http://mail.python.org/pipermail/python-dev/2001-April/014068.html
1052 ns = dict(__builtin__ = __builtin__)
1053 ns = dict(__builtin__ = __builtin__)
1053
1054
1054 # Put 'help' in the user namespace
1055 # Put 'help' in the user namespace
1055 try:
1056 try:
1056 from site import _Helper
1057 from site import _Helper
1057 ns['help'] = _Helper()
1058 ns['help'] = _Helper()
1058 except ImportError:
1059 except ImportError:
1059 warn('help() not available - check site.py')
1060 warn('help() not available - check site.py')
1060
1061
1061 # make global variables for user access to the histories
1062 # make global variables for user access to the histories
1062 ns['_ih'] = self.history_manager.input_hist_parsed
1063 ns['_ih'] = self.history_manager.input_hist_parsed
1063 ns['_oh'] = self.history_manager.output_hist
1064 ns['_oh'] = self.history_manager.output_hist
1064 ns['_dh'] = self.history_manager.dir_hist
1065 ns['_dh'] = self.history_manager.dir_hist
1065
1066
1066 ns['_sh'] = shadowns
1067 ns['_sh'] = shadowns
1067
1068
1068 # user aliases to input and output histories. These shouldn't show up
1069 # user aliases to input and output histories. These shouldn't show up
1069 # in %who, as they can have very large reprs.
1070 # in %who, as they can have very large reprs.
1070 ns['In'] = self.history_manager.input_hist_parsed
1071 ns['In'] = self.history_manager.input_hist_parsed
1071 ns['Out'] = self.history_manager.output_hist
1072 ns['Out'] = self.history_manager.output_hist
1072
1073
1073 # Store myself as the public api!!!
1074 # Store myself as the public api!!!
1074 ns['get_ipython'] = self.get_ipython
1075 ns['get_ipython'] = self.get_ipython
1075
1076
1076 ns['exit'] = self.exiter
1077 ns['exit'] = self.exiter
1077 ns['quit'] = self.exiter
1078 ns['quit'] = self.exiter
1078
1079
1079 # Sync what we've added so far to user_ns_hidden so these aren't seen
1080 # Sync what we've added so far to user_ns_hidden so these aren't seen
1080 # by %who
1081 # by %who
1081 self.user_ns_hidden.update(ns)
1082 self.user_ns_hidden.update(ns)
1082
1083
1083 # Anything put into ns now would show up in %who. Think twice before
1084 # Anything put into ns now would show up in %who. Think twice before
1084 # putting anything here, as we really want %who to show the user their
1085 # putting anything here, as we really want %who to show the user their
1085 # stuff, not our variables.
1086 # stuff, not our variables.
1086
1087
1087 # Finally, update the real user's namespace
1088 # Finally, update the real user's namespace
1088 self.user_ns.update(ns)
1089 self.user_ns.update(ns)
1089
1090
1090 def reset(self, new_session=True):
1091 def reset(self, new_session=True):
1091 """Clear all internal namespaces, and attempt to release references to
1092 """Clear all internal namespaces, and attempt to release references to
1092 user objects.
1093 user objects.
1093
1094
1094 If new_session is True, a new history session will be opened.
1095 If new_session is True, a new history session will be opened.
1095 """
1096 """
1096 # Clear histories
1097 # Clear histories
1097 self.history_manager.reset(new_session)
1098 self.history_manager.reset(new_session)
1098 # Reset counter used to index all histories
1099 # Reset counter used to index all histories
1099 if new_session:
1100 if new_session:
1100 self.execution_count = 1
1101 self.execution_count = 1
1101
1102
1102 # Flush cached output items
1103 # Flush cached output items
1103 if self.displayhook.do_full_cache:
1104 if self.displayhook.do_full_cache:
1104 self.displayhook.flush()
1105 self.displayhook.flush()
1105
1106
1106 # Restore the user namespaces to minimal usability
1107 # Restore the user namespaces to minimal usability
1107 for ns in self.ns_refs_table:
1108 for ns in self.ns_refs_table:
1108 ns.clear()
1109 ns.clear()
1109
1110
1110 # The main execution namespaces must be cleared very carefully,
1111 # The main execution namespaces must be cleared very carefully,
1111 # skipping the deletion of the builtin-related keys, because doing so
1112 # skipping the deletion of the builtin-related keys, because doing so
1112 # would cause errors in many object's __del__ methods.
1113 # would cause errors in many object's __del__ methods.
1113 for ns in [self.user_ns, self.user_global_ns]:
1114 for ns in [self.user_ns, self.user_global_ns]:
1114 drop_keys = set(ns.keys())
1115 drop_keys = set(ns.keys())
1115 drop_keys.discard('__builtin__')
1116 drop_keys.discard('__builtin__')
1116 drop_keys.discard('__builtins__')
1117 drop_keys.discard('__builtins__')
1117 for k in drop_keys:
1118 for k in drop_keys:
1118 del ns[k]
1119 del ns[k]
1119
1120
1120 # Restore the user namespaces to minimal usability
1121 # Restore the user namespaces to minimal usability
1121 self.init_user_ns()
1122 self.init_user_ns()
1122
1123
1123 # Restore the default and user aliases
1124 # Restore the default and user aliases
1124 self.alias_manager.clear_aliases()
1125 self.alias_manager.clear_aliases()
1125 self.alias_manager.init_aliases()
1126 self.alias_manager.init_aliases()
1126
1127
1127 # Flush the private list of module references kept for script
1128 # Flush the private list of module references kept for script
1128 # execution protection
1129 # execution protection
1129 self.clear_main_mod_cache()
1130 self.clear_main_mod_cache()
1130
1131
1131 # Clear out the namespace from the last %run
1132 # Clear out the namespace from the last %run
1132 self.new_main_mod()
1133 self.new_main_mod()
1133
1134
1134 def del_var(self, varname, by_name=False):
1135 def del_var(self, varname, by_name=False):
1135 """Delete a variable from the various namespaces, so that, as
1136 """Delete a variable from the various namespaces, so that, as
1136 far as possible, we're not keeping any hidden references to it.
1137 far as possible, we're not keeping any hidden references to it.
1137
1138
1138 Parameters
1139 Parameters
1139 ----------
1140 ----------
1140 varname : str
1141 varname : str
1141 The name of the variable to delete.
1142 The name of the variable to delete.
1142 by_name : bool
1143 by_name : bool
1143 If True, delete variables with the given name in each
1144 If True, delete variables with the given name in each
1144 namespace. If False (default), find the variable in the user
1145 namespace. If False (default), find the variable in the user
1145 namespace, and delete references to it.
1146 namespace, and delete references to it.
1146 """
1147 """
1147 if varname in ('__builtin__', '__builtins__'):
1148 if varname in ('__builtin__', '__builtins__'):
1148 raise ValueError("Refusing to delete %s" % varname)
1149 raise ValueError("Refusing to delete %s" % varname)
1149 ns_refs = self.ns_refs_table + [self.user_ns,
1150 ns_refs = self.ns_refs_table + [self.user_ns,
1150 self.user_global_ns, self._user_main_module.__dict__] +\
1151 self.user_global_ns, self._user_main_module.__dict__] +\
1151 self._main_ns_cache.values()
1152 self._main_ns_cache.values()
1152
1153
1153 if by_name: # Delete by name
1154 if by_name: # Delete by name
1154 for ns in ns_refs:
1155 for ns in ns_refs:
1155 try:
1156 try:
1156 del ns[varname]
1157 del ns[varname]
1157 except KeyError:
1158 except KeyError:
1158 pass
1159 pass
1159 else: # Delete by object
1160 else: # Delete by object
1160 try:
1161 try:
1161 obj = self.user_ns[varname]
1162 obj = self.user_ns[varname]
1162 except KeyError:
1163 except KeyError:
1163 raise NameError("name '%s' is not defined" % varname)
1164 raise NameError("name '%s' is not defined" % varname)
1164 # Also check in output history
1165 # Also check in output history
1165 ns_refs.append(self.history_manager.output_hist)
1166 ns_refs.append(self.history_manager.output_hist)
1166 for ns in ns_refs:
1167 for ns in ns_refs:
1167 to_delete = [n for n, o in ns.iteritems() if o is obj]
1168 to_delete = [n for n, o in ns.iteritems() if o is obj]
1168 for name in to_delete:
1169 for name in to_delete:
1169 del ns[name]
1170 del ns[name]
1170
1171
1171 # displayhook keeps extra references, but not in a dictionary
1172 # displayhook keeps extra references, but not in a dictionary
1172 for name in ('_', '__', '___'):
1173 for name in ('_', '__', '___'):
1173 if getattr(self.displayhook, name) is obj:
1174 if getattr(self.displayhook, name) is obj:
1174 setattr(self.displayhook, name, None)
1175 setattr(self.displayhook, name, None)
1175
1176
1176 def reset_selective(self, regex=None):
1177 def reset_selective(self, regex=None):
1177 """Clear selective variables from internal namespaces based on a
1178 """Clear selective variables from internal namespaces based on a
1178 specified regular expression.
1179 specified regular expression.
1179
1180
1180 Parameters
1181 Parameters
1181 ----------
1182 ----------
1182 regex : string or compiled pattern, optional
1183 regex : string or compiled pattern, optional
1183 A regular expression pattern that will be used in searching
1184 A regular expression pattern that will be used in searching
1184 variable names in the users namespaces.
1185 variable names in the users namespaces.
1185 """
1186 """
1186 if regex is not None:
1187 if regex is not None:
1187 try:
1188 try:
1188 m = re.compile(regex)
1189 m = re.compile(regex)
1189 except TypeError:
1190 except TypeError:
1190 raise TypeError('regex must be a string or compiled pattern')
1191 raise TypeError('regex must be a string or compiled pattern')
1191 # Search for keys in each namespace that match the given regex
1192 # Search for keys in each namespace that match the given regex
1192 # If a match is found, delete the key/value pair.
1193 # If a match is found, delete the key/value pair.
1193 for ns in self.ns_refs_table:
1194 for ns in self.ns_refs_table:
1194 for var in ns:
1195 for var in ns:
1195 if m.search(var):
1196 if m.search(var):
1196 del ns[var]
1197 del ns[var]
1197
1198
1198 def push(self, variables, interactive=True):
1199 def push(self, variables, interactive=True):
1199 """Inject a group of variables into the IPython user namespace.
1200 """Inject a group of variables into the IPython user namespace.
1200
1201
1201 Parameters
1202 Parameters
1202 ----------
1203 ----------
1203 variables : dict, str or list/tuple of str
1204 variables : dict, str or list/tuple of str
1204 The variables to inject into the user's namespace. If a dict, a
1205 The variables to inject into the user's namespace. If a dict, a
1205 simple update is done. If a str, the string is assumed to have
1206 simple update is done. If a str, the string is assumed to have
1206 variable names separated by spaces. A list/tuple of str can also
1207 variable names separated by spaces. A list/tuple of str can also
1207 be used to give the variable names. If just the variable names are
1208 be used to give the variable names. If just the variable names are
1208 give (list/tuple/str) then the variable values looked up in the
1209 give (list/tuple/str) then the variable values looked up in the
1209 callers frame.
1210 callers frame.
1210 interactive : bool
1211 interactive : bool
1211 If True (default), the variables will be listed with the ``who``
1212 If True (default), the variables will be listed with the ``who``
1212 magic.
1213 magic.
1213 """
1214 """
1214 vdict = None
1215 vdict = None
1215
1216
1216 # We need a dict of name/value pairs to do namespace updates.
1217 # We need a dict of name/value pairs to do namespace updates.
1217 if isinstance(variables, dict):
1218 if isinstance(variables, dict):
1218 vdict = variables
1219 vdict = variables
1219 elif isinstance(variables, (basestring, list, tuple)):
1220 elif isinstance(variables, (basestring, list, tuple)):
1220 if isinstance(variables, basestring):
1221 if isinstance(variables, basestring):
1221 vlist = variables.split()
1222 vlist = variables.split()
1222 else:
1223 else:
1223 vlist = variables
1224 vlist = variables
1224 vdict = {}
1225 vdict = {}
1225 cf = sys._getframe(1)
1226 cf = sys._getframe(1)
1226 for name in vlist:
1227 for name in vlist:
1227 try:
1228 try:
1228 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1229 vdict[name] = eval(name, cf.f_globals, cf.f_locals)
1229 except:
1230 except:
1230 print ('Could not get variable %s from %s' %
1231 print ('Could not get variable %s from %s' %
1231 (name,cf.f_code.co_name))
1232 (name,cf.f_code.co_name))
1232 else:
1233 else:
1233 raise ValueError('variables must be a dict/str/list/tuple')
1234 raise ValueError('variables must be a dict/str/list/tuple')
1234
1235
1235 # Propagate variables to user namespace
1236 # Propagate variables to user namespace
1236 self.user_ns.update(vdict)
1237 self.user_ns.update(vdict)
1237
1238
1238 # And configure interactive visibility
1239 # And configure interactive visibility
1239 config_ns = self.user_ns_hidden
1240 config_ns = self.user_ns_hidden
1240 if interactive:
1241 if interactive:
1241 for name, val in vdict.iteritems():
1242 for name, val in vdict.iteritems():
1242 config_ns.pop(name, None)
1243 config_ns.pop(name, None)
1243 else:
1244 else:
1244 for name,val in vdict.iteritems():
1245 for name,val in vdict.iteritems():
1245 config_ns[name] = val
1246 config_ns[name] = val
1246
1247
1247 #-------------------------------------------------------------------------
1248 #-------------------------------------------------------------------------
1248 # Things related to object introspection
1249 # Things related to object introspection
1249 #-------------------------------------------------------------------------
1250 #-------------------------------------------------------------------------
1250
1251
1251 def _ofind(self, oname, namespaces=None):
1252 def _ofind(self, oname, namespaces=None):
1252 """Find an object in the available namespaces.
1253 """Find an object in the available namespaces.
1253
1254
1254 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1255 self._ofind(oname) -> dict with keys: found,obj,ospace,ismagic
1255
1256
1256 Has special code to detect magic functions.
1257 Has special code to detect magic functions.
1257 """
1258 """
1258 #oname = oname.strip()
1259 oname = oname.strip()
1259 #print '1- oname: <%r>' % oname # dbg
1260 #print '1- oname: <%r>' % oname # dbg
1260 try:
1261 if not py3compat.PY3:
1261 oname = oname.strip().encode('ascii')
1262 try:
1262 #print '2- oname: <%r>' % oname # dbg
1263 oname = oname.encode('ascii')
1263 except UnicodeEncodeError:
1264 #print '2- oname: <%r>' % oname # dbg
1264 print 'Python identifiers can only contain ascii characters.'
1265 except UnicodeError:
1265 return dict(found=False)
1266 print 'Python identifiers can only contain ascii characters.'
1267 return dict(found=False)
1266
1268
1267 alias_ns = None
1269 alias_ns = None
1268 if namespaces is None:
1270 if namespaces is None:
1269 # Namespaces to search in:
1271 # Namespaces to search in:
1270 # Put them in a list. The order is important so that we
1272 # Put them in a list. The order is important so that we
1271 # find things in the same order that Python finds them.
1273 # find things in the same order that Python finds them.
1272 namespaces = [ ('Interactive', self.user_ns),
1274 namespaces = [ ('Interactive', self.user_ns),
1273 ('IPython internal', self.internal_ns),
1275 ('IPython internal', self.internal_ns),
1274 ('Python builtin', __builtin__.__dict__),
1276 ('Python builtin', __builtin__.__dict__),
1275 ('Alias', self.alias_manager.alias_table),
1277 ('Alias', self.alias_manager.alias_table),
1276 ]
1278 ]
1277 alias_ns = self.alias_manager.alias_table
1279 alias_ns = self.alias_manager.alias_table
1278
1280
1279 # initialize results to 'null'
1281 # initialize results to 'null'
1280 found = False; obj = None; ospace = None; ds = None;
1282 found = False; obj = None; ospace = None; ds = None;
1281 ismagic = False; isalias = False; parent = None
1283 ismagic = False; isalias = False; parent = None
1282
1284
1283 # We need to special-case 'print', which as of python2.6 registers as a
1285 # We need to special-case 'print', which as of python2.6 registers as a
1284 # function but should only be treated as one if print_function was
1286 # function but should only be treated as one if print_function was
1285 # loaded with a future import. In this case, just bail.
1287 # loaded with a future import. In this case, just bail.
1286 if (oname == 'print' and not (self.compile.compiler_flags &
1288 if (oname == 'print' and not (self.compile.compiler_flags &
1287 __future__.CO_FUTURE_PRINT_FUNCTION)):
1289 __future__.CO_FUTURE_PRINT_FUNCTION)):
1288 return {'found':found, 'obj':obj, 'namespace':ospace,
1290 return {'found':found, 'obj':obj, 'namespace':ospace,
1289 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1291 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1290
1292
1291 # Look for the given name by splitting it in parts. If the head is
1293 # Look for the given name by splitting it in parts. If the head is
1292 # found, then we look for all the remaining parts as members, and only
1294 # found, then we look for all the remaining parts as members, and only
1293 # declare success if we can find them all.
1295 # declare success if we can find them all.
1294 oname_parts = oname.split('.')
1296 oname_parts = oname.split('.')
1295 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1297 oname_head, oname_rest = oname_parts[0],oname_parts[1:]
1296 for nsname,ns in namespaces:
1298 for nsname,ns in namespaces:
1297 try:
1299 try:
1298 obj = ns[oname_head]
1300 obj = ns[oname_head]
1299 except KeyError:
1301 except KeyError:
1300 continue
1302 continue
1301 else:
1303 else:
1302 #print 'oname_rest:', oname_rest # dbg
1304 #print 'oname_rest:', oname_rest # dbg
1303 for part in oname_rest:
1305 for part in oname_rest:
1304 try:
1306 try:
1305 parent = obj
1307 parent = obj
1306 obj = getattr(obj,part)
1308 obj = getattr(obj,part)
1307 except:
1309 except:
1308 # Blanket except b/c some badly implemented objects
1310 # Blanket except b/c some badly implemented objects
1309 # allow __getattr__ to raise exceptions other than
1311 # allow __getattr__ to raise exceptions other than
1310 # AttributeError, which then crashes IPython.
1312 # AttributeError, which then crashes IPython.
1311 break
1313 break
1312 else:
1314 else:
1313 # If we finish the for loop (no break), we got all members
1315 # If we finish the for loop (no break), we got all members
1314 found = True
1316 found = True
1315 ospace = nsname
1317 ospace = nsname
1316 if ns == alias_ns:
1318 if ns == alias_ns:
1317 isalias = True
1319 isalias = True
1318 break # namespace loop
1320 break # namespace loop
1319
1321
1320 # Try to see if it's magic
1322 # Try to see if it's magic
1321 if not found:
1323 if not found:
1322 if oname.startswith(ESC_MAGIC):
1324 if oname.startswith(ESC_MAGIC):
1323 oname = oname[1:]
1325 oname = oname[1:]
1324 obj = getattr(self,'magic_'+oname,None)
1326 obj = getattr(self,'magic_'+oname,None)
1325 if obj is not None:
1327 if obj is not None:
1326 found = True
1328 found = True
1327 ospace = 'IPython internal'
1329 ospace = 'IPython internal'
1328 ismagic = True
1330 ismagic = True
1329
1331
1330 # Last try: special-case some literals like '', [], {}, etc:
1332 # Last try: special-case some literals like '', [], {}, etc:
1331 if not found and oname_head in ["''",'""','[]','{}','()']:
1333 if not found and oname_head in ["''",'""','[]','{}','()']:
1332 obj = eval(oname_head)
1334 obj = eval(oname_head)
1333 found = True
1335 found = True
1334 ospace = 'Interactive'
1336 ospace = 'Interactive'
1335
1337
1336 return {'found':found, 'obj':obj, 'namespace':ospace,
1338 return {'found':found, 'obj':obj, 'namespace':ospace,
1337 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1339 'ismagic':ismagic, 'isalias':isalias, 'parent':parent}
1338
1340
1339 def _ofind_property(self, oname, info):
1341 def _ofind_property(self, oname, info):
1340 """Second part of object finding, to look for property details."""
1342 """Second part of object finding, to look for property details."""
1341 if info.found:
1343 if info.found:
1342 # Get the docstring of the class property if it exists.
1344 # Get the docstring of the class property if it exists.
1343 path = oname.split('.')
1345 path = oname.split('.')
1344 root = '.'.join(path[:-1])
1346 root = '.'.join(path[:-1])
1345 if info.parent is not None:
1347 if info.parent is not None:
1346 try:
1348 try:
1347 target = getattr(info.parent, '__class__')
1349 target = getattr(info.parent, '__class__')
1348 # The object belongs to a class instance.
1350 # The object belongs to a class instance.
1349 try:
1351 try:
1350 target = getattr(target, path[-1])
1352 target = getattr(target, path[-1])
1351 # The class defines the object.
1353 # The class defines the object.
1352 if isinstance(target, property):
1354 if isinstance(target, property):
1353 oname = root + '.__class__.' + path[-1]
1355 oname = root + '.__class__.' + path[-1]
1354 info = Struct(self._ofind(oname))
1356 info = Struct(self._ofind(oname))
1355 except AttributeError: pass
1357 except AttributeError: pass
1356 except AttributeError: pass
1358 except AttributeError: pass
1357
1359
1358 # We return either the new info or the unmodified input if the object
1360 # We return either the new info or the unmodified input if the object
1359 # hadn't been found
1361 # hadn't been found
1360 return info
1362 return info
1361
1363
1362 def _object_find(self, oname, namespaces=None):
1364 def _object_find(self, oname, namespaces=None):
1363 """Find an object and return a struct with info about it."""
1365 """Find an object and return a struct with info about it."""
1364 inf = Struct(self._ofind(oname, namespaces))
1366 inf = Struct(self._ofind(oname, namespaces))
1365 return Struct(self._ofind_property(oname, inf))
1367 return Struct(self._ofind_property(oname, inf))
1366
1368
1367 def _inspect(self, meth, oname, namespaces=None, **kw):
1369 def _inspect(self, meth, oname, namespaces=None, **kw):
1368 """Generic interface to the inspector system.
1370 """Generic interface to the inspector system.
1369
1371
1370 This function is meant to be called by pdef, pdoc & friends."""
1372 This function is meant to be called by pdef, pdoc & friends."""
1371 info = self._object_find(oname)
1373 info = self._object_find(oname)
1372 if info.found:
1374 if info.found:
1373 pmethod = getattr(self.inspector, meth)
1375 pmethod = getattr(self.inspector, meth)
1374 formatter = format_screen if info.ismagic else None
1376 formatter = format_screen if info.ismagic else None
1375 if meth == 'pdoc':
1377 if meth == 'pdoc':
1376 pmethod(info.obj, oname, formatter)
1378 pmethod(info.obj, oname, formatter)
1377 elif meth == 'pinfo':
1379 elif meth == 'pinfo':
1378 pmethod(info.obj, oname, formatter, info, **kw)
1380 pmethod(info.obj, oname, formatter, info, **kw)
1379 else:
1381 else:
1380 pmethod(info.obj, oname)
1382 pmethod(info.obj, oname)
1381 else:
1383 else:
1382 print 'Object `%s` not found.' % oname
1384 print 'Object `%s` not found.' % oname
1383 return 'not found' # so callers can take other action
1385 return 'not found' # so callers can take other action
1384
1386
1385 def object_inspect(self, oname):
1387 def object_inspect(self, oname):
1386 with self.builtin_trap:
1388 with self.builtin_trap:
1387 info = self._object_find(oname)
1389 info = self._object_find(oname)
1388 if info.found:
1390 if info.found:
1389 return self.inspector.info(info.obj, oname, info=info)
1391 return self.inspector.info(info.obj, oname, info=info)
1390 else:
1392 else:
1391 return oinspect.object_info(name=oname, found=False)
1393 return oinspect.object_info(name=oname, found=False)
1392
1394
1393 #-------------------------------------------------------------------------
1395 #-------------------------------------------------------------------------
1394 # Things related to history management
1396 # Things related to history management
1395 #-------------------------------------------------------------------------
1397 #-------------------------------------------------------------------------
1396
1398
1397 def init_history(self):
1399 def init_history(self):
1398 """Sets up the command history, and starts regular autosaves."""
1400 """Sets up the command history, and starts regular autosaves."""
1399 self.history_manager = HistoryManager(shell=self, config=self.config)
1401 self.history_manager = HistoryManager(shell=self, config=self.config)
1400
1402
1401 #-------------------------------------------------------------------------
1403 #-------------------------------------------------------------------------
1402 # Things related to exception handling and tracebacks (not debugging)
1404 # Things related to exception handling and tracebacks (not debugging)
1403 #-------------------------------------------------------------------------
1405 #-------------------------------------------------------------------------
1404
1406
1405 def init_traceback_handlers(self, custom_exceptions):
1407 def init_traceback_handlers(self, custom_exceptions):
1406 # Syntax error handler.
1408 # Syntax error handler.
1407 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1409 self.SyntaxTB = ultratb.SyntaxTB(color_scheme='NoColor')
1408
1410
1409 # The interactive one is initialized with an offset, meaning we always
1411 # The interactive one is initialized with an offset, meaning we always
1410 # want to remove the topmost item in the traceback, which is our own
1412 # want to remove the topmost item in the traceback, which is our own
1411 # internal code. Valid modes: ['Plain','Context','Verbose']
1413 # internal code. Valid modes: ['Plain','Context','Verbose']
1412 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1414 self.InteractiveTB = ultratb.AutoFormattedTB(mode = 'Plain',
1413 color_scheme='NoColor',
1415 color_scheme='NoColor',
1414 tb_offset = 1,
1416 tb_offset = 1,
1415 check_cache=self.compile.check_cache)
1417 check_cache=self.compile.check_cache)
1416
1418
1417 # The instance will store a pointer to the system-wide exception hook,
1419 # The instance will store a pointer to the system-wide exception hook,
1418 # so that runtime code (such as magics) can access it. This is because
1420 # so that runtime code (such as magics) can access it. This is because
1419 # during the read-eval loop, it may get temporarily overwritten.
1421 # during the read-eval loop, it may get temporarily overwritten.
1420 self.sys_excepthook = sys.excepthook
1422 self.sys_excepthook = sys.excepthook
1421
1423
1422 # and add any custom exception handlers the user may have specified
1424 # and add any custom exception handlers the user may have specified
1423 self.set_custom_exc(*custom_exceptions)
1425 self.set_custom_exc(*custom_exceptions)
1424
1426
1425 # Set the exception mode
1427 # Set the exception mode
1426 self.InteractiveTB.set_mode(mode=self.xmode)
1428 self.InteractiveTB.set_mode(mode=self.xmode)
1427
1429
1428 def set_custom_exc(self, exc_tuple, handler):
1430 def set_custom_exc(self, exc_tuple, handler):
1429 """set_custom_exc(exc_tuple,handler)
1431 """set_custom_exc(exc_tuple,handler)
1430
1432
1431 Set a custom exception handler, which will be called if any of the
1433 Set a custom exception handler, which will be called if any of the
1432 exceptions in exc_tuple occur in the mainloop (specifically, in the
1434 exceptions in exc_tuple occur in the mainloop (specifically, in the
1433 run_code() method.
1435 run_code() method.
1434
1436
1435 Inputs:
1437 Inputs:
1436
1438
1437 - exc_tuple: a *tuple* of valid exceptions to call the defined
1439 - exc_tuple: a *tuple* of valid exceptions to call the defined
1438 handler for. It is very important that you use a tuple, and NOT A
1440 handler for. It is very important that you use a tuple, and NOT A
1439 LIST here, because of the way Python's except statement works. If
1441 LIST here, because of the way Python's except statement works. If
1440 you only want to trap a single exception, use a singleton tuple:
1442 you only want to trap a single exception, use a singleton tuple:
1441
1443
1442 exc_tuple == (MyCustomException,)
1444 exc_tuple == (MyCustomException,)
1443
1445
1444 - handler: this must be defined as a function with the following
1446 - handler: this must be defined as a function with the following
1445 basic interface::
1447 basic interface::
1446
1448
1447 def my_handler(self, etype, value, tb, tb_offset=None)
1449 def my_handler(self, etype, value, tb, tb_offset=None)
1448 ...
1450 ...
1449 # The return value must be
1451 # The return value must be
1450 return structured_traceback
1452 return structured_traceback
1451
1453
1452 This will be made into an instance method (via types.MethodType)
1454 This will be made into an instance method (via types.MethodType)
1453 of IPython itself, and it will be called if any of the exceptions
1455 of IPython itself, and it will be called if any of the exceptions
1454 listed in the exc_tuple are caught. If the handler is None, an
1456 listed in the exc_tuple are caught. If the handler is None, an
1455 internal basic one is used, which just prints basic info.
1457 internal basic one is used, which just prints basic info.
1456
1458
1457 WARNING: by putting in your own exception handler into IPython's main
1459 WARNING: by putting in your own exception handler into IPython's main
1458 execution loop, you run a very good chance of nasty crashes. This
1460 execution loop, you run a very good chance of nasty crashes. This
1459 facility should only be used if you really know what you are doing."""
1461 facility should only be used if you really know what you are doing."""
1460
1462
1461 assert type(exc_tuple)==type(()) , \
1463 assert type(exc_tuple)==type(()) , \
1462 "The custom exceptions must be given AS A TUPLE."
1464 "The custom exceptions must be given AS A TUPLE."
1463
1465
1464 def dummy_handler(self,etype,value,tb):
1466 def dummy_handler(self,etype,value,tb):
1465 print '*** Simple custom exception handler ***'
1467 print '*** Simple custom exception handler ***'
1466 print 'Exception type :',etype
1468 print 'Exception type :',etype
1467 print 'Exception value:',value
1469 print 'Exception value:',value
1468 print 'Traceback :',tb
1470 print 'Traceback :',tb
1469 #print 'Source code :','\n'.join(self.buffer)
1471 #print 'Source code :','\n'.join(self.buffer)
1470
1472
1471 if handler is None: handler = dummy_handler
1473 if handler is None: handler = dummy_handler
1472
1474
1473 self.CustomTB = types.MethodType(handler,self)
1475 self.CustomTB = types.MethodType(handler,self)
1474 self.custom_exceptions = exc_tuple
1476 self.custom_exceptions = exc_tuple
1475
1477
1476 def excepthook(self, etype, value, tb):
1478 def excepthook(self, etype, value, tb):
1477 """One more defense for GUI apps that call sys.excepthook.
1479 """One more defense for GUI apps that call sys.excepthook.
1478
1480
1479 GUI frameworks like wxPython trap exceptions and call
1481 GUI frameworks like wxPython trap exceptions and call
1480 sys.excepthook themselves. I guess this is a feature that
1482 sys.excepthook themselves. I guess this is a feature that
1481 enables them to keep running after exceptions that would
1483 enables them to keep running after exceptions that would
1482 otherwise kill their mainloop. This is a bother for IPython
1484 otherwise kill their mainloop. This is a bother for IPython
1483 which excepts to catch all of the program exceptions with a try:
1485 which excepts to catch all of the program exceptions with a try:
1484 except: statement.
1486 except: statement.
1485
1487
1486 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1488 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1487 any app directly invokes sys.excepthook, it will look to the user like
1489 any app directly invokes sys.excepthook, it will look to the user like
1488 IPython crashed. In order to work around this, we can disable the
1490 IPython crashed. In order to work around this, we can disable the
1489 CrashHandler and replace it with this excepthook instead, which prints a
1491 CrashHandler and replace it with this excepthook instead, which prints a
1490 regular traceback using our InteractiveTB. In this fashion, apps which
1492 regular traceback using our InteractiveTB. In this fashion, apps which
1491 call sys.excepthook will generate a regular-looking exception from
1493 call sys.excepthook will generate a regular-looking exception from
1492 IPython, and the CrashHandler will only be triggered by real IPython
1494 IPython, and the CrashHandler will only be triggered by real IPython
1493 crashes.
1495 crashes.
1494
1496
1495 This hook should be used sparingly, only in places which are not likely
1497 This hook should be used sparingly, only in places which are not likely
1496 to be true IPython errors.
1498 to be true IPython errors.
1497 """
1499 """
1498 self.showtraceback((etype,value,tb),tb_offset=0)
1500 self.showtraceback((etype,value,tb),tb_offset=0)
1499
1501
1500 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1502 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None,
1501 exception_only=False):
1503 exception_only=False):
1502 """Display the exception that just occurred.
1504 """Display the exception that just occurred.
1503
1505
1504 If nothing is known about the exception, this is the method which
1506 If nothing is known about the exception, this is the method which
1505 should be used throughout the code for presenting user tracebacks,
1507 should be used throughout the code for presenting user tracebacks,
1506 rather than directly invoking the InteractiveTB object.
1508 rather than directly invoking the InteractiveTB object.
1507
1509
1508 A specific showsyntaxerror() also exists, but this method can take
1510 A specific showsyntaxerror() also exists, but this method can take
1509 care of calling it if needed, so unless you are explicitly catching a
1511 care of calling it if needed, so unless you are explicitly catching a
1510 SyntaxError exception, don't try to analyze the stack manually and
1512 SyntaxError exception, don't try to analyze the stack manually and
1511 simply call this method."""
1513 simply call this method."""
1512
1514
1513 try:
1515 try:
1514 if exc_tuple is None:
1516 if exc_tuple is None:
1515 etype, value, tb = sys.exc_info()
1517 etype, value, tb = sys.exc_info()
1516 else:
1518 else:
1517 etype, value, tb = exc_tuple
1519 etype, value, tb = exc_tuple
1518
1520
1519 if etype is None:
1521 if etype is None:
1520 if hasattr(sys, 'last_type'):
1522 if hasattr(sys, 'last_type'):
1521 etype, value, tb = sys.last_type, sys.last_value, \
1523 etype, value, tb = sys.last_type, sys.last_value, \
1522 sys.last_traceback
1524 sys.last_traceback
1523 else:
1525 else:
1524 self.write_err('No traceback available to show.\n')
1526 self.write_err('No traceback available to show.\n')
1525 return
1527 return
1526
1528
1527 if etype is SyntaxError:
1529 if etype is SyntaxError:
1528 # Though this won't be called by syntax errors in the input
1530 # Though this won't be called by syntax errors in the input
1529 # line, there may be SyntaxError cases whith imported code.
1531 # line, there may be SyntaxError cases whith imported code.
1530 self.showsyntaxerror(filename)
1532 self.showsyntaxerror(filename)
1531 elif etype is UsageError:
1533 elif etype is UsageError:
1532 print "UsageError:", value
1534 print "UsageError:", value
1533 else:
1535 else:
1534 # WARNING: these variables are somewhat deprecated and not
1536 # WARNING: these variables are somewhat deprecated and not
1535 # necessarily safe to use in a threaded environment, but tools
1537 # necessarily safe to use in a threaded environment, but tools
1536 # like pdb depend on their existence, so let's set them. If we
1538 # like pdb depend on their existence, so let's set them. If we
1537 # find problems in the field, we'll need to revisit their use.
1539 # find problems in the field, we'll need to revisit their use.
1538 sys.last_type = etype
1540 sys.last_type = etype
1539 sys.last_value = value
1541 sys.last_value = value
1540 sys.last_traceback = tb
1542 sys.last_traceback = tb
1541 if etype in self.custom_exceptions:
1543 if etype in self.custom_exceptions:
1542 # FIXME: Old custom traceback objects may just return a
1544 # FIXME: Old custom traceback objects may just return a
1543 # string, in that case we just put it into a list
1545 # string, in that case we just put it into a list
1544 stb = self.CustomTB(etype, value, tb, tb_offset)
1546 stb = self.CustomTB(etype, value, tb, tb_offset)
1545 if isinstance(ctb, basestring):
1547 if isinstance(ctb, basestring):
1546 stb = [stb]
1548 stb = [stb]
1547 else:
1549 else:
1548 if exception_only:
1550 if exception_only:
1549 stb = ['An exception has occurred, use %tb to see '
1551 stb = ['An exception has occurred, use %tb to see '
1550 'the full traceback.\n']
1552 'the full traceback.\n']
1551 stb.extend(self.InteractiveTB.get_exception_only(etype,
1553 stb.extend(self.InteractiveTB.get_exception_only(etype,
1552 value))
1554 value))
1553 else:
1555 else:
1554 stb = self.InteractiveTB.structured_traceback(etype,
1556 stb = self.InteractiveTB.structured_traceback(etype,
1555 value, tb, tb_offset=tb_offset)
1557 value, tb, tb_offset=tb_offset)
1556
1558
1557 if self.call_pdb:
1559 if self.call_pdb:
1558 # drop into debugger
1560 # drop into debugger
1559 self.debugger(force=True)
1561 self.debugger(force=True)
1560
1562
1561 # Actually show the traceback
1563 # Actually show the traceback
1562 self._showtraceback(etype, value, stb)
1564 self._showtraceback(etype, value, stb)
1563
1565
1564 except KeyboardInterrupt:
1566 except KeyboardInterrupt:
1565 self.write_err("\nKeyboardInterrupt\n")
1567 self.write_err("\nKeyboardInterrupt\n")
1566
1568
1567 def _showtraceback(self, etype, evalue, stb):
1569 def _showtraceback(self, etype, evalue, stb):
1568 """Actually show a traceback.
1570 """Actually show a traceback.
1569
1571
1570 Subclasses may override this method to put the traceback on a different
1572 Subclasses may override this method to put the traceback on a different
1571 place, like a side channel.
1573 place, like a side channel.
1572 """
1574 """
1573 print >> io.stdout, self.InteractiveTB.stb2text(stb)
1575 print >> io.stdout, self.InteractiveTB.stb2text(stb)
1574
1576
1575 def showsyntaxerror(self, filename=None):
1577 def showsyntaxerror(self, filename=None):
1576 """Display the syntax error that just occurred.
1578 """Display the syntax error that just occurred.
1577
1579
1578 This doesn't display a stack trace because there isn't one.
1580 This doesn't display a stack trace because there isn't one.
1579
1581
1580 If a filename is given, it is stuffed in the exception instead
1582 If a filename is given, it is stuffed in the exception instead
1581 of what was there before (because Python's parser always uses
1583 of what was there before (because Python's parser always uses
1582 "<string>" when reading from a string).
1584 "<string>" when reading from a string).
1583 """
1585 """
1584 etype, value, last_traceback = sys.exc_info()
1586 etype, value, last_traceback = sys.exc_info()
1585
1587
1586 # See note about these variables in showtraceback() above
1588 # See note about these variables in showtraceback() above
1587 sys.last_type = etype
1589 sys.last_type = etype
1588 sys.last_value = value
1590 sys.last_value = value
1589 sys.last_traceback = last_traceback
1591 sys.last_traceback = last_traceback
1590
1592
1591 if filename and etype is SyntaxError:
1593 if filename and etype is SyntaxError:
1592 # Work hard to stuff the correct filename in the exception
1594 # Work hard to stuff the correct filename in the exception
1593 try:
1595 try:
1594 msg, (dummy_filename, lineno, offset, line) = value
1596 msg, (dummy_filename, lineno, offset, line) = value
1595 except:
1597 except:
1596 # Not the format we expect; leave it alone
1598 # Not the format we expect; leave it alone
1597 pass
1599 pass
1598 else:
1600 else:
1599 # Stuff in the right filename
1601 # Stuff in the right filename
1600 try:
1602 try:
1601 # Assume SyntaxError is a class exception
1603 # Assume SyntaxError is a class exception
1602 value = SyntaxError(msg, (filename, lineno, offset, line))
1604 value = SyntaxError(msg, (filename, lineno, offset, line))
1603 except:
1605 except:
1604 # If that failed, assume SyntaxError is a string
1606 # If that failed, assume SyntaxError is a string
1605 value = msg, (filename, lineno, offset, line)
1607 value = msg, (filename, lineno, offset, line)
1606 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1608 stb = self.SyntaxTB.structured_traceback(etype, value, [])
1607 self._showtraceback(etype, value, stb)
1609 self._showtraceback(etype, value, stb)
1608
1610
1609 # This is overridden in TerminalInteractiveShell to show a message about
1611 # This is overridden in TerminalInteractiveShell to show a message about
1610 # the %paste magic.
1612 # the %paste magic.
1611 def showindentationerror(self):
1613 def showindentationerror(self):
1612 """Called by run_cell when there's an IndentationError in code entered
1614 """Called by run_cell when there's an IndentationError in code entered
1613 at the prompt.
1615 at the prompt.
1614
1616
1615 This is overridden in TerminalInteractiveShell to show a message about
1617 This is overridden in TerminalInteractiveShell to show a message about
1616 the %paste magic."""
1618 the %paste magic."""
1617 self.showsyntaxerror()
1619 self.showsyntaxerror()
1618
1620
1619 #-------------------------------------------------------------------------
1621 #-------------------------------------------------------------------------
1620 # Things related to readline
1622 # Things related to readline
1621 #-------------------------------------------------------------------------
1623 #-------------------------------------------------------------------------
1622
1624
1623 def init_readline(self):
1625 def init_readline(self):
1624 """Command history completion/saving/reloading."""
1626 """Command history completion/saving/reloading."""
1625
1627
1626 if self.readline_use:
1628 if self.readline_use:
1627 import IPython.utils.rlineimpl as readline
1629 import IPython.utils.rlineimpl as readline
1628
1630
1629 self.rl_next_input = None
1631 self.rl_next_input = None
1630 self.rl_do_indent = False
1632 self.rl_do_indent = False
1631
1633
1632 if not self.readline_use or not readline.have_readline:
1634 if not self.readline_use or not readline.have_readline:
1633 self.has_readline = False
1635 self.has_readline = False
1634 self.readline = None
1636 self.readline = None
1635 # Set a number of methods that depend on readline to be no-op
1637 # Set a number of methods that depend on readline to be no-op
1636 self.set_readline_completer = no_op
1638 self.set_readline_completer = no_op
1637 self.set_custom_completer = no_op
1639 self.set_custom_completer = no_op
1638 self.set_completer_frame = no_op
1640 self.set_completer_frame = no_op
1639 warn('Readline services not available or not loaded.')
1641 warn('Readline services not available or not loaded.')
1640 else:
1642 else:
1641 self.has_readline = True
1643 self.has_readline = True
1642 self.readline = readline
1644 self.readline = readline
1643 sys.modules['readline'] = readline
1645 sys.modules['readline'] = readline
1644
1646
1645 # Platform-specific configuration
1647 # Platform-specific configuration
1646 if os.name == 'nt':
1648 if os.name == 'nt':
1647 # FIXME - check with Frederick to see if we can harmonize
1649 # FIXME - check with Frederick to see if we can harmonize
1648 # naming conventions with pyreadline to avoid this
1650 # naming conventions with pyreadline to avoid this
1649 # platform-dependent check
1651 # platform-dependent check
1650 self.readline_startup_hook = readline.set_pre_input_hook
1652 self.readline_startup_hook = readline.set_pre_input_hook
1651 else:
1653 else:
1652 self.readline_startup_hook = readline.set_startup_hook
1654 self.readline_startup_hook = readline.set_startup_hook
1653
1655
1654 # Load user's initrc file (readline config)
1656 # Load user's initrc file (readline config)
1655 # Or if libedit is used, load editrc.
1657 # Or if libedit is used, load editrc.
1656 inputrc_name = os.environ.get('INPUTRC')
1658 inputrc_name = os.environ.get('INPUTRC')
1657 if inputrc_name is None:
1659 if inputrc_name is None:
1658 home_dir = get_home_dir()
1660 home_dir = get_home_dir()
1659 if home_dir is not None:
1661 if home_dir is not None:
1660 inputrc_name = '.inputrc'
1662 inputrc_name = '.inputrc'
1661 if readline.uses_libedit:
1663 if readline.uses_libedit:
1662 inputrc_name = '.editrc'
1664 inputrc_name = '.editrc'
1663 inputrc_name = os.path.join(home_dir, inputrc_name)
1665 inputrc_name = os.path.join(home_dir, inputrc_name)
1664 if os.path.isfile(inputrc_name):
1666 if os.path.isfile(inputrc_name):
1665 try:
1667 try:
1666 readline.read_init_file(inputrc_name)
1668 readline.read_init_file(inputrc_name)
1667 except:
1669 except:
1668 warn('Problems reading readline initialization file <%s>'
1670 warn('Problems reading readline initialization file <%s>'
1669 % inputrc_name)
1671 % inputrc_name)
1670
1672
1671 # Configure readline according to user's prefs
1673 # Configure readline according to user's prefs
1672 # This is only done if GNU readline is being used. If libedit
1674 # This is only done if GNU readline is being used. If libedit
1673 # is being used (as on Leopard) the readline config is
1675 # is being used (as on Leopard) the readline config is
1674 # not run as the syntax for libedit is different.
1676 # not run as the syntax for libedit is different.
1675 if not readline.uses_libedit:
1677 if not readline.uses_libedit:
1676 for rlcommand in self.readline_parse_and_bind:
1678 for rlcommand in self.readline_parse_and_bind:
1677 #print "loading rl:",rlcommand # dbg
1679 #print "loading rl:",rlcommand # dbg
1678 readline.parse_and_bind(rlcommand)
1680 readline.parse_and_bind(rlcommand)
1679
1681
1680 # Remove some chars from the delimiters list. If we encounter
1682 # Remove some chars from the delimiters list. If we encounter
1681 # unicode chars, discard them.
1683 # unicode chars, discard them.
1682 delims = readline.get_completer_delims().encode("ascii", "ignore")
1684 delims = readline.get_completer_delims().encode("ascii", "ignore")
1683 for d in self.readline_remove_delims:
1685 for d in self.readline_remove_delims:
1684 delims = delims.replace(d, "")
1686 delims = delims.replace(d, "")
1685 delims = delims.replace(ESC_MAGIC, '')
1687 delims = delims.replace(ESC_MAGIC, '')
1686 readline.set_completer_delims(delims)
1688 readline.set_completer_delims(delims)
1687 # otherwise we end up with a monster history after a while:
1689 # otherwise we end up with a monster history after a while:
1688 readline.set_history_length(self.history_length)
1690 readline.set_history_length(self.history_length)
1689
1691
1690 self.refill_readline_hist()
1692 self.refill_readline_hist()
1691 self.readline_no_record = ReadlineNoRecord(self)
1693 self.readline_no_record = ReadlineNoRecord(self)
1692
1694
1693 # Configure auto-indent for all platforms
1695 # Configure auto-indent for all platforms
1694 self.set_autoindent(self.autoindent)
1696 self.set_autoindent(self.autoindent)
1695
1697
1696 def refill_readline_hist(self):
1698 def refill_readline_hist(self):
1697 # Load the last 1000 lines from history
1699 # Load the last 1000 lines from history
1698 self.readline.clear_history()
1700 self.readline.clear_history()
1699 stdin_encoding = sys.stdin.encoding or "utf-8"
1701 stdin_encoding = sys.stdin.encoding or "utf-8"
1700 for _, _, cell in self.history_manager.get_tail(1000,
1702 for _, _, cell in self.history_manager.get_tail(1000,
1701 include_latest=True):
1703 include_latest=True):
1702 if cell.strip(): # Ignore blank lines
1704 if cell.strip(): # Ignore blank lines
1703 for line in cell.splitlines():
1705 for line in cell.splitlines():
1704 self.readline.add_history(line.encode(stdin_encoding, 'replace'))
1706 self.readline.add_history(py3compat.unicode_to_str(line,
1707 stdin_encoding))
1705
1708
1706 def set_next_input(self, s):
1709 def set_next_input(self, s):
1707 """ Sets the 'default' input string for the next command line.
1710 """ Sets the 'default' input string for the next command line.
1708
1711
1709 Requires readline.
1712 Requires readline.
1710
1713
1711 Example:
1714 Example:
1712
1715
1713 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1716 [D:\ipython]|1> _ip.set_next_input("Hello Word")
1714 [D:\ipython]|2> Hello Word_ # cursor is here
1717 [D:\ipython]|2> Hello Word_ # cursor is here
1715 """
1718 """
1716 if isinstance(s, unicode):
1719 if isinstance(s, unicode):
1717 s = s.encode(self.stdin_encoding, 'replace')
1720 s = s.encode(self.stdin_encoding, 'replace')
1718 self.rl_next_input = s
1721 self.rl_next_input = s
1719
1722
1720 # Maybe move this to the terminal subclass?
1723 # Maybe move this to the terminal subclass?
1721 def pre_readline(self):
1724 def pre_readline(self):
1722 """readline hook to be used at the start of each line.
1725 """readline hook to be used at the start of each line.
1723
1726
1724 Currently it handles auto-indent only."""
1727 Currently it handles auto-indent only."""
1725
1728
1726 if self.rl_do_indent:
1729 if self.rl_do_indent:
1727 self.readline.insert_text(self._indent_current_str())
1730 self.readline.insert_text(self._indent_current_str())
1728 if self.rl_next_input is not None:
1731 if self.rl_next_input is not None:
1729 self.readline.insert_text(self.rl_next_input)
1732 self.readline.insert_text(self.rl_next_input)
1730 self.rl_next_input = None
1733 self.rl_next_input = None
1731
1734
1732 def _indent_current_str(self):
1735 def _indent_current_str(self):
1733 """return the current level of indentation as a string"""
1736 """return the current level of indentation as a string"""
1734 return self.input_splitter.indent_spaces * ' '
1737 return self.input_splitter.indent_spaces * ' '
1735
1738
1736 #-------------------------------------------------------------------------
1739 #-------------------------------------------------------------------------
1737 # Things related to text completion
1740 # Things related to text completion
1738 #-------------------------------------------------------------------------
1741 #-------------------------------------------------------------------------
1739
1742
1740 def init_completer(self):
1743 def init_completer(self):
1741 """Initialize the completion machinery.
1744 """Initialize the completion machinery.
1742
1745
1743 This creates completion machinery that can be used by client code,
1746 This creates completion machinery that can be used by client code,
1744 either interactively in-process (typically triggered by the readline
1747 either interactively in-process (typically triggered by the readline
1745 library), programatically (such as in test suites) or out-of-prcess
1748 library), programatically (such as in test suites) or out-of-prcess
1746 (typically over the network by remote frontends).
1749 (typically over the network by remote frontends).
1747 """
1750 """
1748 from IPython.core.completer import IPCompleter
1751 from IPython.core.completer import IPCompleter
1749 from IPython.core.completerlib import (module_completer,
1752 from IPython.core.completerlib import (module_completer,
1750 magic_run_completer, cd_completer)
1753 magic_run_completer, cd_completer)
1751
1754
1752 self.Completer = IPCompleter(self,
1755 self.Completer = IPCompleter(self,
1753 self.user_ns,
1756 self.user_ns,
1754 self.user_global_ns,
1757 self.user_global_ns,
1755 self.readline_omit__names,
1758 self.readline_omit__names,
1756 self.alias_manager.alias_table,
1759 self.alias_manager.alias_table,
1757 self.has_readline)
1760 self.has_readline)
1758
1761
1759 # Add custom completers to the basic ones built into IPCompleter
1762 # Add custom completers to the basic ones built into IPCompleter
1760 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1763 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1761 self.strdispatchers['complete_command'] = sdisp
1764 self.strdispatchers['complete_command'] = sdisp
1762 self.Completer.custom_completers = sdisp
1765 self.Completer.custom_completers = sdisp
1763
1766
1764 self.set_hook('complete_command', module_completer, str_key = 'import')
1767 self.set_hook('complete_command', module_completer, str_key = 'import')
1765 self.set_hook('complete_command', module_completer, str_key = 'from')
1768 self.set_hook('complete_command', module_completer, str_key = 'from')
1766 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1769 self.set_hook('complete_command', magic_run_completer, str_key = '%run')
1767 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1770 self.set_hook('complete_command', cd_completer, str_key = '%cd')
1768
1771
1769 # Only configure readline if we truly are using readline. IPython can
1772 # Only configure readline if we truly are using readline. IPython can
1770 # do tab-completion over the network, in GUIs, etc, where readline
1773 # do tab-completion over the network, in GUIs, etc, where readline
1771 # itself may be absent
1774 # itself may be absent
1772 if self.has_readline:
1775 if self.has_readline:
1773 self.set_readline_completer()
1776 self.set_readline_completer()
1774
1777
1775 def complete(self, text, line=None, cursor_pos=None):
1778 def complete(self, text, line=None, cursor_pos=None):
1776 """Return the completed text and a list of completions.
1779 """Return the completed text and a list of completions.
1777
1780
1778 Parameters
1781 Parameters
1779 ----------
1782 ----------
1780
1783
1781 text : string
1784 text : string
1782 A string of text to be completed on. It can be given as empty and
1785 A string of text to be completed on. It can be given as empty and
1783 instead a line/position pair are given. In this case, the
1786 instead a line/position pair are given. In this case, the
1784 completer itself will split the line like readline does.
1787 completer itself will split the line like readline does.
1785
1788
1786 line : string, optional
1789 line : string, optional
1787 The complete line that text is part of.
1790 The complete line that text is part of.
1788
1791
1789 cursor_pos : int, optional
1792 cursor_pos : int, optional
1790 The position of the cursor on the input line.
1793 The position of the cursor on the input line.
1791
1794
1792 Returns
1795 Returns
1793 -------
1796 -------
1794 text : string
1797 text : string
1795 The actual text that was completed.
1798 The actual text that was completed.
1796
1799
1797 matches : list
1800 matches : list
1798 A sorted list with all possible completions.
1801 A sorted list with all possible completions.
1799
1802
1800 The optional arguments allow the completion to take more context into
1803 The optional arguments allow the completion to take more context into
1801 account, and are part of the low-level completion API.
1804 account, and are part of the low-level completion API.
1802
1805
1803 This is a wrapper around the completion mechanism, similar to what
1806 This is a wrapper around the completion mechanism, similar to what
1804 readline does at the command line when the TAB key is hit. By
1807 readline does at the command line when the TAB key is hit. By
1805 exposing it as a method, it can be used by other non-readline
1808 exposing it as a method, it can be used by other non-readline
1806 environments (such as GUIs) for text completion.
1809 environments (such as GUIs) for text completion.
1807
1810
1808 Simple usage example:
1811 Simple usage example:
1809
1812
1810 In [1]: x = 'hello'
1813 In [1]: x = 'hello'
1811
1814
1812 In [2]: _ip.complete('x.l')
1815 In [2]: _ip.complete('x.l')
1813 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1816 Out[2]: ('x.l', ['x.ljust', 'x.lower', 'x.lstrip'])
1814 """
1817 """
1815
1818
1816 # Inject names into __builtin__ so we can complete on the added names.
1819 # Inject names into __builtin__ so we can complete on the added names.
1817 with self.builtin_trap:
1820 with self.builtin_trap:
1818 return self.Completer.complete(text, line, cursor_pos)
1821 return self.Completer.complete(text, line, cursor_pos)
1819
1822
1820 def set_custom_completer(self, completer, pos=0):
1823 def set_custom_completer(self, completer, pos=0):
1821 """Adds a new custom completer function.
1824 """Adds a new custom completer function.
1822
1825
1823 The position argument (defaults to 0) is the index in the completers
1826 The position argument (defaults to 0) is the index in the completers
1824 list where you want the completer to be inserted."""
1827 list where you want the completer to be inserted."""
1825
1828
1826 newcomp = types.MethodType(completer,self.Completer)
1829 newcomp = types.MethodType(completer,self.Completer)
1827 self.Completer.matchers.insert(pos,newcomp)
1830 self.Completer.matchers.insert(pos,newcomp)
1828
1831
1829 def set_readline_completer(self):
1832 def set_readline_completer(self):
1830 """Reset readline's completer to be our own."""
1833 """Reset readline's completer to be our own."""
1831 self.readline.set_completer(self.Completer.rlcomplete)
1834 self.readline.set_completer(self.Completer.rlcomplete)
1832
1835
1833 def set_completer_frame(self, frame=None):
1836 def set_completer_frame(self, frame=None):
1834 """Set the frame of the completer."""
1837 """Set the frame of the completer."""
1835 if frame:
1838 if frame:
1836 self.Completer.namespace = frame.f_locals
1839 self.Completer.namespace = frame.f_locals
1837 self.Completer.global_namespace = frame.f_globals
1840 self.Completer.global_namespace = frame.f_globals
1838 else:
1841 else:
1839 self.Completer.namespace = self.user_ns
1842 self.Completer.namespace = self.user_ns
1840 self.Completer.global_namespace = self.user_global_ns
1843 self.Completer.global_namespace = self.user_global_ns
1841
1844
1842 #-------------------------------------------------------------------------
1845 #-------------------------------------------------------------------------
1843 # Things related to magics
1846 # Things related to magics
1844 #-------------------------------------------------------------------------
1847 #-------------------------------------------------------------------------
1845
1848
1846 def init_magics(self):
1849 def init_magics(self):
1847 # FIXME: Move the color initialization to the DisplayHook, which
1850 # FIXME: Move the color initialization to the DisplayHook, which
1848 # should be split into a prompt manager and displayhook. We probably
1851 # should be split into a prompt manager and displayhook. We probably
1849 # even need a centralize colors management object.
1852 # even need a centralize colors management object.
1850 self.magic_colors(self.colors)
1853 self.magic_colors(self.colors)
1851 # History was moved to a separate module
1854 # History was moved to a separate module
1852 from . import history
1855 from . import history
1853 history.init_ipython(self)
1856 history.init_ipython(self)
1854
1857
1855 def magic(self, arg_s, next_input=None):
1858 def magic(self, arg_s, next_input=None):
1856 """Call a magic function by name.
1859 """Call a magic function by name.
1857
1860
1858 Input: a string containing the name of the magic function to call and
1861 Input: a string containing the name of the magic function to call and
1859 any additional arguments to be passed to the magic.
1862 any additional arguments to be passed to the magic.
1860
1863
1861 magic('name -opt foo bar') is equivalent to typing at the ipython
1864 magic('name -opt foo bar') is equivalent to typing at the ipython
1862 prompt:
1865 prompt:
1863
1866
1864 In[1]: %name -opt foo bar
1867 In[1]: %name -opt foo bar
1865
1868
1866 To call a magic without arguments, simply use magic('name').
1869 To call a magic without arguments, simply use magic('name').
1867
1870
1868 This provides a proper Python function to call IPython's magics in any
1871 This provides a proper Python function to call IPython's magics in any
1869 valid Python code you can type at the interpreter, including loops and
1872 valid Python code you can type at the interpreter, including loops and
1870 compound statements.
1873 compound statements.
1871 """
1874 """
1872 # Allow setting the next input - this is used if the user does `a=abs?`.
1875 # Allow setting the next input - this is used if the user does `a=abs?`.
1873 # We do this first so that magic functions can override it.
1876 # We do this first so that magic functions can override it.
1874 if next_input:
1877 if next_input:
1875 self.set_next_input(next_input)
1878 self.set_next_input(next_input)
1876
1879
1877 args = arg_s.split(' ',1)
1880 args = arg_s.split(' ',1)
1878 magic_name = args[0]
1881 magic_name = args[0]
1879 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
1882 magic_name = magic_name.lstrip(prefilter.ESC_MAGIC)
1880
1883
1881 try:
1884 try:
1882 magic_args = args[1]
1885 magic_args = args[1]
1883 except IndexError:
1886 except IndexError:
1884 magic_args = ''
1887 magic_args = ''
1885 fn = getattr(self,'magic_'+magic_name,None)
1888 fn = getattr(self,'magic_'+magic_name,None)
1886 if fn is None:
1889 if fn is None:
1887 error("Magic function `%s` not found." % magic_name)
1890 error("Magic function `%s` not found." % magic_name)
1888 else:
1891 else:
1889 magic_args = self.var_expand(magic_args,1)
1892 magic_args = self.var_expand(magic_args,1)
1890 # Grab local namespace if we need it:
1893 # Grab local namespace if we need it:
1891 if getattr(fn, "needs_local_scope", False):
1894 if getattr(fn, "needs_local_scope", False):
1892 self._magic_locals = sys._getframe(1).f_locals
1895 self._magic_locals = sys._getframe(1).f_locals
1893 with self.builtin_trap:
1896 with self.builtin_trap:
1894 result = fn(magic_args)
1897 result = fn(magic_args)
1895 # Ensure we're not keeping object references around:
1898 # Ensure we're not keeping object references around:
1896 self._magic_locals = {}
1899 self._magic_locals = {}
1897 return result
1900 return result
1898
1901
1899 def define_magic(self, magicname, func):
1902 def define_magic(self, magicname, func):
1900 """Expose own function as magic function for ipython
1903 """Expose own function as magic function for ipython
1901
1904
1902 def foo_impl(self,parameter_s=''):
1905 def foo_impl(self,parameter_s=''):
1903 'My very own magic!. (Use docstrings, IPython reads them).'
1906 'My very own magic!. (Use docstrings, IPython reads them).'
1904 print 'Magic function. Passed parameter is between < >:'
1907 print 'Magic function. Passed parameter is between < >:'
1905 print '<%s>' % parameter_s
1908 print '<%s>' % parameter_s
1906 print 'The self object is:',self
1909 print 'The self object is:',self
1907
1910
1908 self.define_magic('foo',foo_impl)
1911 self.define_magic('foo',foo_impl)
1909 """
1912 """
1910
1911 import new
1912 im = types.MethodType(func,self)
1913 im = types.MethodType(func,self)
1913 old = getattr(self, "magic_" + magicname, None)
1914 old = getattr(self, "magic_" + magicname, None)
1914 setattr(self, "magic_" + magicname, im)
1915 setattr(self, "magic_" + magicname, im)
1915 return old
1916 return old
1916
1917
1917 #-------------------------------------------------------------------------
1918 #-------------------------------------------------------------------------
1918 # Things related to macros
1919 # Things related to macros
1919 #-------------------------------------------------------------------------
1920 #-------------------------------------------------------------------------
1920
1921
1921 def define_macro(self, name, themacro):
1922 def define_macro(self, name, themacro):
1922 """Define a new macro
1923 """Define a new macro
1923
1924
1924 Parameters
1925 Parameters
1925 ----------
1926 ----------
1926 name : str
1927 name : str
1927 The name of the macro.
1928 The name of the macro.
1928 themacro : str or Macro
1929 themacro : str or Macro
1929 The action to do upon invoking the macro. If a string, a new
1930 The action to do upon invoking the macro. If a string, a new
1930 Macro object is created by passing the string to it.
1931 Macro object is created by passing the string to it.
1931 """
1932 """
1932
1933
1933 from IPython.core import macro
1934 from IPython.core import macro
1934
1935
1935 if isinstance(themacro, basestring):
1936 if isinstance(themacro, basestring):
1936 themacro = macro.Macro(themacro)
1937 themacro = macro.Macro(themacro)
1937 if not isinstance(themacro, macro.Macro):
1938 if not isinstance(themacro, macro.Macro):
1938 raise ValueError('A macro must be a string or a Macro instance.')
1939 raise ValueError('A macro must be a string or a Macro instance.')
1939 self.user_ns[name] = themacro
1940 self.user_ns[name] = themacro
1940
1941
1941 #-------------------------------------------------------------------------
1942 #-------------------------------------------------------------------------
1942 # Things related to the running of system commands
1943 # Things related to the running of system commands
1943 #-------------------------------------------------------------------------
1944 #-------------------------------------------------------------------------
1944
1945
1945 def system_piped(self, cmd):
1946 def system_piped(self, cmd):
1946 """Call the given cmd in a subprocess, piping stdout/err
1947 """Call the given cmd in a subprocess, piping stdout/err
1947
1948
1948 Parameters
1949 Parameters
1949 ----------
1950 ----------
1950 cmd : str
1951 cmd : str
1951 Command to execute (can not end in '&', as background processes are
1952 Command to execute (can not end in '&', as background processes are
1952 not supported. Should not be a command that expects input
1953 not supported. Should not be a command that expects input
1953 other than simple text.
1954 other than simple text.
1954 """
1955 """
1955 if cmd.rstrip().endswith('&'):
1956 if cmd.rstrip().endswith('&'):
1956 # this is *far* from a rigorous test
1957 # this is *far* from a rigorous test
1957 # We do not support backgrounding processes because we either use
1958 # We do not support backgrounding processes because we either use
1958 # pexpect or pipes to read from. Users can always just call
1959 # pexpect or pipes to read from. Users can always just call
1959 # os.system() or use ip.system=ip.system_raw
1960 # os.system() or use ip.system=ip.system_raw
1960 # if they really want a background process.
1961 # if they really want a background process.
1961 raise OSError("Background processes not supported.")
1962 raise OSError("Background processes not supported.")
1962
1963
1963 # we explicitly do NOT return the subprocess status code, because
1964 # we explicitly do NOT return the subprocess status code, because
1964 # a non-None value would trigger :func:`sys.displayhook` calls.
1965 # a non-None value would trigger :func:`sys.displayhook` calls.
1965 # Instead, we store the exit_code in user_ns.
1966 # Instead, we store the exit_code in user_ns.
1966 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=2))
1967 self.user_ns['_exit_code'] = system(self.var_expand(cmd, depth=2))
1967
1968
1968 def system_raw(self, cmd):
1969 def system_raw(self, cmd):
1969 """Call the given cmd in a subprocess using os.system
1970 """Call the given cmd in a subprocess using os.system
1970
1971
1971 Parameters
1972 Parameters
1972 ----------
1973 ----------
1973 cmd : str
1974 cmd : str
1974 Command to execute.
1975 Command to execute.
1975 """
1976 """
1976 # We explicitly do NOT return the subprocess status code, because
1977 # We explicitly do NOT return the subprocess status code, because
1977 # a non-None value would trigger :func:`sys.displayhook` calls.
1978 # a non-None value would trigger :func:`sys.displayhook` calls.
1978 # Instead, we store the exit_code in user_ns.
1979 # Instead, we store the exit_code in user_ns.
1979 self.user_ns['_exit_code'] = os.system(self.var_expand(cmd, depth=2))
1980 self.user_ns['_exit_code'] = os.system(self.var_expand(cmd, depth=2))
1980
1981
1981 # use piped system by default, because it is better behaved
1982 # use piped system by default, because it is better behaved
1982 system = system_piped
1983 system = system_piped
1983
1984
1984 def getoutput(self, cmd, split=True):
1985 def getoutput(self, cmd, split=True):
1985 """Get output (possibly including stderr) from a subprocess.
1986 """Get output (possibly including stderr) from a subprocess.
1986
1987
1987 Parameters
1988 Parameters
1988 ----------
1989 ----------
1989 cmd : str
1990 cmd : str
1990 Command to execute (can not end in '&', as background processes are
1991 Command to execute (can not end in '&', as background processes are
1991 not supported.
1992 not supported.
1992 split : bool, optional
1993 split : bool, optional
1993
1994
1994 If True, split the output into an IPython SList. Otherwise, an
1995 If True, split the output into an IPython SList. Otherwise, an
1995 IPython LSString is returned. These are objects similar to normal
1996 IPython LSString is returned. These are objects similar to normal
1996 lists and strings, with a few convenience attributes for easier
1997 lists and strings, with a few convenience attributes for easier
1997 manipulation of line-based output. You can use '?' on them for
1998 manipulation of line-based output. You can use '?' on them for
1998 details.
1999 details.
1999 """
2000 """
2000 if cmd.rstrip().endswith('&'):
2001 if cmd.rstrip().endswith('&'):
2001 # this is *far* from a rigorous test
2002 # this is *far* from a rigorous test
2002 raise OSError("Background processes not supported.")
2003 raise OSError("Background processes not supported.")
2003 out = getoutput(self.var_expand(cmd, depth=2))
2004 out = getoutput(self.var_expand(cmd, depth=2))
2004 if split:
2005 if split:
2005 out = SList(out.splitlines())
2006 out = SList(out.splitlines())
2006 else:
2007 else:
2007 out = LSString(out)
2008 out = LSString(out)
2008 return out
2009 return out
2009
2010
2010 #-------------------------------------------------------------------------
2011 #-------------------------------------------------------------------------
2011 # Things related to aliases
2012 # Things related to aliases
2012 #-------------------------------------------------------------------------
2013 #-------------------------------------------------------------------------
2013
2014
2014 def init_alias(self):
2015 def init_alias(self):
2015 self.alias_manager = AliasManager(shell=self, config=self.config)
2016 self.alias_manager = AliasManager(shell=self, config=self.config)
2016 self.ns_table['alias'] = self.alias_manager.alias_table,
2017 self.ns_table['alias'] = self.alias_manager.alias_table,
2017
2018
2018 #-------------------------------------------------------------------------
2019 #-------------------------------------------------------------------------
2019 # Things related to extensions and plugins
2020 # Things related to extensions and plugins
2020 #-------------------------------------------------------------------------
2021 #-------------------------------------------------------------------------
2021
2022
2022 def init_extension_manager(self):
2023 def init_extension_manager(self):
2023 self.extension_manager = ExtensionManager(shell=self, config=self.config)
2024 self.extension_manager = ExtensionManager(shell=self, config=self.config)
2024
2025
2025 def init_plugin_manager(self):
2026 def init_plugin_manager(self):
2026 self.plugin_manager = PluginManager(config=self.config)
2027 self.plugin_manager = PluginManager(config=self.config)
2027
2028
2028 #-------------------------------------------------------------------------
2029 #-------------------------------------------------------------------------
2029 # Things related to payloads
2030 # Things related to payloads
2030 #-------------------------------------------------------------------------
2031 #-------------------------------------------------------------------------
2031
2032
2032 def init_payload(self):
2033 def init_payload(self):
2033 self.payload_manager = PayloadManager(config=self.config)
2034 self.payload_manager = PayloadManager(config=self.config)
2034
2035
2035 #-------------------------------------------------------------------------
2036 #-------------------------------------------------------------------------
2036 # Things related to the prefilter
2037 # Things related to the prefilter
2037 #-------------------------------------------------------------------------
2038 #-------------------------------------------------------------------------
2038
2039
2039 def init_prefilter(self):
2040 def init_prefilter(self):
2040 self.prefilter_manager = PrefilterManager(shell=self, config=self.config)
2041 self.prefilter_manager = PrefilterManager(shell=self, config=self.config)
2041 # Ultimately this will be refactored in the new interpreter code, but
2042 # Ultimately this will be refactored in the new interpreter code, but
2042 # for now, we should expose the main prefilter method (there's legacy
2043 # for now, we should expose the main prefilter method (there's legacy
2043 # code out there that may rely on this).
2044 # code out there that may rely on this).
2044 self.prefilter = self.prefilter_manager.prefilter_lines
2045 self.prefilter = self.prefilter_manager.prefilter_lines
2045
2046
2046 def auto_rewrite_input(self, cmd):
2047 def auto_rewrite_input(self, cmd):
2047 """Print to the screen the rewritten form of the user's command.
2048 """Print to the screen the rewritten form of the user's command.
2048
2049
2049 This shows visual feedback by rewriting input lines that cause
2050 This shows visual feedback by rewriting input lines that cause
2050 automatic calling to kick in, like::
2051 automatic calling to kick in, like::
2051
2052
2052 /f x
2053 /f x
2053
2054
2054 into::
2055 into::
2055
2056
2056 ------> f(x)
2057 ------> f(x)
2057
2058
2058 after the user's input prompt. This helps the user understand that the
2059 after the user's input prompt. This helps the user understand that the
2059 input line was transformed automatically by IPython.
2060 input line was transformed automatically by IPython.
2060 """
2061 """
2061 rw = self.displayhook.prompt1.auto_rewrite() + cmd
2062 rw = self.displayhook.prompt1.auto_rewrite() + cmd
2062
2063
2063 try:
2064 try:
2064 # plain ascii works better w/ pyreadline, on some machines, so
2065 # plain ascii works better w/ pyreadline, on some machines, so
2065 # we use it and only print uncolored rewrite if we have unicode
2066 # we use it and only print uncolored rewrite if we have unicode
2066 rw = str(rw)
2067 rw = str(rw)
2067 print >> io.stdout, rw
2068 print >> io.stdout, rw
2068 except UnicodeEncodeError:
2069 except UnicodeEncodeError:
2069 print "------> " + cmd
2070 print "------> " + cmd
2070
2071
2071 #-------------------------------------------------------------------------
2072 #-------------------------------------------------------------------------
2072 # Things related to extracting values/expressions from kernel and user_ns
2073 # Things related to extracting values/expressions from kernel and user_ns
2073 #-------------------------------------------------------------------------
2074 #-------------------------------------------------------------------------
2074
2075
2075 def _simple_error(self):
2076 def _simple_error(self):
2076 etype, value = sys.exc_info()[:2]
2077 etype, value = sys.exc_info()[:2]
2077 return u'[ERROR] {e.__name__}: {v}'.format(e=etype, v=value)
2078 return u'[ERROR] {e.__name__}: {v}'.format(e=etype, v=value)
2078
2079
2079 def user_variables(self, names):
2080 def user_variables(self, names):
2080 """Get a list of variable names from the user's namespace.
2081 """Get a list of variable names from the user's namespace.
2081
2082
2082 Parameters
2083 Parameters
2083 ----------
2084 ----------
2084 names : list of strings
2085 names : list of strings
2085 A list of names of variables to be read from the user namespace.
2086 A list of names of variables to be read from the user namespace.
2086
2087
2087 Returns
2088 Returns
2088 -------
2089 -------
2089 A dict, keyed by the input names and with the repr() of each value.
2090 A dict, keyed by the input names and with the repr() of each value.
2090 """
2091 """
2091 out = {}
2092 out = {}
2092 user_ns = self.user_ns
2093 user_ns = self.user_ns
2093 for varname in names:
2094 for varname in names:
2094 try:
2095 try:
2095 value = repr(user_ns[varname])
2096 value = repr(user_ns[varname])
2096 except:
2097 except:
2097 value = self._simple_error()
2098 value = self._simple_error()
2098 out[varname] = value
2099 out[varname] = value
2099 return out
2100 return out
2100
2101
2101 def user_expressions(self, expressions):
2102 def user_expressions(self, expressions):
2102 """Evaluate a dict of expressions in the user's namespace.
2103 """Evaluate a dict of expressions in the user's namespace.
2103
2104
2104 Parameters
2105 Parameters
2105 ----------
2106 ----------
2106 expressions : dict
2107 expressions : dict
2107 A dict with string keys and string values. The expression values
2108 A dict with string keys and string values. The expression values
2108 should be valid Python expressions, each of which will be evaluated
2109 should be valid Python expressions, each of which will be evaluated
2109 in the user namespace.
2110 in the user namespace.
2110
2111
2111 Returns
2112 Returns
2112 -------
2113 -------
2113 A dict, keyed like the input expressions dict, with the repr() of each
2114 A dict, keyed like the input expressions dict, with the repr() of each
2114 value.
2115 value.
2115 """
2116 """
2116 out = {}
2117 out = {}
2117 user_ns = self.user_ns
2118 user_ns = self.user_ns
2118 global_ns = self.user_global_ns
2119 global_ns = self.user_global_ns
2119 for key, expr in expressions.iteritems():
2120 for key, expr in expressions.iteritems():
2120 try:
2121 try:
2121 value = repr(eval(expr, global_ns, user_ns))
2122 value = repr(eval(expr, global_ns, user_ns))
2122 except:
2123 except:
2123 value = self._simple_error()
2124 value = self._simple_error()
2124 out[key] = value
2125 out[key] = value
2125 return out
2126 return out
2126
2127
2127 #-------------------------------------------------------------------------
2128 #-------------------------------------------------------------------------
2128 # Things related to the running of code
2129 # Things related to the running of code
2129 #-------------------------------------------------------------------------
2130 #-------------------------------------------------------------------------
2130
2131
2131 def ex(self, cmd):
2132 def ex(self, cmd):
2132 """Execute a normal python statement in user namespace."""
2133 """Execute a normal python statement in user namespace."""
2133 with self.builtin_trap:
2134 with self.builtin_trap:
2134 exec cmd in self.user_global_ns, self.user_ns
2135 exec cmd in self.user_global_ns, self.user_ns
2135
2136
2136 def ev(self, expr):
2137 def ev(self, expr):
2137 """Evaluate python expression expr in user namespace.
2138 """Evaluate python expression expr in user namespace.
2138
2139
2139 Returns the result of evaluation
2140 Returns the result of evaluation
2140 """
2141 """
2141 with self.builtin_trap:
2142 with self.builtin_trap:
2142 return eval(expr, self.user_global_ns, self.user_ns)
2143 return eval(expr, self.user_global_ns, self.user_ns)
2143
2144
2144 def safe_execfile(self, fname, *where, **kw):
2145 def safe_execfile(self, fname, *where, **kw):
2145 """A safe version of the builtin execfile().
2146 """A safe version of the builtin execfile().
2146
2147
2147 This version will never throw an exception, but instead print
2148 This version will never throw an exception, but instead print
2148 helpful error messages to the screen. This only works on pure
2149 helpful error messages to the screen. This only works on pure
2149 Python files with the .py extension.
2150 Python files with the .py extension.
2150
2151
2151 Parameters
2152 Parameters
2152 ----------
2153 ----------
2153 fname : string
2154 fname : string
2154 The name of the file to be executed.
2155 The name of the file to be executed.
2155 where : tuple
2156 where : tuple
2156 One or two namespaces, passed to execfile() as (globals,locals).
2157 One or two namespaces, passed to execfile() as (globals,locals).
2157 If only one is given, it is passed as both.
2158 If only one is given, it is passed as both.
2158 exit_ignore : bool (False)
2159 exit_ignore : bool (False)
2159 If True, then silence SystemExit for non-zero status (it is always
2160 If True, then silence SystemExit for non-zero status (it is always
2160 silenced for zero status, as it is so common).
2161 silenced for zero status, as it is so common).
2161 """
2162 """
2162 kw.setdefault('exit_ignore', False)
2163 kw.setdefault('exit_ignore', False)
2163
2164
2164 fname = os.path.abspath(os.path.expanduser(fname))
2165 fname = os.path.abspath(os.path.expanduser(fname))
2165
2166
2166 # Make sure we can open the file
2167 # Make sure we can open the file
2167 try:
2168 try:
2168 with open(fname) as thefile:
2169 with open(fname) as thefile:
2169 pass
2170 pass
2170 except:
2171 except:
2171 warn('Could not open file <%s> for safe execution.' % fname)
2172 warn('Could not open file <%s> for safe execution.' % fname)
2172 return
2173 return
2173
2174
2174 # Find things also in current directory. This is needed to mimic the
2175 # Find things also in current directory. This is needed to mimic the
2175 # behavior of running a script from the system command line, where
2176 # behavior of running a script from the system command line, where
2176 # Python inserts the script's directory into sys.path
2177 # Python inserts the script's directory into sys.path
2177 dname = os.path.dirname(fname)
2178 dname = os.path.dirname(fname)
2178
2179 if isinstance(fname, unicode):
2180 # execfile uses default encoding instead of filesystem encoding
2181 # so unicode filenames will fail
2182 fname = fname.encode(sys.getfilesystemencoding() or sys.getdefaultencoding())
2183
2179
2184 with prepended_to_syspath(dname):
2180 with prepended_to_syspath(dname):
2185 try:
2181 try:
2186 execfile(fname,*where)
2182 py3compat.execfile(fname,*where)
2187 except SystemExit, status:
2183 except SystemExit, status:
2188 # If the call was made with 0 or None exit status (sys.exit(0)
2184 # If the call was made with 0 or None exit status (sys.exit(0)
2189 # or sys.exit() ), don't bother showing a traceback, as both of
2185 # or sys.exit() ), don't bother showing a traceback, as both of
2190 # these are considered normal by the OS:
2186 # these are considered normal by the OS:
2191 # > python -c'import sys;sys.exit(0)'; echo $?
2187 # > python -c'import sys;sys.exit(0)'; echo $?
2192 # 0
2188 # 0
2193 # > python -c'import sys;sys.exit()'; echo $?
2189 # > python -c'import sys;sys.exit()'; echo $?
2194 # 0
2190 # 0
2195 # For other exit status, we show the exception unless
2191 # For other exit status, we show the exception unless
2196 # explicitly silenced, but only in short form.
2192 # explicitly silenced, but only in short form.
2197 if status.code not in (0, None) and not kw['exit_ignore']:
2193 if status.code not in (0, None) and not kw['exit_ignore']:
2198 self.showtraceback(exception_only=True)
2194 self.showtraceback(exception_only=True)
2199 except:
2195 except:
2200 self.showtraceback()
2196 self.showtraceback()
2201
2197
2202 def safe_execfile_ipy(self, fname):
2198 def safe_execfile_ipy(self, fname):
2203 """Like safe_execfile, but for .ipy files with IPython syntax.
2199 """Like safe_execfile, but for .ipy files with IPython syntax.
2204
2200
2205 Parameters
2201 Parameters
2206 ----------
2202 ----------
2207 fname : str
2203 fname : str
2208 The name of the file to execute. The filename must have a
2204 The name of the file to execute. The filename must have a
2209 .ipy extension.
2205 .ipy extension.
2210 """
2206 """
2211 fname = os.path.abspath(os.path.expanduser(fname))
2207 fname = os.path.abspath(os.path.expanduser(fname))
2212
2208
2213 # Make sure we can open the file
2209 # Make sure we can open the file
2214 try:
2210 try:
2215 with open(fname) as thefile:
2211 with open(fname) as thefile:
2216 pass
2212 pass
2217 except:
2213 except:
2218 warn('Could not open file <%s> for safe execution.' % fname)
2214 warn('Could not open file <%s> for safe execution.' % fname)
2219 return
2215 return
2220
2216
2221 # Find things also in current directory. This is needed to mimic the
2217 # Find things also in current directory. This is needed to mimic the
2222 # behavior of running a script from the system command line, where
2218 # behavior of running a script from the system command line, where
2223 # Python inserts the script's directory into sys.path
2219 # Python inserts the script's directory into sys.path
2224 dname = os.path.dirname(fname)
2220 dname = os.path.dirname(fname)
2225
2221
2226 with prepended_to_syspath(dname):
2222 with prepended_to_syspath(dname):
2227 try:
2223 try:
2228 with open(fname) as thefile:
2224 with open(fname) as thefile:
2229 # self.run_cell currently captures all exceptions
2225 # self.run_cell currently captures all exceptions
2230 # raised in user code. It would be nice if there were
2226 # raised in user code. It would be nice if there were
2231 # versions of runlines, execfile that did raise, so
2227 # versions of runlines, execfile that did raise, so
2232 # we could catch the errors.
2228 # we could catch the errors.
2233 self.run_cell(thefile.read(), store_history=False)
2229 self.run_cell(thefile.read(), store_history=False)
2234 except:
2230 except:
2235 self.showtraceback()
2231 self.showtraceback()
2236 warn('Unknown failure executing file: <%s>' % fname)
2232 warn('Unknown failure executing file: <%s>' % fname)
2237
2233
2238 def run_cell(self, raw_cell, store_history=True):
2234 def run_cell(self, raw_cell, store_history=True):
2239 """Run a complete IPython cell.
2235 """Run a complete IPython cell.
2240
2236
2241 Parameters
2237 Parameters
2242 ----------
2238 ----------
2243 raw_cell : str
2239 raw_cell : str
2244 The code (including IPython code such as %magic functions) to run.
2240 The code (including IPython code such as %magic functions) to run.
2245 store_history : bool
2241 store_history : bool
2246 If True, the raw and translated cell will be stored in IPython's
2242 If True, the raw and translated cell will be stored in IPython's
2247 history. For user code calling back into IPython's machinery, this
2243 history. For user code calling back into IPython's machinery, this
2248 should be set to False.
2244 should be set to False.
2249 """
2245 """
2250 if (not raw_cell) or raw_cell.isspace():
2246 if (not raw_cell) or raw_cell.isspace():
2251 return
2247 return
2252
2248
2253 for line in raw_cell.splitlines():
2249 for line in raw_cell.splitlines():
2254 self.input_splitter.push(line)
2250 self.input_splitter.push(line)
2255 cell = self.input_splitter.source_reset()
2251 cell = self.input_splitter.source_reset()
2256
2252
2257 with self.builtin_trap:
2253 with self.builtin_trap:
2258 prefilter_failed = False
2254 prefilter_failed = False
2259 if len(cell.splitlines()) == 1:
2255 if len(cell.splitlines()) == 1:
2260 try:
2256 try:
2261 # use prefilter_lines to handle trailing newlines
2257 # use prefilter_lines to handle trailing newlines
2262 # restore trailing newline for ast.parse
2258 # restore trailing newline for ast.parse
2263 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2259 cell = self.prefilter_manager.prefilter_lines(cell) + '\n'
2264 except AliasError as e:
2260 except AliasError as e:
2265 error(e)
2261 error(e)
2266 prefilter_failed = True
2262 prefilter_failed = True
2267 except Exception:
2263 except Exception:
2268 # don't allow prefilter errors to crash IPython
2264 # don't allow prefilter errors to crash IPython
2269 self.showtraceback()
2265 self.showtraceback()
2270 prefilter_failed = True
2266 prefilter_failed = True
2271
2267
2272 # Store raw and processed history
2268 # Store raw and processed history
2273 if store_history:
2269 if store_history:
2274 self.history_manager.store_inputs(self.execution_count,
2270 self.history_manager.store_inputs(self.execution_count,
2275 cell, raw_cell)
2271 cell, raw_cell)
2276
2272
2277 self.logger.log(cell, raw_cell)
2273 self.logger.log(cell, raw_cell)
2278
2274
2279 if not prefilter_failed:
2275 if not prefilter_failed:
2280 # don't run if prefilter failed
2276 # don't run if prefilter failed
2281 cell_name = self.compile.cache(cell, self.execution_count)
2277 cell_name = self.compile.cache(cell, self.execution_count)
2282
2278
2283 with self.display_trap:
2279 with self.display_trap:
2284 try:
2280 try:
2285 code_ast = ast.parse(cell, filename=cell_name)
2281 code_ast = ast.parse(cell, filename=cell_name)
2286 except IndentationError:
2282 except IndentationError:
2287 self.showindentationerror()
2283 self.showindentationerror()
2288 self.execution_count += 1
2284 self.execution_count += 1
2289 return None
2285 return None
2290 except (OverflowError, SyntaxError, ValueError, TypeError,
2286 except (OverflowError, SyntaxError, ValueError, TypeError,
2291 MemoryError):
2287 MemoryError):
2292 self.showsyntaxerror()
2288 self.showsyntaxerror()
2293 self.execution_count += 1
2289 self.execution_count += 1
2294 return None
2290 return None
2295
2291
2296 self.run_ast_nodes(code_ast.body, cell_name,
2292 self.run_ast_nodes(code_ast.body, cell_name,
2297 interactivity="last_expr")
2293 interactivity="last_expr")
2298
2294
2299 # Execute any registered post-execution functions.
2295 # Execute any registered post-execution functions.
2300 for func, status in self._post_execute.iteritems():
2296 for func, status in self._post_execute.iteritems():
2301 if not status:
2297 if not status:
2302 continue
2298 continue
2303 try:
2299 try:
2304 func()
2300 func()
2305 except:
2301 except:
2306 self.showtraceback()
2302 self.showtraceback()
2307 # Deactivate failing function
2303 # Deactivate failing function
2308 self._post_execute[func] = False
2304 self._post_execute[func] = False
2309
2305
2310 if store_history:
2306 if store_history:
2311 # Write output to the database. Does nothing unless
2307 # Write output to the database. Does nothing unless
2312 # history output logging is enabled.
2308 # history output logging is enabled.
2313 self.history_manager.store_output(self.execution_count)
2309 self.history_manager.store_output(self.execution_count)
2314 # Each cell is a *single* input, regardless of how many lines it has
2310 # Each cell is a *single* input, regardless of how many lines it has
2315 self.execution_count += 1
2311 self.execution_count += 1
2316
2312
2317 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr'):
2313 def run_ast_nodes(self, nodelist, cell_name, interactivity='last_expr'):
2318 """Run a sequence of AST nodes. The execution mode depends on the
2314 """Run a sequence of AST nodes. The execution mode depends on the
2319 interactivity parameter.
2315 interactivity parameter.
2320
2316
2321 Parameters
2317 Parameters
2322 ----------
2318 ----------
2323 nodelist : list
2319 nodelist : list
2324 A sequence of AST nodes to run.
2320 A sequence of AST nodes to run.
2325 cell_name : str
2321 cell_name : str
2326 Will be passed to the compiler as the filename of the cell. Typically
2322 Will be passed to the compiler as the filename of the cell. Typically
2327 the value returned by ip.compile.cache(cell).
2323 the value returned by ip.compile.cache(cell).
2328 interactivity : str
2324 interactivity : str
2329 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2325 'all', 'last', 'last_expr' or 'none', specifying which nodes should be
2330 run interactively (displaying output from expressions). 'last_expr'
2326 run interactively (displaying output from expressions). 'last_expr'
2331 will run the last node interactively only if it is an expression (i.e.
2327 will run the last node interactively only if it is an expression (i.e.
2332 expressions in loops or other blocks are not displayed. Other values
2328 expressions in loops or other blocks are not displayed. Other values
2333 for this parameter will raise a ValueError.
2329 for this parameter will raise a ValueError.
2334 """
2330 """
2335 if not nodelist:
2331 if not nodelist:
2336 return
2332 return
2337
2333
2338 if interactivity == 'last_expr':
2334 if interactivity == 'last_expr':
2339 if isinstance(nodelist[-1], ast.Expr):
2335 if isinstance(nodelist[-1], ast.Expr):
2340 interactivity = "last"
2336 interactivity = "last"
2341 else:
2337 else:
2342 interactivity = "none"
2338 interactivity = "none"
2343
2339
2344 if interactivity == 'none':
2340 if interactivity == 'none':
2345 to_run_exec, to_run_interactive = nodelist, []
2341 to_run_exec, to_run_interactive = nodelist, []
2346 elif interactivity == 'last':
2342 elif interactivity == 'last':
2347 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2343 to_run_exec, to_run_interactive = nodelist[:-1], nodelist[-1:]
2348 elif interactivity == 'all':
2344 elif interactivity == 'all':
2349 to_run_exec, to_run_interactive = [], nodelist
2345 to_run_exec, to_run_interactive = [], nodelist
2350 else:
2346 else:
2351 raise ValueError("Interactivity was %r" % interactivity)
2347 raise ValueError("Interactivity was %r" % interactivity)
2352
2348
2353 exec_count = self.execution_count
2349 exec_count = self.execution_count
2354
2350
2355 try:
2351 try:
2356 for i, node in enumerate(to_run_exec):
2352 for i, node in enumerate(to_run_exec):
2357 mod = ast.Module([node])
2353 mod = ast.Module([node])
2358 code = self.compile(mod, cell_name, "exec")
2354 code = self.compile(mod, cell_name, "exec")
2359 if self.run_code(code):
2355 if self.run_code(code):
2360 return True
2356 return True
2361
2357
2362 for i, node in enumerate(to_run_interactive):
2358 for i, node in enumerate(to_run_interactive):
2363 mod = ast.Interactive([node])
2359 mod = ast.Interactive([node])
2364 code = self.compile(mod, cell_name, "single")
2360 code = self.compile(mod, cell_name, "single")
2365 if self.run_code(code):
2361 if self.run_code(code):
2366 return True
2362 return True
2367 except:
2363 except:
2368 # It's possible to have exceptions raised here, typically by
2364 # It's possible to have exceptions raised here, typically by
2369 # compilation of odd code (such as a naked 'return' outside a
2365 # compilation of odd code (such as a naked 'return' outside a
2370 # function) that did parse but isn't valid. Typically the exception
2366 # function) that did parse but isn't valid. Typically the exception
2371 # is a SyntaxError, but it's safest just to catch anything and show
2367 # is a SyntaxError, but it's safest just to catch anything and show
2372 # the user a traceback.
2368 # the user a traceback.
2373
2369
2374 # We do only one try/except outside the loop to minimize the impact
2370 # We do only one try/except outside the loop to minimize the impact
2375 # on runtime, and also because if any node in the node list is
2371 # on runtime, and also because if any node in the node list is
2376 # broken, we should stop execution completely.
2372 # broken, we should stop execution completely.
2377 self.showtraceback()
2373 self.showtraceback()
2378
2374
2379 return False
2375 return False
2380
2376
2381 def run_code(self, code_obj):
2377 def run_code(self, code_obj):
2382 """Execute a code object.
2378 """Execute a code object.
2383
2379
2384 When an exception occurs, self.showtraceback() is called to display a
2380 When an exception occurs, self.showtraceback() is called to display a
2385 traceback.
2381 traceback.
2386
2382
2387 Parameters
2383 Parameters
2388 ----------
2384 ----------
2389 code_obj : code object
2385 code_obj : code object
2390 A compiled code object, to be executed
2386 A compiled code object, to be executed
2391 post_execute : bool [default: True]
2387 post_execute : bool [default: True]
2392 whether to call post_execute hooks after this particular execution.
2388 whether to call post_execute hooks after this particular execution.
2393
2389
2394 Returns
2390 Returns
2395 -------
2391 -------
2396 False : successful execution.
2392 False : successful execution.
2397 True : an error occurred.
2393 True : an error occurred.
2398 """
2394 """
2399
2395
2400 # Set our own excepthook in case the user code tries to call it
2396 # Set our own excepthook in case the user code tries to call it
2401 # directly, so that the IPython crash handler doesn't get triggered
2397 # directly, so that the IPython crash handler doesn't get triggered
2402 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2398 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
2403
2399
2404 # we save the original sys.excepthook in the instance, in case config
2400 # we save the original sys.excepthook in the instance, in case config
2405 # code (such as magics) needs access to it.
2401 # code (such as magics) needs access to it.
2406 self.sys_excepthook = old_excepthook
2402 self.sys_excepthook = old_excepthook
2407 outflag = 1 # happens in more places, so it's easier as default
2403 outflag = 1 # happens in more places, so it's easier as default
2408 try:
2404 try:
2409 try:
2405 try:
2410 self.hooks.pre_run_code_hook()
2406 self.hooks.pre_run_code_hook()
2411 #rprint('Running code', repr(code_obj)) # dbg
2407 #rprint('Running code', repr(code_obj)) # dbg
2412 exec code_obj in self.user_global_ns, self.user_ns
2408 exec code_obj in self.user_global_ns, self.user_ns
2413 finally:
2409 finally:
2414 # Reset our crash handler in place
2410 # Reset our crash handler in place
2415 sys.excepthook = old_excepthook
2411 sys.excepthook = old_excepthook
2416 except SystemExit:
2412 except SystemExit:
2417 self.showtraceback(exception_only=True)
2413 self.showtraceback(exception_only=True)
2418 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2414 warn("To exit: use 'exit', 'quit', or Ctrl-D.", level=1)
2419 except self.custom_exceptions:
2415 except self.custom_exceptions:
2420 etype,value,tb = sys.exc_info()
2416 etype,value,tb = sys.exc_info()
2421 self.CustomTB(etype,value,tb)
2417 self.CustomTB(etype,value,tb)
2422 except:
2418 except:
2423 self.showtraceback()
2419 self.showtraceback()
2424 else:
2420 else:
2425 outflag = 0
2421 outflag = 0
2426 if softspace(sys.stdout, 0):
2422 if softspace(sys.stdout, 0):
2427 print
2423 print
2428
2424
2429 return outflag
2425 return outflag
2430
2426
2431 # For backwards compatibility
2427 # For backwards compatibility
2432 runcode = run_code
2428 runcode = run_code
2433
2429
2434 #-------------------------------------------------------------------------
2430 #-------------------------------------------------------------------------
2435 # Things related to GUI support and pylab
2431 # Things related to GUI support and pylab
2436 #-------------------------------------------------------------------------
2432 #-------------------------------------------------------------------------
2437
2433
2438 def enable_pylab(self, gui=None, import_all=True):
2434 def enable_pylab(self, gui=None, import_all=True):
2439 raise NotImplementedError('Implement enable_pylab in a subclass')
2435 raise NotImplementedError('Implement enable_pylab in a subclass')
2440
2436
2441 #-------------------------------------------------------------------------
2437 #-------------------------------------------------------------------------
2442 # Utilities
2438 # Utilities
2443 #-------------------------------------------------------------------------
2439 #-------------------------------------------------------------------------
2444
2440
2445 def var_expand(self,cmd,depth=0):
2441 def var_expand(self,cmd,depth=0):
2446 """Expand python variables in a string.
2442 """Expand python variables in a string.
2447
2443
2448 The depth argument indicates how many frames above the caller should
2444 The depth argument indicates how many frames above the caller should
2449 be walked to look for the local namespace where to expand variables.
2445 be walked to look for the local namespace where to expand variables.
2450
2446
2451 The global namespace for expansion is always the user's interactive
2447 The global namespace for expansion is always the user's interactive
2452 namespace.
2448 namespace.
2453 """
2449 """
2454 res = ItplNS(cmd, self.user_ns, # globals
2450 res = ItplNS(cmd, self.user_ns, # globals
2455 # Skip our own frame in searching for locals:
2451 # Skip our own frame in searching for locals:
2456 sys._getframe(depth+1).f_locals # locals
2452 sys._getframe(depth+1).f_locals # locals
2457 )
2453 )
2458 return str(res).decode(res.codec)
2454 return str(res).decode(res.codec)
2459
2455
2460 def mktempfile(self, data=None, prefix='ipython_edit_'):
2456 def mktempfile(self, data=None, prefix='ipython_edit_'):
2461 """Make a new tempfile and return its filename.
2457 """Make a new tempfile and return its filename.
2462
2458
2463 This makes a call to tempfile.mktemp, but it registers the created
2459 This makes a call to tempfile.mktemp, but it registers the created
2464 filename internally so ipython cleans it up at exit time.
2460 filename internally so ipython cleans it up at exit time.
2465
2461
2466 Optional inputs:
2462 Optional inputs:
2467
2463
2468 - data(None): if data is given, it gets written out to the temp file
2464 - data(None): if data is given, it gets written out to the temp file
2469 immediately, and the file is closed again."""
2465 immediately, and the file is closed again."""
2470
2466
2471 filename = tempfile.mktemp('.py', prefix)
2467 filename = tempfile.mktemp('.py', prefix)
2472 self.tempfiles.append(filename)
2468 self.tempfiles.append(filename)
2473
2469
2474 if data:
2470 if data:
2475 tmp_file = open(filename,'w')
2471 tmp_file = open(filename,'w')
2476 tmp_file.write(data)
2472 tmp_file.write(data)
2477 tmp_file.close()
2473 tmp_file.close()
2478 return filename
2474 return filename
2479
2475
2480 # TODO: This should be removed when Term is refactored.
2476 # TODO: This should be removed when Term is refactored.
2481 def write(self,data):
2477 def write(self,data):
2482 """Write a string to the default output"""
2478 """Write a string to the default output"""
2483 io.stdout.write(data)
2479 io.stdout.write(data)
2484
2480
2485 # TODO: This should be removed when Term is refactored.
2481 # TODO: This should be removed when Term is refactored.
2486 def write_err(self,data):
2482 def write_err(self,data):
2487 """Write a string to the default error output"""
2483 """Write a string to the default error output"""
2488 io.stderr.write(data)
2484 io.stderr.write(data)
2489
2485
2490 def ask_yes_no(self,prompt,default=True):
2486 def ask_yes_no(self,prompt,default=True):
2491 if self.quiet:
2487 if self.quiet:
2492 return True
2488 return True
2493 return ask_yes_no(prompt,default)
2489 return ask_yes_no(prompt,default)
2494
2490
2495 def show_usage(self):
2491 def show_usage(self):
2496 """Show a usage message"""
2492 """Show a usage message"""
2497 page.page(IPython.core.usage.interactive_usage)
2493 page.page(IPython.core.usage.interactive_usage)
2498
2494
2499 def find_user_code(self, target, raw=True):
2495 def find_user_code(self, target, raw=True):
2500 """Get a code string from history, file, or a string or macro.
2496 """Get a code string from history, file, or a string or macro.
2501
2497
2502 This is mainly used by magic functions.
2498 This is mainly used by magic functions.
2503
2499
2504 Parameters
2500 Parameters
2505 ----------
2501 ----------
2506 target : str
2502 target : str
2507 A string specifying code to retrieve. This will be tried respectively
2503 A string specifying code to retrieve. This will be tried respectively
2508 as: ranges of input history (see %history for syntax), a filename, or
2504 as: ranges of input history (see %history for syntax), a filename, or
2509 an expression evaluating to a string or Macro in the user namespace.
2505 an expression evaluating to a string or Macro in the user namespace.
2510 raw : bool
2506 raw : bool
2511 If true (default), retrieve raw history. Has no effect on the other
2507 If true (default), retrieve raw history. Has no effect on the other
2512 retrieval mechanisms.
2508 retrieval mechanisms.
2513
2509
2514 Returns
2510 Returns
2515 -------
2511 -------
2516 A string of code.
2512 A string of code.
2517
2513
2518 ValueError is raised if nothing is found, and TypeError if it evaluates
2514 ValueError is raised if nothing is found, and TypeError if it evaluates
2519 to an object of another type. In each case, .args[0] is a printable
2515 to an object of another type. In each case, .args[0] is a printable
2520 message.
2516 message.
2521 """
2517 """
2522 code = self.extract_input_lines(target, raw=raw) # Grab history
2518 code = self.extract_input_lines(target, raw=raw) # Grab history
2523 if code:
2519 if code:
2524 return code
2520 return code
2525 if os.path.isfile(target): # Read file
2521 if os.path.isfile(target): # Read file
2526 return open(target, "r").read()
2522 return open(target, "r").read()
2527
2523
2528 try: # User namespace
2524 try: # User namespace
2529 codeobj = eval(target, self.user_ns)
2525 codeobj = eval(target, self.user_ns)
2530 except Exception:
2526 except Exception:
2531 raise ValueError(("'%s' was not found in history, as a file, nor in"
2527 raise ValueError(("'%s' was not found in history, as a file, nor in"
2532 " the user namespace.") % target)
2528 " the user namespace.") % target)
2533 if isinstance(codeobj, basestring):
2529 if isinstance(codeobj, basestring):
2534 return codeobj
2530 return codeobj
2535 elif isinstance(codeobj, Macro):
2531 elif isinstance(codeobj, Macro):
2536 return codeobj.value
2532 return codeobj.value
2537
2533
2538 raise TypeError("%s is neither a string nor a macro." % target,
2534 raise TypeError("%s is neither a string nor a macro." % target,
2539 codeobj)
2535 codeobj)
2540
2536
2541 #-------------------------------------------------------------------------
2537 #-------------------------------------------------------------------------
2542 # Things related to IPython exiting
2538 # Things related to IPython exiting
2543 #-------------------------------------------------------------------------
2539 #-------------------------------------------------------------------------
2544 def atexit_operations(self):
2540 def atexit_operations(self):
2545 """This will be executed at the time of exit.
2541 """This will be executed at the time of exit.
2546
2542
2547 Cleanup operations and saving of persistent data that is done
2543 Cleanup operations and saving of persistent data that is done
2548 unconditionally by IPython should be performed here.
2544 unconditionally by IPython should be performed here.
2549
2545
2550 For things that may depend on startup flags or platform specifics (such
2546 For things that may depend on startup flags or platform specifics (such
2551 as having readline or not), register a separate atexit function in the
2547 as having readline or not), register a separate atexit function in the
2552 code that has the appropriate information, rather than trying to
2548 code that has the appropriate information, rather than trying to
2553 clutter
2549 clutter
2554 """
2550 """
2555 # Close the history session (this stores the end time and line count)
2551 # Close the history session (this stores the end time and line count)
2556 # this must be *before* the tempfile cleanup, in case of temporary
2552 # this must be *before* the tempfile cleanup, in case of temporary
2557 # history db
2553 # history db
2558 self.history_manager.end_session()
2554 self.history_manager.end_session()
2559
2555
2560 # Cleanup all tempfiles left around
2556 # Cleanup all tempfiles left around
2561 for tfile in self.tempfiles:
2557 for tfile in self.tempfiles:
2562 try:
2558 try:
2563 os.unlink(tfile)
2559 os.unlink(tfile)
2564 except OSError:
2560 except OSError:
2565 pass
2561 pass
2566
2562
2567 # Clear all user namespaces to release all references cleanly.
2563 # Clear all user namespaces to release all references cleanly.
2568 self.reset(new_session=False)
2564 self.reset(new_session=False)
2569
2565
2570 # Run user hooks
2566 # Run user hooks
2571 self.hooks.shutdown_hook()
2567 self.hooks.shutdown_hook()
2572
2568
2573 def cleanup(self):
2569 def cleanup(self):
2574 self.restore_sys_module_state()
2570 self.restore_sys_module_state()
2575
2571
2576
2572
2577 class InteractiveShellABC(object):
2573 class InteractiveShellABC(object):
2578 """An abstract base class for InteractiveShell."""
2574 """An abstract base class for InteractiveShell."""
2579 __metaclass__ = abc.ABCMeta
2575 __metaclass__ = abc.ABCMeta
2580
2576
2581 InteractiveShellABC.register(InteractiveShell)
2577 InteractiveShellABC.register(InteractiveShell)
1 NO CONTENT: modified file
NO CONTENT: modified file
The requested commit or file is too big and content was truncated. Show full diff
@@ -1,90 +1,89 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 Simple utility for splitting user input.
3 Simple utility for splitting user input.
4
4
5 Authors:
5 Authors:
6
6
7 * Brian Granger
7 * Brian Granger
8 * Fernando Perez
8 * Fernando Perez
9 """
9 """
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Copyright (C) 2008-2009 The IPython Development Team
12 # Copyright (C) 2008-2009 The IPython Development Team
13 #
13 #
14 # Distributed under the terms of the BSD License. The full license is in
14 # Distributed under the terms of the BSD License. The full license is in
15 # the file COPYING, distributed as part of this software.
15 # the file COPYING, distributed as part of this software.
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # Imports
19 # Imports
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21
21
22 import re
22 import re
23 import sys
23 import sys
24
24
25 from IPython.utils import py3compat
26
25 #-----------------------------------------------------------------------------
27 #-----------------------------------------------------------------------------
26 # Main function
28 # Main function
27 #-----------------------------------------------------------------------------
29 #-----------------------------------------------------------------------------
28
30
29
31
30 # RegExp for splitting line contents into pre-char//first word-method//rest.
32 # RegExp for splitting line contents into pre-char//first word-method//rest.
31 # For clarity, each group in on one line.
33 # For clarity, each group in on one line.
32
34
33 # WARNING: update the regexp if the escapes in interactiveshell are changed, as they
35 # WARNING: update the regexp if the escapes in interactiveshell are changed, as they
34 # are hardwired in.
36 # are hardwired in.
35
37
36 # Although it's not solely driven by the regex, note that:
38 # Although it's not solely driven by the regex, note that:
37 # ,;/% only trigger if they are the first character on the line
39 # ,;/% only trigger if they are the first character on the line
38 # ! and !! trigger if they are first char(s) *or* follow an indent
40 # ! and !! trigger if they are first char(s) *or* follow an indent
39 # ? triggers as first or last char.
41 # ? triggers as first or last char.
40
42
41 # The three parts of the regex are:
43 # The three parts of the regex are:
42 # 1) pre: pre_char *or* initial whitespace
44 # 1) pre: pre_char *or* initial whitespace
43 # 2) ifun: first word/method (mix of \w and '.')
45 # 2) ifun: first word/method (mix of \w and '.')
44 # 3) the_rest: rest of line (separated from ifun by space if non-empty)
46 # 3) the_rest: rest of line (separated from ifun by space if non-empty)
45 line_split = re.compile(r'^([,;/%?]|!!?|\s*)'
47 line_split = re.compile(r'^([,;/%?]|!!?|\s*)'
46 r'\s*([\w\.]+)'
48 r'\s*([\w\.]+)'
47 r'(\s+.*$|$)')
49 r'(\s+.*$|$)')
48
50
49 # r'[\w\.]+'
51 # r'[\w\.]+'
50 # r'\s*=\s*%.*'
52 # r'\s*=\s*%.*'
51
53
52 def split_user_input(line, pattern=None):
54 def split_user_input(line, pattern=None):
53 """Split user input into pre-char/whitespace, function part and rest.
55 """Split user input into pre-char/whitespace, function part and rest.
54
56
55 This is currently handles lines with '=' in them in a very inconsistent
57 This is currently handles lines with '=' in them in a very inconsistent
56 manner.
58 manner.
57 """
59 """
58 # We need to ensure that the rest of this routine deals only with unicode
60 # We need to ensure that the rest of this routine deals only with unicode
59 if type(line)==str:
61 line = py3compat.cast_unicode(line, sys.stdin.encoding or 'utf-8')
60 codec = sys.stdin.encoding
61 if codec is None:
62 codec = 'utf-8'
63 line = line.decode(codec)
64
62
65 if pattern is None:
63 if pattern is None:
66 pattern = line_split
64 pattern = line_split
67 match = pattern.match(line)
65 match = pattern.match(line)
68 if not match:
66 if not match:
69 # print "match failed for line '%s'" % line
67 # print "match failed for line '%s'" % line
70 try:
68 try:
71 ifun, the_rest = line.split(None,1)
69 ifun, the_rest = line.split(None,1)
72 except ValueError:
70 except ValueError:
73 # print "split failed for line '%s'" % line
71 # print "split failed for line '%s'" % line
74 ifun, the_rest = line, u''
72 ifun, the_rest = line, u''
75 pre = re.match('^(\s*)(.*)',line).groups()[0]
73 pre = re.match('^(\s*)(.*)',line).groups()[0]
76 else:
74 else:
77 pre,ifun,the_rest = match.groups()
75 pre,ifun,the_rest = match.groups()
78
76
79 # ifun has to be a valid python identifier, so it better encode into
77 if not py3compat.PY3:
80 # ascii. We do still make it a unicode string so that we consistently
78 # ifun has to be a valid python identifier, so it better encode into
81 # return unicode, but it will be one that is guaranteed to be pure ascii
79 # ascii. We do still make it a unicode string so that we consistently
82 try:
80 # return unicode, but it will be one that is guaranteed to be pure ascii
83 ifun = unicode(ifun.encode('ascii'))
81 try:
84 except UnicodeEncodeError:
82 ifun = unicode(ifun.encode('ascii'))
85 the_rest = ifun + u' ' + the_rest
83 except UnicodeEncodeError:
86 ifun = u''
84 the_rest = ifun + u' ' + the_rest
85 ifun = u''
87
86
88 #print 'line:<%s>' % line # dbg
87 #print 'line:<%s>' % line # dbg
89 #print 'pre <%s> ifun <%s> rest <%s>' % (pre,ifun.strip(),the_rest) # dbg
88 #print 'pre <%s> ifun <%s> rest <%s>' % (pre,ifun.strip(),the_rest) # dbg
90 return pre, ifun.strip(), the_rest.lstrip()
89 return pre, ifun.strip(), the_rest.lstrip()
@@ -1,32 +1,35 b''
1 """Simple script to be run *twice*, to check reference counting bugs.
1 """Simple script to be run *twice*, to check reference counting bugs.
2
2
3 See test_run for details."""
3 See test_run for details."""
4
4
5 from __future__ import print_function
6
5 import sys
7 import sys
6
8
7 # We want to ensure that while objects remain available for immediate access,
9 # We want to ensure that while objects remain available for immediate access,
8 # objects from *previous* runs of the same script get collected, to avoid
10 # objects from *previous* runs of the same script get collected, to avoid
9 # accumulating massive amounts of old references.
11 # accumulating massive amounts of old references.
10 class C(object):
12 class C(object):
11 def __init__(self,name):
13 def __init__(self,name):
12 self.name = name
14 self.name = name
15 self.p = print
13 self.flush_stdout = sys.stdout.flush
16 self.flush_stdout = sys.stdout.flush
14
17
15 def __del__(self):
18 def __del__(self):
16 print 'tclass.py: deleting object:',self.name
19 self.p('tclass.py: deleting object:',self.name)
17 self.flush_stdout()
20 self.flush_stdout()
18
21
19 try:
22 try:
20 name = sys.argv[1]
23 name = sys.argv[1]
21 except IndexError:
24 except IndexError:
22 pass
25 pass
23 else:
26 else:
24 if name.startswith('C'):
27 if name.startswith('C'):
25 c = C(name)
28 c = C(name)
26
29
27 #print >> sys.stderr, "ARGV:", sys.argv # dbg
30 #print >> sys.stderr, "ARGV:", sys.argv # dbg
28
31
29 # This next print statement is NOT debugging, we're making the check on a
32 # This next print statement is NOT debugging, we're making the check on a
30 # completely separate process so we verify by capturing stdout:
33 # completely separate process so we verify by capturing stdout:
31 print 'ARGV 1-:', sys.argv[1:]
34 print 'ARGV 1-:', sys.argv[1:]
32 sys.stdout.flush()
35 sys.stdout.flush()
@@ -1,49 +1,50 b''
1 # coding: utf-8
1 # coding: utf-8
2 """Tests for IPython.core.application"""
2 """Tests for IPython.core.application"""
3
3
4 import os
4 import os
5 import tempfile
5 import tempfile
6
6
7 from IPython.core.application import BaseIPythonApplication
7 from IPython.core.application import BaseIPythonApplication
8 from IPython.testing import decorators as testdec
8 from IPython.testing import decorators as testdec
9 from IPython.utils import py3compat
9
10
10 @testdec.onlyif_unicode_paths
11 @testdec.onlyif_unicode_paths
11 def test_unicode_cwd():
12 def test_unicode_cwd():
12 """Check that IPython starts with non-ascii characters in the path."""
13 """Check that IPython starts with non-ascii characters in the path."""
13 wd = tempfile.mkdtemp(suffix=u"€")
14 wd = tempfile.mkdtemp(suffix=u"€")
14
15
15 old_wd = os.getcwdu()
16 old_wd = os.getcwdu()
16 os.chdir(wd)
17 os.chdir(wd)
17 #raise Exception(repr(os.getcwdu()))
18 #raise Exception(repr(os.getcwdu()))
18 try:
19 try:
19 app = BaseIPythonApplication()
20 app = BaseIPythonApplication()
20 # The lines below are copied from Application.initialize()
21 # The lines below are copied from Application.initialize()
21 app.init_profile_dir()
22 app.init_profile_dir()
22 app.init_config_files()
23 app.init_config_files()
23 app.load_config_file(suppress_errors=False)
24 app.load_config_file(suppress_errors=False)
24 finally:
25 finally:
25 os.chdir(old_wd)
26 os.chdir(old_wd)
26
27
27 @testdec.onlyif_unicode_paths
28 @testdec.onlyif_unicode_paths
28 def test_unicode_ipdir():
29 def test_unicode_ipdir():
29 """Check that IPython starts with non-ascii characters in the IP dir."""
30 """Check that IPython starts with non-ascii characters in the IP dir."""
30 ipdir = tempfile.mkdtemp(suffix=u"€")
31 ipdir = tempfile.mkdtemp(suffix=u"€")
31
32
32 # Create the config file, so it tries to load it.
33 # Create the config file, so it tries to load it.
33 with open(os.path.join(ipdir, 'ipython_config.py'), "w") as f:
34 with open(os.path.join(ipdir, 'ipython_config.py'), "w") as f:
34 pass
35 pass
35
36
36 old_ipdir1 = os.environ.pop("IPYTHONDIR", None)
37 old_ipdir1 = os.environ.pop("IPYTHONDIR", None)
37 old_ipdir2 = os.environ.pop("IPYTHON_DIR", None)
38 old_ipdir2 = os.environ.pop("IPYTHON_DIR", None)
38 os.environ["IPYTHONDIR"] = ipdir.encode("utf-8")
39 os.environ["IPYTHONDIR"] = py3compat.unicode_to_str(ipdir, "utf-8")
39 try:
40 try:
40 app = BaseIPythonApplication()
41 app = BaseIPythonApplication()
41 # The lines below are copied from Application.initialize()
42 # The lines below are copied from Application.initialize()
42 app.init_profile_dir()
43 app.init_profile_dir()
43 app.init_config_files()
44 app.init_config_files()
44 app.load_config_file(suppress_errors=False)
45 app.load_config_file(suppress_errors=False)
45 finally:
46 finally:
46 if old_ipdir1:
47 if old_ipdir1:
47 os.environ["IPYTHONDIR"] = old_ipdir1
48 os.environ["IPYTHONDIR"] = old_ipdir1
48 if old_ipdir2:
49 if old_ipdir2:
49 os.environ["IPYTHONDIR"] = old_ipdir2
50 os.environ["IPYTHONDIR"] = old_ipdir2
@@ -1,74 +1,75 b''
1 # coding: utf-8
1 # coding: utf-8
2 """Tests for the compilerop module.
2 """Tests for the compilerop module.
3 """
3 """
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2010 The IPython Development Team.
5 # Copyright (C) 2010 The IPython Development Team.
6 #
6 #
7 # Distributed under the terms of the BSD License.
7 # Distributed under the terms of the BSD License.
8 #
8 #
9 # The full license is in the file COPYING.txt, distributed with this software.
9 # The full license is in the file COPYING.txt, distributed with this software.
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11
11
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 # Imports
13 # Imports
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 from __future__ import print_function
15 from __future__ import print_function
16
16
17 # Stdlib imports
17 # Stdlib imports
18 import linecache
18 import linecache
19 import sys
19 import sys
20
20
21 # Third-party imports
21 # Third-party imports
22 import nose.tools as nt
22 import nose.tools as nt
23
23
24 # Our own imports
24 # Our own imports
25 from IPython.core import compilerop
25 from IPython.core import compilerop
26 from IPython.utils import py3compat
26
27
27 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
28 # Test functions
29 # Test functions
29 #-----------------------------------------------------------------------------
30 #-----------------------------------------------------------------------------
30
31
31 def test_code_name():
32 def test_code_name():
32 code = 'x=1'
33 code = 'x=1'
33 name = compilerop.code_name(code)
34 name = compilerop.code_name(code)
34 nt.assert_true(name.startswith('<ipython-input-0'))
35 nt.assert_true(name.startswith('<ipython-input-0'))
35
36
36
37
37 def test_code_name2():
38 def test_code_name2():
38 code = 'x=1'
39 code = 'x=1'
39 name = compilerop.code_name(code, 9)
40 name = compilerop.code_name(code, 9)
40 nt.assert_true(name.startswith('<ipython-input-9'))
41 nt.assert_true(name.startswith('<ipython-input-9'))
41
42
42
43
43 def test_cache():
44 def test_cache():
44 """Test the compiler correctly compiles and caches inputs
45 """Test the compiler correctly compiles and caches inputs
45 """
46 """
46 cp = compilerop.CachingCompiler()
47 cp = compilerop.CachingCompiler()
47 ncache = len(linecache.cache)
48 ncache = len(linecache.cache)
48 cp.cache('x=1')
49 cp.cache('x=1')
49 nt.assert_true(len(linecache.cache) > ncache)
50 nt.assert_true(len(linecache.cache) > ncache)
50
51
51 def setUp():
52 def setUp():
52 # Check we're in a proper Python 2 environment (some imports, such
53 # Check we're in a proper Python 2 environment (some imports, such
53 # as GTK, can change the default encoding, which can hide bugs.)
54 # as GTK, can change the default encoding, which can hide bugs.)
54 nt.assert_equal(sys.getdefaultencoding(), "ascii")
55 nt.assert_equal(sys.getdefaultencoding(), "utf-8" if py3compat.PY3 else "ascii")
55
56
56 def test_cache_unicode():
57 def test_cache_unicode():
57 cp = compilerop.CachingCompiler()
58 cp = compilerop.CachingCompiler()
58 ncache = len(linecache.cache)
59 ncache = len(linecache.cache)
59 cp.cache(u"t = 'žćčőđ'")
60 cp.cache(u"t = 'žćčőđ'")
60 nt.assert_true(len(linecache.cache) > ncache)
61 nt.assert_true(len(linecache.cache) > ncache)
61
62
62 def test_compiler_check_cache():
63 def test_compiler_check_cache():
63 """Test the compiler properly manages the cache.
64 """Test the compiler properly manages the cache.
64 """
65 """
65 # Rather simple-minded tests that just exercise the API
66 # Rather simple-minded tests that just exercise the API
66 cp = compilerop.CachingCompiler()
67 cp = compilerop.CachingCompiler()
67 cp.cache('x=1', 99)
68 cp.cache('x=1', 99)
68 # Ensure now that after clearing the cache, our entries survive
69 # Ensure now that after clearing the cache, our entries survive
69 cp.check_cache()
70 cp.check_cache()
70 for k in linecache.cache:
71 for k in linecache.cache:
71 if k.startswith('<ipython-input-99'):
72 if k.startswith('<ipython-input-99'):
72 break
73 break
73 else:
74 else:
74 raise AssertionError('Entry for input-99 missing from linecache')
75 raise AssertionError('Entry for input-99 missing from linecache')
@@ -1,114 +1,115 b''
1 # coding: utf-8
1 # coding: utf-8
2 """Tests for the IPython tab-completion machinery.
2 """Tests for the IPython tab-completion machinery.
3 """
3 """
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Module imports
5 # Module imports
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7
7
8 # stdlib
8 # stdlib
9 import os
9 import os
10 import sys
10 import sys
11 import unittest
11 import unittest
12 from datetime import datetime
12 from datetime import datetime
13 # third party
13 # third party
14 import nose.tools as nt
14 import nose.tools as nt
15
15
16 # our own packages
16 # our own packages
17 from IPython.utils.tempdir import TemporaryDirectory
17 from IPython.utils.tempdir import TemporaryDirectory
18 from IPython.core.history import HistoryManager, extract_hist_ranges
18 from IPython.core.history import HistoryManager, extract_hist_ranges
19 from IPython.utils import py3compat
19
20
20 def setUp():
21 def setUp():
21 nt.assert_equal(sys.getdefaultencoding(), "ascii")
22 nt.assert_equal(sys.getdefaultencoding(), "utf-8" if py3compat.PY3 else "ascii")
22
23
23 def test_history():
24 def test_history():
24 ip = get_ipython()
25 ip = get_ipython()
25 with TemporaryDirectory() as tmpdir:
26 with TemporaryDirectory() as tmpdir:
26 hist_manager_ori = ip.history_manager
27 hist_manager_ori = ip.history_manager
27 hist_file = os.path.join(tmpdir, 'history.sqlite')
28 hist_file = os.path.join(tmpdir, 'history.sqlite')
28 try:
29 try:
29 ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file)
30 ip.history_manager = HistoryManager(shell=ip, hist_file=hist_file)
30 hist = ['a=1', 'def f():\n test = 1\n return test', u"b='β‚¬Γ†ΒΎΓ·ΓŸ'"]
31 hist = ['a=1', 'def f():\n test = 1\n return test', u"b='β‚¬Γ†ΒΎΓ·ΓŸ'"]
31 for i, h in enumerate(hist, start=1):
32 for i, h in enumerate(hist, start=1):
32 ip.history_manager.store_inputs(i, h)
33 ip.history_manager.store_inputs(i, h)
33
34
34 ip.history_manager.db_log_output = True
35 ip.history_manager.db_log_output = True
35 # Doesn't match the input, but we'll just check it's stored.
36 # Doesn't match the input, but we'll just check it's stored.
36 ip.history_manager.output_hist_reprs[3] = "spam"
37 ip.history_manager.output_hist_reprs[3] = "spam"
37 ip.history_manager.store_output(3)
38 ip.history_manager.store_output(3)
38
39
39 nt.assert_equal(ip.history_manager.input_hist_raw, [''] + hist)
40 nt.assert_equal(ip.history_manager.input_hist_raw, [''] + hist)
40
41
41
42
42 # New session
43 # New session
43 ip.history_manager.reset()
44 ip.history_manager.reset()
44 newcmds = ["z=5","class X(object):\n pass", "k='p'"]
45 newcmds = ["z=5","class X(object):\n pass", "k='p'"]
45 for i, cmd in enumerate(newcmds, start=1):
46 for i, cmd in enumerate(newcmds, start=1):
46 ip.history_manager.store_inputs(i, cmd)
47 ip.history_manager.store_inputs(i, cmd)
47 gothist = ip.history_manager.get_range(start=1, stop=4)
48 gothist = ip.history_manager.get_range(start=1, stop=4)
48 nt.assert_equal(list(gothist), zip([0,0,0],[1,2,3], newcmds))
49 nt.assert_equal(list(gothist), zip([0,0,0],[1,2,3], newcmds))
49 # Previous session:
50 # Previous session:
50 gothist = ip.history_manager.get_range(-1, 1, 4)
51 gothist = ip.history_manager.get_range(-1, 1, 4)
51 nt.assert_equal(list(gothist), zip([1,1,1],[1,2,3], hist))
52 nt.assert_equal(list(gothist), zip([1,1,1],[1,2,3], hist))
52
53
53 # Check get_hist_tail
54 # Check get_hist_tail
54 gothist = ip.history_manager.get_tail(4, output=True,
55 gothist = ip.history_manager.get_tail(4, output=True,
55 include_latest=True)
56 include_latest=True)
56 expected = [(1, 3, (hist[-1], "spam")),
57 expected = [(1, 3, (hist[-1], "spam")),
57 (2, 1, (newcmds[0], None)),
58 (2, 1, (newcmds[0], None)),
58 (2, 2, (newcmds[1], None)),
59 (2, 2, (newcmds[1], None)),
59 (2, 3, (newcmds[2], None)),]
60 (2, 3, (newcmds[2], None)),]
60 nt.assert_equal(list(gothist), expected)
61 nt.assert_equal(list(gothist), expected)
61
62
62 gothist = ip.history_manager.get_tail(2)
63 gothist = ip.history_manager.get_tail(2)
63 expected = [(2, 1, newcmds[0]),
64 expected = [(2, 1, newcmds[0]),
64 (2, 2, newcmds[1])]
65 (2, 2, newcmds[1])]
65 nt.assert_equal(list(gothist), expected)
66 nt.assert_equal(list(gothist), expected)
66
67
67 # Check get_hist_search
68 # Check get_hist_search
68 gothist = ip.history_manager.search("*test*")
69 gothist = ip.history_manager.search("*test*")
69 nt.assert_equal(list(gothist), [(1,2,hist[1])] )
70 nt.assert_equal(list(gothist), [(1,2,hist[1])] )
70 gothist = ip.history_manager.search("b*", output=True)
71 gothist = ip.history_manager.search("b*", output=True)
71 nt.assert_equal(list(gothist), [(1,3,(hist[2],"spam"))] )
72 nt.assert_equal(list(gothist), [(1,3,(hist[2],"spam"))] )
72
73
73 # Cross testing: check that magic %save can get previous session.
74 # Cross testing: check that magic %save can get previous session.
74 testfilename = os.path.realpath(os.path.join(tmpdir, "test.py"))
75 testfilename = os.path.realpath(os.path.join(tmpdir, "test.py"))
75 ip.magic_save(testfilename + " ~1/1-3")
76 ip.magic_save(testfilename + " ~1/1-3")
76 testfile = open(testfilename, "r")
77 testfile = open(testfilename, "r")
77 nt.assert_equal(testfile.read().decode("utf-8"),
78 nt.assert_equal(testfile.read().decode("utf-8"),
78 "# coding: utf-8\n" + "\n".join(hist))
79 "# coding: utf-8\n" + "\n".join(hist))
79
80
80 # Duplicate line numbers - check that it doesn't crash, and
81 # Duplicate line numbers - check that it doesn't crash, and
81 # gets a new session
82 # gets a new session
82 ip.history_manager.store_inputs(1, "rogue")
83 ip.history_manager.store_inputs(1, "rogue")
83 ip.history_manager.writeout_cache()
84 ip.history_manager.writeout_cache()
84 nt.assert_equal(ip.history_manager.session_number, 3)
85 nt.assert_equal(ip.history_manager.session_number, 3)
85 finally:
86 finally:
86 # Restore history manager
87 # Restore history manager
87 ip.history_manager = hist_manager_ori
88 ip.history_manager = hist_manager_ori
88
89
89
90
90 def test_extract_hist_ranges():
91 def test_extract_hist_ranges():
91 instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5"
92 instr = "1 2/3 ~4/5-6 ~4/7-~4/9 ~9/2-~7/5"
92 expected = [(0, 1, 2), # 0 == current session
93 expected = [(0, 1, 2), # 0 == current session
93 (2, 3, 4),
94 (2, 3, 4),
94 (-4, 5, 7),
95 (-4, 5, 7),
95 (-4, 7, 10),
96 (-4, 7, 10),
96 (-9, 2, None), # None == to end
97 (-9, 2, None), # None == to end
97 (-8, 1, None),
98 (-8, 1, None),
98 (-7, 1, 6)]
99 (-7, 1, 6)]
99 actual = list(extract_hist_ranges(instr))
100 actual = list(extract_hist_ranges(instr))
100 nt.assert_equal(actual, expected)
101 nt.assert_equal(actual, expected)
101
102
102 def test_magic_rerun():
103 def test_magic_rerun():
103 """Simple test for %rerun (no args -> rerun last line)"""
104 """Simple test for %rerun (no args -> rerun last line)"""
104 ip = get_ipython()
105 ip = get_ipython()
105 ip.run_cell("a = 10")
106 ip.run_cell("a = 10")
106 ip.run_cell("a += 1")
107 ip.run_cell("a += 1")
107 nt.assert_equal(ip.user_ns["a"], 11)
108 nt.assert_equal(ip.user_ns["a"], 11)
108 ip.run_cell("%rerun")
109 ip.run_cell("%rerun")
109 nt.assert_equal(ip.user_ns["a"], 12)
110 nt.assert_equal(ip.user_ns["a"], 12)
110
111
111 def test_timestamp_type():
112 def test_timestamp_type():
112 ip = get_ipython()
113 ip = get_ipython()
113 info = ip.history_manager.get_session_info()
114 info = ip.history_manager.get_session_info()
114 nt.assert_true(isinstance(info[1], datetime))
115 nt.assert_true(isinstance(info[1], datetime))
@@ -1,698 +1,698 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Tests for the inputsplitter module.
2 """Tests for the inputsplitter module.
3
3
4 Authors
4 Authors
5 -------
5 -------
6 * Fernando Perez
6 * Fernando Perez
7 * Robert Kern
7 * Robert Kern
8 """
8 """
9 #-----------------------------------------------------------------------------
9 #-----------------------------------------------------------------------------
10 # Copyright (C) 2010 The IPython Development Team
10 # Copyright (C) 2010 The IPython Development Team
11 #
11 #
12 # Distributed under the terms of the BSD License. The full license is in
12 # Distributed under the terms of the BSD License. The full license is in
13 # the file COPYING, distributed as part of this software.
13 # the file COPYING, distributed as part of this software.
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15
15
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17 # Imports
17 # Imports
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # stdlib
19 # stdlib
20 import unittest
20 import unittest
21 import sys
21 import sys
22
22
23 # Third party
23 # Third party
24 import nose.tools as nt
24 import nose.tools as nt
25
25
26 # Our own
26 # Our own
27 from IPython.core import inputsplitter as isp
27 from IPython.core import inputsplitter as isp
28 from IPython.testing import tools as tt
28 from IPython.testing import tools as tt
29
29
30 #-----------------------------------------------------------------------------
30 #-----------------------------------------------------------------------------
31 # Semi-complete examples (also used as tests)
31 # Semi-complete examples (also used as tests)
32 #-----------------------------------------------------------------------------
32 #-----------------------------------------------------------------------------
33
33
34 # Note: at the bottom, there's a slightly more complete version of this that
34 # Note: at the bottom, there's a slightly more complete version of this that
35 # can be useful during development of code here.
35 # can be useful during development of code here.
36
36
37 def mini_interactive_loop(input_func):
37 def mini_interactive_loop(input_func):
38 """Minimal example of the logic of an interactive interpreter loop.
38 """Minimal example of the logic of an interactive interpreter loop.
39
39
40 This serves as an example, and it is used by the test system with a fake
40 This serves as an example, and it is used by the test system with a fake
41 raw_input that simulates interactive input."""
41 raw_input that simulates interactive input."""
42
42
43 from IPython.core.inputsplitter import InputSplitter
43 from IPython.core.inputsplitter import InputSplitter
44
44
45 isp = InputSplitter()
45 isp = InputSplitter()
46 # In practice, this input loop would be wrapped in an outside loop to read
46 # In practice, this input loop would be wrapped in an outside loop to read
47 # input indefinitely, until some exit/quit command was issued. Here we
47 # input indefinitely, until some exit/quit command was issued. Here we
48 # only illustrate the basic inner loop.
48 # only illustrate the basic inner loop.
49 while isp.push_accepts_more():
49 while isp.push_accepts_more():
50 indent = ' '*isp.indent_spaces
50 indent = ' '*isp.indent_spaces
51 prompt = '>>> ' + indent
51 prompt = '>>> ' + indent
52 line = indent + input_func(prompt)
52 line = indent + input_func(prompt)
53 isp.push(line)
53 isp.push(line)
54
54
55 # Here we just return input so we can use it in a test suite, but a real
55 # Here we just return input so we can use it in a test suite, but a real
56 # interpreter would instead send it for execution somewhere.
56 # interpreter would instead send it for execution somewhere.
57 src = isp.source_reset()
57 src = isp.source_reset()
58 #print 'Input source was:\n', src # dbg
58 #print 'Input source was:\n', src # dbg
59 return src
59 return src
60
60
61 #-----------------------------------------------------------------------------
61 #-----------------------------------------------------------------------------
62 # Test utilities, just for local use
62 # Test utilities, just for local use
63 #-----------------------------------------------------------------------------
63 #-----------------------------------------------------------------------------
64
64
65 def assemble(block):
65 def assemble(block):
66 """Assemble a block into multi-line sub-blocks."""
66 """Assemble a block into multi-line sub-blocks."""
67 return ['\n'.join(sub_block)+'\n' for sub_block in block]
67 return ['\n'.join(sub_block)+'\n' for sub_block in block]
68
68
69
69
70 def pseudo_input(lines):
70 def pseudo_input(lines):
71 """Return a function that acts like raw_input but feeds the input list."""
71 """Return a function that acts like raw_input but feeds the input list."""
72 ilines = iter(lines)
72 ilines = iter(lines)
73 def raw_in(prompt):
73 def raw_in(prompt):
74 try:
74 try:
75 return next(ilines)
75 return next(ilines)
76 except StopIteration:
76 except StopIteration:
77 return ''
77 return ''
78 return raw_in
78 return raw_in
79
79
80 #-----------------------------------------------------------------------------
80 #-----------------------------------------------------------------------------
81 # Tests
81 # Tests
82 #-----------------------------------------------------------------------------
82 #-----------------------------------------------------------------------------
83 def test_spaces():
83 def test_spaces():
84 tests = [('', 0),
84 tests = [('', 0),
85 (' ', 1),
85 (' ', 1),
86 ('\n', 0),
86 ('\n', 0),
87 (' \n', 1),
87 (' \n', 1),
88 ('x', 0),
88 ('x', 0),
89 (' x', 1),
89 (' x', 1),
90 (' x',2),
90 (' x',2),
91 (' x',4),
91 (' x',4),
92 # Note: tabs are counted as a single whitespace!
92 # Note: tabs are counted as a single whitespace!
93 ('\tx', 1),
93 ('\tx', 1),
94 ('\t x', 2),
94 ('\t x', 2),
95 ]
95 ]
96 tt.check_pairs(isp.num_ini_spaces, tests)
96 tt.check_pairs(isp.num_ini_spaces, tests)
97
97
98
98
99 def test_remove_comments():
99 def test_remove_comments():
100 tests = [('text', 'text'),
100 tests = [('text', 'text'),
101 ('text # comment', 'text '),
101 ('text # comment', 'text '),
102 ('text # comment\n', 'text \n'),
102 ('text # comment\n', 'text \n'),
103 ('text # comment \n', 'text \n'),
103 ('text # comment \n', 'text \n'),
104 ('line # c \nline\n','line \nline\n'),
104 ('line # c \nline\n','line \nline\n'),
105 ('line # c \nline#c2 \nline\nline #c\n\n',
105 ('line # c \nline#c2 \nline\nline #c\n\n',
106 'line \nline\nline\nline \n\n'),
106 'line \nline\nline\nline \n\n'),
107 ]
107 ]
108 tt.check_pairs(isp.remove_comments, tests)
108 tt.check_pairs(isp.remove_comments, tests)
109
109
110 def test_has_comment():
110 def test_has_comment():
111 tests = [('text', False),
111 tests = [('text', False),
112 ('text #comment', True),
112 ('text #comment', True),
113 ('text #comment\n', True),
113 ('text #comment\n', True),
114 ('#comment', True),
114 ('#comment', True),
115 ('#comment\n', True),
115 ('#comment\n', True),
116 ('a = "#string"', False),
116 ('a = "#string"', False),
117 ('a = "#string" # comment', True),
117 ('a = "#string" # comment', True),
118 ('a #comment not "string"', True),
118 ('a #comment not "string"', True),
119 ]
119 ]
120 tt.check_pairs(isp.has_comment, tests)
120 tt.check_pairs(isp.has_comment, tests)
121
121
122
122
123 def test_get_input_encoding():
123 def test_get_input_encoding():
124 encoding = isp.get_input_encoding()
124 encoding = isp.get_input_encoding()
125 nt.assert_true(isinstance(encoding, basestring))
125 nt.assert_true(isinstance(encoding, basestring))
126 # simple-minded check that at least encoding a simple string works with the
126 # simple-minded check that at least encoding a simple string works with the
127 # encoding we got.
127 # encoding we got.
128 nt.assert_equal('test'.encode(encoding), 'test')
128 nt.assert_equal(u'test'.encode(encoding), b'test')
129
129
130
130
131 class NoInputEncodingTestCase(unittest.TestCase):
131 class NoInputEncodingTestCase(unittest.TestCase):
132 def setUp(self):
132 def setUp(self):
133 self.old_stdin = sys.stdin
133 self.old_stdin = sys.stdin
134 class X: pass
134 class X: pass
135 fake_stdin = X()
135 fake_stdin = X()
136 sys.stdin = fake_stdin
136 sys.stdin = fake_stdin
137
137
138 def test(self):
138 def test(self):
139 # Verify that if sys.stdin has no 'encoding' attribute we do the right
139 # Verify that if sys.stdin has no 'encoding' attribute we do the right
140 # thing
140 # thing
141 enc = isp.get_input_encoding()
141 enc = isp.get_input_encoding()
142 self.assertEqual(enc, 'ascii')
142 self.assertEqual(enc, 'ascii')
143
143
144 def tearDown(self):
144 def tearDown(self):
145 sys.stdin = self.old_stdin
145 sys.stdin = self.old_stdin
146
146
147
147
148 class InputSplitterTestCase(unittest.TestCase):
148 class InputSplitterTestCase(unittest.TestCase):
149 def setUp(self):
149 def setUp(self):
150 self.isp = isp.InputSplitter()
150 self.isp = isp.InputSplitter()
151
151
152 def test_reset(self):
152 def test_reset(self):
153 isp = self.isp
153 isp = self.isp
154 isp.push('x=1')
154 isp.push('x=1')
155 isp.reset()
155 isp.reset()
156 self.assertEqual(isp._buffer, [])
156 self.assertEqual(isp._buffer, [])
157 self.assertEqual(isp.indent_spaces, 0)
157 self.assertEqual(isp.indent_spaces, 0)
158 self.assertEqual(isp.source, '')
158 self.assertEqual(isp.source, '')
159 self.assertEqual(isp.code, None)
159 self.assertEqual(isp.code, None)
160 self.assertEqual(isp._is_complete, False)
160 self.assertEqual(isp._is_complete, False)
161
161
162 def test_source(self):
162 def test_source(self):
163 self.isp._store('1')
163 self.isp._store('1')
164 self.isp._store('2')
164 self.isp._store('2')
165 self.assertEqual(self.isp.source, '1\n2\n')
165 self.assertEqual(self.isp.source, '1\n2\n')
166 self.assertTrue(len(self.isp._buffer)>0)
166 self.assertTrue(len(self.isp._buffer)>0)
167 self.assertEqual(self.isp.source_reset(), '1\n2\n')
167 self.assertEqual(self.isp.source_reset(), '1\n2\n')
168 self.assertEqual(self.isp._buffer, [])
168 self.assertEqual(self.isp._buffer, [])
169 self.assertEqual(self.isp.source, '')
169 self.assertEqual(self.isp.source, '')
170
170
171 def test_indent(self):
171 def test_indent(self):
172 isp = self.isp # shorthand
172 isp = self.isp # shorthand
173 isp.push('x=1')
173 isp.push('x=1')
174 self.assertEqual(isp.indent_spaces, 0)
174 self.assertEqual(isp.indent_spaces, 0)
175 isp.push('if 1:\n x=1')
175 isp.push('if 1:\n x=1')
176 self.assertEqual(isp.indent_spaces, 4)
176 self.assertEqual(isp.indent_spaces, 4)
177 isp.push('y=2\n')
177 isp.push('y=2\n')
178 self.assertEqual(isp.indent_spaces, 0)
178 self.assertEqual(isp.indent_spaces, 0)
179
179
180 def test_indent2(self):
180 def test_indent2(self):
181 # In cell mode, inputs must be fed in whole blocks, so skip this test
181 # In cell mode, inputs must be fed in whole blocks, so skip this test
182 if self.isp.input_mode == 'cell': return
182 if self.isp.input_mode == 'cell': return
183
183
184 isp = self.isp
184 isp = self.isp
185 isp.push('if 1:')
185 isp.push('if 1:')
186 self.assertEqual(isp.indent_spaces, 4)
186 self.assertEqual(isp.indent_spaces, 4)
187 isp.push(' x=1')
187 isp.push(' x=1')
188 self.assertEqual(isp.indent_spaces, 4)
188 self.assertEqual(isp.indent_spaces, 4)
189 # Blank lines shouldn't change the indent level
189 # Blank lines shouldn't change the indent level
190 isp.push(' '*2)
190 isp.push(' '*2)
191 self.assertEqual(isp.indent_spaces, 4)
191 self.assertEqual(isp.indent_spaces, 4)
192
192
193 def test_indent3(self):
193 def test_indent3(self):
194 # In cell mode, inputs must be fed in whole blocks, so skip this test
194 # In cell mode, inputs must be fed in whole blocks, so skip this test
195 if self.isp.input_mode == 'cell': return
195 if self.isp.input_mode == 'cell': return
196
196
197 isp = self.isp
197 isp = self.isp
198 # When a multiline statement contains parens or multiline strings, we
198 # When a multiline statement contains parens or multiline strings, we
199 # shouldn't get confused.
199 # shouldn't get confused.
200 isp.push("if 1:")
200 isp.push("if 1:")
201 isp.push(" x = (1+\n 2)")
201 isp.push(" x = (1+\n 2)")
202 self.assertEqual(isp.indent_spaces, 4)
202 self.assertEqual(isp.indent_spaces, 4)
203
203
204 def test_indent4(self):
204 def test_indent4(self):
205 # In cell mode, inputs must be fed in whole blocks, so skip this test
205 # In cell mode, inputs must be fed in whole blocks, so skip this test
206 if self.isp.input_mode == 'cell': return
206 if self.isp.input_mode == 'cell': return
207
207
208 isp = self.isp
208 isp = self.isp
209 # whitespace after ':' should not screw up indent level
209 # whitespace after ':' should not screw up indent level
210 isp.push('if 1: \n x=1')
210 isp.push('if 1: \n x=1')
211 self.assertEqual(isp.indent_spaces, 4)
211 self.assertEqual(isp.indent_spaces, 4)
212 isp.push('y=2\n')
212 isp.push('y=2\n')
213 self.assertEqual(isp.indent_spaces, 0)
213 self.assertEqual(isp.indent_spaces, 0)
214 isp.push('if 1:\t\n x=1')
214 isp.push('if 1:\t\n x=1')
215 self.assertEqual(isp.indent_spaces, 4)
215 self.assertEqual(isp.indent_spaces, 4)
216 isp.push('y=2\n')
216 isp.push('y=2\n')
217 self.assertEqual(isp.indent_spaces, 0)
217 self.assertEqual(isp.indent_spaces, 0)
218
218
219 def test_dedent_pass(self):
219 def test_dedent_pass(self):
220 isp = self.isp # shorthand
220 isp = self.isp # shorthand
221 # should NOT cause dedent
221 # should NOT cause dedent
222 isp.push('if 1:\n passes = 5')
222 isp.push('if 1:\n passes = 5')
223 self.assertEqual(isp.indent_spaces, 4)
223 self.assertEqual(isp.indent_spaces, 4)
224 isp.push('if 1:\n pass')
224 isp.push('if 1:\n pass')
225 self.assertEqual(isp.indent_spaces, 0)
225 self.assertEqual(isp.indent_spaces, 0)
226 isp.push('if 1:\n pass ')
226 isp.push('if 1:\n pass ')
227 self.assertEqual(isp.indent_spaces, 0)
227 self.assertEqual(isp.indent_spaces, 0)
228
228
229 def test_dedent_raise(self):
229 def test_dedent_raise(self):
230 isp = self.isp # shorthand
230 isp = self.isp # shorthand
231 # should NOT cause dedent
231 # should NOT cause dedent
232 isp.push('if 1:\n raised = 4')
232 isp.push('if 1:\n raised = 4')
233 self.assertEqual(isp.indent_spaces, 4)
233 self.assertEqual(isp.indent_spaces, 4)
234 isp.push('if 1:\n raise TypeError()')
234 isp.push('if 1:\n raise TypeError()')
235 self.assertEqual(isp.indent_spaces, 0)
235 self.assertEqual(isp.indent_spaces, 0)
236 isp.push('if 1:\n raise')
236 isp.push('if 1:\n raise')
237 self.assertEqual(isp.indent_spaces, 0)
237 self.assertEqual(isp.indent_spaces, 0)
238 isp.push('if 1:\n raise ')
238 isp.push('if 1:\n raise ')
239 self.assertEqual(isp.indent_spaces, 0)
239 self.assertEqual(isp.indent_spaces, 0)
240
240
241 def test_dedent_return(self):
241 def test_dedent_return(self):
242 isp = self.isp # shorthand
242 isp = self.isp # shorthand
243 # should NOT cause dedent
243 # should NOT cause dedent
244 isp.push('if 1:\n returning = 4')
244 isp.push('if 1:\n returning = 4')
245 self.assertEqual(isp.indent_spaces, 4)
245 self.assertEqual(isp.indent_spaces, 4)
246 isp.push('if 1:\n return 5 + 493')
246 isp.push('if 1:\n return 5 + 493')
247 self.assertEqual(isp.indent_spaces, 0)
247 self.assertEqual(isp.indent_spaces, 0)
248 isp.push('if 1:\n return')
248 isp.push('if 1:\n return')
249 self.assertEqual(isp.indent_spaces, 0)
249 self.assertEqual(isp.indent_spaces, 0)
250 isp.push('if 1:\n return ')
250 isp.push('if 1:\n return ')
251 self.assertEqual(isp.indent_spaces, 0)
251 self.assertEqual(isp.indent_spaces, 0)
252 isp.push('if 1:\n return(0)')
252 isp.push('if 1:\n return(0)')
253 self.assertEqual(isp.indent_spaces, 0)
253 self.assertEqual(isp.indent_spaces, 0)
254
254
255 def test_push(self):
255 def test_push(self):
256 isp = self.isp
256 isp = self.isp
257 self.assertTrue(isp.push('x=1'))
257 self.assertTrue(isp.push('x=1'))
258
258
259 def test_push2(self):
259 def test_push2(self):
260 isp = self.isp
260 isp = self.isp
261 self.assertFalse(isp.push('if 1:'))
261 self.assertFalse(isp.push('if 1:'))
262 for line in [' x=1', '# a comment', ' y=2']:
262 for line in [' x=1', '# a comment', ' y=2']:
263 self.assertTrue(isp.push(line))
263 self.assertTrue(isp.push(line))
264
264
265 def test_push3(self):
265 def test_push3(self):
266 isp = self.isp
266 isp = self.isp
267 isp.push('if True:')
267 isp.push('if True:')
268 isp.push(' a = 1')
268 isp.push(' a = 1')
269 self.assertFalse(isp.push('b = [1,'))
269 self.assertFalse(isp.push('b = [1,'))
270
270
271 def test_replace_mode(self):
271 def test_replace_mode(self):
272 isp = self.isp
272 isp = self.isp
273 isp.input_mode = 'cell'
273 isp.input_mode = 'cell'
274 isp.push('x=1')
274 isp.push('x=1')
275 self.assertEqual(isp.source, 'x=1\n')
275 self.assertEqual(isp.source, 'x=1\n')
276 isp.push('x=2')
276 isp.push('x=2')
277 self.assertEqual(isp.source, 'x=2\n')
277 self.assertEqual(isp.source, 'x=2\n')
278
278
279 def test_push_accepts_more(self):
279 def test_push_accepts_more(self):
280 isp = self.isp
280 isp = self.isp
281 isp.push('x=1')
281 isp.push('x=1')
282 self.assertFalse(isp.push_accepts_more())
282 self.assertFalse(isp.push_accepts_more())
283
283
284 def test_push_accepts_more2(self):
284 def test_push_accepts_more2(self):
285 # In cell mode, inputs must be fed in whole blocks, so skip this test
285 # In cell mode, inputs must be fed in whole blocks, so skip this test
286 if self.isp.input_mode == 'cell': return
286 if self.isp.input_mode == 'cell': return
287
287
288 isp = self.isp
288 isp = self.isp
289 isp.push('if 1:')
289 isp.push('if 1:')
290 self.assertTrue(isp.push_accepts_more())
290 self.assertTrue(isp.push_accepts_more())
291 isp.push(' x=1')
291 isp.push(' x=1')
292 self.assertTrue(isp.push_accepts_more())
292 self.assertTrue(isp.push_accepts_more())
293 isp.push('')
293 isp.push('')
294 self.assertFalse(isp.push_accepts_more())
294 self.assertFalse(isp.push_accepts_more())
295
295
296 def test_push_accepts_more3(self):
296 def test_push_accepts_more3(self):
297 isp = self.isp
297 isp = self.isp
298 isp.push("x = (2+\n3)")
298 isp.push("x = (2+\n3)")
299 self.assertFalse(isp.push_accepts_more())
299 self.assertFalse(isp.push_accepts_more())
300
300
301 def test_push_accepts_more4(self):
301 def test_push_accepts_more4(self):
302 # In cell mode, inputs must be fed in whole blocks, so skip this test
302 # In cell mode, inputs must be fed in whole blocks, so skip this test
303 if self.isp.input_mode == 'cell': return
303 if self.isp.input_mode == 'cell': return
304
304
305 isp = self.isp
305 isp = self.isp
306 # When a multiline statement contains parens or multiline strings, we
306 # When a multiline statement contains parens or multiline strings, we
307 # shouldn't get confused.
307 # shouldn't get confused.
308 # FIXME: we should be able to better handle de-dents in statements like
308 # FIXME: we should be able to better handle de-dents in statements like
309 # multiline strings and multiline expressions (continued with \ or
309 # multiline strings and multiline expressions (continued with \ or
310 # parens). Right now we aren't handling the indentation tracking quite
310 # parens). Right now we aren't handling the indentation tracking quite
311 # correctly with this, though in practice it may not be too much of a
311 # correctly with this, though in practice it may not be too much of a
312 # problem. We'll need to see.
312 # problem. We'll need to see.
313 isp.push("if 1:")
313 isp.push("if 1:")
314 isp.push(" x = (2+")
314 isp.push(" x = (2+")
315 isp.push(" 3)")
315 isp.push(" 3)")
316 self.assertTrue(isp.push_accepts_more())
316 self.assertTrue(isp.push_accepts_more())
317 isp.push(" y = 3")
317 isp.push(" y = 3")
318 self.assertTrue(isp.push_accepts_more())
318 self.assertTrue(isp.push_accepts_more())
319 isp.push('')
319 isp.push('')
320 self.assertFalse(isp.push_accepts_more())
320 self.assertFalse(isp.push_accepts_more())
321
321
322 def test_push_accepts_more5(self):
322 def test_push_accepts_more5(self):
323 # In cell mode, inputs must be fed in whole blocks, so skip this test
323 # In cell mode, inputs must be fed in whole blocks, so skip this test
324 if self.isp.input_mode == 'cell': return
324 if self.isp.input_mode == 'cell': return
325
325
326 isp = self.isp
326 isp = self.isp
327 isp.push('try:')
327 isp.push('try:')
328 isp.push(' a = 5')
328 isp.push(' a = 5')
329 isp.push('except:')
329 isp.push('except:')
330 isp.push(' raise')
330 isp.push(' raise')
331 self.assertTrue(isp.push_accepts_more())
331 self.assertTrue(isp.push_accepts_more())
332
332
333 def test_continuation(self):
333 def test_continuation(self):
334 isp = self.isp
334 isp = self.isp
335 isp.push("import os, \\")
335 isp.push("import os, \\")
336 self.assertTrue(isp.push_accepts_more())
336 self.assertTrue(isp.push_accepts_more())
337 isp.push("sys")
337 isp.push("sys")
338 self.assertFalse(isp.push_accepts_more())
338 self.assertFalse(isp.push_accepts_more())
339
339
340 def test_syntax_error(self):
340 def test_syntax_error(self):
341 isp = self.isp
341 isp = self.isp
342 # Syntax errors immediately produce a 'ready' block, so the invalid
342 # Syntax errors immediately produce a 'ready' block, so the invalid
343 # Python can be sent to the kernel for evaluation with possible ipython
343 # Python can be sent to the kernel for evaluation with possible ipython
344 # special-syntax conversion.
344 # special-syntax conversion.
345 isp.push('run foo')
345 isp.push('run foo')
346 self.assertFalse(isp.push_accepts_more())
346 self.assertFalse(isp.push_accepts_more())
347
347
348 def test_unicode(self):
348 def test_unicode(self):
349 self.isp.push(u"PΓ©rez")
349 self.isp.push(u"PΓ©rez")
350 self.isp.push(u'\xc3\xa9')
350 self.isp.push(u'\xc3\xa9')
351 self.isp.push(u"u'\xc3\xa9'")
351 self.isp.push(u"u'\xc3\xa9'")
352
352
353 class InteractiveLoopTestCase(unittest.TestCase):
353 class InteractiveLoopTestCase(unittest.TestCase):
354 """Tests for an interactive loop like a python shell.
354 """Tests for an interactive loop like a python shell.
355 """
355 """
356 def check_ns(self, lines, ns):
356 def check_ns(self, lines, ns):
357 """Validate that the given input lines produce the resulting namespace.
357 """Validate that the given input lines produce the resulting namespace.
358
358
359 Note: the input lines are given exactly as they would be typed in an
359 Note: the input lines are given exactly as they would be typed in an
360 auto-indenting environment, as mini_interactive_loop above already does
360 auto-indenting environment, as mini_interactive_loop above already does
361 auto-indenting and prepends spaces to the input.
361 auto-indenting and prepends spaces to the input.
362 """
362 """
363 src = mini_interactive_loop(pseudo_input(lines))
363 src = mini_interactive_loop(pseudo_input(lines))
364 test_ns = {}
364 test_ns = {}
365 exec src in test_ns
365 exec src in test_ns
366 # We can't check that the provided ns is identical to the test_ns,
366 # We can't check that the provided ns is identical to the test_ns,
367 # because Python fills test_ns with extra keys (copyright, etc). But
367 # because Python fills test_ns with extra keys (copyright, etc). But
368 # we can check that the given dict is *contained* in test_ns
368 # we can check that the given dict is *contained* in test_ns
369 for k,v in ns.iteritems():
369 for k,v in ns.iteritems():
370 self.assertEqual(test_ns[k], v)
370 self.assertEqual(test_ns[k], v)
371
371
372 def test_simple(self):
372 def test_simple(self):
373 self.check_ns(['x=1'], dict(x=1))
373 self.check_ns(['x=1'], dict(x=1))
374
374
375 def test_simple2(self):
375 def test_simple2(self):
376 self.check_ns(['if 1:', 'x=2'], dict(x=2))
376 self.check_ns(['if 1:', 'x=2'], dict(x=2))
377
377
378 def test_xy(self):
378 def test_xy(self):
379 self.check_ns(['x=1; y=2'], dict(x=1, y=2))
379 self.check_ns(['x=1; y=2'], dict(x=1, y=2))
380
380
381 def test_abc(self):
381 def test_abc(self):
382 self.check_ns(['if 1:','a=1','b=2','c=3'], dict(a=1, b=2, c=3))
382 self.check_ns(['if 1:','a=1','b=2','c=3'], dict(a=1, b=2, c=3))
383
383
384 def test_multi(self):
384 def test_multi(self):
385 self.check_ns(['x =(1+','1+','2)'], dict(x=4))
385 self.check_ns(['x =(1+','1+','2)'], dict(x=4))
386
386
387
387
388 def test_LineInfo():
388 def test_LineInfo():
389 """Simple test for LineInfo construction and str()"""
389 """Simple test for LineInfo construction and str()"""
390 linfo = isp.LineInfo(' %cd /home')
390 linfo = isp.LineInfo(' %cd /home')
391 nt.assert_equals(str(linfo), 'LineInfo [ |%|cd|/home]')
391 nt.assert_equals(str(linfo), 'LineInfo [ |%|cd|/home]')
392
392
393
393
394 def test_split_user_input():
394 def test_split_user_input():
395 """Unicode test - split_user_input already has good doctests"""
395 """Unicode test - split_user_input already has good doctests"""
396 line = u"PΓ©rez Fernando"
396 line = u"PΓ©rez Fernando"
397 parts = isp.split_user_input(line)
397 parts = isp.split_user_input(line)
398 parts_expected = (u'', u'', u'', line)
398 parts_expected = (u'', u'', u'', line)
399 nt.assert_equal(parts, parts_expected)
399 nt.assert_equal(parts, parts_expected)
400
400
401
401
402 # Transformer tests
402 # Transformer tests
403 def transform_checker(tests, func):
403 def transform_checker(tests, func):
404 """Utility to loop over test inputs"""
404 """Utility to loop over test inputs"""
405 for inp, tr in tests:
405 for inp, tr in tests:
406 nt.assert_equals(func(inp), tr)
406 nt.assert_equals(func(inp), tr)
407
407
408 # Data for all the syntax tests in the form of lists of pairs of
408 # Data for all the syntax tests in the form of lists of pairs of
409 # raw/transformed input. We store it here as a global dict so that we can use
409 # raw/transformed input. We store it here as a global dict so that we can use
410 # it both within single-function tests and also to validate the behavior of the
410 # it both within single-function tests and also to validate the behavior of the
411 # larger objects
411 # larger objects
412
412
413 syntax = \
413 syntax = \
414 dict(assign_system =
414 dict(assign_system =
415 [('a =! ls', 'a = get_ipython().getoutput(u"ls")'),
415 [('a =! ls', 'a = get_ipython().getoutput(u"ls")'),
416 ('b = !ls', 'b = get_ipython().getoutput(u"ls")'),
416 ('b = !ls', 'b = get_ipython().getoutput(u"ls")'),
417 ('x=1', 'x=1'), # normal input is unmodified
417 ('x=1', 'x=1'), # normal input is unmodified
418 (' ',' '), # blank lines are kept intact
418 (' ',' '), # blank lines are kept intact
419 ],
419 ],
420
420
421 assign_magic =
421 assign_magic =
422 [('a =% who', 'a = get_ipython().magic(u"who")'),
422 [('a =% who', 'a = get_ipython().magic(u"who")'),
423 ('b = %who', 'b = get_ipython().magic(u"who")'),
423 ('b = %who', 'b = get_ipython().magic(u"who")'),
424 ('x=1', 'x=1'), # normal input is unmodified
424 ('x=1', 'x=1'), # normal input is unmodified
425 (' ',' '), # blank lines are kept intact
425 (' ',' '), # blank lines are kept intact
426 ],
426 ],
427
427
428 classic_prompt =
428 classic_prompt =
429 [('>>> x=1', 'x=1'),
429 [('>>> x=1', 'x=1'),
430 ('x=1', 'x=1'), # normal input is unmodified
430 ('x=1', 'x=1'), # normal input is unmodified
431 (' ', ' '), # blank lines are kept intact
431 (' ', ' '), # blank lines are kept intact
432 ('... ', ''), # continuation prompts
432 ('... ', ''), # continuation prompts
433 ],
433 ],
434
434
435 ipy_prompt =
435 ipy_prompt =
436 [('In [1]: x=1', 'x=1'),
436 [('In [1]: x=1', 'x=1'),
437 ('x=1', 'x=1'), # normal input is unmodified
437 ('x=1', 'x=1'), # normal input is unmodified
438 (' ',' '), # blank lines are kept intact
438 (' ',' '), # blank lines are kept intact
439 (' ....: ', ''), # continuation prompts
439 (' ....: ', ''), # continuation prompts
440 ],
440 ],
441
441
442 # Tests for the escape transformer to leave normal code alone
442 # Tests for the escape transformer to leave normal code alone
443 escaped_noesc =
443 escaped_noesc =
444 [ (' ', ' '),
444 [ (' ', ' '),
445 ('x=1', 'x=1'),
445 ('x=1', 'x=1'),
446 ],
446 ],
447
447
448 # System calls
448 # System calls
449 escaped_shell =
449 escaped_shell =
450 [ ('!ls', 'get_ipython().system(u"ls")'),
450 [ ('!ls', 'get_ipython().system(u"ls")'),
451 # Double-escape shell, this means to capture the output of the
451 # Double-escape shell, this means to capture the output of the
452 # subprocess and return it
452 # subprocess and return it
453 ('!!ls', 'get_ipython().getoutput(u"ls")'),
453 ('!!ls', 'get_ipython().getoutput(u"ls")'),
454 ],
454 ],
455
455
456 # Help/object info
456 # Help/object info
457 escaped_help =
457 escaped_help =
458 [ ('?', 'get_ipython().show_usage()'),
458 [ ('?', 'get_ipython().show_usage()'),
459 ('?x1', 'get_ipython().magic(u"pinfo x1")'),
459 ('?x1', 'get_ipython().magic(u"pinfo x1")'),
460 ('??x2', 'get_ipython().magic(u"pinfo2 x2")'),
460 ('??x2', 'get_ipython().magic(u"pinfo2 x2")'),
461 ('?a.*s', 'get_ipython().magic(u"psearch a.*s")'),
461 ('?a.*s', 'get_ipython().magic(u"psearch a.*s")'),
462 ('?%hist', 'get_ipython().magic(u"pinfo %hist")'),
462 ('?%hist', 'get_ipython().magic(u"pinfo %hist")'),
463 ('?abc = qwe', 'get_ipython().magic(u"pinfo abc")'),
463 ('?abc = qwe', 'get_ipython().magic(u"pinfo abc")'),
464 ],
464 ],
465
465
466 end_help =
466 end_help =
467 [ ('x3?', 'get_ipython().magic(u"pinfo x3")'),
467 [ ('x3?', 'get_ipython().magic(u"pinfo x3")'),
468 ('x4??', 'get_ipython().magic(u"pinfo2 x4")'),
468 ('x4??', 'get_ipython().magic(u"pinfo2 x4")'),
469 ('%hist?', 'get_ipython().magic(u"pinfo %hist")'),
469 ('%hist?', 'get_ipython().magic(u"pinfo %hist")'),
470 ('f*?', 'get_ipython().magic(u"psearch f*")'),
470 ('f*?', 'get_ipython().magic(u"psearch f*")'),
471 ('ax.*aspe*?', 'get_ipython().magic(u"psearch ax.*aspe*")'),
471 ('ax.*aspe*?', 'get_ipython().magic(u"psearch ax.*aspe*")'),
472 ('a = abc?', 'get_ipython().magic(u"pinfo abc", next_input=u"a = abc")'),
472 ('a = abc?', 'get_ipython().magic(u"pinfo abc", next_input=u"a = abc")'),
473 ('a = abc.qe??', 'get_ipython().magic(u"pinfo2 abc.qe", next_input=u"a = abc.qe")'),
473 ('a = abc.qe??', 'get_ipython().magic(u"pinfo2 abc.qe", next_input=u"a = abc.qe")'),
474 ('a = *.items?', 'get_ipython().magic(u"psearch *.items", next_input=u"a = *.items")'),
474 ('a = *.items?', 'get_ipython().magic(u"psearch *.items", next_input=u"a = *.items")'),
475 ('plot(a?', 'get_ipython().magic(u"pinfo a", next_input=u"plot(a")'),
475 ('plot(a?', 'get_ipython().magic(u"pinfo a", next_input=u"plot(a")'),
476 ('a*2 #comment?', 'a*2 #comment?'),
476 ('a*2 #comment?', 'a*2 #comment?'),
477 ],
477 ],
478
478
479 # Explicit magic calls
479 # Explicit magic calls
480 escaped_magic =
480 escaped_magic =
481 [ ('%cd', 'get_ipython().magic(u"cd")'),
481 [ ('%cd', 'get_ipython().magic(u"cd")'),
482 ('%cd /home', 'get_ipython().magic(u"cd /home")'),
482 ('%cd /home', 'get_ipython().magic(u"cd /home")'),
483 (' %magic', ' get_ipython().magic(u"magic")'),
483 (' %magic', ' get_ipython().magic(u"magic")'),
484 ],
484 ],
485
485
486 # Quoting with separate arguments
486 # Quoting with separate arguments
487 escaped_quote =
487 escaped_quote =
488 [ (',f', 'f("")'),
488 [ (',f', 'f("")'),
489 (',f x', 'f("x")'),
489 (',f x', 'f("x")'),
490 (' ,f y', ' f("y")'),
490 (' ,f y', ' f("y")'),
491 (',f a b', 'f("a", "b")'),
491 (',f a b', 'f("a", "b")'),
492 ],
492 ],
493
493
494 # Quoting with single argument
494 # Quoting with single argument
495 escaped_quote2 =
495 escaped_quote2 =
496 [ (';f', 'f("")'),
496 [ (';f', 'f("")'),
497 (';f x', 'f("x")'),
497 (';f x', 'f("x")'),
498 (' ;f y', ' f("y")'),
498 (' ;f y', ' f("y")'),
499 (';f a b', 'f("a b")'),
499 (';f a b', 'f("a b")'),
500 ],
500 ],
501
501
502 # Simply apply parens
502 # Simply apply parens
503 escaped_paren =
503 escaped_paren =
504 [ ('/f', 'f()'),
504 [ ('/f', 'f()'),
505 ('/f x', 'f(x)'),
505 ('/f x', 'f(x)'),
506 (' /f y', ' f(y)'),
506 (' /f y', ' f(y)'),
507 ('/f a b', 'f(a, b)'),
507 ('/f a b', 'f(a, b)'),
508 ],
508 ],
509
509
510 # Check that we transform prompts before other transforms
510 # Check that we transform prompts before other transforms
511 mixed =
511 mixed =
512 [ ('In [1]: %lsmagic', 'get_ipython().magic(u"lsmagic")'),
512 [ ('In [1]: %lsmagic', 'get_ipython().magic(u"lsmagic")'),
513 ('>>> %lsmagic', 'get_ipython().magic(u"lsmagic")'),
513 ('>>> %lsmagic', 'get_ipython().magic(u"lsmagic")'),
514 ('In [2]: !ls', 'get_ipython().system(u"ls")'),
514 ('In [2]: !ls', 'get_ipython().system(u"ls")'),
515 ('In [3]: abs?', 'get_ipython().magic(u"pinfo abs")'),
515 ('In [3]: abs?', 'get_ipython().magic(u"pinfo abs")'),
516 ('In [4]: b = %who', 'b = get_ipython().magic(u"who")'),
516 ('In [4]: b = %who', 'b = get_ipython().magic(u"who")'),
517 ],
517 ],
518 )
518 )
519
519
520 # multiline syntax examples. Each of these should be a list of lists, with
520 # multiline syntax examples. Each of these should be a list of lists, with
521 # each entry itself having pairs of raw/transformed input. The union (with
521 # each entry itself having pairs of raw/transformed input. The union (with
522 # '\n'.join() of the transformed inputs is what the splitter should produce
522 # '\n'.join() of the transformed inputs is what the splitter should produce
523 # when fed the raw lines one at a time via push.
523 # when fed the raw lines one at a time via push.
524 syntax_ml = \
524 syntax_ml = \
525 dict(classic_prompt =
525 dict(classic_prompt =
526 [ [('>>> for i in range(10):','for i in range(10):'),
526 [ [('>>> for i in range(10):','for i in range(10):'),
527 ('... print i',' print i'),
527 ('... print i',' print i'),
528 ('... ', ''),
528 ('... ', ''),
529 ],
529 ],
530 ],
530 ],
531
531
532 ipy_prompt =
532 ipy_prompt =
533 [ [('In [24]: for i in range(10):','for i in range(10):'),
533 [ [('In [24]: for i in range(10):','for i in range(10):'),
534 (' ....: print i',' print i'),
534 (' ....: print i',' print i'),
535 (' ....: ', ''),
535 (' ....: ', ''),
536 ],
536 ],
537 ],
537 ],
538 )
538 )
539
539
540
540
541 def test_assign_system():
541 def test_assign_system():
542 tt.check_pairs(isp.transform_assign_system, syntax['assign_system'])
542 tt.check_pairs(isp.transform_assign_system, syntax['assign_system'])
543
543
544
544
545 def test_assign_magic():
545 def test_assign_magic():
546 tt.check_pairs(isp.transform_assign_magic, syntax['assign_magic'])
546 tt.check_pairs(isp.transform_assign_magic, syntax['assign_magic'])
547
547
548
548
549 def test_classic_prompt():
549 def test_classic_prompt():
550 transform_checker(syntax['classic_prompt'], isp.transform_classic_prompt)
550 transform_checker(syntax['classic_prompt'], isp.transform_classic_prompt)
551 for example in syntax_ml['classic_prompt']:
551 for example in syntax_ml['classic_prompt']:
552 transform_checker(example, isp.transform_classic_prompt)
552 transform_checker(example, isp.transform_classic_prompt)
553
553
554
554
555 def test_ipy_prompt():
555 def test_ipy_prompt():
556 transform_checker(syntax['ipy_prompt'], isp.transform_ipy_prompt)
556 transform_checker(syntax['ipy_prompt'], isp.transform_ipy_prompt)
557 for example in syntax_ml['ipy_prompt']:
557 for example in syntax_ml['ipy_prompt']:
558 transform_checker(example, isp.transform_ipy_prompt)
558 transform_checker(example, isp.transform_ipy_prompt)
559
559
560 def test_end_help():
560 def test_end_help():
561 tt.check_pairs(isp.transform_help_end, syntax['end_help'])
561 tt.check_pairs(isp.transform_help_end, syntax['end_help'])
562
562
563 def test_escaped_noesc():
563 def test_escaped_noesc():
564 tt.check_pairs(isp.transform_escaped, syntax['escaped_noesc'])
564 tt.check_pairs(isp.transform_escaped, syntax['escaped_noesc'])
565
565
566
566
567 def test_escaped_shell():
567 def test_escaped_shell():
568 tt.check_pairs(isp.transform_escaped, syntax['escaped_shell'])
568 tt.check_pairs(isp.transform_escaped, syntax['escaped_shell'])
569
569
570
570
571 def test_escaped_help():
571 def test_escaped_help():
572 tt.check_pairs(isp.transform_escaped, syntax['escaped_help'])
572 tt.check_pairs(isp.transform_escaped, syntax['escaped_help'])
573
573
574
574
575 def test_escaped_magic():
575 def test_escaped_magic():
576 tt.check_pairs(isp.transform_escaped, syntax['escaped_magic'])
576 tt.check_pairs(isp.transform_escaped, syntax['escaped_magic'])
577
577
578
578
579 def test_escaped_quote():
579 def test_escaped_quote():
580 tt.check_pairs(isp.transform_escaped, syntax['escaped_quote'])
580 tt.check_pairs(isp.transform_escaped, syntax['escaped_quote'])
581
581
582
582
583 def test_escaped_quote2():
583 def test_escaped_quote2():
584 tt.check_pairs(isp.transform_escaped, syntax['escaped_quote2'])
584 tt.check_pairs(isp.transform_escaped, syntax['escaped_quote2'])
585
585
586
586
587 def test_escaped_paren():
587 def test_escaped_paren():
588 tt.check_pairs(isp.transform_escaped, syntax['escaped_paren'])
588 tt.check_pairs(isp.transform_escaped, syntax['escaped_paren'])
589
589
590
590
591 class IPythonInputTestCase(InputSplitterTestCase):
591 class IPythonInputTestCase(InputSplitterTestCase):
592 """By just creating a new class whose .isp is a different instance, we
592 """By just creating a new class whose .isp is a different instance, we
593 re-run the same test battery on the new input splitter.
593 re-run the same test battery on the new input splitter.
594
594
595 In addition, this runs the tests over the syntax and syntax_ml dicts that
595 In addition, this runs the tests over the syntax and syntax_ml dicts that
596 were tested by individual functions, as part of the OO interface.
596 were tested by individual functions, as part of the OO interface.
597
597
598 It also makes some checks on the raw buffer storage.
598 It also makes some checks on the raw buffer storage.
599 """
599 """
600
600
601 def setUp(self):
601 def setUp(self):
602 self.isp = isp.IPythonInputSplitter(input_mode='line')
602 self.isp = isp.IPythonInputSplitter(input_mode='line')
603
603
604 def test_syntax(self):
604 def test_syntax(self):
605 """Call all single-line syntax tests from the main object"""
605 """Call all single-line syntax tests from the main object"""
606 isp = self.isp
606 isp = self.isp
607 for example in syntax.itervalues():
607 for example in syntax.itervalues():
608 for raw, out_t in example:
608 for raw, out_t in example:
609 if raw.startswith(' '):
609 if raw.startswith(' '):
610 continue
610 continue
611
611
612 isp.push(raw)
612 isp.push(raw)
613 out, out_raw = isp.source_raw_reset()
613 out, out_raw = isp.source_raw_reset()
614 self.assertEqual(out.rstrip(), out_t)
614 self.assertEqual(out.rstrip(), out_t)
615 self.assertEqual(out_raw.rstrip(), raw.rstrip())
615 self.assertEqual(out_raw.rstrip(), raw.rstrip())
616
616
617 def test_syntax_multiline(self):
617 def test_syntax_multiline(self):
618 isp = self.isp
618 isp = self.isp
619 for example in syntax_ml.itervalues():
619 for example in syntax_ml.itervalues():
620 out_t_parts = []
620 out_t_parts = []
621 raw_parts = []
621 raw_parts = []
622 for line_pairs in example:
622 for line_pairs in example:
623 for lraw, out_t_part in line_pairs:
623 for lraw, out_t_part in line_pairs:
624 isp.push(lraw)
624 isp.push(lraw)
625 out_t_parts.append(out_t_part)
625 out_t_parts.append(out_t_part)
626 raw_parts.append(lraw)
626 raw_parts.append(lraw)
627
627
628 out, out_raw = isp.source_raw_reset()
628 out, out_raw = isp.source_raw_reset()
629 out_t = '\n'.join(out_t_parts).rstrip()
629 out_t = '\n'.join(out_t_parts).rstrip()
630 raw = '\n'.join(raw_parts).rstrip()
630 raw = '\n'.join(raw_parts).rstrip()
631 self.assertEqual(out.rstrip(), out_t)
631 self.assertEqual(out.rstrip(), out_t)
632 self.assertEqual(out_raw.rstrip(), raw)
632 self.assertEqual(out_raw.rstrip(), raw)
633
633
634
634
635 class BlockIPythonInputTestCase(IPythonInputTestCase):
635 class BlockIPythonInputTestCase(IPythonInputTestCase):
636
636
637 # Deactivate tests that don't make sense for the block mode
637 # Deactivate tests that don't make sense for the block mode
638 test_push3 = test_split = lambda s: None
638 test_push3 = test_split = lambda s: None
639
639
640 def setUp(self):
640 def setUp(self):
641 self.isp = isp.IPythonInputSplitter(input_mode='cell')
641 self.isp = isp.IPythonInputSplitter(input_mode='cell')
642
642
643 def test_syntax_multiline(self):
643 def test_syntax_multiline(self):
644 isp = self.isp
644 isp = self.isp
645 for example in syntax_ml.itervalues():
645 for example in syntax_ml.itervalues():
646 raw_parts = []
646 raw_parts = []
647 out_t_parts = []
647 out_t_parts = []
648 for line_pairs in example:
648 for line_pairs in example:
649 for raw, out_t_part in line_pairs:
649 for raw, out_t_part in line_pairs:
650 raw_parts.append(raw)
650 raw_parts.append(raw)
651 out_t_parts.append(out_t_part)
651 out_t_parts.append(out_t_part)
652
652
653 raw = '\n'.join(raw_parts)
653 raw = '\n'.join(raw_parts)
654 out_t = '\n'.join(out_t_parts)
654 out_t = '\n'.join(out_t_parts)
655
655
656 isp.push(raw)
656 isp.push(raw)
657 out, out_raw = isp.source_raw_reset()
657 out, out_raw = isp.source_raw_reset()
658 # Match ignoring trailing whitespace
658 # Match ignoring trailing whitespace
659 self.assertEqual(out.rstrip(), out_t.rstrip())
659 self.assertEqual(out.rstrip(), out_t.rstrip())
660 self.assertEqual(out_raw.rstrip(), raw.rstrip())
660 self.assertEqual(out_raw.rstrip(), raw.rstrip())
661
661
662
662
663 #-----------------------------------------------------------------------------
663 #-----------------------------------------------------------------------------
664 # Main - use as a script, mostly for developer experiments
664 # Main - use as a script, mostly for developer experiments
665 #-----------------------------------------------------------------------------
665 #-----------------------------------------------------------------------------
666
666
667 if __name__ == '__main__':
667 if __name__ == '__main__':
668 # A simple demo for interactive experimentation. This code will not get
668 # A simple demo for interactive experimentation. This code will not get
669 # picked up by any test suite.
669 # picked up by any test suite.
670 from IPython.core.inputsplitter import InputSplitter, IPythonInputSplitter
670 from IPython.core.inputsplitter import InputSplitter, IPythonInputSplitter
671
671
672 # configure here the syntax to use, prompt and whether to autoindent
672 # configure here the syntax to use, prompt and whether to autoindent
673 #isp, start_prompt = InputSplitter(), '>>> '
673 #isp, start_prompt = InputSplitter(), '>>> '
674 isp, start_prompt = IPythonInputSplitter(), 'In> '
674 isp, start_prompt = IPythonInputSplitter(), 'In> '
675
675
676 autoindent = True
676 autoindent = True
677 #autoindent = False
677 #autoindent = False
678
678
679 try:
679 try:
680 while True:
680 while True:
681 prompt = start_prompt
681 prompt = start_prompt
682 while isp.push_accepts_more():
682 while isp.push_accepts_more():
683 indent = ' '*isp.indent_spaces
683 indent = ' '*isp.indent_spaces
684 if autoindent:
684 if autoindent:
685 line = indent + raw_input(prompt+indent)
685 line = indent + raw_input(prompt+indent)
686 else:
686 else:
687 line = raw_input(prompt)
687 line = raw_input(prompt)
688 isp.push(line)
688 isp.push(line)
689 prompt = '... '
689 prompt = '... '
690
690
691 # Here we just return input so we can use it in a test suite, but a
691 # Here we just return input so we can use it in a test suite, but a
692 # real interpreter would instead send it for execution somewhere.
692 # real interpreter would instead send it for execution somewhere.
693 #src = isp.source; raise EOFError # dbg
693 #src = isp.source; raise EOFError # dbg
694 src, raw = isp.source_raw_reset()
694 src, raw = isp.source_raw_reset()
695 print 'Input source was:\n', src
695 print 'Input source was:\n', src
696 print 'Raw source was:\n', raw
696 print 'Raw source was:\n', raw
697 except EOFError:
697 except EOFError:
698 print 'Bye'
698 print 'Bye'
@@ -1,271 +1,271 b''
1 """Tests for the key interactiveshell module, where the main ipython class is defined.
1 """Tests for the key interactiveshell module, where the main ipython class is defined.
2 """
2 """
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Module imports
4 # Module imports
5 #-----------------------------------------------------------------------------
5 #-----------------------------------------------------------------------------
6
6
7 # stdlib
7 # stdlib
8 import os
8 import os
9 import shutil
9 import shutil
10 import tempfile
10 import tempfile
11
11
12 # third party
12 # third party
13 import nose.tools as nt
13 import nose.tools as nt
14
14
15 # our own packages
15 # our own packages
16 from IPython.testing import decorators as dec
16 from IPython.testing import decorators as dec
17 from IPython.testing.globalipapp import get_ipython
17 from IPython.testing.globalipapp import get_ipython
18
18
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20 # Globals
20 # Globals
21 #-----------------------------------------------------------------------------
21 #-----------------------------------------------------------------------------
22
22
23 # Get the public instance of IPython
23 # Get the public instance of IPython
24 ip = get_ipython()
24 ip = get_ipython()
25
25
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27 # Test functions
27 # Test functions
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29
29
30 @dec.parametric
30 @dec.parametric
31 def test_reset():
31 def test_reset():
32 """reset must clear most namespaces."""
32 """reset must clear most namespaces."""
33 # The number of variables in the private user_ns_hidden is not zero, but it
33 # The number of variables in the private user_ns_hidden is not zero, but it
34 # should be constant regardless of what we do
34 # should be constant regardless of what we do
35 nvars_config_ns = len(ip.user_ns_hidden)
35 nvars_config_ns = len(ip.user_ns_hidden)
36
36
37 # Check that reset runs without error
37 # Check that reset runs without error
38 ip.reset()
38 ip.reset()
39
39
40 # Once we've reset it (to clear of any junk that might have been there from
40 # Once we've reset it (to clear of any junk that might have been there from
41 # other tests, we can count how many variables are in the user's namespace
41 # other tests, we can count how many variables are in the user's namespace
42 nvars_user_ns = len(ip.user_ns)
42 nvars_user_ns = len(ip.user_ns)
43
43
44 # Now add a few variables to user_ns, and check that reset clears them
44 # Now add a few variables to user_ns, and check that reset clears them
45 ip.user_ns['x'] = 1
45 ip.user_ns['x'] = 1
46 ip.user_ns['y'] = 1
46 ip.user_ns['y'] = 1
47 ip.reset()
47 ip.reset()
48
48
49 # Finally, check that all namespaces have only as many variables as we
49 # Finally, check that all namespaces have only as many variables as we
50 # expect to find in them:
50 # expect to find in them:
51 for ns in ip.ns_refs_table:
51 for ns in ip.ns_refs_table:
52 if ns is ip.user_ns:
52 if ns is ip.user_ns:
53 nvars_expected = nvars_user_ns
53 nvars_expected = nvars_user_ns
54 elif ns is ip.user_ns_hidden:
54 elif ns is ip.user_ns_hidden:
55 nvars_expected = nvars_config_ns
55 nvars_expected = nvars_config_ns
56 else:
56 else:
57 nvars_expected = 0
57 nvars_expected = 0
58
58
59 yield nt.assert_equals(len(ns), nvars_expected)
59 yield nt.assert_equals(len(ns), nvars_expected)
60
60
61
61
62 # Tests for reporting of exceptions in various modes, handling of SystemExit,
62 # Tests for reporting of exceptions in various modes, handling of SystemExit,
63 # and %tb functionality. This is really a mix of testing ultraTB and interactiveshell.
63 # and %tb functionality. This is really a mix of testing ultraTB and interactiveshell.
64
64
65 def doctest_tb_plain():
65 def doctest_tb_plain():
66 """
66 """
67 In [18]: xmode plain
67 In [18]: xmode plain
68 Exception reporting mode: Plain
68 Exception reporting mode: Plain
69
69
70 In [19]: run simpleerr.py
70 In [19]: run simpleerr.py
71 Traceback (most recent call last):
71 Traceback (most recent call last):
72 ...line 32, in <module>
72 ...line 32, in <module>
73 bar(mode)
73 bar(mode)
74 ...line 16, in bar
74 ...line 16, in bar
75 div0()
75 div0()
76 ...line 8, in div0
76 ...line 8, in div0
77 x/y
77 x/y
78 ZeroDivisionError: integer division or modulo by zero
78 ZeroDivisionError: ...
79 """
79 """
80
80
81
81
82 def doctest_tb_context():
82 def doctest_tb_context():
83 """
83 """
84 In [3]: xmode context
84 In [3]: xmode context
85 Exception reporting mode: Context
85 Exception reporting mode: Context
86
86
87 In [4]: run simpleerr.py
87 In [4]: run simpleerr.py
88 ---------------------------------------------------------------------------
88 ---------------------------------------------------------------------------
89 ZeroDivisionError Traceback (most recent call last)
89 ZeroDivisionError Traceback (most recent call last)
90 <BLANKLINE>
90 <BLANKLINE>
91 ... in <module>()
91 ... in <module>()
92 30 mode = 'div'
92 30 mode = 'div'
93 31
93 31
94 ---> 32 bar(mode)
94 ---> 32 bar(mode)
95 <BLANKLINE>
95 <BLANKLINE>
96 ... in bar(mode)
96 ... in bar(mode)
97 14 "bar"
97 14 "bar"
98 15 if mode=='div':
98 15 if mode=='div':
99 ---> 16 div0()
99 ---> 16 div0()
100 17 elif mode=='exit':
100 17 elif mode=='exit':
101 18 try:
101 18 try:
102 <BLANKLINE>
102 <BLANKLINE>
103 ... in div0()
103 ... in div0()
104 6 x = 1
104 6 x = 1
105 7 y = 0
105 7 y = 0
106 ----> 8 x/y
106 ----> 8 x/y
107 9
107 9
108 10 def sysexit(stat, mode):
108 10 def sysexit(stat, mode):
109 <BLANKLINE>
109 <BLANKLINE>
110 ZeroDivisionError: integer division or modulo by zero
110 ZeroDivisionError: ...
111 """
111 """
112
112
113
113
114 def doctest_tb_verbose():
114 def doctest_tb_verbose():
115 """
115 """
116 In [5]: xmode verbose
116 In [5]: xmode verbose
117 Exception reporting mode: Verbose
117 Exception reporting mode: Verbose
118
118
119 In [6]: run simpleerr.py
119 In [6]: run simpleerr.py
120 ---------------------------------------------------------------------------
120 ---------------------------------------------------------------------------
121 ZeroDivisionError Traceback (most recent call last)
121 ZeroDivisionError Traceback (most recent call last)
122 <BLANKLINE>
122 <BLANKLINE>
123 ... in <module>()
123 ... in <module>()
124 30 mode = 'div'
124 30 mode = 'div'
125 31
125 31
126 ---> 32 bar(mode)
126 ---> 32 bar(mode)
127 global bar = <function bar at ...>
127 global bar = <function bar at ...>
128 global mode = 'div'
128 global mode = 'div'
129 <BLANKLINE>
129 <BLANKLINE>
130 ... in bar(mode='div')
130 ... in bar(mode='div')
131 14 "bar"
131 14 "bar"
132 15 if mode=='div':
132 15 if mode=='div':
133 ---> 16 div0()
133 ---> 16 div0()
134 global div0 = <function div0 at ...>
134 global div0 = <function div0 at ...>
135 17 elif mode=='exit':
135 17 elif mode=='exit':
136 18 try:
136 18 try:
137 <BLANKLINE>
137 <BLANKLINE>
138 ... in div0()
138 ... in div0()
139 6 x = 1
139 6 x = 1
140 7 y = 0
140 7 y = 0
141 ----> 8 x/y
141 ----> 8 x/y
142 x = 1
142 x = 1
143 y = 0
143 y = 0
144 9
144 9
145 10 def sysexit(stat, mode):
145 10 def sysexit(stat, mode):
146 <BLANKLINE>
146 <BLANKLINE>
147 ZeroDivisionError: integer division or modulo by zero
147 ZeroDivisionError: ...
148 """
148 """
149
149
150
150
151 def doctest_tb_sysexit():
151 def doctest_tb_sysexit():
152 """
152 """
153 In [17]: %xmode plain
153 In [17]: %xmode plain
154 Exception reporting mode: Plain
154 Exception reporting mode: Plain
155
155
156 In [18]: %run simpleerr.py exit
156 In [18]: %run simpleerr.py exit
157 An exception has occurred, use %tb to see the full traceback.
157 An exception has occurred, use %tb to see the full traceback.
158 SystemExit: (1, u'Mode = exit')
158 SystemExit: (1, u'Mode = exit')
159
159
160 In [19]: %run simpleerr.py exit 2
160 In [19]: %run simpleerr.py exit 2
161 An exception has occurred, use %tb to see the full traceback.
161 An exception has occurred, use %tb to see the full traceback.
162 SystemExit: (2, u'Mode = exit')
162 SystemExit: (2, u'Mode = exit')
163
163
164 In [20]: %tb
164 In [20]: %tb
165 Traceback (most recent call last):
165 Traceback (most recent call last):
166 File ... in <module>
166 File ... in <module>
167 bar(mode)
167 bar(mode)
168 File ... line 22, in bar
168 File ... line 22, in bar
169 sysexit(stat, mode)
169 sysexit(stat, mode)
170 File ... line 11, in sysexit
170 File ... line 11, in sysexit
171 raise SystemExit(stat, 'Mode = %s' % mode)
171 raise SystemExit(stat, 'Mode = %s' % mode)
172 SystemExit: (2, u'Mode = exit')
172 SystemExit: (2, u'Mode = exit')
173
173
174 In [21]: %xmode context
174 In [21]: %xmode context
175 Exception reporting mode: Context
175 Exception reporting mode: Context
176
176
177 In [22]: %tb
177 In [22]: %tb
178 ---------------------------------------------------------------------------
178 ---------------------------------------------------------------------------
179 SystemExit Traceback (most recent call last)
179 SystemExit Traceback (most recent call last)
180 <BLANKLINE>
180 <BLANKLINE>
181 ...<module>()
181 ...<module>()
182 30 mode = 'div'
182 30 mode = 'div'
183 31
183 31
184 ---> 32 bar(mode)
184 ---> 32 bar(mode)
185 <BLANKLINE>
185 <BLANKLINE>
186 ...bar(mode)
186 ...bar(mode)
187 20 except:
187 20 except:
188 21 stat = 1
188 21 stat = 1
189 ---> 22 sysexit(stat, mode)
189 ---> 22 sysexit(stat, mode)
190 23 else:
190 23 else:
191 24 raise ValueError('Unknown mode')
191 24 raise ValueError('Unknown mode')
192 <BLANKLINE>
192 <BLANKLINE>
193 ...sysexit(stat, mode)
193 ...sysexit(stat, mode)
194 9
194 9
195 10 def sysexit(stat, mode):
195 10 def sysexit(stat, mode):
196 ---> 11 raise SystemExit(stat, 'Mode = %s' % mode)
196 ---> 11 raise SystemExit(stat, 'Mode = %s' % mode)
197 12
197 12
198 13 def bar(mode):
198 13 def bar(mode):
199 <BLANKLINE>
199 <BLANKLINE>
200 SystemExit: (2, u'Mode = exit')
200 SystemExit: (2, u'Mode = exit')
201
201
202 In [23]: %xmode verbose
202 In [23]: %xmode verbose
203 Exception reporting mode: Verbose
203 Exception reporting mode: Verbose
204
204
205 In [24]: %tb
205 In [24]: %tb
206 ---------------------------------------------------------------------------
206 ---------------------------------------------------------------------------
207 SystemExit Traceback (most recent call last)
207 SystemExit Traceback (most recent call last)
208 <BLANKLINE>
208 <BLANKLINE>
209 ... in <module>()
209 ... in <module>()
210 30 mode = 'div'
210 30 mode = 'div'
211 31
211 31
212 ---> 32 bar(mode)
212 ---> 32 bar(mode)
213 global bar = <function bar at ...>
213 global bar = <function bar at ...>
214 global mode = u'exit'
214 global mode = u'exit'
215 <BLANKLINE>
215 <BLANKLINE>
216 ... in bar(mode=u'exit')
216 ... in bar(mode=u'exit')
217 20 except:
217 20 except:
218 21 stat = 1
218 21 stat = 1
219 ---> 22 sysexit(stat, mode)
219 ---> 22 sysexit(stat, mode)
220 global sysexit = <function sysexit at ...>
220 global sysexit = <function sysexit at ...>
221 stat = 2
221 stat = 2
222 mode = u'exit'
222 mode = u'exit'
223 23 else:
223 23 else:
224 24 raise ValueError('Unknown mode')
224 24 raise ValueError('Unknown mode')
225 <BLANKLINE>
225 <BLANKLINE>
226 ... in sysexit(stat=2, mode=u'exit')
226 ... in sysexit(stat=2, mode=u'exit')
227 9
227 9
228 10 def sysexit(stat, mode):
228 10 def sysexit(stat, mode):
229 ---> 11 raise SystemExit(stat, 'Mode = %s' % mode)
229 ---> 11 raise SystemExit(stat, 'Mode = %s' % mode)
230 global SystemExit = undefined
230 global SystemExit = undefined
231 stat = 2
231 stat = 2
232 mode = u'exit'
232 mode = u'exit'
233 12
233 12
234 13 def bar(mode):
234 13 def bar(mode):
235 <BLANKLINE>
235 <BLANKLINE>
236 SystemExit: (2, u'Mode = exit')
236 SystemExit: (2, u'Mode = exit')
237 """
237 """
238
238
239
239
240 def test_run_cell():
240 def test_run_cell():
241 import textwrap
241 import textwrap
242 ip.run_cell('a = 10\na+=1')
242 ip.run_cell('a = 10\na+=1')
243 ip.run_cell('assert a == 11\nassert 1')
243 ip.run_cell('assert a == 11\nassert 1')
244
244
245 nt.assert_equals(ip.user_ns['a'], 11)
245 nt.assert_equals(ip.user_ns['a'], 11)
246 complex = textwrap.dedent("""
246 complex = textwrap.dedent("""
247 if 1:
247 if 1:
248 print "hello"
248 print "hello"
249 if 1:
249 if 1:
250 print "world"
250 print "world"
251
251
252 if 2:
252 if 2:
253 print "foo"
253 print "foo"
254
254
255 if 3:
255 if 3:
256 print "bar"
256 print "bar"
257
257
258 if 4:
258 if 4:
259 print "bar"
259 print "bar"
260
260
261 """)
261 """)
262 # Simply verifies that this kind of input is run
262 # Simply verifies that this kind of input is run
263 ip.run_cell(complex)
263 ip.run_cell(complex)
264
264
265
265
266 def test_db():
266 def test_db():
267 """Test the internal database used for variable persistence."""
267 """Test the internal database used for variable persistence."""
268 ip.db['__unittest_'] = 12
268 ip.db['__unittest_'] = 12
269 nt.assert_equals(ip.db['__unittest_'], 12)
269 nt.assert_equals(ip.db['__unittest_'], 12)
270 del ip.db['__unittest_']
270 del ip.db['__unittest_']
271 assert '__unittest_' not in ip.db
271 assert '__unittest_' not in ip.db
@@ -1,592 +1,592 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Subclass of InteractiveShell for terminal based frontends."""
2 """Subclass of InteractiveShell for terminal based frontends."""
3
3
4 #-----------------------------------------------------------------------------
4 #-----------------------------------------------------------------------------
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
5 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
6 # Copyright (C) 2001-2007 Fernando Perez. <fperez@colorado.edu>
7 # Copyright (C) 2008-2010 The IPython Development Team
7 # Copyright (C) 2008-2010 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 import __builtin__
17 import __builtin__
18 import bdb
18 import bdb
19 from contextlib import nested
19 from contextlib import nested
20 import os
20 import os
21 import re
21 import re
22 import sys
22 import sys
23
23
24 from IPython.core.error import TryNext
24 from IPython.core.error import TryNext
25 from IPython.core.usage import interactive_usage, default_banner
25 from IPython.core.usage import interactive_usage, default_banner
26 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
26 from IPython.core.interactiveshell import InteractiveShell, InteractiveShellABC
27 from IPython.lib.inputhook import enable_gui
27 from IPython.lib.inputhook import enable_gui
28 from IPython.lib.pylabtools import pylab_activate
28 from IPython.lib.pylabtools import pylab_activate
29 from IPython.testing.skipdoctest import skip_doctest
29 from IPython.testing.skipdoctest import skip_doctest
30 from IPython.utils.terminal import toggle_set_term_title, set_term_title
30 from IPython.utils.terminal import toggle_set_term_title, set_term_title
31 from IPython.utils.process import abbrev_cwd
31 from IPython.utils.process import abbrev_cwd
32 from IPython.utils.warn import warn
32 from IPython.utils.warn import warn
33 from IPython.utils.text import num_ini_spaces
33 from IPython.utils.text import num_ini_spaces
34 from IPython.utils.traitlets import Int, CBool, Unicode
34 from IPython.utils.traitlets import Int, CBool, Unicode
35
35
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37 # Utilities
37 # Utilities
38 #-----------------------------------------------------------------------------
38 #-----------------------------------------------------------------------------
39
39
40 def get_default_editor():
40 def get_default_editor():
41 try:
41 try:
42 ed = os.environ['EDITOR']
42 ed = os.environ['EDITOR']
43 except KeyError:
43 except KeyError:
44 if os.name == 'posix':
44 if os.name == 'posix':
45 ed = 'vi' # the only one guaranteed to be there!
45 ed = 'vi' # the only one guaranteed to be there!
46 else:
46 else:
47 ed = 'notepad' # same in Windows!
47 ed = 'notepad' # same in Windows!
48 return ed
48 return ed
49
49
50 #-----------------------------------------------------------------------------
50 #-----------------------------------------------------------------------------
51 # Main class
51 # Main class
52 #-----------------------------------------------------------------------------
52 #-----------------------------------------------------------------------------
53
53
54 class TerminalInteractiveShell(InteractiveShell):
54 class TerminalInteractiveShell(InteractiveShell):
55
55
56 autoedit_syntax = CBool(False, config=True,
56 autoedit_syntax = CBool(False, config=True,
57 help="auto editing of files with syntax errors.")
57 help="auto editing of files with syntax errors.")
58 banner = Unicode('')
58 banner = Unicode('')
59 banner1 = Unicode(default_banner, config=True,
59 banner1 = Unicode(default_banner, config=True,
60 help="""The part of the banner to be printed before the profile"""
60 help="""The part of the banner to be printed before the profile"""
61 )
61 )
62 banner2 = Unicode('', config=True,
62 banner2 = Unicode('', config=True,
63 help="""The part of the banner to be printed after the profile"""
63 help="""The part of the banner to be printed after the profile"""
64 )
64 )
65 confirm_exit = CBool(True, config=True,
65 confirm_exit = CBool(True, config=True,
66 help="""
66 help="""
67 Set to confirm when you try to exit IPython with an EOF (Control-D
67 Set to confirm when you try to exit IPython with an EOF (Control-D
68 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
68 in Unix, Control-Z/Enter in Windows). By typing 'exit' or 'quit',
69 you can force a direct exit without any confirmation.""",
69 you can force a direct exit without any confirmation.""",
70 )
70 )
71 # This display_banner only controls whether or not self.show_banner()
71 # This display_banner only controls whether or not self.show_banner()
72 # is called when mainloop/interact are called. The default is False
72 # is called when mainloop/interact are called. The default is False
73 # because for the terminal based application, the banner behavior
73 # because for the terminal based application, the banner behavior
74 # is controlled by Global.display_banner, which IPythonApp looks at
74 # is controlled by Global.display_banner, which IPythonApp looks at
75 # to determine if *it* should call show_banner() by hand or not.
75 # to determine if *it* should call show_banner() by hand or not.
76 display_banner = CBool(False) # This isn't configurable!
76 display_banner = CBool(False) # This isn't configurable!
77 embedded = CBool(False)
77 embedded = CBool(False)
78 embedded_active = CBool(False)
78 embedded_active = CBool(False)
79 editor = Unicode(get_default_editor(), config=True,
79 editor = Unicode(get_default_editor(), config=True,
80 help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
80 help="Set the editor used by IPython (default to $EDITOR/vi/notepad)."
81 )
81 )
82 pager = Unicode('less', config=True,
82 pager = Unicode('less', config=True,
83 help="The shell program to be used for paging.")
83 help="The shell program to be used for paging.")
84
84
85 screen_length = Int(0, config=True,
85 screen_length = Int(0, config=True,
86 help=
86 help=
87 """Number of lines of your screen, used to control printing of very
87 """Number of lines of your screen, used to control printing of very
88 long strings. Strings longer than this number of lines will be sent
88 long strings. Strings longer than this number of lines will be sent
89 through a pager instead of directly printed. The default value for
89 through a pager instead of directly printed. The default value for
90 this is 0, which means IPython will auto-detect your screen size every
90 this is 0, which means IPython will auto-detect your screen size every
91 time it needs to print certain potentially long strings (this doesn't
91 time it needs to print certain potentially long strings (this doesn't
92 change the behavior of the 'print' keyword, it's only triggered
92 change the behavior of the 'print' keyword, it's only triggered
93 internally). If for some reason this isn't working well (it needs
93 internally). If for some reason this isn't working well (it needs
94 curses support), specify it yourself. Otherwise don't change the
94 curses support), specify it yourself. Otherwise don't change the
95 default.""",
95 default.""",
96 )
96 )
97 term_title = CBool(False, config=True,
97 term_title = CBool(False, config=True,
98 help="Enable auto setting the terminal title."
98 help="Enable auto setting the terminal title."
99 )
99 )
100
100
101 def __init__(self, config=None, ipython_dir=None, profile_dir=None, user_ns=None,
101 def __init__(self, config=None, ipython_dir=None, profile_dir=None, user_ns=None,
102 user_global_ns=None, custom_exceptions=((),None),
102 user_global_ns=None, custom_exceptions=((),None),
103 usage=None, banner1=None, banner2=None,
103 usage=None, banner1=None, banner2=None,
104 display_banner=None):
104 display_banner=None):
105
105
106 super(TerminalInteractiveShell, self).__init__(
106 super(TerminalInteractiveShell, self).__init__(
107 config=config, profile_dir=profile_dir, user_ns=user_ns,
107 config=config, profile_dir=profile_dir, user_ns=user_ns,
108 user_global_ns=user_global_ns, custom_exceptions=custom_exceptions
108 user_global_ns=user_global_ns, custom_exceptions=custom_exceptions
109 )
109 )
110 # use os.system instead of utils.process.system by default, except on Windows
110 # use os.system instead of utils.process.system by default, except on Windows
111 if os.name == 'nt':
111 if os.name == 'nt':
112 self.system = self.system_piped
112 self.system = self.system_piped
113 else:
113 else:
114 self.system = self.system_raw
114 self.system = self.system_raw
115
115
116 self.init_term_title()
116 self.init_term_title()
117 self.init_usage(usage)
117 self.init_usage(usage)
118 self.init_banner(banner1, banner2, display_banner)
118 self.init_banner(banner1, banner2, display_banner)
119
119
120 #-------------------------------------------------------------------------
120 #-------------------------------------------------------------------------
121 # Things related to the terminal
121 # Things related to the terminal
122 #-------------------------------------------------------------------------
122 #-------------------------------------------------------------------------
123
123
124 @property
124 @property
125 def usable_screen_length(self):
125 def usable_screen_length(self):
126 if self.screen_length == 0:
126 if self.screen_length == 0:
127 return 0
127 return 0
128 else:
128 else:
129 num_lines_bot = self.separate_in.count('\n')+1
129 num_lines_bot = self.separate_in.count('\n')+1
130 return self.screen_length - num_lines_bot
130 return self.screen_length - num_lines_bot
131
131
132 def init_term_title(self):
132 def init_term_title(self):
133 # Enable or disable the terminal title.
133 # Enable or disable the terminal title.
134 if self.term_title:
134 if self.term_title:
135 toggle_set_term_title(True)
135 toggle_set_term_title(True)
136 set_term_title('IPython: ' + abbrev_cwd())
136 set_term_title('IPython: ' + abbrev_cwd())
137 else:
137 else:
138 toggle_set_term_title(False)
138 toggle_set_term_title(False)
139
139
140 #-------------------------------------------------------------------------
140 #-------------------------------------------------------------------------
141 # Things related to aliases
141 # Things related to aliases
142 #-------------------------------------------------------------------------
142 #-------------------------------------------------------------------------
143
143
144 def init_alias(self):
144 def init_alias(self):
145 # The parent class defines aliases that can be safely used with any
145 # The parent class defines aliases that can be safely used with any
146 # frontend.
146 # frontend.
147 super(TerminalInteractiveShell, self).init_alias()
147 super(TerminalInteractiveShell, self).init_alias()
148
148
149 # Now define aliases that only make sense on the terminal, because they
149 # Now define aliases that only make sense on the terminal, because they
150 # need direct access to the console in a way that we can't emulate in
150 # need direct access to the console in a way that we can't emulate in
151 # GUI or web frontend
151 # GUI or web frontend
152 if os.name == 'posix':
152 if os.name == 'posix':
153 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
153 aliases = [('clear', 'clear'), ('more', 'more'), ('less', 'less'),
154 ('man', 'man')]
154 ('man', 'man')]
155 elif os.name == 'nt':
155 elif os.name == 'nt':
156 aliases = [('cls', 'cls')]
156 aliases = [('cls', 'cls')]
157
157
158
158
159 for name, cmd in aliases:
159 for name, cmd in aliases:
160 self.alias_manager.define_alias(name, cmd)
160 self.alias_manager.define_alias(name, cmd)
161
161
162 #-------------------------------------------------------------------------
162 #-------------------------------------------------------------------------
163 # Things related to the banner and usage
163 # Things related to the banner and usage
164 #-------------------------------------------------------------------------
164 #-------------------------------------------------------------------------
165
165
166 def _banner1_changed(self):
166 def _banner1_changed(self):
167 self.compute_banner()
167 self.compute_banner()
168
168
169 def _banner2_changed(self):
169 def _banner2_changed(self):
170 self.compute_banner()
170 self.compute_banner()
171
171
172 def _term_title_changed(self, name, new_value):
172 def _term_title_changed(self, name, new_value):
173 self.init_term_title()
173 self.init_term_title()
174
174
175 def init_banner(self, banner1, banner2, display_banner):
175 def init_banner(self, banner1, banner2, display_banner):
176 if banner1 is not None:
176 if banner1 is not None:
177 self.banner1 = banner1
177 self.banner1 = banner1
178 if banner2 is not None:
178 if banner2 is not None:
179 self.banner2 = banner2
179 self.banner2 = banner2
180 if display_banner is not None:
180 if display_banner is not None:
181 self.display_banner = display_banner
181 self.display_banner = display_banner
182 self.compute_banner()
182 self.compute_banner()
183
183
184 def show_banner(self, banner=None):
184 def show_banner(self, banner=None):
185 if banner is None:
185 if banner is None:
186 banner = self.banner
186 banner = self.banner
187 self.write(banner)
187 self.write(banner)
188
188
189 def compute_banner(self):
189 def compute_banner(self):
190 self.banner = self.banner1
190 self.banner = self.banner1
191 if self.profile and self.profile != 'default':
191 if self.profile and self.profile != 'default':
192 self.banner += '\nIPython profile: %s\n' % self.profile
192 self.banner += '\nIPython profile: %s\n' % self.profile
193 if self.banner2:
193 if self.banner2:
194 self.banner += '\n' + self.banner2
194 self.banner += '\n' + self.banner2
195
195
196 def init_usage(self, usage=None):
196 def init_usage(self, usage=None):
197 if usage is None:
197 if usage is None:
198 self.usage = interactive_usage
198 self.usage = interactive_usage
199 else:
199 else:
200 self.usage = usage
200 self.usage = usage
201
201
202 #-------------------------------------------------------------------------
202 #-------------------------------------------------------------------------
203 # Mainloop and code execution logic
203 # Mainloop and code execution logic
204 #-------------------------------------------------------------------------
204 #-------------------------------------------------------------------------
205
205
206 def mainloop(self, display_banner=None):
206 def mainloop(self, display_banner=None):
207 """Start the mainloop.
207 """Start the mainloop.
208
208
209 If an optional banner argument is given, it will override the
209 If an optional banner argument is given, it will override the
210 internally created default banner.
210 internally created default banner.
211 """
211 """
212
212
213 with nested(self.builtin_trap, self.display_trap):
213 with nested(self.builtin_trap, self.display_trap):
214
214
215 while 1:
215 while 1:
216 try:
216 try:
217 self.interact(display_banner=display_banner)
217 self.interact(display_banner=display_banner)
218 #self.interact_with_readline()
218 #self.interact_with_readline()
219 # XXX for testing of a readline-decoupled repl loop, call
219 # XXX for testing of a readline-decoupled repl loop, call
220 # interact_with_readline above
220 # interact_with_readline above
221 break
221 break
222 except KeyboardInterrupt:
222 except KeyboardInterrupt:
223 # this should not be necessary, but KeyboardInterrupt
223 # this should not be necessary, but KeyboardInterrupt
224 # handling seems rather unpredictable...
224 # handling seems rather unpredictable...
225 self.write("\nKeyboardInterrupt in interact()\n")
225 self.write("\nKeyboardInterrupt in interact()\n")
226
226
227 def interact(self, display_banner=None):
227 def interact(self, display_banner=None):
228 """Closely emulate the interactive Python console."""
228 """Closely emulate the interactive Python console."""
229
229
230 # batch run -> do not interact
230 # batch run -> do not interact
231 if self.exit_now:
231 if self.exit_now:
232 return
232 return
233
233
234 if display_banner is None:
234 if display_banner is None:
235 display_banner = self.display_banner
235 display_banner = self.display_banner
236
236
237 if isinstance(display_banner, basestring):
237 if isinstance(display_banner, basestring):
238 self.show_banner(display_banner)
238 self.show_banner(display_banner)
239 elif display_banner:
239 elif display_banner:
240 self.show_banner()
240 self.show_banner()
241
241
242 more = False
242 more = False
243
243
244 # Mark activity in the builtins
244 # Mark activity in the builtins
245 __builtin__.__dict__['__IPYTHON__active'] += 1
245 __builtin__.__dict__['__IPYTHON__active'] += 1
246
246
247 if self.has_readline:
247 if self.has_readline:
248 self.readline_startup_hook(self.pre_readline)
248 self.readline_startup_hook(self.pre_readline)
249 # exit_now is set by a call to %Exit or %Quit, through the
249 # exit_now is set by a call to %Exit or %Quit, through the
250 # ask_exit callback.
250 # ask_exit callback.
251
251
252 while not self.exit_now:
252 while not self.exit_now:
253 self.hooks.pre_prompt_hook()
253 self.hooks.pre_prompt_hook()
254 if more:
254 if more:
255 try:
255 try:
256 prompt = self.hooks.generate_prompt(True)
256 prompt = self.hooks.generate_prompt(True)
257 except:
257 except:
258 self.showtraceback()
258 self.showtraceback()
259 if self.autoindent:
259 if self.autoindent:
260 self.rl_do_indent = True
260 self.rl_do_indent = True
261
261
262 else:
262 else:
263 try:
263 try:
264 prompt = self.hooks.generate_prompt(False)
264 prompt = self.hooks.generate_prompt(False)
265 except:
265 except:
266 self.showtraceback()
266 self.showtraceback()
267 try:
267 try:
268 line = self.raw_input(prompt)
268 line = self.raw_input(prompt)
269 if self.exit_now:
269 if self.exit_now:
270 # quick exit on sys.std[in|out] close
270 # quick exit on sys.std[in|out] close
271 break
271 break
272 if self.autoindent:
272 if self.autoindent:
273 self.rl_do_indent = False
273 self.rl_do_indent = False
274
274
275 except KeyboardInterrupt:
275 except KeyboardInterrupt:
276 #double-guard against keyboardinterrupts during kbdint handling
276 #double-guard against keyboardinterrupts during kbdint handling
277 try:
277 try:
278 self.write('\nKeyboardInterrupt\n')
278 self.write('\nKeyboardInterrupt\n')
279 self.input_splitter.reset()
279 self.input_splitter.reset()
280 more = False
280 more = False
281 except KeyboardInterrupt:
281 except KeyboardInterrupt:
282 pass
282 pass
283 except EOFError:
283 except EOFError:
284 if self.autoindent:
284 if self.autoindent:
285 self.rl_do_indent = False
285 self.rl_do_indent = False
286 if self.has_readline:
286 if self.has_readline:
287 self.readline_startup_hook(None)
287 self.readline_startup_hook(None)
288 self.write('\n')
288 self.write('\n')
289 self.exit()
289 self.exit()
290 except bdb.BdbQuit:
290 except bdb.BdbQuit:
291 warn('The Python debugger has exited with a BdbQuit exception.\n'
291 warn('The Python debugger has exited with a BdbQuit exception.\n'
292 'Because of how pdb handles the stack, it is impossible\n'
292 'Because of how pdb handles the stack, it is impossible\n'
293 'for IPython to properly format this particular exception.\n'
293 'for IPython to properly format this particular exception.\n'
294 'IPython will resume normal operation.')
294 'IPython will resume normal operation.')
295 except:
295 except:
296 # exceptions here are VERY RARE, but they can be triggered
296 # exceptions here are VERY RARE, but they can be triggered
297 # asynchronously by signal handlers, for example.
297 # asynchronously by signal handlers, for example.
298 self.showtraceback()
298 self.showtraceback()
299 else:
299 else:
300 self.input_splitter.push(line)
300 self.input_splitter.push(line)
301 more = self.input_splitter.push_accepts_more()
301 more = self.input_splitter.push_accepts_more()
302 if (self.SyntaxTB.last_syntax_error and
302 if (self.SyntaxTB.last_syntax_error and
303 self.autoedit_syntax):
303 self.autoedit_syntax):
304 self.edit_syntax_error()
304 self.edit_syntax_error()
305 if not more:
305 if not more:
306 source_raw = self.input_splitter.source_raw_reset()[1]
306 source_raw = self.input_splitter.source_raw_reset()[1]
307 self.run_cell(source_raw)
307 self.run_cell(source_raw)
308
308
309 # We are off again...
309 # We are off again...
310 __builtin__.__dict__['__IPYTHON__active'] -= 1
310 __builtin__.__dict__['__IPYTHON__active'] -= 1
311
311
312 # Turn off the exit flag, so the mainloop can be restarted if desired
312 # Turn off the exit flag, so the mainloop can be restarted if desired
313 self.exit_now = False
313 self.exit_now = False
314
314
315 def raw_input(self, prompt=''):
315 def raw_input(self, prompt=''):
316 """Write a prompt and read a line.
316 """Write a prompt and read a line.
317
317
318 The returned line does not include the trailing newline.
318 The returned line does not include the trailing newline.
319 When the user enters the EOF key sequence, EOFError is raised.
319 When the user enters the EOF key sequence, EOFError is raised.
320
320
321 Optional inputs:
321 Optional inputs:
322
322
323 - prompt(''): a string to be printed to prompt the user.
323 - prompt(''): a string to be printed to prompt the user.
324
324
325 - continue_prompt(False): whether this line is the first one or a
325 - continue_prompt(False): whether this line is the first one or a
326 continuation in a sequence of inputs.
326 continuation in a sequence of inputs.
327 """
327 """
328 # Code run by the user may have modified the readline completer state.
328 # Code run by the user may have modified the readline completer state.
329 # We must ensure that our completer is back in place.
329 # We must ensure that our completer is back in place.
330
330
331 if self.has_readline:
331 if self.has_readline:
332 self.set_readline_completer()
332 self.set_readline_completer()
333
333
334 try:
334 try:
335 line = self.raw_input_original(prompt).decode(self.stdin_encoding)
335 line = py3compat.str_to_unicode(self.raw_input_original(prompt))
336 except ValueError:
336 except ValueError:
337 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
337 warn("\n********\nYou or a %run:ed script called sys.stdin.close()"
338 " or sys.stdout.close()!\nExiting IPython!")
338 " or sys.stdout.close()!\nExiting IPython!")
339 self.ask_exit()
339 self.ask_exit()
340 return ""
340 return ""
341
341
342 # Try to be reasonably smart about not re-indenting pasted input more
342 # Try to be reasonably smart about not re-indenting pasted input more
343 # than necessary. We do this by trimming out the auto-indent initial
343 # than necessary. We do this by trimming out the auto-indent initial
344 # spaces, if the user's actual input started itself with whitespace.
344 # spaces, if the user's actual input started itself with whitespace.
345 if self.autoindent:
345 if self.autoindent:
346 if num_ini_spaces(line) > self.indent_current_nsp:
346 if num_ini_spaces(line) > self.indent_current_nsp:
347 line = line[self.indent_current_nsp:]
347 line = line[self.indent_current_nsp:]
348 self.indent_current_nsp = 0
348 self.indent_current_nsp = 0
349
349
350 return line
350 return line
351
351
352 #-------------------------------------------------------------------------
352 #-------------------------------------------------------------------------
353 # Methods to support auto-editing of SyntaxErrors.
353 # Methods to support auto-editing of SyntaxErrors.
354 #-------------------------------------------------------------------------
354 #-------------------------------------------------------------------------
355
355
356 def edit_syntax_error(self):
356 def edit_syntax_error(self):
357 """The bottom half of the syntax error handler called in the main loop.
357 """The bottom half of the syntax error handler called in the main loop.
358
358
359 Loop until syntax error is fixed or user cancels.
359 Loop until syntax error is fixed or user cancels.
360 """
360 """
361
361
362 while self.SyntaxTB.last_syntax_error:
362 while self.SyntaxTB.last_syntax_error:
363 # copy and clear last_syntax_error
363 # copy and clear last_syntax_error
364 err = self.SyntaxTB.clear_err_state()
364 err = self.SyntaxTB.clear_err_state()
365 if not self._should_recompile(err):
365 if not self._should_recompile(err):
366 return
366 return
367 try:
367 try:
368 # may set last_syntax_error again if a SyntaxError is raised
368 # may set last_syntax_error again if a SyntaxError is raised
369 self.safe_execfile(err.filename,self.user_ns)
369 self.safe_execfile(err.filename,self.user_ns)
370 except:
370 except:
371 self.showtraceback()
371 self.showtraceback()
372 else:
372 else:
373 try:
373 try:
374 f = file(err.filename)
374 f = file(err.filename)
375 try:
375 try:
376 # This should be inside a display_trap block and I
376 # This should be inside a display_trap block and I
377 # think it is.
377 # think it is.
378 sys.displayhook(f.read())
378 sys.displayhook(f.read())
379 finally:
379 finally:
380 f.close()
380 f.close()
381 except:
381 except:
382 self.showtraceback()
382 self.showtraceback()
383
383
384 def _should_recompile(self,e):
384 def _should_recompile(self,e):
385 """Utility routine for edit_syntax_error"""
385 """Utility routine for edit_syntax_error"""
386
386
387 if e.filename in ('<ipython console>','<input>','<string>',
387 if e.filename in ('<ipython console>','<input>','<string>',
388 '<console>','<BackgroundJob compilation>',
388 '<console>','<BackgroundJob compilation>',
389 None):
389 None):
390
390
391 return False
391 return False
392 try:
392 try:
393 if (self.autoedit_syntax and
393 if (self.autoedit_syntax and
394 not self.ask_yes_no('Return to editor to correct syntax error? '
394 not self.ask_yes_no('Return to editor to correct syntax error? '
395 '[Y/n] ','y')):
395 '[Y/n] ','y')):
396 return False
396 return False
397 except EOFError:
397 except EOFError:
398 return False
398 return False
399
399
400 def int0(x):
400 def int0(x):
401 try:
401 try:
402 return int(x)
402 return int(x)
403 except TypeError:
403 except TypeError:
404 return 0
404 return 0
405 # always pass integer line and offset values to editor hook
405 # always pass integer line and offset values to editor hook
406 try:
406 try:
407 self.hooks.fix_error_editor(e.filename,
407 self.hooks.fix_error_editor(e.filename,
408 int0(e.lineno),int0(e.offset),e.msg)
408 int0(e.lineno),int0(e.offset),e.msg)
409 except TryNext:
409 except TryNext:
410 warn('Could not open editor')
410 warn('Could not open editor')
411 return False
411 return False
412 return True
412 return True
413
413
414 #-------------------------------------------------------------------------
414 #-------------------------------------------------------------------------
415 # Things related to GUI support and pylab
415 # Things related to GUI support and pylab
416 #-------------------------------------------------------------------------
416 #-------------------------------------------------------------------------
417
417
418 def enable_pylab(self, gui=None, import_all=True):
418 def enable_pylab(self, gui=None, import_all=True):
419 """Activate pylab support at runtime.
419 """Activate pylab support at runtime.
420
420
421 This turns on support for matplotlib, preloads into the interactive
421 This turns on support for matplotlib, preloads into the interactive
422 namespace all of numpy and pylab, and configures IPython to correcdtly
422 namespace all of numpy and pylab, and configures IPython to correcdtly
423 interact with the GUI event loop. The GUI backend to be used can be
423 interact with the GUI event loop. The GUI backend to be used can be
424 optionally selected with the optional :param:`gui` argument.
424 optionally selected with the optional :param:`gui` argument.
425
425
426 Parameters
426 Parameters
427 ----------
427 ----------
428 gui : optional, string
428 gui : optional, string
429
429
430 If given, dictates the choice of matplotlib GUI backend to use
430 If given, dictates the choice of matplotlib GUI backend to use
431 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
431 (should be one of IPython's supported backends, 'tk', 'qt', 'wx' or
432 'gtk'), otherwise we use the default chosen by matplotlib (as
432 'gtk'), otherwise we use the default chosen by matplotlib (as
433 dictated by the matplotlib build-time options plus the user's
433 dictated by the matplotlib build-time options plus the user's
434 matplotlibrc configuration file).
434 matplotlibrc configuration file).
435 """
435 """
436 # We want to prevent the loading of pylab to pollute the user's
436 # We want to prevent the loading of pylab to pollute the user's
437 # namespace as shown by the %who* magics, so we execute the activation
437 # namespace as shown by the %who* magics, so we execute the activation
438 # code in an empty namespace, and we update *both* user_ns and
438 # code in an empty namespace, and we update *both* user_ns and
439 # user_ns_hidden with this information.
439 # user_ns_hidden with this information.
440 ns = {}
440 ns = {}
441 gui = pylab_activate(ns, gui, import_all)
441 gui = pylab_activate(ns, gui, import_all)
442 self.user_ns.update(ns)
442 self.user_ns.update(ns)
443 self.user_ns_hidden.update(ns)
443 self.user_ns_hidden.update(ns)
444 # Now we must activate the gui pylab wants to use, and fix %run to take
444 # Now we must activate the gui pylab wants to use, and fix %run to take
445 # plot updates into account
445 # plot updates into account
446 enable_gui(gui)
446 enable_gui(gui)
447 self.magic_run = self._pylab_magic_run
447 self.magic_run = self._pylab_magic_run
448
448
449 #-------------------------------------------------------------------------
449 #-------------------------------------------------------------------------
450 # Things related to exiting
450 # Things related to exiting
451 #-------------------------------------------------------------------------
451 #-------------------------------------------------------------------------
452
452
453 def ask_exit(self):
453 def ask_exit(self):
454 """ Ask the shell to exit. Can be overiden and used as a callback. """
454 """ Ask the shell to exit. Can be overiden and used as a callback. """
455 self.exit_now = True
455 self.exit_now = True
456
456
457 def exit(self):
457 def exit(self):
458 """Handle interactive exit.
458 """Handle interactive exit.
459
459
460 This method calls the ask_exit callback."""
460 This method calls the ask_exit callback."""
461 if self.confirm_exit:
461 if self.confirm_exit:
462 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
462 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
463 self.ask_exit()
463 self.ask_exit()
464 else:
464 else:
465 self.ask_exit()
465 self.ask_exit()
466
466
467 #------------------------------------------------------------------------
467 #------------------------------------------------------------------------
468 # Magic overrides
468 # Magic overrides
469 #------------------------------------------------------------------------
469 #------------------------------------------------------------------------
470 # Once the base class stops inheriting from magic, this code needs to be
470 # Once the base class stops inheriting from magic, this code needs to be
471 # moved into a separate machinery as well. For now, at least isolate here
471 # moved into a separate machinery as well. For now, at least isolate here
472 # the magics which this class needs to implement differently from the base
472 # the magics which this class needs to implement differently from the base
473 # class, or that are unique to it.
473 # class, or that are unique to it.
474
474
475 def magic_autoindent(self, parameter_s = ''):
475 def magic_autoindent(self, parameter_s = ''):
476 """Toggle autoindent on/off (if available)."""
476 """Toggle autoindent on/off (if available)."""
477
477
478 self.shell.set_autoindent()
478 self.shell.set_autoindent()
479 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
479 print "Automatic indentation is:",['OFF','ON'][self.shell.autoindent]
480
480
481 @skip_doctest
481 @skip_doctest
482 def magic_cpaste(self, parameter_s=''):
482 def magic_cpaste(self, parameter_s=''):
483 """Paste & execute a pre-formatted code block from clipboard.
483 """Paste & execute a pre-formatted code block from clipboard.
484
484
485 You must terminate the block with '--' (two minus-signs) alone on the
485 You must terminate the block with '--' (two minus-signs) alone on the
486 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
486 line. You can also provide your own sentinel with '%paste -s %%' ('%%'
487 is the new sentinel for this operation)
487 is the new sentinel for this operation)
488
488
489 The block is dedented prior to execution to enable execution of method
489 The block is dedented prior to execution to enable execution of method
490 definitions. '>' and '+' characters at the beginning of a line are
490 definitions. '>' and '+' characters at the beginning of a line are
491 ignored, to allow pasting directly from e-mails, diff files and
491 ignored, to allow pasting directly from e-mails, diff files and
492 doctests (the '...' continuation prompt is also stripped). The
492 doctests (the '...' continuation prompt is also stripped). The
493 executed block is also assigned to variable named 'pasted_block' for
493 executed block is also assigned to variable named 'pasted_block' for
494 later editing with '%edit pasted_block'.
494 later editing with '%edit pasted_block'.
495
495
496 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
496 You can also pass a variable name as an argument, e.g. '%cpaste foo'.
497 This assigns the pasted block to variable 'foo' as string, without
497 This assigns the pasted block to variable 'foo' as string, without
498 dedenting or executing it (preceding >>> and + is still stripped)
498 dedenting or executing it (preceding >>> and + is still stripped)
499
499
500 '%cpaste -r' re-executes the block previously entered by cpaste.
500 '%cpaste -r' re-executes the block previously entered by cpaste.
501
501
502 Do not be alarmed by garbled output on Windows (it's a readline bug).
502 Do not be alarmed by garbled output on Windows (it's a readline bug).
503 Just press enter and type -- (and press enter again) and the block
503 Just press enter and type -- (and press enter again) and the block
504 will be what was just pasted.
504 will be what was just pasted.
505
505
506 IPython statements (magics, shell escapes) are not supported (yet).
506 IPython statements (magics, shell escapes) are not supported (yet).
507
507
508 See also
508 See also
509 --------
509 --------
510 paste: automatically pull code from clipboard.
510 paste: automatically pull code from clipboard.
511
511
512 Examples
512 Examples
513 --------
513 --------
514 ::
514 ::
515
515
516 In [8]: %cpaste
516 In [8]: %cpaste
517 Pasting code; enter '--' alone on the line to stop.
517 Pasting code; enter '--' alone on the line to stop.
518 :>>> a = ["world!", "Hello"]
518 :>>> a = ["world!", "Hello"]
519 :>>> print " ".join(sorted(a))
519 :>>> print " ".join(sorted(a))
520 :--
520 :--
521 Hello world!
521 Hello world!
522 """
522 """
523
523
524 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
524 opts,args = self.parse_options(parameter_s,'rs:',mode='string')
525 par = args.strip()
525 par = args.strip()
526 if opts.has_key('r'):
526 if opts.has_key('r'):
527 self._rerun_pasted()
527 self._rerun_pasted()
528 return
528 return
529
529
530 sentinel = opts.get('s','--')
530 sentinel = opts.get('s','--')
531
531
532 block = self._strip_pasted_lines_for_code(
532 block = self._strip_pasted_lines_for_code(
533 self._get_pasted_lines(sentinel))
533 self._get_pasted_lines(sentinel))
534
534
535 self._execute_block(block, par)
535 self._execute_block(block, par)
536
536
537 def magic_paste(self, parameter_s=''):
537 def magic_paste(self, parameter_s=''):
538 """Paste & execute a pre-formatted code block from clipboard.
538 """Paste & execute a pre-formatted code block from clipboard.
539
539
540 The text is pulled directly from the clipboard without user
540 The text is pulled directly from the clipboard without user
541 intervention and printed back on the screen before execution (unless
541 intervention and printed back on the screen before execution (unless
542 the -q flag is given to force quiet mode).
542 the -q flag is given to force quiet mode).
543
543
544 The block is dedented prior to execution to enable execution of method
544 The block is dedented prior to execution to enable execution of method
545 definitions. '>' and '+' characters at the beginning of a line are
545 definitions. '>' and '+' characters at the beginning of a line are
546 ignored, to allow pasting directly from e-mails, diff files and
546 ignored, to allow pasting directly from e-mails, diff files and
547 doctests (the '...' continuation prompt is also stripped). The
547 doctests (the '...' continuation prompt is also stripped). The
548 executed block is also assigned to variable named 'pasted_block' for
548 executed block is also assigned to variable named 'pasted_block' for
549 later editing with '%edit pasted_block'.
549 later editing with '%edit pasted_block'.
550
550
551 You can also pass a variable name as an argument, e.g. '%paste foo'.
551 You can also pass a variable name as an argument, e.g. '%paste foo'.
552 This assigns the pasted block to variable 'foo' as string, without
552 This assigns the pasted block to variable 'foo' as string, without
553 dedenting or executing it (preceding >>> and + is still stripped)
553 dedenting or executing it (preceding >>> and + is still stripped)
554
554
555 Options
555 Options
556 -------
556 -------
557
557
558 -r: re-executes the block previously entered by cpaste.
558 -r: re-executes the block previously entered by cpaste.
559
559
560 -q: quiet mode: do not echo the pasted text back to the terminal.
560 -q: quiet mode: do not echo the pasted text back to the terminal.
561
561
562 IPython statements (magics, shell escapes) are not supported (yet).
562 IPython statements (magics, shell escapes) are not supported (yet).
563
563
564 See also
564 See also
565 --------
565 --------
566 cpaste: manually paste code into terminal until you mark its end.
566 cpaste: manually paste code into terminal until you mark its end.
567 """
567 """
568 opts,args = self.parse_options(parameter_s,'rq',mode='string')
568 opts,args = self.parse_options(parameter_s,'rq',mode='string')
569 par = args.strip()
569 par = args.strip()
570 if opts.has_key('r'):
570 if opts.has_key('r'):
571 self._rerun_pasted()
571 self._rerun_pasted()
572 return
572 return
573
573
574 text = self.shell.hooks.clipboard_get()
574 text = self.shell.hooks.clipboard_get()
575 block = self._strip_pasted_lines_for_code(text.splitlines())
575 block = self._strip_pasted_lines_for_code(text.splitlines())
576
576
577 # By default, echo back to terminal unless quiet mode is requested
577 # By default, echo back to terminal unless quiet mode is requested
578 if not opts.has_key('q'):
578 if not opts.has_key('q'):
579 write = self.shell.write
579 write = self.shell.write
580 write(self.shell.pycolorize(block))
580 write(self.shell.pycolorize(block))
581 if not block.endswith('\n'):
581 if not block.endswith('\n'):
582 write('\n')
582 write('\n')
583 write("## -- End pasted text --\n")
583 write("## -- End pasted text --\n")
584
584
585 self._execute_block(block, par)
585 self._execute_block(block, par)
586
586
587 def showindentationerror(self):
587 def showindentationerror(self):
588 super(TerminalInteractiveShell, self).showindentationerror()
588 super(TerminalInteractiveShell, self).showindentationerror()
589 print("If you want to paste code into IPython, try the %paste magic function.")
589 print("If you want to paste code into IPython, try the %paste magic function.")
590
590
591
591
592 InteractiveShellABC.register(TerminalInteractiveShell)
592 InteractiveShellABC.register(TerminalInteractiveShell)
@@ -1,575 +1,574 b''
1 """Module for interactive demos using IPython.
1 """Module for interactive demos using IPython.
2
2
3 This module implements a few classes for running Python scripts interactively
3 This module implements a few classes for running Python scripts interactively
4 in IPython for demonstrations. With very simple markup (a few tags in
4 in IPython for demonstrations. With very simple markup (a few tags in
5 comments), you can control points where the script stops executing and returns
5 comments), you can control points where the script stops executing and returns
6 control to IPython.
6 control to IPython.
7
7
8
8
9 Provided classes
9 Provided classes
10 ================
10 ================
11
11
12 The classes are (see their docstrings for further details):
12 The classes are (see their docstrings for further details):
13
13
14 - Demo: pure python demos
14 - Demo: pure python demos
15
15
16 - IPythonDemo: demos with input to be processed by IPython as if it had been
16 - IPythonDemo: demos with input to be processed by IPython as if it had been
17 typed interactively (so magics work, as well as any other special syntax you
17 typed interactively (so magics work, as well as any other special syntax you
18 may have added via input prefilters).
18 may have added via input prefilters).
19
19
20 - LineDemo: single-line version of the Demo class. These demos are executed
20 - LineDemo: single-line version of the Demo class. These demos are executed
21 one line at a time, and require no markup.
21 one line at a time, and require no markup.
22
22
23 - IPythonLineDemo: IPython version of the LineDemo class (the demo is
23 - IPythonLineDemo: IPython version of the LineDemo class (the demo is
24 executed a line at a time, but processed via IPython).
24 executed a line at a time, but processed via IPython).
25
25
26 - ClearMixin: mixin to make Demo classes with less visual clutter. It
26 - ClearMixin: mixin to make Demo classes with less visual clutter. It
27 declares an empty marquee and a pre_cmd that clears the screen before each
27 declares an empty marquee and a pre_cmd that clears the screen before each
28 block (see Subclassing below).
28 block (see Subclassing below).
29
29
30 - ClearDemo, ClearIPDemo: mixin-enabled versions of the Demo and IPythonDemo
30 - ClearDemo, ClearIPDemo: mixin-enabled versions of the Demo and IPythonDemo
31 classes.
31 classes.
32
32
33
33
34 Subclassing
34 Subclassing
35 ===========
35 ===========
36
36
37 The classes here all include a few methods meant to make customization by
37 The classes here all include a few methods meant to make customization by
38 subclassing more convenient. Their docstrings below have some more details:
38 subclassing more convenient. Their docstrings below have some more details:
39
39
40 - marquee(): generates a marquee to provide visible on-screen markers at each
40 - marquee(): generates a marquee to provide visible on-screen markers at each
41 block start and end.
41 block start and end.
42
42
43 - pre_cmd(): run right before the execution of each block.
43 - pre_cmd(): run right before the execution of each block.
44
44
45 - post_cmd(): run right after the execution of each block. If the block
45 - post_cmd(): run right after the execution of each block. If the block
46 raises an exception, this is NOT called.
46 raises an exception, this is NOT called.
47
47
48
48
49 Operation
49 Operation
50 =========
50 =========
51
51
52 The file is run in its own empty namespace (though you can pass it a string of
52 The file is run in its own empty namespace (though you can pass it a string of
53 arguments as if in a command line environment, and it will see those as
53 arguments as if in a command line environment, and it will see those as
54 sys.argv). But at each stop, the global IPython namespace is updated with the
54 sys.argv). But at each stop, the global IPython namespace is updated with the
55 current internal demo namespace, so you can work interactively with the data
55 current internal demo namespace, so you can work interactively with the data
56 accumulated so far.
56 accumulated so far.
57
57
58 By default, each block of code is printed (with syntax highlighting) before
58 By default, each block of code is printed (with syntax highlighting) before
59 executing it and you have to confirm execution. This is intended to show the
59 executing it and you have to confirm execution. This is intended to show the
60 code to an audience first so you can discuss it, and only proceed with
60 code to an audience first so you can discuss it, and only proceed with
61 execution once you agree. There are a few tags which allow you to modify this
61 execution once you agree. There are a few tags which allow you to modify this
62 behavior.
62 behavior.
63
63
64 The supported tags are:
64 The supported tags are:
65
65
66 # <demo> stop
66 # <demo> stop
67
67
68 Defines block boundaries, the points where IPython stops execution of the
68 Defines block boundaries, the points where IPython stops execution of the
69 file and returns to the interactive prompt.
69 file and returns to the interactive prompt.
70
70
71 You can optionally mark the stop tag with extra dashes before and after the
71 You can optionally mark the stop tag with extra dashes before and after the
72 word 'stop', to help visually distinguish the blocks in a text editor:
72 word 'stop', to help visually distinguish the blocks in a text editor:
73
73
74 # <demo> --- stop ---
74 # <demo> --- stop ---
75
75
76
76
77 # <demo> silent
77 # <demo> silent
78
78
79 Make a block execute silently (and hence automatically). Typically used in
79 Make a block execute silently (and hence automatically). Typically used in
80 cases where you have some boilerplate or initialization code which you need
80 cases where you have some boilerplate or initialization code which you need
81 executed but do not want to be seen in the demo.
81 executed but do not want to be seen in the demo.
82
82
83 # <demo> auto
83 # <demo> auto
84
84
85 Make a block execute automatically, but still being printed. Useful for
85 Make a block execute automatically, but still being printed. Useful for
86 simple code which does not warrant discussion, since it avoids the extra
86 simple code which does not warrant discussion, since it avoids the extra
87 manual confirmation.
87 manual confirmation.
88
88
89 # <demo> auto_all
89 # <demo> auto_all
90
90
91 This tag can _only_ be in the first block, and if given it overrides the
91 This tag can _only_ be in the first block, and if given it overrides the
92 individual auto tags to make the whole demo fully automatic (no block asks
92 individual auto tags to make the whole demo fully automatic (no block asks
93 for confirmation). It can also be given at creation time (or the attribute
93 for confirmation). It can also be given at creation time (or the attribute
94 set later) to override what's in the file.
94 set later) to override what's in the file.
95
95
96 While _any_ python file can be run as a Demo instance, if there are no stop
96 While _any_ python file can be run as a Demo instance, if there are no stop
97 tags the whole file will run in a single block (no different that calling
97 tags the whole file will run in a single block (no different that calling
98 first %pycat and then %run). The minimal markup to make this useful is to
98 first %pycat and then %run). The minimal markup to make this useful is to
99 place a set of stop tags; the other tags are only there to let you fine-tune
99 place a set of stop tags; the other tags are only there to let you fine-tune
100 the execution.
100 the execution.
101
101
102 This is probably best explained with the simple example file below. You can
102 This is probably best explained with the simple example file below. You can
103 copy this into a file named ex_demo.py, and try running it via:
103 copy this into a file named ex_demo.py, and try running it via:
104
104
105 from IPython.demo import Demo
105 from IPython.demo import Demo
106 d = Demo('ex_demo.py')
106 d = Demo('ex_demo.py')
107 d() <--- Call the d object (omit the parens if you have autocall set to 2).
107 d() <--- Call the d object (omit the parens if you have autocall set to 2).
108
108
109 Each time you call the demo object, it runs the next block. The demo object
109 Each time you call the demo object, it runs the next block. The demo object
110 has a few useful methods for navigation, like again(), edit(), jump(), seek()
110 has a few useful methods for navigation, like again(), edit(), jump(), seek()
111 and back(). It can be reset for a new run via reset() or reloaded from disk
111 and back(). It can be reset for a new run via reset() or reloaded from disk
112 (in case you've edited the source) via reload(). See their docstrings below.
112 (in case you've edited the source) via reload(). See their docstrings below.
113
113
114 Note: To make this simpler to explore, a file called "demo-exercizer.py" has
114 Note: To make this simpler to explore, a file called "demo-exercizer.py" has
115 been added to the "docs/examples/core" directory. Just cd to this directory in
115 been added to the "docs/examples/core" directory. Just cd to this directory in
116 an IPython session, and type::
116 an IPython session, and type::
117
117
118 %run demo-exercizer.py
118 %run demo-exercizer.py
119
119
120 and then follow the directions.
120 and then follow the directions.
121
121
122 Example
122 Example
123 =======
123 =======
124
124
125 The following is a very simple example of a valid demo file.
125 The following is a very simple example of a valid demo file.
126
126
127 #################### EXAMPLE DEMO <ex_demo.py> ###############################
127 #################### EXAMPLE DEMO <ex_demo.py> ###############################
128 '''A simple interactive demo to illustrate the use of IPython's Demo class.'''
128 '''A simple interactive demo to illustrate the use of IPython's Demo class.'''
129
129
130 print 'Hello, welcome to an interactive IPython demo.'
130 print 'Hello, welcome to an interactive IPython demo.'
131
131
132 # The mark below defines a block boundary, which is a point where IPython will
132 # The mark below defines a block boundary, which is a point where IPython will
133 # stop execution and return to the interactive prompt. The dashes are actually
133 # stop execution and return to the interactive prompt. The dashes are actually
134 # optional and used only as a visual aid to clearly separate blocks while
134 # optional and used only as a visual aid to clearly separate blocks while
135 # editing the demo code.
135 # editing the demo code.
136 # <demo> stop
136 # <demo> stop
137
137
138 x = 1
138 x = 1
139 y = 2
139 y = 2
140
140
141 # <demo> stop
141 # <demo> stop
142
142
143 # the mark below makes this block as silent
143 # the mark below makes this block as silent
144 # <demo> silent
144 # <demo> silent
145
145
146 print 'This is a silent block, which gets executed but not printed.'
146 print 'This is a silent block, which gets executed but not printed.'
147
147
148 # <demo> stop
148 # <demo> stop
149 # <demo> auto
149 # <demo> auto
150 print 'This is an automatic block.'
150 print 'This is an automatic block.'
151 print 'It is executed without asking for confirmation, but printed.'
151 print 'It is executed without asking for confirmation, but printed.'
152 z = x+y
152 z = x+y
153
153
154 print 'z=',x
154 print 'z=',x
155
155
156 # <demo> stop
156 # <demo> stop
157 # This is just another normal block.
157 # This is just another normal block.
158 print 'z is now:', z
158 print 'z is now:', z
159
159
160 print 'bye!'
160 print 'bye!'
161 ################### END EXAMPLE DEMO <ex_demo.py> ############################
161 ################### END EXAMPLE DEMO <ex_demo.py> ############################
162 """
162 """
163
163
164 #*****************************************************************************
164 #*****************************************************************************
165 # Copyright (C) 2005-2006 Fernando Perez. <Fernando.Perez@colorado.edu>
165 # Copyright (C) 2005-2006 Fernando Perez. <Fernando.Perez@colorado.edu>
166 #
166 #
167 # Distributed under the terms of the BSD License. The full license is in
167 # Distributed under the terms of the BSD License. The full license is in
168 # the file COPYING, distributed as part of this software.
168 # the file COPYING, distributed as part of this software.
169 #
169 #
170 #*****************************************************************************
170 #*****************************************************************************
171
171
172 import exceptions
173 import os
172 import os
174 import re
173 import re
175 import shlex
174 import shlex
176 import sys
175 import sys
177
176
178 from IPython.utils.PyColorize import Parser
177 from IPython.utils.PyColorize import Parser
179 from IPython.utils import io
178 from IPython.utils import io
180 from IPython.utils.io import file_read, file_readlines
179 from IPython.utils.io import file_read, file_readlines
181 from IPython.utils.text import marquee
180 from IPython.utils.text import marquee
182
181
183 __all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError']
182 __all__ = ['Demo','IPythonDemo','LineDemo','IPythonLineDemo','DemoError']
184
183
185 class DemoError(exceptions.Exception): pass
184 class DemoError(Exception): pass
186
185
187 def re_mark(mark):
186 def re_mark(mark):
188 return re.compile(r'^\s*#\s+<demo>\s+%s\s*$' % mark,re.MULTILINE)
187 return re.compile(r'^\s*#\s+<demo>\s+%s\s*$' % mark,re.MULTILINE)
189
188
190 class Demo(object):
189 class Demo(object):
191
190
192 re_stop = re_mark('-*\s?stop\s?-*')
191 re_stop = re_mark('-*\s?stop\s?-*')
193 re_silent = re_mark('silent')
192 re_silent = re_mark('silent')
194 re_auto = re_mark('auto')
193 re_auto = re_mark('auto')
195 re_auto_all = re_mark('auto_all')
194 re_auto_all = re_mark('auto_all')
196
195
197 def __init__(self,src,title='',arg_str='',auto_all=None):
196 def __init__(self,src,title='',arg_str='',auto_all=None):
198 """Make a new demo object. To run the demo, simply call the object.
197 """Make a new demo object. To run the demo, simply call the object.
199
198
200 See the module docstring for full details and an example (you can use
199 See the module docstring for full details and an example (you can use
201 IPython.Demo? in IPython to see it).
200 IPython.Demo? in IPython to see it).
202
201
203 Inputs:
202 Inputs:
204
203
205 - src is either a file, or file-like object, or a
204 - src is either a file, or file-like object, or a
206 string that can be resolved to a filename.
205 string that can be resolved to a filename.
207
206
208 Optional inputs:
207 Optional inputs:
209
208
210 - title: a string to use as the demo name. Of most use when the demo
209 - title: a string to use as the demo name. Of most use when the demo
211 you are making comes from an object that has no filename, or if you
210 you are making comes from an object that has no filename, or if you
212 want an alternate denotation distinct from the filename.
211 want an alternate denotation distinct from the filename.
213
212
214 - arg_str(''): a string of arguments, internally converted to a list
213 - arg_str(''): a string of arguments, internally converted to a list
215 just like sys.argv, so the demo script can see a similar
214 just like sys.argv, so the demo script can see a similar
216 environment.
215 environment.
217
216
218 - auto_all(None): global flag to run all blocks automatically without
217 - auto_all(None): global flag to run all blocks automatically without
219 confirmation. This attribute overrides the block-level tags and
218 confirmation. This attribute overrides the block-level tags and
220 applies to the whole demo. It is an attribute of the object, and
219 applies to the whole demo. It is an attribute of the object, and
221 can be changed at runtime simply by reassigning it to a boolean
220 can be changed at runtime simply by reassigning it to a boolean
222 value.
221 value.
223 """
222 """
224 if hasattr(src, "read"):
223 if hasattr(src, "read"):
225 # It seems to be a file or a file-like object
224 # It seems to be a file or a file-like object
226 self.fname = "from a file-like object"
225 self.fname = "from a file-like object"
227 if title == '':
226 if title == '':
228 self.title = "from a file-like object"
227 self.title = "from a file-like object"
229 else:
228 else:
230 self.title = title
229 self.title = title
231 else:
230 else:
232 # Assume it's a string or something that can be converted to one
231 # Assume it's a string or something that can be converted to one
233 self.fname = src
232 self.fname = src
234 if title == '':
233 if title == '':
235 (filepath, filename) = os.path.split(src)
234 (filepath, filename) = os.path.split(src)
236 self.title = filename
235 self.title = filename
237 else:
236 else:
238 self.title = title
237 self.title = title
239 self.sys_argv = [src] + shlex.split(arg_str)
238 self.sys_argv = [src] + shlex.split(arg_str)
240 self.auto_all = auto_all
239 self.auto_all = auto_all
241 self.src = src
240 self.src = src
242
241
243 # get a few things from ipython. While it's a bit ugly design-wise,
242 # get a few things from ipython. While it's a bit ugly design-wise,
244 # it ensures that things like color scheme and the like are always in
243 # it ensures that things like color scheme and the like are always in
245 # sync with the ipython mode being used. This class is only meant to
244 # sync with the ipython mode being used. This class is only meant to
246 # be used inside ipython anyways, so it's OK.
245 # be used inside ipython anyways, so it's OK.
247 ip = get_ipython() # this is in builtins whenever IPython is running
246 ip = get_ipython() # this is in builtins whenever IPython is running
248 self.ip_ns = ip.user_ns
247 self.ip_ns = ip.user_ns
249 self.ip_colorize = ip.pycolorize
248 self.ip_colorize = ip.pycolorize
250 self.ip_showtb = ip.showtraceback
249 self.ip_showtb = ip.showtraceback
251 self.ip_run_cell = ip.run_cell
250 self.ip_run_cell = ip.run_cell
252 self.shell = ip
251 self.shell = ip
253
252
254 # load user data and initialize data structures
253 # load user data and initialize data structures
255 self.reload()
254 self.reload()
256
255
257 def fload(self):
256 def fload(self):
258 """Load file object."""
257 """Load file object."""
259 # read data and parse into blocks
258 # read data and parse into blocks
260 if hasattr(self, 'fobj') and self.fobj is not None:
259 if hasattr(self, 'fobj') and self.fobj is not None:
261 self.fobj.close()
260 self.fobj.close()
262 if hasattr(self.src, "read"):
261 if hasattr(self.src, "read"):
263 # It seems to be a file or a file-like object
262 # It seems to be a file or a file-like object
264 self.fobj = self.src
263 self.fobj = self.src
265 else:
264 else:
266 # Assume it's a string or something that can be converted to one
265 # Assume it's a string or something that can be converted to one
267 self.fobj = open(self.fname)
266 self.fobj = open(self.fname)
268
267
269 def reload(self):
268 def reload(self):
270 """Reload source from disk and initialize state."""
269 """Reload source from disk and initialize state."""
271 self.fload()
270 self.fload()
272
271
273 self.src = self.fobj.read()
272 self.src = self.fobj.read()
274 src_b = [b.strip() for b in self.re_stop.split(self.src) if b]
273 src_b = [b.strip() for b in self.re_stop.split(self.src) if b]
275 self._silent = [bool(self.re_silent.findall(b)) for b in src_b]
274 self._silent = [bool(self.re_silent.findall(b)) for b in src_b]
276 self._auto = [bool(self.re_auto.findall(b)) for b in src_b]
275 self._auto = [bool(self.re_auto.findall(b)) for b in src_b]
277
276
278 # if auto_all is not given (def. None), we read it from the file
277 # if auto_all is not given (def. None), we read it from the file
279 if self.auto_all is None:
278 if self.auto_all is None:
280 self.auto_all = bool(self.re_auto_all.findall(src_b[0]))
279 self.auto_all = bool(self.re_auto_all.findall(src_b[0]))
281 else:
280 else:
282 self.auto_all = bool(self.auto_all)
281 self.auto_all = bool(self.auto_all)
283
282
284 # Clean the sources from all markup so it doesn't get displayed when
283 # Clean the sources from all markup so it doesn't get displayed when
285 # running the demo
284 # running the demo
286 src_blocks = []
285 src_blocks = []
287 auto_strip = lambda s: self.re_auto.sub('',s)
286 auto_strip = lambda s: self.re_auto.sub('',s)
288 for i,b in enumerate(src_b):
287 for i,b in enumerate(src_b):
289 if self._auto[i]:
288 if self._auto[i]:
290 src_blocks.append(auto_strip(b))
289 src_blocks.append(auto_strip(b))
291 else:
290 else:
292 src_blocks.append(b)
291 src_blocks.append(b)
293 # remove the auto_all marker
292 # remove the auto_all marker
294 src_blocks[0] = self.re_auto_all.sub('',src_blocks[0])
293 src_blocks[0] = self.re_auto_all.sub('',src_blocks[0])
295
294
296 self.nblocks = len(src_blocks)
295 self.nblocks = len(src_blocks)
297 self.src_blocks = src_blocks
296 self.src_blocks = src_blocks
298
297
299 # also build syntax-highlighted source
298 # also build syntax-highlighted source
300 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
299 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
301
300
302 # ensure clean namespace and seek offset
301 # ensure clean namespace and seek offset
303 self.reset()
302 self.reset()
304
303
305 def reset(self):
304 def reset(self):
306 """Reset the namespace and seek pointer to restart the demo"""
305 """Reset the namespace and seek pointer to restart the demo"""
307 self.user_ns = {}
306 self.user_ns = {}
308 self.finished = False
307 self.finished = False
309 self.block_index = 0
308 self.block_index = 0
310
309
311 def _validate_index(self,index):
310 def _validate_index(self,index):
312 if index<0 or index>=self.nblocks:
311 if index<0 or index>=self.nblocks:
313 raise ValueError('invalid block index %s' % index)
312 raise ValueError('invalid block index %s' % index)
314
313
315 def _get_index(self,index):
314 def _get_index(self,index):
316 """Get the current block index, validating and checking status.
315 """Get the current block index, validating and checking status.
317
316
318 Returns None if the demo is finished"""
317 Returns None if the demo is finished"""
319
318
320 if index is None:
319 if index is None:
321 if self.finished:
320 if self.finished:
322 print >>io.stdout, 'Demo finished. Use <demo_name>.reset() if you want to rerun it.'
321 print >>io.stdout, 'Demo finished. Use <demo_name>.reset() if you want to rerun it.'
323 return None
322 return None
324 index = self.block_index
323 index = self.block_index
325 else:
324 else:
326 self._validate_index(index)
325 self._validate_index(index)
327 return index
326 return index
328
327
329 def seek(self,index):
328 def seek(self,index):
330 """Move the current seek pointer to the given block.
329 """Move the current seek pointer to the given block.
331
330
332 You can use negative indices to seek from the end, with identical
331 You can use negative indices to seek from the end, with identical
333 semantics to those of Python lists."""
332 semantics to those of Python lists."""
334 if index<0:
333 if index<0:
335 index = self.nblocks + index
334 index = self.nblocks + index
336 self._validate_index(index)
335 self._validate_index(index)
337 self.block_index = index
336 self.block_index = index
338 self.finished = False
337 self.finished = False
339
338
340 def back(self,num=1):
339 def back(self,num=1):
341 """Move the seek pointer back num blocks (default is 1)."""
340 """Move the seek pointer back num blocks (default is 1)."""
342 self.seek(self.block_index-num)
341 self.seek(self.block_index-num)
343
342
344 def jump(self,num=1):
343 def jump(self,num=1):
345 """Jump a given number of blocks relative to the current one.
344 """Jump a given number of blocks relative to the current one.
346
345
347 The offset can be positive or negative, defaults to 1."""
346 The offset can be positive or negative, defaults to 1."""
348 self.seek(self.block_index+num)
347 self.seek(self.block_index+num)
349
348
350 def again(self):
349 def again(self):
351 """Move the seek pointer back one block and re-execute."""
350 """Move the seek pointer back one block and re-execute."""
352 self.back(1)
351 self.back(1)
353 self()
352 self()
354
353
355 def edit(self,index=None):
354 def edit(self,index=None):
356 """Edit a block.
355 """Edit a block.
357
356
358 If no number is given, use the last block executed.
357 If no number is given, use the last block executed.
359
358
360 This edits the in-memory copy of the demo, it does NOT modify the
359 This edits the in-memory copy of the demo, it does NOT modify the
361 original source file. If you want to do that, simply open the file in
360 original source file. If you want to do that, simply open the file in
362 an editor and use reload() when you make changes to the file. This
361 an editor and use reload() when you make changes to the file. This
363 method is meant to let you change a block during a demonstration for
362 method is meant to let you change a block during a demonstration for
364 explanatory purposes, without damaging your original script."""
363 explanatory purposes, without damaging your original script."""
365
364
366 index = self._get_index(index)
365 index = self._get_index(index)
367 if index is None:
366 if index is None:
368 return
367 return
369 # decrease the index by one (unless we're at the very beginning), so
368 # decrease the index by one (unless we're at the very beginning), so
370 # that the default demo.edit() call opens up the sblock we've last run
369 # that the default demo.edit() call opens up the sblock we've last run
371 if index>0:
370 if index>0:
372 index -= 1
371 index -= 1
373
372
374 filename = self.shell.mktempfile(self.src_blocks[index])
373 filename = self.shell.mktempfile(self.src_blocks[index])
375 self.shell.hooks.editor(filename,1)
374 self.shell.hooks.editor(filename,1)
376 new_block = file_read(filename)
375 new_block = file_read(filename)
377 # update the source and colored block
376 # update the source and colored block
378 self.src_blocks[index] = new_block
377 self.src_blocks[index] = new_block
379 self.src_blocks_colored[index] = self.ip_colorize(new_block)
378 self.src_blocks_colored[index] = self.ip_colorize(new_block)
380 self.block_index = index
379 self.block_index = index
381 # call to run with the newly edited index
380 # call to run with the newly edited index
382 self()
381 self()
383
382
384 def show(self,index=None):
383 def show(self,index=None):
385 """Show a single block on screen"""
384 """Show a single block on screen"""
386
385
387 index = self._get_index(index)
386 index = self._get_index(index)
388 if index is None:
387 if index is None:
389 return
388 return
390
389
391 print >>io.stdout, self.marquee('<%s> block # %s (%s remaining)' %
390 print >>io.stdout, self.marquee('<%s> block # %s (%s remaining)' %
392 (self.title,index,self.nblocks-index-1))
391 (self.title,index,self.nblocks-index-1))
393 print >>io.stdout,(self.src_blocks_colored[index])
392 print >>io.stdout,(self.src_blocks_colored[index])
394 sys.stdout.flush()
393 sys.stdout.flush()
395
394
396 def show_all(self):
395 def show_all(self):
397 """Show entire demo on screen, block by block"""
396 """Show entire demo on screen, block by block"""
398
397
399 fname = self.title
398 fname = self.title
400 title = self.title
399 title = self.title
401 nblocks = self.nblocks
400 nblocks = self.nblocks
402 silent = self._silent
401 silent = self._silent
403 marquee = self.marquee
402 marquee = self.marquee
404 for index,block in enumerate(self.src_blocks_colored):
403 for index,block in enumerate(self.src_blocks_colored):
405 if silent[index]:
404 if silent[index]:
406 print >>io.stdout, marquee('<%s> SILENT block # %s (%s remaining)' %
405 print >>io.stdout, marquee('<%s> SILENT block # %s (%s remaining)' %
407 (title,index,nblocks-index-1))
406 (title,index,nblocks-index-1))
408 else:
407 else:
409 print >>io.stdout, marquee('<%s> block # %s (%s remaining)' %
408 print >>io.stdout, marquee('<%s> block # %s (%s remaining)' %
410 (title,index,nblocks-index-1))
409 (title,index,nblocks-index-1))
411 print >>io.stdout, block,
410 print >>io.stdout, block,
412 sys.stdout.flush()
411 sys.stdout.flush()
413
412
414 def run_cell(self,source):
413 def run_cell(self,source):
415 """Execute a string with one or more lines of code"""
414 """Execute a string with one or more lines of code"""
416
415
417 exec source in self.user_ns
416 exec source in self.user_ns
418
417
419 def __call__(self,index=None):
418 def __call__(self,index=None):
420 """run a block of the demo.
419 """run a block of the demo.
421
420
422 If index is given, it should be an integer >=1 and <= nblocks. This
421 If index is given, it should be an integer >=1 and <= nblocks. This
423 means that the calling convention is one off from typical Python
422 means that the calling convention is one off from typical Python
424 lists. The reason for the inconsistency is that the demo always
423 lists. The reason for the inconsistency is that the demo always
425 prints 'Block n/N, and N is the total, so it would be very odd to use
424 prints 'Block n/N, and N is the total, so it would be very odd to use
426 zero-indexing here."""
425 zero-indexing here."""
427
426
428 index = self._get_index(index)
427 index = self._get_index(index)
429 if index is None:
428 if index is None:
430 return
429 return
431 try:
430 try:
432 marquee = self.marquee
431 marquee = self.marquee
433 next_block = self.src_blocks[index]
432 next_block = self.src_blocks[index]
434 self.block_index += 1
433 self.block_index += 1
435 if self._silent[index]:
434 if self._silent[index]:
436 print >>io.stdout, marquee('Executing silent block # %s (%s remaining)' %
435 print >>io.stdout, marquee('Executing silent block # %s (%s remaining)' %
437 (index,self.nblocks-index-1))
436 (index,self.nblocks-index-1))
438 else:
437 else:
439 self.pre_cmd()
438 self.pre_cmd()
440 self.show(index)
439 self.show(index)
441 if self.auto_all or self._auto[index]:
440 if self.auto_all or self._auto[index]:
442 print >>io.stdout, marquee('output:')
441 print >>io.stdout, marquee('output:')
443 else:
442 else:
444 print >>io.stdout, marquee('Press <q> to quit, <Enter> to execute...'),
443 print >>io.stdout, marquee('Press <q> to quit, <Enter> to execute...'),
445 ans = raw_input().strip()
444 ans = raw_input().strip()
446 if ans:
445 if ans:
447 print >>io.stdout, marquee('Block NOT executed')
446 print >>io.stdout, marquee('Block NOT executed')
448 return
447 return
449 try:
448 try:
450 save_argv = sys.argv
449 save_argv = sys.argv
451 sys.argv = self.sys_argv
450 sys.argv = self.sys_argv
452 self.run_cell(next_block)
451 self.run_cell(next_block)
453 self.post_cmd()
452 self.post_cmd()
454 finally:
453 finally:
455 sys.argv = save_argv
454 sys.argv = save_argv
456
455
457 except:
456 except:
458 self.ip_showtb(filename=self.fname)
457 self.ip_showtb(filename=self.fname)
459 else:
458 else:
460 self.ip_ns.update(self.user_ns)
459 self.ip_ns.update(self.user_ns)
461
460
462 if self.block_index == self.nblocks:
461 if self.block_index == self.nblocks:
463 mq1 = self.marquee('END OF DEMO')
462 mq1 = self.marquee('END OF DEMO')
464 if mq1:
463 if mq1:
465 # avoid spurious print >>io.stdout,s if empty marquees are used
464 # avoid spurious print >>io.stdout,s if empty marquees are used
466 print >>io.stdout
465 print >>io.stdout
467 print >>io.stdout, mq1
466 print >>io.stdout, mq1
468 print >>io.stdout, self.marquee('Use <demo_name>.reset() if you want to rerun it.')
467 print >>io.stdout, self.marquee('Use <demo_name>.reset() if you want to rerun it.')
469 self.finished = True
468 self.finished = True
470
469
471 # These methods are meant to be overridden by subclasses who may wish to
470 # These methods are meant to be overridden by subclasses who may wish to
472 # customize the behavior of of their demos.
471 # customize the behavior of of their demos.
473 def marquee(self,txt='',width=78,mark='*'):
472 def marquee(self,txt='',width=78,mark='*'):
474 """Return the input string centered in a 'marquee'."""
473 """Return the input string centered in a 'marquee'."""
475 return marquee(txt,width,mark)
474 return marquee(txt,width,mark)
476
475
477 def pre_cmd(self):
476 def pre_cmd(self):
478 """Method called before executing each block."""
477 """Method called before executing each block."""
479 pass
478 pass
480
479
481 def post_cmd(self):
480 def post_cmd(self):
482 """Method called after executing each block."""
481 """Method called after executing each block."""
483 pass
482 pass
484
483
485
484
486 class IPythonDemo(Demo):
485 class IPythonDemo(Demo):
487 """Class for interactive demos with IPython's input processing applied.
486 """Class for interactive demos with IPython's input processing applied.
488
487
489 This subclasses Demo, but instead of executing each block by the Python
488 This subclasses Demo, but instead of executing each block by the Python
490 interpreter (via exec), it actually calls IPython on it, so that any input
489 interpreter (via exec), it actually calls IPython on it, so that any input
491 filters which may be in place are applied to the input block.
490 filters which may be in place are applied to the input block.
492
491
493 If you have an interactive environment which exposes special input
492 If you have an interactive environment which exposes special input
494 processing, you can use this class instead to write demo scripts which
493 processing, you can use this class instead to write demo scripts which
495 operate exactly as if you had typed them interactively. The default Demo
494 operate exactly as if you had typed them interactively. The default Demo
496 class requires the input to be valid, pure Python code.
495 class requires the input to be valid, pure Python code.
497 """
496 """
498
497
499 def run_cell(self,source):
498 def run_cell(self,source):
500 """Execute a string with one or more lines of code"""
499 """Execute a string with one or more lines of code"""
501
500
502 self.shell.run_cell(source)
501 self.shell.run_cell(source)
503
502
504 class LineDemo(Demo):
503 class LineDemo(Demo):
505 """Demo where each line is executed as a separate block.
504 """Demo where each line is executed as a separate block.
506
505
507 The input script should be valid Python code.
506 The input script should be valid Python code.
508
507
509 This class doesn't require any markup at all, and it's meant for simple
508 This class doesn't require any markup at all, and it's meant for simple
510 scripts (with no nesting or any kind of indentation) which consist of
509 scripts (with no nesting or any kind of indentation) which consist of
511 multiple lines of input to be executed, one at a time, as if they had been
510 multiple lines of input to be executed, one at a time, as if they had been
512 typed in the interactive prompt.
511 typed in the interactive prompt.
513
512
514 Note: the input can not have *any* indentation, which means that only
513 Note: the input can not have *any* indentation, which means that only
515 single-lines of input are accepted, not even function definitions are
514 single-lines of input are accepted, not even function definitions are
516 valid."""
515 valid."""
517
516
518 def reload(self):
517 def reload(self):
519 """Reload source from disk and initialize state."""
518 """Reload source from disk and initialize state."""
520 # read data and parse into blocks
519 # read data and parse into blocks
521 self.fload()
520 self.fload()
522 lines = self.fobj.readlines()
521 lines = self.fobj.readlines()
523 src_b = [l for l in lines if l.strip()]
522 src_b = [l for l in lines if l.strip()]
524 nblocks = len(src_b)
523 nblocks = len(src_b)
525 self.src = ''.join(lines)
524 self.src = ''.join(lines)
526 self._silent = [False]*nblocks
525 self._silent = [False]*nblocks
527 self._auto = [True]*nblocks
526 self._auto = [True]*nblocks
528 self.auto_all = True
527 self.auto_all = True
529 self.nblocks = nblocks
528 self.nblocks = nblocks
530 self.src_blocks = src_b
529 self.src_blocks = src_b
531
530
532 # also build syntax-highlighted source
531 # also build syntax-highlighted source
533 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
532 self.src_blocks_colored = map(self.ip_colorize,self.src_blocks)
534
533
535 # ensure clean namespace and seek offset
534 # ensure clean namespace and seek offset
536 self.reset()
535 self.reset()
537
536
538
537
539 class IPythonLineDemo(IPythonDemo,LineDemo):
538 class IPythonLineDemo(IPythonDemo,LineDemo):
540 """Variant of the LineDemo class whose input is processed by IPython."""
539 """Variant of the LineDemo class whose input is processed by IPython."""
541 pass
540 pass
542
541
543
542
544 class ClearMixin(object):
543 class ClearMixin(object):
545 """Use this mixin to make Demo classes with less visual clutter.
544 """Use this mixin to make Demo classes with less visual clutter.
546
545
547 Demos using this mixin will clear the screen before every block and use
546 Demos using this mixin will clear the screen before every block and use
548 blank marquees.
547 blank marquees.
549
548
550 Note that in order for the methods defined here to actually override those
549 Note that in order for the methods defined here to actually override those
551 of the classes it's mixed with, it must go /first/ in the inheritance
550 of the classes it's mixed with, it must go /first/ in the inheritance
552 tree. For example:
551 tree. For example:
553
552
554 class ClearIPDemo(ClearMixin,IPythonDemo): pass
553 class ClearIPDemo(ClearMixin,IPythonDemo): pass
555
554
556 will provide an IPythonDemo class with the mixin's features.
555 will provide an IPythonDemo class with the mixin's features.
557 """
556 """
558
557
559 def marquee(self,txt='',width=78,mark='*'):
558 def marquee(self,txt='',width=78,mark='*'):
560 """Blank marquee that returns '' no matter what the input."""
559 """Blank marquee that returns '' no matter what the input."""
561 return ''
560 return ''
562
561
563 def pre_cmd(self):
562 def pre_cmd(self):
564 """Method called before executing each block.
563 """Method called before executing each block.
565
564
566 This one simply clears the screen."""
565 This one simply clears the screen."""
567 from IPython.utils.terminal import term_clear
566 from IPython.utils.terminal import term_clear
568 term_clear()
567 term_clear()
569
568
570 class ClearDemo(ClearMixin,Demo):
569 class ClearDemo(ClearMixin,Demo):
571 pass
570 pass
572
571
573
572
574 class ClearIPDemo(ClearMixin,IPythonDemo):
573 class ClearIPDemo(ClearMixin,IPythonDemo):
575 pass
574 pass
@@ -1,233 +1,233 b''
1 """Global IPython app to support test running.
1 """Global IPython app to support test running.
2
2
3 We must start our own ipython object and heavily muck with it so that all the
3 We must start our own ipython object and heavily muck with it so that all the
4 modifications IPython makes to system behavior don't send the doctest machinery
4 modifications IPython makes to system behavior don't send the doctest machinery
5 into a fit. This code should be considered a gross hack, but it gets the job
5 into a fit. This code should be considered a gross hack, but it gets the job
6 done.
6 done.
7 """
7 """
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9 from __future__ import print_function
9 from __future__ import print_function
10
10
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12 # Copyright (C) 2009-2010 The IPython Development Team
12 # Copyright (C) 2009-2010 The IPython Development Team
13 #
13 #
14 # Distributed under the terms of the BSD License. The full license is in
14 # Distributed under the terms of the BSD License. The full license is in
15 # the file COPYING, distributed as part of this software.
15 # the file COPYING, distributed as part of this software.
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17
17
18 #-----------------------------------------------------------------------------
18 #-----------------------------------------------------------------------------
19 # Imports
19 # Imports
20 #-----------------------------------------------------------------------------
20 #-----------------------------------------------------------------------------
21
21
22 # stdlib
22 # stdlib
23 import __builtin__
23 import __builtin__ as builtin_mod
24 import os
24 import os
25 import sys
25 import sys
26 from types import MethodType
26 from types import MethodType
27
27
28 # our own
28 # our own
29 from . import tools
29 from . import tools
30
30
31 from IPython.utils import io
31 from IPython.utils import io
32 from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
32 from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell
33
33
34 #-----------------------------------------------------------------------------
34 #-----------------------------------------------------------------------------
35 # Functions
35 # Functions
36 #-----------------------------------------------------------------------------
36 #-----------------------------------------------------------------------------
37
37
38 class StreamProxy(io.IOStream):
38 class StreamProxy(io.IOStream):
39 """Proxy for sys.stdout/err. This will request the stream *at call time*
39 """Proxy for sys.stdout/err. This will request the stream *at call time*
40 allowing for nose's Capture plugin's redirection of sys.stdout/err.
40 allowing for nose's Capture plugin's redirection of sys.stdout/err.
41
41
42 Parameters
42 Parameters
43 ----------
43 ----------
44 name : str
44 name : str
45 The name of the stream. This will be requested anew at every call
45 The name of the stream. This will be requested anew at every call
46 """
46 """
47
47
48 def __init__(self, name):
48 def __init__(self, name):
49 self.name=name
49 self.name=name
50
50
51 @property
51 @property
52 def stream(self):
52 def stream(self):
53 return getattr(sys, self.name)
53 return getattr(sys, self.name)
54
54
55 def flush(self):
55 def flush(self):
56 self.stream.flush()
56 self.stream.flush()
57
57
58 # Hack to modify the %run command so we can sync the user's namespace with the
58 # Hack to modify the %run command so we can sync the user's namespace with the
59 # test globals. Once we move over to a clean magic system, this will be done
59 # test globals. Once we move over to a clean magic system, this will be done
60 # with much less ugliness.
60 # with much less ugliness.
61
61
62 class py_file_finder(object):
62 class py_file_finder(object):
63 def __init__(self,test_filename):
63 def __init__(self,test_filename):
64 self.test_filename = test_filename
64 self.test_filename = test_filename
65
65
66 def __call__(self,name,win32=False):
66 def __call__(self,name,win32=False):
67 from IPython.utils.path import get_py_filename
67 from IPython.utils.path import get_py_filename
68 try:
68 try:
69 return get_py_filename(name,win32=win32)
69 return get_py_filename(name,win32=win32)
70 except IOError:
70 except IOError:
71 test_dir = os.path.dirname(self.test_filename)
71 test_dir = os.path.dirname(self.test_filename)
72 new_path = os.path.join(test_dir,name)
72 new_path = os.path.join(test_dir,name)
73 return get_py_filename(new_path,win32=win32)
73 return get_py_filename(new_path,win32=win32)
74
74
75
75
76 def _run_ns_sync(self,arg_s,runner=None):
76 def _run_ns_sync(self,arg_s,runner=None):
77 """Modified version of %run that syncs testing namespaces.
77 """Modified version of %run that syncs testing namespaces.
78
78
79 This is strictly needed for running doctests that call %run.
79 This is strictly needed for running doctests that call %run.
80 """
80 """
81 #print('in run_ns_sync', arg_s, file=sys.stderr) # dbg
81 #print('in run_ns_sync', arg_s, file=sys.stderr) # dbg
82 finder = py_file_finder(arg_s)
82 finder = py_file_finder(arg_s)
83 return get_ipython().magic_run_ori(arg_s, runner, finder)
83 return get_ipython().magic_run_ori(arg_s, runner, finder)
84
84
85
85
86 class ipnsdict(dict):
86 class ipnsdict(dict):
87 """A special subclass of dict for use as an IPython namespace in doctests.
87 """A special subclass of dict for use as an IPython namespace in doctests.
88
88
89 This subclass adds a simple checkpointing capability so that when testing
89 This subclass adds a simple checkpointing capability so that when testing
90 machinery clears it (we use it as the test execution context), it doesn't
90 machinery clears it (we use it as the test execution context), it doesn't
91 get completely destroyed.
91 get completely destroyed.
92
92
93 In addition, it can handle the presence of the '_' key in a special manner,
93 In addition, it can handle the presence of the '_' key in a special manner,
94 which is needed because of how Python's doctest machinery operates with
94 which is needed because of how Python's doctest machinery operates with
95 '_'. See constructor and :meth:`update` for details.
95 '_'. See constructor and :meth:`update` for details.
96 """
96 """
97
97
98 def __init__(self,*a):
98 def __init__(self,*a):
99 dict.__init__(self,*a)
99 dict.__init__(self,*a)
100 self._savedict = {}
100 self._savedict = {}
101 # If this flag is True, the .update() method will unconditionally
101 # If this flag is True, the .update() method will unconditionally
102 # remove a key named '_'. This is so that such a dict can be used as a
102 # remove a key named '_'. This is so that such a dict can be used as a
103 # namespace in doctests that call '_'.
103 # namespace in doctests that call '_'.
104 self.protect_underscore = False
104 self.protect_underscore = False
105
105
106 def clear(self):
106 def clear(self):
107 dict.clear(self)
107 dict.clear(self)
108 self.update(self._savedict)
108 self.update(self._savedict)
109
109
110 def _checkpoint(self):
110 def _checkpoint(self):
111 self._savedict.clear()
111 self._savedict.clear()
112 self._savedict.update(self)
112 self._savedict.update(self)
113
113
114 def update(self,other):
114 def update(self,other):
115 self._checkpoint()
115 self._checkpoint()
116 dict.update(self,other)
116 dict.update(self,other)
117
117
118 if self.protect_underscore:
118 if self.protect_underscore:
119 # If '_' is in the namespace, python won't set it when executing
119 # If '_' is in the namespace, python won't set it when executing
120 # code *in doctests*, and we have multiple doctests that use '_'.
120 # code *in doctests*, and we have multiple doctests that use '_'.
121 # So we ensure that the namespace is always 'clean' of it before
121 # So we ensure that the namespace is always 'clean' of it before
122 # it's used for test code execution.
122 # it's used for test code execution.
123 # This flag is only turned on by the doctest machinery, so that
123 # This flag is only turned on by the doctest machinery, so that
124 # normal test code can assume the _ key is updated like any other
124 # normal test code can assume the _ key is updated like any other
125 # key and can test for its presence after cell executions.
125 # key and can test for its presence after cell executions.
126 self.pop('_', None)
126 self.pop('_', None)
127
127
128 # The builtins namespace must *always* be the real __builtin__ module,
128 # The builtins namespace must *always* be the real __builtin__ module,
129 # else weird stuff happens. The main ipython code does have provisions
129 # else weird stuff happens. The main ipython code does have provisions
130 # to ensure this after %run, but since in this class we do some
130 # to ensure this after %run, but since in this class we do some
131 # aggressive low-level cleaning of the execution namespace, we need to
131 # aggressive low-level cleaning of the execution namespace, we need to
132 # correct for that ourselves, to ensure consitency with the 'real'
132 # correct for that ourselves, to ensure consitency with the 'real'
133 # ipython.
133 # ipython.
134 self['__builtins__'] = __builtin__
134 self['__builtins__'] = builtin_mod
135
135
136 def __delitem__(self, key):
136 def __delitem__(self, key):
137 """Part of the test suite checks that we can release all
137 """Part of the test suite checks that we can release all
138 references to an object. So we need to make sure that we're not
138 references to an object. So we need to make sure that we're not
139 keeping a reference in _savedict."""
139 keeping a reference in _savedict."""
140 dict.__delitem__(self, key)
140 dict.__delitem__(self, key)
141 try:
141 try:
142 del self._savedict[key]
142 del self._savedict[key]
143 except KeyError:
143 except KeyError:
144 pass
144 pass
145
145
146
146
147 def get_ipython():
147 def get_ipython():
148 # This will get replaced by the real thing once we start IPython below
148 # This will get replaced by the real thing once we start IPython below
149 return start_ipython()
149 return start_ipython()
150
150
151
151
152 # A couple of methods to override those in the running IPython to interact
152 # A couple of methods to override those in the running IPython to interact
153 # better with doctest (doctest captures on raw stdout, so we need to direct
153 # better with doctest (doctest captures on raw stdout, so we need to direct
154 # various types of output there otherwise it will miss them).
154 # various types of output there otherwise it will miss them).
155
155
156 def xsys(self, cmd):
156 def xsys(self, cmd):
157 """Replace the default system call with a capturing one for doctest.
157 """Replace the default system call with a capturing one for doctest.
158 """
158 """
159 # We use getoutput, but we need to strip it because pexpect captures
159 # We use getoutput, but we need to strip it because pexpect captures
160 # the trailing newline differently from commands.getoutput
160 # the trailing newline differently from commands.getoutput
161 print(self.getoutput(cmd, split=False).rstrip(), end='', file=sys.stdout)
161 print(self.getoutput(cmd, split=False).rstrip(), end='', file=sys.stdout)
162 sys.stdout.flush()
162 sys.stdout.flush()
163
163
164
164
165 def _showtraceback(self, etype, evalue, stb):
165 def _showtraceback(self, etype, evalue, stb):
166 """Print the traceback purely on stdout for doctest to capture it.
166 """Print the traceback purely on stdout for doctest to capture it.
167 """
167 """
168 print(self.InteractiveTB.stb2text(stb), file=sys.stdout)
168 print(self.InteractiveTB.stb2text(stb), file=sys.stdout)
169
169
170
170
171 def start_ipython():
171 def start_ipython():
172 """Start a global IPython shell, which we need for IPython-specific syntax.
172 """Start a global IPython shell, which we need for IPython-specific syntax.
173 """
173 """
174 global get_ipython
174 global get_ipython
175
175
176 # This function should only ever run once!
176 # This function should only ever run once!
177 if hasattr(start_ipython, 'already_called'):
177 if hasattr(start_ipython, 'already_called'):
178 return
178 return
179 start_ipython.already_called = True
179 start_ipython.already_called = True
180
180
181 # Store certain global objects that IPython modifies
181 # Store certain global objects that IPython modifies
182 _displayhook = sys.displayhook
182 _displayhook = sys.displayhook
183 _excepthook = sys.excepthook
183 _excepthook = sys.excepthook
184 _main = sys.modules.get('__main__')
184 _main = sys.modules.get('__main__')
185
185
186 # Create custom argv and namespaces for our IPython to be test-friendly
186 # Create custom argv and namespaces for our IPython to be test-friendly
187 config = tools.default_config()
187 config = tools.default_config()
188
188
189 # Create and initialize our test-friendly IPython instance.
189 # Create and initialize our test-friendly IPython instance.
190 shell = TerminalInteractiveShell.instance(config=config,
190 shell = TerminalInteractiveShell.instance(config=config,
191 user_ns=ipnsdict(),
191 user_ns=ipnsdict(),
192 user_global_ns={}
192 user_global_ns={}
193 )
193 )
194
194
195 # A few more tweaks needed for playing nicely with doctests...
195 # A few more tweaks needed for playing nicely with doctests...
196
196
197 # remove history file
197 # remove history file
198 shell.tempfiles.append(config.HistoryManager.hist_file)
198 shell.tempfiles.append(config.HistoryManager.hist_file)
199
199
200 # These traps are normally only active for interactive use, set them
200 # These traps are normally only active for interactive use, set them
201 # permanently since we'll be mocking interactive sessions.
201 # permanently since we'll be mocking interactive sessions.
202 shell.builtin_trap.activate()
202 shell.builtin_trap.activate()
203
203
204 # Modify the IPython system call with one that uses getoutput, so that we
204 # Modify the IPython system call with one that uses getoutput, so that we
205 # can capture subcommands and print them to Python's stdout, otherwise the
205 # can capture subcommands and print them to Python's stdout, otherwise the
206 # doctest machinery would miss them.
206 # doctest machinery would miss them.
207 shell.system = MethodType(xsys, shell, TerminalInteractiveShell)
207 shell.system = MethodType(xsys, shell, TerminalInteractiveShell)
208
208
209
209
210 shell._showtraceback = MethodType(_showtraceback, shell,
210 shell._showtraceback = MethodType(_showtraceback, shell,
211 TerminalInteractiveShell)
211 TerminalInteractiveShell)
212
212
213 # IPython is ready, now clean up some global state...
213 # IPython is ready, now clean up some global state...
214
214
215 # Deactivate the various python system hooks added by ipython for
215 # Deactivate the various python system hooks added by ipython for
216 # interactive convenience so we don't confuse the doctest system
216 # interactive convenience so we don't confuse the doctest system
217 sys.modules['__main__'] = _main
217 sys.modules['__main__'] = _main
218 sys.displayhook = _displayhook
218 sys.displayhook = _displayhook
219 sys.excepthook = _excepthook
219 sys.excepthook = _excepthook
220
220
221 # So that ipython magics and aliases can be doctested (they work by making
221 # So that ipython magics and aliases can be doctested (they work by making
222 # a call into a global _ip object). Also make the top-level get_ipython
222 # a call into a global _ip object). Also make the top-level get_ipython
223 # now return this without recursively calling here again.
223 # now return this without recursively calling here again.
224 _ip = shell
224 _ip = shell
225 get_ipython = _ip.get_ipython
225 get_ipython = _ip.get_ipython
226 __builtin__._ip = _ip
226 __builtin__._ip = _ip
227 __builtin__.get_ipython = get_ipython
227 __builtin__.get_ipython = get_ipython
228
228
229 # To avoid extra IPython messages during testing, suppress io.stdout/stderr
229 # To avoid extra IPython messages during testing, suppress io.stdout/stderr
230 io.stdout = StreamProxy('stdout')
230 io.stdout = StreamProxy('stdout')
231 io.stderr = StreamProxy('stderr')
231 io.stderr = StreamProxy('stderr')
232
232
233 return _ip
233 return _ip
@@ -1,142 +1,145 b''
1 """Common utilities for the various process_* implementations.
1 """Common utilities for the various process_* implementations.
2
2
3 This file is only meant to be imported by the platform-specific implementations
3 This file is only meant to be imported by the platform-specific implementations
4 of subprocess utilities, and it contains tools that are common to all of them.
4 of subprocess utilities, and it contains tools that are common to all of them.
5 """
5 """
6
6
7 #-----------------------------------------------------------------------------
7 #-----------------------------------------------------------------------------
8 # Copyright (C) 2010 The IPython Development Team
8 # Copyright (C) 2010 The IPython Development Team
9 #
9 #
10 # Distributed under the terms of the BSD License. The full license is in
10 # Distributed under the terms of the BSD License. The full license is in
11 # the file COPYING, distributed as part of this software.
11 # the file COPYING, distributed as part of this software.
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 #-----------------------------------------------------------------------------
14 #-----------------------------------------------------------------------------
15 # Imports
15 # Imports
16 #-----------------------------------------------------------------------------
16 #-----------------------------------------------------------------------------
17 import subprocess
17 import subprocess
18 import sys
18 import sys
19
19
20 from IPython.utils import py3compat
21
20 #-----------------------------------------------------------------------------
22 #-----------------------------------------------------------------------------
21 # Function definitions
23 # Function definitions
22 #-----------------------------------------------------------------------------
24 #-----------------------------------------------------------------------------
23
25
24 def read_no_interrupt(p):
26 def read_no_interrupt(p):
25 """Read from a pipe ignoring EINTR errors.
27 """Read from a pipe ignoring EINTR errors.
26
28
27 This is necessary because when reading from pipes with GUI event loops
29 This is necessary because when reading from pipes with GUI event loops
28 running in the background, often interrupts are raised that stop the
30 running in the background, often interrupts are raised that stop the
29 command from completing."""
31 command from completing."""
30 import errno
32 import errno
31
33
32 try:
34 try:
33 return p.read()
35 return p.read()
34 except IOError, err:
36 except IOError, err:
35 if err.errno != errno.EINTR:
37 if err.errno != errno.EINTR:
36 raise
38 raise
37
39
38
40
39 def process_handler(cmd, callback, stderr=subprocess.PIPE):
41 def process_handler(cmd, callback, stderr=subprocess.PIPE):
40 """Open a command in a shell subprocess and execute a callback.
42 """Open a command in a shell subprocess and execute a callback.
41
43
42 This function provides common scaffolding for creating subprocess.Popen()
44 This function provides common scaffolding for creating subprocess.Popen()
43 calls. It creates a Popen object and then calls the callback with it.
45 calls. It creates a Popen object and then calls the callback with it.
44
46
45 Parameters
47 Parameters
46 ----------
48 ----------
47 cmd : str
49 cmd : str
48 A string to be executed with the underlying system shell (by calling
50 A string to be executed with the underlying system shell (by calling
49 :func:`Popen` with ``shell=True``.
51 :func:`Popen` with ``shell=True``.
50
52
51 callback : callable
53 callback : callable
52 A one-argument function that will be called with the Popen object.
54 A one-argument function that will be called with the Popen object.
53
55
54 stderr : file descriptor number, optional
56 stderr : file descriptor number, optional
55 By default this is set to ``subprocess.PIPE``, but you can also pass the
57 By default this is set to ``subprocess.PIPE``, but you can also pass the
56 value ``subprocess.STDOUT`` to force the subprocess' stderr to go into
58 value ``subprocess.STDOUT`` to force the subprocess' stderr to go into
57 the same file descriptor as its stdout. This is useful to read stdout
59 the same file descriptor as its stdout. This is useful to read stdout
58 and stderr combined in the order they are generated.
60 and stderr combined in the order they are generated.
59
61
60 Returns
62 Returns
61 -------
63 -------
62 The return value of the provided callback is returned.
64 The return value of the provided callback is returned.
63 """
65 """
64 sys.stdout.flush()
66 sys.stdout.flush()
65 sys.stderr.flush()
67 sys.stderr.flush()
66 # On win32, close_fds can't be true when using pipes for stdin/out/err
68 # On win32, close_fds can't be true when using pipes for stdin/out/err
67 close_fds = sys.platform != 'win32'
69 close_fds = sys.platform != 'win32'
68 p = subprocess.Popen(cmd, shell=True,
70 p = subprocess.Popen(cmd, shell=True,
69 stdin=subprocess.PIPE,
71 stdin=subprocess.PIPE,
70 stdout=subprocess.PIPE,
72 stdout=subprocess.PIPE,
71 stderr=stderr,
73 stderr=stderr,
72 close_fds=close_fds)
74 close_fds=close_fds)
73
75
74 try:
76 try:
75 out = callback(p)
77 out = callback(p)
76 except KeyboardInterrupt:
78 except KeyboardInterrupt:
77 print('^C')
79 print('^C')
78 sys.stdout.flush()
80 sys.stdout.flush()
79 sys.stderr.flush()
81 sys.stderr.flush()
80 out = None
82 out = None
81 finally:
83 finally:
82 # Make really sure that we don't leave processes behind, in case the
84 # Make really sure that we don't leave processes behind, in case the
83 # call above raises an exception
85 # call above raises an exception
84 # We start by assuming the subprocess finished (to avoid NameErrors
86 # We start by assuming the subprocess finished (to avoid NameErrors
85 # later depending on the path taken)
87 # later depending on the path taken)
86 if p.returncode is None:
88 if p.returncode is None:
87 try:
89 try:
88 p.terminate()
90 p.terminate()
89 p.poll()
91 p.poll()
90 except OSError:
92 except OSError:
91 pass
93 pass
92 # One last try on our way out
94 # One last try on our way out
93 if p.returncode is None:
95 if p.returncode is None:
94 try:
96 try:
95 p.kill()
97 p.kill()
96 except OSError:
98 except OSError:
97 pass
99 pass
98
100
99 return out
101 return out
100
102
101
103
102 def getoutput(cmd):
104 def getoutput(cmd):
103 """Return standard output of executing cmd in a shell.
105 """Return standard output of executing cmd in a shell.
104
106
105 Accepts the same arguments as os.system().
107 Accepts the same arguments as os.system().
106
108
107 Parameters
109 Parameters
108 ----------
110 ----------
109 cmd : str
111 cmd : str
110 A command to be executed in the system shell.
112 A command to be executed in the system shell.
111
113
112 Returns
114 Returns
113 -------
115 -------
114 stdout : str
116 stdout : str
115 """
117 """
116
118
117 out = process_handler(cmd, lambda p: p.communicate()[0], subprocess.STDOUT)
119 out = process_handler(cmd, lambda p: p.communicate()[0], subprocess.STDOUT)
118 if out is None:
120 if out is None:
119 out = ''
121 return ''
120 return out
122 return py3compat.bytes_to_str(out)
121
123
122
124
123 def getoutputerror(cmd):
125 def getoutputerror(cmd):
124 """Return (standard output, standard error) of executing cmd in a shell.
126 """Return (standard output, standard error) of executing cmd in a shell.
125
127
126 Accepts the same arguments as os.system().
128 Accepts the same arguments as os.system().
127
129
128 Parameters
130 Parameters
129 ----------
131 ----------
130 cmd : str
132 cmd : str
131 A command to be executed in the system shell.
133 A command to be executed in the system shell.
132
134
133 Returns
135 Returns
134 -------
136 -------
135 stdout : str
137 stdout : str
136 stderr : str
138 stderr : str
137 """
139 """
138
140
139 out_err = process_handler(cmd, lambda p: p.communicate())
141 out_err = process_handler(cmd, lambda p: p.communicate())
140 if out_err is None:
142 if out_err is None:
141 out_err = '', ''
143 return '', ''
142 return out_err
144 out, err = out_err
145 return py3compat.bytes_to_str(out), py3compat.bytes_to_str(err)
@@ -1,485 +1,478 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 Utilities for path handling.
3 Utilities for path handling.
4 """
4 """
5
5
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2008-2009 The IPython Development Team
7 # Copyright (C) 2008-2009 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 import os
17 import os
18 import sys
18 import sys
19 import tempfile
19 import tempfile
20 from hashlib import md5
20 from hashlib import md5
21
21
22 import IPython
22 import IPython
23 from IPython.utils import warn
23 from IPython.utils import warn
24 from IPython.utils.process import system
24 from IPython.utils.process import system
25 from IPython.utils.importstring import import_item
25 from IPython.utils.importstring import import_item
26 from IPython.utils import py3compat
26
27
27 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
28 # Code
29 # Code
29 #-----------------------------------------------------------------------------
30 #-----------------------------------------------------------------------------
30
31
31 fs_encoding = sys.getfilesystemencoding()
32 fs_encoding = sys.getfilesystemencoding()
32
33
33 def _cast_unicode(s, enc=None):
34 """Turn 8-bit strings into unicode."""
35 if isinstance(s, bytes):
36 enc = enc or sys.getdefaultencoding()
37 return s.decode(enc)
38 return s
39
40
41 def _get_long_path_name(path):
34 def _get_long_path_name(path):
42 """Dummy no-op."""
35 """Dummy no-op."""
43 return path
36 return path
44
37
45 def _writable_dir(path):
38 def _writable_dir(path):
46 """Whether `path` is a directory, to which the user has write access."""
39 """Whether `path` is a directory, to which the user has write access."""
47 return os.path.isdir(path) and os.access(path, os.W_OK)
40 return os.path.isdir(path) and os.access(path, os.W_OK)
48
41
49 if sys.platform == 'win32':
42 if sys.platform == 'win32':
50 def _get_long_path_name(path):
43 def _get_long_path_name(path):
51 """Get a long path name (expand ~) on Windows using ctypes.
44 """Get a long path name (expand ~) on Windows using ctypes.
52
45
53 Examples
46 Examples
54 --------
47 --------
55
48
56 >>> get_long_path_name('c:\\docume~1')
49 >>> get_long_path_name('c:\\docume~1')
57 u'c:\\\\Documents and Settings'
50 u'c:\\\\Documents and Settings'
58
51
59 """
52 """
60 try:
53 try:
61 import ctypes
54 import ctypes
62 except ImportError:
55 except ImportError:
63 raise ImportError('you need to have ctypes installed for this to work')
56 raise ImportError('you need to have ctypes installed for this to work')
64 _GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW
57 _GetLongPathName = ctypes.windll.kernel32.GetLongPathNameW
65 _GetLongPathName.argtypes = [ctypes.c_wchar_p, ctypes.c_wchar_p,
58 _GetLongPathName.argtypes = [ctypes.c_wchar_p, ctypes.c_wchar_p,
66 ctypes.c_uint ]
59 ctypes.c_uint ]
67
60
68 buf = ctypes.create_unicode_buffer(260)
61 buf = ctypes.create_unicode_buffer(260)
69 rv = _GetLongPathName(path, buf, 260)
62 rv = _GetLongPathName(path, buf, 260)
70 if rv == 0 or rv > 260:
63 if rv == 0 or rv > 260:
71 return path
64 return path
72 else:
65 else:
73 return buf.value
66 return buf.value
74
67
75
68
76 def get_long_path_name(path):
69 def get_long_path_name(path):
77 """Expand a path into its long form.
70 """Expand a path into its long form.
78
71
79 On Windows this expands any ~ in the paths. On other platforms, it is
72 On Windows this expands any ~ in the paths. On other platforms, it is
80 a null operation.
73 a null operation.
81 """
74 """
82 return _get_long_path_name(path)
75 return _get_long_path_name(path)
83
76
84
77
85 def unquote_filename(name, win32=(sys.platform=='win32')):
78 def unquote_filename(name, win32=(sys.platform=='win32')):
86 """ On Windows, remove leading and trailing quotes from filenames.
79 """ On Windows, remove leading and trailing quotes from filenames.
87 """
80 """
88 if win32:
81 if win32:
89 if name.startswith(("'", '"')) and name.endswith(("'", '"')):
82 if name.startswith(("'", '"')) and name.endswith(("'", '"')):
90 name = name[1:-1]
83 name = name[1:-1]
91 return name
84 return name
92
85
93
86
94 def get_py_filename(name, force_win32=None):
87 def get_py_filename(name, force_win32=None):
95 """Return a valid python filename in the current directory.
88 """Return a valid python filename in the current directory.
96
89
97 If the given name is not a file, it adds '.py' and searches again.
90 If the given name is not a file, it adds '.py' and searches again.
98 Raises IOError with an informative message if the file isn't found.
91 Raises IOError with an informative message if the file isn't found.
99
92
100 On Windows, apply Windows semantics to the filename. In particular, remove
93 On Windows, apply Windows semantics to the filename. In particular, remove
101 any quoting that has been applied to it. This option can be forced for
94 any quoting that has been applied to it. This option can be forced for
102 testing purposes.
95 testing purposes.
103 """
96 """
104
97
105 name = os.path.expanduser(name)
98 name = os.path.expanduser(name)
106 if force_win32 is None:
99 if force_win32 is None:
107 win32 = (sys.platform == 'win32')
100 win32 = (sys.platform == 'win32')
108 else:
101 else:
109 win32 = force_win32
102 win32 = force_win32
110 name = unquote_filename(name, win32=win32)
103 name = unquote_filename(name, win32=win32)
111 if not os.path.isfile(name) and not name.endswith('.py'):
104 if not os.path.isfile(name) and not name.endswith('.py'):
112 name += '.py'
105 name += '.py'
113 if os.path.isfile(name):
106 if os.path.isfile(name):
114 return name
107 return name
115 else:
108 else:
116 raise IOError,'File `%s` not found.' % name
109 raise IOError,'File `%s` not found.' % name
117
110
118
111
119 def filefind(filename, path_dirs=None):
112 def filefind(filename, path_dirs=None):
120 """Find a file by looking through a sequence of paths.
113 """Find a file by looking through a sequence of paths.
121
114
122 This iterates through a sequence of paths looking for a file and returns
115 This iterates through a sequence of paths looking for a file and returns
123 the full, absolute path of the first occurence of the file. If no set of
116 the full, absolute path of the first occurence of the file. If no set of
124 path dirs is given, the filename is tested as is, after running through
117 path dirs is given, the filename is tested as is, after running through
125 :func:`expandvars` and :func:`expanduser`. Thus a simple call::
118 :func:`expandvars` and :func:`expanduser`. Thus a simple call::
126
119
127 filefind('myfile.txt')
120 filefind('myfile.txt')
128
121
129 will find the file in the current working dir, but::
122 will find the file in the current working dir, but::
130
123
131 filefind('~/myfile.txt')
124 filefind('~/myfile.txt')
132
125
133 Will find the file in the users home directory. This function does not
126 Will find the file in the users home directory. This function does not
134 automatically try any paths, such as the cwd or the user's home directory.
127 automatically try any paths, such as the cwd or the user's home directory.
135
128
136 Parameters
129 Parameters
137 ----------
130 ----------
138 filename : str
131 filename : str
139 The filename to look for.
132 The filename to look for.
140 path_dirs : str, None or sequence of str
133 path_dirs : str, None or sequence of str
141 The sequence of paths to look for the file in. If None, the filename
134 The sequence of paths to look for the file in. If None, the filename
142 need to be absolute or be in the cwd. If a string, the string is
135 need to be absolute or be in the cwd. If a string, the string is
143 put into a sequence and the searched. If a sequence, walk through
136 put into a sequence and the searched. If a sequence, walk through
144 each element and join with ``filename``, calling :func:`expandvars`
137 each element and join with ``filename``, calling :func:`expandvars`
145 and :func:`expanduser` before testing for existence.
138 and :func:`expanduser` before testing for existence.
146
139
147 Returns
140 Returns
148 -------
141 -------
149 Raises :exc:`IOError` or returns absolute path to file.
142 Raises :exc:`IOError` or returns absolute path to file.
150 """
143 """
151
144
152 # If paths are quoted, abspath gets confused, strip them...
145 # If paths are quoted, abspath gets confused, strip them...
153 filename = filename.strip('"').strip("'")
146 filename = filename.strip('"').strip("'")
154 # If the input is an absolute path, just check it exists
147 # If the input is an absolute path, just check it exists
155 if os.path.isabs(filename) and os.path.isfile(filename):
148 if os.path.isabs(filename) and os.path.isfile(filename):
156 return filename
149 return filename
157
150
158 if path_dirs is None:
151 if path_dirs is None:
159 path_dirs = ("",)
152 path_dirs = ("",)
160 elif isinstance(path_dirs, basestring):
153 elif isinstance(path_dirs, basestring):
161 path_dirs = (path_dirs,)
154 path_dirs = (path_dirs,)
162
155
163 for path in path_dirs:
156 for path in path_dirs:
164 if path == '.': path = os.getcwdu()
157 if path == '.': path = os.getcwdu()
165 testname = expand_path(os.path.join(path, filename))
158 testname = expand_path(os.path.join(path, filename))
166 if os.path.isfile(testname):
159 if os.path.isfile(testname):
167 return os.path.abspath(testname)
160 return os.path.abspath(testname)
168
161
169 raise IOError("File %r does not exist in any of the search paths: %r" %
162 raise IOError("File %r does not exist in any of the search paths: %r" %
170 (filename, path_dirs) )
163 (filename, path_dirs) )
171
164
172
165
173 class HomeDirError(Exception):
166 class HomeDirError(Exception):
174 pass
167 pass
175
168
176
169
177 def get_home_dir():
170 def get_home_dir():
178 """Return the closest possible equivalent to a 'home' directory.
171 """Return the closest possible equivalent to a 'home' directory.
179
172
180 * On POSIX, we try $HOME.
173 * On POSIX, we try $HOME.
181 * On Windows we try:
174 * On Windows we try:
182 - %HOMESHARE%
175 - %HOMESHARE%
183 - %HOMEDRIVE\%HOMEPATH%
176 - %HOMEDRIVE\%HOMEPATH%
184 - %USERPROFILE%
177 - %USERPROFILE%
185 - Registry hack for My Documents
178 - Registry hack for My Documents
186 - %HOME%: rare, but some people with unix-like setups may have defined it
179 - %HOME%: rare, but some people with unix-like setups may have defined it
187 * On Dos C:\
180 * On Dos C:\
188
181
189 Currently only Posix and NT are implemented, a HomeDirError exception is
182 Currently only Posix and NT are implemented, a HomeDirError exception is
190 raised for all other OSes.
183 raised for all other OSes.
191 """
184 """
192
185
193 env = os.environ
186 env = os.environ
194
187
195 # first, check py2exe distribution root directory for _ipython.
188 # first, check py2exe distribution root directory for _ipython.
196 # This overrides all. Normally does not exist.
189 # This overrides all. Normally does not exist.
197
190
198 if hasattr(sys, "frozen"): #Is frozen by py2exe
191 if hasattr(sys, "frozen"): #Is frozen by py2exe
199 if '\\library.zip\\' in IPython.__file__.lower():#libraries compressed to zip-file
192 if '\\library.zip\\' in IPython.__file__.lower():#libraries compressed to zip-file
200 root, rest = IPython.__file__.lower().split('library.zip')
193 root, rest = IPython.__file__.lower().split('library.zip')
201 else:
194 else:
202 root=os.path.join(os.path.split(IPython.__file__)[0],"../../")
195 root=os.path.join(os.path.split(IPython.__file__)[0],"../../")
203 root=os.path.abspath(root).rstrip('\\')
196 root=os.path.abspath(root).rstrip('\\')
204 if _writable_dir(os.path.join(root, '_ipython')):
197 if _writable_dir(os.path.join(root, '_ipython')):
205 os.environ["IPYKITROOT"] = root
198 os.environ["IPYKITROOT"] = root
206 return _cast_unicode(root, fs_encoding)
199 return py3compat.cast_unicode(root, fs_encoding)
207
200
208 if os.name == 'posix':
201 if os.name == 'posix':
209 # Linux, Unix, AIX, OS X
202 # Linux, Unix, AIX, OS X
210 try:
203 try:
211 homedir = env['HOME']
204 homedir = env['HOME']
212 except KeyError:
205 except KeyError:
213 # Last-ditch attempt at finding a suitable $HOME, on systems where
206 # Last-ditch attempt at finding a suitable $HOME, on systems where
214 # it may not be defined in the environment but the system shell
207 # it may not be defined in the environment but the system shell
215 # still knows it - reported once as:
208 # still knows it - reported once as:
216 # https://github.com/ipython/ipython/issues/154
209 # https://github.com/ipython/ipython/issues/154
217 from subprocess import Popen, PIPE
210 from subprocess import Popen, PIPE
218 homedir = Popen('echo $HOME', shell=True,
211 homedir = Popen('echo $HOME', shell=True,
219 stdout=PIPE).communicate()[0].strip()
212 stdout=PIPE).communicate()[0].strip()
220 if homedir:
213 if homedir:
221 return _cast_unicode(homedir, fs_encoding)
214 return py3compat.cast_unicode(homedir, fs_encoding)
222 else:
215 else:
223 raise HomeDirError('Undefined $HOME, IPython cannot proceed.')
216 raise HomeDirError('Undefined $HOME, IPython cannot proceed.')
224 else:
217 else:
225 return _cast_unicode(homedir, fs_encoding)
218 return py3compat.cast_unicode(homedir, fs_encoding)
226 elif os.name == 'nt':
219 elif os.name == 'nt':
227 # Now for win9x, XP, Vista, 7?
220 # Now for win9x, XP, Vista, 7?
228 # For some strange reason all of these return 'nt' for os.name.
221 # For some strange reason all of these return 'nt' for os.name.
229 # First look for a network home directory. This will return the UNC
222 # First look for a network home directory. This will return the UNC
230 # path (\\server\\Users\%username%) not the mapped path (Z:\). This
223 # path (\\server\\Users\%username%) not the mapped path (Z:\). This
231 # is needed when running IPython on cluster where all paths have to
224 # is needed when running IPython on cluster where all paths have to
232 # be UNC.
225 # be UNC.
233 try:
226 try:
234 homedir = env['HOMESHARE']
227 homedir = env['HOMESHARE']
235 except KeyError:
228 except KeyError:
236 pass
229 pass
237 else:
230 else:
238 if _writable_dir(homedir):
231 if _writable_dir(homedir):
239 return _cast_unicode(homedir, fs_encoding)
232 return py3compat.cast_unicode(homedir, fs_encoding)
240
233
241 # Now look for a local home directory
234 # Now look for a local home directory
242 try:
235 try:
243 homedir = os.path.join(env['HOMEDRIVE'],env['HOMEPATH'])
236 homedir = os.path.join(env['HOMEDRIVE'],env['HOMEPATH'])
244 except KeyError:
237 except KeyError:
245 pass
238 pass
246 else:
239 else:
247 if _writable_dir(homedir):
240 if _writable_dir(homedir):
248 return _cast_unicode(homedir, fs_encoding)
241 return py3compat.cast_unicode(homedir, fs_encoding)
249
242
250 # Now the users profile directory
243 # Now the users profile directory
251 try:
244 try:
252 homedir = os.path.join(env['USERPROFILE'])
245 homedir = os.path.join(env['USERPROFILE'])
253 except KeyError:
246 except KeyError:
254 pass
247 pass
255 else:
248 else:
256 if _writable_dir(homedir):
249 if _writable_dir(homedir):
257 return _cast_unicode(homedir, fs_encoding)
250 return py3compat.cast_unicode(homedir, fs_encoding)
258
251
259 # Use the registry to get the 'My Documents' folder.
252 # Use the registry to get the 'My Documents' folder.
260 try:
253 try:
261 import _winreg as wreg
254 import _winreg as wreg
262 key = wreg.OpenKey(
255 key = wreg.OpenKey(
263 wreg.HKEY_CURRENT_USER,
256 wreg.HKEY_CURRENT_USER,
264 "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
257 "Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
265 )
258 )
266 homedir = wreg.QueryValueEx(key,'Personal')[0]
259 homedir = wreg.QueryValueEx(key,'Personal')[0]
267 key.Close()
260 key.Close()
268 except:
261 except:
269 pass
262 pass
270 else:
263 else:
271 if _writable_dir(homedir):
264 if _writable_dir(homedir):
272 return _cast_unicode(homedir, fs_encoding)
265 return py3compat.cast_unicode(homedir, fs_encoding)
273
266
274 # A user with a lot of unix tools in win32 may have defined $HOME.
267 # A user with a lot of unix tools in win32 may have defined $HOME.
275 # Try this as a last ditch option.
268 # Try this as a last ditch option.
276 try:
269 try:
277 homedir = env['HOME']
270 homedir = env['HOME']
278 except KeyError:
271 except KeyError:
279 pass
272 pass
280 else:
273 else:
281 if _writable_dir(homedir):
274 if _writable_dir(homedir):
282 return _cast_unicode(homedir, fs_encoding)
275 return py3compat.cast_unicode(homedir, fs_encoding)
283
276
284 # If all else fails, raise HomeDirError
277 # If all else fails, raise HomeDirError
285 raise HomeDirError('No valid home directory could be found')
278 raise HomeDirError('No valid home directory could be found')
286 elif os.name == 'dos':
279 elif os.name == 'dos':
287 # Desperate, may do absurd things in classic MacOS. May work under DOS.
280 # Desperate, may do absurd things in classic MacOS. May work under DOS.
288 return u'C:\\'
281 return u'C:\\'
289 else:
282 else:
290 raise HomeDirError('No valid home directory could be found for your OS')
283 raise HomeDirError('No valid home directory could be found for your OS')
291
284
292 def get_xdg_dir():
285 def get_xdg_dir():
293 """Return the XDG_CONFIG_HOME, if it is defined and exists, else None.
286 """Return the XDG_CONFIG_HOME, if it is defined and exists, else None.
294
287
295 This is only for posix (Linux,Unix,OS X, etc) systems.
288 This is only for posix (Linux,Unix,OS X, etc) systems.
296 """
289 """
297
290
298 env = os.environ
291 env = os.environ
299
292
300 if os.name == 'posix':
293 if os.name == 'posix':
301 # Linux, Unix, AIX, OS X
294 # Linux, Unix, AIX, OS X
302 # use ~/.config if not set OR empty
295 # use ~/.config if not set OR empty
303 xdg = env.get("XDG_CONFIG_HOME", None) or os.path.join(get_home_dir(), '.config')
296 xdg = env.get("XDG_CONFIG_HOME", None) or os.path.join(get_home_dir(), '.config')
304 if xdg and _writable_dir(xdg):
297 if xdg and _writable_dir(xdg):
305 return _cast_unicode(xdg, fs_encoding)
298 return py3compat.cast_unicode(xdg, fs_encoding)
306
299
307 return None
300 return None
308
301
309
302
310 def get_ipython_dir():
303 def get_ipython_dir():
311 """Get the IPython directory for this platform and user.
304 """Get the IPython directory for this platform and user.
312
305
313 This uses the logic in `get_home_dir` to find the home directory
306 This uses the logic in `get_home_dir` to find the home directory
314 and the adds .ipython to the end of the path.
307 and then adds .ipython to the end of the path.
315 """
308 """
316
309
317 env = os.environ
310 env = os.environ
318 pjoin = os.path.join
311 pjoin = os.path.join
319
312
320
313
321 ipdir_def = '.ipython'
314 ipdir_def = '.ipython'
322 xdg_def = 'ipython'
315 xdg_def = 'ipython'
323
316
324 home_dir = get_home_dir()
317 home_dir = get_home_dir()
325 xdg_dir = get_xdg_dir()
318 xdg_dir = get_xdg_dir()
326 # import pdb; pdb.set_trace() # dbg
319 # import pdb; pdb.set_trace() # dbg
327 ipdir = env.get('IPYTHON_DIR', env.get('IPYTHONDIR', None))
320 ipdir = env.get('IPYTHON_DIR', env.get('IPYTHONDIR', None))
328 if ipdir is None:
321 if ipdir is None:
329 # not set explicitly, use XDG_CONFIG_HOME or HOME
322 # not set explicitly, use XDG_CONFIG_HOME or HOME
330 home_ipdir = pjoin(home_dir, ipdir_def)
323 home_ipdir = pjoin(home_dir, ipdir_def)
331 if xdg_dir:
324 if xdg_dir:
332 # use XDG, as long as the user isn't already
325 # use XDG, as long as the user isn't already
333 # using $HOME/.ipython and *not* XDG/ipython
326 # using $HOME/.ipython and *not* XDG/ipython
334
327
335 xdg_ipdir = pjoin(xdg_dir, xdg_def)
328 xdg_ipdir = pjoin(xdg_dir, xdg_def)
336
329
337 if _writable_dir(xdg_ipdir) or not _writable_dir(home_ipdir):
330 if _writable_dir(xdg_ipdir) or not _writable_dir(home_ipdir):
338 ipdir = xdg_ipdir
331 ipdir = xdg_ipdir
339
332
340 if ipdir is None:
333 if ipdir is None:
341 # not using XDG
334 # not using XDG
342 ipdir = home_ipdir
335 ipdir = home_ipdir
343
336
344 ipdir = os.path.normpath(os.path.expanduser(ipdir))
337 ipdir = os.path.normpath(os.path.expanduser(ipdir))
345
338
346 if os.path.exists(ipdir) and not _writable_dir(ipdir):
339 if os.path.exists(ipdir) and not _writable_dir(ipdir):
347 # ipdir exists, but is not writable
340 # ipdir exists, but is not writable
348 warn.warn("IPython dir '%s' is not a writable location,"
341 warn.warn("IPython dir '%s' is not a writable location,"
349 " using a temp directory."%ipdir)
342 " using a temp directory."%ipdir)
350 ipdir = tempfile.mkdtemp()
343 ipdir = tempfile.mkdtemp()
351 elif not os.path.exists(ipdir):
344 elif not os.path.exists(ipdir):
352 parent = ipdir.rsplit(os.path.sep, 1)[0]
345 parent = ipdir.rsplit(os.path.sep, 1)[0]
353 if not _writable_dir(parent):
346 if not _writable_dir(parent):
354 # ipdir does not exist and parent isn't writable
347 # ipdir does not exist and parent isn't writable
355 warn.warn("IPython parent '%s' is not a writable location,"
348 warn.warn("IPython parent '%s' is not a writable location,"
356 " using a temp directory."%parent)
349 " using a temp directory."%parent)
357 ipdir = tempfile.mkdtemp()
350 ipdir = tempfile.mkdtemp()
358
351
359 return _cast_unicode(ipdir, fs_encoding)
352 return py3compat.cast_unicode(ipdir, fs_encoding)
360
353
361
354
362 def get_ipython_package_dir():
355 def get_ipython_package_dir():
363 """Get the base directory where IPython itself is installed."""
356 """Get the base directory where IPython itself is installed."""
364 ipdir = os.path.dirname(IPython.__file__)
357 ipdir = os.path.dirname(IPython.__file__)
365 return _cast_unicode(ipdir, fs_encoding)
358 return py3compat.cast_unicode(ipdir, fs_encoding)
366
359
367
360
368 def get_ipython_module_path(module_str):
361 def get_ipython_module_path(module_str):
369 """Find the path to an IPython module in this version of IPython.
362 """Find the path to an IPython module in this version of IPython.
370
363
371 This will always find the version of the module that is in this importable
364 This will always find the version of the module that is in this importable
372 IPython package. This will always return the path to the ``.py``
365 IPython package. This will always return the path to the ``.py``
373 version of the module.
366 version of the module.
374 """
367 """
375 if module_str == 'IPython':
368 if module_str == 'IPython':
376 return os.path.join(get_ipython_package_dir(), '__init__.py')
369 return os.path.join(get_ipython_package_dir(), '__init__.py')
377 mod = import_item(module_str)
370 mod = import_item(module_str)
378 the_path = mod.__file__.replace('.pyc', '.py')
371 the_path = mod.__file__.replace('.pyc', '.py')
379 the_path = the_path.replace('.pyo', '.py')
372 the_path = the_path.replace('.pyo', '.py')
380 return _cast_unicode(the_path, fs_encoding)
373 return py3compat.cast_unicode(the_path, fs_encoding)
381
374
382
375
383 def expand_path(s):
376 def expand_path(s):
384 """Expand $VARS and ~names in a string, like a shell
377 """Expand $VARS and ~names in a string, like a shell
385
378
386 :Examples:
379 :Examples:
387
380
388 In [2]: os.environ['FOO']='test'
381 In [2]: os.environ['FOO']='test'
389
382
390 In [3]: expand_path('variable FOO is $FOO')
383 In [3]: expand_path('variable FOO is $FOO')
391 Out[3]: 'variable FOO is test'
384 Out[3]: 'variable FOO is test'
392 """
385 """
393 # This is a pretty subtle hack. When expand user is given a UNC path
386 # This is a pretty subtle hack. When expand user is given a UNC path
394 # on Windows (\\server\share$\%username%), os.path.expandvars, removes
387 # on Windows (\\server\share$\%username%), os.path.expandvars, removes
395 # the $ to get (\\server\share\%username%). I think it considered $
388 # the $ to get (\\server\share\%username%). I think it considered $
396 # alone an empty var. But, we need the $ to remains there (it indicates
389 # alone an empty var. But, we need the $ to remains there (it indicates
397 # a hidden share).
390 # a hidden share).
398 if os.name=='nt':
391 if os.name=='nt':
399 s = s.replace('$\\', 'IPYTHON_TEMP')
392 s = s.replace('$\\', 'IPYTHON_TEMP')
400 s = os.path.expandvars(os.path.expanduser(s))
393 s = os.path.expandvars(os.path.expanduser(s))
401 if os.name=='nt':
394 if os.name=='nt':
402 s = s.replace('IPYTHON_TEMP', '$\\')
395 s = s.replace('IPYTHON_TEMP', '$\\')
403 return s
396 return s
404
397
405
398
406 def target_outdated(target,deps):
399 def target_outdated(target,deps):
407 """Determine whether a target is out of date.
400 """Determine whether a target is out of date.
408
401
409 target_outdated(target,deps) -> 1/0
402 target_outdated(target,deps) -> 1/0
410
403
411 deps: list of filenames which MUST exist.
404 deps: list of filenames which MUST exist.
412 target: single filename which may or may not exist.
405 target: single filename which may or may not exist.
413
406
414 If target doesn't exist or is older than any file listed in deps, return
407 If target doesn't exist or is older than any file listed in deps, return
415 true, otherwise return false.
408 true, otherwise return false.
416 """
409 """
417 try:
410 try:
418 target_time = os.path.getmtime(target)
411 target_time = os.path.getmtime(target)
419 except os.error:
412 except os.error:
420 return 1
413 return 1
421 for dep in deps:
414 for dep in deps:
422 dep_time = os.path.getmtime(dep)
415 dep_time = os.path.getmtime(dep)
423 if dep_time > target_time:
416 if dep_time > target_time:
424 #print "For target",target,"Dep failed:",dep # dbg
417 #print "For target",target,"Dep failed:",dep # dbg
425 #print "times (dep,tar):",dep_time,target_time # dbg
418 #print "times (dep,tar):",dep_time,target_time # dbg
426 return 1
419 return 1
427 return 0
420 return 0
428
421
429
422
430 def target_update(target,deps,cmd):
423 def target_update(target,deps,cmd):
431 """Update a target with a given command given a list of dependencies.
424 """Update a target with a given command given a list of dependencies.
432
425
433 target_update(target,deps,cmd) -> runs cmd if target is outdated.
426 target_update(target,deps,cmd) -> runs cmd if target is outdated.
434
427
435 This is just a wrapper around target_outdated() which calls the given
428 This is just a wrapper around target_outdated() which calls the given
436 command if target is outdated."""
429 command if target is outdated."""
437
430
438 if target_outdated(target,deps):
431 if target_outdated(target,deps):
439 system(cmd)
432 system(cmd)
440
433
441 def filehash(path):
434 def filehash(path):
442 """Make an MD5 hash of a file, ignoring any differences in line
435 """Make an MD5 hash of a file, ignoring any differences in line
443 ending characters."""
436 ending characters."""
444 with open(path, "rU") as f:
437 with open(path, "rU") as f:
445 return md5(f.read()).hexdigest()
438 return md5(py3compat.str_to_bytes(f.read())).hexdigest()
446
439
447 # If the config is unmodified from the default, we'll just delete it.
440 # If the config is unmodified from the default, we'll just delete it.
448 # These are consistent for 0.10.x, thankfully. We're not going to worry about
441 # These are consistent for 0.10.x, thankfully. We're not going to worry about
449 # older versions.
442 # older versions.
450 old_config_md5 = {'ipy_user_conf.py': 'fc108bedff4b9a00f91fa0a5999140d3',
443 old_config_md5 = {'ipy_user_conf.py': 'fc108bedff4b9a00f91fa0a5999140d3',
451 'ipythonrc': '12a68954f3403eea2eec09dc8fe5a9b5'}
444 'ipythonrc': '12a68954f3403eea2eec09dc8fe5a9b5'}
452
445
453 def check_for_old_config(ipython_dir=None):
446 def check_for_old_config(ipython_dir=None):
454 """Check for old config files, and present a warning if they exist.
447 """Check for old config files, and present a warning if they exist.
455
448
456 A link to the docs of the new config is included in the message.
449 A link to the docs of the new config is included in the message.
457
450
458 This should mitigate confusion with the transition to the new
451 This should mitigate confusion with the transition to the new
459 config system in 0.11.
452 config system in 0.11.
460 """
453 """
461 if ipython_dir is None:
454 if ipython_dir is None:
462 ipython_dir = get_ipython_dir()
455 ipython_dir = get_ipython_dir()
463
456
464 old_configs = ['ipy_user_conf.py', 'ipythonrc', 'ipython_config.py']
457 old_configs = ['ipy_user_conf.py', 'ipythonrc', 'ipython_config.py']
465 warned = False
458 warned = False
466 for cfg in old_configs:
459 for cfg in old_configs:
467 f = os.path.join(ipython_dir, cfg)
460 f = os.path.join(ipython_dir, cfg)
468 if os.path.exists(f):
461 if os.path.exists(f):
469 if filehash(f) == old_config_md5.get(cfg, ''):
462 if filehash(f) == old_config_md5.get(cfg, ''):
470 os.unlink(f)
463 os.unlink(f)
471 else:
464 else:
472 warn.warn("Found old IPython config file %r (modified by user)"%f)
465 warn.warn("Found old IPython config file %r (modified by user)"%f)
473 warned = True
466 warned = True
474
467
475 if warned:
468 if warned:
476 warn.info("""
469 warn.info("""
477 The IPython configuration system has changed as of 0.11, and these files will
470 The IPython configuration system has changed as of 0.11, and these files will
478 be ignored. See http://ipython.github.com/ipython-doc/dev/config for details
471 be ignored. See http://ipython.github.com/ipython-doc/dev/config for details
479 of the new config system.
472 of the new config system.
480 To start configuring IPython, do `ipython profile create`, and edit
473 To start configuring IPython, do `ipython profile create`, and edit
481 `ipython_config.py` in <ipython_dir>/profile_default.
474 `ipython_config.py` in <ipython_dir>/profile_default.
482 If you need to leave the old config files in place for an older version of
475 If you need to leave the old config files in place for an older version of
483 IPython and want to suppress this warning message, set
476 IPython and want to suppress this warning message, set
484 `c.InteractiveShellApp.ignore_old_config=True` in the new config.""")
477 `c.InteractiveShellApp.ignore_old_config=True` in the new config.""")
485
478
@@ -1,37 +1,48 b''
1 import sys
1 import sys
2
2
3 def no_code(x, encoding=None):
3 def no_code(x, encoding=None):
4 return x
4 return x
5
5
6 def decode(s, encoding=None):
6 def decode(s, encoding=None):
7 encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
7 encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
8 return s.decode(encoding, "replace")
8 return s.decode(encoding, "replace")
9
9
10 def encode(u, encoding=None):
10 def encode(u, encoding=None):
11 encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
11 encoding = encoding or sys.stdin.encoding or sys.getdefaultencoding()
12 return u.encode(encoding, "replace")
12 return u.encode(encoding, "replace")
13
14 def cast_unicode(s, encoding=None):
15 if isinstance(s, bytes):
16 return decode(s, encoding)
17 return s
18
19 def cast_bytes(s, encoding=None):
20 if not isinstance(s, bytes):
21 return encode(s, encoding)
22 return s
13
23
14 if sys.version_info[0] >= 3:
24 if sys.version_info[0] >= 3:
15 PY3 = True
25 PY3 = True
16
26
17 input = input
27 input = input
18 builtin_mod_name = "builtins"
28 builtin_mod_name = "builtins"
19
29
20 str_to_unicode = no_code
30 str_to_unicode = no_code
21 unicode_to_str = no_code
31 unicode_to_str = no_code
22 str_to_bytes = encode
32 str_to_bytes = encode
23 bytes_to_str = decode
33 bytes_to_str = decode
24
34
25 else:
35 else:
26 PY3 = False
36 PY3 = False
27
37
28 input = raw_input
38 input = raw_input
29 builtin_mod_name = "__builtin__"
39 builtin_mod_name = "__builtin__"
30
40
31 str_to_unicode = decode
41 str_to_unicode = decode
32 unicode_to_str = encode
42 unicode_to_str = encode
33 str_to_bytes = no_code
43 str_to_bytes = no_code
34 bytes_to_str = no_code
44 bytes_to_str = no_code
35
45
36 def execfile(fname, glob, loc):
46 def execfile(fname, glob, loc=None):
47 loc = loc if (loc is not None) else glob
37 exec compile(open(fname).read(), fname, 'exec') in glob, loc
48 exec compile(open(fname).read(), fname, 'exec') in glob, loc
General Comments 0
You need to be logged in to leave comments. Login now