from __future__ import absolute_import from email.parser import FeedParser import logging import sys from pip._vendor.packaging import specifiers from pip._vendor.packaging import version from pip._vendor import pkg_resources from pip import exceptions logger = logging.getLogger(__name__) def check_requires_python(requires_python): """ Check if the python version in use match the `requires_python` specifier. Returns `True` if the version of python in use matches the requirement. Returns `False` if the version of python in use does not matches the requirement. Raises an InvalidSpecifier if `requires_python` have an invalid format. """ if requires_python is None: # The package provides no information return True requires_python_specifier = specifiers.SpecifierSet(requires_python) # We only use major.minor.micro python_version = version.parse('.'.join(map(str, sys.version_info[:3]))) return python_version in requires_python_specifier def get_metadata(dist): if (isinstance(dist, pkg_resources.DistInfoDistribution) and dist.has_metadata('METADATA')): return dist.get_metadata('METADATA') elif dist.has_metadata('PKG-INFO'): return dist.get_metadata('PKG-INFO') def check_dist_requires_python(dist): metadata = get_metadata(dist) feed_parser = FeedParser() feed_parser.feed(metadata) pkg_info_dict = feed_parser.close() requires_python = pkg_info_dict.get('Requires-Python') try: if not check_requires_python(requires_python): raise exceptions.UnsupportedPythonVersion( "%s requires Python '%s' but the running Python is %s" % ( dist.project_name, requires_python, '.'.join(map(str, sys.version_info[:3])),) ) except specifiers.InvalidSpecifier as e: logger.warning( "Package %s has an invalid Requires-Python entry %s - %s" % ( dist.project_name, requires_python, e)) return
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__init__.py | File | 26.55 KB | 0644 |
|
__init__.pyc | File | 27.08 KB | 0644 |
|
__init__.pyo | File | 27.02 KB | 0644 |
|
appdirs.py | File | 8.6 KB | 0644 |
|
appdirs.pyc | File | 8.41 KB | 0644 |
|
appdirs.pyo | File | 8.41 KB | 0644 |
|
build.py | File | 1.28 KB | 0644 |
|
build.pyc | File | 1.68 KB | 0644 |
|
build.pyo | File | 1.68 KB | 0644 |
|
deprecation.py | File | 2.18 KB | 0644 |
|
deprecation.pyc | File | 2.26 KB | 0644 |
|
deprecation.pyo | File | 2.26 KB | 0644 |
|
encoding.py | File | 971 B | 0644 |
|
encoding.pyc | File | 1.25 KB | 0644 |
|
encoding.pyo | File | 1.25 KB | 0644 |
|
filesystem.py | File | 899 B | 0644 |
|
filesystem.pyc | File | 780 B | 0644 |
|
filesystem.pyo | File | 780 B | 0644 |
|
glibc.py | File | 2.87 KB | 0644 |
|
glibc.pyc | File | 1.78 KB | 0644 |
|
glibc.pyo | File | 1.78 KB | 0644 |
|
hashes.py | File | 2.8 KB | 0644 |
|
hashes.pyc | File | 3.87 KB | 0644 |
|
hashes.pyo | File | 3.87 KB | 0644 |
|
logging.py | File | 3.25 KB | 0644 |
|
logging.pyc | File | 4.73 KB | 0644 |
|
logging.pyo | File | 4.73 KB | 0644 |
|
outdated.py | File | 5.85 KB | 0644 |
|
outdated.pyc | File | 5.55 KB | 0644 |
|
outdated.pyo | File | 5.55 KB | 0644 |
|
packaging.py | File | 2.03 KB | 0644 |
|
packaging.pyc | File | 2.4 KB | 0644 |
|
packaging.pyo | File | 2.4 KB | 0644 |
|
setuptools_build.py | File | 278 B | 0644 |
|
setuptools_build.pyc | File | 347 B | 0644 |
|
setuptools_build.pyo | File | 347 B | 0644 |
|
ui.py | File | 11.33 KB | 0644 |
|
ui.pyc | File | 11.41 KB | 0644 |
|
ui.pyo | File | 11.34 KB | 0644 |
|