"""
Adds the pytest testing framework to your project.

"""

import os

from medikit.events import subscribe

from . import SUPPORT_PRIORITY, Feature


class PytestFeature(Feature):
    # TODO: http://docs.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py-test-pytest-runner

    requires = {"python"}

    @subscribe("medikit.feature.python.on_generate")
    def on_python_generate(self, event):
        event.config["python"].add_requirements(dev=["coverage ~=4.4", "pytest ~=3.4", "pytest-cov ~=2.5"])

    @subscribe("medikit.feature.make.on_generate", priority=SUPPORT_PRIORITY)
    def on_make_generate(self, event):
        makefile = event.makefile
        makefile["PYTEST"] = "$(PYTHON_DIRNAME)/pytest"
        makefile["PYTEST_OPTIONS"] = "--capture=no --cov=$(PACKAGE) --cov-report html".format(
            path=event.package_name.replace(".", os.sep)
        )
        makefile.add_target(
            "test",
            """
            $(PYTEST) $(PYTEST_OPTIONS) tests
        """,
            deps=("install-dev",),
            phony=True,
            doc="Runs the test suite.",
        )

    @subscribe("medikit.on_start", priority=SUPPORT_PRIORITY)
    def on_start(self, event):
        tests_dir = "tests"
        if not os.path.exists(tests_dir):
            os.makedirs(tests_dir)

        gitkeep_file = os.path.join(tests_dir, ".gitkeep")

        if not os.path.exists(gitkeep_file):
            self.render_empty_files(gitkeep_file)

        self.render_file(".coveragerc", "pytest/coveragerc.j2")
        self.render_file(".travis.yml", "pytest/travis.yml.j2")
