You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
4.0 KiB
123 lines
4.0 KiB
"""
|
|
Package containing all pip commands
|
|
"""
|
|
|
|
# The following comment should be removed at some point in the future.
|
|
# mypy: disallow-untyped-defs=False
|
|
# There is currently a bug in python/typeshed mentioned at
|
|
# https://github.com/python/typeshed/issues/3906 which causes the
|
|
# return type of difflib.get_close_matches to be reported
|
|
# as List[Sequence[str]] whereas it should have been List[str]
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import importlib
|
|
from collections import OrderedDict, namedtuple
|
|
|
|
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
|
|
|
|
if MYPY_CHECK_RUNNING:
|
|
from typing import Any
|
|
from pip._internal.cli.base_command import Command
|
|
|
|
|
|
CommandInfo = namedtuple('CommandInfo', 'module_path, class_name, summary')
|
|
|
|
# The ordering matters for help display.
|
|
# Also, even though the module path starts with the same
|
|
# "pip._internal.commands" prefix in each case, we include the full path
|
|
# because it makes testing easier (specifically when modifying commands_dict
|
|
# in test setup / teardown by adding info for a FakeCommand class defined
|
|
# in a test-related module).
|
|
# Finally, we need to pass an iterable of pairs here rather than a dict
|
|
# so that the ordering won't be lost when using Python 2.7.
|
|
commands_dict = OrderedDict([
|
|
('install', CommandInfo(
|
|
'pip._internal.commands.install', 'InstallCommand',
|
|
'Install packages.',
|
|
)),
|
|
('download', CommandInfo(
|
|
'pip._internal.commands.download', 'DownloadCommand',
|
|
'Download packages.',
|
|
)),
|
|
('uninstall', CommandInfo(
|
|
'pip._internal.commands.uninstall', 'UninstallCommand',
|
|
'Uninstall packages.',
|
|
)),
|
|
('freeze', CommandInfo(
|
|
'pip._internal.commands.freeze', 'FreezeCommand',
|
|
'Output installed packages in requirements format.',
|
|
)),
|
|
('list', CommandInfo(
|
|
'pip._internal.commands.list', 'ListCommand',
|
|
'List installed packages.',
|
|
)),
|
|
('show', CommandInfo(
|
|
'pip._internal.commands.show', 'ShowCommand',
|
|
'Show information about installed packages.',
|
|
)),
|
|
('check', CommandInfo(
|
|
'pip._internal.commands.check', 'CheckCommand',
|
|
'Verify installed packages have compatible dependencies.',
|
|
)),
|
|
('config', CommandInfo(
|
|
'pip._internal.commands.configuration', 'ConfigurationCommand',
|
|
'Manage local and global configuration.',
|
|
)),
|
|
('search', CommandInfo(
|
|
'pip._internal.commands.search', 'SearchCommand',
|
|
'Search PyPI for packages.',
|
|
)),
|
|
('cache', CommandInfo(
|
|
'pip._internal.commands.cache', 'CacheCommand',
|
|
"Inspect and manage pip's wheel cache.",
|
|
)),
|
|
('wheel', CommandInfo(
|
|
'pip._internal.commands.wheel', 'WheelCommand',
|
|
'Build wheels from your requirements.',
|
|
)),
|
|
('hash', CommandInfo(
|
|
'pip._internal.commands.hash', 'HashCommand',
|
|
'Compute hashes of package archives.',
|
|
)),
|
|
('completion', CommandInfo(
|
|
'pip._internal.commands.completion', 'CompletionCommand',
|
|
'A helper command used for command completion.',
|
|
)),
|
|
('debug', CommandInfo(
|
|
'pip._internal.commands.debug', 'DebugCommand',
|
|
'Show information useful for debugging.',
|
|
)),
|
|
('help', CommandInfo(
|
|
'pip._internal.commands.help', 'HelpCommand',
|
|
'Show help for commands.',
|
|
)),
|
|
]) # type: OrderedDict[str, CommandInfo]
|
|
|
|
|
|
def create_command(name, **kwargs):
|
|
# type: (str, **Any) -> Command
|
|
"""
|
|
Create an instance of the Command class with the given name.
|
|
"""
|
|
module_path, class_name, summary = commands_dict[name]
|
|
module = importlib.import_module(module_path)
|
|
command_class = getattr(module, class_name)
|
|
command = command_class(name=name, summary=summary, **kwargs)
|
|
|
|
return command
|
|
|
|
|
|
def get_similar_commands(name):
|
|
"""Command name auto-correct."""
|
|
from difflib import get_close_matches
|
|
|
|
name = name.lower()
|
|
|
|
close_commands = get_close_matches(name, commands_dict.keys())
|
|
|
|
if close_commands:
|
|
return close_commands[0]
|
|
else:
|
|
return False
|