patroni.dynamic_loader module

Helper functions to search for implementations of specific abstract interface in a package.

patroni.dynamic_loader.find_class_in_module(module: module, cls_type: Type[ClassType]) Type[ClassType] | NoneView on GitHub

Try to find the implementation of cls_type class interface in module matching the module name.

Parameters:
  • module – imported module.

  • cls_type – a class type we are looking for.

Returns:

class with a name matching the name of module that implements cls_type or None if not found.

patroni.dynamic_loader.iter_classes(package: str, cls_type: Type[ClassType], config: Config | Dict[str, Any] | None = None) Iterator[Tuple[str, Type[ClassType]]]View on GitHub

Attempt to import modules and find implementations of cls_type that are present in the given configuration.

Note

If a module successfully imports we can assume that all its requirements are installed.

Parameters:
  • package – a package name to search modules in, e.g. patroni.dcs.

  • cls_type – a class type we are looking for.

  • config – configuration information with possible module names as keys. If given, only attempt to import modules defined in the configuration. Else, if None, attempt to import any supported module.

Yields:

a tuple containing the module name and the imported class object.

patroni.dynamic_loader.iter_modules(package: str) List[str]View on GitHub

Get names of modules from package, depending on execution environment.

Note

If being packaged with PyInstaller, modules aren’t discoverable dynamically by scanning source directory because importlib.machinery.FrozenImporter doesn’t implement iter_modules(). But it is still possible to find all potential modules by iterating through toc, which contains list of all “frozen” resources.

Parameters:

package – a package name to search modules in, e.g. patroni.dcs.

Returns:

list of known module names with absolute python module path namespace, e.g. patroni.dcs.etcd.