Skip to content

Commit 7682929

Browse files
committed
Check current python version
1 parent 61301a1 commit 7682929

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

poetry/utils/env.py

+20
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,19 @@ def __init__(self, expected: str, given: Optional[str] = None) -> None:
447447
super().__init__(message)
448448

449449

450+
class InvalidCurrentPythonVersionError(EnvError):
451+
def __init__(self, expected: str, given: str) -> None:
452+
message = (
453+
"Current Python version ({}) "
454+
"is not allowed by the project ({}).\n"
455+
'Please change python executable via the "env use" command.'.format(
456+
given, expected
457+
)
458+
)
459+
460+
super().__init__(message)
461+
462+
450463
class EnvManager:
451464
"""
452465
Environments manager
@@ -782,6 +795,13 @@ def create_venv(
782795

783796
if env.is_venv() and not force:
784797
# Already inside a virtualenv.
798+
current_python = Version.parse(
799+
".".join(str(c) for c in env.version_info[:3])
800+
)
801+
if not self._poetry.package.python_constraint.allows(current_python):
802+
raise InvalidCurrentPythonVersionError(
803+
self._poetry.package.python_versions, current_python
804+
)
785805
return env
786806

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

tests/utils/test_env.py

+23
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from poetry.utils.env import EnvCommandError
2121
from poetry.utils.env import EnvManager
2222
from poetry.utils.env import GenericEnv
23+
from poetry.utils.env import InvalidCurrentPythonVersionError
2324
from poetry.utils.env import NoCompatiblePythonVersionFound
2425
from poetry.utils.env import SystemEnv
2526
from poetry.utils.env import VirtualEnv
@@ -882,6 +883,28 @@ def test_create_venv_uses_patch_version_to_detect_compatibility_with_executable(
882883
)
883884

884885

886+
def test_create_venv_fails_if_current_python_version_is_not_supported(manager, poetry):
887+
if "VIRTUAL_ENV" in os.environ:
888+
del os.environ["VIRTUAL_ENV"]
889+
890+
manager.create_venv(NullIO())
891+
892+
version = Version.parse(".".join(str(c) for c in sys.version_info[:3]))
893+
poetry.package.python_versions = "~{}".format(
894+
".".join(str(c) for c in (version.major, version.minor + 1, 0))
895+
)
896+
897+
with pytest.raises(InvalidCurrentPythonVersionError) as e:
898+
manager.create_venv(NullIO())
899+
900+
expected_message = (
901+
"Current Python version (3.9.5) is not allowed by the project (~3.10.0).\n"
902+
'Please change python executable via the "env use" command.'
903+
)
904+
905+
assert expected_message == str(e.value)
906+
907+
885908
def test_activate_with_in_project_setting_does_not_fail_if_no_venvs_dir(
886909
manager, poetry, config, tmp_dir, mocker
887910
):

0 commit comments

Comments
 (0)