mirror of
https://github.com/Rushilwiz/brancher.git
synced 2025-04-22 04:49:49 -04:00
92 lines
2.9 KiB
Python
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())
|