Source code for mantidimaging.core.operations.loader

# Copyright (C) 2022 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
import os
import pkgutil
from typing import List, Protocol, cast
from importlib.machinery import FileFinder, ModuleSpec
from importlib.abc import Loader

from mantidimaging.core.operations.base_filter import BaseFilter

MODULES_OPERATIONS = {}
for finder, module_name, is_pkg in pkgutil.walk_packages([os.path.dirname(__file__)]):
    assert isinstance(finder, FileFinder)
    spec = finder.find_spec(module_name)
    assert isinstance(spec, ModuleSpec)
    assert isinstance(spec.loader, Loader)
    MODULES_OPERATIONS[module_name] = spec.loader


[docs] class OperationModule(Protocol): FILTER_CLASS: BaseFilter
[docs] def load_filter_packages(ignored_packages=None) -> List[BaseFilter]: """ Imports all subpackages with a FILTER_CLASS attribute, which should be an extension of BaseFilter. These classes are then used to provide the names, required inputs, and behaviour to execute then named filter on a stack of images. :param ignored_packages: List of ignore rules """ filters = {name: MODULES_OPERATIONS[name].load_module(name) for name in MODULES_OPERATIONS.keys()} filters = {name: filters[name] for name in filters.keys() if hasattr(filters[name], 'FILTER_CLASS')} operation_modules = {name: cast(OperationModule, f) for name, f in filters.items()} if not ignored_packages: return [f.FILTER_CLASS for f in operation_modules.values()] return [ operation_modules[name].FILTER_CLASS for name in operation_modules.keys() if not any([ignore in name for ignore in ignored_packages]) ]