Commit 0b8ef3a7 by yokomotod Committed by GitHub

Check current python executable version (#4520)

* Check current python version

* fix current_python type
parent ca446400
...@@ -450,6 +450,17 @@ class NoCompatiblePythonVersionFound(EnvError): ...@@ -450,6 +450,17 @@ class NoCompatiblePythonVersionFound(EnvError):
super().__init__(message) super().__init__(message)
class InvalidCurrentPythonVersionError(EnvError):
def __init__(self, expected: str, given: str) -> None:
message = (
f"Current Python version ({given}) "
f"is not allowed by the project ({expected}).\n"
'Please change python executable via the "env use" command.'
)
super().__init__(message)
class EnvManager: class EnvManager:
""" """
Environments manager Environments manager
...@@ -809,6 +820,13 @@ class EnvManager: ...@@ -809,6 +820,13 @@ class EnvManager:
if env.is_venv() and not force: if env.is_venv() and not force:
# Already inside a virtualenv. # Already inside a virtualenv.
current_python = Version.parse(
".".join(str(c) for c in env.version_info[:3])
)
if not self._poetry.package.python_constraint.allows(current_python):
raise InvalidCurrentPythonVersionError(
self._poetry.package.python_versions, str(current_python)
)
return env return env
create_venv = self._poetry.config.get("virtualenvs.create") create_venv = self._poetry.config.get("virtualenvs.create")
......
...@@ -24,6 +24,7 @@ from poetry.utils.env import GET_BASE_PREFIX ...@@ -24,6 +24,7 @@ from poetry.utils.env import GET_BASE_PREFIX
from poetry.utils.env import EnvCommandError from poetry.utils.env import EnvCommandError
from poetry.utils.env import EnvManager from poetry.utils.env import EnvManager
from poetry.utils.env import GenericEnv from poetry.utils.env import GenericEnv
from poetry.utils.env import InvalidCurrentPythonVersionError
from poetry.utils.env import NoCompatiblePythonVersionFound from poetry.utils.env import NoCompatiblePythonVersionFound
from poetry.utils.env import SystemEnv from poetry.utils.env import SystemEnv
from poetry.utils.env import VirtualEnv from poetry.utils.env import VirtualEnv
...@@ -993,6 +994,33 @@ def test_create_venv_uses_patch_version_to_detect_compatibility_with_executable( ...@@ -993,6 +994,33 @@ def test_create_venv_uses_patch_version_to_detect_compatibility_with_executable(
) )
def test_create_venv_fails_if_current_python_version_is_not_supported(
manager: EnvManager, poetry: "Poetry"
):
if "VIRTUAL_ENV" in os.environ:
del os.environ["VIRTUAL_ENV"]
manager.create_venv(NullIO())
current_version = Version.parse(".".join(str(c) for c in sys.version_info[:3]))
next_version = ".".join(
str(c) for c in (current_version.major, current_version.minor + 1, 0)
)
package_version = "~" + next_version
poetry.package.python_versions = package_version
with pytest.raises(InvalidCurrentPythonVersionError) as e:
manager.create_venv(NullIO())
expected_message = (
f"Current Python version ({current_version}) is not allowed by the project"
f' ({package_version}).\nPlease change python executable via the "env use"'
" command."
)
assert expected_message == str(e.value)
def test_activate_with_in_project_setting_does_not_fail_if_no_venvs_dir( def test_activate_with_in_project_setting_does_not_fail_if_no_venvs_dir(
manager: EnvManager, manager: EnvManager,
poetry: Poetry, poetry: Poetry,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment