mirror of
https://github.com/kennethreitz/requests3.git
synced 2026-06-05 23:10:16 +00:00
567e12bfb8
The suggested usage in a bug report would be
python -c 'from requests import _bug; _bug.print_information()'
This should generate most of the information we tend to ask for
repeatedly from bug reporters.
100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
"""Module containing bug report helper(s)."""
|
|
from __future__ import print_function
|
|
|
|
import json
|
|
import platform
|
|
import sys
|
|
import ssl
|
|
|
|
from . import __version__ as requests_version
|
|
|
|
try:
|
|
from .packages.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 verison.
|
|
|
|
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 information():
|
|
"""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()
|
|
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__', ''),
|
|
}
|
|
|
|
return {
|
|
'platform': platform_info,
|
|
'implementation': implementation_info,
|
|
'system_ssl': {
|
|
'version': '%x' % ssl.OPENSSL_VERSION_NUMBER,
|
|
},
|
|
'using_pyopenssl': pyopenssl is not None,
|
|
'pyOpenSSL': pyopenssl_info,
|
|
'cryptography': cryptography_info,
|
|
'requests': {
|
|
'version': requests_version,
|
|
},
|
|
}
|
|
|
|
|
|
def print_information():
|
|
"""Pretty-print the bug information as JSON."""
|
|
print(json.dumps(information(), sort_keys=True, indent=2))
|