Test für alle Elemente ist jetzt interativ. Man kann jeden Test in einem Reiter offen lassen und ansehen (csv Export aller Files ist dann manuell zu machen), oder auch automatisch schliessen, dafür ist aber der csv Export anschliessend auch mit automatisch.

This commit is contained in:
2026-07-02 16:35:16 +02:00
parent 3c5d8be08d
commit 2abcd0964c
14 changed files with 671 additions and 411 deletions
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
export_blockpatterns.py - Liest Blockname-Muster aus cfg/export.cfg.
Einzige Quelle fuer die Blockname-Klassifikation, die sowohl von
Lisp/export.lsp (csv:collect-export-blocks, ueber export:pattern) als auch
von den Python-Export-Skripten (export_csv.py, export_sivas.py) genutzt
wird. Vermeidet, dass Blockname-Praefixe/-Wildcards in mehreren Dateien
unabhaengig voneinander gepflegt werden und dabei auseinanderlaufen.
cfg/export.cfg deklariert fuer Lisp kombinierte Kategorien (z.B.
pattern_kreisel deckt Kreisel UND Eckrad ab, weil Lisp beim Sammeln der
Bloecke nur "gehoert das ueberhaupt zum Export" wissen muss). Python
braucht dagegen feinere Kategorien (Kreisel und Eckrad sind unterschied-
liche TeileArt-Zeilen) - dafuer gibt es zusaetzliche, feinere Keys
(pattern_eckrad, pattern_strecke_compound, pattern_strecke_module), die
inhaltlich Teilmengen der groben Lisp-Kategorien sind.
"""
import configparser
import fnmatch
import os
def cfg_path_from_env(default_dir=None):
"""Pfad zu export.cfg ermitteln: DXFM_CFG env var, sonst <repo>/cfg."""
dxfm_cfg = os.environ.get("DXFM_CFG")
if dxfm_cfg:
return os.path.join(dxfm_cfg, "export.cfg")
base = default_dir or os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base, "cfg", "export.cfg")
def load_patterns(cfg_path=None):
"""Liest [blockpattern] aus export.cfg.
Rueckgabe: dict key -> list[str] (Wildcard-Muster, wcmatch-kompatibel:
"*" = beliebig viele Zeichen). Bei fehlender Datei/Sektion: leeres dict.
"""
if cfg_path is None:
cfg_path = cfg_path_from_env()
parser = configparser.ConfigParser()
parser.read(cfg_path, encoding="utf-8")
patterns = {}
if parser.has_section("blockpattern"):
for key, value in parser.items("blockpattern"):
patterns[key] = [p.strip() for p in value.split(",") if p.strip()]
return patterns
def matches_any(bname, patterns):
"""True, wenn bname (case-insensitiv) zu mindestens einem Muster passt."""
upper = bname.upper()
return any(fnmatch.fnmatchcase(upper, p.upper()) for p in patterns)