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:
@@ -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)
|
||||
Reference in New Issue
Block a user