Source code for pydft_qmmm.plugins.plugin_manager

"""Functionality for handling external plugin imports.

Attributes:
    DISCOVERED_PLUGINS: A list of entry points into the plugin
        architecture of PyDFT-QMMM within installed package metadata.
"""
from __future__ import annotations

from importlib import import_module
from importlib.metadata import entry_points
from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from .plugin import Plugin

try:
    DISCOVERED_PLUGINS: set[str] = {
        point.name for point
        in entry_points().get("pydft_qmmm.plugins", [])
    }
except AttributeError:
    DISCOVERED_PLUGINS = entry_points(
        group="pydft_qmmm.plugins",
    ).names


[docs] def get_external_plugins() -> dict[str, Plugin]: """Get PyDFT-QMMM plugins from externally installed packages. Returns: A dictionary of plugin names and loaded classes for the PyDFT-QMMM plugin sub-package. """ package_names = [name for name in DISCOVERED_PLUGINS] plugins = {} for name in package_names: module = import_module(name, package=name) plugins.update({ plugin: getattr(module, plugin) for plugin in dir(module) if not plugin.startswith("__") }) return plugins