[FEAT] Weitere Objekte der Anlage in hundm05.json bauen (Kreisel)
tests/testdata/hundm05.json enthaelt jetzt neben den 5 Spec-Ketten auch andere Objekte der Anlage - erkennbar am Feld "function", im Format der jeweiligen Einzel-Testdaten (ein Kreisel also wie in kreisel_tests.json). Damit beschreibt EINE Datei die ganze Anlage. - tests/test_hundm05.lsp: hundm05:bau-zusatzobjekte sammelt alle Objekte mit "function" und baut sie; hundm05:bau-kreisel ruft kreisel-insert-script (wie tests/test_kreisel.lsp) und liefert einen Ergebnis-Record in derselben Form wie die Ketten. Eigener ssg-start-Rahmen mit ATTREQ/ATTDIA 0, weil vsp-bau-datei seinen schon geschlossen hat und (command "_.INSERT" ...) sonst nach Attributwerten fragt. Je Objekt gefangen, damit ein Fehler die restlichen nicht mitnimmt. - Lisp/vf_spec.lsp: "kind" ist jetzt ein Record-Feld (Default "linienzug") statt eines Literals in vsp-result-json - so schreibt vsp-results-schreiben beide Objektarten in EINE Ergebnisdatei. - lib/vf_spec_export.py: Objekte der Ziel-Datei, die keine Kette beschreiben, werden beim Neuschreiben unveraendert ans Dateiende uebernommen. Ohne das waere jeder von Hand ergaenzte Eintrag beim naechsten Generatorlauf weg - die Datei ist erzeugt UND handgepflegt. spec_aus_flachen_objekten ueberspringt sie jetzt statt zu werfen, genau wie vsp-gruppieren in LISP. - tests/test_hundm05.py: die Ketten-Tests filtern auf kind "linienzug" (Records ohne das Feld stammen aus aelteren Laeufen und waren nur Ketten); neue Klasse TestZusatzobjekte prueft Status, expect_block_prefix, expect_hoehe (Attribut HOEHE), expect_kreiselart (KREISELART) und den Einfuegepunkt - dieselben Erwartungsfelder wie tests/test_kreisel.py. - tests/test_vf_spec.py: neuer Test, dass die Zusatzobjekte die Ketten-Zerlegung nicht beeinflussen - auch nicht, wenn sie mitten zwischen den Sektionen stehen (der eingetragene Kreisel stand zunaechst inmitten der Sub-Knoten von Kette 5; nach dem Regenerieren steht er am Dateiende). Verifiziert: 118 pytest-Tests gruen, Spec-Regenerierung uebernimmt das Zusatzobjekt (58 Objekte), beide .lsp lint-sauber. Die Kreisel-Tests warten auf den naechsten TEST_HUNDM05-Lauf. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+33
-1
@@ -624,6 +624,26 @@ def flache_objekte(spec_id, spec, kopf_extra=None):
|
||||
return objekte
|
||||
|
||||
|
||||
def fremde_objekte(pfad):
|
||||
"""Objekte einer bestehenden Ziel-Datei, die KEINE Spec beschreiben.
|
||||
|
||||
Die Spec-Testdaten werden erzeugt, die Datei ist aber zugleich die
|
||||
Stelle, an der weitere Objekte der Anlage von Hand nachgetragen werden
|
||||
(Kreisel, Foerderer, ...). Alles ohne spec_id/glied/sub gehoert nicht
|
||||
zum Generator und wird beim Neuschreiben uebernommen - sonst waere ein
|
||||
handgeschriebener Eintrag beim naechsten Lauf weg.
|
||||
"""
|
||||
if not pfad or not os.path.isfile(pfad):
|
||||
return []
|
||||
try:
|
||||
with open(pfad, encoding="utf-8") as fh:
|
||||
daten = json.load(fh)
|
||||
except ValueError:
|
||||
return []
|
||||
return [o for o in daten
|
||||
if not ("spec_id" in o or "glied" in o or "sub" in o)]
|
||||
|
||||
|
||||
def spec_aus_flachen_objekten(objekte):
|
||||
"""Umkehrung von flache_objekte - dieselbe Gruppierregel wie
|
||||
hmrec:gruppiere in LISP (Kopf, dann glied/sub in Reihenfolge)."""
|
||||
@@ -670,7 +690,11 @@ def spec_aus_flachen_objekten(objekte):
|
||||
sek.setdefault("vf", collections.OrderedDict())
|
||||
sek["vf"].setdefault("subs", []).append(sub)
|
||||
else:
|
||||
raise ValueError("Objekt ohne spec_id/glied/sub: %r" % obj)
|
||||
# Von Hand ergaenzte Objekte der Anlage (Kreisel u.a.) gehoeren
|
||||
# nicht zur Spec und werden uebersprungen - genauso wie
|
||||
# vsp-gruppieren in Lisp/vf_spec.lsp es tut. Sie stehen in
|
||||
# derselben Datei, damit eine Anlage EINE Beschreibung hat.
|
||||
continue
|
||||
return specs
|
||||
|
||||
|
||||
@@ -733,6 +757,14 @@ def main():
|
||||
% (PREFIX, fehler))
|
||||
return 1
|
||||
|
||||
# Von Hand ergaenzte Objekte der Ziel-Datei ans Ende uebernehmen.
|
||||
fremde = fremde_objekte(args.ziel)
|
||||
if fremde:
|
||||
print("%s %d von Hand ergaenzte(s) Objekt(e) uebernommen: %s"
|
||||
% (PREFIX, len(fremde),
|
||||
", ".join(str(o.get("id", "?")) for o in fremde)))
|
||||
alle.extend(fremde)
|
||||
|
||||
text = json.dumps(alle, indent=2, ensure_ascii=False)
|
||||
with open(args.ziel, "w", encoding="utf-8", newline="\r\n") as fh:
|
||||
fh.write(arrays_einzeilig(text))
|
||||
|
||||
Reference in New Issue
Block a user