Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Provide structured JSON output for pip index versions #13194

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
12 changes: 7 additions & 5 deletions src/pip/_internal/commands/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@
from pip._internal.cli import cmdoptions
from pip._internal.cli.req_command import IndexGroupCommand
from pip._internal.cli.status_codes import ERROR, SUCCESS
from pip._internal.commands.search import print_dist_installation_info
from pip._internal.commands.search import (
get_installed_distribution,
print_dist_installation_info_if_exists,
)
from pip._internal.exceptions import CommandError, DistributionNotFound, PipError
from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import get_default_environment
from pip._internal.models.selection_prefs import SelectionPreferences
from pip._internal.models.target_python import TargetPython
from pip._internal.network.session import PipSession
Expand Down Expand Up @@ -137,9 +139,9 @@ def get_available_package_versions(self, options: Values, args: List[Any]) -> No
formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)]
latest = formatted_versions[0]
pradyunsg marked this conversation as resolved.
Show resolved Hide resolved

dist = get_installed_distribution(query)

if options.json:
env = get_default_environment()
dist = env.get_distribution(query)
structured_output = {
"name": query,
"versions": formatted_versions,
Expand All @@ -154,4 +156,4 @@ def get_available_package_versions(self, options: Values, args: List[Any]) -> No
else:
write_output(f"{query} ({latest})")
write_output("Available versions: {}".format(", ".join(formatted_versions)))
print_dist_installation_info(query, latest)
print_dist_installation_info_if_exists(latest, dist)
15 changes: 11 additions & 4 deletions src/pip/_internal/commands/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
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.metadata.base import BaseDistribution
from pip._internal.models.index import PyPI
from pip._internal.network.xmlrpc import PipXmlrpcTransport
from pip._internal.utils.logging import indent_log
Expand Down Expand Up @@ -111,9 +112,9 @@ def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]:
return list(packages.values())


def print_dist_installation_info(name: str, latest: str) -> None:
env = get_default_environment()
dist = env.get_distribution(name)
def print_dist_installation_info_if_exists(
KrishanBhasin marked this conversation as resolved.
Show resolved Hide resolved
latest: str, dist: Optional[BaseDistribution]
) -> None:
if dist is not None:
with indent_log():
if dist.version == latest:
Expand All @@ -130,6 +131,11 @@ def print_dist_installation_info(name: str, latest: str) -> None:
write_output("LATEST: %s", latest)


def get_installed_distribution(name: str) -> Optional[BaseDistribution]:
env = get_default_environment()
return env.get_distribution(name)


def print_results(
hits: List["TransformedHit"],
name_column_width: Optional[int] = None,
Expand Down Expand Up @@ -163,7 +169,8 @@ def print_results(
line = f"{name_latest:{name_column_width}} - {summary}"
try:
write_output(line)
print_dist_installation_info(name, latest)
dist = get_installed_distribution(name)
print_dist_installation_info_if_exists(latest, dist)
except UnicodeEncodeError:
pass

Expand Down
Loading