Eigene Provider-Plugins anbinden

Die Feed-Pipeline kann über zusätzliche Provider erweitert werden, ohne den Kerncode anzupassen. Dieses Dokument zeigt, wie ein Plugin erstellt, geladen und getestet wird.

1. Plugin-Skelett erzeugen

Verwende den neuen Scaffold-Befehl, um ein startfertiges Modul zu erzeugen:

python scripts/scaffold_provider_plugin.py plugins/custom_provider.py

Die Datei enthält eine register_providers-Funktion, die einen Loader registriert. Der Loader muss eine Liste von Ereignisdictionaries liefern, die dem Eventschema entsprechen.

2. Provider implementieren

Ersetze den Platzhalter durch deine Datenquelle. Beispiel mit einem einfachen Cache-Leser:

from pathlib import Path
import json


def register_providers(register_provider):
    def load_custom_events():
        cache_path = Path("data/custom/events.json")
        if not cache_path.exists():
            return []
        return json.loads(cache_path.read_text(encoding="utf-8"))

    register_provider("CUSTOM_PROVIDER_ENABLE", load_custom_events, cache_key="custom")

Alternative: deklarative PROVIDERS-Konstante

Statt einer register_providers-Funktion kann das Plugin auch eine PROVIDERS-Konstante exportieren — die Loader-Engine (src/feed/providers.py:_register_plugin_providers) akzeptiert beide Stile. Jeder Eintrag ist ein Tupel (env_var, loader) bzw. (env_var, loader, cache_key). Wird cache_key weggelassen, leitet das Framework ihn aus der Env-Variable ab.

PROVIDERS = [
    ("CUSTOM_PROVIDER_ENABLE", load_custom_events, "custom"),
]

Sind beide vorhanden, wird zuerst register_providers aufgerufen und zusätzlich die Konstante ausgewertet. Falls keiner der beiden Hooks existiert, protokolliert das Framework eine Warnung und das Plugin wird übersprungen.

3. Plugin laden

Aktiviere das Plugin über die Umgebungsvariable WIEN_OEPNV_PROVIDER_PLUGINS. Mehrere Module werden kommasepariert angegeben:

export WIEN_OEPNV_PROVIDER_PLUGINS=plugins.custom_provider
export CUSTOM_PROVIDER_ENABLE=1
python -m src.cli feed build

Während des Builds erscheinen der Providerstatus und mögliche Warnungen im Feed-Health-Report. Dieser wird lokal nach jedem Lauf unter docs/feed-health.md (Markdown) und docs/feed-health.json (JSON) abgelegt; beide Dateien sind nicht im Repository versioniert.

4. Tests

Erstelle eine kleine Testdatei, die den Loader direkt aufruft oder den Feed-Build mit aktivem Plugin über python -m pytest ausführt. Die neuen End-to-End-Tests unter tests/test_provider_plugins.py zeigen, wie Plugins isoliert getestet werden können.