Coverage for pydaconf/utils/plugins.py: 100.00%
24 statements
« prev ^ index » next coverage.py v7.6.11, created at 2025-02-16 17:46 +0000
« prev ^ index » next coverage.py v7.6.11, created at 2025-02-16 17:46 +0000
1import importlib
2import importlib.metadata
3import inspect
4import logging
5import os
6import pkgutil
7from collections.abc import Iterator
9import pydaconf.plugins
10from pydaconf.plugins.base import PluginBase
12logger = logging.getLogger(__name__)
14def load_builtin_plugins() -> Iterator[PluginBase]:
15 for _, module_name, _ in pkgutil.iter_modules([str(f"{os.path.dirname(pydaconf.plugins.base.__file__)}")]):
16 full_module_name = f"{pydaconf.plugins.__name__}.{module_name}"
17 module = importlib.import_module(full_module_name)
19 # Inspect module and find classes that subclass PluginBase
20 for _, plugin_class in inspect.getmembers(module, inspect.isclass):
21 if issubclass(plugin_class, PluginBase) and plugin_class is not PluginBase:
22 logger.debug(f"Builtin plugin '{plugin_class.PREFIX}' found.")
23 yield plugin_class()
25def load_dynamic_plugins() -> Iterator[PluginBase]:
26 for entry_point in importlib.metadata.entry_points(group='pydaconf.plugins'):
27 plugin_class = entry_point.load()
28 if issubclass(plugin_class, PluginBase):
29 logger.debug(f"Dynamic plugin '{plugin_class.PREFIX}' found.")
30 yield plugin_class()