Plugin neuheiten: Web-Quellen-Crawler (4 Adapter, Rate-Limit, Dedup-Gate, Sync-UI)
This commit is contained in:
@@ -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"):
|
||||
|
||||
Reference in New Issue
Block a user