2022-07-29 11:42:34 +02:00
|
|
|
import os
|
|
|
|
from pathlib import Path
|
2021-08-30 00:43:28 +02:00
|
|
|
from typing import Optional, Tuple
|
2022-07-29 11:42:34 +02:00
|
|
|
from venv import EnvBuilder
|
2021-08-30 00:43:28 +02:00
|
|
|
|
2019-05-25 20:48:51 +02:00
|
|
|
import pytest
|
2019-07-31 01:54:24 +02:00
|
|
|
|
2019-09-14 19:38:05 +02:00
|
|
|
from pip._internal.cli.cmdoptions import _convert_python_version
|
2022-07-29 11:42:34 +02:00
|
|
|
from pip._internal.cli.main_parser import identify_python_interpreter
|
2019-07-31 01:54:24 +02:00
|
|
|
|
|
|
|
|
2019-05-25 20:48:51 +02:00
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"value, expected",
|
|
|
|
[
|
2019-06-09 04:37:11 +02:00
|
|
|
("", (None, None)),
|
|
|
|
("2", ((2,), None)),
|
|
|
|
("3", ((3,), None)),
|
|
|
|
("3.7", ((3, 7), None)),
|
|
|
|
("3.7.3", ((3, 7, 3), None)),
|
|
|
|
# Test strings without dots of length bigger than 1.
|
|
|
|
("34", ((3, 4), None)),
|
2019-05-25 20:48:51 +02:00
|
|
|
# Test a 2-digit minor version.
|
2019-06-09 04:37:11 +02:00
|
|
|
("310", ((3, 10), None)),
|
|
|
|
# Test some values that fail to parse.
|
|
|
|
("ab", ((), "each version part must be an integer")),
|
|
|
|
("3a", ((), "each version part must be an integer")),
|
|
|
|
("3.7.a", ((), "each version part must be an integer")),
|
|
|
|
("3.7.3.1", ((), "at most three version parts are allowed")),
|
2019-05-25 20:48:51 +02:00
|
|
|
],
|
|
|
|
)
|
2021-08-30 00:43:28 +02:00
|
|
|
def test_convert_python_version(
|
|
|
|
value: str, expected: Tuple[Optional[Tuple[int, ...]], Optional[str]]
|
|
|
|
) -> None:
|
2019-05-25 20:48:51 +02:00
|
|
|
actual = _convert_python_version(value)
|
2020-12-23 20:25:12 +01:00
|
|
|
assert actual == expected, f"actual: {actual!r}"
|
2022-07-29 11:42:34 +02:00
|
|
|
|
|
|
|
|
|
|
|
def test_identify_python_interpreter_venv(tmpdir: Path) -> None:
|
|
|
|
env_path = tmpdir / "venv"
|
|
|
|
env = EnvBuilder(with_pip=False)
|
|
|
|
env.create(env_path)
|
|
|
|
|
|
|
|
# Passing a virtual environment returns the Python executable
|
2022-08-01 11:49:32 +02:00
|
|
|
interp = identify_python_interpreter(os.fspath(env_path))
|
2022-07-29 11:42:34 +02:00
|
|
|
assert interp is not None
|
|
|
|
assert Path(interp).exists()
|
|
|
|
|
|
|
|
# Passing an executable returns it
|
|
|
|
assert identify_python_interpreter(interp) == interp
|
|
|
|
|
|
|
|
# Passing a non-existent file returns None
|
|
|
|
assert identify_python_interpreter(str(tmpdir / "nonexistent")) is None
|