You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							58 lines
						
					
					
						
							2.1 KiB
						
					
					
				
			
		
		
	
	
							58 lines
						
					
					
						
							2.1 KiB
						
					
					
				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
 | 
						|
 | 
						|
 | 
						|
@functools.lru_cache(maxsize=512)
 | 
						|
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())
 |