# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt

"""A configuring plugin for test_plugins.py to import."""

from __future__ import annotations

from typing import Any, List, cast

import coverage
from coverage.plugin_support import Plugins
from coverage.types import TConfigurable


class Plugin(coverage.CoveragePlugin):
    """A configuring plugin for testing."""
    def configure(self, config: TConfigurable) -> None:
        """Configure all the things!"""
        opt_name = "report:exclude_lines"
        exclude_lines = cast(List[str], config.get_option(opt_name))
        exclude_lines.append(r"pragma: custom")
        exclude_lines.append(r"pragma: or whatever")
        config.set_option(opt_name, exclude_lines)


def coverage_init(
    reg: Plugins,
    options: Any,           # pylint: disable=unused-argument
) -> None:
    """Called by coverage to initialize the plugins here."""
    reg.add_configurer(Plugin())
