Base_initializer

This module contains functionality related to the the base_initializer module for core.

Base_initializer

BaseInitializer

Bases: ABC

Abstract base class for configuration initializers.

This class defines the interface for initializers that are responsible for retrieving and initializing configuration objects. Subclasses must implement the get_configuration method to provide a concrete initialization strategy.

Attributes:
  • _configuration_class

    The class of the configuration object to be initialized.

Source code in src/core/base_initializer.py
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class BaseInitializer(ABC):
    """Abstract base class for configuration initializers.

    This class defines the interface for initializers that are responsible for
    retrieving and initializing configuration objects. Subclasses must implement
    the get_configuration method to provide a concrete initialization strategy.

    Attributes:
        _configuration_class: The class of the configuration object to be initialized.
    """

    def __init__(self, configuration_class: Type[BaseConfiguration]):
        """Initialize the BaseInitializer.

        Args:
            configuration_class: The configuration class to use for initialization.
        """
        self._configuration_class = configuration_class

    @abstractmethod
    def get_configuration(self) -> BaseConfiguration:
        """Retrieve the configuration instance.

        Returns:
            The initialized configuration object.

        Raises:
            NotImplementedError: This method must be implemented by subclasses.
        """
        pass

__init__(configuration_class)

Initialize the BaseInitializer.

Parameters:
  • configuration_class (Type[BaseConfiguration]) –

    The configuration class to use for initialization.

Source code in src/core/base_initializer.py
26
27
28
29
30
31
32
def __init__(self, configuration_class: Type[BaseConfiguration]):
    """Initialize the BaseInitializer.

    Args:
        configuration_class: The configuration class to use for initialization.
    """
    self._configuration_class = configuration_class

get_configuration() abstractmethod

Retrieve the configuration instance.

Returns:
  • BaseConfiguration

    The initialized configuration object.

Raises:
  • NotImplementedError

    This method must be implemented by subclasses.

Source code in src/core/base_initializer.py
34
35
36
37
38
39
40
41
42
43
44
@abstractmethod
def get_configuration(self) -> BaseConfiguration:
    """Retrieve the configuration instance.

    Returns:
        The initialized configuration object.

    Raises:
        NotImplementedError: This method must be implemented by subclasses.
    """
    pass

BasePackageLoader

Bases: ABC

Abstract base class for dynamic package loading.

This class defines the interface for package loaders that dynamically discover and load packages from specified locations. Subclasses must implement the load_packages method to provide a concrete package loading strategy. The class provides a helper method _load_packages that handles the common logic of dynamically importing modules.

Attributes:
  • logger

    Logger instance used for logging package loading activities.

Source code in src/core/base_initializer.py
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
class BasePackageLoader(ABC):
    """Abstract base class for dynamic package loading.

    This class defines the interface for package loaders that dynamically discover and load
    packages from specified locations. Subclasses must implement the load_packages method
    to provide a concrete package loading strategy. The class provides a helper method
    _load_packages that handles the common logic of dynamically importing modules.

    Attributes:
        logger: Logger instance used for logging package loading activities.
    """

    def __init__(
        self, logger: logging.Logger = LoggerConfiguration.get_logger(__name__)
    ):
        """Initialize the BasePackageLoader.

        Args:
            logger: Logger instance for logging package loading activities.
        """
        self.logger = logger

    @abstractmethod
    def load_packages(self) -> None:
        """Load packages dynamically.

        This method should be implemented by subclasses to provide the specific
        package loading logic needed for their application context.

        Raises:
            NotImplementedError: This method must be implemented by subclasses.
        """
        pass

    def _load_packages(self, parent_packages: List[str]) -> None:
        """Load packages from the specified parent packages.

        This method dynamically imports modules from the provided parent packages
        and calls their register() method to register components with the system.
        It skips the 'core' package and handles import errors gracefully.

        Args:
            parent_packages: List of parent package names to load modules from.
        """

        for parent_package in parent_packages:
            self.logger.info(f"Loading {parent_package} packages...")
            package_path = parent_package.replace(".", "/")

            for _, name, is_package in pkgutil.iter_modules([package_path]):
                if is_package and name != "core":
                    try:
                        module_path = f"{parent_package}.{name}"
                        module = importlib.import_module(module_path)
                        module.register()
                        self.logger.info(f"Loaded package: {name}.")
                    except ImportError as e:
                        self.logger.error(
                            f"Failed to load datasource package {name}: {e}."
                        )
                    except Exception as e:
                        self.logger.error(
                            f"Failed to register package {name}: {e}."
                        )

__init__(logger=LoggerConfiguration.get_logger(__name__))

Initialize the BasePackageLoader.

Parameters:
  • logger (Logger, default: get_logger(__name__) ) –

    Logger instance for logging package loading activities.

Source code in src/core/base_initializer.py
59
60
61
62
63
64
65
66
67
def __init__(
    self, logger: logging.Logger = LoggerConfiguration.get_logger(__name__)
):
    """Initialize the BasePackageLoader.

    Args:
        logger: Logger instance for logging package loading activities.
    """
    self.logger = logger

load_packages() abstractmethod

Load packages dynamically.

This method should be implemented by subclasses to provide the specific package loading logic needed for their application context.

Raises:
  • NotImplementedError

    This method must be implemented by subclasses.

Source code in src/core/base_initializer.py
69
70
71
72
73
74
75
76
77
78
79
@abstractmethod
def load_packages(self) -> None:
    """Load packages dynamically.

    This method should be implemented by subclasses to provide the specific
    package loading logic needed for their application context.

    Raises:
        NotImplementedError: This method must be implemented by subclasses.
    """
    pass

BasicInitializer

Bases: BaseInitializer

Common initializer for embedding, augmentation and evaluation processes.

Multiple components are used in the embedding, augmentation and evaluation processes. To avoid code duplication, this initializer is used to bind the components to the injector. It is intended to be subclassed by the specific initializers for each process.

Source code in src/core/base_initializer.py
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
class BasicInitializer(BaseInitializer):
    """Common initializer for embedding, augmentation and evaluation processes.

    Multiple components are used in the embedding, augmentation and evaluation processes.
    To avoid code duplication, this initializer is used to bind the components to the injector.
    It is intended to be subclassed by the specific initializers for each process.
    """

    def __init__(
        self,
        configuration_class: Type[BaseConfiguration],
        package_loader: BasePackageLoader,
    ):
        """Initialize the BasicInitializer.
        Loads packages and initializes the configuration retriever.

        Args:
            configuration_class: The configuration class to use for initialization.
            package_loader: The package loader to use for loading packages.
        """
        super().__init__(configuration_class)
        self.configuration_retriever: BaseConfigurationRetriever = None

        package_loader.load_packages()
        self._init_configuration_retriever()

    def get_configuration(self) -> BaseConfiguration:
        """Retrieve the configuration instance.

        Returns:
            The initialized configuration object.
        """
        return self.configuration_retriever.get()

    def _init_configuration_retriever(self) -> None:
        """Initialize the configuration retriever.

        Creates an appropriate configuration retriever based on the metadata
        configuration and assigns it to the configuration_retriever attribute.
        """
        metadata = MetadataConfiguration()
        configuration_retriever_class = ConfiguratioRetriverRegistry.get(
            on_prem=metadata.on_prem_config
        )
        self.configuration_retriever = configuration_retriever_class(
            configuration_class=self._configuration_class, metadata=metadata
        )

__init__(configuration_class, package_loader)

Initialize the BasicInitializer. Loads packages and initializes the configuration retriever.

Parameters:
  • configuration_class (Type[BaseConfiguration]) –

    The configuration class to use for initialization.

  • package_loader (BasePackageLoader) –

    The package loader to use for loading packages.

Source code in src/core/base_initializer.py
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
def __init__(
    self,
    configuration_class: Type[BaseConfiguration],
    package_loader: BasePackageLoader,
):
    """Initialize the BasicInitializer.
    Loads packages and initializes the configuration retriever.

    Args:
        configuration_class: The configuration class to use for initialization.
        package_loader: The package loader to use for loading packages.
    """
    super().__init__(configuration_class)
    self.configuration_retriever: BaseConfigurationRetriever = None

    package_loader.load_packages()
    self._init_configuration_retriever()

get_configuration()

Retrieve the configuration instance.

Returns:
  • BaseConfiguration

    The initialized configuration object.

Source code in src/core/base_initializer.py
139
140
141
142
143
144
145
def get_configuration(self) -> BaseConfiguration:
    """Retrieve the configuration instance.

    Returns:
        The initialized configuration object.
    """
    return self.configuration_retriever.get()