Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
keewenaw
GitHub Repository: keewenaw/ethereum-wallet-cracker
Path: blob/main/test/lib/python3.9/site-packages/pip/_internal/commands/show.py
4804 views
1
import logging
2
from optparse import Values
3
from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional
4
5
from pip._vendor.packaging.utils import canonicalize_name
6
7
from pip._internal.cli.base_command import Command
8
from pip._internal.cli.status_codes import ERROR, SUCCESS
9
from pip._internal.metadata import BaseDistribution, get_default_environment
10
from pip._internal.utils.misc import write_output
11
12
logger = logging.getLogger(__name__)
13
14
15
class ShowCommand(Command):
16
"""
17
Show information about one or more installed packages.
18
19
The output is in RFC-compliant mail header format.
20
"""
21
22
usage = """
23
%prog [options] <package> ..."""
24
ignore_require_venv = True
25
26
def add_options(self) -> None:
27
self.cmd_opts.add_option(
28
"-f",
29
"--files",
30
dest="files",
31
action="store_true",
32
default=False,
33
help="Show the full list of installed files for each package.",
34
)
35
36
self.parser.insert_option_group(0, self.cmd_opts)
37
38
def run(self, options: Values, args: List[str]) -> int:
39
if not args:
40
logger.warning("ERROR: Please provide a package name or names.")
41
return ERROR
42
query = args
43
44
results = search_packages_info(query)
45
if not print_results(
46
results, list_files=options.files, verbose=options.verbose
47
):
48
return ERROR
49
return SUCCESS
50
51
52
class _PackageInfo(NamedTuple):
53
name: str
54
version: str
55
location: str
56
requires: List[str]
57
required_by: List[str]
58
installer: str
59
metadata_version: str
60
classifiers: List[str]
61
summary: str
62
homepage: str
63
project_urls: List[str]
64
author: str
65
author_email: str
66
license: str
67
entry_points: List[str]
68
files: Optional[List[str]]
69
70
71
def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]:
72
"""
73
Gather details from installed distributions. Print distribution name,
74
version, location, and installed files. Installed files requires a
75
pip generated 'installed-files.txt' in the distributions '.egg-info'
76
directory.
77
"""
78
env = get_default_environment()
79
80
installed = {dist.canonical_name: dist for dist in env.iter_all_distributions()}
81
query_names = [canonicalize_name(name) for name in query]
82
missing = sorted(
83
[name for name, pkg in zip(query, query_names) if pkg not in installed]
84
)
85
if missing:
86
logger.warning("Package(s) not found: %s", ", ".join(missing))
87
88
def _get_requiring_packages(current_dist: BaseDistribution) -> Iterator[str]:
89
return (
90
dist.metadata["Name"] or "UNKNOWN"
91
for dist in installed.values()
92
if current_dist.canonical_name
93
in {canonicalize_name(d.name) for d in dist.iter_dependencies()}
94
)
95
96
for query_name in query_names:
97
try:
98
dist = installed[query_name]
99
except KeyError:
100
continue
101
102
requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower)
103
required_by = sorted(_get_requiring_packages(dist), key=str.lower)
104
105
try:
106
entry_points_text = dist.read_text("entry_points.txt")
107
entry_points = entry_points_text.splitlines(keepends=False)
108
except FileNotFoundError:
109
entry_points = []
110
111
files_iter = dist.iter_declared_entries()
112
if files_iter is None:
113
files: Optional[List[str]] = None
114
else:
115
files = sorted(files_iter)
116
117
metadata = dist.metadata
118
119
yield _PackageInfo(
120
name=dist.raw_name,
121
version=str(dist.version),
122
location=dist.location or "",
123
requires=requires,
124
required_by=required_by,
125
installer=dist.installer,
126
metadata_version=dist.metadata_version or "",
127
classifiers=metadata.get_all("Classifier", []),
128
summary=metadata.get("Summary", ""),
129
homepage=metadata.get("Home-page", ""),
130
project_urls=metadata.get_all("Project-URL", []),
131
author=metadata.get("Author", ""),
132
author_email=metadata.get("Author-email", ""),
133
license=metadata.get("License", ""),
134
entry_points=entry_points,
135
files=files,
136
)
137
138
139
def print_results(
140
distributions: Iterable[_PackageInfo],
141
list_files: bool,
142
verbose: bool,
143
) -> bool:
144
"""
145
Print the information from installed distributions found.
146
"""
147
results_printed = False
148
for i, dist in enumerate(distributions):
149
results_printed = True
150
if i > 0:
151
write_output("---")
152
153
write_output("Name: %s", dist.name)
154
write_output("Version: %s", dist.version)
155
write_output("Summary: %s", dist.summary)
156
write_output("Home-page: %s", dist.homepage)
157
write_output("Author: %s", dist.author)
158
write_output("Author-email: %s", dist.author_email)
159
write_output("License: %s", dist.license)
160
write_output("Location: %s", dist.location)
161
write_output("Requires: %s", ", ".join(dist.requires))
162
write_output("Required-by: %s", ", ".join(dist.required_by))
163
164
if verbose:
165
write_output("Metadata-Version: %s", dist.metadata_version)
166
write_output("Installer: %s", dist.installer)
167
write_output("Classifiers:")
168
for classifier in dist.classifiers:
169
write_output(" %s", classifier)
170
write_output("Entry-points:")
171
for entry in dist.entry_points:
172
write_output(" %s", entry.strip())
173
write_output("Project-URLs:")
174
for project_url in dist.project_urls:
175
write_output(" %s", project_url)
176
if list_files:
177
write_output("Files:")
178
if dist.files is None:
179
write_output("Cannot locate RECORD or installed-files.txt")
180
else:
181
for line in dist.files:
182
write_output(" %s", line.strip())
183
return results_printed
184
185