Path: blob/master/venv/Lib/site-packages/pip/_internal/commands/debug.py
811 views
# The following comment should be removed at some point in the future.1# mypy: disallow-untyped-defs=False23from __future__ import absolute_import45import locale6import logging7import os8import sys910import pip._vendor11from pip._vendor import pkg_resources12from pip._vendor.certifi import where1314from pip import __file__ as pip_location15from pip._internal.cli import cmdoptions16from pip._internal.cli.base_command import Command17from pip._internal.cli.cmdoptions import make_target_python18from pip._internal.cli.status_codes import SUCCESS19from pip._internal.utils.logging import indent_log20from pip._internal.utils.misc import get_pip_version21from pip._internal.utils.typing import MYPY_CHECK_RUNNING2223if MYPY_CHECK_RUNNING:24from types import ModuleType25from typing import Any, List, Optional, Dict26from optparse import Values2728logger = logging.getLogger(__name__)293031def show_value(name, value):32# type: (str, Optional[str]) -> None33logger.info('{}: {}'.format(name, value))343536def show_sys_implementation():37# type: () -> None38logger.info('sys.implementation:')39if hasattr(sys, 'implementation'):40implementation = sys.implementation # type: ignore41implementation_name = implementation.name42else:43implementation_name = ''4445with indent_log():46show_value('name', implementation_name)474849def create_vendor_txt_map():50# type: () -> Dict[str, str]51vendor_txt_path = os.path.join(52os.path.dirname(pip_location),53'_vendor',54'vendor.txt'55)5657with open(vendor_txt_path) as f:58# Purge non version specifying lines.59# Also, remove any space prefix or suffixes (including comments).60lines = [line.strip().split(' ', 1)[0]61for line in f.readlines() if '==' in line]6263# Transform into "module" -> version dict.64return dict(line.split('==', 1) for line in lines) # type: ignore656667def get_module_from_module_name(module_name):68# type: (str) -> ModuleType6970# Module name can be uppercase in vendor.txt for some reason...71module_name = module_name.lower()72# PATCH: setuptools is actually only pkg_resources.73if module_name == 'setuptools':74module_name = 'pkg_resources'7576__import__(77'pip._vendor.{}'.format(module_name),78globals(),79locals(),80level=081)82return getattr(pip._vendor, module_name)838485def get_vendor_version_from_module(module_name):86# type: (str) -> str8788module = get_module_from_module_name(module_name)89version = getattr(module, '__version__', None)9091if not version:92# Try to find version in debundled module info93pkg_set = pkg_resources.WorkingSet(94[os.path.dirname(getattr(module, '__file__'))]95)96package = pkg_set.find(pkg_resources.Requirement.parse(module_name))97version = getattr(package, 'version', None)9899return version100101102def show_actual_vendor_versions(vendor_txt_versions):103# type: (Dict[str, str]) -> None104# Logs the actual version and print extra info105# if there is a conflict or if the actual version could not be imported.106107for module_name, expected_version in vendor_txt_versions.items():108extra_message = ''109actual_version = get_vendor_version_from_module(module_name)110if not actual_version:111extra_message = ' (Unable to locate actual module version, using'\112' vendor.txt specified version)'113actual_version = expected_version114elif actual_version != expected_version:115extra_message = ' (CONFLICT: vendor.txt suggests version should'\116' be {})'.format(expected_version)117118logger.info(119'{name}=={actual}{extra}'.format(120name=module_name,121actual=actual_version,122extra=extra_message123)124)125126127def show_vendor_versions():128# type: () -> None129logger.info('vendored library versions:')130131vendor_txt_versions = create_vendor_txt_map()132with indent_log():133show_actual_vendor_versions(vendor_txt_versions)134135136def show_tags(options):137# type: (Values) -> None138tag_limit = 10139140target_python = make_target_python(options)141tags = target_python.get_tags()142143# Display the target options that were explicitly provided.144formatted_target = target_python.format_given()145suffix = ''146if formatted_target:147suffix = ' (target: {})'.format(formatted_target)148149msg = 'Compatible tags: {}{}'.format(len(tags), suffix)150logger.info(msg)151152if options.verbose < 1 and len(tags) > tag_limit:153tags_limited = True154tags = tags[:tag_limit]155else:156tags_limited = False157158with indent_log():159for tag in tags:160logger.info(str(tag))161162if tags_limited:163msg = (164'...\n'165'[First {tag_limit} tags shown. Pass --verbose to show all.]'166).format(tag_limit=tag_limit)167logger.info(msg)168169170def ca_bundle_info(config):171levels = set()172for key, value in config.items():173levels.add(key.split('.')[0])174175if not levels:176return "Not specified"177178levels_that_override_global = ['install', 'wheel', 'download']179global_overriding_level = [180level for level in levels if level in levels_that_override_global181]182if not global_overriding_level:183return 'global'184185if 'global' in levels:186levels.remove('global')187return ", ".join(levels)188189190class DebugCommand(Command):191"""192Display debug information.193"""194195usage = """196%prog <options>"""197ignore_require_venv = True198199def __init__(self, *args, **kw):200super(DebugCommand, self).__init__(*args, **kw)201202cmd_opts = self.cmd_opts203cmdoptions.add_target_python_options(cmd_opts)204self.parser.insert_option_group(0, cmd_opts)205self.parser.config.load()206207def run(self, options, args):208# type: (Values, List[Any]) -> int209logger.warning(210"This command is only meant for debugging. "211"Do not use this with automation for parsing and getting these "212"details, since the output and options of this command may "213"change without notice."214)215show_value('pip version', get_pip_version())216show_value('sys.version', sys.version)217show_value('sys.executable', sys.executable)218show_value('sys.getdefaultencoding', sys.getdefaultencoding())219show_value('sys.getfilesystemencoding', sys.getfilesystemencoding())220show_value(221'locale.getpreferredencoding', locale.getpreferredencoding(),222)223show_value('sys.platform', sys.platform)224show_sys_implementation()225226show_value("'cert' config value", ca_bundle_info(self.parser.config))227show_value("REQUESTS_CA_BUNDLE", os.environ.get('REQUESTS_CA_BUNDLE'))228show_value("CURL_CA_BUNDLE", os.environ.get('CURL_CA_BUNDLE'))229show_value("pip._vendor.certifi.where()", where())230show_value("pip._vendor.DEBUNDLED", pip._vendor.DEBUNDLED)231232show_vendor_versions()233234show_tags(options)235236return SUCCESS237238239