import logging import shutil import sys import textwrap import xmlrpc.client from collections import OrderedDict from optparse import Values from typing import TYPE_CHECKING, Dict, List, Optional
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.cli.base_command import Command from pip._internal.cli.req_command import SessionCommandMixin from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS from pip._internal.exceptions import CommandError from pip._internal.metadata import get_default_environment from pip._internal.models.index import PyPI from pip._internal.network.xmlrpc import PipXmlrpcTransport from pip._internal.utils.logging import indent_log from pip._internal.utils.misc import write_output
if TYPE_CHECKING: from typing import TypedDict
class TransformedHit(TypedDict):
name: str
summary: str
versions: List[str]
logger = logging.getLogger(__name__)
class SearchCommand(Command, SessionCommandMixin): """Search for PyPI packages whose name or summary contains ."""
def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]: """
The list from pypi is really a list of versions. We want a list of
packages with the list of versions stored inline. This converts the
list from pypi into one we can use. """
packages: Dict[str, "TransformedHit"] = OrderedDict() for hit in hits:
name = hit["name"]
summary = hit["summary"]
version = hit["version"]
if name notin packages.keys():
packages[name] = { "name": name, "summary": summary, "versions": [version],
} else:
packages[name]["versions"].append(version)
# if this is the highest version, replace summary and score if version == highest_version(packages[name]["versions"]):
packages[name]["summary"] = summary
return list(packages.values())
def print_dist_installation_info(name: str, latest: str) -> None:
env = get_default_environment()
dist = env.get_distribution(name) if dist isnotNone: with indent_log(): if dist.version == latest:
write_output("INSTALLED: %s (latest)", dist.version) else:
write_output("INSTALLED: %s", dist.version) if parse_version(latest).pre:
write_output( "LATEST: %s (pre-release; install" " with `pip install --pre`)",
latest,
) else:
write_output("LATEST: %s", latest)
def print_results(
hits: List["TransformedHit"],
name_column_width: Optional[int] = None,
terminal_width: Optional[int] = None,
) -> None: ifnot hits: return if name_column_width isNone:
name_column_width = (
max(
[
len(hit["name"]) + len(highest_version(hit.get("versions", ["-"]))) for hit in hits
]
)
+ 4
)
for hit in hits:
name = hit["name"]
summary = hit["summary"] or""
latest = highest_version(hit.get("versions", ["-"])) if terminal_width isnotNone:
target_width = terminal_width - name_column_width - 5 if target_width > 10: # wrap and indent summary to fit terminal
summary_lines = textwrap.wrap(summary, target_width)
summary = ("\n" + " " * (name_column_width + 3)).join(summary_lines)
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.