123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- """Module containing bug report helper(s)."""
- from __future__ import print_function
- import json
- import platform
- import sys
- import ssl
- import idna
- import urllib3
- from . import __version__ as requests_version
- try:
- import charset_normalizer
- except ImportError:
- charset_normalizer = None
- try:
- import chardet
- except ImportError:
- chardet = None
- try:
- from 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()
|