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

1import importlib 

2import importlib.metadata 

3import inspect 

4import logging 

5import os 

6import pkgutil 

7from collections.abc import Iterator 

8 

9import pydaconf.plugins 

10from pydaconf.plugins.base import PluginBase 

11 

12logger = logging.getLogger(__name__) 

13 

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) 

18 

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() 

24 

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()