summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernát Gábor <bgabor8@bloomberg.net>2021-01-01 18:29:25 +0000
committerBernát Gábor <bgabor8@bloomberg.net>2021-01-01 18:29:25 +0000
commit72cac3102efaaf88d785822c809839ebe8fcb52b (patch)
treeb397f40b46e9b1fcf40301d38bcc8729ff093987
parentfd915cc8481265da415b039f8464a2437737060c (diff)
downloadtox-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.py3
-rw-r--r--src/tox/tox_env/api.py13
-rw-r--r--src/tox/tox_env/python/package.py16
-rw-r--r--src/tox/tox_env/python/virtual_env/package/util.py4
-rw-r--r--src/tox/tox_env/python/virtual_env/runner.py8
-rw-r--r--src/tox/tox_env/register.py3
-rw-r--r--src/tox/tox_env/runner.py2
-rw-r--r--tests/session/cmd/test_sequential.py40
-rw-r--r--tests/tox_env/python/virtual_env/test_package_types.py29
-rw-r--r--tests/tox_env/test_register.py18
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"