Source code for dwas.predefined._coverage

from __future__ import annotations

# XXX: All imports here should be done from the top level. If we need it,
#      users might need it
from .. import Step, StepRunner, parametrize, set_defaults


@set_defaults(
    {
        "dependencies": ["coverage"],
        "reports": [["report", "--show-missing"]],
    }
)
class Coverage(Step):
    # TODO: this can create files outside the cache but does not offer a
    #       convenient way for hooking into `--clean`.
    def __init__(self) -> None:
        self.__name__ = "coverage"

    def __call__(
        self,
        step: StepRunner,
        reports: list[list[str]],
    ) -> None:
        env = {"COVERAGE_FILE": str(step.cache_path / "coverage")}

        coverage_files = step.get_artifacts("coverage_files")
        if not coverage_files:
            # pylint: disable=broad-exception-raised
            raise Exception("No coverage files provided. Can't proceed")

        step.run(["coverage", "combine", "--keep", *coverage_files], env=env)

        for report in reports:
            step.run(["coverage", *report], env=env)


[docs] def coverage(*, reports: list[list[str]] | None = None) -> Step: """ Run `coverage.py`_ to generate coverage reports. By default, it will depend on :python:`["coverage"]`, when registered with :py:func:`dwas.register_managed_step`. :param reports: A list of parameters to pass to coverage to generate reports. Defaults to :python:`[["report", "--show-missing"]]` This step leverages :term:`artifacts<artifact>` named ``coverage_files`` provided by other steps to provide reports. :Example: Here is a fully fledged example that packages source code, runs pytest and generates coverage out of it: .. code-block:: # One step to generate the package dwas.register_managed_step(dwas.predefined.package()) # One step to run pytest across multiple python versions dwas.register_managed_step( dwas.parametrize("python", ["3.9", "3.10", "3.11"])( dwas.predefined.pytest() ), dependencies=["pytest', "pytest-cov"], requires=["package"] ) # And finally generate xml report and one on stdout. # This will combine all coverage info from the previous pytest runs. dwas.register_managed_step( dwas.predefined.coverage( reports=[ ["xml", "-o", "reports/coverage.xml"], ["report", "--show-missing"], ], ), requires=["pytest"], ) :return: The step so that you can add additional parameters to it if needed. """ coverage_ = Coverage() if reports is not None: coverage_ = parametrize("reports", [reports])(coverage_) return coverage_