brancher/.venv/lib/python3.8/site-packages/pip_chill/pip_chill.py

92 lines
2.9 KiB
Python

# -*- coding: utf-8 -*-
"""Lists installed packages that are not dependencies of others"""
import pkg_resources
class Distribution:
"""
Represents a distribution package installed in the current environment.
"""
def __init__(self, name, version=None, required_by=None):
self.name = name
self.version = version
self.required_by = set(required_by) if required_by else set()
def get_name_without_version(self):
"""
Return the name of the package without a version.
"""
if self.required_by:
return "# {} # Installed as dependency for {}".format(
self.name, ", ".join(self.required_by)
)
return self.name
def __str__(self):
if self.required_by:
return "# {}=={} # Installed as dependency for {}".format(
self.name, self.version, ", ".join(self.required_by)
)
return "{}=={}".format(self.name, self.version)
def __repr__(self):
return '<{}.{} instance "{}">'.format(
self.__module__, self.__class__.__name__, self.name
)
def __eq__(self, other):
if self is other:
return True
elif isinstance(other, Distribution):
return True if self.name == other.name else False
else:
return True if self.name == other else False
def __lt__(self, other):
return self.name < other.name
def __hash__(self):
return hash(self.name)
def chill(show_all=False):
if show_all:
ignored_packages = ()
else:
ignored_packages = {"pip", "wheel", "setuptools", "pkg-resources"}
# Gather all packages that are requirements and will be auto-installed.
distributions = {}
dependencies = {}
for distribution in pkg_resources.working_set:
if distribution.key in ignored_packages:
continue
if distribution.key in dependencies:
dependencies[distribution.key].version = distribution.version
else:
distributions[distribution.key] = Distribution(
distribution.key, distribution.version
)
for requirement in distribution.requires():
if requirement.key not in ignored_packages:
if requirement.key in dependencies:
dependencies[requirement.key].required_by.add(
distribution.key
)
else:
dependencies[requirement.key] = Distribution(
requirement.key, required_by=(distribution.key,)
)
if requirement.key in distributions:
dependencies[requirement.key].version = distributions.pop(
requirement.key
).version
return sorted(distributions.values()), sorted(dependencies.values())