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