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]) → Optional[Type[ClassType]]

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: Union[Config, Dict[str, Any], None] = None) → Iterator[Tuple[str, Type[ClassType]]]

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]

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.