Show what the new requirementslib changes look like.

This commit is contained in:
Matt Davis
2022-09-10 21:10:08 -04:00
parent 9e80997b8e
commit d00294e4c7
10 changed files with 109 additions and 160 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ from .models.lockfile import Lockfile
from .models.pipfile import Pipfile
from .models.requirements import Requirement
__version__ = "2.0.1"
__version__ = "2.0.2.dev0"
logger = logging.getLogger(__name__)
+2 -4
View File
@@ -3,14 +3,12 @@ import copy
import hashlib
import json
import os
import pathlib
import sys
import pipenv.vendor.vistir as vistir
from pipenv.patched.pip._vendor.packaging.requirements import Requirement
from pipenv.patched.pip._internal.utils.hashes import FAVORITE_HASH
from pipenv.patched.pip._internal.vcs.versioncontrol import VcsSupport
from pipenv.patched.pip._vendor.cachecontrol.cache import DictCache
from pipenv.patched.pip._vendor.packaging.requirements import Requirement
from pipenv.vendor.platformdirs import user_cache_dir
from .utils import as_tuple, get_pinned_version, key_from_req, lookup_table
@@ -130,7 +128,7 @@ class HashCache(DictCache):
def __init__(self, *args, **kwargs):
session = kwargs.pop("session", None)
if not session:
import pipenv.patched.pip._vendor.requests as requests
import requests
session = requests.session()
atexit.register(session.close)
+25 -40
View File
@@ -1,18 +1,12 @@
# -*- coding=utf-8 -*-
import atexit
import contextlib
import copy
import functools
import os
from contextlib import ExitStack
from json import JSONDecodeError
import pipenv.vendor.attr as attr
import pipenv.patched.pip._vendor.requests as requests
from pipenv.patched.pip._vendor.packaging.markers import Marker
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
from pipenv.patched.pip._vendor.packaging.version import parse
from pipenv.patched.pip._internal.cache import WheelCache
from pipenv.patched.pip._internal.models.format_control import FormatControl
from pipenv.patched.pip._internal.operations.build.build_tracker import get_build_tracker
@@ -20,6 +14,9 @@ from pipenv.patched.pip._internal.req.constructors import install_req_from_line
from pipenv.patched.pip._internal.req.req_install import InstallRequirement
from pipenv.patched.pip._internal.req.req_set import RequirementSet
from pipenv.patched.pip._internal.utils.temp_dir import TempDirectory, global_tempdir_manager
from pipenv.patched.pip._vendor.packaging.markers import Marker
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
from pipenv.patched.pip._vendor.packaging.version import parse
from pipenv.vendor.vistir.compat import fs_str
from pipenv.vendor.vistir.contextmanagers import temp_environ
from pipenv.vendor.vistir.path import create_tracked_tempdir
@@ -35,7 +32,6 @@ from .cache import CACHE_DIR, DependencyCache
from .setup_info import SetupInfo
from .utils import (
clean_requires_python,
fix_requires_python_marker,
format_requirement,
full_groupby,
is_pinned_requirement,
@@ -46,23 +42,12 @@ from .utils import (
)
if MYPY_RUNNING:
from typing import (
Any,
Dict,
Generator,
List,
Optional,
Set,
Text,
Tuple,
TypeVar,
Union,
)
from typing import Any, Dict, List, Optional, Set, Text, TypeVar, Union
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
from pipenv.patched.pip._internal.commands.base_command import Command
from pipenv.patched.pip._internal.commands import Command
from pipenv.patched.pip._internal.index.package_finder import PackageFinder
from pipenv.patched.pip._internal.models.candidate import InstallationCandidate
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
TRequirement = TypeVar("TRequirement")
RequirementType = TypeVar(
@@ -95,11 +80,11 @@ def find_all_matches(finder, ireq, pre=False):
ireq.
:param finder: A package finder for discovering matching candidates.
:type finder: :class:`~pipenv.patched.pip._internal.index.PackageFinder`
:type finder: :class:`~pip._internal.index.PackageFinder`
:param ireq: An install requirement.
:type ireq: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type ireq: :class:`~pip._internal.req.req_install.InstallRequirement`
:return: A list of matching candidates.
:rtype: list[:class:`~pipenv.patched.pip._internal.index.InstallationCandidate`]
:rtype: list[:class:`~pip._internal.index.InstallationCandidate`]
"""
candidates = clean_requires_python(finder.find_all_candidates(ireq.name))
@@ -207,7 +192,7 @@ class AbstractDependency(object):
"""Get the dependencies of the supplied candidate.
:param candidate: An installrequirement
:type candidate: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type candidate: :class:`~pip._internal.req.req_install.InstallRequirement`
:return: A list of abstract dependencies
:rtype: list[:class:`~requirementslib.models.dependency.AbstractDependency`]
"""
@@ -316,11 +301,11 @@ def get_dependencies(ireq, sources=None, parent=None):
"""Get all dependencies for a given install requirement.
:param ireq: A single InstallRequirement
:type ireq: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type ireq: :class:`~pip._internal.req.req_install.InstallRequirement`
:param sources: Pipfile-formatted sources, defaults to None
:type sources: list[dict], optional
:param parent: The parent of this list of dependencies, defaults to None
:type parent: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type parent: :class:`~pip._internal.req.req_install.InstallRequirement`
:return: A set of dependency lines for generating new InstallRequirements.
:rtype: set(str)
"""
@@ -350,7 +335,7 @@ def get_dependencies_from_wheel_cache(ireq):
cache.
:param ireq: A single InstallRequirement
:type ireq: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type ireq: :class:`~pip._internal.req.req_install.InstallRequirement`
:return: A set of dependency lines for generating new InstallRequirements.
:rtype: set(str) or None
"""
@@ -377,7 +362,7 @@ def get_dependencies_from_json(ireq):
api.
:param ireq: A single InstallRequirement
:type ireq: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type ireq: :class:`~pip._internal.req.req_install.InstallRequirement`
:return: A set of dependency lines for generating new InstallRequirements.
:rtype: set(str) or None
"""
@@ -427,7 +412,7 @@ def get_dependencies_from_cache(ireq):
dependency cache.
:param ireq: A single InstallRequirement
:type ireq: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type ireq: :class:`~pip._internal.req.req_install.InstallRequirement`
:return: A set of dependency lines for generating new InstallRequirements.
:rtype: set(str) or None
"""
@@ -531,7 +516,7 @@ def get_dependencies_from_index(dep, sources=None, pip_options=None, wheel_cache
resolver.
:param dep: A single InstallRequirement
:type dep: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type dep: :class:`~pip._internal.req.req_install.InstallRequirement`
:param sources: Pipfile-formatted sources, defaults to None
:type sources: list[dict], optional
:return: A set of dependency lines for generating new InstallRequirements.
@@ -570,9 +555,9 @@ def get_pip_options(args=None, sources=None, pip_command=None):
:param sources: A list of pipfile-formatted sources, defaults to None
:param sources: list[dict], optional
:param pip_command: A pre-built pip command instance
:type pip_command: :class:`~pipenv.patched.pip._internal.cli.base_command.Command`
:type pip_command: :class:`~pip._internal.cli.base_command.Command`
:return: An instance of pip_options using the supplied arguments plus sane defaults
:rtype: :class:`~pipenv.patched.pip._internal.cli.cmdoptions`
:rtype: :class:`~pip._internal.cli.cmdoptions`
"""
if not pip_command:
@@ -594,11 +579,11 @@ def get_finder(sources=None, pip_command=None, pip_options=None):
:param sources: A list of pipfile-formatted sources, defaults to None
:param sources: list[dict], optional
:param pip_command: A pip command instance, defaults to None
:type pip_command: :class:`~pipenv.patched.pip._internal.cli.base_command.Command`
:type pip_command: :class:`~pip._internal.cli.base_command.Command`
:param pip_options: A pip options, defaults to None
:type pip_options: :class:`~pipenv.patched.pip._internal.cli.cmdoptions`
:type pip_options: :class:`~pip._internal.cli.cmdoptions`
:return: A package finder
:rtype: :class:`~pipenv.patched.pip._internal.index.PackageFinder`
:rtype: :class:`~pip._internal.index.PackageFinder`
"""
if not pip_command:
@@ -618,12 +603,12 @@ def start_resolver(finder=None, session=None, wheel_cache=None):
"""Context manager to produce a resolver.
:param finder: A package finder to use for searching the index
:type finder: :class:`~pipenv.patched.pip._internal.index.PackageFinder`
:type finder: :class:`~pip._internal.index.PackageFinder`
:param :class:`~requests.Session` session: A session instance
:param :class:`~pipenv.patched.pip._internal.cache.WheelCache` wheel_cache: A pip WheelCache instance
:param :class:`~pip._internal.cache.WheelCache` wheel_cache: A pip WheelCache instance
:return: A 3-tuple of finder, preparer, resolver
:rtype: (:class:`~pipenv.patched.pip._internal.operations.prepare.RequirementPreparer`,
:class:`~pipenv.patched.pip._internal.resolve.Resolver`)
:rtype: (:class:`~pip._internal.operations.prepare.RequirementPreparer`,
:class:`~pip._internal.resolve.Resolver`)
"""
pip_command = get_pip_command()
+2 -3
View File
@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
import itertools
import operator
import re
@@ -6,7 +5,7 @@ from collections.abc import Mapping, Set
from functools import lru_cache, reduce
import pipenv.vendor.attr as attr
import distlib.markers
from pipenv.vendor.distlib import markers
from pipenv.patched.pip._vendor.packaging.markers import InvalidMarker, Marker
from pipenv.patched.pip._vendor.packaging.specifiers import LegacySpecifier, Specifier, SpecifierSet
from pipenv.patched.pip._vendor.packaging.version import parse
@@ -514,7 +513,7 @@ def get_contained_pyversions(marker):
return set()
# Use the distlib dictionary parser to create a dictionary 'trie' which is a bit
# easier to reason about
marker_dict = distlib.markers.parse_marker(marker_str)[0]
marker_dict = markers.parse_marker(marker_str)[0]
version_set = set()
pyversions, _ = parse_marker_dict(marker_dict)
if isinstance(pyversions, set):
+16 -18
View File
@@ -1,4 +1,3 @@
# -*- coding=utf-8 -*-
import datetime
import functools
import io
@@ -12,10 +11,10 @@ from functools import reduce
from typing import Sequence
import pipenv.vendor.attr as attr
import distlib.metadata
import distlib.wheel
import pipenv.patched.pip._vendor.requests as requests
import pipenv.vendor.vistir as vistir
from pipenv.vendor.distlib import wheel
from pipenv.vendor.distlib.metadata import Metadata
from pipenv.patched.pip._vendor.packaging.markers import Marker
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
from pipenv.patched.pip._vendor.packaging.specifiers import Specifier, SpecifierSet
@@ -47,7 +46,6 @@ if MYPY_RUNNING:
Any,
Callable,
Dict,
Generator,
Generic,
Iterator,
List,
@@ -59,7 +57,7 @@ if MYPY_RUNNING:
Union,
)
from pipenv.vendor.attr import Attribute # noqa
from attr import Attribute # noqa
from .setup_info import SetupInfo
@@ -137,7 +135,7 @@ def validate_digest(inst, attrib, value):
def get_local_wheel_metadata(wheel_file):
# type: (str) -> Optional[distlib.metadata.Metadata]
# type: (str) -> Optional[Metadata]
parsed_metadata = None
with io.open(wheel_file, "rb") as fh:
with zipfile.ZipFile(fh, mode="r", compression=zipfile.ZIP_DEFLATED) as zf:
@@ -149,7 +147,7 @@ def get_local_wheel_metadata(wheel_file):
if metadata is None:
raise RuntimeError("No metadata found in wheel: {0}".format(wheel_file))
with zf.open(metadata, "r") as metadata_fh:
parsed_metadata = distlib.metadata.Metadata(fileobj=metadata_fh)
parsed_metadata = Metadata(fileobj=metadata_fh)
return parsed_metadata
@@ -165,7 +163,7 @@ def get_remote_sdist_metadata(line):
def get_remote_wheel_metadata(whl_file):
# type: (str) -> Optional[distlib.metadata.Metadata]
# type: (str) -> Optional[Metadata]
parsed_metadata = None
data = io.BytesIO()
with vistir.contextmanagers.open_file(whl_file) as fp:
@@ -180,7 +178,7 @@ def get_remote_wheel_metadata(whl_file):
if metadata is None:
raise RuntimeError("No metadata found in wheel: {0}".format(whl_file))
with zf.open(metadata, "r") as metadata_fh:
parsed_metadata = distlib.metadata.Metadata(fileobj=metadata_fh)
parsed_metadata = Metadata(fileobj=metadata_fh)
return parsed_metadata
@@ -258,11 +256,11 @@ class Dependency(object):
markers = [marker_from_specifier(str(s)) for s in specifiers]
py_version_part = reduce(merge_markers, markers)
if self.markers:
line_str = "{0}; {1}".format(line_str, str(self.markers))
line_str = "{0} ; {1}".format(line_str, str(self.markers))
if py_version_part:
line_str = "{0} and {1}".format(line_str, py_version_part)
elif py_version_part and not self.markers:
line_str = "{0}; {1}".format(line_str, py_version_part)
line_str = "{0} ; {1}".format(line_str, py_version_part)
return line_str
def pin(self):
@@ -350,7 +348,7 @@ class Dependency(object):
marker_str = "{0!s}".format(marker)
req_str = "{0}=={1}".format(info.name, info.version)
if marker_str:
req_str = "{0}; {1}".format(req_str, marker_str)
req_str = "{0} ; {1}".format(req_str, marker_str)
req = PackagingRequirement(req_str)
requires_python_str = (
info.requires_python if info.requires_python is not None else ""
@@ -570,7 +568,7 @@ class ReleaseUrl(object):
markers = self.markers
req_str = "{0} @ {1}#egg={0}".format(self.name, self.url)
if markers:
req_str = "{0}; {1}".format(req_str, markers)
req_str = "{0} ; {1}".format(req_str, markers)
return req_str
def get_markers_from_wheel(self):
@@ -644,7 +642,7 @@ class ReleaseUrl(object):
release_url = cls(**filter_dict(creation_kwargs)) # type: ignore
if release_url.is_wheel:
supported_tags = [
parse_tag(Tag(*tag)) for tag in distlib.wheel.Wheel(release_url.url).tags
parse_tag(Tag(*tag)) for tag in wheel.Wheel(release_url.url).tags
]
release_url = attr.evolve(release_url, tags=supported_tags)
return release_url
@@ -858,8 +856,8 @@ class ReleaseCollection(object):
def wheels(self):
# type: () -> Iterator[ReleaseUrl]
for release in self.sort_releases():
for wheel in release.wheels:
yield wheel
for w in release.wheels:
yield w
def sdists(self):
# type: () -> Iterator[ReleaseUrl]
@@ -1060,8 +1058,8 @@ class Package(object):
@property
def latest_wheels(self):
# type: () -> Iterator[ReleaseUrl]
for wheel in self.urls.wheels:
yield wheel
for w in self.urls.wheels:
yield w
@property
def dependencies(self):
+1 -1
View File
@@ -135,7 +135,7 @@ class Project(object):
)
def add_line_to_pipfile(self, line, develop):
from pipenv.vendor.requirementslib import Requirement
from requirementslib import Requirement
requirement = Requirement.from_line(line)
section = self._get_pipfile_section(develop=develop)
+11 -12
View File
@@ -60,7 +60,6 @@ from .setup_info import (
_prepare_wheel_building_kwargs,
ast_parse_setup_py,
get_metadata,
parse_setup_cfg,
)
from .url import URI
from .utils import (
@@ -205,7 +204,7 @@ class Line(object):
def __str__(self):
# type: () -> str
if self.markers:
return "{0}; {1}".format(self.get_line(), self.markers)
return "{0} ; {1}".format(self.get_line(), self.markers)
return self.get_line()
def get_line(
@@ -237,7 +236,7 @@ class Line(object):
# we anticipate this will be used if passing directly to the command line
# for pip.
if with_markers and self.markers:
line = "{0}; {1}".format(line, self.markers)
line = "{0} ; {1}".format(line, self.markers)
if with_prefix and self.editable and not as_list:
line = '"{0}"'.format(line)
if as_list:
@@ -1182,8 +1181,7 @@ class Line(object):
def parse_markers(self):
# type: () -> None
if self.markers:
marker_str = self.markers.replace('"', "'")
markers = PackagingRequirement("fakepkg; {0}".format(marker_str)).marker
pkg_name, markers = split_markers_from_line(self.line)
self.parsed_marker = markers
@property
@@ -1287,7 +1285,6 @@ class Line(object):
if self.markers:
self.markers = self.markers.replace('"', "'")
self.parse_extras()
self.line = self.line.strip('"').strip("'").strip()
if self.line.startswith("git+file:/") and not self.line.startswith(
"git+file:///"
):
@@ -1469,7 +1466,7 @@ class FileRequirement(object):
forward slashes. Can be None if the line is a remote URI.
- `uri` is the absolute URI to the package. Can be None if the line is
not a URI.
- `link` is an instance of :class:`pipenv.patched.pip._internal.index.Link`,
- `link` is an instance of :class:`pip._internal.index.Link`,
representing a URI parse result based on the value of `uri`.
This function is provided to deal with edge cases concerning URIs
@@ -2536,7 +2533,7 @@ class Requirement(object):
if self._specifiers and not (self.is_file_or_url or self.is_vcs):
line_parts.append(self._specifiers)
if self.markers:
line_parts.append("; {0}".format(self.markers.replace('"', "'")))
line_parts.append(" ; {0}".format(self.markers.replace('"', "'")))
if self.hashes_as_pip and not (self.editable or self.vcs or self.is_vcs):
line_parts.append(self.hashes_as_pip)
if self.editable:
@@ -2695,7 +2692,9 @@ class Requirement(object):
r = named_req_from_parsed_line(parsed_line)
req_markers = None
if parsed_line.markers:
req_markers = PackagingRequirement("fakepkg; {0}".format(parsed_line.markers))
req_markers = PackagingRequirement(
"fakepkg ; {0}".format(parsed_line.markers)
)
if r is not None and r.req is not None:
r.req.marker = getattr(req_markers, "marker", None) if req_markers else None
args = {} # type: Dict[STRING_TYPE, CREATION_ARG_TYPES]
@@ -2754,7 +2753,7 @@ class Requirement(object):
req_markers = None
if markers:
markers = str(markers)
req_markers = PackagingRequirement("fakepkg; {0}".format(markers))
req_markers = PackagingRequirement("fakepkg ; {0}".format(markers))
if r.req is not None:
r.req.marker = req_markers.marker
extras = _pipfile.get("extras")
@@ -2821,7 +2820,7 @@ class Requirement(object):
# type: () -> Marker
markers = self.markers
if markers:
fake_pkg = PackagingRequirement("fakepkg; {0}".format(markers))
fake_pkg = PackagingRequirement("fakepkg ; {0}".format(markers))
markers = fake_pkg.marker
return markers
@@ -2994,7 +2993,7 @@ class Requirement(object):
:param sources: list[dict], optional
:param PackageFinder finder: A **PackageFinder** instance from pip's repository implementation
:return: A list of Installation Candidates
:rtype: list[ :class:`~pipenv.patched.pip._internal.index.InstallationCandidate` ]
:rtype: list[ :class:`~pip._internal.index.InstallationCandidate` ]
"""
from .dependencies import find_all_matches, get_finder
+29 -39
View File
@@ -2,28 +2,32 @@ import ast
import atexit
import configparser
import contextlib
import importlib
import operator
import os
import shutil
import sys
from collections.abc import Iterable, Mapping
from functools import lru_cache, partial
from contextlib import ExitStack
from functools import lru_cache
from os import scandir
from pathlib import Path
from urllib.parse import parse_qs, urlparse, urlunparse
from weakref import finalize
import pipenv.vendor.attr as attr
from pipenv.patched.pip._vendor.pep517 import envbuild
from pipenv.patched.pip._vendor.pep517 import wrappers
import attr
from pipenv.patched.pip._vendor.pep517 import envbuild, wrappers
from pipenv.vendor.distlib.wheel import Wheel
from pipenv.patched.pip._vendor.packaging.markers import Marker
from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
from pipenv.patched.pip._vendor.packaging.version import parse
from pipenv.patched.pip._internal.commands.install import InstallCommand
from pipenv.patched.pip._internal.network.download import Downloader
from pipenv.patched.pip._internal.utils.temp_dir import global_tempdir_manager
from pipenv.patched.pip._internal.utils.urls import url_to_path
from pipenv.patched.pip._vendor.packaging.markers import Marker
from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
from pipenv.patched.pip._vendor.packaging.version import parse
from pipenv.patched.pip._vendor.pkg_resources import (
PathMetadata,
Requirement,
distributions_from_metadata,
find_distributions,
)
from pipenv.vendor.platformdirs import user_cache_dir
from pipenv.vendor.vistir.contextmanagers import cd, temp_path
from pipenv.vendor.vistir.misc import run
@@ -42,14 +46,6 @@ from .utils import (
strip_extras_markers_from_requirement,
)
try:
import pipenv.patched.pip._vendor.pkg_resources.extern.packaging.requirements as pkg_resources_requirements
except ModuleNotFoundError:
pkg_resources_requirements = None
from contextlib import ExitStack
from os import scandir
if MYPY_RUNNING:
from typing import (
Any,
@@ -66,12 +62,11 @@ if MYPY_RUNNING:
Union,
)
import pipenv.patched.pip._vendor.requests as requests
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
from pipenv.patched.pip._internal.index.package_finder import PackageFinder
from pipenv.patched.pip._internal.req.req_install import InstallRequirement
from pipenv.patched.pip._vendor.pkg_resources import DistInfoDistribution, EggInfoDistribution, PathMetadata
from pipenv.patched.pip._vendor.pkg_resources import Requirement as PkgResourcesRequirement
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
from pipenv.patched.pip._vendor.pkg_resources import DistInfoDistribution, EggInfoDistribution
from pipenv.patched.pip._vendor.requests import Session
try:
from setuptools.dist import Distribution
@@ -157,9 +152,7 @@ def make_base_requirements(reqs):
for req in reqs:
if isinstance(req, BaseRequirement):
requirements.add(req)
elif pkg_resources_requirements is not None and isinstance(
req, pkg_resources_requirements.Requirement
):
elif isinstance(req, Requirement):
requirements.add(BaseRequirement.from_req(req))
elif req and isinstance(req, str) and not req.startswith("#"):
requirements.add(BaseRequirement.from_string(req))
@@ -585,8 +578,7 @@ def _get_src_dir(root):
@lru_cache()
def ensure_reqs(reqs):
# type: (List[Union[S, PkgResourcesRequirement]]) -> List[PkgResourcesRequirement]
import pipenv.patched.pip._vendor.pkg_resources as pkg_resources
# type: (List[Union[S, Requirement]]) -> List[Requirement]
if not isinstance(reqs, Iterable):
raise TypeError("Expecting an Iterable, got %r" % reqs)
@@ -595,7 +587,7 @@ def ensure_reqs(reqs):
if not req:
continue
if isinstance(req, str):
req = pkg_resources.Requirement.parse("{0}".format(str(req)))
req = Requirement.parse("{0}".format(str(req)))
# req = strip_extras_markers_from_requirement(req)
new_reqs.append(req)
return new_reqs
@@ -731,13 +723,12 @@ def find_distinfo(target, pkg_name=None):
def get_distinfo_dist(path, pkg_name=None):
# type: (S, Optional[S]) -> Optional[DistInfoDistribution]
import pipenv.patched.pip._vendor.pkg_resources as pkg_resources
dist_dir = next(iter(find_distinfo(path, pkg_name=pkg_name)), None)
if dist_dir is not None:
metadata_dir = dist_dir.path
base_dir = os.path.dirname(metadata_dir)
dist = next(iter(pkg_resources.find_distributions(base_dir)), None)
dist = next(iter(find_distributions(base_dir)), None)
if dist is not None:
return dist
return None
@@ -745,14 +736,13 @@ def get_distinfo_dist(path, pkg_name=None):
def get_egginfo_dist(path, pkg_name=None):
# type: (S, Optional[S]) -> Optional[EggInfoDistribution]
import pipenv.patched.pip._vendor.pkg_resources as pkg_resources
egg_dir = next(iter(find_egginfo(path, pkg_name=pkg_name)), None)
if egg_dir is not None:
metadata_dir = egg_dir.path
base_dir = os.path.dirname(metadata_dir)
path_metadata = pkg_resources.PathMetadata(base_dir, metadata_dir)
dist_iter = pkg_resources.distributions_from_metadata(path_metadata.egg_info)
path_metadata = PathMetadata(base_dir, metadata_dir)
dist_iter = distributions_from_metadata(path_metadata.egg_info)
dist = next(iter(dist_iter), None)
if dist is not None:
return dist
@@ -829,7 +819,7 @@ def get_metadata_from_dist(dist):
dep_map = dist._build_dep_map()
except Exception:
dep_map = {}
deps = [] # type: List[PkgResourcesRequirement]
deps = [] # type: List[Requirement]
extras = {}
for k in dep_map.keys():
if k is None:
@@ -926,18 +916,18 @@ class BaseRequirement(object):
name = attr.ib(default="", eq=True, order=True) # type: STRING_TYPE
requirement = attr.ib(
default=None, eq=True, order=True
) # type: Optional[PkgResourcesRequirement]
) # type: Optional[Requirement]
def __str__(self):
# type: () -> S
return "{0}".format(str(self.requirement))
def as_dict(self):
# type: () -> Dict[STRING_TYPE, Optional[PkgResourcesRequirement]]
# type: () -> Dict[STRING_TYPE, Optional[Requirement]]
return {self.name: self.requirement}
def as_tuple(self):
# type: () -> Tuple[STRING_TYPE, Optional[PkgResourcesRequirement]]
# type: () -> Tuple[STRING_TYPE, Optional[Requirement]]
return (self.name, self.requirement)
@classmethod
@@ -951,7 +941,7 @@ class BaseRequirement(object):
@classmethod
@lru_cache()
def from_req(cls, req):
# type: (PkgResourcesRequirement) -> BaseRequirement
# type: (Requirement) -> BaseRequirement
name = None
key = getattr(req, "key", None)
name = getattr(req, "name", None)
@@ -1484,7 +1474,7 @@ build-backend = "{1}"
@classmethod
@lru_cache()
def from_ireq(cls, ireq, subdir=None, finder=None, session=None):
# type: (InstallRequirement, Optional[AnyStr], Optional[PackageFinder], Optional[requests.Session]) -> Optional[SetupInfo]
# type: (InstallRequirement, Optional[AnyStr], Optional[PackageFinder], Optional[Session]) -> Optional[SetupInfo]
if not ireq.link:
return None
if ireq.link.is_wheel:
+19 -34
View File
@@ -1,4 +1,3 @@
import io
import os
import re
import string
@@ -10,11 +9,14 @@ from pathlib import Path
import pipenv.vendor.tomlkit as tomlkit
from pipenv.vendor.attr import validators
from pipenv.patched.pip._vendor.packaging.markers import InvalidMarker, Marker, Op, Value, Variable
from pipenv.patched.pip._vendor.packaging.specifiers import InvalidSpecifier, Specifier, SpecifierSet
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
from pipenv.patched.pip._internal.models.link import Link
from pipenv.patched.pip._internal.req.constructors import install_req_from_line
from pipenv.patched.pip._vendor.packaging.markers import InvalidMarker, Marker, Op, Value, Variable
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
from pipenv.patched.pip._vendor.packaging.specifiers import InvalidSpecifier, Specifier, SpecifierSet
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
from pipenv.patched.pip._vendor.pkg_resources import Requirement, get_distribution, safe_name
from pipenv.vendor.plette.models import Package, PackageCollection
from pipenv.vendor.tomlkit.container import Container
from pipenv.vendor.tomlkit.items import AoT, Array, Bool, InlineTable, Item, String, Table
@@ -35,7 +37,6 @@ if MYPY_RUNNING:
List,
Match,
Optional,
Sequence,
Set,
Text,
Tuple,
@@ -48,8 +49,6 @@ if MYPY_RUNNING:
from pipenv.patched.pip._vendor.packaging.markers import Op as PkgResourcesOp
from pipenv.patched.pip._vendor.packaging.markers import Value as PkgResourcesValue
from pipenv.patched.pip._vendor.packaging.markers import Variable as PkgResourcesVariable
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
from pipenv.patched.pip._vendor.pkg_resources import Requirement as PkgResourcesRequirement
from pipenv.patched.pip._vendor.urllib3.util.url import Url
_T = TypeVar("_T")
@@ -58,7 +57,7 @@ if MYPY_RUNNING:
TValue = TypeVar("TValue", PkgResourcesValue, Value)
TOp = TypeVar("TOp", PkgResourcesOp, Op)
MarkerTuple = Tuple[TVariable, TOp, TValue]
TRequirement = Union[PackagingRequirement, PkgResourcesRequirement]
TRequirement = Union[PackagingRequirement, Requirement]
STRING_TYPE = Union[bytes, str, Text]
TOML_DICT_TYPES = Union[Container, Package, PackageCollection, Table, InlineTable]
S = TypeVar("S", bytes, str, Text)
@@ -189,7 +188,6 @@ def init_requirement(name):
if not isinstance(name, str):
raise TypeError("must supply a name to generate a requirement")
from pipenv.patched.pip._vendor.pkg_resources import Requirement
req = Requirement.parse(name)
req.vcs = None
@@ -225,9 +223,6 @@ def parse_extras(extras_str):
:return: A sorted list of extras
:rtype: List[str]
"""
from pipenv.patched.pip._vendor.pkg_resources import Requirement
extras = Requirement.parse("fakepkg{0}".format(extras_to_string(extras_str))).extras
return sorted(dedup([extra.lower() for extra in extras]))
@@ -456,11 +451,8 @@ def _strip_extras_markers(marker):
@lru_cache()
def get_setuptools_version():
# type: () -> Optional[STRING_TYPE]
import pipenv.patched.pip._vendor.pkg_resources as pkg_resources
setuptools_dist = pkg_resources.get_distribution(
pkg_resources.Requirement("setuptools")
)
setuptools_dist = get_distribution(Requirement("setuptools"))
return getattr(setuptools_dist, "version", None)
@@ -526,10 +518,7 @@ def split_markers_from_line(line):
)
if line_quote and line.endswith(line_quote):
line = line.strip(line_quote)
if not any(line.startswith(uri_prefix) for uri_prefix in SCHEME_LIST):
marker_sep = ";"
else:
marker_sep = "; "
marker_sep = " ; "
markers = None
if marker_sep in line:
line, markers = line.split(marker_sep, 1)
@@ -644,7 +633,7 @@ def _requirement_to_str_lowercase_name(requirement):
parts.append("@ {0}".format(requirement.url))
if requirement.marker:
parts.append("; {0}".format(requirement.marker))
parts.append(" ; {0}".format(requirement.marker))
return "".join(parts)
@@ -666,11 +655,11 @@ def format_requirement(ireq):
if str(ireq.req.marker) != str(ireq.markers):
if not ireq.req.marker:
line = "{}; {}".format(line, ireq.markers)
line = "{} ; {}".format(line, ireq.markers)
else:
name, markers = line.split(";", 1)
markers = markers.strip()
line = "{}; ({}) and ({})".format(name, markers, ireq.markers)
line = "{} ; ({}) and ({})".format(name, markers, ireq.markers)
return line
@@ -851,7 +840,7 @@ def name_from_req(req):
def make_install_requirement(
name, version=None, extras=None, markers=None, constraint=False
):
"""Generates an :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`.
"""Generates an :class:`~pip._internal.req.req_install.InstallRequirement`.
Create an InstallRequirement from the supplied metadata.
@@ -866,7 +855,7 @@ def make_install_requirement(
:param constraint: Whether to flag the requirement as a constraint, defaults to False.
:param constraint: bool, optional
:return: A generated InstallRequirement
:rtype: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:rtype: :class:`~pip._internal.req.req_install.InstallRequirement`
"""
requirement_string = "{0}".format(name)
if extras:
@@ -876,16 +865,16 @@ def make_install_requirement(
if version:
requirement_string = "{0}=={1}".format(requirement_string, str(version))
if markers:
requirement_string = "{0}; {1}".format(requirement_string, str(markers))
requirement_string = "{0} ; {1}".format(requirement_string, str(markers))
return install_req_from_line(requirement_string, constraint=constraint)
def version_from_ireq(ireq):
"""version_from_ireq Extract the version from a supplied
:class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:class:`~pip._internal.req.req_install.InstallRequirement`
:param ireq: An InstallRequirement
:type ireq: :class:`~pipenv.patched.pip._internal.req.req_install.InstallRequirement`
:type ireq: :class:`~pip._internal.req.req_install.InstallRequirement`
:return: The version of the InstallRequirement.
:rtype: str
"""
@@ -907,7 +896,7 @@ def clean_requires_python(candidates):
`requires_python` attributes."""
all_candidates = []
sys_version = ".".join(map(str, sys.version_info[:3]))
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
from pip._vendor.packaging.version import parse as parse_version
py_version = parse_version(os.environ.get("PIP_PYTHON_VERSION", sys_version))
for c in candidates:
@@ -931,8 +920,6 @@ def clean_requires_python(candidates):
def fix_requires_python_marker(requires_python):
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement
marker_str = ""
if any(requires_python.startswith(op) for op in Specifier._operators.keys()):
spec_dict = defaultdict(set)
@@ -952,7 +939,7 @@ def fix_requires_python_marker(requires_python):
for op, vals in spec_dict.items()
]
)
marker_to_add = PackagingRequirement("fakepkg; {0}".format(marker_str)).marker
marker_to_add = PackagingRequirement("fakepkg ; {0}".format(marker_str)).marker
return marker_to_add
@@ -981,8 +968,6 @@ def get_name_variants(pkg):
if not isinstance(pkg, str):
raise TypeError("must provide a string to derive package names")
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
from pipenv.patched.pip._vendor.pkg_resources import safe_name
pkg = pkg.lower()
names = {safe_name(pkg), canonicalize_name(pkg), pkg.replace("-", "_")}
+3 -8
View File
@@ -1,6 +1,3 @@
# -*- coding=utf-8 -*-
from __future__ import absolute_import, print_function
import logging
import os
import sys
@@ -14,6 +11,7 @@ from pipenv.patched.pip._internal.commands.install import InstallCommand
from pipenv.patched.pip._internal.models.target_python import TargetPython
from pipenv.patched.pip._internal.utils.filetypes import is_archive_file
from pipenv.patched.pip._internal.utils.misc import is_installable_dir
from pipenv.patched.pip._vendor.packaging import specifiers
from pipenv.vendor.vistir.path import ensure_mkdir_p, is_valid_url
from .environment import MYPY_RUNNING
@@ -159,7 +157,6 @@ def convert_entry_to_path(path):
def is_installable_file(path):
# type: (PipfileType) -> bool
"""Determine if a path can potentially be installed."""
from pipenv.patched.pip._vendor.packaging import specifiers
if isinstance(path, Mapping):
path = convert_entry_to_path(path)
@@ -203,11 +200,9 @@ def is_installable_file(path):
def get_dist_metadata(dist):
from email.parser import FeedParser
import pipenv.patched.pip._vendor.pkg_resources as pkg_resources
from pipenv.patched.pip._vendor.pkg_resources import DistInfoDistribution
if isinstance(dist, pkg_resources.DistInfoDistribution) and dist.has_metadata(
"METADATA"
):
if isinstance(dist, DistInfoDistribution) and dist.has_metadata("METADATA"):
metadata = dist.get_metadata("METADATA")
elif dist.has_metadata("PKG-INFO"):
metadata = dist.get_metadata("PKG-INFO")