From 7efb302c107a6b9b27ef726112c31f9e106519e9 Mon Sep 17 00:00:00 2001 From: Serge Koenigsmann Date: Thu, 24 Sep 2026 05:10:54 +0200 Subject: [PATCH] mediawiki: purge-Subcommand und der Parser-Cache-Fallstrick wiki.py mit dokumentierer/wiki.py synchronisiert (purge-Subcommand). SKILL.md: purge und das bisher undokumentierte upload in die Befehlsliste, dazu ein Abschnitt zu Seiten mit #get_web_data. Die Vorlagen werden nicht bei jedem Aufruf ausgefuehrt; wer nach einer Datenaenderung render aufruft und alte Werte sieht, hat meist den Cache vor sich und nicht kaputte Daten. description um den Fall erweitert, damit die Skill bei "Wiki zeigt veraltete Daten" gefunden wird. version 0.1.0 -> 0.2.0. Co-Authored-By: Claude Opus 5 --- plugins/mediawiki/skills/mediawiki/SKILL.md | 27 +++++++++++++++++++-- plugins/mediawiki/skills/mediawiki/wiki.py | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/plugins/mediawiki/skills/mediawiki/SKILL.md b/plugins/mediawiki/skills/mediawiki/SKILL.md index 3d25f96..d4df6a0 100644 --- a/plugins/mediawiki/skills/mediawiki/SKILL.md +++ b/plugins/mediawiki/skills/mediawiki/SKILL.md @@ -1,7 +1,7 @@ --- name: mediawiki -description: MediaWiki-Seiten und -Templates lesen, rendern und schreiben. Use when editing/fetching wiki pages (wiki.inmedias.it, devwiki.inmedias.it) or when the user mentions "wiki", "Vorlage/Template", "Kundenseite". -version: 0.1.0 +description: MediaWiki-Seiten und -Templates lesen, rendern, schreiben und deren Parser-Cache leeren. Use when editing/fetching wiki pages (wiki.inmedias.it, devwiki.inmedias.it) or when the user mentions "wiki", "Vorlage/Template", "Kundenseite", or when a page shows stale API data. +version: 0.2.0 --- # MediaWiki (wiki.py) @@ -37,6 +37,8 @@ oder anderen direkten Server-Eingriffen. Reine Lese-/Render-Checks ./wiki.py -w devwiki search "Suchbegriff" [-n ] # Titelsuche ./wiki.py -w devwiki update "Kunde:Beispiel GmbH" datei.wiki --summary "..." # speichern ./wiki.py -w wiki update "Titel" - --summary "..." # Inhalt von stdin +./wiki.py -w wiki purge "Titel" ["Titel 2" ...] [--links] # Parser-Cache leeren +./wiki.py -w wiki upload /pfad/bild.png bild.png --description "..." # Datei hochladen ``` Tipp: Beim Schreiben den Inhalt aus einer Datei (`datei.wiki`) oder `-` (stdin) @@ -57,6 +59,27 @@ dann `.env` im aktuellen Verzeichnis, dann bereits gesetzte Env-Variablen). Sieh Es empfiehlt sich ein eigener Bot-/Service-Account mit den nötigen Schreibrechten. +## Seiten, die ihre Daten aus einer API holen + +Vorlagen mit `#get_web_data` (External Data) werden **nicht** bei jedem +Seitenaufruf ausgeführt. MediaWiki liefert die Seite aus dem Parser-Cache und +fragt die API gar nicht erst an. Ändern sich die Daten hinter der API, zeigt +die Seite weiter beliebig alte Werte — ohne Fehlermeldung, ohne dass es +jemandem auffällt. + +Deshalb gehört nach jedem Datenupload ein Purge: + +```bash +./wiki.py -w wiki purge "Nextcloud (Hosting)" +``` + +`--links` schaltet zusätzlich `forcelinkupdate` ein (langsamer, aktualisiert +die Linktabellen) — für reine Datenaktualisierungen nicht nötig. + +Das betrifft auch die Fehlersuche: Wer nach einer Änderung `render` aufruft und +die alten Werte sieht, hat meist nicht die Daten kaputt, sondern nur den Cache +vor sich. Erst purgen, dann urteilen. + ## Hinweise - `search` liefert Titel; `render` ist nützlich, um vor/nach dem Schreiben das Ergebnis zu prüfen, ohne die Seite im Browser zu öffnen. diff --git a/plugins/mediawiki/skills/mediawiki/wiki.py b/plugins/mediawiki/skills/mediawiki/wiki.py index e1ec04f..8154896 100755 --- a/plugins/mediawiki/skills/mediawiki/wiki.py +++ b/plugins/mediawiki/skills/mediawiki/wiki.py @@ -110,6 +110,25 @@ def cmd_render(args: argparse.Namespace) -> None: print(result["parse"]["text"]["*"], end="") +def cmd_purge(args: argparse.Namespace) -> None: + """Parser-Cache einer oder mehrerer Seiten leeren. + + Noetig fuer Seiten, die ihre Daten per #get_web_data aus einer API holen: + MediaWiki rendert sonst aus dem Parser-Cache weiter und fragt die API gar + nicht erst an - die Seite zeigt dann beliebig alte Werte, ohne dass das + irgendwo auffaellt. + """ + site = get_site(args.wiki) + result = site.api("purge", titles="|".join(args.titles), + forcelinkupdate=1 if args.links else None) + for entry in result.get("purge", []): + title = entry.get("title", "?") + if "missing" in entry: + print(f"Error: page '{title}' does not exist", file=sys.stderr) + else: + print(f"Purged '{title}'") + + def cmd_upload(args: argparse.Namespace) -> None: path = Path(args.file_path) if not path.exists(): @@ -161,6 +180,12 @@ def main() -> None: render_p.add_argument("title", help="Page title") render_p.set_defaults(func=cmd_render) + purge_p = sub.add_parser("purge", help="Clear the parser cache of one or more pages") + purge_p.add_argument("titles", nargs="+", help="Page title(s)") + purge_p.add_argument("--links", action="store_true", + help="Also run forcelinkupdate (slower, updates link tables)") + purge_p.set_defaults(func=cmd_purge) + upload_p = sub.add_parser("upload", help="Upload a local file to the wiki file store") upload_p.add_argument("file_path", help="Absolute path to the local file") upload_p.add_argument("wiki_filename", help="Target filename on the wiki (without 'File:' prefix)")