|
23 | 23 | import sys |
24 | 24 | import urllib.parse |
25 | 25 | from pathlib import Path |
26 | | -from typing import TYPE_CHECKING, Any, NoReturn |
| 26 | +from typing import TYPE_CHECKING, Any, Literal, NoReturn, cast |
27 | 27 |
|
28 | 28 | import packaging.requirements |
29 | 29 | import packaging.utils |
|
32 | 32 | import nox.virtualenv |
33 | 33 | from nox import _options, tasks, workflow |
34 | 34 | from nox._version import get_nox_version |
35 | | -from nox.logger import setup_logging |
| 35 | +from nox.logger import logger, setup_logging |
36 | 36 | from nox.project import load_toml |
37 | 37 |
|
38 | 38 | if TYPE_CHECKING: |
@@ -137,12 +137,18 @@ def check_url_dependency(dep_url: str, dist: importlib.metadata.Distribution) -> |
137 | 137 |
|
138 | 138 |
|
139 | 139 | def run_script_mode( |
140 | | - envdir: Path, *, reuse: bool, dependencies: list[str], venv_backend: str |
| 140 | + envdir: Path, |
| 141 | + *, |
| 142 | + reuse: bool, |
| 143 | + dependencies: list[str], |
| 144 | + venv_backend: str, |
| 145 | + download_python: Literal["auto", "never", "always"], |
141 | 146 | ) -> NoReturn: |
142 | 147 | envdir.mkdir(exist_ok=True) |
143 | 148 | noxenv = envdir.joinpath("_nox_script_mode") |
144 | 149 | venv = nox.virtualenv.get_virtualenv( |
145 | 150 | *venv_backend.split("|"), |
| 151 | + download_python=download_python, |
146 | 152 | reuse_existing=reuse, |
147 | 153 | envdir=str(noxenv), |
148 | 154 | ) |
@@ -208,12 +214,32 @@ def main() -> None: |
208 | 214 | ) |
209 | 215 | ) |
210 | 216 |
|
| 217 | + download_python = ( |
| 218 | + os.environ.get("NOX_SCRIPT_DOWNLOAD_PYTHON") |
| 219 | + or ( |
| 220 | + toml_config.get("tool", {}) |
| 221 | + .get("nox", {}) |
| 222 | + .get("script-download-python", "auto") |
| 223 | + ) |
| 224 | + or args.download_python |
| 225 | + ) |
| 226 | + |
| 227 | + if download_python not in ("auto", "never", "always"): |
| 228 | + logger.warning( |
| 229 | + f"Invalid parameter for {download_python=}. Defaulting to 'auto'" |
| 230 | + ) |
| 231 | + download_python = "auto" |
| 232 | + download_python = cast( |
| 233 | + "Literal['auto', 'never', 'always']", download_python |
| 234 | + ) |
| 235 | + |
211 | 236 | envdir = Path(args.envdir or ".nox") |
212 | 237 | run_script_mode( |
213 | 238 | envdir, |
214 | 239 | reuse=nox_script_mode == "reuse", |
215 | 240 | dependencies=dependencies, |
216 | 241 | venv_backend=venv_backend, |
| 242 | + download_python=download_python, |
217 | 243 | ) |
218 | 244 |
|
219 | 245 | exit_code = execute_workflow(args) |
|
0 commit comments