Skip to content

Commit

Permalink
pip's packaging version is behind what we need to work with pipdeptree
Browse files Browse the repository at this point in the history
  • Loading branch information
matteius committed Apr 24, 2024
1 parent c744826 commit 69d2a84
Show file tree
Hide file tree
Showing 29 changed files with 4,587 additions and 22 deletions.
4 changes: 2 additions & 2 deletions pipenv/patched/safety/alerts/requirements.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from __future__ import unicode_literals

from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
from pipenv.vendor.packaging.version import parse as parse_version
from pipenv.vendor.packaging.specifiers import SpecifierSet
import pipenv.patched.pip._vendor.requests as requests

from datetime import datetime
Expand Down
2 changes: 1 addition & 1 deletion pipenv/patched/safety/alerts/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import sys

from functools import wraps
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
from pipenv.vendor.packaging.version import parse as parse_version
from pathlib import Path

import pipenv.vendor.click as click
Expand Down
6 changes: 3 additions & 3 deletions pipenv/patched/safety/safety.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@
from datetime import datetime

import pipenv.patched.pip._vendor.requests as requests
from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version, Version, LegacyVersion, parse
from pipenv.vendor.packaging.specifiers import SpecifierSet
from pipenv.vendor.packaging.utils import canonicalize_name
from pipenv.vendor.packaging.version import parse as parse_version, Version, LegacyVersion, parse

from .constants import (API_MIRRORS, CACHE_FILE, OPEN_MIRRORS, REQUEST_TIMEOUT, API_BASE_URL)
from .errors import (DatabaseFetchError, DatabaseFileNotFoundError,
Expand Down
4 changes: 2 additions & 2 deletions pipenv/patched/safety/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import pipenv.vendor.click as click
from pipenv.vendor.click import BadParameter
from pipenv.vendor.dparse import parse, filetypes
from pipenv.patched.pip._vendor.packaging.utils import canonicalize_name
from pipenv.patched.pip._vendor.packaging.version import parse as parse_version
from pipenv.vendor.packaging.utils import canonicalize_name
from pipenv.vendor.packaging.version import parse as parse_version
from pipenv.vendor.ruamel.yaml import YAML
from pipenv.vendor.ruamel.yaml.error import MarkedYAMLError

Expand Down
2 changes: 1 addition & 1 deletion pipenv/vendor/dparse/dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def full_name(self):

class DparseJSONEncoder(JSONEncoder):
def default(self, o):
from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
from pipenv.vendor.packaging.specifiers import SpecifierSet

if isinstance(o, SpecifierSet):
return str(o)
Expand Down
6 changes: 3 additions & 3 deletions pipenv/vendor/dparse/parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,11 @@
from .regex import HASH_REGEX

from .dependencies import DependencyFile, Dependency
from pipenv.patched.pip._vendor.packaging.requirements import Requirement as PackagingRequirement,\
from pipenv.vendor.packaging.requirements import Requirement as PackagingRequirement,\
InvalidRequirement
from . import filetypes
from pipenv.patched.pip._vendor.packaging.specifiers import SpecifierSet
from pipenv.patched.pip._vendor.packaging.version import Version, InvalidVersion
from pipenv.vendor.packaging.specifiers import SpecifierSet
from pipenv.vendor.packaging.version import Version, InvalidVersion
import json

if sys.version_info >= (3, 11):
Expand Down
3 changes: 3 additions & 0 deletions pipenv/vendor/packaging/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This software is made available under the terms of *either* of the licenses
found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made
under the terms of *both* these licenses.
15 changes: 15 additions & 0 deletions pipenv/vendor/packaging/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.

__title__ = "packaging"
__summary__ = "Core utilities for Python packages"
__uri__ = "https://github.com/pypa/packaging"

__version__ = "24.0"

__author__ = "Donald Stufft and individual contributors"
__email__ = "donald@stufft.io"

__license__ = "BSD-2-Clause or Apache-2.0"
__copyright__ = "2014 %s" % __author__
108 changes: 108 additions & 0 deletions pipenv/vendor/packaging/_elffile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
"""
ELF file parser.
This provides a class ``ELFFile`` that parses an ELF executable in a similar
interface to ``ZipFile``. Only the read interface is implemented.
Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
"""

import enum
import os
import struct
from typing import IO, Optional, Tuple


class ELFInvalid(ValueError):
pass


class EIClass(enum.IntEnum):
C32 = 1
C64 = 2


class EIData(enum.IntEnum):
Lsb = 1
Msb = 2


class EMachine(enum.IntEnum):
I386 = 3
S390 = 22
Arm = 40
X8664 = 62
AArc64 = 183


class ELFFile:
"""
Representation of an ELF executable.
"""

def __init__(self, f: IO[bytes]) -> None:
self._f = f

try:
ident = self._read("16B")
except struct.error:
raise ELFInvalid("unable to parse identification")
magic = bytes(ident[:4])
if magic != b"\x7fELF":
raise ELFInvalid(f"invalid magic: {magic!r}")

self.capacity = ident[4] # Format for program header (bitness).
self.encoding = ident[5] # Data structure encoding (endianness).

try:
# e_fmt: Format for program header.
# p_fmt: Format for section header.
# p_idx: Indexes to find p_type, p_offset, and p_filesz.
e_fmt, self._p_fmt, self._p_idx = {
(1, 1): ("<HHIIIIIHHH", "<IIIIIIII", (0, 1, 4)), # 32-bit LSB.
(1, 2): (">HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB.
(2, 1): ("<HHIQQQIHHH", "<IIQQQQQQ", (0, 2, 5)), # 64-bit LSB.
(2, 2): (">HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB.
}[(self.capacity, self.encoding)]
except KeyError:
raise ELFInvalid(
f"unrecognized capacity ({self.capacity}) or "
f"encoding ({self.encoding})"
)

try:
(
_,
self.machine, # Architecture type.
_,
_,
self._e_phoff, # Offset of program header.
_,
self.flags, # Processor-specific flags.
_,
self._e_phentsize, # Size of section.
self._e_phnum, # Number of sections.
) = self._read(e_fmt)
except struct.error as e:
raise ELFInvalid("unable to parse machine and section information") from e

def _read(self, fmt: str) -> Tuple[int, ...]:
return struct.unpack(fmt, self._f.read(struct.calcsize(fmt)))

@property
def interpreter(self) -> Optional[str]:
"""
The path recorded in the ``PT_INTERP`` section header.
"""
for index in range(self._e_phnum):
self._f.seek(self._e_phoff + self._e_phentsize * index)
try:
data = self._read(self._p_fmt)
except struct.error:
continue
if data[self._p_idx[0]] != 3: # Not PT_INTERP.
continue
self._f.seek(data[self._p_idx[1]])
return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0")
return None

0 comments on commit 69d2a84

Please sign in to comment.