117 lines
4.1 KiB
Python
117 lines
4.1 KiB
Python
import os
|
|
import sys
|
|
from functools import lru_cache
|
|
from typing import Optional
|
|
|
|
from pipenv import exceptions
|
|
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
|
|
from pipenv.patched.pip._vendor.typing_extensions import TYPE_CHECKING
|
|
from pipenv.utils.dependencies import python_version
|
|
from pipenv.utils.pipfile import ensure_pipfile
|
|
from pipenv.utils.shell import shorten_path
|
|
from pipenv.utils.virtualenv import ensure_virtualenv
|
|
from pipenv.vendor import click
|
|
|
|
if TYPE_CHECKING:
|
|
from pipenv.patched.pip._vendor.typing_extensions import STRING_TYPE
|
|
|
|
if sys.version_info < (3, 10):
|
|
from pipenv.vendor import importlib_metadata
|
|
else:
|
|
import importlib.metadata as importlib_metadata
|
|
|
|
|
|
def ensure_project(
|
|
project,
|
|
python=None,
|
|
validate=True,
|
|
system=False,
|
|
warn=True,
|
|
site_packages=None,
|
|
deploy=False,
|
|
skip_requirements=False,
|
|
pypi_mirror=None,
|
|
clear=False,
|
|
categories=None,
|
|
):
|
|
"""Ensures both Pipfile and virtualenv exist for the project."""
|
|
|
|
# Automatically use an activated virtualenv.
|
|
if project.s.PIPENV_USE_SYSTEM or project.virtualenv_exists:
|
|
system_or_exists = True
|
|
else:
|
|
system_or_exists = system # default to False
|
|
if not project.pipfile_exists and deploy:
|
|
raise exceptions.PipfileNotFound
|
|
# Skip virtualenv creation when --system was used.
|
|
if not system_or_exists:
|
|
ensure_virtualenv(
|
|
project,
|
|
python=python,
|
|
site_packages=site_packages,
|
|
pypi_mirror=pypi_mirror,
|
|
)
|
|
if warn:
|
|
# Warn users if they are using the wrong version of Python.
|
|
if project.required_python_version:
|
|
path_to_python = project._which("python") or project._which("py")
|
|
if path_to_python and project.required_python_version not in (
|
|
python_version(path_to_python) or ""
|
|
):
|
|
click.echo(
|
|
"{}: Your Pipfile requires {} {}, "
|
|
"but you are using {} ({}).".format(
|
|
click.style("Warning", fg="red", bold=True),
|
|
click.style("python_version", bold=True),
|
|
click.style(project.required_python_version, fg="cyan"),
|
|
click.style(
|
|
python_version(path_to_python) or "unknown", fg="cyan"
|
|
),
|
|
click.style(shorten_path(path_to_python), fg="green"),
|
|
),
|
|
err=True,
|
|
)
|
|
click.echo(
|
|
" {} and rebuilding the virtual environment "
|
|
"may resolve the issue.".format(
|
|
click.style("$ pipenv --rm", fg="green")
|
|
),
|
|
err=True,
|
|
)
|
|
if not deploy:
|
|
click.echo(
|
|
" {} will surely fail."
|
|
"".format(click.style("$ pipenv check", fg="yellow")),
|
|
err=True,
|
|
)
|
|
else:
|
|
raise exceptions.DeployException
|
|
# Ensure the Pipfile exists.
|
|
ensure_pipfile(
|
|
project,
|
|
validate=validate,
|
|
skip_requirements=skip_requirements,
|
|
system=system,
|
|
categories=categories,
|
|
)
|
|
os.environ["PIP_PYTHON_PATH"] = project.python(system=system)
|
|
|
|
|
|
@lru_cache
|
|
def get_setuptools_version() -> Optional["STRING_TYPE"]:
|
|
try:
|
|
setuptools_dist = importlib_metadata.distribution("setuptools")
|
|
return str(setuptools_dist.version)
|
|
except ImportError:
|
|
return None
|
|
|
|
|
|
def get_default_pyproject_backend():
|
|
# type: () -> STRING_TYPE
|
|
st_version = get_setuptools_version()
|
|
if st_version is not None:
|
|
parsed_st_version = parse_version(st_version)
|
|
if parsed_st_version >= parse_version("40.8.0"):
|
|
return "setuptools.build_meta:__legacy__"
|
|
return "setuptools.build_meta"
|