summaryrefslogtreecommitdiff
path: root/src/pip/_internal/commands/__init__.py
blob: 31c985fdca51a399bc80d345f0f2401ec706426f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
"""
Package containing all pip commands
"""

import importlib
from collections import OrderedDict, namedtuple
from typing import Any, Optional

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):
    # type: (str) -> Optional[str]
    """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 None