| Viewing file:  packaging.py (2.09 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
import functoolsimport 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__)
 
 
 @functools.lru_cache(maxsize=32)
 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
 
 
 @functools.lru_cache(maxsize=2048)
 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())
 
 |