# 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: ```python 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. ```yaml type: test:TestLoadable ``` Om komponenten behöver göra mer vid laddning (t.ex. ladda delkomponenter via `loader`) kan `from_config` överskridas: ```python 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__`. ```python 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: ```yaml 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`