Skip to content

Commit adc88ef

Browse files
committed
Check current python version
1 parent 31657e7 commit adc88ef

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

src/poetry/utils/env.py

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

455455

456+
class InvalidCurrentPythonVersionError(EnvError):
457+
def __init__(self, expected: str, given: str) -> None:
458+
message = (
459+
"Current Python version ({}) "
460+
"is not allowed by the project ({}).\n"
461+
'Please change python executable via the "env use" command.'.format(
462+
given, expected
463+
)
464+
)
465+
466+
super().__init__(message)
467+
468+
456469
class EnvManager:
457470
"""
458471
Environments manager
@@ -812,6 +825,13 @@ def create_venv(
812825

813826
if env.is_venv() and not force:
814827
# Already inside a virtualenv.
828+
current_python = Version.parse(
829+
".".join(str(c) for c in env.version_info[:3])
830+
)
831+
if not self._poetry.package.python_constraint.allows(current_python):
832+
raise InvalidCurrentPythonVersionError(
833+
self._poetry.package.python_versions, current_python
834+
)
815835
return env
816836

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

tests/utils/test_env.py

+23
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
from poetry.utils.env import EnvCommandError
2626
from poetry.utils.env import EnvManager
2727
from poetry.utils.env import GenericEnv
28+
from poetry.utils.env import InvalidCurrentPythonVersionError
2829
from poetry.utils.env import NoCompatiblePythonVersionFound
2930
from poetry.utils.env import SystemEnv
3031
from poetry.utils.env import VirtualEnv
@@ -994,6 +995,28 @@ def test_create_venv_uses_patch_version_to_detect_compatibility_with_executable(
994995
)
995996

996997

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

0 commit comments

Comments
 (0)