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):
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:
"""
Environments manager
......@@ -809,6 +820,13 @@ class EnvManager:
if env.is_venv() and not force:
# 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
create_venv = self._poetry.config.get("virtualenvs.create")
......
......@@ -24,6 +24,7 @@ from poetry.utils.env import GET_BASE_PREFIX
from poetry.utils.env import EnvCommandError
from poetry.utils.env import EnvManager
from poetry.utils.env import GenericEnv
from poetry.utils.env import InvalidCurrentPythonVersionError
from poetry.utils.env import NoCompatiblePythonVersionFound
from poetry.utils.env import SystemEnv
from poetry.utils.env import VirtualEnv
......@@ -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(
manager: EnvManager,
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