# Debug: drop into pdb on errors or failures

This plugin provides `--pdb` and `--pdb-failures` options. The `--pdb` option will drop the test runner into pdb when it encounters an error. To drop into pdb on failure, use `--pdb-failures`.

## Options

`--pdb```

  Drop into debugger on failures or errors

`--pdb-failures```

  Drop into debugger on failures

`--pdb-errors```

  Drop into debugger on errors

## Plugin

class `nose.plugins.debug.``Pdb`

  Bases: `nose.plugins.base.Plugin`

  Provides –pdb and –pdb-failures options that cause the test runner to drop into pdb if it encounters an error or failure, respectively.

  `addError`(test, err)

    Enter pdb if configured to debug errors.

  `addFailure`(test, err)

    Enter pdb if configured to debug failures.

  `configure`(options, conf)

    Configure which kinds of exceptions trigger plugin.

  `options`(parser, env)

    Register commandline options.

## Source

    """
    This plugin provides ``--pdb`` and ``--pdb-failures`` options. The ``--pdb``
    option will drop the test runner into pdb when it encounters an error. To
    drop into pdb on failure, use ``--pdb-failures``.
    """

    import pdb
    from nose.plugins.base import Plugin

    class Pdb(Plugin):
        """
        Provides --pdb and --pdb-failures options that cause the test runner to
        drop into pdb if it encounters an error or failure, respectively.
        """
        enabled_for_errors = False
        enabled_for_failures = False
        score = 5 # run last, among builtins

        def options(self, parser, env):
            """Register commandline options.
            """
            parser.add_option(
                "--pdb", action="store_true", dest="debugBoth",
                default=env.get('NOSE_PDB', False),
                help="Drop into debugger on failures or errors")
            parser.add_option(
                "--pdb-failures", action="store_true",
                dest="debugFailures",
                default=env.get('NOSE_PDB_FAILURES', False),
                help="Drop into debugger on failures")
            parser.add_option(
                "--pdb-errors", action="store_true",
                dest="debugErrors",
                default=env.get('NOSE_PDB_ERRORS', False),
                help="Drop into debugger on errors")

        def configure(self, options, conf):
            """Configure which kinds of exceptions trigger plugin.
            """
            self.conf = conf
            self.enabled_for_errors = options.debugErrors or options.debugBoth
            self.enabled_for_failures = options.debugFailures or options.debugBoth
            self.enabled = self.enabled_for_failures or self.enabled_for_errors

        def addError(self, test, err):
            """Enter pdb if configured to debug errors.
            """
            if not self.enabled_for_errors:
                return
            self.debug(err)

        def addFailure(self, test, err):
            """Enter pdb if configured to debug failures.
            """
            if not self.enabled_for_failures:
                return
            self.debug(err)

        def debug(self, err):
            import sys # FIXME why is this import here?
            ec, ev, tb = err
            stdout = sys.stdout
            sys.stdout = sys.__stdout__
            try:
                pdb.post_mortem(tb)
            finally:
                sys.stdout = stdout