##// END OF EJS Templates
Add support for set_trace-like functionality, but with IPython's enhanced...
fperez -
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 1961 2006-12-05 21:02:40Z vivainio $"""
18 $Id: Debugger.py 2014 2007-01-05 10:36:58Z fperez $"""
19 19
20 20 #*****************************************************************************
21 21 #
@@ -42,7 +42,7 b' import linecache'
42 42 import os
43 43 import sys
44 44
45 from IPython import PyColorize, ColorANSI
45 from IPython import PyColorize, ColorANSI, ipapi
46 46 from IPython.genutils import Term
47 47 from IPython.excolors import ExceptionColors
48 48
@@ -63,6 +63,86 b' if has_pydb:'
63 63 else:
64 64 from pdb import Pdb as OldPdb
65 65
66 # Allow the set_trace code to operate outside of an ipython instance, even if
67 # it does so with some limitations. The rest of this support is implemented in
68 # the Tracer constructor.
69 def BdbQuit_excepthook(et,ev,tb):
70 if et==bdb.BdbQuit:
71 print 'Exiting Debugger.'
72 else:
73 ehook.excepthook_ori(et,ev,tb)
74
75 def BdbQuit_IPython_excepthook(self,et,ev,tb):
76 print 'Exiting Debugger.'
77
78 class Tracer(object):
79 """Class for local debugging, similar to pdb.set_trace.
80
81 Instances of this class, when called, behave like pdb.set_trace, but
82 providing IPython's enhanced capabilities.
83
84 This is implemented as a class which must be initialized in your own code
85 and not as a standalone function because we need to detect at runtime
86 whether IPython is already active or not. That detection is done in the
87 constructor, ensuring that this code plays nicely with a running IPython,
88 while functioning acceptably (though with limitations) if outside of it.
89 """
90
91 def __init__(self,colors=None):
92 """Create a local debugger instance.
93
94 :Parameters:
95
96 - `colors` (None): a string containing the name of the color scheme to
97 use, it must be one of IPython's valid color schemes. If not given, the
98 function will default to the current IPython scheme when running inside
99 IPython, and to 'NoColor' otherwise.
100
101 Usage example:
102
103 from IPython.Debugger import Tracer; debug_here = Tracer()
104
105 ... later in your code
106 debug_here() # -> will open up the debugger at that point.
107
108 Once the debugger activates, you can use all of its regular commands to
109 step through code, set breakpoints, etc. See the pdb documentation
110 from the Python standard library for usage details.
111 """
112
113 global __IPYTHON__
114 try:
115 __IPYTHON__
116 except NameError:
117 # Outside of ipython, we set our own exception hook manually
118 __IPYTHON__ = ipapi.get(True,False)
119 BdbQuit_excepthook.excepthook_ori = sys.excepthook
120 sys.excepthook = BdbQuit_excepthook
121 def_colors = 'NoColor'
122 try:
123 # Limited tab completion support
124 import rlcompleter,readline
125 readline.parse_and_bind('tab: complete')
126 except ImportError:
127 pass
128 else:
129 # In ipython, we use its custom exception handler mechanism
130 ip = ipapi.get()
131 def_colors = ip.options.colors
132 ip.set_custom_exc((bdb.BdbQuit,),BdbQuit_IPython_excepthook)
133
134 if colors is None:
135 colors = def_colors
136 self.debugger = Pdb(colors)
137
138 def __call__(self):
139 """Starts an interactive debugger at the point where called.
140
141 This is similar to the pdb.set_trace() function from the std lib, but
142 using IPython's enhanced debugger."""
143
144 self.debugger.set_trace(sys._getframe().f_back)
145
66 146 def decorate_fn_with_doc(new_fn, old_fn, additional_text=""):
67 147 """Make new_fn have old_fn's doc string. This is particularly useful
68 148 for the do_... commands that hook into the help system.
@@ -172,6 +252,7 b' class Pdb(OldPdb):'
172 252
173 253 # Create color table: we copy the default one from the traceback
174 254 # module and add a few attributes needed for debugging
255 ExceptionColors.set_active_scheme(color_scheme)
175 256 self.color_scheme_table = ExceptionColors.copy()
176 257
177 258 # shorthands
@@ -91,6 +91,12 b' class IPythonNotRunning:'
91 91 without ipython. Obviously code which uses the ipython object for
92 92 computations will not work, but this allows a wider range of code to
93 93 transparently work whether ipython is being used or not."""
94
95 def __init__(self,warn=True):
96 if warn:
97 self.dummy = self._dummy_warn
98 else:
99 self.dummy = self._dummy_silent
94 100
95 101 def __str__(self):
96 102 return "<IPythonNotRunning>"
@@ -100,26 +106,33 b' class IPythonNotRunning:'
100 106 def __getattr__(self,name):
101 107 return self.dummy
102 108
103 def dummy(self,*args,**kw):
109 def _dummy_warn(self,*args,**kw):
104 110 """Dummy function, which doesn't do anything but warn."""
111
105 112 warn("IPython is not running, this is a dummy no-op function")
106 113
114 def _dummy_silent(self,*args,**kw):
115 """Dummy function, which doesn't do anything and emits no warnings."""
116 pass
117
107 118 _recent = None
108 119
109 120
110 def get(allow_dummy=False):
121 def get(allow_dummy=False,dummy_warn=True):
111 122 """Get an IPApi object.
112 123
113 124 If allow_dummy is true, returns an instance of IPythonNotRunning
114 125 instead of None if not running under IPython.
115 126
127 If dummy_warn is false, the dummy instance will be completely silent.
128
116 129 Running this should be the first thing you do when writing extensions that
117 130 can be imported as normal modules. You can then direct all the
118 131 configuration operations against the returned object.
119 132 """
120 133 global _recent
121 134 if allow_dummy and not _recent:
122 _recent = IPythonNotRunning()
135 _recent = IPythonNotRunning(dummy_warn)
123 136 return _recent
124 137
125 138 class IPApi:
@@ -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 1977 2006-12-11 16:52:12Z fperez $
9 $Id: iplib.py 2014 2007-01-05 10:36:58Z fperez $
10 10 """
11 11
12 12 #*****************************************************************************
@@ -1460,6 +1460,7 b' want to merge them back into the new files.""" % locals()'
1460 1460 etype, value, tb = sys.exc_info()
1461 1461 else:
1462 1462 etype, value, tb = exc_tuple
1463
1463 1464 if etype is SyntaxError:
1464 1465 self.showsyntaxerror(filename)
1465 1466 else:
@@ -1470,11 +1471,14 b' want to merge them back into the new files.""" % locals()'
1470 1471 sys.last_type = etype
1471 1472 sys.last_value = value
1472 1473 sys.last_traceback = tb
1473
1474 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1475 if self.InteractiveTB.call_pdb and self.has_readline:
1476 # pdb mucks up readline, fix it back
1477 self.readline.set_completer(self.Completer.complete)
1474
1475 if etype in self.custom_exceptions:
1476 self.CustomTB(etype,value,tb)
1477 else:
1478 self.InteractiveTB(etype,value,tb,tb_offset=tb_offset)
1479 if self.InteractiveTB.call_pdb and self.has_readline:
1480 # pdb mucks up readline, fix it back
1481 self.readline.set_completer(self.Completer.complete)
1478 1482
1479 1483 def mainloop(self,banner=None):
1480 1484 """Creates the local namespace and starts the mainloop.
@@ -1,3 +1,12 b''
1 2007-01-05 Fernando Perez <Fernando.Perez@colorado.edu>
2
3 * IPython/iplib.py (showtraceback): ensure that we correctly call
4 custom handlers in all cases (some with pdb were slipping through,
5 but I'm not exactly sure why).
6
7 * IPython/Debugger.py (Tracer.__init__): added new class to
8 support set_trace-like usage of IPython's enhanced debugger.
9
1 10 2006-12-24 Ville Vainio <vivainio@gmail.com>
2 11
3 12 * ipmaker.py: more informative message when ipy_user_conf
@@ -12,7 +12,7 b' cd ~/ipython/ipython'
12 12 ./setup.py sdist --formats=gztar
13 13
14 14 # Build rpm
15 python2.4 ./setup.py bdist_rpm --binary-only --release=py24 --python=/usr/bin/python2.4
15 #python2.4 ./setup.py bdist_rpm --binary-only --release=py24 --python=/usr/bin/python2.4
16 16
17 17 # Build eggs
18 18 ./eggsetup.py bdist_egg
@@ -1,6 +1,6 b''
1 1 #!/bin/sh
2 2
3 3 # clean public testing/ dir and upload
4 ssh "rm -f ipython@ipython.scipy.org:www/dist/testing/*"
4 #ssh "rm -f ipython@ipython.scipy.org:www/dist/testing/*"
5 5 cd ~/ipython/ipython/dist
6 6 scp * ipython@ipython.scipy.org:www/dist/testing/
General Comments 0
You need to be logged in to leave comments. Login now