update
This commit is contained in:
@@ -1,9 +1,11 @@
|
||||
"""Zerlegt den rohen Feature-Text in Sektionen — nur für die Anzeige.
|
||||
|
||||
Format: titel (eine Zeile), art, ziel, dann wiederholbare <!-- funktion -->-Blöcke;
|
||||
<!-- regel -->- und <!-- flow -->-Blöcke gehören zur davorstehenden Funktion.
|
||||
Präambel, unbekannte Marker und verwaiste regel/flow-Blöcke landen in `sonstiges`
|
||||
(wird nicht angezeigt, aber beim Speichern erhalten).
|
||||
<!-- regeln -->- und <!-- testen -->-Blöcke (je eine `- `-Zeile pro Eintrag) gehören zur
|
||||
davorstehenden Funktion. Alt-Format wird weiter gelesen: <!-- regel -->-Blöcke (einer je
|
||||
Regel) und <!-- flow --> (heute testen) werden zusammengeführt. Präambel, unbekannte
|
||||
Marker und verwaiste Blöcke landen in `sonstiges` (wird nicht angezeigt, aber beim
|
||||
Speichern erhalten).
|
||||
Trennzeilen aus Bindestrichen (---) sind reine Optik und werden ignoriert.
|
||||
"""
|
||||
|
||||
@@ -36,6 +38,7 @@ def zerlege(roh: str) -> dict:
|
||||
|
||||
titel = []
|
||||
ziel = []
|
||||
regeln = []
|
||||
funktionen = []
|
||||
sonstiges = []
|
||||
art = []
|
||||
@@ -45,18 +48,22 @@ def zerlege(roh: str) -> dict:
|
||||
elif schluessel == "art":
|
||||
art.append(text)
|
||||
elif schluessel == "ziel":
|
||||
ziel.append(text)
|
||||
# vor der ersten Funktion: Karten-Ziel, danach: Ziel der Funktion
|
||||
(funktionen[-1]["ziel"] if funktionen else ziel).append(text)
|
||||
elif schluessel == "funktion":
|
||||
funktionen.append({"text": text, "regeln": [], "flow": []})
|
||||
elif schluessel == "regel" and funktionen:
|
||||
funktionen[-1]["regeln"].append(text)
|
||||
elif schluessel == "flow" and funktionen:
|
||||
funktionen[-1]["flow"].append(text)
|
||||
else: # Präambel, unbekannter Marker, regel/flow ohne funktion
|
||||
funktionen.append({"text": text, "ziel": [], "regeln": [], "testen": []})
|
||||
elif schluessel in ("regel", "regeln"):
|
||||
# vor der ersten Funktion: Karten-Regeln, danach: Regeln der Funktion
|
||||
(funktionen[-1]["regeln"] if funktionen else regeln).append(text)
|
||||
elif schluessel in ("flow", "testen") and funktionen:
|
||||
funktionen[-1]["testen"].append(text)
|
||||
else: # Präambel, unbekannter Marker, regeln/testen ohne funktion
|
||||
sonstiges.append(text)
|
||||
|
||||
for f in funktionen:
|
||||
f["flow"] = "\n".join(f["flow"])
|
||||
f["ziel"] = "\n\n".join(f["ziel"])
|
||||
f["regeln"] = "\n".join(f["regeln"])
|
||||
f["testen"] = "\n".join(f["testen"])
|
||||
|
||||
# Titel ist eine Zeile: erste nicht-leere
|
||||
titel_zeilen = [z.strip() for t in titel for z in t.splitlines() if z.strip()]
|
||||
@@ -65,6 +72,7 @@ def zerlege(roh: str) -> dict:
|
||||
"titel": titel_zeilen[0] if titel_zeilen else "",
|
||||
"art": "optional" if art and art[0].strip().lower() == "optional" else "kern",
|
||||
"ziel": "\n\n".join(ziel),
|
||||
"regeln": "\n".join(regeln),
|
||||
"funktionen": funktionen,
|
||||
"sonstiges": "\n\n".join(sonstiges),
|
||||
}
|
||||
|
||||
@@ -11,11 +11,10 @@ Nutzer können sich anmelden.
|
||||
----------------------------------------
|
||||
<!-- funktion -->
|
||||
Anmeldung mit E-Mail
|
||||
<!-- regel -->
|
||||
Passwort nie loggen
|
||||
<!-- regel -->
|
||||
Sperre nach 5 Fehlversuchen
|
||||
<!-- flow -->
|
||||
<!-- regeln -->
|
||||
- Passwort nie loggen
|
||||
- Sperre nach 5 Fehlversuchen
|
||||
<!-- testen -->
|
||||
- Formular öffnen
|
||||
- Daten eingeben
|
||||
<!-- funktion -->
|
||||
@@ -31,16 +30,33 @@ def test_alle_sektionen():
|
||||
assert s["funktionen"] == [
|
||||
{
|
||||
"text": "Anmeldung mit E-Mail",
|
||||
"regeln": ["Passwort nie loggen", "Sperre nach 5 Fehlversuchen"],
|
||||
"flow": "- Formular öffnen\n- Daten eingeben",
|
||||
"ziel": "",
|
||||
"regeln": "- Passwort nie loggen\n- Sperre nach 5 Fehlversuchen",
|
||||
"testen": "- Formular öffnen\n- Daten eingeben",
|
||||
},
|
||||
{"text": "Abmeldung", "regeln": [], "flow": ""},
|
||||
{"text": "Abmeldung", "ziel": "", "regeln": "", "testen": ""},
|
||||
]
|
||||
|
||||
|
||||
def test_mehrere_flow_bloecke_werden_verbunden():
|
||||
s = zerlege("<!-- funktion -->\nX\n<!-- flow -->\n- a\n<!-- flow -->\n- b\n")
|
||||
assert s["funktionen"][0]["flow"] == "- a\n- b"
|
||||
def test_ziel_nach_funktion_gehoert_zur_funktion():
|
||||
s = zerlege("<!-- ziel -->\nKarte\n<!-- funktion -->\nX\n<!-- ziel -->\nFunktion\n")
|
||||
assert s["ziel"] == "Karte"
|
||||
assert s["funktionen"][0]["ziel"] == "Funktion"
|
||||
|
||||
|
||||
def test_mehrere_testen_bloecke_werden_verbunden():
|
||||
s = zerlege("<!-- funktion -->\nX\n<!-- testen -->\n- a\n<!-- testen -->\n- b\n")
|
||||
assert s["funktionen"][0]["testen"] == "- a\n- b"
|
||||
|
||||
|
||||
def test_alter_flow_marker_wird_gelesen():
|
||||
s = zerlege("<!-- funktion -->\nX\n<!-- flow -->\n- a\n")
|
||||
assert s["funktionen"][0]["testen"] == "- a"
|
||||
|
||||
|
||||
def test_alte_regel_bloecke_werden_zusammengefuehrt():
|
||||
s = zerlege("<!-- funktion -->\nX\n<!-- regel -->\na\n<!-- regel -->\nb\n")
|
||||
assert s["funktionen"][0]["regeln"] == "a\nb"
|
||||
|
||||
|
||||
def test_trenner_zeilen_werden_ignoriert():
|
||||
@@ -59,10 +75,16 @@ def test_unbekannter_marker_landet_in_sonstiges():
|
||||
assert s["sonstiges"] == "Geheim"
|
||||
|
||||
|
||||
def test_regel_und_flow_ohne_funktion_landen_in_sonstiges():
|
||||
s = zerlege("<!-- regel -->\nverwaist\n<!-- flow -->\n- auch\n")
|
||||
def test_regeln_vor_erster_funktion_gehoeren_zur_karte():
|
||||
s = zerlege("<!-- regeln -->\n- karte\n<!-- funktion -->\nX\n<!-- regeln -->\n- funktion\n")
|
||||
assert s["regeln"] == "- karte"
|
||||
assert s["funktionen"][0]["regeln"] == "- funktion"
|
||||
|
||||
|
||||
def test_testen_ohne_funktion_landet_in_sonstiges():
|
||||
s = zerlege("<!-- testen -->\n- verwaist\n")
|
||||
assert s["funktionen"] == []
|
||||
assert s["sonstiges"] == "verwaist\n\n- auch"
|
||||
assert s["sonstiges"] == "- verwaist"
|
||||
|
||||
|
||||
def test_doppelter_marker_wird_konkateniert():
|
||||
@@ -72,7 +94,7 @@ def test_doppelter_marker_wird_konkateniert():
|
||||
|
||||
def test_leerer_text():
|
||||
s = zerlege("")
|
||||
assert s == {"titel": "", "art": "kern", "ziel": "", "funktionen": [], "sonstiges": ""}
|
||||
assert s == {"titel": "", "art": "kern", "ziel": "", "regeln": "", "funktionen": [], "sonstiges": ""}
|
||||
|
||||
|
||||
def test_art_optional():
|
||||
|
||||
Reference in New Issue
Block a user