Skip to content

Commit 00cb9a6

Browse files
Skip missing interpreters (#71)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 0f5cfa4 commit 00cb9a6

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

src/tox_uv/_venv.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
from tox.execute.local_sub_process import LocalSubProcessExecutor
2222
from tox.execute.request import StdinSource
23+
from tox.tox_env.errors import Skip
2324
from tox.tox_env.python.api import Python, PythonInfo, VersionInfo
2425
from uv import find_uv_bin
2526
from virtualenv import app_data
@@ -68,7 +69,8 @@ def installer(self) -> Installer[Any]:
6869
def runs_on_platform(self) -> str:
6970
return sys.platform
7071

71-
def _get_python(self, base_python: list[str]) -> PythonInfo | None: # noqa: PLR6301
72+
@staticmethod
73+
def _get_python(base_python: list[str]) -> PythonInfo | None:
7274
for base in base_python: # pragma: no branch
7375
if base == sys.executable:
7476
version_info = sys.version_info
@@ -113,6 +115,7 @@ def _get_python(self, base_python: list[str]) -> PythonInfo | None: # noqa: PLR
113115
platform=sys.platform,
114116
extra={},
115117
)
118+
116119
return None # pragma: no cover
117120

118121
@property
@@ -149,13 +152,19 @@ def create_python_env(self) -> None:
149152
else:
150153
uv_imp = "" if (imp and imp == "cpython") else imp
151154
version_spec = f"{uv_imp or ''}{base.major}.{base.minor}" if base.minor else f"{uv_imp or ''}{base.major}"
155+
152156
cmd: list[str] = [self.uv, "venv", "-p", version_spec, "--allow-existing"]
153157
if self.options.verbosity > 2: # noqa: PLR2004
154158
cmd.append("-v")
155159
if self.conf["uv_seed"]:
156160
cmd.append("--seed")
157161
cmd.append(str(self.venv_dir))
158162
outcome = self.execute(cmd, stdin=StdinSource.OFF, run_id="venv", show=None)
163+
164+
if self.core["skip_missing_interpreters"] and outcome.exit_code == 1:
165+
msg = "could not find python interpreter with spec(s):" f" {version_spec}"
166+
raise Skip(msg)
167+
159168
outcome.assert_success()
160169
self._created = True
161170

tests/test_tox_uv_venv.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,33 @@ def test_uv_venv_spec_abs_path_conflict_platform(
115115

116116

117117
def test_uv_venv_na(tox_project: ToxProjectCreator) -> None:
118+
# skip_missing_interpreters is true by default
118119
project = tox_project({"tox.ini": "[testenv]\npackage=skip\nbase_python=1.0"})
119120
result = project.run("-vv")
121+
122+
# When a Python interpreter is missing in a pytest environment, project.run
123+
# return code is equal to -1
124+
result.assert_failed(code=-1)
125+
126+
127+
def test_uv_venv_skip_missing_interpreters_fail(tox_project: ToxProjectCreator) -> None:
128+
project = tox_project({
129+
"tox.ini": "[tox]\nskip_missing_interpreters=false\n[testenv]\npackage=skip\nbase_python=1.0"
130+
})
131+
result = project.run("-vv")
120132
result.assert_failed(code=1)
121133

122134

135+
def test_uv_venv_skip_missing_interpreters_pass(tox_project: ToxProjectCreator) -> None:
136+
project = tox_project({
137+
"tox.ini": "[tox]\nskip_missing_interpreters=true\n[testenv]\npackage=skip\nbase_python=1.0"
138+
})
139+
result = project.run("-vv")
140+
# When a Python interpreter is missing in a pytest environment, project.run
141+
# return code is equal to -1
142+
result.assert_failed(code=-1)
143+
144+
123145
def test_uv_venv_platform_check(tox_project: ToxProjectCreator) -> None:
124146
project = tox_project({"tox.ini": f"[testenv]\nplatform={sys.platform}\npackage=skip"})
125147
result = project.run("-vv")

0 commit comments

Comments
 (0)