123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- """Module containing bug report helper(s)."""
- import json
- import platform
- import ssl
- import sys
- 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 cryptography
- import OpenSSL
- 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 3.10.3 it will return
- {'name': 'CPython', 'version': '3.10.3'}.
- 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 = "{}.{}.{}".format(
- 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 OSError:
- 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": f"{OpenSSL.SSL.OPENSSL_VERSION_NUMBER:x}",
- }
- cryptography_info = {
- "version": getattr(cryptography, "__version__", ""),
- }
- idna_info = {
- "version": getattr(idna, "__version__", ""),
- }
- system_ssl = ssl.OPENSSL_VERSION_NUMBER
- system_ssl_info = {"version": f"{system_ssl:x}" 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()
|