##// END OF EJS Templates
Proper fix for tab-completion bug reported by Alex Schmolck; patch by Dan Milstein
fperez -
Show More

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

@@ -1,2566 +1,2569 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """
2 """
3 IPython -- An enhanced Interactive Python
3 IPython -- An enhanced Interactive Python
4
4
5 Requires Python 2.3 or newer.
5 Requires Python 2.3 or newer.
6
6
7 This file contains all the classes and helper functions specific to IPython.
7 This file contains all the classes and helper functions specific to IPython.
8
8
9 $Id: iplib.py 2126 2007-03-02 06:51:02Z fperez $
9 $Id: iplib.py 2135 2007-03-10 09:26:25Z fperez $
10 """
10 """
11
11
12 #*****************************************************************************
12 #*****************************************************************************
13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
13 # Copyright (C) 2001 Janko Hauser <jhauser@zscout.de> and
14 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
14 # Copyright (C) 2001-2006 Fernando Perez. <fperez@colorado.edu>
15 #
15 #
16 # Distributed under the terms of the BSD License. The full license is in
16 # Distributed under the terms of the BSD License. The full license is in
17 # the file COPYING, distributed as part of this software.
17 # the file COPYING, distributed as part of this software.
18 #
18 #
19 # Note: this code originally subclassed code.InteractiveConsole from the
19 # Note: this code originally subclassed code.InteractiveConsole from the
20 # Python standard library. Over time, all of that class has been copied
20 # Python standard library. Over time, all of that class has been copied
21 # verbatim here for modifications which could not be accomplished by
21 # verbatim here for modifications which could not be accomplished by
22 # subclassing. At this point, there are no dependencies at all on the code
22 # subclassing. At this point, there are no dependencies at all on the code
23 # module anymore (it is not even imported). The Python License (sec. 2)
23 # module anymore (it is not even imported). The Python License (sec. 2)
24 # allows for this, but it's always nice to acknowledge credit where credit is
24 # allows for this, but it's always nice to acknowledge credit where credit is
25 # due.
25 # due.
26 #*****************************************************************************
26 #*****************************************************************************
27
27
28 #****************************************************************************
28 #****************************************************************************
29 # Modules and globals
29 # Modules and globals
30
30
31 from IPython import Release
31 from IPython import Release
32 __author__ = '%s <%s>\n%s <%s>' % \
32 __author__ = '%s <%s>\n%s <%s>' % \
33 ( Release.authors['Janko'] + Release.authors['Fernando'] )
33 ( Release.authors['Janko'] + Release.authors['Fernando'] )
34 __license__ = Release.license
34 __license__ = Release.license
35 __version__ = Release.version
35 __version__ = Release.version
36
36
37 # Python standard modules
37 # Python standard modules
38 import __main__
38 import __main__
39 import __builtin__
39 import __builtin__
40 import StringIO
40 import StringIO
41 import bdb
41 import bdb
42 import cPickle as pickle
42 import cPickle as pickle
43 import codeop
43 import codeop
44 import exceptions
44 import exceptions
45 import glob
45 import glob
46 import inspect
46 import inspect
47 import keyword
47 import keyword
48 import new
48 import new
49 import os
49 import os
50 import pydoc
50 import pydoc
51 import re
51 import re
52 import shutil
52 import shutil
53 import string
53 import string
54 import sys
54 import sys
55 import tempfile
55 import tempfile
56 import traceback
56 import traceback
57 import types
57 import types
58 import pickleshare
58 import pickleshare
59 from sets import Set
59 from sets import Set
60 from pprint import pprint, pformat
60 from pprint import pprint, pformat
61
61
62 # IPython's own modules
62 # IPython's own modules
63 import IPython
63 import IPython
64 from IPython import OInspect,PyColorize,ultraTB
64 from IPython import OInspect,PyColorize,ultraTB
65 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
65 from IPython.ColorANSI import ColorScheme,ColorSchemeTable # too long names
66 from IPython.FakeModule import FakeModule
66 from IPython.FakeModule import FakeModule
67 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
67 from IPython.Itpl import Itpl,itpl,printpl,ItplNS,itplns
68 from IPython.Logger import Logger
68 from IPython.Logger import Logger
69 from IPython.Magic import Magic
69 from IPython.Magic import Magic
70 from IPython.Prompts import CachedOutput
70 from IPython.Prompts import CachedOutput
71 from IPython.ipstruct import Struct
71 from IPython.ipstruct import Struct
72 from IPython.background_jobs import BackgroundJobManager
72 from IPython.background_jobs import BackgroundJobManager
73 from IPython.usage import cmd_line_usage,interactive_usage
73 from IPython.usage import cmd_line_usage,interactive_usage
74 from IPython.genutils import *
74 from IPython.genutils import *
75 from IPython.strdispatch import StrDispatch
75 from IPython.strdispatch import StrDispatch
76 import IPython.ipapi
76 import IPython.ipapi
77
77
78 # Globals
78 # Globals
79
79
80 # store the builtin raw_input globally, and use this always, in case user code
80 # store the builtin raw_input globally, and use this always, in case user code
81 # overwrites it (like wx.py.PyShell does)
81 # overwrites it (like wx.py.PyShell does)
82 raw_input_original = raw_input
82 raw_input_original = raw_input
83
83
84 # compiled regexps for autoindent management
84 # compiled regexps for autoindent management
85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
85 dedent_re = re.compile(r'^\s+raise|^\s+return|^\s+pass')
86
86
87
87
88 #****************************************************************************
88 #****************************************************************************
89 # Some utility function definitions
89 # Some utility function definitions
90
90
91 ini_spaces_re = re.compile(r'^(\s+)')
91 ini_spaces_re = re.compile(r'^(\s+)')
92
92
93 def num_ini_spaces(strng):
93 def num_ini_spaces(strng):
94 """Return the number of initial spaces in a string"""
94 """Return the number of initial spaces in a string"""
95
95
96 ini_spaces = ini_spaces_re.match(strng)
96 ini_spaces = ini_spaces_re.match(strng)
97 if ini_spaces:
97 if ini_spaces:
98 return ini_spaces.end()
98 return ini_spaces.end()
99 else:
99 else:
100 return 0
100 return 0
101
101
102 def softspace(file, newvalue):
102 def softspace(file, newvalue):
103 """Copied from code.py, to remove the dependency"""
103 """Copied from code.py, to remove the dependency"""
104
104
105 oldvalue = 0
105 oldvalue = 0
106 try:
106 try:
107 oldvalue = file.softspace
107 oldvalue = file.softspace
108 except AttributeError:
108 except AttributeError:
109 pass
109 pass
110 try:
110 try:
111 file.softspace = newvalue
111 file.softspace = newvalue
112 except (AttributeError, TypeError):
112 except (AttributeError, TypeError):
113 # "attribute-less object" or "read-only attributes"
113 # "attribute-less object" or "read-only attributes"
114 pass
114 pass
115 return oldvalue
115 return oldvalue
116
116
117
117
118 #****************************************************************************
118 #****************************************************************************
119 # Local use exceptions
119 # Local use exceptions
120 class SpaceInInput(exceptions.Exception): pass
120 class SpaceInInput(exceptions.Exception): pass
121
121
122
122
123 #****************************************************************************
123 #****************************************************************************
124 # Local use classes
124 # Local use classes
125 class Bunch: pass
125 class Bunch: pass
126
126
127 class Undefined: pass
127 class Undefined: pass
128
128
129 class Quitter(object):
129 class Quitter(object):
130 """Simple class to handle exit, similar to Python 2.5's.
130 """Simple class to handle exit, similar to Python 2.5's.
131
131
132 It handles exiting in an ipython-safe manner, which the one in Python 2.5
132 It handles exiting in an ipython-safe manner, which the one in Python 2.5
133 doesn't do (obviously, since it doesn't know about ipython)."""
133 doesn't do (obviously, since it doesn't know about ipython)."""
134
134
135 def __init__(self,shell,name):
135 def __init__(self,shell,name):
136 self.shell = shell
136 self.shell = shell
137 self.name = name
137 self.name = name
138
138
139 def __repr__(self):
139 def __repr__(self):
140 return 'Type %s() to exit.' % self.name
140 return 'Type %s() to exit.' % self.name
141 __str__ = __repr__
141 __str__ = __repr__
142
142
143 def __call__(self):
143 def __call__(self):
144 self.shell.exit()
144 self.shell.exit()
145
145
146 class InputList(list):
146 class InputList(list):
147 """Class to store user input.
147 """Class to store user input.
148
148
149 It's basically a list, but slices return a string instead of a list, thus
149 It's basically a list, but slices return a string instead of a list, thus
150 allowing things like (assuming 'In' is an instance):
150 allowing things like (assuming 'In' is an instance):
151
151
152 exec In[4:7]
152 exec In[4:7]
153
153
154 or
154 or
155
155
156 exec In[5:9] + In[14] + In[21:25]"""
156 exec In[5:9] + In[14] + In[21:25]"""
157
157
158 def __getslice__(self,i,j):
158 def __getslice__(self,i,j):
159 return ''.join(list.__getslice__(self,i,j))
159 return ''.join(list.__getslice__(self,i,j))
160
160
161 class SyntaxTB(ultraTB.ListTB):
161 class SyntaxTB(ultraTB.ListTB):
162 """Extension which holds some state: the last exception value"""
162 """Extension which holds some state: the last exception value"""
163
163
164 def __init__(self,color_scheme = 'NoColor'):
164 def __init__(self,color_scheme = 'NoColor'):
165 ultraTB.ListTB.__init__(self,color_scheme)
165 ultraTB.ListTB.__init__(self,color_scheme)
166 self.last_syntax_error = None
166 self.last_syntax_error = None
167
167
168 def __call__(self, etype, value, elist):
168 def __call__(self, etype, value, elist):
169 self.last_syntax_error = value
169 self.last_syntax_error = value
170 ultraTB.ListTB.__call__(self,etype,value,elist)
170 ultraTB.ListTB.__call__(self,etype,value,elist)
171
171
172 def clear_err_state(self):
172 def clear_err_state(self):
173 """Return the current error state and clear it"""
173 """Return the current error state and clear it"""
174 e = self.last_syntax_error
174 e = self.last_syntax_error
175 self.last_syntax_error = None
175 self.last_syntax_error = None
176 return e
176 return e
177
177
178 #****************************************************************************
178 #****************************************************************************
179 # Main IPython class
179 # Main IPython class
180
180
181 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
181 # FIXME: the Magic class is a mixin for now, and will unfortunately remain so
182 # until a full rewrite is made. I've cleaned all cross-class uses of
182 # until a full rewrite is made. I've cleaned all cross-class uses of
183 # attributes and methods, but too much user code out there relies on the
183 # attributes and methods, but too much user code out there relies on the
184 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
184 # equlity %foo == __IP.magic_foo, so I can't actually remove the mixin usage.
185 #
185 #
186 # But at least now, all the pieces have been separated and we could, in
186 # But at least now, all the pieces have been separated and we could, in
187 # principle, stop using the mixin. This will ease the transition to the
187 # principle, stop using the mixin. This will ease the transition to the
188 # chainsaw branch.
188 # chainsaw branch.
189
189
190 # For reference, the following is the list of 'self.foo' uses in the Magic
190 # For reference, the following is the list of 'self.foo' uses in the Magic
191 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
191 # class as of 2005-12-28. These are names we CAN'T use in the main ipython
192 # class, to prevent clashes.
192 # class, to prevent clashes.
193
193
194 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
194 # ['self.__class__', 'self.__dict__', 'self._inspect', 'self._ofind',
195 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
195 # 'self.arg_err', 'self.extract_input', 'self.format_', 'self.lsmagic',
196 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
196 # 'self.magic_', 'self.options_table', 'self.parse', 'self.shell',
197 # 'self.value']
197 # 'self.value']
198
198
199 class InteractiveShell(object,Magic):
199 class InteractiveShell(object,Magic):
200 """An enhanced console for Python."""
200 """An enhanced console for Python."""
201
201
202 # class attribute to indicate whether the class supports threads or not.
202 # class attribute to indicate whether the class supports threads or not.
203 # Subclasses with thread support should override this as needed.
203 # Subclasses with thread support should override this as needed.
204 isthreaded = False
204 isthreaded = False
205
205
206 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
206 def __init__(self,name,usage=None,rc=Struct(opts=None,args=None),
207 user_ns = None,user_global_ns=None,banner2='',
207 user_ns = None,user_global_ns=None,banner2='',
208 custom_exceptions=((),None),embedded=False):
208 custom_exceptions=((),None),embedded=False):
209
209
210 # log system
210 # log system
211 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
211 self.logger = Logger(self,logfname='ipython_log.py',logmode='rotate')
212
212
213 # some minimal strict typechecks. For some core data structures, I
213 # some minimal strict typechecks. For some core data structures, I
214 # want actual basic python types, not just anything that looks like
214 # want actual basic python types, not just anything that looks like
215 # one. This is especially true for namespaces.
215 # one. This is especially true for namespaces.
216 for ns in (user_ns,user_global_ns):
216 for ns in (user_ns,user_global_ns):
217 if ns is not None and type(ns) != types.DictType:
217 if ns is not None and type(ns) != types.DictType:
218 raise TypeError,'namespace must be a dictionary'
218 raise TypeError,'namespace must be a dictionary'
219
219
220 # Job manager (for jobs run as background threads)
220 # Job manager (for jobs run as background threads)
221 self.jobs = BackgroundJobManager()
221 self.jobs = BackgroundJobManager()
222
222
223 # Store the actual shell's name
223 # Store the actual shell's name
224 self.name = name
224 self.name = name
225
225
226 # We need to know whether the instance is meant for embedding, since
226 # We need to know whether the instance is meant for embedding, since
227 # global/local namespaces need to be handled differently in that case
227 # global/local namespaces need to be handled differently in that case
228 self.embedded = embedded
228 self.embedded = embedded
229
229
230 # command compiler
230 # command compiler
231 self.compile = codeop.CommandCompiler()
231 self.compile = codeop.CommandCompiler()
232
232
233 # User input buffer
233 # User input buffer
234 self.buffer = []
234 self.buffer = []
235
235
236 # Default name given in compilation of code
236 # Default name given in compilation of code
237 self.filename = '<ipython console>'
237 self.filename = '<ipython console>'
238
238
239 # Install our own quitter instead of the builtins. For python2.3-2.4,
239 # Install our own quitter instead of the builtins. For python2.3-2.4,
240 # this brings in behavior like 2.5, and for 2.5 it's identical.
240 # this brings in behavior like 2.5, and for 2.5 it's identical.
241 __builtin__.exit = Quitter(self,'exit')
241 __builtin__.exit = Quitter(self,'exit')
242 __builtin__.quit = Quitter(self,'quit')
242 __builtin__.quit = Quitter(self,'quit')
243
243
244 # Make an empty namespace, which extension writers can rely on both
244 # Make an empty namespace, which extension writers can rely on both
245 # existing and NEVER being used by ipython itself. This gives them a
245 # existing and NEVER being used by ipython itself. This gives them a
246 # convenient location for storing additional information and state
246 # convenient location for storing additional information and state
247 # their extensions may require, without fear of collisions with other
247 # their extensions may require, without fear of collisions with other
248 # ipython names that may develop later.
248 # ipython names that may develop later.
249 self.meta = Struct()
249 self.meta = Struct()
250
250
251 # Create the namespace where the user will operate. user_ns is
251 # Create the namespace where the user will operate. user_ns is
252 # normally the only one used, and it is passed to the exec calls as
252 # normally the only one used, and it is passed to the exec calls as
253 # the locals argument. But we do carry a user_global_ns namespace
253 # the locals argument. But we do carry a user_global_ns namespace
254 # given as the exec 'globals' argument, This is useful in embedding
254 # given as the exec 'globals' argument, This is useful in embedding
255 # situations where the ipython shell opens in a context where the
255 # situations where the ipython shell opens in a context where the
256 # distinction between locals and globals is meaningful.
256 # distinction between locals and globals is meaningful.
257
257
258 # FIXME. For some strange reason, __builtins__ is showing up at user
258 # FIXME. For some strange reason, __builtins__ is showing up at user
259 # level as a dict instead of a module. This is a manual fix, but I
259 # level as a dict instead of a module. This is a manual fix, but I
260 # should really track down where the problem is coming from. Alex
260 # should really track down where the problem is coming from. Alex
261 # Schmolck reported this problem first.
261 # Schmolck reported this problem first.
262
262
263 # A useful post by Alex Martelli on this topic:
263 # A useful post by Alex Martelli on this topic:
264 # Re: inconsistent value from __builtins__
264 # Re: inconsistent value from __builtins__
265 # Von: Alex Martelli <aleaxit@yahoo.com>
265 # Von: Alex Martelli <aleaxit@yahoo.com>
266 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
266 # Datum: Freitag 01 Oktober 2004 04:45:34 nachmittags/abends
267 # Gruppen: comp.lang.python
267 # Gruppen: comp.lang.python
268
268
269 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
269 # Michael Hohn <hohn@hooknose.lbl.gov> wrote:
270 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
270 # > >>> print type(builtin_check.get_global_binding('__builtins__'))
271 # > <type 'dict'>
271 # > <type 'dict'>
272 # > >>> print type(__builtins__)
272 # > >>> print type(__builtins__)
273 # > <type 'module'>
273 # > <type 'module'>
274 # > Is this difference in return value intentional?
274 # > Is this difference in return value intentional?
275
275
276 # Well, it's documented that '__builtins__' can be either a dictionary
276 # Well, it's documented that '__builtins__' can be either a dictionary
277 # or a module, and it's been that way for a long time. Whether it's
277 # or a module, and it's been that way for a long time. Whether it's
278 # intentional (or sensible), I don't know. In any case, the idea is
278 # intentional (or sensible), I don't know. In any case, the idea is
279 # that if you need to access the built-in namespace directly, you
279 # that if you need to access the built-in namespace directly, you
280 # should start with "import __builtin__" (note, no 's') which will
280 # should start with "import __builtin__" (note, no 's') which will
281 # definitely give you a module. Yeah, it's somewhat confusing:-(.
281 # definitely give you a module. Yeah, it's somewhat confusing:-(.
282
282
283 # These routines return properly built dicts as needed by the rest of
283 # These routines return properly built dicts as needed by the rest of
284 # the code, and can also be used by extension writers to generate
284 # the code, and can also be used by extension writers to generate
285 # properly initialized namespaces.
285 # properly initialized namespaces.
286 user_ns = IPython.ipapi.make_user_ns(user_ns)
286 user_ns = IPython.ipapi.make_user_ns(user_ns)
287 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
287 user_global_ns = IPython.ipapi.make_user_global_ns(user_global_ns)
288
288
289 # Assign namespaces
289 # Assign namespaces
290 # This is the namespace where all normal user variables live
290 # This is the namespace where all normal user variables live
291 self.user_ns = user_ns
291 self.user_ns = user_ns
292 # Embedded instances require a separate namespace for globals.
292 # Embedded instances require a separate namespace for globals.
293 # Normally this one is unused by non-embedded instances.
293 # Normally this one is unused by non-embedded instances.
294 self.user_global_ns = user_global_ns
294 self.user_global_ns = user_global_ns
295 # A namespace to keep track of internal data structures to prevent
295 # A namespace to keep track of internal data structures to prevent
296 # them from cluttering user-visible stuff. Will be updated later
296 # them from cluttering user-visible stuff. Will be updated later
297 self.internal_ns = {}
297 self.internal_ns = {}
298
298
299 # Namespace of system aliases. Each entry in the alias
299 # Namespace of system aliases. Each entry in the alias
300 # table must be a 2-tuple of the form (N,name), where N is the number
300 # table must be a 2-tuple of the form (N,name), where N is the number
301 # of positional arguments of the alias.
301 # of positional arguments of the alias.
302 self.alias_table = {}
302 self.alias_table = {}
303
303
304 # A table holding all the namespaces IPython deals with, so that
304 # A table holding all the namespaces IPython deals with, so that
305 # introspection facilities can search easily.
305 # introspection facilities can search easily.
306 self.ns_table = {'user':user_ns,
306 self.ns_table = {'user':user_ns,
307 'user_global':user_global_ns,
307 'user_global':user_global_ns,
308 'alias':self.alias_table,
308 'alias':self.alias_table,
309 'internal':self.internal_ns,
309 'internal':self.internal_ns,
310 'builtin':__builtin__.__dict__
310 'builtin':__builtin__.__dict__
311 }
311 }
312
312
313 # The user namespace MUST have a pointer to the shell itself.
313 # The user namespace MUST have a pointer to the shell itself.
314 self.user_ns[name] = self
314 self.user_ns[name] = self
315
315
316 # We need to insert into sys.modules something that looks like a
316 # We need to insert into sys.modules something that looks like a
317 # module but which accesses the IPython namespace, for shelve and
317 # module but which accesses the IPython namespace, for shelve and
318 # pickle to work interactively. Normally they rely on getting
318 # pickle to work interactively. Normally they rely on getting
319 # everything out of __main__, but for embedding purposes each IPython
319 # everything out of __main__, but for embedding purposes each IPython
320 # instance has its own private namespace, so we can't go shoving
320 # instance has its own private namespace, so we can't go shoving
321 # everything into __main__.
321 # everything into __main__.
322
322
323 # note, however, that we should only do this for non-embedded
323 # note, however, that we should only do this for non-embedded
324 # ipythons, which really mimic the __main__.__dict__ with their own
324 # ipythons, which really mimic the __main__.__dict__ with their own
325 # namespace. Embedded instances, on the other hand, should not do
325 # namespace. Embedded instances, on the other hand, should not do
326 # this because they need to manage the user local/global namespaces
326 # this because they need to manage the user local/global namespaces
327 # only, but they live within a 'normal' __main__ (meaning, they
327 # only, but they live within a 'normal' __main__ (meaning, they
328 # shouldn't overtake the execution environment of the script they're
328 # shouldn't overtake the execution environment of the script they're
329 # embedded in).
329 # embedded in).
330
330
331 if not embedded:
331 if not embedded:
332 try:
332 try:
333 main_name = self.user_ns['__name__']
333 main_name = self.user_ns['__name__']
334 except KeyError:
334 except KeyError:
335 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
335 raise KeyError,'user_ns dictionary MUST have a "__name__" key'
336 else:
336 else:
337 #print "pickle hack in place" # dbg
337 #print "pickle hack in place" # dbg
338 #print 'main_name:',main_name # dbg
338 #print 'main_name:',main_name # dbg
339 sys.modules[main_name] = FakeModule(self.user_ns)
339 sys.modules[main_name] = FakeModule(self.user_ns)
340
340
341 # List of input with multi-line handling.
341 # List of input with multi-line handling.
342 # Fill its zero entry, user counter starts at 1
342 # Fill its zero entry, user counter starts at 1
343 self.input_hist = InputList(['\n'])
343 self.input_hist = InputList(['\n'])
344 # This one will hold the 'raw' input history, without any
344 # This one will hold the 'raw' input history, without any
345 # pre-processing. This will allow users to retrieve the input just as
345 # pre-processing. This will allow users to retrieve the input just as
346 # it was exactly typed in by the user, with %hist -r.
346 # it was exactly typed in by the user, with %hist -r.
347 self.input_hist_raw = InputList(['\n'])
347 self.input_hist_raw = InputList(['\n'])
348
348
349 # list of visited directories
349 # list of visited directories
350 try:
350 try:
351 self.dir_hist = [os.getcwd()]
351 self.dir_hist = [os.getcwd()]
352 except IOError, e:
352 except IOError, e:
353 self.dir_hist = []
353 self.dir_hist = []
354
354
355 # dict of output history
355 # dict of output history
356 self.output_hist = {}
356 self.output_hist = {}
357
357
358 # dict of things NOT to alias (keywords, builtins and some magics)
358 # dict of things NOT to alias (keywords, builtins and some magics)
359 no_alias = {}
359 no_alias = {}
360 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
360 no_alias_magics = ['cd','popd','pushd','dhist','alias','unalias']
361 for key in keyword.kwlist + no_alias_magics:
361 for key in keyword.kwlist + no_alias_magics:
362 no_alias[key] = 1
362 no_alias[key] = 1
363 no_alias.update(__builtin__.__dict__)
363 no_alias.update(__builtin__.__dict__)
364 self.no_alias = no_alias
364 self.no_alias = no_alias
365
365
366 # make global variables for user access to these
366 # make global variables for user access to these
367 self.user_ns['_ih'] = self.input_hist
367 self.user_ns['_ih'] = self.input_hist
368 self.user_ns['_oh'] = self.output_hist
368 self.user_ns['_oh'] = self.output_hist
369 self.user_ns['_dh'] = self.dir_hist
369 self.user_ns['_dh'] = self.dir_hist
370
370
371 # user aliases to input and output histories
371 # user aliases to input and output histories
372 self.user_ns['In'] = self.input_hist
372 self.user_ns['In'] = self.input_hist
373 self.user_ns['Out'] = self.output_hist
373 self.user_ns['Out'] = self.output_hist
374
374
375 # Object variable to store code object waiting execution. This is
375 # Object variable to store code object waiting execution. This is
376 # used mainly by the multithreaded shells, but it can come in handy in
376 # used mainly by the multithreaded shells, but it can come in handy in
377 # other situations. No need to use a Queue here, since it's a single
377 # other situations. No need to use a Queue here, since it's a single
378 # item which gets cleared once run.
378 # item which gets cleared once run.
379 self.code_to_run = None
379 self.code_to_run = None
380
380
381 # escapes for automatic behavior on the command line
381 # escapes for automatic behavior on the command line
382 self.ESC_SHELL = '!'
382 self.ESC_SHELL = '!'
383 self.ESC_HELP = '?'
383 self.ESC_HELP = '?'
384 self.ESC_MAGIC = '%'
384 self.ESC_MAGIC = '%'
385 self.ESC_QUOTE = ','
385 self.ESC_QUOTE = ','
386 self.ESC_QUOTE2 = ';'
386 self.ESC_QUOTE2 = ';'
387 self.ESC_PAREN = '/'
387 self.ESC_PAREN = '/'
388
388
389 # And their associated handlers
389 # And their associated handlers
390 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
390 self.esc_handlers = {self.ESC_PAREN : self.handle_auto,
391 self.ESC_QUOTE : self.handle_auto,
391 self.ESC_QUOTE : self.handle_auto,
392 self.ESC_QUOTE2 : self.handle_auto,
392 self.ESC_QUOTE2 : self.handle_auto,
393 self.ESC_MAGIC : self.handle_magic,
393 self.ESC_MAGIC : self.handle_magic,
394 self.ESC_HELP : self.handle_help,
394 self.ESC_HELP : self.handle_help,
395 self.ESC_SHELL : self.handle_shell_escape,
395 self.ESC_SHELL : self.handle_shell_escape,
396 }
396 }
397
397
398 # class initializations
398 # class initializations
399 Magic.__init__(self,self)
399 Magic.__init__(self,self)
400
400
401 # Python source parser/formatter for syntax highlighting
401 # Python source parser/formatter for syntax highlighting
402 pyformat = PyColorize.Parser().format
402 pyformat = PyColorize.Parser().format
403 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
403 self.pycolorize = lambda src: pyformat(src,'str',self.rc['colors'])
404
404
405 # hooks holds pointers used for user-side customizations
405 # hooks holds pointers used for user-side customizations
406 self.hooks = Struct()
406 self.hooks = Struct()
407
407
408 self.strdispatchers = {}
408 self.strdispatchers = {}
409
409
410 # Set all default hooks, defined in the IPython.hooks module.
410 # Set all default hooks, defined in the IPython.hooks module.
411 hooks = IPython.hooks
411 hooks = IPython.hooks
412 for hook_name in hooks.__all__:
412 for hook_name in hooks.__all__:
413 # default hooks have priority 100, i.e. low; user hooks should have 0-100 priority
413 # default hooks have priority 100, i.e. low; user hooks should have 0-100 priority
414 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
414 self.set_hook(hook_name,getattr(hooks,hook_name), 100)
415 #print "bound hook",hook_name
415 #print "bound hook",hook_name
416
416
417 # Flag to mark unconditional exit
417 # Flag to mark unconditional exit
418 self.exit_now = False
418 self.exit_now = False
419
419
420 self.usage_min = """\
420 self.usage_min = """\
421 An enhanced console for Python.
421 An enhanced console for Python.
422 Some of its features are:
422 Some of its features are:
423 - Readline support if the readline library is present.
423 - Readline support if the readline library is present.
424 - Tab completion in the local namespace.
424 - Tab completion in the local namespace.
425 - Logging of input, see command-line options.
425 - Logging of input, see command-line options.
426 - System shell escape via ! , eg !ls.
426 - System shell escape via ! , eg !ls.
427 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
427 - Magic commands, starting with a % (like %ls, %pwd, %cd, etc.)
428 - Keeps track of locally defined variables via %who, %whos.
428 - Keeps track of locally defined variables via %who, %whos.
429 - Show object information with a ? eg ?x or x? (use ?? for more info).
429 - Show object information with a ? eg ?x or x? (use ?? for more info).
430 """
430 """
431 if usage: self.usage = usage
431 if usage: self.usage = usage
432 else: self.usage = self.usage_min
432 else: self.usage = self.usage_min
433
433
434 # Storage
434 # Storage
435 self.rc = rc # This will hold all configuration information
435 self.rc = rc # This will hold all configuration information
436 self.pager = 'less'
436 self.pager = 'less'
437 # temporary files used for various purposes. Deleted at exit.
437 # temporary files used for various purposes. Deleted at exit.
438 self.tempfiles = []
438 self.tempfiles = []
439
439
440 # Keep track of readline usage (later set by init_readline)
440 # Keep track of readline usage (later set by init_readline)
441 self.has_readline = False
441 self.has_readline = False
442
442
443 # template for logfile headers. It gets resolved at runtime by the
443 # template for logfile headers. It gets resolved at runtime by the
444 # logstart method.
444 # logstart method.
445 self.loghead_tpl = \
445 self.loghead_tpl = \
446 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
446 """#log# Automatic Logger file. *** THIS MUST BE THE FIRST LINE ***
447 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
447 #log# DO NOT CHANGE THIS LINE OR THE TWO BELOW
448 #log# opts = %s
448 #log# opts = %s
449 #log# args = %s
449 #log# args = %s
450 #log# It is safe to make manual edits below here.
450 #log# It is safe to make manual edits below here.
451 #log#-----------------------------------------------------------------------
451 #log#-----------------------------------------------------------------------
452 """
452 """
453 # for pushd/popd management
453 # for pushd/popd management
454 try:
454 try:
455 self.home_dir = get_home_dir()
455 self.home_dir = get_home_dir()
456 except HomeDirError,msg:
456 except HomeDirError,msg:
457 fatal(msg)
457 fatal(msg)
458
458
459 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
459 self.dir_stack = [os.getcwd().replace(self.home_dir,'~')]
460
460
461 # Functions to call the underlying shell.
461 # Functions to call the underlying shell.
462
462
463 # The first is similar to os.system, but it doesn't return a value,
463 # The first is similar to os.system, but it doesn't return a value,
464 # and it allows interpolation of variables in the user's namespace.
464 # and it allows interpolation of variables in the user's namespace.
465 self.system = lambda cmd: \
465 self.system = lambda cmd: \
466 shell(self.var_expand(cmd,depth=2),
466 shell(self.var_expand(cmd,depth=2),
467 header=self.rc.system_header,
467 header=self.rc.system_header,
468 verbose=self.rc.system_verbose)
468 verbose=self.rc.system_verbose)
469
469
470 # These are for getoutput and getoutputerror:
470 # These are for getoutput and getoutputerror:
471 self.getoutput = lambda cmd: \
471 self.getoutput = lambda cmd: \
472 getoutput(self.var_expand(cmd,depth=2),
472 getoutput(self.var_expand(cmd,depth=2),
473 header=self.rc.system_header,
473 header=self.rc.system_header,
474 verbose=self.rc.system_verbose)
474 verbose=self.rc.system_verbose)
475
475
476 self.getoutputerror = lambda cmd: \
476 self.getoutputerror = lambda cmd: \
477 getoutputerror(self.var_expand(cmd,depth=2),
477 getoutputerror(self.var_expand(cmd,depth=2),
478 header=self.rc.system_header,
478 header=self.rc.system_header,
479 verbose=self.rc.system_verbose)
479 verbose=self.rc.system_verbose)
480
480
481 # RegExp for splitting line contents into pre-char//first
481 # RegExp for splitting line contents into pre-char//first
482 # word-method//rest. For clarity, each group in on one line.
482 # word-method//rest. For clarity, each group in on one line.
483
483
484 # WARNING: update the regexp if the above escapes are changed, as they
484 # WARNING: update the regexp if the above escapes are changed, as they
485 # are hardwired in.
485 # are hardwired in.
486
486
487 # Don't get carried away with trying to make the autocalling catch too
487 # Don't get carried away with trying to make the autocalling catch too
488 # much: it's better to be conservative rather than to trigger hidden
488 # much: it's better to be conservative rather than to trigger hidden
489 # evals() somewhere and end up causing side effects.
489 # evals() somewhere and end up causing side effects.
490
490 self.line_split = re.compile(r'^(\s*[,;/]?\s*)'
491 self.line_split = re.compile(r'^([\s*,;/])'
492 r'([\?\w\.]+\w*\s*)'
491 r'([\?\w\.]+\w*\s*)'
493 r'(\(?.*$)')
492 r'(\(?.*$)')
494
493
495 # A simpler regexp used as a fallback if the above doesn't work. This
494 # A simpler regexp used as a fallback if the above doesn't work. This
496 # one is more conservative in how it partitions the input. This code
495 # one is more conservative in how it partitions the input. This code
497 # can probably be cleaned up to do everything with just one regexp, but
496 # can probably be cleaned up to do everything with just one regexp, but
498 # I'm afraid of breaking something; do it once the unit tests are in
497 # I'm afraid of breaking something; do it once the unit tests are in
499 # place.
498 # place.
500 self.line_split_fallback = re.compile(r'^(\s*)'
499 self.line_split_fallback = re.compile(r'^(\s*)'
501 r'([%\!\?\w\.]*)'
500 r'([%\!\?\w\.]*)'
502 r'(.*)')
501 r'(.*)')
503
502
504 # Original re, keep around for a while in case changes break something
503 # Original re, keep around for a while in case changes break something
505 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
504 #self.line_split = re.compile(r'(^[\s*!\?%,/]?)'
506 # r'(\s*[\?\w\.]+\w*\s*)'
505 # r'(\s*[\?\w\.]+\w*\s*)'
507 # r'(\(?.*$)')
506 # r'(\(?.*$)')
508
507
509 # RegExp to identify potential function names
508 # RegExp to identify potential function names
510 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
509 self.re_fun_name = re.compile(r'[a-zA-Z_]([a-zA-Z0-9_.]*) *$')
511
510
512 # RegExp to exclude strings with this start from autocalling. In
511 # RegExp to exclude strings with this start from autocalling. In
513 # particular, all binary operators should be excluded, so that if foo
512 # particular, all binary operators should be excluded, so that if foo
514 # is callable, foo OP bar doesn't become foo(OP bar), which is
513 # is callable, foo OP bar doesn't become foo(OP bar), which is
515 # invalid. The characters '!=()' don't need to be checked for, as the
514 # invalid. The characters '!=()' don't need to be checked for, as the
516 # _prefilter routine explicitely does so, to catch direct calls and
515 # _prefilter routine explicitely does so, to catch direct calls and
517 # rebindings of existing names.
516 # rebindings of existing names.
518
517
519 # Warning: the '-' HAS TO BE AT THE END of the first group, otherwise
518 # Warning: the '-' HAS TO BE AT THE END of the first group, otherwise
520 # it affects the rest of the group in square brackets.
519 # it affects the rest of the group in square brackets.
521 self.re_exclude_auto = re.compile(r'^[<>,&^\|\*/\+-]'
520 self.re_exclude_auto = re.compile(r'^[<>,&^\|\*/\+-]'
522 '|^is |^not |^in |^and |^or ')
521 '|^is |^not |^in |^and |^or ')
523
522
524 # try to catch also methods for stuff in lists/tuples/dicts: off
523 # try to catch also methods for stuff in lists/tuples/dicts: off
525 # (experimental). For this to work, the line_split regexp would need
524 # (experimental). For this to work, the line_split regexp would need
526 # to be modified so it wouldn't break things at '['. That line is
525 # to be modified so it wouldn't break things at '['. That line is
527 # nasty enough that I shouldn't change it until I can test it _well_.
526 # nasty enough that I shouldn't change it until I can test it _well_.
528 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
527 #self.re_fun_name = re.compile (r'[a-zA-Z_]([a-zA-Z0-9_.\[\]]*) ?$')
529
528
530 # keep track of where we started running (mainly for crash post-mortem)
529 # keep track of where we started running (mainly for crash post-mortem)
531 self.starting_dir = os.getcwd()
530 self.starting_dir = os.getcwd()
532
531
533 # Various switches which can be set
532 # Various switches which can be set
534 self.CACHELENGTH = 5000 # this is cheap, it's just text
533 self.CACHELENGTH = 5000 # this is cheap, it's just text
535 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
534 self.BANNER = "Python %(version)s on %(platform)s\n" % sys.__dict__
536 self.banner2 = banner2
535 self.banner2 = banner2
537
536
538 # TraceBack handlers:
537 # TraceBack handlers:
539
538
540 # Syntax error handler.
539 # Syntax error handler.
541 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
540 self.SyntaxTB = SyntaxTB(color_scheme='NoColor')
542
541
543 # The interactive one is initialized with an offset, meaning we always
542 # The interactive one is initialized with an offset, meaning we always
544 # want to remove the topmost item in the traceback, which is our own
543 # want to remove the topmost item in the traceback, which is our own
545 # internal code. Valid modes: ['Plain','Context','Verbose']
544 # internal code. Valid modes: ['Plain','Context','Verbose']
546 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
545 self.InteractiveTB = ultraTB.AutoFormattedTB(mode = 'Plain',
547 color_scheme='NoColor',
546 color_scheme='NoColor',
548 tb_offset = 1)
547 tb_offset = 1)
549
548
550 # IPython itself shouldn't crash. This will produce a detailed
549 # IPython itself shouldn't crash. This will produce a detailed
551 # post-mortem if it does. But we only install the crash handler for
550 # post-mortem if it does. But we only install the crash handler for
552 # non-threaded shells, the threaded ones use a normal verbose reporter
551 # non-threaded shells, the threaded ones use a normal verbose reporter
553 # and lose the crash handler. This is because exceptions in the main
552 # and lose the crash handler. This is because exceptions in the main
554 # thread (such as in GUI code) propagate directly to sys.excepthook,
553 # thread (such as in GUI code) propagate directly to sys.excepthook,
555 # and there's no point in printing crash dumps for every user exception.
554 # and there's no point in printing crash dumps for every user exception.
556 if self.isthreaded:
555 if self.isthreaded:
557 ipCrashHandler = ultraTB.FormattedTB()
556 ipCrashHandler = ultraTB.FormattedTB()
558 else:
557 else:
559 from IPython import CrashHandler
558 from IPython import CrashHandler
560 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
559 ipCrashHandler = CrashHandler.IPythonCrashHandler(self)
561 self.set_crash_handler(ipCrashHandler)
560 self.set_crash_handler(ipCrashHandler)
562
561
563 # and add any custom exception handlers the user may have specified
562 # and add any custom exception handlers the user may have specified
564 self.set_custom_exc(*custom_exceptions)
563 self.set_custom_exc(*custom_exceptions)
565
564
566 # indentation management
565 # indentation management
567 self.autoindent = False
566 self.autoindent = False
568 self.indent_current_nsp = 0
567 self.indent_current_nsp = 0
569
568
570 # Make some aliases automatically
569 # Make some aliases automatically
571 # Prepare list of shell aliases to auto-define
570 # Prepare list of shell aliases to auto-define
572 if os.name == 'posix':
571 if os.name == 'posix':
573 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
572 auto_alias = ('mkdir mkdir', 'rmdir rmdir',
574 'mv mv -i','rm rm -i','cp cp -i',
573 'mv mv -i','rm rm -i','cp cp -i',
575 'cat cat','less less','clear clear',
574 'cat cat','less less','clear clear',
576 # a better ls
575 # a better ls
577 'ls ls -F',
576 'ls ls -F',
578 # long ls
577 # long ls
579 'll ls -lF')
578 'll ls -lF')
580 # Extra ls aliases with color, which need special treatment on BSD
579 # Extra ls aliases with color, which need special treatment on BSD
581 # variants
580 # variants
582 ls_extra = ( # color ls
581 ls_extra = ( # color ls
583 'lc ls -F -o --color',
582 'lc ls -F -o --color',
584 # ls normal files only
583 # ls normal files only
585 'lf ls -F -o --color %l | grep ^-',
584 'lf ls -F -o --color %l | grep ^-',
586 # ls symbolic links
585 # ls symbolic links
587 'lk ls -F -o --color %l | grep ^l',
586 'lk ls -F -o --color %l | grep ^l',
588 # directories or links to directories,
587 # directories or links to directories,
589 'ldir ls -F -o --color %l | grep /$',
588 'ldir ls -F -o --color %l | grep /$',
590 # things which are executable
589 # things which are executable
591 'lx ls -F -o --color %l | grep ^-..x',
590 'lx ls -F -o --color %l | grep ^-..x',
592 )
591 )
593 # The BSDs don't ship GNU ls, so they don't understand the
592 # The BSDs don't ship GNU ls, so they don't understand the
594 # --color switch out of the box
593 # --color switch out of the box
595 if 'bsd' in sys.platform:
594 if 'bsd' in sys.platform:
596 ls_extra = ( # ls normal files only
595 ls_extra = ( # ls normal files only
597 'lf ls -lF | grep ^-',
596 'lf ls -lF | grep ^-',
598 # ls symbolic links
597 # ls symbolic links
599 'lk ls -lF | grep ^l',
598 'lk ls -lF | grep ^l',
600 # directories or links to directories,
599 # directories or links to directories,
601 'ldir ls -lF | grep /$',
600 'ldir ls -lF | grep /$',
602 # things which are executable
601 # things which are executable
603 'lx ls -lF | grep ^-..x',
602 'lx ls -lF | grep ^-..x',
604 )
603 )
605 auto_alias = auto_alias + ls_extra
604 auto_alias = auto_alias + ls_extra
606 elif os.name in ['nt','dos']:
605 elif os.name in ['nt','dos']:
607 auto_alias = ('dir dir /on', 'ls dir /on',
606 auto_alias = ('dir dir /on', 'ls dir /on',
608 'ddir dir /ad /on', 'ldir dir /ad /on',
607 'ddir dir /ad /on', 'ldir dir /ad /on',
609 'mkdir mkdir','rmdir rmdir','echo echo',
608 'mkdir mkdir','rmdir rmdir','echo echo',
610 'ren ren','cls cls','copy copy')
609 'ren ren','cls cls','copy copy')
611 else:
610 else:
612 auto_alias = ()
611 auto_alias = ()
613 self.auto_alias = [s.split(None,1) for s in auto_alias]
612 self.auto_alias = [s.split(None,1) for s in auto_alias]
614 # Call the actual (public) initializer
613 # Call the actual (public) initializer
615 self.init_auto_alias()
614 self.init_auto_alias()
616
615
617 # Produce a public API instance
616 # Produce a public API instance
618 self.api = IPython.ipapi.IPApi(self)
617 self.api = IPython.ipapi.IPApi(self)
619
618
620 # track which builtins we add, so we can clean up later
619 # track which builtins we add, so we can clean up later
621 self.builtins_added = {}
620 self.builtins_added = {}
622 # This method will add the necessary builtins for operation, but
621 # This method will add the necessary builtins for operation, but
623 # tracking what it did via the builtins_added dict.
622 # tracking what it did via the builtins_added dict.
624 self.add_builtins()
623 self.add_builtins()
625
624
626 # end __init__
625 # end __init__
627
626
628 def var_expand(self,cmd,depth=0):
627 def var_expand(self,cmd,depth=0):
629 """Expand python variables in a string.
628 """Expand python variables in a string.
630
629
631 The depth argument indicates how many frames above the caller should
630 The depth argument indicates how many frames above the caller should
632 be walked to look for the local namespace where to expand variables.
631 be walked to look for the local namespace where to expand variables.
633
632
634 The global namespace for expansion is always the user's interactive
633 The global namespace for expansion is always the user's interactive
635 namespace.
634 namespace.
636 """
635 """
637
636
638 return str(ItplNS(cmd.replace('#','\#'),
637 return str(ItplNS(cmd.replace('#','\#'),
639 self.user_ns, # globals
638 self.user_ns, # globals
640 # Skip our own frame in searching for locals:
639 # Skip our own frame in searching for locals:
641 sys._getframe(depth+1).f_locals # locals
640 sys._getframe(depth+1).f_locals # locals
642 ))
641 ))
643
642
644 def pre_config_initialization(self):
643 def pre_config_initialization(self):
645 """Pre-configuration init method
644 """Pre-configuration init method
646
645
647 This is called before the configuration files are processed to
646 This is called before the configuration files are processed to
648 prepare the services the config files might need.
647 prepare the services the config files might need.
649
648
650 self.rc already has reasonable default values at this point.
649 self.rc already has reasonable default values at this point.
651 """
650 """
652 rc = self.rc
651 rc = self.rc
653
652
654 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
653 self.db = pickleshare.PickleShareDB(rc.ipythondir + "/db")
655
654
656 def post_config_initialization(self):
655 def post_config_initialization(self):
657 """Post configuration init method
656 """Post configuration init method
658
657
659 This is called after the configuration files have been processed to
658 This is called after the configuration files have been processed to
660 'finalize' the initialization."""
659 'finalize' the initialization."""
661
660
662 rc = self.rc
661 rc = self.rc
663
662
664 # Object inspector
663 # Object inspector
665 self.inspector = OInspect.Inspector(OInspect.InspectColors,
664 self.inspector = OInspect.Inspector(OInspect.InspectColors,
666 PyColorize.ANSICodeColors,
665 PyColorize.ANSICodeColors,
667 'NoColor',
666 'NoColor',
668 rc.object_info_string_level)
667 rc.object_info_string_level)
669
668
670 # Load readline proper
669 # Load readline proper
671 if rc.readline:
670 if rc.readline:
672 self.init_readline()
671 self.init_readline()
673
672
674 # local shortcut, this is used a LOT
673 # local shortcut, this is used a LOT
675 self.log = self.logger.log
674 self.log = self.logger.log
676
675
677 # Initialize cache, set in/out prompts and printing system
676 # Initialize cache, set in/out prompts and printing system
678 self.outputcache = CachedOutput(self,
677 self.outputcache = CachedOutput(self,
679 rc.cache_size,
678 rc.cache_size,
680 rc.pprint,
679 rc.pprint,
681 input_sep = rc.separate_in,
680 input_sep = rc.separate_in,
682 output_sep = rc.separate_out,
681 output_sep = rc.separate_out,
683 output_sep2 = rc.separate_out2,
682 output_sep2 = rc.separate_out2,
684 ps1 = rc.prompt_in1,
683 ps1 = rc.prompt_in1,
685 ps2 = rc.prompt_in2,
684 ps2 = rc.prompt_in2,
686 ps_out = rc.prompt_out,
685 ps_out = rc.prompt_out,
687 pad_left = rc.prompts_pad_left)
686 pad_left = rc.prompts_pad_left)
688
687
689 # user may have over-ridden the default print hook:
688 # user may have over-ridden the default print hook:
690 try:
689 try:
691 self.outputcache.__class__.display = self.hooks.display
690 self.outputcache.__class__.display = self.hooks.display
692 except AttributeError:
691 except AttributeError:
693 pass
692 pass
694
693
695 # I don't like assigning globally to sys, because it means when
694 # I don't like assigning globally to sys, because it means when
696 # embedding instances, each embedded instance overrides the previous
695 # embedding instances, each embedded instance overrides the previous
697 # choice. But sys.displayhook seems to be called internally by exec,
696 # choice. But sys.displayhook seems to be called internally by exec,
698 # so I don't see a way around it. We first save the original and then
697 # so I don't see a way around it. We first save the original and then
699 # overwrite it.
698 # overwrite it.
700 self.sys_displayhook = sys.displayhook
699 self.sys_displayhook = sys.displayhook
701 sys.displayhook = self.outputcache
700 sys.displayhook = self.outputcache
702
701
703 # Set user colors (don't do it in the constructor above so that it
702 # Set user colors (don't do it in the constructor above so that it
704 # doesn't crash if colors option is invalid)
703 # doesn't crash if colors option is invalid)
705 self.magic_colors(rc.colors)
704 self.magic_colors(rc.colors)
706
705
707 # Set calling of pdb on exceptions
706 # Set calling of pdb on exceptions
708 self.call_pdb = rc.pdb
707 self.call_pdb = rc.pdb
709
708
710 # Load user aliases
709 # Load user aliases
711 for alias in rc.alias:
710 for alias in rc.alias:
712 self.magic_alias(alias)
711 self.magic_alias(alias)
713 self.hooks.late_startup_hook()
712 self.hooks.late_startup_hook()
714
713
715 batchrun = False
714 batchrun = False
716 for batchfile in [path(arg) for arg in self.rc.args
715 for batchfile in [path(arg) for arg in self.rc.args
717 if arg.lower().endswith('.ipy')]:
716 if arg.lower().endswith('.ipy')]:
718 if not batchfile.isfile():
717 if not batchfile.isfile():
719 print "No such batch file:", batchfile
718 print "No such batch file:", batchfile
720 continue
719 continue
721 self.api.runlines(batchfile.text())
720 self.api.runlines(batchfile.text())
722 batchrun = True
721 batchrun = True
723 if batchrun:
722 if batchrun:
724 self.exit_now = True
723 self.exit_now = True
725
724
726 def add_builtins(self):
725 def add_builtins(self):
727 """Store ipython references into the builtin namespace.
726 """Store ipython references into the builtin namespace.
728
727
729 Some parts of ipython operate via builtins injected here, which hold a
728 Some parts of ipython operate via builtins injected here, which hold a
730 reference to IPython itself."""
729 reference to IPython itself."""
731
730
732 # TODO: deprecate all except _ip; 'jobs' should be installed
731 # TODO: deprecate all except _ip; 'jobs' should be installed
733 # by an extension and the rest are under _ip, ipalias is redundant
732 # by an extension and the rest are under _ip, ipalias is redundant
734 builtins_new = dict(__IPYTHON__ = self,
733 builtins_new = dict(__IPYTHON__ = self,
735 ip_set_hook = self.set_hook,
734 ip_set_hook = self.set_hook,
736 jobs = self.jobs,
735 jobs = self.jobs,
737 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
736 ipmagic = wrap_deprecated(self.ipmagic,'_ip.magic()'),
738 ipalias = wrap_deprecated(self.ipalias),
737 ipalias = wrap_deprecated(self.ipalias),
739 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
738 ipsystem = wrap_deprecated(self.ipsystem,'_ip.system()'),
740 _ip = self.api
739 _ip = self.api
741 )
740 )
742 for biname,bival in builtins_new.items():
741 for biname,bival in builtins_new.items():
743 try:
742 try:
744 # store the orignal value so we can restore it
743 # store the orignal value so we can restore it
745 self.builtins_added[biname] = __builtin__.__dict__[biname]
744 self.builtins_added[biname] = __builtin__.__dict__[biname]
746 except KeyError:
745 except KeyError:
747 # or mark that it wasn't defined, and we'll just delete it at
746 # or mark that it wasn't defined, and we'll just delete it at
748 # cleanup
747 # cleanup
749 self.builtins_added[biname] = Undefined
748 self.builtins_added[biname] = Undefined
750 __builtin__.__dict__[biname] = bival
749 __builtin__.__dict__[biname] = bival
751
750
752 # Keep in the builtins a flag for when IPython is active. We set it
751 # Keep in the builtins a flag for when IPython is active. We set it
753 # with setdefault so that multiple nested IPythons don't clobber one
752 # with setdefault so that multiple nested IPythons don't clobber one
754 # another. Each will increase its value by one upon being activated,
753 # another. Each will increase its value by one upon being activated,
755 # which also gives us a way to determine the nesting level.
754 # which also gives us a way to determine the nesting level.
756 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
755 __builtin__.__dict__.setdefault('__IPYTHON__active',0)
757
756
758 def clean_builtins(self):
757 def clean_builtins(self):
759 """Remove any builtins which might have been added by add_builtins, or
758 """Remove any builtins which might have been added by add_builtins, or
760 restore overwritten ones to their previous values."""
759 restore overwritten ones to their previous values."""
761 for biname,bival in self.builtins_added.items():
760 for biname,bival in self.builtins_added.items():
762 if bival is Undefined:
761 if bival is Undefined:
763 del __builtin__.__dict__[biname]
762 del __builtin__.__dict__[biname]
764 else:
763 else:
765 __builtin__.__dict__[biname] = bival
764 __builtin__.__dict__[biname] = bival
766 self.builtins_added.clear()
765 self.builtins_added.clear()
767
766
768 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
767 def set_hook(self,name,hook, priority = 50, str_key = None, re_key = None):
769 """set_hook(name,hook) -> sets an internal IPython hook.
768 """set_hook(name,hook) -> sets an internal IPython hook.
770
769
771 IPython exposes some of its internal API as user-modifiable hooks. By
770 IPython exposes some of its internal API as user-modifiable hooks. By
772 adding your function to one of these hooks, you can modify IPython's
771 adding your function to one of these hooks, you can modify IPython's
773 behavior to call at runtime your own routines."""
772 behavior to call at runtime your own routines."""
774
773
775 # At some point in the future, this should validate the hook before it
774 # At some point in the future, this should validate the hook before it
776 # accepts it. Probably at least check that the hook takes the number
775 # accepts it. Probably at least check that the hook takes the number
777 # of args it's supposed to.
776 # of args it's supposed to.
778
777
779 f = new.instancemethod(hook,self,self.__class__)
778 f = new.instancemethod(hook,self,self.__class__)
780
779
781 # check if the hook is for strdispatcher first
780 # check if the hook is for strdispatcher first
782 if str_key is not None:
781 if str_key is not None:
783 sdp = self.strdispatchers.get(name, StrDispatch())
782 sdp = self.strdispatchers.get(name, StrDispatch())
784 sdp.add_s(str_key, f, priority )
783 sdp.add_s(str_key, f, priority )
785 self.strdispatchers[name] = sdp
784 self.strdispatchers[name] = sdp
786 return
785 return
787 if re_key is not None:
786 if re_key is not None:
788 sdp = self.strdispatchers.get(name, StrDispatch())
787 sdp = self.strdispatchers.get(name, StrDispatch())
789 sdp.add_re(re.compile(re_key), f, priority )
788 sdp.add_re(re.compile(re_key), f, priority )
790 self.strdispatchers[name] = sdp
789 self.strdispatchers[name] = sdp
791 return
790 return
792
791
793 dp = getattr(self.hooks, name, None)
792 dp = getattr(self.hooks, name, None)
794 if name not in IPython.hooks.__all__:
793 if name not in IPython.hooks.__all__:
795 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
794 print "Warning! Hook '%s' is not one of %s" % (name, IPython.hooks.__all__ )
796 if not dp:
795 if not dp:
797 dp = IPython.hooks.CommandChainDispatcher()
796 dp = IPython.hooks.CommandChainDispatcher()
798
797
799 try:
798 try:
800 dp.add(f,priority)
799 dp.add(f,priority)
801 except AttributeError:
800 except AttributeError:
802 # it was not commandchain, plain old func - replace
801 # it was not commandchain, plain old func - replace
803 dp = f
802 dp = f
804
803
805 setattr(self.hooks,name, dp)
804 setattr(self.hooks,name, dp)
806
805
807
806
808 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
807 #setattr(self.hooks,name,new.instancemethod(hook,self,self.__class__))
809
808
810 def set_crash_handler(self,crashHandler):
809 def set_crash_handler(self,crashHandler):
811 """Set the IPython crash handler.
810 """Set the IPython crash handler.
812
811
813 This must be a callable with a signature suitable for use as
812 This must be a callable with a signature suitable for use as
814 sys.excepthook."""
813 sys.excepthook."""
815
814
816 # Install the given crash handler as the Python exception hook
815 # Install the given crash handler as the Python exception hook
817 sys.excepthook = crashHandler
816 sys.excepthook = crashHandler
818
817
819 # The instance will store a pointer to this, so that runtime code
818 # The instance will store a pointer to this, so that runtime code
820 # (such as magics) can access it. This is because during the
819 # (such as magics) can access it. This is because during the
821 # read-eval loop, it gets temporarily overwritten (to deal with GUI
820 # read-eval loop, it gets temporarily overwritten (to deal with GUI
822 # frameworks).
821 # frameworks).
823 self.sys_excepthook = sys.excepthook
822 self.sys_excepthook = sys.excepthook
824
823
825
824
826 def set_custom_exc(self,exc_tuple,handler):
825 def set_custom_exc(self,exc_tuple,handler):
827 """set_custom_exc(exc_tuple,handler)
826 """set_custom_exc(exc_tuple,handler)
828
827
829 Set a custom exception handler, which will be called if any of the
828 Set a custom exception handler, which will be called if any of the
830 exceptions in exc_tuple occur in the mainloop (specifically, in the
829 exceptions in exc_tuple occur in the mainloop (specifically, in the
831 runcode() method.
830 runcode() method.
832
831
833 Inputs:
832 Inputs:
834
833
835 - exc_tuple: a *tuple* of valid exceptions to call the defined
834 - exc_tuple: a *tuple* of valid exceptions to call the defined
836 handler for. It is very important that you use a tuple, and NOT A
835 handler for. It is very important that you use a tuple, and NOT A
837 LIST here, because of the way Python's except statement works. If
836 LIST here, because of the way Python's except statement works. If
838 you only want to trap a single exception, use a singleton tuple:
837 you only want to trap a single exception, use a singleton tuple:
839
838
840 exc_tuple == (MyCustomException,)
839 exc_tuple == (MyCustomException,)
841
840
842 - handler: this must be defined as a function with the following
841 - handler: this must be defined as a function with the following
843 basic interface: def my_handler(self,etype,value,tb).
842 basic interface: def my_handler(self,etype,value,tb).
844
843
845 This will be made into an instance method (via new.instancemethod)
844 This will be made into an instance method (via new.instancemethod)
846 of IPython itself, and it will be called if any of the exceptions
845 of IPython itself, and it will be called if any of the exceptions
847 listed in the exc_tuple are caught. If the handler is None, an
846 listed in the exc_tuple are caught. If the handler is None, an
848 internal basic one is used, which just prints basic info.
847 internal basic one is used, which just prints basic info.
849
848
850 WARNING: by putting in your own exception handler into IPython's main
849 WARNING: by putting in your own exception handler into IPython's main
851 execution loop, you run a very good chance of nasty crashes. This
850 execution loop, you run a very good chance of nasty crashes. This
852 facility should only be used if you really know what you are doing."""
851 facility should only be used if you really know what you are doing."""
853
852
854 assert type(exc_tuple)==type(()) , \
853 assert type(exc_tuple)==type(()) , \
855 "The custom exceptions must be given AS A TUPLE."
854 "The custom exceptions must be given AS A TUPLE."
856
855
857 def dummy_handler(self,etype,value,tb):
856 def dummy_handler(self,etype,value,tb):
858 print '*** Simple custom exception handler ***'
857 print '*** Simple custom exception handler ***'
859 print 'Exception type :',etype
858 print 'Exception type :',etype
860 print 'Exception value:',value
859 print 'Exception value:',value
861 print 'Traceback :',tb
860 print 'Traceback :',tb
862 print 'Source code :','\n'.join(self.buffer)
861 print 'Source code :','\n'.join(self.buffer)
863
862
864 if handler is None: handler = dummy_handler
863 if handler is None: handler = dummy_handler
865
864
866 self.CustomTB = new.instancemethod(handler,self,self.__class__)
865 self.CustomTB = new.instancemethod(handler,self,self.__class__)
867 self.custom_exceptions = exc_tuple
866 self.custom_exceptions = exc_tuple
868
867
869 def set_custom_completer(self,completer,pos=0):
868 def set_custom_completer(self,completer,pos=0):
870 """set_custom_completer(completer,pos=0)
869 """set_custom_completer(completer,pos=0)
871
870
872 Adds a new custom completer function.
871 Adds a new custom completer function.
873
872
874 The position argument (defaults to 0) is the index in the completers
873 The position argument (defaults to 0) is the index in the completers
875 list where you want the completer to be inserted."""
874 list where you want the completer to be inserted."""
876
875
877 newcomp = new.instancemethod(completer,self.Completer,
876 newcomp = new.instancemethod(completer,self.Completer,
878 self.Completer.__class__)
877 self.Completer.__class__)
879 self.Completer.matchers.insert(pos,newcomp)
878 self.Completer.matchers.insert(pos,newcomp)
880
879
881 def _get_call_pdb(self):
880 def _get_call_pdb(self):
882 return self._call_pdb
881 return self._call_pdb
883
882
884 def _set_call_pdb(self,val):
883 def _set_call_pdb(self,val):
885
884
886 if val not in (0,1,False,True):
885 if val not in (0,1,False,True):
887 raise ValueError,'new call_pdb value must be boolean'
886 raise ValueError,'new call_pdb value must be boolean'
888
887
889 # store value in instance
888 # store value in instance
890 self._call_pdb = val
889 self._call_pdb = val
891
890
892 # notify the actual exception handlers
891 # notify the actual exception handlers
893 self.InteractiveTB.call_pdb = val
892 self.InteractiveTB.call_pdb = val
894 if self.isthreaded:
893 if self.isthreaded:
895 try:
894 try:
896 self.sys_excepthook.call_pdb = val
895 self.sys_excepthook.call_pdb = val
897 except:
896 except:
898 warn('Failed to activate pdb for threaded exception handler')
897 warn('Failed to activate pdb for threaded exception handler')
899
898
900 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
899 call_pdb = property(_get_call_pdb,_set_call_pdb,None,
901 'Control auto-activation of pdb at exceptions')
900 'Control auto-activation of pdb at exceptions')
902
901
903
902
904 # These special functions get installed in the builtin namespace, to
903 # These special functions get installed in the builtin namespace, to
905 # provide programmatic (pure python) access to magics, aliases and system
904 # provide programmatic (pure python) access to magics, aliases and system
906 # calls. This is important for logging, user scripting, and more.
905 # calls. This is important for logging, user scripting, and more.
907
906
908 # We are basically exposing, via normal python functions, the three
907 # We are basically exposing, via normal python functions, the three
909 # mechanisms in which ipython offers special call modes (magics for
908 # mechanisms in which ipython offers special call modes (magics for
910 # internal control, aliases for direct system access via pre-selected
909 # internal control, aliases for direct system access via pre-selected
911 # names, and !cmd for calling arbitrary system commands).
910 # names, and !cmd for calling arbitrary system commands).
912
911
913 def ipmagic(self,arg_s):
912 def ipmagic(self,arg_s):
914 """Call a magic function by name.
913 """Call a magic function by name.
915
914
916 Input: a string containing the name of the magic function to call and any
915 Input: a string containing the name of the magic function to call and any
917 additional arguments to be passed to the magic.
916 additional arguments to be passed to the magic.
918
917
919 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
918 ipmagic('name -opt foo bar') is equivalent to typing at the ipython
920 prompt:
919 prompt:
921
920
922 In[1]: %name -opt foo bar
921 In[1]: %name -opt foo bar
923
922
924 To call a magic without arguments, simply use ipmagic('name').
923 To call a magic without arguments, simply use ipmagic('name').
925
924
926 This provides a proper Python function to call IPython's magics in any
925 This provides a proper Python function to call IPython's magics in any
927 valid Python code you can type at the interpreter, including loops and
926 valid Python code you can type at the interpreter, including loops and
928 compound statements. It is added by IPython to the Python builtin
927 compound statements. It is added by IPython to the Python builtin
929 namespace upon initialization."""
928 namespace upon initialization."""
930
929
931 args = arg_s.split(' ',1)
930 args = arg_s.split(' ',1)
932 magic_name = args[0]
931 magic_name = args[0]
933 magic_name = magic_name.lstrip(self.ESC_MAGIC)
932 magic_name = magic_name.lstrip(self.ESC_MAGIC)
934
933
935 try:
934 try:
936 magic_args = args[1]
935 magic_args = args[1]
937 except IndexError:
936 except IndexError:
938 magic_args = ''
937 magic_args = ''
939 fn = getattr(self,'magic_'+magic_name,None)
938 fn = getattr(self,'magic_'+magic_name,None)
940 if fn is None:
939 if fn is None:
941 error("Magic function `%s` not found." % magic_name)
940 error("Magic function `%s` not found." % magic_name)
942 else:
941 else:
943 magic_args = self.var_expand(magic_args,1)
942 magic_args = self.var_expand(magic_args,1)
944 return fn(magic_args)
943 return fn(magic_args)
945
944
946 def ipalias(self,arg_s):
945 def ipalias(self,arg_s):
947 """Call an alias by name.
946 """Call an alias by name.
948
947
949 Input: a string containing the name of the alias to call and any
948 Input: a string containing the name of the alias to call and any
950 additional arguments to be passed to the magic.
949 additional arguments to be passed to the magic.
951
950
952 ipalias('name -opt foo bar') is equivalent to typing at the ipython
951 ipalias('name -opt foo bar') is equivalent to typing at the ipython
953 prompt:
952 prompt:
954
953
955 In[1]: name -opt foo bar
954 In[1]: name -opt foo bar
956
955
957 To call an alias without arguments, simply use ipalias('name').
956 To call an alias without arguments, simply use ipalias('name').
958
957
959 This provides a proper Python function to call IPython's aliases in any
958 This provides a proper Python function to call IPython's aliases in any
960 valid Python code you can type at the interpreter, including loops and
959 valid Python code you can type at the interpreter, including loops and
961 compound statements. It is added by IPython to the Python builtin
960 compound statements. It is added by IPython to the Python builtin
962 namespace upon initialization."""
961 namespace upon initialization."""
963
962
964 args = arg_s.split(' ',1)
963 args = arg_s.split(' ',1)
965 alias_name = args[0]
964 alias_name = args[0]
966 try:
965 try:
967 alias_args = args[1]
966 alias_args = args[1]
968 except IndexError:
967 except IndexError:
969 alias_args = ''
968 alias_args = ''
970 if alias_name in self.alias_table:
969 if alias_name in self.alias_table:
971 self.call_alias(alias_name,alias_args)
970 self.call_alias(alias_name,alias_args)
972 else:
971 else:
973 error("Alias `%s` not found." % alias_name)
972 error("Alias `%s` not found." % alias_name)
974
973
975 def ipsystem(self,arg_s):
974 def ipsystem(self,arg_s):
976 """Make a system call, using IPython."""
975 """Make a system call, using IPython."""
977
976
978 self.system(arg_s)
977 self.system(arg_s)
979
978
980 def complete(self,text):
979 def complete(self,text):
981 """Return a sorted list of all possible completions on text.
980 """Return a sorted list of all possible completions on text.
982
981
983 Inputs:
982 Inputs:
984
983
985 - text: a string of text to be completed on.
984 - text: a string of text to be completed on.
986
985
987 This is a wrapper around the completion mechanism, similar to what
986 This is a wrapper around the completion mechanism, similar to what
988 readline does at the command line when the TAB key is hit. By
987 readline does at the command line when the TAB key is hit. By
989 exposing it as a method, it can be used by other non-readline
988 exposing it as a method, it can be used by other non-readline
990 environments (such as GUIs) for text completion.
989 environments (such as GUIs) for text completion.
991
990
992 Simple usage example:
991 Simple usage example:
993
992
994 In [1]: x = 'hello'
993 In [1]: x = 'hello'
995
994
996 In [2]: __IP.complete('x.l')
995 In [2]: __IP.complete('x.l')
997 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
996 Out[2]: ['x.ljust', 'x.lower', 'x.lstrip']"""
998
997
999 complete = self.Completer.complete
998 complete = self.Completer.complete
1000 state = 0
999 state = 0
1001 # use a dict so we get unique keys, since ipyhton's multiple
1000 # use a dict so we get unique keys, since ipyhton's multiple
1002 # completers can return duplicates.
1001 # completers can return duplicates.
1003 comps = {}
1002 comps = {}
1004 while True:
1003 while True:
1005 newcomp = complete(text,state)
1004 newcomp = complete(text,state)
1006 if newcomp is None:
1005 if newcomp is None:
1007 break
1006 break
1008 comps[newcomp] = 1
1007 comps[newcomp] = 1
1009 state += 1
1008 state += 1
1010 outcomps = comps.keys()
1009 outcomps = comps.keys()
1011 outcomps.sort()
1010 outcomps.sort()
1012 return outcomps
1011 return outcomps
1013
1012
1014 def set_completer_frame(self, frame=None):
1013 def set_completer_frame(self, frame=None):
1015 if frame:
1014 if frame:
1016 self.Completer.namespace = frame.f_locals
1015 self.Completer.namespace = frame.f_locals
1017 self.Completer.global_namespace = frame.f_globals
1016 self.Completer.global_namespace = frame.f_globals
1018 else:
1017 else:
1019 self.Completer.namespace = self.user_ns
1018 self.Completer.namespace = self.user_ns
1020 self.Completer.global_namespace = self.user_global_ns
1019 self.Completer.global_namespace = self.user_global_ns
1021
1020
1022 def init_auto_alias(self):
1021 def init_auto_alias(self):
1023 """Define some aliases automatically.
1022 """Define some aliases automatically.
1024
1023
1025 These are ALL parameter-less aliases"""
1024 These are ALL parameter-less aliases"""
1026
1025
1027 for alias,cmd in self.auto_alias:
1026 for alias,cmd in self.auto_alias:
1028 self.alias_table[alias] = (0,cmd)
1027 self.alias_table[alias] = (0,cmd)
1029
1028
1030 def alias_table_validate(self,verbose=0):
1029 def alias_table_validate(self,verbose=0):
1031 """Update information about the alias table.
1030 """Update information about the alias table.
1032
1031
1033 In particular, make sure no Python keywords/builtins are in it."""
1032 In particular, make sure no Python keywords/builtins are in it."""
1034
1033
1035 no_alias = self.no_alias
1034 no_alias = self.no_alias
1036 for k in self.alias_table.keys():
1035 for k in self.alias_table.keys():
1037 if k in no_alias:
1036 if k in no_alias:
1038 del self.alias_table[k]
1037 del self.alias_table[k]
1039 if verbose:
1038 if verbose:
1040 print ("Deleting alias <%s>, it's a Python "
1039 print ("Deleting alias <%s>, it's a Python "
1041 "keyword or builtin." % k)
1040 "keyword or builtin." % k)
1042
1041
1043 def set_autoindent(self,value=None):
1042 def set_autoindent(self,value=None):
1044 """Set the autoindent flag, checking for readline support.
1043 """Set the autoindent flag, checking for readline support.
1045
1044
1046 If called with no arguments, it acts as a toggle."""
1045 If called with no arguments, it acts as a toggle."""
1047
1046
1048 if not self.has_readline:
1047 if not self.has_readline:
1049 if os.name == 'posix':
1048 if os.name == 'posix':
1050 warn("The auto-indent feature requires the readline library")
1049 warn("The auto-indent feature requires the readline library")
1051 self.autoindent = 0
1050 self.autoindent = 0
1052 return
1051 return
1053 if value is None:
1052 if value is None:
1054 self.autoindent = not self.autoindent
1053 self.autoindent = not self.autoindent
1055 else:
1054 else:
1056 self.autoindent = value
1055 self.autoindent = value
1057
1056
1058 def rc_set_toggle(self,rc_field,value=None):
1057 def rc_set_toggle(self,rc_field,value=None):
1059 """Set or toggle a field in IPython's rc config. structure.
1058 """Set or toggle a field in IPython's rc config. structure.
1060
1059
1061 If called with no arguments, it acts as a toggle.
1060 If called with no arguments, it acts as a toggle.
1062
1061
1063 If called with a non-existent field, the resulting AttributeError
1062 If called with a non-existent field, the resulting AttributeError
1064 exception will propagate out."""
1063 exception will propagate out."""
1065
1064
1066 rc_val = getattr(self.rc,rc_field)
1065 rc_val = getattr(self.rc,rc_field)
1067 if value is None:
1066 if value is None:
1068 value = not rc_val
1067 value = not rc_val
1069 setattr(self.rc,rc_field,value)
1068 setattr(self.rc,rc_field,value)
1070
1069
1071 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1070 def user_setup(self,ipythondir,rc_suffix,mode='install'):
1072 """Install the user configuration directory.
1071 """Install the user configuration directory.
1073
1072
1074 Can be called when running for the first time or to upgrade the user's
1073 Can be called when running for the first time or to upgrade the user's
1075 .ipython/ directory with the mode parameter. Valid modes are 'install'
1074 .ipython/ directory with the mode parameter. Valid modes are 'install'
1076 and 'upgrade'."""
1075 and 'upgrade'."""
1077
1076
1078 def wait():
1077 def wait():
1079 try:
1078 try:
1080 raw_input("Please press <RETURN> to start IPython.")
1079 raw_input("Please press <RETURN> to start IPython.")
1081 except EOFError:
1080 except EOFError:
1082 print >> Term.cout
1081 print >> Term.cout
1083 print '*'*70
1082 print '*'*70
1084
1083
1085 cwd = os.getcwd() # remember where we started
1084 cwd = os.getcwd() # remember where we started
1086 glb = glob.glob
1085 glb = glob.glob
1087 print '*'*70
1086 print '*'*70
1088 if mode == 'install':
1087 if mode == 'install':
1089 print \
1088 print \
1090 """Welcome to IPython. I will try to create a personal configuration directory
1089 """Welcome to IPython. I will try to create a personal configuration directory
1091 where you can customize many aspects of IPython's functionality in:\n"""
1090 where you can customize many aspects of IPython's functionality in:\n"""
1092 else:
1091 else:
1093 print 'I am going to upgrade your configuration in:'
1092 print 'I am going to upgrade your configuration in:'
1094
1093
1095 print ipythondir
1094 print ipythondir
1096
1095
1097 rcdirend = os.path.join('IPython','UserConfig')
1096 rcdirend = os.path.join('IPython','UserConfig')
1098 cfg = lambda d: os.path.join(d,rcdirend)
1097 cfg = lambda d: os.path.join(d,rcdirend)
1099 try:
1098 try:
1100 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1099 rcdir = filter(os.path.isdir,map(cfg,sys.path))[0]
1101 except IOError:
1100 except IOError:
1102 warning = """
1101 warning = """
1103 Installation error. IPython's directory was not found.
1102 Installation error. IPython's directory was not found.
1104
1103
1105 Check the following:
1104 Check the following:
1106
1105
1107 The ipython/IPython directory should be in a directory belonging to your
1106 The ipython/IPython directory should be in a directory belonging to your
1108 PYTHONPATH environment variable (that is, it should be in a directory
1107 PYTHONPATH environment variable (that is, it should be in a directory
1109 belonging to sys.path). You can copy it explicitly there or just link to it.
1108 belonging to sys.path). You can copy it explicitly there or just link to it.
1110
1109
1111 IPython will proceed with builtin defaults.
1110 IPython will proceed with builtin defaults.
1112 """
1111 """
1113 warn(warning)
1112 warn(warning)
1114 wait()
1113 wait()
1115 return
1114 return
1116
1115
1117 if mode == 'install':
1116 if mode == 'install':
1118 try:
1117 try:
1119 shutil.copytree(rcdir,ipythondir)
1118 shutil.copytree(rcdir,ipythondir)
1120 os.chdir(ipythondir)
1119 os.chdir(ipythondir)
1121 rc_files = glb("ipythonrc*")
1120 rc_files = glb("ipythonrc*")
1122 for rc_file in rc_files:
1121 for rc_file in rc_files:
1123 os.rename(rc_file,rc_file+rc_suffix)
1122 os.rename(rc_file,rc_file+rc_suffix)
1124 except:
1123 except:
1125 warning = """
1124 warning = """
1126
1125
1127 There was a problem with the installation:
1126 There was a problem with the installation:
1128 %s
1127 %s
1129 Try to correct it or contact the developers if you think it's a bug.
1128 Try to correct it or contact the developers if you think it's a bug.
1130 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1129 IPython will proceed with builtin defaults.""" % sys.exc_info()[1]
1131 warn(warning)
1130 warn(warning)
1132 wait()
1131 wait()
1133 return
1132 return
1134
1133
1135 elif mode == 'upgrade':
1134 elif mode == 'upgrade':
1136 try:
1135 try:
1137 os.chdir(ipythondir)
1136 os.chdir(ipythondir)
1138 except:
1137 except:
1139 print """
1138 print """
1140 Can not upgrade: changing to directory %s failed. Details:
1139 Can not upgrade: changing to directory %s failed. Details:
1141 %s
1140 %s
1142 """ % (ipythondir,sys.exc_info()[1])
1141 """ % (ipythondir,sys.exc_info()[1])
1143 wait()
1142 wait()
1144 return
1143 return
1145 else:
1144 else:
1146 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1145 sources = glb(os.path.join(rcdir,'[A-Za-z]*'))
1147 for new_full_path in sources:
1146 for new_full_path in sources:
1148 new_filename = os.path.basename(new_full_path)
1147 new_filename = os.path.basename(new_full_path)
1149 if new_filename.startswith('ipythonrc'):
1148 if new_filename.startswith('ipythonrc'):
1150 new_filename = new_filename + rc_suffix
1149 new_filename = new_filename + rc_suffix
1151 # The config directory should only contain files, skip any
1150 # The config directory should only contain files, skip any
1152 # directories which may be there (like CVS)
1151 # directories which may be there (like CVS)
1153 if os.path.isdir(new_full_path):
1152 if os.path.isdir(new_full_path):
1154 continue
1153 continue
1155 if os.path.exists(new_filename):
1154 if os.path.exists(new_filename):
1156 old_file = new_filename+'.old'
1155 old_file = new_filename+'.old'
1157 if os.path.exists(old_file):
1156 if os.path.exists(old_file):
1158 os.remove(old_file)
1157 os.remove(old_file)
1159 os.rename(new_filename,old_file)
1158 os.rename(new_filename,old_file)
1160 shutil.copy(new_full_path,new_filename)
1159 shutil.copy(new_full_path,new_filename)
1161 else:
1160 else:
1162 raise ValueError,'unrecognized mode for install:',`mode`
1161 raise ValueError,'unrecognized mode for install:',`mode`
1163
1162
1164 # Fix line-endings to those native to each platform in the config
1163 # Fix line-endings to those native to each platform in the config
1165 # directory.
1164 # directory.
1166 try:
1165 try:
1167 os.chdir(ipythondir)
1166 os.chdir(ipythondir)
1168 except:
1167 except:
1169 print """
1168 print """
1170 Problem: changing to directory %s failed.
1169 Problem: changing to directory %s failed.
1171 Details:
1170 Details:
1172 %s
1171 %s
1173
1172
1174 Some configuration files may have incorrect line endings. This should not
1173 Some configuration files may have incorrect line endings. This should not
1175 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1174 cause any problems during execution. """ % (ipythondir,sys.exc_info()[1])
1176 wait()
1175 wait()
1177 else:
1176 else:
1178 for fname in glb('ipythonrc*'):
1177 for fname in glb('ipythonrc*'):
1179 try:
1178 try:
1180 native_line_ends(fname,backup=0)
1179 native_line_ends(fname,backup=0)
1181 except IOError:
1180 except IOError:
1182 pass
1181 pass
1183
1182
1184 if mode == 'install':
1183 if mode == 'install':
1185 print """
1184 print """
1186 Successful installation!
1185 Successful installation!
1187
1186
1188 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1187 Please read the sections 'Initial Configuration' and 'Quick Tips' in the
1189 IPython manual (there are both HTML and PDF versions supplied with the
1188 IPython manual (there are both HTML and PDF versions supplied with the
1190 distribution) to make sure that your system environment is properly configured
1189 distribution) to make sure that your system environment is properly configured
1191 to take advantage of IPython's features.
1190 to take advantage of IPython's features.
1192
1191
1193 Important note: the configuration system has changed! The old system is
1192 Important note: the configuration system has changed! The old system is
1194 still in place, but its setting may be partly overridden by the settings in
1193 still in place, but its setting may be partly overridden by the settings in
1195 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1194 "~/.ipython/ipy_user_conf.py" config file. Please take a look at the file
1196 if some of the new settings bother you.
1195 if some of the new settings bother you.
1197
1196
1198 """
1197 """
1199 else:
1198 else:
1200 print """
1199 print """
1201 Successful upgrade!
1200 Successful upgrade!
1202
1201
1203 All files in your directory:
1202 All files in your directory:
1204 %(ipythondir)s
1203 %(ipythondir)s
1205 which would have been overwritten by the upgrade were backed up with a .old
1204 which would have been overwritten by the upgrade were backed up with a .old
1206 extension. If you had made particular customizations in those files you may
1205 extension. If you had made particular customizations in those files you may
1207 want to merge them back into the new files.""" % locals()
1206 want to merge them back into the new files.""" % locals()
1208 wait()
1207 wait()
1209 os.chdir(cwd)
1208 os.chdir(cwd)
1210 # end user_setup()
1209 # end user_setup()
1211
1210
1212 def atexit_operations(self):
1211 def atexit_operations(self):
1213 """This will be executed at the time of exit.
1212 """This will be executed at the time of exit.
1214
1213
1215 Saving of persistent data should be performed here. """
1214 Saving of persistent data should be performed here. """
1216
1215
1217 #print '*** IPython exit cleanup ***' # dbg
1216 #print '*** IPython exit cleanup ***' # dbg
1218 # input history
1217 # input history
1219 self.savehist()
1218 self.savehist()
1220
1219
1221 # Cleanup all tempfiles left around
1220 # Cleanup all tempfiles left around
1222 for tfile in self.tempfiles:
1221 for tfile in self.tempfiles:
1223 try:
1222 try:
1224 os.unlink(tfile)
1223 os.unlink(tfile)
1225 except OSError:
1224 except OSError:
1226 pass
1225 pass
1227
1226
1228 # save the "persistent data" catch-all dictionary
1227 # save the "persistent data" catch-all dictionary
1229 self.hooks.shutdown_hook()
1228 self.hooks.shutdown_hook()
1230
1229
1231 def savehist(self):
1230 def savehist(self):
1232 """Save input history to a file (via readline library)."""
1231 """Save input history to a file (via readline library)."""
1233 try:
1232 try:
1234 self.readline.write_history_file(self.histfile)
1233 self.readline.write_history_file(self.histfile)
1235 except:
1234 except:
1236 print 'Unable to save IPython command history to file: ' + \
1235 print 'Unable to save IPython command history to file: ' + \
1237 `self.histfile`
1236 `self.histfile`
1238
1237
1239 def history_saving_wrapper(self, func):
1238 def history_saving_wrapper(self, func):
1240 """ Wrap func for readline history saving
1239 """ Wrap func for readline history saving
1241
1240
1242 Convert func into callable that saves & restores
1241 Convert func into callable that saves & restores
1243 history around the call """
1242 history around the call """
1244
1243
1245 if not self.has_readline:
1244 if not self.has_readline:
1246 return func
1245 return func
1247
1246
1248 def wrapper():
1247 def wrapper():
1249 self.savehist()
1248 self.savehist()
1250 try:
1249 try:
1251 func()
1250 func()
1252 finally:
1251 finally:
1253 readline.read_history_file(self.histfile)
1252 readline.read_history_file(self.histfile)
1254 return wrapper
1253 return wrapper
1255
1254
1256
1255
1257 def pre_readline(self):
1256 def pre_readline(self):
1258 """readline hook to be used at the start of each line.
1257 """readline hook to be used at the start of each line.
1259
1258
1260 Currently it handles auto-indent only."""
1259 Currently it handles auto-indent only."""
1261
1260
1262 #debugx('self.indent_current_nsp','pre_readline:')
1261 #debugx('self.indent_current_nsp','pre_readline:')
1263 self.readline.insert_text(self.indent_current_str())
1262 self.readline.insert_text(self.indent_current_str())
1264
1263
1265 def init_readline(self):
1264 def init_readline(self):
1266 """Command history completion/saving/reloading."""
1265 """Command history completion/saving/reloading."""
1267
1266
1268 import IPython.rlineimpl as readline
1267 import IPython.rlineimpl as readline
1269 if not readline.have_readline:
1268 if not readline.have_readline:
1270 self.has_readline = 0
1269 self.has_readline = 0
1271 self.readline = None
1270 self.readline = None
1272 # no point in bugging windows users with this every time:
1271 # no point in bugging windows users with this every time:
1273 warn('Readline services not available on this platform.')
1272 warn('Readline services not available on this platform.')
1274 else:
1273 else:
1275 sys.modules['readline'] = readline
1274 sys.modules['readline'] = readline
1276 import atexit
1275 import atexit
1277 from IPython.completer import IPCompleter
1276 from IPython.completer import IPCompleter
1278 self.Completer = IPCompleter(self,
1277 self.Completer = IPCompleter(self,
1279 self.user_ns,
1278 self.user_ns,
1280 self.user_global_ns,
1279 self.user_global_ns,
1281 self.rc.readline_omit__names,
1280 self.rc.readline_omit__names,
1282 self.alias_table)
1281 self.alias_table)
1283 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1282 sdisp = self.strdispatchers.get('complete_command', StrDispatch())
1284 self.strdispatchers['complete_command'] = sdisp
1283 self.strdispatchers['complete_command'] = sdisp
1285 self.Completer.custom_completers = sdisp
1284 self.Completer.custom_completers = sdisp
1286 # Platform-specific configuration
1285 # Platform-specific configuration
1287 if os.name == 'nt':
1286 if os.name == 'nt':
1288 self.readline_startup_hook = readline.set_pre_input_hook
1287 self.readline_startup_hook = readline.set_pre_input_hook
1289 else:
1288 else:
1290 self.readline_startup_hook = readline.set_startup_hook
1289 self.readline_startup_hook = readline.set_startup_hook
1291
1290
1292 # Load user's initrc file (readline config)
1291 # Load user's initrc file (readline config)
1293 inputrc_name = os.environ.get('INPUTRC')
1292 inputrc_name = os.environ.get('INPUTRC')
1294 if inputrc_name is None:
1293 if inputrc_name is None:
1295 home_dir = get_home_dir()
1294 home_dir = get_home_dir()
1296 if home_dir is not None:
1295 if home_dir is not None:
1297 inputrc_name = os.path.join(home_dir,'.inputrc')
1296 inputrc_name = os.path.join(home_dir,'.inputrc')
1298 if os.path.isfile(inputrc_name):
1297 if os.path.isfile(inputrc_name):
1299 try:
1298 try:
1300 readline.read_init_file(inputrc_name)
1299 readline.read_init_file(inputrc_name)
1301 except:
1300 except:
1302 warn('Problems reading readline initialization file <%s>'
1301 warn('Problems reading readline initialization file <%s>'
1303 % inputrc_name)
1302 % inputrc_name)
1304
1303
1305 self.has_readline = 1
1304 self.has_readline = 1
1306 self.readline = readline
1305 self.readline = readline
1307 # save this in sys so embedded copies can restore it properly
1306 # save this in sys so embedded copies can restore it properly
1308 sys.ipcompleter = self.Completer.complete
1307 sys.ipcompleter = self.Completer.complete
1309 readline.set_completer(self.Completer.complete)
1308 readline.set_completer(self.Completer.complete)
1310
1309
1311 # Configure readline according to user's prefs
1310 # Configure readline according to user's prefs
1312 for rlcommand in self.rc.readline_parse_and_bind:
1311 for rlcommand in self.rc.readline_parse_and_bind:
1313 readline.parse_and_bind(rlcommand)
1312 readline.parse_and_bind(rlcommand)
1314
1313
1315 # remove some chars from the delimiters list
1314 # remove some chars from the delimiters list
1316 delims = readline.get_completer_delims()
1315 delims = readline.get_completer_delims()
1317 delims = delims.translate(string._idmap,
1316 delims = delims.translate(string._idmap,
1318 self.rc.readline_remove_delims)
1317 self.rc.readline_remove_delims)
1319 readline.set_completer_delims(delims)
1318 readline.set_completer_delims(delims)
1320 # otherwise we end up with a monster history after a while:
1319 # otherwise we end up with a monster history after a while:
1321 readline.set_history_length(1000)
1320 readline.set_history_length(1000)
1322 try:
1321 try:
1323 #print '*** Reading readline history' # dbg
1322 #print '*** Reading readline history' # dbg
1324 readline.read_history_file(self.histfile)
1323 readline.read_history_file(self.histfile)
1325 except IOError:
1324 except IOError:
1326 pass # It doesn't exist yet.
1325 pass # It doesn't exist yet.
1327
1326
1328 atexit.register(self.atexit_operations)
1327 atexit.register(self.atexit_operations)
1329 del atexit
1328 del atexit
1330
1329
1331 # Configure auto-indent for all platforms
1330 # Configure auto-indent for all platforms
1332 self.set_autoindent(self.rc.autoindent)
1331 self.set_autoindent(self.rc.autoindent)
1333
1332
1334 def ask_yes_no(self,prompt,default=True):
1333 def ask_yes_no(self,prompt,default=True):
1335 if self.rc.quiet:
1334 if self.rc.quiet:
1336 return True
1335 return True
1337 return ask_yes_no(prompt,default)
1336 return ask_yes_no(prompt,default)
1338
1337
1339 def _should_recompile(self,e):
1338 def _should_recompile(self,e):
1340 """Utility routine for edit_syntax_error"""
1339 """Utility routine for edit_syntax_error"""
1341
1340
1342 if e.filename in ('<ipython console>','<input>','<string>',
1341 if e.filename in ('<ipython console>','<input>','<string>',
1343 '<console>','<BackgroundJob compilation>',
1342 '<console>','<BackgroundJob compilation>',
1344 None):
1343 None):
1345
1344
1346 return False
1345 return False
1347 try:
1346 try:
1348 if (self.rc.autoedit_syntax and
1347 if (self.rc.autoedit_syntax and
1349 not self.ask_yes_no('Return to editor to correct syntax error? '
1348 not self.ask_yes_no('Return to editor to correct syntax error? '
1350 '[Y/n] ','y')):
1349 '[Y/n] ','y')):
1351 return False
1350 return False
1352 except EOFError:
1351 except EOFError:
1353 return False
1352 return False
1354
1353
1355 def int0(x):
1354 def int0(x):
1356 try:
1355 try:
1357 return int(x)
1356 return int(x)
1358 except TypeError:
1357 except TypeError:
1359 return 0
1358 return 0
1360 # always pass integer line and offset values to editor hook
1359 # always pass integer line and offset values to editor hook
1361 self.hooks.fix_error_editor(e.filename,
1360 self.hooks.fix_error_editor(e.filename,
1362 int0(e.lineno),int0(e.offset),e.msg)
1361 int0(e.lineno),int0(e.offset),e.msg)
1363 return True
1362 return True
1364
1363
1365 def edit_syntax_error(self):
1364 def edit_syntax_error(self):
1366 """The bottom half of the syntax error handler called in the main loop.
1365 """The bottom half of the syntax error handler called in the main loop.
1367
1366
1368 Loop until syntax error is fixed or user cancels.
1367 Loop until syntax error is fixed or user cancels.
1369 """
1368 """
1370
1369
1371 while self.SyntaxTB.last_syntax_error:
1370 while self.SyntaxTB.last_syntax_error:
1372 # copy and clear last_syntax_error
1371 # copy and clear last_syntax_error
1373 err = self.SyntaxTB.clear_err_state()
1372 err = self.SyntaxTB.clear_err_state()
1374 if not self._should_recompile(err):
1373 if not self._should_recompile(err):
1375 return
1374 return
1376 try:
1375 try:
1377 # may set last_syntax_error again if a SyntaxError is raised
1376 # may set last_syntax_error again if a SyntaxError is raised
1378 self.safe_execfile(err.filename,self.user_ns)
1377 self.safe_execfile(err.filename,self.user_ns)
1379 except:
1378 except:
1380 self.showtraceback()
1379 self.showtraceback()
1381 else:
1380 else:
1382 try:
1381 try:
1383 f = file(err.filename)
1382 f = file(err.filename)
1384 try:
1383 try:
1385 sys.displayhook(f.read())
1384 sys.displayhook(f.read())
1386 finally:
1385 finally:
1387 f.close()
1386 f.close()
1388 except:
1387 except:
1389 self.showtraceback()
1388 self.showtraceback()
1390
1389
1391 def showsyntaxerror(self, filename=None):
1390 def showsyntaxerror(self, filename=None):
1392 """Display the syntax error that just occurred.
1391 """Display the syntax error that just occurred.
1393
1392
1394 This doesn't display a stack trace because there isn't one.
1393 This doesn't display a stack trace because there isn't one.
1395
1394
1396 If a filename is given, it is stuffed in the exception instead
1395 If a filename is given, it is stuffed in the exception instead
1397 of what was there before (because Python's parser always uses
1396 of what was there before (because Python's parser always uses
1398 "<string>" when reading from a string).
1397 "<string>" when reading from a string).
1399 """
1398 """
1400 etype, value, last_traceback = sys.exc_info()
1399 etype, value, last_traceback = sys.exc_info()
1401
1400
1402 # See note about these variables in showtraceback() below
1401 # See note about these variables in showtraceback() below
1403 sys.last_type = etype
1402 sys.last_type = etype
1404 sys.last_value = value
1403 sys.last_value = value
1405 sys.last_traceback = last_traceback
1404 sys.last_traceback = last_traceback
1406
1405
1407 if filename and etype is SyntaxError:
1406 if filename and etype is SyntaxError:
1408 # Work hard to stuff the correct filename in the exception
1407 # Work hard to stuff the correct filename in the exception
1409 try:
1408 try:
1410 msg, (dummy_filename, lineno, offset, line) = value
1409 msg, (dummy_filename, lineno, offset, line) = value
1411 except:
1410 except:
1412 # Not the format we expect; leave it alone
1411 # Not the format we expect; leave it alone
1413 pass
1412 pass
1414 else:
1413 else:
1415 # Stuff in the right filename
1414 # Stuff in the right filename
1416 try:
1415 try:
1417 # Assume SyntaxError is a class exception
1416 # Assume SyntaxError is a class exception
1418 value = SyntaxError(msg, (filename, lineno, offset, line))
1417 value = SyntaxError(msg, (filename, lineno, offset, line))
1419 except:
1418 except:
1420 # If that failed, assume SyntaxError is a string
1419 # If that failed, assume SyntaxError is a string
1421 value = msg, (filename, lineno, offset, line)
1420 value = msg, (filename, lineno, offset, line)
1422 self.SyntaxTB(etype,value,[])
1421 self.SyntaxTB(etype,value,[])
1423
1422
1424 def debugger(self,force=False):
1423 def debugger(self,force=False):
1425 """Call the pydb/pdb debugger.
1424 """Call the pydb/pdb debugger.
1426
1425
1427 Keywords:
1426 Keywords:
1428
1427
1429 - force(False): by default, this routine checks the instance call_pdb
1428 - force(False): by default, this routine checks the instance call_pdb
1430 flag and does not actually invoke the debugger if the flag is false.
1429 flag and does not actually invoke the debugger if the flag is false.
1431 The 'force' option forces the debugger to activate even if the flag
1430 The 'force' option forces the debugger to activate even if the flag
1432 is false.
1431 is false.
1433 """
1432 """
1434
1433
1435 if not (force or self.call_pdb):
1434 if not (force or self.call_pdb):
1436 return
1435 return
1437
1436
1438 if not hasattr(sys,'last_traceback'):
1437 if not hasattr(sys,'last_traceback'):
1439 error('No traceback has been produced, nothing to debug.')
1438 error('No traceback has been produced, nothing to debug.')
1440 return
1439 return
1441
1440
1442 have_pydb = False
1441 have_pydb = False
1443 # use pydb if available
1442 # use pydb if available
1444 try:
1443 try:
1445 from pydb import pm
1444 from pydb import pm
1446 have_pydb = True
1445 have_pydb = True
1447 except ImportError:
1446 except ImportError:
1448 pass
1447 pass
1449 if not have_pydb:
1448 if not have_pydb:
1450 # fallback to our internal debugger
1449 # fallback to our internal debugger
1451 pm = lambda : self.InteractiveTB.debugger(force=True)
1450 pm = lambda : self.InteractiveTB.debugger(force=True)
1452 self.history_saving_wrapper(pm)()
1451 self.history_saving_wrapper(pm)()
1453
1452
1454 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1453 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1455 """Display the exception that just occurred.
1454 """Display the exception that just occurred.
1456
1455
1457 If nothing is known about the exception, this is the method which
1456 If nothing is known about the exception, this is the method which
1458 should be used throughout the code for presenting user tracebacks,
1457 should be used throughout the code for presenting user tracebacks,
1459 rather than directly invoking the InteractiveTB object.
1458 rather than directly invoking the InteractiveTB object.
1460
1459
1461 A specific showsyntaxerror() also exists, but this method can take
1460 A specific showsyntaxerror() also exists, but this method can take
1462 care of calling it if needed, so unless you are explicitly catching a
1461 care of calling it if needed, so unless you are explicitly catching a
1463 SyntaxError exception, don't try to analyze the stack manually and
1462 SyntaxError exception, don't try to analyze the stack manually and
1464 simply call this method."""
1463 simply call this method."""
1465
1464
1466 # Though this won't be called by syntax errors in the input line,
1465 # Though this won't be called by syntax errors in the input line,
1467 # there may be SyntaxError cases whith imported code.
1466 # there may be SyntaxError cases whith imported code.
1468 if exc_tuple is None:
1467 if exc_tuple is None:
1469 etype, value, tb = sys.exc_info()
1468 etype, value, tb = sys.exc_info()
1470 else:
1469 else:
1471 etype, value, tb = exc_tuple
1470 etype, value, tb = exc_tuple
1472
1471
1473 if etype is SyntaxError:
1472 if etype is SyntaxError:
1474 self.showsyntaxerror(filename)
1473 self.showsyntaxerror(filename)
1475 else:
1474 else:
1476 # WARNING: these variables are somewhat deprecated and not
1475 # WARNING: these variables are somewhat deprecated and not
1477 # necessarily safe to use in a threaded environment, but tools
1476 # necessarily safe to use in a threaded environment, but tools
1478 # like pdb depend on their existence, so let's set them. If we
1477 # like pdb depend on their existence, so let's set them. If we
1479 # find problems in the field, we'll need to revisit their use.
1478 # find problems in the field, we'll need to revisit their use.
1480 sys.last_type = etype
1479 sys.last_type = etype
1481 sys.last_value = value
1480 sys.last_value = value
1482 sys.last_traceback = tb
1481 sys.last_traceback = tb
1483
1482
1484 if etype in self.custom_exceptions:
1483 if etype in self.custom_exceptions:
1485 self.CustomTB(etype,value,tb)
1484 self.CustomTB(etype,value,tb)
1486 else:
1485 else:
1487 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1486 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1488 if self.InteractiveTB.call_pdb and self.has_readline:
1487 if self.InteractiveTB.call_pdb and self.has_readline:
1489 # pdb mucks up readline, fix it back
1488 # pdb mucks up readline, fix it back
1490 self.readline.set_completer(self.Completer.complete)
1489 self.readline.set_completer(self.Completer.complete)
1491
1490
1492 def mainloop(self,banner=None):
1491 def mainloop(self,banner=None):
1493 """Creates the local namespace and starts the mainloop.
1492 """Creates the local namespace and starts the mainloop.
1494
1493
1495 If an optional banner argument is given, it will override the
1494 If an optional banner argument is given, it will override the
1496 internally created default banner."""
1495 internally created default banner."""
1497
1496
1498 if self.rc.c: # Emulate Python's -c option
1497 if self.rc.c: # Emulate Python's -c option
1499 self.exec_init_cmd()
1498 self.exec_init_cmd()
1500 if banner is None:
1499 if banner is None:
1501 if not self.rc.banner:
1500 if not self.rc.banner:
1502 banner = ''
1501 banner = ''
1503 # banner is string? Use it directly!
1502 # banner is string? Use it directly!
1504 elif isinstance(self.rc.banner,basestring):
1503 elif isinstance(self.rc.banner,basestring):
1505 banner = self.rc.banner
1504 banner = self.rc.banner
1506 else:
1505 else:
1507 banner = self.BANNER+self.banner2
1506 banner = self.BANNER+self.banner2
1508
1507
1509 self.interact(banner)
1508 self.interact(banner)
1510
1509
1511 def exec_init_cmd(self):
1510 def exec_init_cmd(self):
1512 """Execute a command given at the command line.
1511 """Execute a command given at the command line.
1513
1512
1514 This emulates Python's -c option."""
1513 This emulates Python's -c option."""
1515
1514
1516 #sys.argv = ['-c']
1515 #sys.argv = ['-c']
1517 self.push(self.rc.c)
1516 self.push(self.rc.c)
1518
1517
1519 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1518 def embed_mainloop(self,header='',local_ns=None,global_ns=None,stack_depth=0):
1520 """Embeds IPython into a running python program.
1519 """Embeds IPython into a running python program.
1521
1520
1522 Input:
1521 Input:
1523
1522
1524 - header: An optional header message can be specified.
1523 - header: An optional header message can be specified.
1525
1524
1526 - local_ns, global_ns: working namespaces. If given as None, the
1525 - local_ns, global_ns: working namespaces. If given as None, the
1527 IPython-initialized one is updated with __main__.__dict__, so that
1526 IPython-initialized one is updated with __main__.__dict__, so that
1528 program variables become visible but user-specific configuration
1527 program variables become visible but user-specific configuration
1529 remains possible.
1528 remains possible.
1530
1529
1531 - stack_depth: specifies how many levels in the stack to go to
1530 - stack_depth: specifies how many levels in the stack to go to
1532 looking for namespaces (when local_ns and global_ns are None). This
1531 looking for namespaces (when local_ns and global_ns are None). This
1533 allows an intermediate caller to make sure that this function gets
1532 allows an intermediate caller to make sure that this function gets
1534 the namespace from the intended level in the stack. By default (0)
1533 the namespace from the intended level in the stack. By default (0)
1535 it will get its locals and globals from the immediate caller.
1534 it will get its locals and globals from the immediate caller.
1536
1535
1537 Warning: it's possible to use this in a program which is being run by
1536 Warning: it's possible to use this in a program which is being run by
1538 IPython itself (via %run), but some funny things will happen (a few
1537 IPython itself (via %run), but some funny things will happen (a few
1539 globals get overwritten). In the future this will be cleaned up, as
1538 globals get overwritten). In the future this will be cleaned up, as
1540 there is no fundamental reason why it can't work perfectly."""
1539 there is no fundamental reason why it can't work perfectly."""
1541
1540
1542 # Get locals and globals from caller
1541 # Get locals and globals from caller
1543 if local_ns is None or global_ns is None:
1542 if local_ns is None or global_ns is None:
1544 call_frame = sys._getframe(stack_depth).f_back
1543 call_frame = sys._getframe(stack_depth).f_back
1545
1544
1546 if local_ns is None:
1545 if local_ns is None:
1547 local_ns = call_frame.f_locals
1546 local_ns = call_frame.f_locals
1548 if global_ns is None:
1547 if global_ns is None:
1549 global_ns = call_frame.f_globals
1548 global_ns = call_frame.f_globals
1550
1549
1551 # Update namespaces and fire up interpreter
1550 # Update namespaces and fire up interpreter
1552
1551
1553 # The global one is easy, we can just throw it in
1552 # The global one is easy, we can just throw it in
1554 self.user_global_ns = global_ns
1553 self.user_global_ns = global_ns
1555
1554
1556 # but the user/local one is tricky: ipython needs it to store internal
1555 # but the user/local one is tricky: ipython needs it to store internal
1557 # data, but we also need the locals. We'll copy locals in the user
1556 # data, but we also need the locals. We'll copy locals in the user
1558 # one, but will track what got copied so we can delete them at exit.
1557 # one, but will track what got copied so we can delete them at exit.
1559 # This is so that a later embedded call doesn't see locals from a
1558 # This is so that a later embedded call doesn't see locals from a
1560 # previous call (which most likely existed in a separate scope).
1559 # previous call (which most likely existed in a separate scope).
1561 local_varnames = local_ns.keys()
1560 local_varnames = local_ns.keys()
1562 self.user_ns.update(local_ns)
1561 self.user_ns.update(local_ns)
1563
1562
1564 # Patch for global embedding to make sure that things don't overwrite
1563 # Patch for global embedding to make sure that things don't overwrite
1565 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1564 # user globals accidentally. Thanks to Richard <rxe@renre-europe.com>
1566 # FIXME. Test this a bit more carefully (the if.. is new)
1565 # FIXME. Test this a bit more carefully (the if.. is new)
1567 if local_ns is None and global_ns is None:
1566 if local_ns is None and global_ns is None:
1568 self.user_global_ns.update(__main__.__dict__)
1567 self.user_global_ns.update(__main__.__dict__)
1569
1568
1570 # make sure the tab-completer has the correct frame information, so it
1569 # make sure the tab-completer has the correct frame information, so it
1571 # actually completes using the frame's locals/globals
1570 # actually completes using the frame's locals/globals
1572 self.set_completer_frame()
1571 self.set_completer_frame()
1573
1572
1574 # before activating the interactive mode, we need to make sure that
1573 # before activating the interactive mode, we need to make sure that
1575 # all names in the builtin namespace needed by ipython point to
1574 # all names in the builtin namespace needed by ipython point to
1576 # ourselves, and not to other instances.
1575 # ourselves, and not to other instances.
1577 self.add_builtins()
1576 self.add_builtins()
1578
1577
1579 self.interact(header)
1578 self.interact(header)
1580
1579
1581 # now, purge out the user namespace from anything we might have added
1580 # now, purge out the user namespace from anything we might have added
1582 # from the caller's local namespace
1581 # from the caller's local namespace
1583 delvar = self.user_ns.pop
1582 delvar = self.user_ns.pop
1584 for var in local_varnames:
1583 for var in local_varnames:
1585 delvar(var,None)
1584 delvar(var,None)
1586 # and clean builtins we may have overridden
1585 # and clean builtins we may have overridden
1587 self.clean_builtins()
1586 self.clean_builtins()
1588
1587
1589 def interact(self, banner=None):
1588 def interact(self, banner=None):
1590 """Closely emulate the interactive Python console.
1589 """Closely emulate the interactive Python console.
1591
1590
1592 The optional banner argument specify the banner to print
1591 The optional banner argument specify the banner to print
1593 before the first interaction; by default it prints a banner
1592 before the first interaction; by default it prints a banner
1594 similar to the one printed by the real Python interpreter,
1593 similar to the one printed by the real Python interpreter,
1595 followed by the current class name in parentheses (so as not
1594 followed by the current class name in parentheses (so as not
1596 to confuse this with the real interpreter -- since it's so
1595 to confuse this with the real interpreter -- since it's so
1597 close!).
1596 close!).
1598
1597
1599 """
1598 """
1600
1599
1601 if self.exit_now:
1600 if self.exit_now:
1602 # batch run -> do not interact
1601 # batch run -> do not interact
1603 return
1602 return
1604 cprt = 'Type "copyright", "credits" or "license" for more information.'
1603 cprt = 'Type "copyright", "credits" or "license" for more information.'
1605 if banner is None:
1604 if banner is None:
1606 self.write("Python %s on %s\n%s\n(%s)\n" %
1605 self.write("Python %s on %s\n%s\n(%s)\n" %
1607 (sys.version, sys.platform, cprt,
1606 (sys.version, sys.platform, cprt,
1608 self.__class__.__name__))
1607 self.__class__.__name__))
1609 else:
1608 else:
1610 self.write(banner)
1609 self.write(banner)
1611
1610
1612 more = 0
1611 more = 0
1613
1612
1614 # Mark activity in the builtins
1613 # Mark activity in the builtins
1615 __builtin__.__dict__['__IPYTHON__active'] += 1
1614 __builtin__.__dict__['__IPYTHON__active'] += 1
1616
1615
1617 # exit_now is set by a call to %Exit or %Quit
1616 # exit_now is set by a call to %Exit or %Quit
1618 while not self.exit_now:
1617 while not self.exit_now:
1619 if more:
1618 if more:
1620 prompt = self.hooks.generate_prompt(True)
1619 prompt = self.hooks.generate_prompt(True)
1621 if self.autoindent:
1620 if self.autoindent:
1622 self.readline_startup_hook(self.pre_readline)
1621 self.readline_startup_hook(self.pre_readline)
1623 else:
1622 else:
1624 prompt = self.hooks.generate_prompt(False)
1623 prompt = self.hooks.generate_prompt(False)
1625 try:
1624 try:
1626 line = self.raw_input(prompt,more)
1625 line = self.raw_input(prompt,more)
1627 if self.exit_now:
1626 if self.exit_now:
1628 # quick exit on sys.std[in|out] close
1627 # quick exit on sys.std[in|out] close
1629 break
1628 break
1630 if self.autoindent:
1629 if self.autoindent:
1631 self.readline_startup_hook(None)
1630 self.readline_startup_hook(None)
1632 except KeyboardInterrupt:
1631 except KeyboardInterrupt:
1633 self.write('\nKeyboardInterrupt\n')
1632 self.write('\nKeyboardInterrupt\n')
1634 self.resetbuffer()
1633 self.resetbuffer()
1635 # keep cache in sync with the prompt counter:
1634 # keep cache in sync with the prompt counter:
1636 self.outputcache.prompt_count -= 1
1635 self.outputcache.prompt_count -= 1
1637
1636
1638 if self.autoindent:
1637 if self.autoindent:
1639 self.indent_current_nsp = 0
1638 self.indent_current_nsp = 0
1640 more = 0
1639 more = 0
1641 except EOFError:
1640 except EOFError:
1642 if self.autoindent:
1641 if self.autoindent:
1643 self.readline_startup_hook(None)
1642 self.readline_startup_hook(None)
1644 self.write('\n')
1643 self.write('\n')
1645 self.exit()
1644 self.exit()
1646 except bdb.BdbQuit:
1645 except bdb.BdbQuit:
1647 warn('The Python debugger has exited with a BdbQuit exception.\n'
1646 warn('The Python debugger has exited with a BdbQuit exception.\n'
1648 'Because of how pdb handles the stack, it is impossible\n'
1647 'Because of how pdb handles the stack, it is impossible\n'
1649 'for IPython to properly format this particular exception.\n'
1648 'for IPython to properly format this particular exception.\n'
1650 'IPython will resume normal operation.')
1649 'IPython will resume normal operation.')
1651 except:
1650 except:
1652 # exceptions here are VERY RARE, but they can be triggered
1651 # exceptions here are VERY RARE, but they can be triggered
1653 # asynchronously by signal handlers, for example.
1652 # asynchronously by signal handlers, for example.
1654 self.showtraceback()
1653 self.showtraceback()
1655 else:
1654 else:
1656 more = self.push(line)
1655 more = self.push(line)
1657 if (self.SyntaxTB.last_syntax_error and
1656 if (self.SyntaxTB.last_syntax_error and
1658 self.rc.autoedit_syntax):
1657 self.rc.autoedit_syntax):
1659 self.edit_syntax_error()
1658 self.edit_syntax_error()
1660
1659
1661 # We are off again...
1660 # We are off again...
1662 __builtin__.__dict__['__IPYTHON__active'] -= 1
1661 __builtin__.__dict__['__IPYTHON__active'] -= 1
1663
1662
1664 def excepthook(self, etype, value, tb):
1663 def excepthook(self, etype, value, tb):
1665 """One more defense for GUI apps that call sys.excepthook.
1664 """One more defense for GUI apps that call sys.excepthook.
1666
1665
1667 GUI frameworks like wxPython trap exceptions and call
1666 GUI frameworks like wxPython trap exceptions and call
1668 sys.excepthook themselves. I guess this is a feature that
1667 sys.excepthook themselves. I guess this is a feature that
1669 enables them to keep running after exceptions that would
1668 enables them to keep running after exceptions that would
1670 otherwise kill their mainloop. This is a bother for IPython
1669 otherwise kill their mainloop. This is a bother for IPython
1671 which excepts to catch all of the program exceptions with a try:
1670 which excepts to catch all of the program exceptions with a try:
1672 except: statement.
1671 except: statement.
1673
1672
1674 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1673 Normally, IPython sets sys.excepthook to a CrashHandler instance, so if
1675 any app directly invokes sys.excepthook, it will look to the user like
1674 any app directly invokes sys.excepthook, it will look to the user like
1676 IPython crashed. In order to work around this, we can disable the
1675 IPython crashed. In order to work around this, we can disable the
1677 CrashHandler and replace it with this excepthook instead, which prints a
1676 CrashHandler and replace it with this excepthook instead, which prints a
1678 regular traceback using our InteractiveTB. In this fashion, apps which
1677 regular traceback using our InteractiveTB. In this fashion, apps which
1679 call sys.excepthook will generate a regular-looking exception from
1678 call sys.excepthook will generate a regular-looking exception from
1680 IPython, and the CrashHandler will only be triggered by real IPython
1679 IPython, and the CrashHandler will only be triggered by real IPython
1681 crashes.
1680 crashes.
1682
1681
1683 This hook should be used sparingly, only in places which are not likely
1682 This hook should be used sparingly, only in places which are not likely
1684 to be true IPython errors.
1683 to be true IPython errors.
1685 """
1684 """
1686 self.showtraceback((etype,value,tb),tb_offset=0)
1685 self.showtraceback((etype,value,tb),tb_offset=0)
1687
1686
1688 def expand_aliases(self,fn,rest):
1687 def expand_aliases(self,fn,rest):
1689 """ Expand multiple levels of aliases:
1688 """ Expand multiple levels of aliases:
1690
1689
1691 if:
1690 if:
1692
1691
1693 alias foo bar /tmp
1692 alias foo bar /tmp
1694 alias baz foo
1693 alias baz foo
1695
1694
1696 then:
1695 then:
1697
1696
1698 baz huhhahhei -> bar /tmp huhhahhei
1697 baz huhhahhei -> bar /tmp huhhahhei
1699
1698
1700 """
1699 """
1701 line = fn + " " + rest
1700 line = fn + " " + rest
1702
1701
1703 done = Set()
1702 done = Set()
1704 while 1:
1703 while 1:
1705 pre,fn,rest = self.split_user_input(line)
1704 pre,fn,rest = self.split_user_input(line)
1706 if fn in self.alias_table:
1705 if fn in self.alias_table:
1707 if fn in done:
1706 if fn in done:
1708 warn("Cyclic alias definition, repeated '%s'" % fn)
1707 warn("Cyclic alias definition, repeated '%s'" % fn)
1709 return ""
1708 return ""
1710 done.add(fn)
1709 done.add(fn)
1711
1710
1712 l2 = self.transform_alias(fn,rest)
1711 l2 = self.transform_alias(fn,rest)
1713 # dir -> dir
1712 # dir -> dir
1714 # print "alias",line, "->",l2 #dbg
1713 # print "alias",line, "->",l2 #dbg
1715 if l2 == line:
1714 if l2 == line:
1716 break
1715 break
1717 # ls -> ls -F should not recurse forever
1716 # ls -> ls -F should not recurse forever
1718 if l2.split(None,1)[0] == line.split(None,1)[0]:
1717 if l2.split(None,1)[0] == line.split(None,1)[0]:
1719 line = l2
1718 line = l2
1720 break
1719 break
1721
1720
1722 line=l2
1721 line=l2
1723
1722
1724
1723
1725 # print "al expand to",line #dbg
1724 # print "al expand to",line #dbg
1726 else:
1725 else:
1727 break
1726 break
1728
1727
1729 return line
1728 return line
1730
1729
1731 def transform_alias(self, alias,rest=''):
1730 def transform_alias(self, alias,rest=''):
1732 """ Transform alias to system command string.
1731 """ Transform alias to system command string.
1733 """
1732 """
1734 nargs,cmd = self.alias_table[alias]
1733 nargs,cmd = self.alias_table[alias]
1735 if ' ' in cmd and os.path.isfile(cmd):
1734 if ' ' in cmd and os.path.isfile(cmd):
1736 cmd = '"%s"' % cmd
1735 cmd = '"%s"' % cmd
1737
1736
1738 # Expand the %l special to be the user's input line
1737 # Expand the %l special to be the user's input line
1739 if cmd.find('%l') >= 0:
1738 if cmd.find('%l') >= 0:
1740 cmd = cmd.replace('%l',rest)
1739 cmd = cmd.replace('%l',rest)
1741 rest = ''
1740 rest = ''
1742 if nargs==0:
1741 if nargs==0:
1743 # Simple, argument-less aliases
1742 # Simple, argument-less aliases
1744 cmd = '%s %s' % (cmd,rest)
1743 cmd = '%s %s' % (cmd,rest)
1745 else:
1744 else:
1746 # Handle aliases with positional arguments
1745 # Handle aliases with positional arguments
1747 args = rest.split(None,nargs)
1746 args = rest.split(None,nargs)
1748 if len(args)< nargs:
1747 if len(args)< nargs:
1749 error('Alias <%s> requires %s arguments, %s given.' %
1748 error('Alias <%s> requires %s arguments, %s given.' %
1750 (alias,nargs,len(args)))
1749 (alias,nargs,len(args)))
1751 return None
1750 return None
1752 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1751 cmd = '%s %s' % (cmd % tuple(args[:nargs]),' '.join(args[nargs:]))
1753 # Now call the macro, evaluating in the user's namespace
1752 # Now call the macro, evaluating in the user's namespace
1754 #print 'new command: <%r>' % cmd # dbg
1753 #print 'new command: <%r>' % cmd # dbg
1755 return cmd
1754 return cmd
1756
1755
1757 def call_alias(self,alias,rest=''):
1756 def call_alias(self,alias,rest=''):
1758 """Call an alias given its name and the rest of the line.
1757 """Call an alias given its name and the rest of the line.
1759
1758
1760 This is only used to provide backwards compatibility for users of
1759 This is only used to provide backwards compatibility for users of
1761 ipalias(), use of which is not recommended for anymore."""
1760 ipalias(), use of which is not recommended for anymore."""
1762
1761
1763 # Now call the macro, evaluating in the user's namespace
1762 # Now call the macro, evaluating in the user's namespace
1764 cmd = self.transform_alias(alias, rest)
1763 cmd = self.transform_alias(alias, rest)
1765 try:
1764 try:
1766 self.system(cmd)
1765 self.system(cmd)
1767 except:
1766 except:
1768 self.showtraceback()
1767 self.showtraceback()
1769
1768
1770 def indent_current_str(self):
1769 def indent_current_str(self):
1771 """return the current level of indentation as a string"""
1770 """return the current level of indentation as a string"""
1772 return self.indent_current_nsp * ' '
1771 return self.indent_current_nsp * ' '
1773
1772
1774 def autoindent_update(self,line):
1773 def autoindent_update(self,line):
1775 """Keep track of the indent level."""
1774 """Keep track of the indent level."""
1776
1775
1777 #debugx('line')
1776 #debugx('line')
1778 #debugx('self.indent_current_nsp')
1777 #debugx('self.indent_current_nsp')
1779 if self.autoindent:
1778 if self.autoindent:
1780 if line:
1779 if line:
1781 inisp = num_ini_spaces(line)
1780 inisp = num_ini_spaces(line)
1782 if inisp < self.indent_current_nsp:
1781 if inisp < self.indent_current_nsp:
1783 self.indent_current_nsp = inisp
1782 self.indent_current_nsp = inisp
1784
1783
1785 if line[-1] == ':':
1784 if line[-1] == ':':
1786 self.indent_current_nsp += 4
1785 self.indent_current_nsp += 4
1787 elif dedent_re.match(line):
1786 elif dedent_re.match(line):
1788 self.indent_current_nsp -= 4
1787 self.indent_current_nsp -= 4
1789 else:
1788 else:
1790 self.indent_current_nsp = 0
1789 self.indent_current_nsp = 0
1791
1790
1792 def runlines(self,lines):
1791 def runlines(self,lines):
1793 """Run a string of one or more lines of source.
1792 """Run a string of one or more lines of source.
1794
1793
1795 This method is capable of running a string containing multiple source
1794 This method is capable of running a string containing multiple source
1796 lines, as if they had been entered at the IPython prompt. Since it
1795 lines, as if they had been entered at the IPython prompt. Since it
1797 exposes IPython's processing machinery, the given strings can contain
1796 exposes IPython's processing machinery, the given strings can contain
1798 magic calls (%magic), special shell access (!cmd), etc."""
1797 magic calls (%magic), special shell access (!cmd), etc."""
1799
1798
1800 # We must start with a clean buffer, in case this is run from an
1799 # We must start with a clean buffer, in case this is run from an
1801 # interactive IPython session (via a magic, for example).
1800 # interactive IPython session (via a magic, for example).
1802 self.resetbuffer()
1801 self.resetbuffer()
1803 lines = lines.split('\n')
1802 lines = lines.split('\n')
1804 more = 0
1803 more = 0
1805 for line in lines:
1804 for line in lines:
1806 # skip blank lines so we don't mess up the prompt counter, but do
1805 # skip blank lines so we don't mess up the prompt counter, but do
1807 # NOT skip even a blank line if we are in a code block (more is
1806 # NOT skip even a blank line if we are in a code block (more is
1808 # true)
1807 # true)
1809 if line or more:
1808 if line or more:
1810 more = self.push(self.prefilter(line,more))
1809 more = self.push(self.prefilter(line,more))
1811 # IPython's runsource returns None if there was an error
1810 # IPython's runsource returns None if there was an error
1812 # compiling the code. This allows us to stop processing right
1811 # compiling the code. This allows us to stop processing right
1813 # away, so the user gets the error message at the right place.
1812 # away, so the user gets the error message at the right place.
1814 if more is None:
1813 if more is None:
1815 break
1814 break
1816 # final newline in case the input didn't have it, so that the code
1815 # final newline in case the input didn't have it, so that the code
1817 # actually does get executed
1816 # actually does get executed
1818 if more:
1817 if more:
1819 self.push('\n')
1818 self.push('\n')
1820
1819
1821 def runsource(self, source, filename='<input>', symbol='single'):
1820 def runsource(self, source, filename='<input>', symbol='single'):
1822 """Compile and run some source in the interpreter.
1821 """Compile and run some source in the interpreter.
1823
1822
1824 Arguments are as for compile_command().
1823 Arguments are as for compile_command().
1825
1824
1826 One several things can happen:
1825 One several things can happen:
1827
1826
1828 1) The input is incorrect; compile_command() raised an
1827 1) The input is incorrect; compile_command() raised an
1829 exception (SyntaxError or OverflowError). A syntax traceback
1828 exception (SyntaxError or OverflowError). A syntax traceback
1830 will be printed by calling the showsyntaxerror() method.
1829 will be printed by calling the showsyntaxerror() method.
1831
1830
1832 2) The input is incomplete, and more input is required;
1831 2) The input is incomplete, and more input is required;
1833 compile_command() returned None. Nothing happens.
1832 compile_command() returned None. Nothing happens.
1834
1833
1835 3) The input is complete; compile_command() returned a code
1834 3) The input is complete; compile_command() returned a code
1836 object. The code is executed by calling self.runcode() (which
1835 object. The code is executed by calling self.runcode() (which
1837 also handles run-time exceptions, except for SystemExit).
1836 also handles run-time exceptions, except for SystemExit).
1838
1837
1839 The return value is:
1838 The return value is:
1840
1839
1841 - True in case 2
1840 - True in case 2
1842
1841
1843 - False in the other cases, unless an exception is raised, where
1842 - False in the other cases, unless an exception is raised, where
1844 None is returned instead. This can be used by external callers to
1843 None is returned instead. This can be used by external callers to
1845 know whether to continue feeding input or not.
1844 know whether to continue feeding input or not.
1846
1845
1847 The return value can be used to decide whether to use sys.ps1 or
1846 The return value can be used to decide whether to use sys.ps1 or
1848 sys.ps2 to prompt the next line."""
1847 sys.ps2 to prompt the next line."""
1849
1848
1850 # if the source code has leading blanks, add 'if 1:\n' to it
1849 # if the source code has leading blanks, add 'if 1:\n' to it
1851 # this allows execution of indented pasted code. It is tempting
1850 # this allows execution of indented pasted code. It is tempting
1852 # to add '\n' at the end of source to run commands like ' a=1'
1851 # to add '\n' at the end of source to run commands like ' a=1'
1853 # directly, but this fails for more complicated scenarios
1852 # directly, but this fails for more complicated scenarios
1854 if source[:1] in [' ', '\t']:
1853 if source[:1] in [' ', '\t']:
1855 source = 'if 1:\n%s' % source
1854 source = 'if 1:\n%s' % source
1856
1855
1857 try:
1856 try:
1858 code = self.compile(source,filename,symbol)
1857 code = self.compile(source,filename,symbol)
1859 except (OverflowError, SyntaxError, ValueError):
1858 except (OverflowError, SyntaxError, ValueError):
1860 # Case 1
1859 # Case 1
1861 self.showsyntaxerror(filename)
1860 self.showsyntaxerror(filename)
1862 return None
1861 return None
1863
1862
1864 if code is None:
1863 if code is None:
1865 # Case 2
1864 # Case 2
1866 return True
1865 return True
1867
1866
1868 # Case 3
1867 # Case 3
1869 # We store the code object so that threaded shells and
1868 # We store the code object so that threaded shells and
1870 # custom exception handlers can access all this info if needed.
1869 # custom exception handlers can access all this info if needed.
1871 # The source corresponding to this can be obtained from the
1870 # The source corresponding to this can be obtained from the
1872 # buffer attribute as '\n'.join(self.buffer).
1871 # buffer attribute as '\n'.join(self.buffer).
1873 self.code_to_run = code
1872 self.code_to_run = code
1874 # now actually execute the code object
1873 # now actually execute the code object
1875 if self.runcode(code) == 0:
1874 if self.runcode(code) == 0:
1876 return False
1875 return False
1877 else:
1876 else:
1878 return None
1877 return None
1879
1878
1880 def runcode(self,code_obj):
1879 def runcode(self,code_obj):
1881 """Execute a code object.
1880 """Execute a code object.
1882
1881
1883 When an exception occurs, self.showtraceback() is called to display a
1882 When an exception occurs, self.showtraceback() is called to display a
1884 traceback.
1883 traceback.
1885
1884
1886 Return value: a flag indicating whether the code to be run completed
1885 Return value: a flag indicating whether the code to be run completed
1887 successfully:
1886 successfully:
1888
1887
1889 - 0: successful execution.
1888 - 0: successful execution.
1890 - 1: an error occurred.
1889 - 1: an error occurred.
1891 """
1890 """
1892
1891
1893 # Set our own excepthook in case the user code tries to call it
1892 # Set our own excepthook in case the user code tries to call it
1894 # directly, so that the IPython crash handler doesn't get triggered
1893 # directly, so that the IPython crash handler doesn't get triggered
1895 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1894 old_excepthook,sys.excepthook = sys.excepthook, self.excepthook
1896
1895
1897 # we save the original sys.excepthook in the instance, in case config
1896 # we save the original sys.excepthook in the instance, in case config
1898 # code (such as magics) needs access to it.
1897 # code (such as magics) needs access to it.
1899 self.sys_excepthook = old_excepthook
1898 self.sys_excepthook = old_excepthook
1900 outflag = 1 # happens in more places, so it's easier as default
1899 outflag = 1 # happens in more places, so it's easier as default
1901 try:
1900 try:
1902 try:
1901 try:
1903 # Embedded instances require separate global/local namespaces
1902 # Embedded instances require separate global/local namespaces
1904 # so they can see both the surrounding (local) namespace and
1903 # so they can see both the surrounding (local) namespace and
1905 # the module-level globals when called inside another function.
1904 # the module-level globals when called inside another function.
1906 if self.embedded:
1905 if self.embedded:
1907 exec code_obj in self.user_global_ns, self.user_ns
1906 exec code_obj in self.user_global_ns, self.user_ns
1908 # Normal (non-embedded) instances should only have a single
1907 # Normal (non-embedded) instances should only have a single
1909 # namespace for user code execution, otherwise functions won't
1908 # namespace for user code execution, otherwise functions won't
1910 # see interactive top-level globals.
1909 # see interactive top-level globals.
1911 else:
1910 else:
1912 exec code_obj in self.user_ns
1911 exec code_obj in self.user_ns
1913 finally:
1912 finally:
1914 # Reset our crash handler in place
1913 # Reset our crash handler in place
1915 sys.excepthook = old_excepthook
1914 sys.excepthook = old_excepthook
1916 except SystemExit:
1915 except SystemExit:
1917 self.resetbuffer()
1916 self.resetbuffer()
1918 self.showtraceback()
1917 self.showtraceback()
1919 warn("Type %exit or %quit to exit IPython "
1918 warn("Type %exit or %quit to exit IPython "
1920 "(%Exit or %Quit do so unconditionally).",level=1)
1919 "(%Exit or %Quit do so unconditionally).",level=1)
1921 except self.custom_exceptions:
1920 except self.custom_exceptions:
1922 etype,value,tb = sys.exc_info()
1921 etype,value,tb = sys.exc_info()
1923 self.CustomTB(etype,value,tb)
1922 self.CustomTB(etype,value,tb)
1924 except:
1923 except:
1925 self.showtraceback()
1924 self.showtraceback()
1926 else:
1925 else:
1927 outflag = 0
1926 outflag = 0
1928 if softspace(sys.stdout, 0):
1927 if softspace(sys.stdout, 0):
1929 print
1928 print
1930 # Flush out code object which has been run (and source)
1929 # Flush out code object which has been run (and source)
1931 self.code_to_run = None
1930 self.code_to_run = None
1932 return outflag
1931 return outflag
1933
1932
1934 def push(self, line):
1933 def push(self, line):
1935 """Push a line to the interpreter.
1934 """Push a line to the interpreter.
1936
1935
1937 The line should not have a trailing newline; it may have
1936 The line should not have a trailing newline; it may have
1938 internal newlines. The line is appended to a buffer and the
1937 internal newlines. The line is appended to a buffer and the
1939 interpreter's runsource() method is called with the
1938 interpreter's runsource() method is called with the
1940 concatenated contents of the buffer as source. If this
1939 concatenated contents of the buffer as source. If this
1941 indicates that the command was executed or invalid, the buffer
1940 indicates that the command was executed or invalid, the buffer
1942 is reset; otherwise, the command is incomplete, and the buffer
1941 is reset; otherwise, the command is incomplete, and the buffer
1943 is left as it was after the line was appended. The return
1942 is left as it was after the line was appended. The return
1944 value is 1 if more input is required, 0 if the line was dealt
1943 value is 1 if more input is required, 0 if the line was dealt
1945 with in some way (this is the same as runsource()).
1944 with in some way (this is the same as runsource()).
1946 """
1945 """
1947
1946
1948 # autoindent management should be done here, and not in the
1947 # autoindent management should be done here, and not in the
1949 # interactive loop, since that one is only seen by keyboard input. We
1948 # interactive loop, since that one is only seen by keyboard input. We
1950 # need this done correctly even for code run via runlines (which uses
1949 # need this done correctly even for code run via runlines (which uses
1951 # push).
1950 # push).
1952
1951
1953 #print 'push line: <%s>' % line # dbg
1952 #print 'push line: <%s>' % line # dbg
1954 for subline in line.splitlines():
1953 for subline in line.splitlines():
1955 self.autoindent_update(subline)
1954 self.autoindent_update(subline)
1956 self.buffer.append(line)
1955 self.buffer.append(line)
1957 more = self.runsource('\n'.join(self.buffer), self.filename)
1956 more = self.runsource('\n'.join(self.buffer), self.filename)
1958 if not more:
1957 if not more:
1959 self.resetbuffer()
1958 self.resetbuffer()
1960 return more
1959 return more
1961
1960
1962 def resetbuffer(self):
1961 def resetbuffer(self):
1963 """Reset the input buffer."""
1962 """Reset the input buffer."""
1964 self.buffer[:] = []
1963 self.buffer[:] = []
1965
1964
1966 def raw_input(self,prompt='',continue_prompt=False):
1965 def raw_input(self,prompt='',continue_prompt=False):
1967 """Write a prompt and read a line.
1966 """Write a prompt and read a line.
1968
1967
1969 The returned line does not include the trailing newline.
1968 The returned line does not include the trailing newline.
1970 When the user enters the EOF key sequence, EOFError is raised.
1969 When the user enters the EOF key sequence, EOFError is raised.
1971
1970
1972 Optional inputs:
1971 Optional inputs:
1973
1972
1974 - prompt(''): a string to be printed to prompt the user.
1973 - prompt(''): a string to be printed to prompt the user.
1975
1974
1976 - continue_prompt(False): whether this line is the first one or a
1975 - continue_prompt(False): whether this line is the first one or a
1977 continuation in a sequence of inputs.
1976 continuation in a sequence of inputs.
1978 """
1977 """
1979
1978
1980 try:
1979 try:
1981 line = raw_input_original(prompt)
1980 line = raw_input_original(prompt)
1982 except ValueError:
1981 except ValueError:
1983 warn("\n********\nYou or a %run:ed script called sys.stdin.close() or sys.stdout.close()!\nExiting IPython!")
1982 warn("\n********\nYou or a %run:ed script called sys.stdin.close() or sys.stdout.close()!\nExiting IPython!")
1984 self.exit_now = True
1983 self.exit_now = True
1985 return ""
1984 return ""
1986
1985
1987
1986
1988 # Try to be reasonably smart about not re-indenting pasted input more
1987 # Try to be reasonably smart about not re-indenting pasted input more
1989 # than necessary. We do this by trimming out the auto-indent initial
1988 # than necessary. We do this by trimming out the auto-indent initial
1990 # spaces, if the user's actual input started itself with whitespace.
1989 # spaces, if the user's actual input started itself with whitespace.
1991 #debugx('self.buffer[-1]')
1990 #debugx('self.buffer[-1]')
1992
1991
1993 if self.autoindent:
1992 if self.autoindent:
1994 if num_ini_spaces(line) > self.indent_current_nsp:
1993 if num_ini_spaces(line) > self.indent_current_nsp:
1995 line = line[self.indent_current_nsp:]
1994 line = line[self.indent_current_nsp:]
1996 self.indent_current_nsp = 0
1995 self.indent_current_nsp = 0
1997
1996
1998 # store the unfiltered input before the user has any chance to modify
1997 # store the unfiltered input before the user has any chance to modify
1999 # it.
1998 # it.
2000 if line.strip():
1999 if line.strip():
2001 if continue_prompt:
2000 if continue_prompt:
2002 self.input_hist_raw[-1] += '%s\n' % line
2001 self.input_hist_raw[-1] += '%s\n' % line
2003 if self.has_readline: # and some config option is set?
2002 if self.has_readline: # and some config option is set?
2004 try:
2003 try:
2005 histlen = self.readline.get_current_history_length()
2004 histlen = self.readline.get_current_history_length()
2006 newhist = self.input_hist_raw[-1].rstrip()
2005 newhist = self.input_hist_raw[-1].rstrip()
2007 self.readline.remove_history_item(histlen-1)
2006 self.readline.remove_history_item(histlen-1)
2008 self.readline.replace_history_item(histlen-2,newhist)
2007 self.readline.replace_history_item(histlen-2,newhist)
2009 except AttributeError:
2008 except AttributeError:
2010 pass # re{move,place}_history_item are new in 2.4.
2009 pass # re{move,place}_history_item are new in 2.4.
2011 else:
2010 else:
2012 self.input_hist_raw.append('%s\n' % line)
2011 self.input_hist_raw.append('%s\n' % line)
2013
2012
2014 try:
2013 try:
2015 lineout = self.prefilter(line,continue_prompt)
2014 lineout = self.prefilter(line,continue_prompt)
2016 except:
2015 except:
2017 # blanket except, in case a user-defined prefilter crashes, so it
2016 # blanket except, in case a user-defined prefilter crashes, so it
2018 # can't take all of ipython with it.
2017 # can't take all of ipython with it.
2019 self.showtraceback()
2018 self.showtraceback()
2020 return ''
2019 return ''
2021 else:
2020 else:
2022 return lineout
2021 return lineout
2023
2022
2024 def split_user_input(self,line):
2023 def split_user_input(self,line):
2025 """Split user input into pre-char, function part and rest."""
2024 """Split user input into pre-char, function part and rest."""
2026
2025
2027 lsplit = self.line_split.match(line)
2026 lsplit = self.line_split.match(line)
2028 if lsplit is None: # no regexp match returns None
2027 if lsplit is None: # no regexp match returns None
2028 #print "match failed for line '%s'" % line # dbg
2029 try:
2029 try:
2030 iFun,theRest = line.split(None,1)
2030 iFun,theRest = line.split(None,1)
2031 except ValueError:
2031 except ValueError:
2032 #print "split failed for line '%s'" % line # dbg
2032 iFun,theRest = line,''
2033 iFun,theRest = line,''
2033 pre = re.match('^(\s*)(.*)',line).groups()[0]
2034 pre = re.match('^(\s*)(.*)',line).groups()[0]
2034 else:
2035 else:
2035 pre,iFun,theRest = lsplit.groups()
2036 pre,iFun,theRest = lsplit.groups()
2036
2037
2037 #print 'line:<%s>' % line # dbg
2038 #print 'line:<%s>' % line # dbg
2038 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2039 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2039 return pre,iFun.strip(),theRest
2040 return pre,iFun.strip(),theRest
2040
2041
2041
2042 # THIS VERSION IS BROKEN!!! It was intended to prevent spurious attribute
2042 def split_user_inputTMP(self,line):
2043 # accesses with a more stringent check of inputs, but it introduced other
2044 # bugs. Disable it for now until I can properly fix it.
2045 def split_user_inputBROKEN(self,line):
2043 """Split user input into pre-char, function part and rest."""
2046 """Split user input into pre-char, function part and rest."""
2044
2047
2045 lsplit = self.line_split.match(line)
2048 lsplit = self.line_split.match(line)
2046 if lsplit is None: # no regexp match returns None
2049 if lsplit is None: # no regexp match returns None
2047 lsplit = self.line_split_fallback.match(line)
2050 lsplit = self.line_split_fallback.match(line)
2048
2051
2049 #pre,iFun,theRest = lsplit.groups() # dbg
2052 #pre,iFun,theRest = lsplit.groups() # dbg
2050 #print 'line:<%s>' % line # dbg
2053 #print 'line:<%s>' % line # dbg
2051 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2054 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun.strip(),theRest) # dbg
2052 #return pre,iFun.strip(),theRest # dbg
2055 #return pre,iFun.strip(),theRest # dbg
2053
2056
2054 return lsplit.groups()
2057 return lsplit.groups()
2055
2058
2056 def _prefilter(self, line, continue_prompt):
2059 def _prefilter(self, line, continue_prompt):
2057 """Calls different preprocessors, depending on the form of line."""
2060 """Calls different preprocessors, depending on the form of line."""
2058
2061
2059 # All handlers *must* return a value, even if it's blank ('').
2062 # All handlers *must* return a value, even if it's blank ('').
2060
2063
2061 # Lines are NOT logged here. Handlers should process the line as
2064 # Lines are NOT logged here. Handlers should process the line as
2062 # needed, update the cache AND log it (so that the input cache array
2065 # needed, update the cache AND log it (so that the input cache array
2063 # stays synced).
2066 # stays synced).
2064
2067
2065 # This function is _very_ delicate, and since it's also the one which
2068 # This function is _very_ delicate, and since it's also the one which
2066 # determines IPython's response to user input, it must be as efficient
2069 # determines IPython's response to user input, it must be as efficient
2067 # as possible. For this reason it has _many_ returns in it, trying
2070 # as possible. For this reason it has _many_ returns in it, trying
2068 # always to exit as quickly as it can figure out what it needs to do.
2071 # always to exit as quickly as it can figure out what it needs to do.
2069
2072
2070 # This function is the main responsible for maintaining IPython's
2073 # This function is the main responsible for maintaining IPython's
2071 # behavior respectful of Python's semantics. So be _very_ careful if
2074 # behavior respectful of Python's semantics. So be _very_ careful if
2072 # making changes to anything here.
2075 # making changes to anything here.
2073
2076
2074 #.....................................................................
2077 #.....................................................................
2075 # Code begins
2078 # Code begins
2076
2079
2077 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2080 #if line.startswith('%crash'): raise RuntimeError,'Crash now!' # dbg
2078
2081
2079 # save the line away in case we crash, so the post-mortem handler can
2082 # save the line away in case we crash, so the post-mortem handler can
2080 # record it
2083 # record it
2081 self._last_input_line = line
2084 self._last_input_line = line
2082
2085
2083 #print '***line: <%s>' % line # dbg
2086 #print '***line: <%s>' % line # dbg
2084
2087
2085 # the input history needs to track even empty lines
2088 # the input history needs to track even empty lines
2086 stripped = line.strip()
2089 stripped = line.strip()
2087
2090
2088 if not stripped:
2091 if not stripped:
2089 if not continue_prompt:
2092 if not continue_prompt:
2090 self.outputcache.prompt_count -= 1
2093 self.outputcache.prompt_count -= 1
2091 return self.handle_normal(line,continue_prompt)
2094 return self.handle_normal(line,continue_prompt)
2092 #return self.handle_normal('',continue_prompt)
2095 #return self.handle_normal('',continue_prompt)
2093
2096
2094 # print '***cont',continue_prompt # dbg
2097 # print '***cont',continue_prompt # dbg
2095 # special handlers are only allowed for single line statements
2098 # special handlers are only allowed for single line statements
2096 if continue_prompt and not self.rc.multi_line_specials:
2099 if continue_prompt and not self.rc.multi_line_specials:
2097 return self.handle_normal(line,continue_prompt)
2100 return self.handle_normal(line,continue_prompt)
2098
2101
2099
2102
2100 # For the rest, we need the structure of the input
2103 # For the rest, we need the structure of the input
2101 pre,iFun,theRest = self.split_user_input(line)
2104 pre,iFun,theRest = self.split_user_input(line)
2102
2105
2103 # See whether any pre-existing handler can take care of it
2106 # See whether any pre-existing handler can take care of it
2104
2107
2105 rewritten = self.hooks.input_prefilter(stripped)
2108 rewritten = self.hooks.input_prefilter(stripped)
2106 if rewritten != stripped: # ok, some prefilter did something
2109 if rewritten != stripped: # ok, some prefilter did something
2107 rewritten = pre + rewritten # add indentation
2110 rewritten = pre + rewritten # add indentation
2108 return self.handle_normal(rewritten)
2111 return self.handle_normal(rewritten)
2109
2112
2110 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2113 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2111
2114
2112 # First check for explicit escapes in the last/first character
2115 # First check for explicit escapes in the last/first character
2113 handler = None
2116 handler = None
2114 if line[-1] == self.ESC_HELP:
2117 if line[-1] == self.ESC_HELP:
2115 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
2118 handler = self.esc_handlers.get(line[-1]) # the ? can be at the end
2116 if handler is None:
2119 if handler is None:
2117 # look at the first character of iFun, NOT of line, so we skip
2120 # look at the first character of iFun, NOT of line, so we skip
2118 # leading whitespace in multiline input
2121 # leading whitespace in multiline input
2119 handler = self.esc_handlers.get(iFun[0:1])
2122 handler = self.esc_handlers.get(iFun[0:1])
2120 if handler is not None:
2123 if handler is not None:
2121 return handler(line,continue_prompt,pre,iFun,theRest)
2124 return handler(line,continue_prompt,pre,iFun,theRest)
2122 # Emacs ipython-mode tags certain input lines
2125 # Emacs ipython-mode tags certain input lines
2123 if line.endswith('# PYTHON-MODE'):
2126 if line.endswith('# PYTHON-MODE'):
2124 return self.handle_emacs(line,continue_prompt)
2127 return self.handle_emacs(line,continue_prompt)
2125
2128
2126 # Next, check if we can automatically execute this thing
2129 # Next, check if we can automatically execute this thing
2127
2130
2128 # Allow ! in multi-line statements if multi_line_specials is on:
2131 # Allow ! in multi-line statements if multi_line_specials is on:
2129 if continue_prompt and self.rc.multi_line_specials and \
2132 if continue_prompt and self.rc.multi_line_specials and \
2130 iFun.startswith(self.ESC_SHELL):
2133 iFun.startswith(self.ESC_SHELL):
2131 return self.handle_shell_escape(line,continue_prompt,
2134 return self.handle_shell_escape(line,continue_prompt,
2132 pre=pre,iFun=iFun,
2135 pre=pre,iFun=iFun,
2133 theRest=theRest)
2136 theRest=theRest)
2134
2137
2135 # Let's try to find if the input line is a magic fn
2138 # Let's try to find if the input line is a magic fn
2136 oinfo = None
2139 oinfo = None
2137 if hasattr(self,'magic_'+iFun):
2140 if hasattr(self,'magic_'+iFun):
2138 # WARNING: _ofind uses getattr(), so it can consume generators and
2141 # WARNING: _ofind uses getattr(), so it can consume generators and
2139 # cause other side effects.
2142 # cause other side effects.
2140 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2143 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2141 if oinfo['ismagic']:
2144 if oinfo['ismagic']:
2142 # Be careful not to call magics when a variable assignment is
2145 # Be careful not to call magics when a variable assignment is
2143 # being made (ls='hi', for example)
2146 # being made (ls='hi', for example)
2144 if self.rc.automagic and \
2147 if self.rc.automagic and \
2145 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
2148 (len(theRest)==0 or theRest[0] not in '!=()<>,') and \
2146 (self.rc.multi_line_specials or not continue_prompt):
2149 (self.rc.multi_line_specials or not continue_prompt):
2147 return self.handle_magic(line,continue_prompt,
2150 return self.handle_magic(line,continue_prompt,
2148 pre,iFun,theRest)
2151 pre,iFun,theRest)
2149 else:
2152 else:
2150 return self.handle_normal(line,continue_prompt)
2153 return self.handle_normal(line,continue_prompt)
2151
2154
2152 # If the rest of the line begins with an (in)equality, assginment or
2155 # If the rest of the line begins with an (in)equality, assginment or
2153 # function call, we should not call _ofind but simply execute it.
2156 # function call, we should not call _ofind but simply execute it.
2154 # This avoids spurious geattr() accesses on objects upon assignment.
2157 # This avoids spurious geattr() accesses on objects upon assignment.
2155 #
2158 #
2156 # It also allows users to assign to either alias or magic names true
2159 # It also allows users to assign to either alias or magic names true
2157 # python variables (the magic/alias systems always take second seat to
2160 # python variables (the magic/alias systems always take second seat to
2158 # true python code).
2161 # true python code).
2159 if theRest and theRest[0] in '!=()':
2162 if theRest and theRest[0] in '!=()':
2160 return self.handle_normal(line,continue_prompt)
2163 return self.handle_normal(line,continue_prompt)
2161
2164
2162 if oinfo is None:
2165 if oinfo is None:
2163 # let's try to ensure that _oinfo is ONLY called when autocall is
2166 # let's try to ensure that _oinfo is ONLY called when autocall is
2164 # on. Since it has inevitable potential side effects, at least
2167 # on. Since it has inevitable potential side effects, at least
2165 # having autocall off should be a guarantee to the user that no
2168 # having autocall off should be a guarantee to the user that no
2166 # weird things will happen.
2169 # weird things will happen.
2167
2170
2168 if self.rc.autocall:
2171 if self.rc.autocall:
2169 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2172 oinfo = self._ofind(iFun) # FIXME - _ofind is part of Magic
2170 else:
2173 else:
2171 # in this case, all that's left is either an alias or
2174 # in this case, all that's left is either an alias or
2172 # processing the line normally.
2175 # processing the line normally.
2173 if iFun in self.alias_table:
2176 if iFun in self.alias_table:
2174 # if autocall is off, by not running _ofind we won't know
2177 # if autocall is off, by not running _ofind we won't know
2175 # whether the given name may also exist in one of the
2178 # whether the given name may also exist in one of the
2176 # user's namespace. At this point, it's best to do a
2179 # user's namespace. At this point, it's best to do a
2177 # quick check just to be sure that we don't let aliases
2180 # quick check just to be sure that we don't let aliases
2178 # shadow variables.
2181 # shadow variables.
2179 head = iFun.split('.',1)[0]
2182 head = iFun.split('.',1)[0]
2180 if head in self.user_ns or head in self.internal_ns \
2183 if head in self.user_ns or head in self.internal_ns \
2181 or head in __builtin__.__dict__:
2184 or head in __builtin__.__dict__:
2182 return self.handle_normal(line,continue_prompt)
2185 return self.handle_normal(line,continue_prompt)
2183 else:
2186 else:
2184 return self.handle_alias(line,continue_prompt,
2187 return self.handle_alias(line,continue_prompt,
2185 pre,iFun,theRest)
2188 pre,iFun,theRest)
2186
2189
2187 else:
2190 else:
2188 return self.handle_normal(line,continue_prompt)
2191 return self.handle_normal(line,continue_prompt)
2189
2192
2190 if not oinfo['found']:
2193 if not oinfo['found']:
2191 return self.handle_normal(line,continue_prompt)
2194 return self.handle_normal(line,continue_prompt)
2192 else:
2195 else:
2193 #print 'pre<%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2196 #print 'pre<%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2194 if oinfo['isalias']:
2197 if oinfo['isalias']:
2195 return self.handle_alias(line,continue_prompt,
2198 return self.handle_alias(line,continue_prompt,
2196 pre,iFun,theRest)
2199 pre,iFun,theRest)
2197
2200
2198 if (self.rc.autocall
2201 if (self.rc.autocall
2199 and
2202 and
2200 (
2203 (
2201 #only consider exclusion re if not "," or ";" autoquoting
2204 #only consider exclusion re if not "," or ";" autoquoting
2202 (pre == self.ESC_QUOTE or pre == self.ESC_QUOTE2
2205 (pre == self.ESC_QUOTE or pre == self.ESC_QUOTE2
2203 or pre == self.ESC_PAREN) or
2206 or pre == self.ESC_PAREN) or
2204 (not self.re_exclude_auto.match(theRest)))
2207 (not self.re_exclude_auto.match(theRest)))
2205 and
2208 and
2206 self.re_fun_name.match(iFun) and
2209 self.re_fun_name.match(iFun) and
2207 callable(oinfo['obj'])) :
2210 callable(oinfo['obj'])) :
2208 #print 'going auto' # dbg
2211 #print 'going auto' # dbg
2209 return self.handle_auto(line,continue_prompt,
2212 return self.handle_auto(line,continue_prompt,
2210 pre,iFun,theRest,oinfo['obj'])
2213 pre,iFun,theRest,oinfo['obj'])
2211 else:
2214 else:
2212 #print 'was callable?', callable(oinfo['obj']) # dbg
2215 #print 'was callable?', callable(oinfo['obj']) # dbg
2213 return self.handle_normal(line,continue_prompt)
2216 return self.handle_normal(line,continue_prompt)
2214
2217
2215 # If we get here, we have a normal Python line. Log and return.
2218 # If we get here, we have a normal Python line. Log and return.
2216 return self.handle_normal(line,continue_prompt)
2219 return self.handle_normal(line,continue_prompt)
2217
2220
2218 def _prefilter_dumb(self, line, continue_prompt):
2221 def _prefilter_dumb(self, line, continue_prompt):
2219 """simple prefilter function, for debugging"""
2222 """simple prefilter function, for debugging"""
2220 return self.handle_normal(line,continue_prompt)
2223 return self.handle_normal(line,continue_prompt)
2221
2224
2222
2225
2223 def multiline_prefilter(self, line, continue_prompt):
2226 def multiline_prefilter(self, line, continue_prompt):
2224 """ Run _prefilter for each line of input
2227 """ Run _prefilter for each line of input
2225
2228
2226 Covers cases where there are multiple lines in the user entry,
2229 Covers cases where there are multiple lines in the user entry,
2227 which is the case when the user goes back to a multiline history
2230 which is the case when the user goes back to a multiline history
2228 entry and presses enter.
2231 entry and presses enter.
2229
2232
2230 """
2233 """
2231 out = []
2234 out = []
2232 for l in line.rstrip('\n').split('\n'):
2235 for l in line.rstrip('\n').split('\n'):
2233 out.append(self._prefilter(l, continue_prompt))
2236 out.append(self._prefilter(l, continue_prompt))
2234 return '\n'.join(out)
2237 return '\n'.join(out)
2235
2238
2236 # Set the default prefilter() function (this can be user-overridden)
2239 # Set the default prefilter() function (this can be user-overridden)
2237 prefilter = multiline_prefilter
2240 prefilter = multiline_prefilter
2238
2241
2239 def handle_normal(self,line,continue_prompt=None,
2242 def handle_normal(self,line,continue_prompt=None,
2240 pre=None,iFun=None,theRest=None):
2243 pre=None,iFun=None,theRest=None):
2241 """Handle normal input lines. Use as a template for handlers."""
2244 """Handle normal input lines. Use as a template for handlers."""
2242
2245
2243 # With autoindent on, we need some way to exit the input loop, and I
2246 # With autoindent on, we need some way to exit the input loop, and I
2244 # don't want to force the user to have to backspace all the way to
2247 # don't want to force the user to have to backspace all the way to
2245 # clear the line. The rule will be in this case, that either two
2248 # clear the line. The rule will be in this case, that either two
2246 # lines of pure whitespace in a row, or a line of pure whitespace but
2249 # lines of pure whitespace in a row, or a line of pure whitespace but
2247 # of a size different to the indent level, will exit the input loop.
2250 # of a size different to the indent level, will exit the input loop.
2248
2251
2249 if (continue_prompt and self.autoindent and line.isspace() and
2252 if (continue_prompt and self.autoindent and line.isspace() and
2250 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2253 (0 < abs(len(line) - self.indent_current_nsp) <= 2 or
2251 (self.buffer[-1]).isspace() )):
2254 (self.buffer[-1]).isspace() )):
2252 line = ''
2255 line = ''
2253
2256
2254 self.log(line,line,continue_prompt)
2257 self.log(line,line,continue_prompt)
2255 return line
2258 return line
2256
2259
2257 def handle_alias(self,line,continue_prompt=None,
2260 def handle_alias(self,line,continue_prompt=None,
2258 pre=None,iFun=None,theRest=None):
2261 pre=None,iFun=None,theRest=None):
2259 """Handle alias input lines. """
2262 """Handle alias input lines. """
2260
2263
2261 # pre is needed, because it carries the leading whitespace. Otherwise
2264 # pre is needed, because it carries the leading whitespace. Otherwise
2262 # aliases won't work in indented sections.
2265 # aliases won't work in indented sections.
2263 transformed = self.expand_aliases(iFun, theRest)
2266 transformed = self.expand_aliases(iFun, theRest)
2264 line_out = '%s_ip.system(%s)' % (pre, make_quoted_expr( transformed ))
2267 line_out = '%s_ip.system(%s)' % (pre, make_quoted_expr( transformed ))
2265 self.log(line,line_out,continue_prompt)
2268 self.log(line,line_out,continue_prompt)
2266 #print 'line out:',line_out # dbg
2269 #print 'line out:',line_out # dbg
2267 return line_out
2270 return line_out
2268
2271
2269 def handle_shell_escape(self, line, continue_prompt=None,
2272 def handle_shell_escape(self, line, continue_prompt=None,
2270 pre=None,iFun=None,theRest=None):
2273 pre=None,iFun=None,theRest=None):
2271 """Execute the line in a shell, empty return value"""
2274 """Execute the line in a shell, empty return value"""
2272
2275
2273 #print 'line in :', `line` # dbg
2276 #print 'line in :', `line` # dbg
2274 # Example of a special handler. Others follow a similar pattern.
2277 # Example of a special handler. Others follow a similar pattern.
2275 if line.lstrip().startswith('!!'):
2278 if line.lstrip().startswith('!!'):
2276 # rewrite iFun/theRest to properly hold the call to %sx and
2279 # rewrite iFun/theRest to properly hold the call to %sx and
2277 # the actual command to be executed, so handle_magic can work
2280 # the actual command to be executed, so handle_magic can work
2278 # correctly
2281 # correctly
2279 theRest = '%s %s' % (iFun[2:],theRest)
2282 theRest = '%s %s' % (iFun[2:],theRest)
2280 iFun = 'sx'
2283 iFun = 'sx'
2281 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,
2284 return self.handle_magic('%ssx %s' % (self.ESC_MAGIC,
2282 line.lstrip()[2:]),
2285 line.lstrip()[2:]),
2283 continue_prompt,pre,iFun,theRest)
2286 continue_prompt,pre,iFun,theRest)
2284 else:
2287 else:
2285 cmd=line.lstrip().lstrip('!')
2288 cmd=line.lstrip().lstrip('!')
2286 line_out = '%s_ip.system(%s)' % (pre,make_quoted_expr(cmd))
2289 line_out = '%s_ip.system(%s)' % (pre,make_quoted_expr(cmd))
2287 # update cache/log and return
2290 # update cache/log and return
2288 self.log(line,line_out,continue_prompt)
2291 self.log(line,line_out,continue_prompt)
2289 return line_out
2292 return line_out
2290
2293
2291 def handle_magic(self, line, continue_prompt=None,
2294 def handle_magic(self, line, continue_prompt=None,
2292 pre=None,iFun=None,theRest=None):
2295 pre=None,iFun=None,theRest=None):
2293 """Execute magic functions."""
2296 """Execute magic functions."""
2294
2297
2295
2298
2296 cmd = '%s_ip.magic(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
2299 cmd = '%s_ip.magic(%s)' % (pre,make_quoted_expr(iFun + " " + theRest))
2297 self.log(line,cmd,continue_prompt)
2300 self.log(line,cmd,continue_prompt)
2298 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2301 #print 'in handle_magic, cmd=<%s>' % cmd # dbg
2299 return cmd
2302 return cmd
2300
2303
2301 def handle_auto(self, line, continue_prompt=None,
2304 def handle_auto(self, line, continue_prompt=None,
2302 pre=None,iFun=None,theRest=None,obj=None):
2305 pre=None,iFun=None,theRest=None,obj=None):
2303 """Hande lines which can be auto-executed, quoting if requested."""
2306 """Hande lines which can be auto-executed, quoting if requested."""
2304
2307
2305 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2308 #print 'pre <%s> iFun <%s> rest <%s>' % (pre,iFun,theRest) # dbg
2306
2309
2307 # This should only be active for single-line input!
2310 # This should only be active for single-line input!
2308 if continue_prompt:
2311 if continue_prompt:
2309 self.log(line,line,continue_prompt)
2312 self.log(line,line,continue_prompt)
2310 return line
2313 return line
2311
2314
2312 auto_rewrite = True
2315 auto_rewrite = True
2313
2316
2314 if pre == self.ESC_QUOTE:
2317 if pre == self.ESC_QUOTE:
2315 # Auto-quote splitting on whitespace
2318 # Auto-quote splitting on whitespace
2316 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2319 newcmd = '%s("%s")' % (iFun,'", "'.join(theRest.split()) )
2317 elif pre == self.ESC_QUOTE2:
2320 elif pre == self.ESC_QUOTE2:
2318 # Auto-quote whole string
2321 # Auto-quote whole string
2319 newcmd = '%s("%s")' % (iFun,theRest)
2322 newcmd = '%s("%s")' % (iFun,theRest)
2320 elif pre == self.ESC_PAREN:
2323 elif pre == self.ESC_PAREN:
2321 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2324 newcmd = '%s(%s)' % (iFun,",".join(theRest.split()))
2322 else:
2325 else:
2323 # Auto-paren.
2326 # Auto-paren.
2324 # We only apply it to argument-less calls if the autocall
2327 # We only apply it to argument-less calls if the autocall
2325 # parameter is set to 2. We only need to check that autocall is <
2328 # parameter is set to 2. We only need to check that autocall is <
2326 # 2, since this function isn't called unless it's at least 1.
2329 # 2, since this function isn't called unless it's at least 1.
2327 if not theRest and (self.rc.autocall < 2):
2330 if not theRest and (self.rc.autocall < 2):
2328 newcmd = '%s %s' % (iFun,theRest)
2331 newcmd = '%s %s' % (iFun,theRest)
2329 auto_rewrite = False
2332 auto_rewrite = False
2330 else:
2333 else:
2331 if theRest.startswith('['):
2334 if theRest.startswith('['):
2332 if hasattr(obj,'__getitem__'):
2335 if hasattr(obj,'__getitem__'):
2333 # Don't autocall in this case: item access for an object
2336 # Don't autocall in this case: item access for an object
2334 # which is BOTH callable and implements __getitem__.
2337 # which is BOTH callable and implements __getitem__.
2335 newcmd = '%s %s' % (iFun,theRest)
2338 newcmd = '%s %s' % (iFun,theRest)
2336 auto_rewrite = False
2339 auto_rewrite = False
2337 else:
2340 else:
2338 # if the object doesn't support [] access, go ahead and
2341 # if the object doesn't support [] access, go ahead and
2339 # autocall
2342 # autocall
2340 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2343 newcmd = '%s(%s)' % (iFun.rstrip(),theRest)
2341 elif theRest.endswith(';'):
2344 elif theRest.endswith(';'):
2342 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2345 newcmd = '%s(%s);' % (iFun.rstrip(),theRest[:-1])
2343 else:
2346 else:
2344 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2347 newcmd = '%s(%s)' % (iFun.rstrip(), theRest)
2345
2348
2346 if auto_rewrite:
2349 if auto_rewrite:
2347 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
2350 print >>Term.cout, self.outputcache.prompt1.auto_rewrite() + newcmd
2348 # log what is now valid Python, not the actual user input (without the
2351 # log what is now valid Python, not the actual user input (without the
2349 # final newline)
2352 # final newline)
2350 self.log(line,newcmd,continue_prompt)
2353 self.log(line,newcmd,continue_prompt)
2351 return newcmd
2354 return newcmd
2352
2355
2353 def handle_help(self, line, continue_prompt=None,
2356 def handle_help(self, line, continue_prompt=None,
2354 pre=None,iFun=None,theRest=None):
2357 pre=None,iFun=None,theRest=None):
2355 """Try to get some help for the object.
2358 """Try to get some help for the object.
2356
2359
2357 obj? or ?obj -> basic information.
2360 obj? or ?obj -> basic information.
2358 obj?? or ??obj -> more details.
2361 obj?? or ??obj -> more details.
2359 """
2362 """
2360
2363
2361 # We need to make sure that we don't process lines which would be
2364 # We need to make sure that we don't process lines which would be
2362 # otherwise valid python, such as "x=1 # what?"
2365 # otherwise valid python, such as "x=1 # what?"
2363 try:
2366 try:
2364 codeop.compile_command(line)
2367 codeop.compile_command(line)
2365 except SyntaxError:
2368 except SyntaxError:
2366 # We should only handle as help stuff which is NOT valid syntax
2369 # We should only handle as help stuff which is NOT valid syntax
2367 if line[0]==self.ESC_HELP:
2370 if line[0]==self.ESC_HELP:
2368 line = line[1:]
2371 line = line[1:]
2369 elif line[-1]==self.ESC_HELP:
2372 elif line[-1]==self.ESC_HELP:
2370 line = line[:-1]
2373 line = line[:-1]
2371 self.log(line,'#?'+line,continue_prompt)
2374 self.log(line,'#?'+line,continue_prompt)
2372 if line:
2375 if line:
2373 self.magic_pinfo(line)
2376 self.magic_pinfo(line)
2374 else:
2377 else:
2375 page(self.usage,screen_lines=self.rc.screen_length)
2378 page(self.usage,screen_lines=self.rc.screen_length)
2376 return '' # Empty string is needed here!
2379 return '' # Empty string is needed here!
2377 except:
2380 except:
2378 # Pass any other exceptions through to the normal handler
2381 # Pass any other exceptions through to the normal handler
2379 return self.handle_normal(line,continue_prompt)
2382 return self.handle_normal(line,continue_prompt)
2380 else:
2383 else:
2381 # If the code compiles ok, we should handle it normally
2384 # If the code compiles ok, we should handle it normally
2382 return self.handle_normal(line,continue_prompt)
2385 return self.handle_normal(line,continue_prompt)
2383
2386
2384 def getapi(self):
2387 def getapi(self):
2385 """ Get an IPApi object for this shell instance
2388 """ Get an IPApi object for this shell instance
2386
2389
2387 Getting an IPApi object is always preferable to accessing the shell
2390 Getting an IPApi object is always preferable to accessing the shell
2388 directly, but this holds true especially for extensions.
2391 directly, but this holds true especially for extensions.
2389
2392
2390 It should always be possible to implement an extension with IPApi
2393 It should always be possible to implement an extension with IPApi
2391 alone. If not, contact maintainer to request an addition.
2394 alone. If not, contact maintainer to request an addition.
2392
2395
2393 """
2396 """
2394 return self.api
2397 return self.api
2395
2398
2396 def handle_emacs(self,line,continue_prompt=None,
2399 def handle_emacs(self,line,continue_prompt=None,
2397 pre=None,iFun=None,theRest=None):
2400 pre=None,iFun=None,theRest=None):
2398 """Handle input lines marked by python-mode."""
2401 """Handle input lines marked by python-mode."""
2399
2402
2400 # Currently, nothing is done. Later more functionality can be added
2403 # Currently, nothing is done. Later more functionality can be added
2401 # here if needed.
2404 # here if needed.
2402
2405
2403 # The input cache shouldn't be updated
2406 # The input cache shouldn't be updated
2404
2407
2405 return line
2408 return line
2406
2409
2407 def mktempfile(self,data=None):
2410 def mktempfile(self,data=None):
2408 """Make a new tempfile and return its filename.
2411 """Make a new tempfile and return its filename.
2409
2412
2410 This makes a call to tempfile.mktemp, but it registers the created
2413 This makes a call to tempfile.mktemp, but it registers the created
2411 filename internally so ipython cleans it up at exit time.
2414 filename internally so ipython cleans it up at exit time.
2412
2415
2413 Optional inputs:
2416 Optional inputs:
2414
2417
2415 - data(None): if data is given, it gets written out to the temp file
2418 - data(None): if data is given, it gets written out to the temp file
2416 immediately, and the file is closed again."""
2419 immediately, and the file is closed again."""
2417
2420
2418 filename = tempfile.mktemp('.py','ipython_edit_')
2421 filename = tempfile.mktemp('.py','ipython_edit_')
2419 self.tempfiles.append(filename)
2422 self.tempfiles.append(filename)
2420
2423
2421 if data:
2424 if data:
2422 tmp_file = open(filename,'w')
2425 tmp_file = open(filename,'w')
2423 tmp_file.write(data)
2426 tmp_file.write(data)
2424 tmp_file.close()
2427 tmp_file.close()
2425 return filename
2428 return filename
2426
2429
2427 def write(self,data):
2430 def write(self,data):
2428 """Write a string to the default output"""
2431 """Write a string to the default output"""
2429 Term.cout.write(data)
2432 Term.cout.write(data)
2430
2433
2431 def write_err(self,data):
2434 def write_err(self,data):
2432 """Write a string to the default error output"""
2435 """Write a string to the default error output"""
2433 Term.cerr.write(data)
2436 Term.cerr.write(data)
2434
2437
2435 def exit(self):
2438 def exit(self):
2436 """Handle interactive exit.
2439 """Handle interactive exit.
2437
2440
2438 This method sets the exit_now attribute."""
2441 This method sets the exit_now attribute."""
2439
2442
2440 if self.rc.confirm_exit:
2443 if self.rc.confirm_exit:
2441 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2444 if self.ask_yes_no('Do you really want to exit ([y]/n)?','y'):
2442 self.exit_now = True
2445 self.exit_now = True
2443 else:
2446 else:
2444 self.exit_now = True
2447 self.exit_now = True
2445
2448
2446 def safe_execfile(self,fname,*where,**kw):
2449 def safe_execfile(self,fname,*where,**kw):
2447 """A safe version of the builtin execfile().
2450 """A safe version of the builtin execfile().
2448
2451
2449 This version will never throw an exception, and knows how to handle
2452 This version will never throw an exception, and knows how to handle
2450 ipython logs as well."""
2453 ipython logs as well."""
2451
2454
2452 def syspath_cleanup():
2455 def syspath_cleanup():
2453 """Internal cleanup routine for sys.path."""
2456 """Internal cleanup routine for sys.path."""
2454 if add_dname:
2457 if add_dname:
2455 try:
2458 try:
2456 sys.path.remove(dname)
2459 sys.path.remove(dname)
2457 except ValueError:
2460 except ValueError:
2458 # For some reason the user has already removed it, ignore.
2461 # For some reason the user has already removed it, ignore.
2459 pass
2462 pass
2460
2463
2461 fname = os.path.expanduser(fname)
2464 fname = os.path.expanduser(fname)
2462
2465
2463 # Find things also in current directory. This is needed to mimic the
2466 # Find things also in current directory. This is needed to mimic the
2464 # behavior of running a script from the system command line, where
2467 # behavior of running a script from the system command line, where
2465 # Python inserts the script's directory into sys.path
2468 # Python inserts the script's directory into sys.path
2466 dname = os.path.dirname(os.path.abspath(fname))
2469 dname = os.path.dirname(os.path.abspath(fname))
2467 add_dname = False
2470 add_dname = False
2468 if dname not in sys.path:
2471 if dname not in sys.path:
2469 sys.path.insert(0,dname)
2472 sys.path.insert(0,dname)
2470 add_dname = True
2473 add_dname = True
2471
2474
2472 try:
2475 try:
2473 xfile = open(fname)
2476 xfile = open(fname)
2474 except:
2477 except:
2475 print >> Term.cerr, \
2478 print >> Term.cerr, \
2476 'Could not open file <%s> for safe execution.' % fname
2479 'Could not open file <%s> for safe execution.' % fname
2477 syspath_cleanup()
2480 syspath_cleanup()
2478 return None
2481 return None
2479
2482
2480 kw.setdefault('islog',0)
2483 kw.setdefault('islog',0)
2481 kw.setdefault('quiet',1)
2484 kw.setdefault('quiet',1)
2482 kw.setdefault('exit_ignore',0)
2485 kw.setdefault('exit_ignore',0)
2483 first = xfile.readline()
2486 first = xfile.readline()
2484 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2487 loghead = str(self.loghead_tpl).split('\n',1)[0].strip()
2485 xfile.close()
2488 xfile.close()
2486 # line by line execution
2489 # line by line execution
2487 if first.startswith(loghead) or kw['islog']:
2490 if first.startswith(loghead) or kw['islog']:
2488 print 'Loading log file <%s> one line at a time...' % fname
2491 print 'Loading log file <%s> one line at a time...' % fname
2489 if kw['quiet']:
2492 if kw['quiet']:
2490 stdout_save = sys.stdout
2493 stdout_save = sys.stdout
2491 sys.stdout = StringIO.StringIO()
2494 sys.stdout = StringIO.StringIO()
2492 try:
2495 try:
2493 globs,locs = where[0:2]
2496 globs,locs = where[0:2]
2494 except:
2497 except:
2495 try:
2498 try:
2496 globs = locs = where[0]
2499 globs = locs = where[0]
2497 except:
2500 except:
2498 globs = locs = globals()
2501 globs = locs = globals()
2499 badblocks = []
2502 badblocks = []
2500
2503
2501 # we also need to identify indented blocks of code when replaying
2504 # we also need to identify indented blocks of code when replaying
2502 # logs and put them together before passing them to an exec
2505 # logs and put them together before passing them to an exec
2503 # statement. This takes a bit of regexp and look-ahead work in the
2506 # statement. This takes a bit of regexp and look-ahead work in the
2504 # file. It's easiest if we swallow the whole thing in memory
2507 # file. It's easiest if we swallow the whole thing in memory
2505 # first, and manually walk through the lines list moving the
2508 # first, and manually walk through the lines list moving the
2506 # counter ourselves.
2509 # counter ourselves.
2507 indent_re = re.compile('\s+\S')
2510 indent_re = re.compile('\s+\S')
2508 xfile = open(fname)
2511 xfile = open(fname)
2509 filelines = xfile.readlines()
2512 filelines = xfile.readlines()
2510 xfile.close()
2513 xfile.close()
2511 nlines = len(filelines)
2514 nlines = len(filelines)
2512 lnum = 0
2515 lnum = 0
2513 while lnum < nlines:
2516 while lnum < nlines:
2514 line = filelines[lnum]
2517 line = filelines[lnum]
2515 lnum += 1
2518 lnum += 1
2516 # don't re-insert logger status info into cache
2519 # don't re-insert logger status info into cache
2517 if line.startswith('#log#'):
2520 if line.startswith('#log#'):
2518 continue
2521 continue
2519 else:
2522 else:
2520 # build a block of code (maybe a single line) for execution
2523 # build a block of code (maybe a single line) for execution
2521 block = line
2524 block = line
2522 try:
2525 try:
2523 next = filelines[lnum] # lnum has already incremented
2526 next = filelines[lnum] # lnum has already incremented
2524 except:
2527 except:
2525 next = None
2528 next = None
2526 while next and indent_re.match(next):
2529 while next and indent_re.match(next):
2527 block += next
2530 block += next
2528 lnum += 1
2531 lnum += 1
2529 try:
2532 try:
2530 next = filelines[lnum]
2533 next = filelines[lnum]
2531 except:
2534 except:
2532 next = None
2535 next = None
2533 # now execute the block of one or more lines
2536 # now execute the block of one or more lines
2534 try:
2537 try:
2535 exec block in globs,locs
2538 exec block in globs,locs
2536 except SystemExit:
2539 except SystemExit:
2537 pass
2540 pass
2538 except:
2541 except:
2539 badblocks.append(block.rstrip())
2542 badblocks.append(block.rstrip())
2540 if kw['quiet']: # restore stdout
2543 if kw['quiet']: # restore stdout
2541 sys.stdout.close()
2544 sys.stdout.close()
2542 sys.stdout = stdout_save
2545 sys.stdout = stdout_save
2543 print 'Finished replaying log file <%s>' % fname
2546 print 'Finished replaying log file <%s>' % fname
2544 if badblocks:
2547 if badblocks:
2545 print >> sys.stderr, ('\nThe following lines/blocks in file '
2548 print >> sys.stderr, ('\nThe following lines/blocks in file '
2546 '<%s> reported errors:' % fname)
2549 '<%s> reported errors:' % fname)
2547
2550
2548 for badline in badblocks:
2551 for badline in badblocks:
2549 print >> sys.stderr, badline
2552 print >> sys.stderr, badline
2550 else: # regular file execution
2553 else: # regular file execution
2551 try:
2554 try:
2552 execfile(fname,*where)
2555 execfile(fname,*where)
2553 except SyntaxError:
2556 except SyntaxError:
2554 self.showsyntaxerror()
2557 self.showsyntaxerror()
2555 warn('Failure executing file: <%s>' % fname)
2558 warn('Failure executing file: <%s>' % fname)
2556 except SystemExit,status:
2559 except SystemExit,status:
2557 if not kw['exit_ignore']:
2560 if not kw['exit_ignore']:
2558 self.showtraceback()
2561 self.showtraceback()
2559 warn('Failure executing file: <%s>' % fname)
2562 warn('Failure executing file: <%s>' % fname)
2560 except:
2563 except:
2561 self.showtraceback()
2564 self.showtraceback()
2562 warn('Failure executing file: <%s>' % fname)
2565 warn('Failure executing file: <%s>' % fname)
2563
2566
2564 syspath_cleanup()
2567 syspath_cleanup()
2565
2568
2566 #************************* end of file <iplib.py> *****************************
2569 #************************* end of file <iplib.py> *****************************
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,381 +1,383 b''
1 """
1 """
2 Test which prefilter transformations get called for various input lines.
2 Test which prefilter transformations get called for various input lines.
3 Note that this does *not* test the transformations themselves -- it's just
3 Note that this does *not* test the transformations themselves -- it's just
4 verifying that a particular combination of, e.g. config options and escape
4 verifying that a particular combination of, e.g. config options and escape
5 chars trigger the proper handle_X transform of the input line.
5 chars trigger the proper handle_X transform of the input line.
6
6
7 Usage: run from the command line with *normal* python, not ipython:
7 Usage: run from the command line with *normal* python, not ipython:
8 > python test_prefilter.py
8 > python test_prefilter.py
9
9
10 Fairly quiet output by default. Pass in -v to get everyone's favorite dots.
10 Fairly quiet output by default. Pass in -v to get everyone's favorite dots.
11 """
11 """
12
12
13 # The prefilter always ends in a call to some self.handle_X method. We swap
13 # The prefilter always ends in a call to some self.handle_X method. We swap
14 # all of those out so that we can capture which one was called.
14 # all of those out so that we can capture which one was called.
15
15
16 import sys
16 import sys
17 import IPython
17 import IPython
18 import IPython.ipapi
18 import IPython.ipapi
19 import sys
19 import sys
20
20
21 verbose = False
21 verbose = False
22 if len(sys.argv) > 1:
22 if len(sys.argv) > 1:
23 if sys.argv[1] == '-v':
23 if sys.argv[1] == '-v':
24 sys.argv = sys.argv[:-1] # IPython is confused by -v, apparently
24 sys.argv = sys.argv[:-1] # IPython is confused by -v, apparently
25 verbose = True
25 verbose = True
26
26
27 IPython.Shell.start()
27 IPython.Shell.start()
28
28
29 ip = IPython.ipapi.get()
29 ip = IPython.ipapi.get()
30
30
31 # Collect failed tests + stats and print them at the end
31 # Collect failed tests + stats and print them at the end
32 failures = []
32 failures = []
33 num_tests = 0
33 num_tests = 0
34
34
35 # Store the results in module vars as we go
35 # Store the results in module vars as we go
36 last_line = None
36 last_line = None
37 handler_called = None
37 handler_called = None
38 def install_mock_handler(name):
38 def install_mock_handler(name):
39 """Swap out one of the IP.handle_x methods with a function which can
39 """Swap out one of the IP.handle_x methods with a function which can
40 record which handler was called and what line was produced. The mock
40 record which handler was called and what line was produced. The mock
41 handler func always returns '', which causes ipython to cease handling
41 handler func always returns '', which causes ipython to cease handling
42 the string immediately. That way, that it doesn't echo output, raise
42 the string immediately. That way, that it doesn't echo output, raise
43 exceptions, etc. But do note that testing multiline strings thus gets
43 exceptions, etc. But do note that testing multiline strings thus gets
44 a bit hard."""
44 a bit hard."""
45 def mock_handler(self, line, continue_prompt=None,
45 def mock_handler(self, line, continue_prompt=None,
46 pre=None,iFun=None,theRest=None,
46 pre=None,iFun=None,theRest=None,
47 obj=None):
47 obj=None):
48 #print "Inside %s with '%s'" % (name, line)
48 #print "Inside %s with '%s'" % (name, line)
49 global last_line, handler_called
49 global last_line, handler_called
50 last_line = line
50 last_line = line
51 handler_called = name
51 handler_called = name
52 return ''
52 return ''
53 mock_handler.name = name
53 mock_handler.name = name
54 setattr(IPython.iplib.InteractiveShell, name, mock_handler)
54 setattr(IPython.iplib.InteractiveShell, name, mock_handler)
55
55
56 install_mock_handler('handle_normal')
56 install_mock_handler('handle_normal')
57 install_mock_handler('handle_auto')
57 install_mock_handler('handle_auto')
58 install_mock_handler('handle_magic')
58 install_mock_handler('handle_magic')
59 install_mock_handler('handle_help')
59 install_mock_handler('handle_help')
60 install_mock_handler('handle_shell_escape')
60 install_mock_handler('handle_shell_escape')
61 install_mock_handler('handle_alias')
61 install_mock_handler('handle_alias')
62 install_mock_handler('handle_emacs')
62 install_mock_handler('handle_emacs')
63
63
64
64
65 def reset_esc_handlers():
65 def reset_esc_handlers():
66 """The escape handlers are stored in a hash (as an attribute of the
66 """The escape handlers are stored in a hash (as an attribute of the
67 InteractiveShell *instance*), so we have to rebuild that hash to get our
67 InteractiveShell *instance*), so we have to rebuild that hash to get our
68 new handlers in there."""
68 new handlers in there."""
69 s = ip.IP
69 s = ip.IP
70 s.esc_handlers = {s.ESC_PAREN : s.handle_auto,
70 s.esc_handlers = {s.ESC_PAREN : s.handle_auto,
71 s.ESC_QUOTE : s.handle_auto,
71 s.ESC_QUOTE : s.handle_auto,
72 s.ESC_QUOTE2 : s.handle_auto,
72 s.ESC_QUOTE2 : s.handle_auto,
73 s.ESC_MAGIC : s.handle_magic,
73 s.ESC_MAGIC : s.handle_magic,
74 s.ESC_HELP : s.handle_help,
74 s.ESC_HELP : s.handle_help,
75 s.ESC_SHELL : s.handle_shell_escape,
75 s.ESC_SHELL : s.handle_shell_escape,
76 }
76 }
77 reset_esc_handlers()
77 reset_esc_handlers()
78
78
79 # This is so I don't have to quote over and over. Gotta be a better way.
79 # This is so I don't have to quote over and over. Gotta be a better way.
80 handle_normal = 'handle_normal'
80 handle_normal = 'handle_normal'
81 handle_auto = 'handle_auto'
81 handle_auto = 'handle_auto'
82 handle_magic = 'handle_magic'
82 handle_magic = 'handle_magic'
83 handle_help = 'handle_help'
83 handle_help = 'handle_help'
84 handle_shell_escape = 'handle_shell_escape'
84 handle_shell_escape = 'handle_shell_escape'
85 handle_alias = 'handle_alias'
85 handle_alias = 'handle_alias'
86 handle_emacs = 'handle_emacs'
86 handle_emacs = 'handle_emacs'
87
87
88 def check(assertion, failure_msg):
88 def check(assertion, failure_msg):
89 """Check a boolean assertion and fail with a message if necessary. Store
89 """Check a boolean assertion and fail with a message if necessary. Store
90 an error essage in module-level failures list in case of failure. Print
90 an error essage in module-level failures list in case of failure. Print
91 '.' or 'F' if module var Verbose is true.
91 '.' or 'F' if module var Verbose is true.
92 """
92 """
93 global num_tests
93 global num_tests
94 num_tests += 1
94 num_tests += 1
95 if assertion:
95 if assertion:
96 if verbose:
96 if verbose:
97 sys.stdout.write('.')
97 sys.stdout.write('.')
98 sys.stdout.flush()
98 sys.stdout.flush()
99 else:
99 else:
100 if verbose:
100 if verbose:
101 sys.stdout.write('F')
101 sys.stdout.write('F')
102 sys.stdout.flush()
102 sys.stdout.flush()
103 failures.append(failure_msg)
103 failures.append(failure_msg)
104
104
105
105
106 def check_handler(expected_handler, line):
106 def check_handler(expected_handler, line):
107 """Verify that the expected hander was called (for the given line,
107 """Verify that the expected hander was called (for the given line,
108 passed in for failure reporting).
108 passed in for failure reporting).
109
109
110 Pulled out to its own function so that tests which don't use
110 Pulled out to its own function so that tests which don't use
111 run_handler_tests can still take advantage of it."""
111 run_handler_tests can still take advantage of it."""
112 check(handler_called == expected_handler,
112 check(handler_called == expected_handler,
113 "Expected %s to be called for %s, "
113 "Expected %s to be called for %s, "
114 "instead %s called" % (expected_handler,
114 "instead %s called" % (expected_handler,
115 repr(line),
115 repr(line),
116 handler_called))
116 handler_called))
117
117
118
118
119 def run_handler_tests(h_tests):
119 def run_handler_tests(h_tests):
120 """Loop through a series of (input_line, handler_name) pairs, verifying
120 """Loop through a series of (input_line, handler_name) pairs, verifying
121 that, for each ip calls the given handler for the given line.
121 that, for each ip calls the given handler for the given line.
122
122
123 The verbose complaint includes the line passed in, so if that line can
123 The verbose complaint includes the line passed in, so if that line can
124 include enough info to find the error, the tests are modestly
124 include enough info to find the error, the tests are modestly
125 self-documenting.
125 self-documenting.
126 """
126 """
127 for ln, expected_handler in h_tests:
127 for ln, expected_handler in h_tests:
128 global handler_called
128 global handler_called
129 handler_called = None
129 handler_called = None
130 ip.runlines(ln)
130 ip.runlines(ln)
131 check_handler(expected_handler, ln)
131 check_handler(expected_handler, ln)
132
132
133 def run_one_test(ln, expected_handler):
133 def run_one_test(ln, expected_handler):
134 run_handler_tests([(ln, expected_handler)])
134 run_handler_tests([(ln, expected_handler)])
135
135
136
136
137 # =========================================
137 # =========================================
138 # Tests
138 # Tests
139 # =========================================
139 # =========================================
140
140
141
141
142 # Fundamental escape characters + whitespace & misc
142 # Fundamental escape characters + whitespace & misc
143 # =================================================
143 # =================================================
144 esc_handler_tests = [
144 esc_handler_tests = [
145 ( '?thing', handle_help, ),
145 ( '?thing', handle_help, ),
146 ( 'thing?', handle_help ), # '?' can trail...
146 ( 'thing?', handle_help ), # '?' can trail...
147 ( 'thing!', handle_normal), # but only '?' can trail
147 ( 'thing!', handle_normal), # but only '?' can trail
148 ( '!thing?', handle_help), # trailing '?' wins if more than one
148 ( '!thing?', handle_help), # trailing '?' wins if more than one
149 ( ' ?thing', handle_help), # ignore leading whitespace
149 ( ' ?thing', handle_help), # ignore leading whitespace
150 ( '!ls', handle_shell_escape ),
150 ( '!ls', handle_shell_escape ),
151 ( '%magic', handle_magic),
151 ( '%magic', handle_magic),
152 # Possibly, add test for /,; once those are unhooked from %autocall
152 # Possibly, add test for /,; once those are unhooked from %autocall
153 ( 'emacs_mode # PYTHON-MODE', handle_emacs ),
153 ( 'emacs_mode # PYTHON-MODE', handle_emacs ),
154 ( ' ', handle_normal),
154 ( ' ', handle_normal),
155 ]
155 ]
156 run_handler_tests(esc_handler_tests)
156 run_handler_tests(esc_handler_tests)
157
157
158
158
159
159
160 # Shell Escapes in Multi-line statements
160 # Shell Escapes in Multi-line statements
161 # ======================================
161 # ======================================
162 #
162 #
163 # We can't test this via runlines, since the hacked over-handlers all
163 # We can't test this via runlines, since the hacked over-handlers all
164 # return None, so continue_prompt never becomes true. Instead we drop
164 # return None, so continue_prompt never becomes true. Instead we drop
165 # into prefilter directly and pass in continue_prompt.
165 # into prefilter directly and pass in continue_prompt.
166
166
167 old_mls = ip.options.multi_line_specials
167 old_mls = ip.options.multi_line_specials
168 ln = '!ls $f multi_line_specials on'
168 ln = '!ls $f multi_line_specials on'
169 ignore = ip.IP.prefilter(ln, continue_prompt=True)
169 ignore = ip.IP.prefilter(ln, continue_prompt=True)
170 check_handler(handle_shell_escape, ln)
170 check_handler(handle_shell_escape, ln)
171
171
172 ip.options.multi_line_specials = 0
172 ip.options.multi_line_specials = 0
173 ln = '!ls $f multi_line_specials off'
173 ln = '!ls $f multi_line_specials off'
174 ignore = ip.IP.prefilter(ln, continue_prompt=True)
174 ignore = ip.IP.prefilter(ln, continue_prompt=True)
175 check_handler(handle_normal, ln)
175 check_handler(handle_normal, ln)
176
176
177 ip.options.multi_line_specials = old_mls
177 ip.options.multi_line_specials = old_mls
178
178
179
179
180 # Automagic
180 # Automagic
181 # =========
181 # =========
182
182
183 # Pick one magic fun and one non_magic fun, make sure both exist
183 # Pick one magic fun and one non_magic fun, make sure both exist
184 assert hasattr(ip.IP, "magic_cpaste")
184 assert hasattr(ip.IP, "magic_cpaste")
185 assert not hasattr(ip.IP, "magic_does_not_exist")
185 assert not hasattr(ip.IP, "magic_does_not_exist")
186 ip.options.automagic = 0
186 ip.options.automagic = 0
187 run_handler_tests([
187 run_handler_tests([
188 # Without automagic, only shows up with explicit escape
188 # Without automagic, only shows up with explicit escape
189 ( 'cpaste', handle_normal),
189 ( 'cpaste', handle_normal),
190 ( '%cpaste', handle_magic),
190 ( '%cpaste', handle_magic),
191 ( '%does_not_exist', handle_magic)
191 ( '%does_not_exist', handle_magic)
192 ])
192 ])
193 ip.options.automagic = 1
193 ip.options.automagic = 1
194 run_handler_tests([
194 run_handler_tests([
195 ( 'cpaste', handle_magic),
195 ( 'cpaste', handle_magic),
196 ( '%cpaste', handle_magic),
196 ( '%cpaste', handle_magic),
197 ( 'does_not_exist', handle_normal),
197 ( 'does_not_exist', handle_normal),
198 ( '%does_not_exist', handle_magic)])
198 ( '%does_not_exist', handle_magic)])
199
199
200 # If next elt starts with anything that could be an assignment, func call,
200 # If next elt starts with anything that could be an assignment, func call,
201 # etc, we don't call the magic func, unless explicitly escaped to do so.
201 # etc, we don't call the magic func, unless explicitly escaped to do so.
202 magic_killing_tests = []
202 magic_killing_tests = []
203 for c in list('!=()<>,'):
203 for c in list('!=()<>,'):
204 magic_killing_tests.append(('cpaste %s killed_automagic' % c, handle_normal))
204 magic_killing_tests.append(('cpaste %s killed_automagic' % c, handle_normal))
205 magic_killing_tests.append(('%%cpaste %s escaped_magic' % c, handle_magic))
205 magic_killing_tests.append(('%%cpaste %s escaped_magic' % c, handle_magic))
206 run_handler_tests(magic_killing_tests)
206 run_handler_tests(magic_killing_tests)
207
207
208 # magic on indented continuation lines -- on iff multi_line_specials == 1
208 # magic on indented continuation lines -- on iff multi_line_specials == 1
209 ip.options.multi_line_specials = 0
209 ip.options.multi_line_specials = 0
210 ln = 'cpaste multi_line off kills magic'
210 ln = 'cpaste multi_line off kills magic'
211 ignore = ip.IP.prefilter(ln, continue_prompt=True)
211 ignore = ip.IP.prefilter(ln, continue_prompt=True)
212 check_handler(handle_normal, ln)
212 check_handler(handle_normal, ln)
213
213
214 ip.options.multi_line_specials = 1
214 ip.options.multi_line_specials = 1
215 ln = 'cpaste multi_line on enables magic'
215 ln = 'cpaste multi_line on enables magic'
216 ignore = ip.IP.prefilter(ln, continue_prompt=True)
216 ignore = ip.IP.prefilter(ln, continue_prompt=True)
217 check_handler(handle_magic, ln)
217 check_handler(handle_magic, ln)
218
218
219 # user namespace shadows the magic one unless shell escaped
219 # user namespace shadows the magic one unless shell escaped
220 ip.user_ns['cpaste'] = 'user_ns'
220 ip.user_ns['cpaste'] = 'user_ns'
221 run_handler_tests([
221 run_handler_tests([
222 ( 'cpaste', handle_normal),
222 ( 'cpaste', handle_normal),
223 ( '%cpaste', handle_magic)])
223 ( '%cpaste', handle_magic)])
224 del ip.user_ns['cpaste']
224 del ip.user_ns['cpaste']
225
225
226
226
227 # Check for !=() turning off .ofind
227 # Check for !=() turning off .ofind
228 # =================================
228 # =================================
229 class AttributeMutator(object):
229 class AttributeMutator(object):
230 """A class which will be modified on attribute access, to test ofind"""
230 """A class which will be modified on attribute access, to test ofind"""
231 def __init__(self):
231 def __init__(self):
232 self.called = False
232 self.called = False
233
233
234 def getFoo(self): self.called = True
234 def getFoo(self): self.called = True
235 foo = property(getFoo)
235 foo = property(getFoo)
236
236
237 attr_mutator = AttributeMutator()
237 attr_mutator = AttributeMutator()
238 ip.to_user_ns('attr_mutator')
238 ip.to_user_ns('attr_mutator')
239
239
240 ip.options.autocall = 1
240 ip.options.autocall = 1
241
241
242 run_one_test('attr_mutator.foo should mutate', handle_normal)
242 run_one_test('attr_mutator.foo should mutate', handle_normal)
243 check(attr_mutator.called, 'ofind should be called in absence of assign characters')
243 check(attr_mutator.called, 'ofind should be called in absence of assign characters')
244
244
245 for c in list('!=()'): # XXX What about <> -- they *are* important above
245 for c in list('!=()'): # XXX What about <> -- they *are* important above
246 attr_mutator.called = False
246 attr_mutator.called = False
247 run_one_test('attr_mutator.foo %s should *not* mutate' % c, handle_normal)
247 run_one_test('attr_mutator.foo %s should *not* mutate' % c, handle_normal)
248 run_one_test('attr_mutator.foo%s should *not* mutate' % c, handle_normal)
249
248 check(not attr_mutator.called,
250 check(not attr_mutator.called,
249 'ofind should not be called near character %s' % c)
251 'ofind should not be called near character %s' % c)
250
252
251
253
252
254
253 # Alias expansion
255 # Alias expansion
254 # ===============
256 # ===============
255
257
256 # With autocall on or off, aliases should be shadowed by user, internal and
258 # With autocall on or off, aliases should be shadowed by user, internal and
257 # __builtin__ namespaces
259 # __builtin__ namespaces
258 #
260 #
259 # XXX Can aliases have '.' in their name? With autocall off, that works,
261 # XXX Can aliases have '.' in their name? With autocall off, that works,
260 # with autocall on, it doesn't. Hmmm.
262 # with autocall on, it doesn't. Hmmm.
261 import __builtin__
263 import __builtin__
262 for ac_state in [0,1]:
264 for ac_state in [0,1]:
263 ip.options.autocall = ac_state
265 ip.options.autocall = ac_state
264 ip.IP.alias_table['alias_cmd'] = 'alias_result'
266 ip.IP.alias_table['alias_cmd'] = 'alias_result'
265 ip.IP.alias_table['alias_head.with_dot'] = 'alias_result'
267 ip.IP.alias_table['alias_head.with_dot'] = 'alias_result'
266 run_handler_tests([
268 run_handler_tests([
267 ("alias_cmd", handle_alias),
269 ("alias_cmd", handle_alias),
268 # XXX See note above
270 # XXX See note above
269 #("alias_head.with_dot unshadowed, autocall=%s" % ac_state, handle_alias),
271 #("alias_head.with_dot unshadowed, autocall=%s" % ac_state, handle_alias),
270 ("alias_cmd.something aliases must match whole expr", handle_normal),
272 ("alias_cmd.something aliases must match whole expr", handle_normal),
271 ])
273 ])
272
274
273 for ns in [ip.user_ns, ip.IP.internal_ns, __builtin__.__dict__ ]:
275 for ns in [ip.user_ns, ip.IP.internal_ns, __builtin__.__dict__ ]:
274 ns['alias_cmd'] = 'a user value'
276 ns['alias_cmd'] = 'a user value'
275 ns['alias_head'] = 'a user value'
277 ns['alias_head'] = 'a user value'
276 run_handler_tests([
278 run_handler_tests([
277 ("alias_cmd", handle_normal),
279 ("alias_cmd", handle_normal),
278 ("alias_head.with_dot", handle_normal)])
280 ("alias_head.with_dot", handle_normal)])
279 del ns['alias_cmd']
281 del ns['alias_cmd']
280 del ns['alias_head']
282 del ns['alias_head']
281
283
282 ip.options.autocall = 1
284 ip.options.autocall = 1
283
285
284
286
285
287
286
288
287 # Autocall
289 # Autocall
288 # ========
290 # ========
289
291
290 # First, with autocalling fully off
292 # First, with autocalling fully off
291 ip.options.autocall = 0
293 ip.options.autocall = 0
292 run_handler_tests( [
294 run_handler_tests( [
293 # Since len is callable, these *should* get auto-called
295 # Since len is callable, these *should* get auto-called
294
296
295 # XXX Except, at the moment, they're *not*, because the code is wrong
297 # XXX Except, at the moment, they're *not*, because the code is wrong
296 # XXX So I'm commenting 'em out to keep the tests quiet
298 # XXX So I'm commenting 'em out to keep the tests quiet
297
299
298 #( '/len autocall_0', handle_auto),
300 #( '/len autocall_0', handle_auto),
299 #( ',len autocall_0 b0', handle_auto),
301 #( ',len autocall_0 b0', handle_auto),
300 #( ';len autocall_0 b0', handle_auto),
302 #( ';len autocall_0 b0', handle_auto),
301
303
302 # But these, since fun is not a callable, should *not* get auto-called
304 # But these, since fun is not a callable, should *not* get auto-called
303 ( '/fun autocall_0', handle_normal),
305 ( '/fun autocall_0', handle_normal),
304 ( ',fun autocall_0 b0', handle_normal),
306 ( ',fun autocall_0 b0', handle_normal),
305 ( ';fun autocall_0 b0', handle_normal),
307 ( ';fun autocall_0 b0', handle_normal),
306
308
307 # With no escapes, no autocalling should happen, callable or not
309 # With no escapes, no autocalling should happen, callable or not
308 ( 'len autocall_0', handle_normal),
310 ( 'len autocall_0', handle_normal),
309 ( 'fun autocall_0', handle_normal),
311 ( 'fun autocall_0', handle_normal),
310 ])
312 ])
311
313
312
314
313 # Now, with autocall in default, 'smart' mode
315 # Now, with autocall in default, 'smart' mode
314 ip.options.autocall = 1
316 ip.options.autocall = 1
315 run_handler_tests( [
317 run_handler_tests( [
316 # Since len is callable, these *do* get auto-called
318 # Since len is callable, these *do* get auto-called
317 ( '/len a1', handle_auto),
319 ( '/len a1', handle_auto),
318 ( ',len a1 b1', handle_auto),
320 ( ',len a1 b1', handle_auto),
319 ( ';len a1 b1', handle_auto),
321 ( ';len a1 b1', handle_auto),
320 # But these, since fun is not a callable, should *not* get auto-called
322 # But these, since fun is not a callable, should *not* get auto-called
321 ( '/fun a1', handle_normal),
323 ( '/fun a1', handle_normal),
322 ( ',fun a1 b1', handle_normal),
324 ( ',fun a1 b1', handle_normal),
323 ( ';fun a1 b1', handle_normal),
325 ( ';fun a1 b1', handle_normal),
324 # Autocalls without escapes
326 # Autocalls without escapes
325 ( 'len a1', handle_auto),
327 ( 'len a1', handle_auto),
326 ( 'fun a1', handle_normal), # Not callable -> no add
328 ( 'fun a1', handle_normal), # Not callable -> no add
327 # Autocalls only happen on things which look like funcs, even if
329 # Autocalls only happen on things which look like funcs, even if
328 # explicitly requested. Which, in this case means they look like a
330 # explicitly requested. Which, in this case means they look like a
329 # sequence of identifiers and . attribute references. So the second
331 # sequence of identifiers and . attribute references. So the second
330 # test should pass, but it's not at the moment (meaning, IPython is
332 # test should pass, but it's not at the moment (meaning, IPython is
331 # attempting to run an autocall). Though it does blow up in ipython
333 # attempting to run an autocall). Though it does blow up in ipython
332 # later (because of how lines are split, I think).
334 # later (because of how lines are split, I think).
333 ( '"abc".join range(4)', handle_normal),
335 ( '"abc".join range(4)', handle_normal),
334 # XXX ( '/"abc".join range(4)', handle_normal),
336 # XXX ( '/"abc".join range(4)', handle_normal),
335 ])
337 ])
336
338
337
339
338 # No tests for autocall = 2, since the extra magic there happens inside the
340 # No tests for autocall = 2, since the extra magic there happens inside the
339 # handle_auto function, which our test doesn't examine.
341 # handle_auto function, which our test doesn't examine.
340
342
341 # Note that we leave autocall in default, 1, 'smart' mode
343 # Note that we leave autocall in default, 1, 'smart' mode
342
344
343
345
344 # Autocall / Binary operators
346 # Autocall / Binary operators
345 # ==========================
347 # ==========================
346
348
347 # Even with autocall on, 'len in thing' won't transform.
349 # Even with autocall on, 'len in thing' won't transform.
348 # But ';len in thing' will
350 # But ';len in thing' will
349
351
350 # Note, the tests below don't check for multi-char ops. It could.
352 # Note, the tests below don't check for multi-char ops. It could.
351
353
352 # XXX % is a binary op and should be in the list, too, but fails
354 # XXX % is a binary op and should be in the list, too, but fails
353 bin_ops = list(r'<>,&^|*/+-') + 'is not in and or'.split()
355 bin_ops = list(r'<>,&^|*/+-') + 'is not in and or'.split()
354 bin_tests = []
356 bin_tests = []
355 for b in bin_ops:
357 for b in bin_ops:
356 bin_tests.append(('len %s binop_autocall' % b, handle_normal))
358 bin_tests.append(('len %s binop_autocall' % b, handle_normal))
357 bin_tests.append((';len %s binop_autocall' % b, handle_auto))
359 bin_tests.append((';len %s binop_autocall' % b, handle_auto))
358 bin_tests.append((',len %s binop_autocall' % b, handle_auto))
360 bin_tests.append((',len %s binop_autocall' % b, handle_auto))
359 bin_tests.append(('/len %s binop_autocall' % b, handle_auto))
361 bin_tests.append(('/len %s binop_autocall' % b, handle_auto))
360
362
361 # Who loves auto-generating tests?
363 # Who loves auto-generating tests?
362 run_handler_tests(bin_tests)
364 run_handler_tests(bin_tests)
363
365
364
366
365 # Possibly add tests for namespace shadowing (really ofind's business?).
367 # Possibly add tests for namespace shadowing (really ofind's business?).
366 #
368 #
367 # user > ipython internal > python builtin > alias > magic
369 # user > ipython internal > python builtin > alias > magic
368
370
369
371
370 # ============
372 # ============
371 # Test Summary
373 # Test Summary
372 # ============
374 # ============
373 num_f = len(failures)
375 num_f = len(failures)
374 if verbose:
376 if verbose:
375 print
377 print
376 print "%s tests run, %s failure%s" % (num_tests,
378 print "%s tests run, %s failure%s" % (num_tests,
377 num_f,
379 num_f,
378 num_f != 1 and "s" or "")
380 num_f != 1 and "s" or "")
379 for f in failures:
381 for f in failures:
380 print f
382 print f
381
383
General Comments 0
You need to be logged in to leave comments. Login now