diff -r cbbe6bd85e49 Lib/bdb.py --- a/Lib/bdb.py Wed Apr 01 18:35:03 2009 -0400 +++ b/Lib/bdb.py Thu Apr 02 16:17:41 2009 -0400 @@ -1,5 +1,6 @@ """Debugger basics""" +import fnmatch import sys import os import types @@ -19,7 +20,8 @@ The standard debugger class (pdb.Pdb) is an example. """ - def __init__(self): + def __init__(self, skip=None): + self.skip = skip self.breaks = {} self.fncache = {} @@ -94,9 +96,17 @@ # methods, but they may if they want to redefine the # definition of stopping and breakpoints. + def is_skipped_module(self, module_name): + for pattern in self.skip: + if fnmatch.fnmatch(module_name, pattern): + return True + return False + def stop_here(self, frame): # (CT) stopframe may now also be None, see dispatch_call. # (CT) the former test for None is therefore removed from here. + if self.skip and self.is_skipped_module(frame.f_globals['__name__']): + return False if frame is self.stopframe: return frame.f_lineno >= self.stoplineno while frame is not None and frame is not self.stopframe: diff -r cbbe6bd85e49 Lib/pdb.py --- a/Lib/pdb.py Wed Apr 01 18:35:03 2009 -0400 +++ b/Lib/pdb.py Thu Apr 02 16:17:41 2009 -0400 @@ -58,8 +58,8 @@ class Pdb(bdb.Bdb, cmd.Cmd): - def __init__(self, completekey='tab', stdin=None, stdout=None): - bdb.Bdb.__init__(self) + def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None): + bdb.Bdb.__init__(self, skip=skip) cmd.Cmd.__init__(self, completekey, stdin, stdout) if stdout: self.use_rawinput = 0 diff -r cbbe6bd85e49 Lib/test/test_pdb.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/test/test_pdb.py Thu Apr 02 16:17:41 2009 -0400 @@ -0,0 +1,97 @@ +# Write a doctest that validates skipping of specified test modules + +import imp +import os +import sys +import doctest +import tempfile + +from test import test_support +from test_doctest import _FakeInput + + +def test_pdb_skip_modules(): + """This illustrates the simple case of module skipping. + + >>> def skip_module(): + ... import string + ... import pdb;pdb.Pdb(skip=['string*']).set_trace() + ... string.lower('FOO') + >>> real_stdin = sys.stdin + >>> sys.stdin = _FakeInput([ + ... 'step', + ... 'continue', + ... ]) + + >>> try: + ... skip_module() + ... finally: + ... sys.stdin = real_stdin + > (4)skip_module() + -> string.lower('FOO') + (Pdb) step + --Return-- + > (4)skip_module()->None + -> string.lower('FOO') + (Pdb) continue +""" + + +# Module for testing skipping of module that makes a callaback +mod = imp.new_module('module_to_skip') +exec 'def foo_pony(callback): x = 1; callback(); return None' in mod.__dict__ + + +def test_pdb_skip_modules_with_callback(): + """This illustrates skipping of modules that call into other code. + + >>> def skip_module(): + ... def callback(): + ... return None + ... import pdb;pdb.Pdb(skip=['module_to_skip*']).set_trace() + ... mod.foo_pony(callback) + >>> real_stdin = sys.stdin + >>> sys.stdin = _FakeInput([ + ... 'step', + ... 'step', + ... 'step', + ... 'step', + ... 'step', + ... 'continue', + ... ]) + + >>> try: + ... skip_module() + ... finally: + ... sys.stdin = real_stdin + > (5)skip_module() + -> mod.foo_pony(callback) + (Pdb) step + --Call-- + > (2)callback() + -> def callback(): + (Pdb) step + > (3)callback() + -> return None + (Pdb) step + --Return-- + > (3)callback()->None + -> return None + (Pdb) step + --Return-- + > (5)skip_module()->None + -> mod.foo_pony(callback) + (Pdb) step + > (4)() + -> sys.stdin = real_stdin + (Pdb) continue +""" + + +def test_main(): + from test import test_pdb + test_support.run_doctest(test_pdb, verbosity=True) + + +if __name__ == '__main__': + test_main()