Skip to content

models

Classes

ModelRegistry

Source code in kiara/registries/models/__init__.py
class ModelRegistry(object):

    _instance = None

    @classmethod
    def instance(cls) -> "ModelRegistry":
        """The default *kiara* context. In most cases, it's recommended you create and manage your own, though."""

        if cls._instance is None:
            cls._instance = ModelRegistry()
        return cls._instance

    def __init__(self):

        self._all_models: Optional[KiaraModelClassesInfo] = None
        self._models_per_package: Dict[str, KiaraModelClassesInfo] = {}
        self._sub_models: Dict[Type[KiaraModel], KiaraModelClassesInfo] = {}

    @property
    def all_models(self) -> KiaraModelClassesInfo:

        if self._all_models is not None:
            return self._all_models

        self._all_models = find_kiara_models()
        return self._all_models

    def get_model_cls(
        self, kiara_model_id: str, required_subclass: Optional[Type[KiaraModel]] = None
    ) -> Type[KiaraModel]:

        model_info = self.all_models.get(kiara_model_id, None)
        if model_info is None:
            raise Exception(
                f"Can't retrieve model class for id '{kiara_model_id}': id not registered."
            )

        cls = model_info.python_class.get_class()  # type: ignore
        if required_subclass:
            if not issubclass(cls, required_subclass):
                raise Exception(
                    f"Can't retrieve sub model of '{required_subclass.__name__}' with id '{kiara_model_id}': exists, but not the required subclass."
                )

        return cls  # type: ignore

    def get_models_for_package(self, package_name: str) -> KiaraModelClassesInfo:

        if package_name in self._models_per_package.keys():
            return self._models_per_package[package_name]

        temp = {}
        for key, info in self.all_models.items():
            if info.context.labels.get("package") == package_name:
                temp[key] = info

        group = KiaraModelClassesInfo.construct(
            group_alias=f"kiara_models.{package_name}", item_infos=temp  # type: ignore
        )

        self._models_per_package[package_name] = group
        return group

    def get_models_of_type(self, model_type: Type[KiaraModel]) -> KiaraModelClassesInfo:

        if model_type in self._sub_models.keys():
            return self._sub_models[model_type]

        sub_classes = {}
        for model_id, type_info in self.all_models.item_infos.items():
            cls: Type[KiaraModel] = type_info.python_class.get_class()  # type: ignore

            if issubclass(cls, model_type):
                sub_classes[model_id] = type_info

        classes = KiaraModelClassesInfo(
            group_alias=f"{model_type.__name__}-submodels", item_infos=sub_classes
        )
        self._sub_models[model_type] = classes
        return classes
all_models: KiaraModelClassesInfo property readonly

Methods

get_model_cls(self, kiara_model_id, required_subclass=None)
Source code in kiara/registries/models/__init__.py
def get_model_cls(
    self, kiara_model_id: str, required_subclass: Optional[Type[KiaraModel]] = None
) -> Type[KiaraModel]:

    model_info = self.all_models.get(kiara_model_id, None)
    if model_info is None:
        raise Exception(
            f"Can't retrieve model class for id '{kiara_model_id}': id not registered."
        )

    cls = model_info.python_class.get_class()  # type: ignore
    if required_subclass:
        if not issubclass(cls, required_subclass):
            raise Exception(
                f"Can't retrieve sub model of '{required_subclass.__name__}' with id '{kiara_model_id}': exists, but not the required subclass."
            )

    return cls  # type: ignore
get_models_for_package(self, package_name)
Source code in kiara/registries/models/__init__.py
def get_models_for_package(self, package_name: str) -> KiaraModelClassesInfo:

    if package_name in self._models_per_package.keys():
        return self._models_per_package[package_name]

    temp = {}
    for key, info in self.all_models.items():
        if info.context.labels.get("package") == package_name:
            temp[key] = info

    group = KiaraModelClassesInfo.construct(
        group_alias=f"kiara_models.{package_name}", item_infos=temp  # type: ignore
    )

    self._models_per_package[package_name] = group
    return group
get_models_of_type(self, model_type)
Source code in kiara/registries/models/__init__.py
def get_models_of_type(self, model_type: Type[KiaraModel]) -> KiaraModelClassesInfo:

    if model_type in self._sub_models.keys():
        return self._sub_models[model_type]

    sub_classes = {}
    for model_id, type_info in self.all_models.item_infos.items():
        cls: Type[KiaraModel] = type_info.python_class.get_class()  # type: ignore

        if issubclass(cls, model_type):
            sub_classes[model_id] = type_info

    classes = KiaraModelClassesInfo(
        group_alias=f"{model_type.__name__}-submodels", item_infos=sub_classes
    )
    self._sub_models[model_type] = classes
    return classes
instance() classmethod

The default kiara context. In most cases, it's recommended you create and manage your own, though.

Source code in kiara/registries/models/__init__.py
@classmethod
def instance(cls) -> "ModelRegistry":
    """The default *kiara* context. In most cases, it's recommended you create and manage your own, though."""

    if cls._instance is None:
        cls._instance = ModelRegistry()
    return cls._instance