##// END OF EJS Templates
Last set of Rocky's patches for pydb integration
vivainio -
Show More
@@ -15,7 +15,7 b' details on the PSF (Python Software Foundation) standard license, see:'
15 15
16 16 http://www.python.org/2.2.3/license.html
17 17
18 $Id: Debugger.py 1787 2006-09-27 06:56:29Z fperez $"""
18 $Id: Debugger.py 1853 2006-10-30 17:00:39Z vivainio $"""
19 19
20 20 #*****************************************************************************
21 21 #
@@ -40,13 +40,41 b' import bdb'
40 40 import cmd
41 41 import linecache
42 42 import os
43 import pdb
44 43 import sys
45 44
46 45 from IPython import PyColorize, ColorANSI
47 46 from IPython.genutils import Term
48 47 from IPython.excolors import ExceptionColors
49 48
49 # See if we can use pydb.
50 has_pydb = False
51 prompt = 'ipdb>'
52 if sys.version[:3] >= '2.5':
53 try:
54 import pydb
55 if hasattr(pydb.pydb, "runl"):
56 has_pydb = True
57 from pydb import Pdb as OldPdb
58 prompt = 'ipydb>'
59 except ImportError:
60 pass
61
62 if has_pydb:
63 from pydb import Pdb as OldPdb
64 else:
65 from pdb import Pdb as OldPdb
66
67 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
68 """Make new_fn have old_fn's doc string. This is particularly useful
69 for the do_... commands that hook into the help system.
70 Adapted from from a comp.lang.python posting
71 by Duncan Booth."""
72 def wrapper(*args, **kw):
73 return new_fn(*args, **kw)
74 if old_fn.__doc__:
75 wrapper.__doc__ = old_fn.__doc__ + additional_text
76 return wrapper
77
50 78 def _file_lines(fname):
51 79 """Return the contents of a named file as a list of lines.
52 80
@@ -62,7 +90,7 b' def _file_lines(fname):'
62 90 outfile.close()
63 91 return out
64 92
65 class Pdb(pdb.Pdb):
93 class Pdb(OldPdb):
66 94 """Modified Pdb class, does not load readline."""
67 95
68 96 if sys.version[:3] >= '2.5':
@@ -70,10 +98,33 b' class Pdb(pdb.Pdb):'
70 98 stdin=None, stdout=None):
71 99
72 100 # Parent constructor:
73 pdb.Pdb.__init__(self,completekey,stdin,stdout)
101 OldPdb.__init__(self,completekey,stdin,stdout)
74 102
75 103 # IPython changes...
76 self.prompt = 'ipdb> ' # The default prompt is '(Pdb)'
104 self.prompt = prompt # The default prompt is '(Pdb)'
105 self.is_pydb = prompt == 'ipydb>'
106
107 if self.is_pydb:
108
109 # iplib.py's ipalias seems to want pdb's checkline
110 # which located in pydb.fn
111 import pydb.fns
112 self.checkline = lambda filename, lineno: \
113 pydb.fns.checkline(self, filename, lineno)
114
115 self.curframe = None
116 self.do_restart = self.new_do_restart
117
118 self.old_all_completions = __IPYTHON__.Completer.all_completions
119 __IPYTHON__.Completer.all_completions=self.all_completions
120
121 # Do we have access to pydb's list command parser?
122 self.do_list = decorate_fn_with_doc(self.list_command_pydb,
123 OldPdb.do_list)
124 self.do_l = self.do_list
125 self.do_frame = decorate_fn_with_doc(self.new_do_frame,
126 OldPdb.do_frame)
127
77 128 self.aliases = {}
78 129
79 130 # Create color table: we copy the default one from the traceback
@@ -143,17 +194,34 b' class Pdb(pdb.Pdb):'
143 194
144 195 def interaction(self, frame, traceback):
145 196 __IPYTHON__.set_completer_frame(frame)
146 pdb.Pdb.interaction(self, frame, traceback)
197 OldPdb.interaction(self, frame, traceback)
198
199 def new_do_up(self, arg):
200 OldPdb.do_up(self, arg)
201 __IPYTHON__.set_completer_frame(self.curframe)
202 do_u = do_up = decorate_fn_with_doc(new_do_up, OldPdb.do_up)
147 203
148 def do_up(self, arg):
149 pdb.Pdb.do_up(self, arg)
204 def new_do_down(self, arg):
205 OldPdb.do_down(self, arg)
150 206 __IPYTHON__.set_completer_frame(self.curframe)
151 do_u = do_up
152 207
153 def do_down(self, arg):
154 pdb.Pdb.do_down(self, arg)
208 do_d = do_down = decorate_fn_with_doc(new_do_down, OldPdb.do_down)
209
210 def new_do_frame(self, arg):
211 OldPdb.do_frame(self, arg)
155 212 __IPYTHON__.set_completer_frame(self.curframe)
156 do_d = do_down
213
214 def new_do_quit(self, arg):
215 __IPYTHON__.Completer.all_completions=self.old_all_completions
216 return OldPdb.do_quit(self, arg)
217
218 do_q = do_quit = decorate_fn_with_doc(new_do_quit, OldPdb.do_quit)
219
220 def new_do_restart(self, arg):
221 """Restart command. In the context of ipython this is exactly the same
222 thing as 'quit'."""
223 self.msg("Restart doesn't make sense here. Using 'quit' instead.")
224 return self.do_quit(arg)
157 225
158 226 def postloop(self):
159 227 __IPYTHON__.set_completer_frame(None)
@@ -263,6 +331,39 b' class Pdb(pdb.Pdb):'
263 331
264 332 return line
265 333
334 def list_command_pydb(self, arg):
335 """List command to use if we have a newer pydb installed"""
336 filename, first, last = OldPdb.parse_list_cmd(self, arg)
337 if filename is not None:
338 self.print_list_lines(filename, first, last)
339
340 def print_list_lines(self, filename, first, last):
341 """The printing (as opposed to the parsing part of a 'list'
342 command."""
343 try:
344 Colors = self.color_scheme_table.active_colors
345 ColorsNormal = Colors.Normal
346 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
347 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
348 src = []
349 for lineno in range(first, last+1):
350 line = linecache.getline(filename, lineno)
351 if not line:
352 break
353
354 if lineno == self.curframe.f_lineno:
355 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
356 else:
357 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
358
359 src.append(line)
360 self.lineno = lineno
361
362 print >>Term.cout, ''.join(src)
363
364 except KeyboardInterrupt:
365 pass
366
266 367 def do_list(self, arg):
267 368 self.lastcmd = 'list'
268 369 last = None
@@ -287,29 +388,24 b' class Pdb(pdb.Pdb):'
287 388 first = self.lineno + 1
288 389 if last is None:
289 390 last = first + 10
290 filename = self.curframe.f_code.co_filename
291 try:
292 Colors = self.color_scheme_table.active_colors
293 ColorsNormal = Colors.Normal
294 tpl_line = '%%s%s%%s %s%%s' % (Colors.lineno, ColorsNormal)
295 tpl_line_em = '%%s%s%%s %s%%s%s' % (Colors.linenoEm, Colors.line, ColorsNormal)
296 src = []
297 for lineno in range(first, last+1):
298 line = linecache.getline(filename, lineno)
299 if not line:
300 break
301
302 if lineno == self.curframe.f_lineno:
303 line = self.__format_line(tpl_line_em, filename, lineno, line, arrow = True)
304 else:
305 line = self.__format_line(tpl_line, filename, lineno, line, arrow = False)
306
307 src.append(line)
308 self.lineno = lineno
309
310 print >>Term.cout, ''.join(src)
311
312 except KeyboardInterrupt:
313 pass
391 self.print_list_lines(self.curframe.f_code.co_filename, first, last)
314 392
315 393 do_l = do_list
394
395 def do_pdef(self, arg):
396 """The debugger interface to magic_pdef"""
397 namespaces = [('Locals', self.curframe.f_locals),
398 ('Globals', self.curframe.f_globals)]
399 __IPYTHON__.magic_pdef(arg, namespaces=namespaces)
400
401 def do_pdoc(self, arg):
402 """The debugger interface to magic_pdoc"""
403 namespaces = [('Locals', self.curframe.f_locals),
404 ('Globals', self.curframe.f_globals)]
405 __IPYTHON__.magic_pdoc(arg, namespaces=namespaces)
406
407 def do_pinfo(self, arg):
408 """The debugger equivalant of ?obj"""
409 namespaces = [('Locals', self.curframe.f_locals),
410 ('Globals', self.curframe.f_globals)]
411 __IPYTHON__.magic_pinfo("pinfo %s" % arg, namespaces=namespaces)
@@ -6,7 +6,7 b' Requires Python 2.3 or newer.'
6 6
7 7 This file contains all the classes and helper functions specific to IPython.
8 8
9 $Id: iplib.py 1850 2006-10-28 19:48:13Z fptest $
9 $Id: iplib.py 1853 2006-10-30 17:00:39Z vivainio $
10 10 """
11 11
12 12 #*****************************************************************************
@@ -47,7 +47,6 b' import inspect'
47 47 import keyword
48 48 import new
49 49 import os
50 import pdb
51 50 import pydoc
52 51 import re
53 52 import shutil
@@ -1361,11 +1360,20 b' want to merge them back into the new files.""" % locals()'
1361 1360 self.SyntaxTB(etype,value,[])
1362 1361
1363 1362 def debugger(self):
1364 """Call the pdb debugger."""
1363 """Call the pydb/pdb debugger."""
1365 1364
1366 1365 if not self.rc.pdb:
1367 1366 return
1368 pdb.pm()
1367 have_pydb = False
1368 if sys.version[:3] >= '2.5':
1369 try:
1370 from pydb import pm
1371 have_pydb = True
1372 except ImportError:
1373 pass
1374 if not have_pydb:
1375 from pdb import pm
1376 pm()
1369 1377
1370 1378 def showtraceback(self,exc_tuple = None,filename=None,tb_offset=None):
1371 1379 """Display the exception that just occurred.
@@ -1,3 +1,9 b''
1 2006-10-30 Ville Vainio <vivainio@gmail.com>
2
3 * Debugger.py, iplib.py (debugger()): Add last set of Rocky
4 Bernsteins's patches for pydb integration.
5 http://bashdb.sourceforge.net/pydb/
6
1 7 2006-10-28 Fernando Perez <Fernando.Perez@colorado.edu>
2 8
3 9 * IPython/UserConfig/ipythonrc-scipy: minor clenaups to remove old
@@ -22,7 +28,7 b''
22 28 file around %run commands to prevent side effects from
23 29 %runned programs that might use readline (e.g. pydb).
24 30
25 * extensions/pydb_ipy.py: Adds %pydb magic when imported, for
31 * extensions/ipy_pydb.py: Adds %pydb magic when imported, for
26 32 invoking the pydb enhanced debugger.
27 33
28 34 2006-10-23 Walter Doerwald <walter@livinglogic.de>
General Comments 0
You need to be logged in to leave comments. Login now