Plugin neuheiten: Web-Quellen-Crawler (4 Adapter, Rate-Limit, Dedup-Gate, Sync-UI)

This commit is contained in:
Flo Hartmann
2026-08-23 00:41:02 +00:00
parent 8c9f542b8c
commit 3b0626c774
18 changed files with 2247 additions and 18 deletions

View File

@@ -11,6 +11,7 @@ from __future__ import annotations
import importlib.metadata
import importlib.util
import sys
import types
from importlib.metadata import entry_points
from pathlib import Path
@@ -81,6 +82,19 @@ def _aus_verzeichnis(verzeichnis: Path) -> list[BasePlugin]:
if spec is None or spec.loader is None:
raise PluginError(f"Plugin '{eintrag.name}' kann nicht geladen werden.")
modul = importlib.util.module_from_spec(spec)
# Eltern-Paketnamen registrieren, damit relative Imports aus
# Plugin-Unterpackages (z. B. `from .basis import …` in
# neuheiten/quellen/) aufgelöst werden können.
eltern = modulname.rpartition(".")[0]
if eltern and eltern not in sys.modules:
# Das Eltern-Paket (Namensraum `spiele_redaktion_plugins`) hat
# kein __init__.py — spec_from_file_location liefert dafür None.
# Ein leeres Namespace-Modul mit __path__ genügt, damit relative
# Imports aus Plugin-Unterpackages (z. B. neuheiten/quellen/)
# aufgelöst werden können.
eltern_modul = types.ModuleType(eltern)
eltern_modul.__path__ = [str(eintrag.parent)]
sys.modules[eltern] = eltern_modul
sys.modules[modulname] = modul
spec.loader.exec_module(modul)
if not hasattr(modul, "plugin"):