Source code for toolbox.pkgutil.package
import importlib
import pkg_resources
[docs]
def search_package(pkg: str, method: str = "is", imports: bool = False) -> dict:
"""Discover packages installed in the system.
Function iterates through all of the installed packages in the system and returns a dictionary
with all modules that passes the search criteria passed by ``method``.
Args:
pkg: Package name to search for.
method: String that is either ``is``, ``in``, or ``startswith``.
imports: Boolean that indicates whether or not to import the found package(s).
Raises:
TypeError: The search method passed is invalid.
Note:
The search method must be one of the following:
* ``is``: Returns modules that are exactly worded ``pkg``.
* ``in``: Returns modules that contains the string ``pkg``.
* ``startswith``: Return modules that starts with the passed ``pkg`` name.
When ``imports`` is set to ``False`` this function returns a
``Dict[str, str]`` where the key is the name of the module, and
the value is the version installed on the system.
If ``imports`` is set to ``True`` this function returns a
``Dict[str, Module]`` where the key is the name of the module,
and the value is the _imported_ module.
Example:
.. code-block:: python
from toolbox.pkgutil.package import search_package
print(search_package("toolbox", method="is"))
# >>> {'toolbox': '1.4.0'}
print(search_package("toolbox", method="is", imports=True))
# >>> {'toolbox': <module 'toolbox' from '.../toolbox/toolbox/__init__.py'>}
"""
if method == "is":
search = lambda name: name == pkg
elif method == "in":
search = lambda name: pkg in name
elif method == "startswith":
search = lambda name: name.startswith(pkg)
else:
err = "Search method must be either 'is', 'in', or 'startswith'."
raise TypeError(err)
installed_pkgs = {
pkg.project_name: pkg.version for pkg in pkg_resources.working_set
}
packages = {}
for package, version in installed_pkgs.items():
if search(package):
if imports:
packages[package] = importlib.import_module(package)
else:
packages[package] = version
return packages