Spaces:
Sleeping
Sleeping
import functools | |
import logging | |
import re | |
from typing import NewType, Optional, Tuple, cast | |
from pip._vendor.packaging import specifiers, version | |
from pip._vendor.packaging.requirements import Requirement | |
NormalizedExtra = NewType("NormalizedExtra", str) | |
logger = logging.getLogger(__name__) | |
def check_requires_python( | |
requires_python: Optional[str], version_info: Tuple[int, ...] | |
) -> bool: | |
""" | |
Check if the given Python version matches a "Requires-Python" specifier. | |
:param version_info: A 3-tuple of ints representing a Python | |
major-minor-micro version to check (e.g. `sys.version_info[:3]`). | |
:return: `True` if the given Python version satisfies the requirement. | |
Otherwise, return `False`. | |
:raises InvalidSpecifier: If `requires_python` has an invalid format. | |
""" | |
if requires_python is None: | |
# The package provides no information | |
return True | |
requires_python_specifier = specifiers.SpecifierSet(requires_python) | |
python_version = version.parse(".".join(map(str, version_info))) | |
return python_version in requires_python_specifier | |
def get_requirement(req_string: str) -> Requirement: | |
"""Construct a packaging.Requirement object with caching""" | |
# Parsing requirement strings is expensive, and is also expected to happen | |
# with a low diversity of different arguments (at least relative the number | |
# constructed). This method adds a cache to requirement object creation to | |
# minimize repeated parsing of the same string to construct equivalent | |
# Requirement objects. | |
return Requirement(req_string) | |
def safe_extra(extra: str) -> NormalizedExtra: | |
"""Convert an arbitrary string to a standard 'extra' name | |
Any runs of non-alphanumeric characters are replaced with a single '_', | |
and the result is always lowercased. | |
This function is duplicated from ``pkg_resources``. Note that this is not | |
the same to either ``canonicalize_name`` or ``_egg_link_name``. | |
""" | |
return cast(NormalizedExtra, re.sub("[^A-Za-z0-9.-]+", "_", extra).lower()) | |