Spaces:
Runtime error
Runtime error
"""Module containing bug report helper(s).""" | |
from __future__ import print_function | |
import json | |
import platform | |
import sys | |
import ssl | |
from pip._vendor import idna | |
from pip._vendor import urllib3 | |
from . import __version__ as requests_version | |
charset_normalizer = None | |
try: | |
from pip._vendor import chardet | |
except ImportError: | |
chardet = None | |
try: | |
from pip._vendor.urllib3.contrib import pyopenssl | |
except ImportError: | |
pyopenssl = None | |
OpenSSL = None | |
cryptography = None | |
else: | |
import OpenSSL | |
import cryptography | |
def _implementation(): | |
"""Return a dict with the Python implementation and version. | |
Provide both the name and the version of the Python implementation | |
currently running. For example, on CPython 2.7.5 it will return | |
{'name': 'CPython', 'version': '2.7.5'}. | |
This function works best on CPython and PyPy: in particular, it probably | |
doesn't work for Jython or IronPython. Future investigation should be done | |
to work out the correct shape of the code for those platforms. | |
""" | |
implementation = platform.python_implementation() | |
if implementation == 'CPython': | |
implementation_version = platform.python_version() | |
elif implementation == 'PyPy': | |
implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, | |
sys.pypy_version_info.minor, | |
sys.pypy_version_info.micro) | |
if sys.pypy_version_info.releaselevel != 'final': | |
implementation_version = ''.join([ | |
implementation_version, sys.pypy_version_info.releaselevel | |
]) | |
elif implementation == 'Jython': | |
implementation_version = platform.python_version() # Complete Guess | |
elif implementation == 'IronPython': | |
implementation_version = platform.python_version() # Complete Guess | |
else: | |
implementation_version = 'Unknown' | |
return {'name': implementation, 'version': implementation_version} | |
def info(): | |
"""Generate information for a bug report.""" | |
try: | |
platform_info = { | |
'system': platform.system(), | |
'release': platform.release(), | |
} | |
except IOError: | |
platform_info = { | |
'system': 'Unknown', | |
'release': 'Unknown', | |
} | |
implementation_info = _implementation() | |
urllib3_info = {'version': urllib3.__version__} | |
charset_normalizer_info = {'version': None} | |
chardet_info = {'version': None} | |
if charset_normalizer: | |
charset_normalizer_info = {'version': charset_normalizer.__version__} | |
if chardet: | |
chardet_info = {'version': chardet.__version__} | |
pyopenssl_info = { | |
'version': None, | |
'openssl_version': '', | |
} | |
if OpenSSL: | |
pyopenssl_info = { | |
'version': OpenSSL.__version__, | |
'openssl_version': '%x' % OpenSSL.SSL.OPENSSL_VERSION_NUMBER, | |
} | |
cryptography_info = { | |
'version': getattr(cryptography, '__version__', ''), | |
} | |
idna_info = { | |
'version': getattr(idna, '__version__', ''), | |
} | |
system_ssl = ssl.OPENSSL_VERSION_NUMBER | |
system_ssl_info = { | |
'version': '%x' % system_ssl if system_ssl is not None else '' | |
} | |
return { | |
'platform': platform_info, | |
'implementation': implementation_info, | |
'system_ssl': system_ssl_info, | |
'using_pyopenssl': pyopenssl is not None, | |
'using_charset_normalizer': chardet is None, | |
'pyOpenSSL': pyopenssl_info, | |
'urllib3': urllib3_info, | |
'chardet': chardet_info, | |
'charset_normalizer': charset_normalizer_info, | |
'cryptography': cryptography_info, | |
'idna': idna_info, | |
'requests': { | |
'version': requests_version, | |
}, | |
} | |
def main(): | |
"""Pretty-print the bug information as JSON.""" | |
print(json.dumps(info(), sort_keys=True, indent=2)) | |
if __name__ == '__main__': | |
main() | |