Laddning av komponenter

En komponent som kan laddas ärver från Loadable. Basklassen har en __init__ som tar config och sparar den som self.config, samt en standard-implementation av from_config som anropar cls(config).

Det enklaste fallet kräver alltså ingen extra kod:

from lrpy.loader import Loadable

class TestLoadable(Loadable):
    pass

Om ovanstående placeras i filen test.py (som antas vara i sökvägen) kan klassen skapas med nedanstående konfiguration.

type: test:TestLoadable

Om komponenten behöver göra mer vid laddning (t.ex. ladda delkomponenter via loader) kan from_config överskridas:

from lrpy.loader import Loadable, Loader

class TestLoadable(Loadable):
    @classmethod
    async def from_config(cls, config, loader: Loader):
        # loader kan användas för att ladda delkomponenter
        return cls(config)

Konfiguration

Komponenter som behöver konfiguration definierar en inre klass Config som måste ärva från pydantic.BaseModel. Konfigurationen valideras automatiskt vid laddning och skickas som en instans av Config till __init__.

from pydantic import BaseModel

from lrpy.loader import Loadable

class TestLoadable(Loadable):
    class Config(BaseModel):
        value: int

    def __init__(self, config: Config):
        super().__init__(config)
        print(self.config.value)

Som skapas med:

type: test:TestLoadable
config:
  value: 5

Om en komponent definierar Config men inget config-block anges i YAML-filen används ett tomt objekt ({}), så fält med default-värden fungerar utan konfiguration. Om en komponent inte definierar Config men config anges i YAML-filen ges ett felmeddelande.

Type

type anger vilken klass som ska laddas. Formatet är [fil]:[klassnamn]. Fil är den “sökväg” som skulle användas för att importera filen i python. Till exempel om ApiModule (vilken ligger i lrpy/modules/api_module.py) ska laddas anges lrpy.modules.api_module:ApiModule