"""This plugin installs DEPRECATED error class for the :class:`DeprecatedTest`
exception. When :class:`DeprecatedTest` is raised, the exception will be logged
in the deprecated attribute of the result, ``D`` or ``DEPRECATED`` (verbose)
will be output, and the exception will not be counted as an error or failure.
It is enabled by default but can be turned off by using ``--no-deprecated``."""
from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin


class DeprecatedTest(Exception):
    """Raise this exception to mark a test as deprecated."""
    pass


class Deprecated(ErrorClassPlugin):
    """Installs a DEPRECATED error class for the DeprecatedTest exception.
    Enabled by default."""
    enabled = True
    deprecated = ErrorClass(
        DeprecatedTest, label='DEPRECATED', isfailure=False
    )

    def options(self, parser, env):
        """Register commandline options."""
        env_opt = 'NOSE_WITHOUT_DEPRECATED'
        parser.add_option(
            '--no-deprecated', action='store_true',
            dest='noDeprecated', default=env.get(env_opt, False),
            help="Disable special handling of DeprecatedTest exceptions."
        )

    def configure(self, options, conf):
        """Configure plugin."""
        if not self.can_configure:
            return
        self.conf = conf
        disable = getattr(options, 'noDeprecated', False)
        if disable:
            self.enabled = False
