Skip to content

Commit 0b8ef3a

Browse files
authored
Check current python executable version (#4520)
* Check current python version * fix current_python type
1 parent ca44640 commit 0b8ef3a

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

src/poetry/utils/env.py

+18
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,17 @@ def __init__(self, expected: str, given: str | None = None) -> None:
450450
super().__init__(message)
451451

452452

453+
class InvalidCurrentPythonVersionError(EnvError):
454+
def __init__(self, expected: str, given: str) -> None:
455+
message = (
456+
f"Current Python version ({given}) "
457+
f"is not allowed by the project ({expected}).\n"
458+
'Please change python executable via the "env use" command.'
459+
)
460+
461+
super().__init__(message)
462+
463+
453464
class EnvManager:
454465
"""
455466
Environments manager
@@ -809,6 +820,13 @@ def create_venv(
809820

810821
if env.is_venv() and not force:
811822
# Already inside a virtualenv.
823+
current_python = Version.parse(
824+
".".join(str(c) for c in env.version_info[:3])
825+
)
826+
if not self._poetry.package.python_constraint.allows(current_python):
827+
raise InvalidCurrentPythonVersionError(
828+
self._poetry.package.python_versions, str(current_python)
829+
)
812830
return env
813831

814832
create_venv = self._poetry.config.get("virtualenvs.create")

tests/utils/test_env.py

+28
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from poetry.utils.env import EnvCommandError
2525
from poetry.utils.env import EnvManager
2626
from poetry.utils.env import GenericEnv
27+
from poetry.utils.env import InvalidCurrentPythonVersionError
2728
from poetry.utils.env import NoCompatiblePythonVersionFound
2829
from poetry.utils.env import SystemEnv
2930
from poetry.utils.env import VirtualEnv
@@ -993,6 +994,33 @@ def test_create_venv_uses_patch_version_to_detect_compatibility_with_executable(
993994
)
994995

995996

997+
def test_create_venv_fails_if_current_python_version_is_not_supported(
998+
manager: EnvManager, poetry: "Poetry"
999+
):
1000+
if "VIRTUAL_ENV" in os.environ:
1001+
del os.environ["VIRTUAL_ENV"]
1002+
1003+
manager.create_venv(NullIO())
1004+
1005+
current_version = Version.parse(".".join(str(c) for c in sys.version_info[:3]))
1006+
next_version = ".".join(
1007+
str(c) for c in (current_version.major, current_version.minor + 1, 0)
1008+
)
1009+
package_version = "~" + next_version
1010+
poetry.package.python_versions = package_version
1011+
1012+
with pytest.raises(InvalidCurrentPythonVersionError) as e:
1013+
manager.create_venv(NullIO())
1014+
1015+
expected_message = (
1016+
f"Current Python version ({current_version}) is not allowed by the project"
1017+
f' ({package_version}).\nPlease change python executable via the "env use"'
1018+
" command."
1019+
)
1020+
1021+
assert expected_message == str(e.value)
1022+
1023+
9961024
def test_activate_with_in_project_setting_does_not_fail_if_no_venvs_dir(
9971025
manager: EnvManager,
9981026
poetry: Poetry,

0 commit comments

Comments
 (0)