Automatischer Push: 45 Datei(en) geändert
- .claude/agents/planer.md - .claude/agents/quorum-stimme.md - .claude/skills/bookstack-upload/SKILL.md - .claude/skills/bookstack-upload/scripts/bookstack/archiv.py - .claude/skills/bookstack-upload/scripts/bookstack/auswahl.py - .claude/skills/bookstack-upload/scripts/bookstack/beschreibung.py - .claude/skills/bookstack-upload/scripts/bookstack/bilder.py - .claude/skills/bookstack-upload/scripts/bookstack/ergebnis.py - .claude/skills/bookstack-upload/scripts/bookstack/hochladen.py - .claude/skills/bookstack-upload/scripts/bookstack/konvertierung.py - .claude/skills/bookstack-upload/scripts/bookstack/struktur.py - .claude/skills/bookstack-upload/scripts/bookstack/verweise.py - … und 33 weitere Erzeugt vom PostToolUse-Hook .vault-tools/auto-push/auto_push.py. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
1 parent
60dee0ab68
commit
deec79a6ea
45 files changed
+8645
-262
No files matched your search
@@ -1,4 +1,9 @@
|
||||
"""Löst Regal-, Buch- und Kapitelnamen in IDs auf und legt Fehlendes auf Wunsch an."""
|
||||
"""Löst Regal-, Buch- und Kapitelnamen in IDs auf und legt Fehlendes auf Wunsch an.
|
||||
|
||||
Ersteller: Pascal Michel
|
||||
Erstellt: 2026-08-05
|
||||
Doku: docs/code/struktur.md · Version und Änderungen: CHANGELOG.md
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -13,8 +18,8 @@ class StrukturFehler(Exception):
|
||||
|
||||
@dataclass
|
||||
class Ziel:
|
||||
buch_id: int
|
||||
kapitel_id: int | None = None
|
||||
buch_id: int # 0: Buch ist im Probelauf nur geplant
|
||||
kapitel_id: int | None = None # 0: Kapitel nur geplant, None: kein Kapitel
|
||||
angelegt: list[str] = field(default_factory=list)
|
||||
|
||||
|
||||
@@ -22,6 +27,11 @@ def _passt(eintrag: dict, name: str) -> bool:
|
||||
return str(eintrag.get("name", "")).strip().casefold() == name.strip().casefold()
|
||||
|
||||
|
||||
def _geplant_schluessel(sammlung: str, *namen: str) -> tuple[str, ...]:
|
||||
"""Schlüssel für das Probelauf-Gedächtnis; Namen vergleicht er wie _passt."""
|
||||
return (sammlung, *(name.strip().casefold() for name in namen))
|
||||
|
||||
|
||||
class Strukturaufloeser:
|
||||
def __init__(
|
||||
self,
|
||||
@@ -35,6 +45,8 @@ class Strukturaufloeser:
|
||||
# Im Probelauf darf nichts entstehen. Fehlendes wird nur benannt.
|
||||
self._nur_planen = nur_planen
|
||||
self._speicher: dict[str, list[dict]] = {}
|
||||
# Probelauf: schon als „wird angelegt“ gemeldete Regale, Bücher und Kapitel.
|
||||
self._geplant: set[tuple[str, ...]] = set()
|
||||
|
||||
def _sammlung(self, name: str) -> list[dict]:
|
||||
if name not in self._speicher:
|
||||
@@ -63,14 +75,26 @@ class Strukturaufloeser:
|
||||
zusatz = " (wird angelegt)" if self._nur_planen else ""
|
||||
return f'{art} "{name.strip()}"{zusatz}'
|
||||
|
||||
def _plane(
|
||||
self, schluessel: tuple[str, ...], art: str, name: str, angelegt: list[str]
|
||||
) -> None:
|
||||
"""Probelauf: meldet eine geplante Neuanlage nur beim ersten Mal."""
|
||||
if schluessel in self._geplant:
|
||||
return
|
||||
self._geplant.add(schluessel)
|
||||
angelegt.append(self._vermerke(art, name))
|
||||
|
||||
def _haenge_an_regal(self, regal_name: str, buch_id: int, angelegt: list[str]) -> None:
|
||||
regal = self._finde("shelves", regal_name)
|
||||
if regal is None:
|
||||
if not self._anlegen_erlaubt:
|
||||
raise self._fehlt("Regal", regal_name)
|
||||
angelegt.append(self._vermerke("Regal", regal_name))
|
||||
if self._nur_planen:
|
||||
self._plane(
|
||||
_geplant_schluessel("shelves", regal_name), "Regal", regal_name, angelegt
|
||||
)
|
||||
return
|
||||
angelegt.append(self._vermerke("Regal", regal_name))
|
||||
self._api.anfrage(
|
||||
"POST", "/api/shelves", {"name": regal_name.strip(), "books": [buch_id]}
|
||||
)
|
||||
@@ -98,10 +122,11 @@ class Strukturaufloeser:
|
||||
if gefunden is None:
|
||||
if not self._anlegen_erlaubt:
|
||||
raise self._fehlt("Buch", buch)
|
||||
angelegt.append(self._vermerke("Buch", buch))
|
||||
if self._nur_planen:
|
||||
self._plane(_geplant_schluessel("books", buch), "Buch", buch, angelegt)
|
||||
gefunden = {"id": 0}
|
||||
else:
|
||||
angelegt.append(self._vermerke("Buch", buch))
|
||||
gefunden = self._api.anfrage("POST", "/api/books", {"name": buch.strip()})
|
||||
self._verwerfe("books")
|
||||
buch_id = int(gefunden["id"])
|
||||
@@ -115,10 +140,13 @@ class Strukturaufloeser:
|
||||
if treffer is None:
|
||||
if not self._anlegen_erlaubt:
|
||||
raise self._fehlt("Kapitel", kapitel)
|
||||
angelegt.append(self._vermerke("Kapitel", kapitel))
|
||||
if self._nur_planen:
|
||||
self._plane(
|
||||
_geplant_schluessel("chapters", buch, kapitel), "Kapitel", kapitel, angelegt
|
||||
)
|
||||
treffer = {"id": 0}
|
||||
else:
|
||||
angelegt.append(self._vermerke("Kapitel", kapitel))
|
||||
treffer = self._api.anfrage(
|
||||
"POST", "/api/chapters", {"book_id": buch_id, "name": kapitel.strip()}
|
||||
)
|
||||
|
||||
Reference in new issue
Block a user