Add Required-by field to pip show (#4564)

This commit is contained in:
Pradyun S. Gedam 2017-06-26 18:28:52 +05:30 committed by Donald Stufft
parent 9c76a84f6b
commit c92cbe7aba
3 changed files with 32 additions and 4 deletions

1
news/4564.feature Normal file
View File

@ -0,0 +1 @@
pip show learnt a new Required-by field that lists currently installed packages that depend on the shown package

View File

@ -127,7 +127,14 @@ def print_results(distributions, list_files=False, verbose=False):
results_printed = True
if i > 0:
logger.info("---")
logger.info("Name: %s", dist.get('name', ''))
name = dist.get('name', '')
required_by = [
pkg.project_name for pkg in pkg_resources.working_set
if name in [required.name for required in pkg.requires()]
]
logger.info("Name: %s", name)
logger.info("Version: %s", dist.get('version', ''))
logger.info("Summary: %s", dist.get('summary', ''))
logger.info("Home-page: %s", dist.get('home-page', ''))
@ -136,6 +143,8 @@ def print_results(distributions, list_files=False, verbose=False):
logger.info("License: %s", dist.get('license', ''))
logger.info("Location: %s", dist.get('location', ''))
logger.info("Requires: %s", ', '.join(dist.get('requires', [])))
logger.info("Required-by: %s", ', '.join(required_by))
if verbose:
logger.info("Metadata-Version: %s",
dist.get('metadata-version', ''))

View File

@ -1,3 +1,4 @@
import os
import re
import pytest
@ -12,7 +13,7 @@ def test_show(script):
"""
result = script.pip('show', 'pip')
lines = result.stdout.splitlines()
assert len(lines) == 9
assert len(lines) == 10
assert 'Name: pip' in lines
assert 'Version: %s' % __version__ in lines
assert any(line.startswith('Location: ') for line in lines)
@ -28,7 +29,7 @@ def test_show_with_files_not_found(script, data):
script.pip('install', '-e', editable)
result = script.pip('show', '-f', 'SetupPyUTF8')
lines = result.stdout.splitlines()
assert len(lines) == 11
assert len(lines) == 12
assert 'Name: SetupPyUTF8' in lines
assert 'Version: 0.0.0' in lines
assert any(line.startswith('Location: ') for line in lines)
@ -139,7 +140,8 @@ def test_all_fields(script):
result = script.pip('show', 'pip')
lines = result.stdout.splitlines()
expected = set(['Name', 'Version', 'Summary', 'Home-page', 'Author',
'Author-email', 'License', 'Location', 'Requires'])
'Author-email', 'License', 'Location', 'Requires',
'Required-by'])
actual = set(re.sub(':.*$', '', line) for line in lines)
assert actual == expected
@ -173,3 +175,19 @@ def test_package_name_is_canonicalized(script, data):
assert underscore_upper_show_result.returncode == 0
assert underscore_upper_show_result.stdout == dash_show_result.stdout
def test_show_required_by_packages(script, data):
"""
Test that installed packages that depend on this package are shown
"""
editable_path = os.path.join(data.src, 'requires_simple')
script.pip(
'install', '--no-index', '-f', data.find_links, editable_path
)
result = script.pip('show', 'simple')
lines = result.stdout.splitlines()
assert 'Name: simple' in lines
assert 'Required-by: requires-simple' in lines