diff options
author | Bernát Gábor <bgabor8@bloomberg.net> | 2021-01-01 18:29:25 +0000 |
---|---|---|
committer | Bernát Gábor <bgabor8@bloomberg.net> | 2021-01-01 18:29:25 +0000 |
commit | 72cac3102efaaf88d785822c809839ebe8fcb52b (patch) | |
tree | b397f40b46e9b1fcf40301d38bcc8729ff093987 | |
parent | fd915cc8481265da415b039f8464a2437737060c (diff) | |
download | tox-git-72cac3102efaaf88d785822c809839ebe8fcb52b.tar.gz |
Increase code coverage
Signed-off-by: Bernát Gábor <bgabor8@bloomberg.net>
-rw-r--r-- | src/tox/config/loader/convert.py | 3 | ||||
-rw-r--r-- | src/tox/tox_env/api.py | 13 | ||||
-rw-r--r-- | src/tox/tox_env/python/package.py | 16 | ||||
-rw-r--r-- | src/tox/tox_env/python/virtual_env/package/util.py | 4 | ||||
-rw-r--r-- | src/tox/tox_env/python/virtual_env/runner.py | 8 | ||||
-rw-r--r-- | src/tox/tox_env/register.py | 3 | ||||
-rw-r--r-- | src/tox/tox_env/runner.py | 2 | ||||
-rw-r--r-- | tests/session/cmd/test_sequential.py | 40 | ||||
-rw-r--r-- | tests/tox_env/python/virtual_env/test_package_types.py | 29 | ||||
-rw-r--r-- | tests/tox_env/test_register.py | 18 |
10 files changed, 113 insertions, 23 deletions
diff --git a/src/tox/config/loader/convert.py b/src/tox/config/loader/convert.py index 0143e138..0e8c29b8 100644 --- a/src/tox/config/loader/convert.py +++ b/src/tox/config/loader/convert.py @@ -5,12 +5,13 @@ from enum import Enum from pathlib import Path from typing import Any, Dict, Generic, Iterator, List, Set, Tuple, Type, TypeVar, Union, cast +from ..types import Command, EnvList + if sys.version_info >= (3, 8): # pragma: no cover (py38+) from typing import Literal else: # pragma: no cover (py38+) from typing_extensions import Literal # noqa -from ..types import Command, EnvList _NO_MAPPING = object() T = TypeVar("T") diff --git a/src/tox/tox_env/api.py b/src/tox/tox_env/api.py index b4823b1f..b4b82202 100644 --- a/src/tox/tox_env/api.py +++ b/src/tox/tox_env/api.py @@ -146,16 +146,13 @@ class ToxEnv(ABC): conf = {"name": self.conf.name, "type": type(self).__name__} try: with self._cache.compare(conf, ToxEnv.__name__) as (eq, old): - try: - if eq is True: - return - # if either the name or type changed and already exists start over - self.clean() - finally: - env_dir.mkdir(exist_ok=True, parents=True) + if eq is False and old is not None: + raise Recreate # recreate if already exists and type changed + if not env_dir.exists(): + env_dir.mkdir(parents=True) + self.setup_done, self.clean_done = True, False finally: self._handle_env_tmp_dir() - self.setup_done, self.clean_done = True, False def ensure_setup(self, recreate: bool = False) -> None: if self.setup_done is True: diff --git a/src/tox/tox_env/python/package.py b/src/tox/tox_env/python/package.py index 61ddaab6..4e3721ff 100644 --- a/src/tox/tox_env/python/package.py +++ b/src/tox/tox_env/python/package.py @@ -3,7 +3,7 @@ A tox build environment that handles Python packages. """ import sys from abc import ABC, abstractmethod -from typing import List, Optional, Tuple, Union +from typing import List, Optional, Tuple from packaging.requirements import Requirement @@ -17,14 +17,12 @@ class PythonPackage(Python, PackageToxEnv, ABC): def setup(self) -> None: """setup the tox environment""" super().setup() - deps = [PythonDep(i) for i in self.requires()] - if not self.cached_install(deps, PythonPackage.__name__, "requires"): - build_requirements: List[Union[str, Requirement]] = [] - with self._cache.compare(build_requirements, PythonPackage.__name__, "build-requires") as (eq, old): - if eq is False and old is None: - build_requires = self.build_requires() - build_requirements.extend(str(i) for i in build_requires) - self.install_python_packages(packages=[PythonDep(i) for i in build_requires]) + + requires = [PythonDep(i) for i in self.requires()] + self.cached_install(requires, PythonPackage.__name__, "requires") + + build_requires = [PythonDep(i) for i in self.build_requires()] + self.cached_install(build_requires, PythonPackage.__name__, "build-requires") @abstractmethod def requires(self) -> Tuple[Requirement, ...]: diff --git a/src/tox/tox_env/python/virtual_env/package/util.py b/src/tox/tox_env/python/virtual_env/package/util.py index 3aa8b6d0..a46df071 100644 --- a/src/tox/tox_env/python/virtual_env/package/util.py +++ b/src/tox/tox_env/python/virtual_env/package/util.py @@ -9,6 +9,6 @@ def virtual_env_package_id(of_type: PackageType) -> str: return Pep517VirtualEnvPackageSdist.id() elif of_type is PackageType.wheel: return Pep517VirtualEnvPackageWheel.id() - elif of_type is PackageType.dev: + elif of_type is PackageType.dev: # pragma: no branch return LegacyDevVirtualEnvPackage.id() - raise KeyError(PackageType.name) + raise KeyError(PackageType.name) # pragma: no cover # can only happen if we introduce new types and forget to set diff --git a/src/tox/tox_env/python/virtual_env/runner.py b/src/tox/tox_env/python/virtual_env/runner.py index 6918ae1c..08822c76 100644 --- a/src/tox/tox_env/python/virtual_env/runner.py +++ b/src/tox/tox_env/python/virtual_env/runner.py @@ -5,6 +5,7 @@ from typing import Dict, Optional, Set from tox.config.main import Config from tox.plugin.impl import impl +from tox.report import HandledError from tox.tox_env.register import ToxEnvRegister from ..runner import PythonRun @@ -30,7 +31,12 @@ class VirtualEnvRunner(VirtualEnv, PythonRun): self.conf.add_constant(["package"], desc, PackageType.dev) else: self.conf.add_config(keys="package", of_type=PackageType, default=PackageType.sdist, desc=desc) - pkg_type: PackageType = self.conf["package"] + try: + pkg_type: PackageType = self.conf["package"] + except AttributeError as exc: + values = ", ".join(i.name for i in PackageType) + raise HandledError(f"invalid package config type {exc.args[0]!r} requested, must be one of {values}") + if pkg_type == PackageType.skip: return False diff --git a/src/tox/tox_env/register.py b/src/tox/tox_env/register.py index e1e0a09f..11e15fde 100644 --- a/src/tox/tox_env/register.py +++ b/src/tox/tox_env/register.py @@ -33,7 +33,8 @@ class ToxEnvRegister: @default_run_env.setter def default_run_env(self, value: str) -> None: - assert value in self._run_envs, "default env must be in run envs" + if value not in self._run_envs: + raise ValueError("run env must be registered before setting it as default") self._default_run_env = value def runner(self, name: str) -> Type[RunToxEnv]: diff --git a/src/tox/tox_env/runner.py b/src/tox/tox_env/runner.py index 103ea77e..e6785459 100644 --- a/src/tox/tox_env/runner.py +++ b/src/tox/tox_env/runner.py @@ -93,7 +93,7 @@ class RunToxEnv(ToxEnv, ABC): def clean(self, package_env: bool = True) -> None: super().clean() - if self.package_env is not None: + if self.package_env is not None: # pragma: no cover branch with self.package_env.display_context(suspend=self.has_display_suspended): self.package_env.clean() diff --git a/tests/session/cmd/test_sequential.py b/tests/session/cmd/test_sequential.py index f703e907..d5e162a1 100644 --- a/tests/session/cmd/test_sequential.py +++ b/tests/session/cmd/test_sequential.py @@ -141,3 +141,43 @@ def test_rerun_sequential_sdist(tox_project: ToxProjectCreator, demo_pkg_inline: result_first.assert_success() result_rerun = proj.run("--root", str(demo_pkg_inline)) result_rerun.assert_success() + + +def test_recreate_package(tox_project: ToxProjectCreator, demo_pkg_inline: Path) -> None: + proj = tox_project( + {"tox.ini": "[testenv]\npackage=wheel\ncommands=python -c 'from demo_pkg_inline import do; do()'"} + ) + result_first = proj.run("--root", str(demo_pkg_inline), "-r") + result_first.assert_success() + + result_rerun = proj.run("-r", "--root", str(demo_pkg_inline), "--no-recreate-pkg") + result_rerun.assert_success() + + +def test_package_deps_change(tox_project: ToxProjectCreator, demo_pkg_inline: Path) -> None: + toml = (demo_pkg_inline / "pyproject.toml").read_text() + build = (demo_pkg_inline / "build.py").read_text() + ini = "[testenv]\npackage=wheel\ncommands=python -c 'from demo_pkg_inline import do; do()'" + proj = tox_project({"tox.ini": ini, "pyproject.toml": toml, "build.py": build}) + + result_first = proj.run("r") + result_first.assert_success() + assert ".package-py: install" not in result_first.out # no deps initially + + # new deps are picked up + (proj.path / "pyproject.toml").write_text(toml.replace("requires = []", 'requires = ["wheel"]')) + (proj.path / "build.py").write_text( + build.replace( + "def get_requires_for_build_wheel(config_settings):\n return []", + "def get_requires_for_build_wheel(config_settings):\n return ['setuptools']", + ) + ) + + result_rerun = proj.run("r") + result_rerun.assert_success() + + # and installed + rerun_install = [i for i in result_rerun.out.splitlines() if i.startswith(".package-py: install")] + assert len(rerun_install) == 2 + assert rerun_install[0].endswith("wheel") + assert rerun_install[1].endswith("setuptools") diff --git a/tests/tox_env/python/virtual_env/test_package_types.py b/tests/tox_env/python/virtual_env/test_package_types.py new file mode 100644 index 00000000..85fe035e --- /dev/null +++ b/tests/tox_env/python/virtual_env/test_package_types.py @@ -0,0 +1,29 @@ +import pytest + +from tox.pytest import ToxProjectCreator +from tox.tox_env.python.virtual_env.package.api import PackageType + + +@pytest.mark.parametrize( + "pkg_type, of_type", + [ + ("dev", "virtualenv-legacy-dev"), + ("sdist", "virtualenv-pep-517-sdist"), + ("wheel", "virtualenv-pep-517-wheel"), + ], +) +def test_tox_ini_package_type_valid(tox_project: ToxProjectCreator, pkg_type: str, of_type: str) -> None: + proj = tox_project({"tox.ini": f"[testenv]\npackage={pkg_type}"}) + result = proj.run("c", "-k", "package_tox_env_type") + result.assert_success() + res = result.state.tox_env("py").conf["package"] + assert res is getattr(PackageType, pkg_type) + got_type = result.state.tox_env("py").conf["package_tox_env_type"] + assert got_type == of_type + + +def test_tox_ini_package_type_invalid(tox_project: ToxProjectCreator) -> None: + proj = tox_project({"tox.ini": "[testenv]\npackage=bad"}) + result = proj.run("c", "-k", "package_tox_env_type") + result.assert_failed() + assert " invalid package config type 'bad' requested, must be one of sdist, wheel, dev, skip" in result.out diff --git a/tests/tox_env/test_register.py b/tests/tox_env/test_register.py new file mode 100644 index 00000000..0dd3d4de --- /dev/null +++ b/tests/tox_env/test_register.py @@ -0,0 +1,18 @@ +import pytest + +from tox.tox_env.python.virtual_env.runner import VirtualEnvRunner +from tox.tox_env.register import ToxEnvRegister + + +def test_register_set_new_default_no_register() -> None: + register = ToxEnvRegister() + with pytest.raises(ValueError, match="run env must be registered before setting it as default"): + register.default_run_env = "new-env" + + +def test_register_set_new_default_with_register() -> None: + register = ToxEnvRegister() + register.add_run_env(VirtualEnvRunner) + assert register.default_run_env == "" + register.default_run_env = VirtualEnvRunner.id() + assert register.default_run_env == "virtualenv" |