From 1f9193d332ae1922700e730047dcfb2dba640374 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Thu, 30 Apr 2026 15:49:51 +0200 Subject: [PATCH] defaultverhalten des Skripts ist es jetzt alle Beispiele zu bauen. Ansonsten kann man auch nur ein Unterverzeichnis angeben --- lib/create_examples.py | 104 ++++++++++++++++++++++++++++------------- 1 file changed, 71 insertions(+), 33 deletions(-) diff --git a/lib/create_examples.py b/lib/create_examples.py index 0f34ce3..bba15c8 100644 --- a/lib/create_examples.py +++ b/lib/create_examples.py @@ -80,6 +80,27 @@ def _extract_stk_liste_ist(xlsx_path: Path) -> list[StkItem]: wb.close() return items +def _process_single_folder(folder: Path, example_dir: Path, result: dict, log) -> None: + xlsx_files = sorted(folder.glob("*.xlsx")) + if not xlsx_files: + return + + xlsx_path = xlsx_files[0] + rel_folder = str(folder.relative_to(example_dir)) + try: + items = _extract_stk_liste_ist(xlsx_path) + except ValueError as exc: + log.warning("%s/%s uebersprungen: %s", rel_folder, xlsx_path.name, exc) + return + + result[rel_folder] = [ + { + "position": item.position, + "teilenummer": item.teilenummer, + "menge": item.menge, + } + for item in items + ] def process_all(example_dir: Path) -> dict[str, list[dict[str, Any]]]: """ @@ -101,28 +122,9 @@ def process_all(example_dir: Path) -> dict[str, list[dict[str, Any]]]: result: dict[str, list[dict[str, Any]]] = {} for folder in subdirs: - xlsx_files = sorted(folder.glob("*.xlsx")) - if not xlsx_files: - continue - - xlsx_path = xlsx_files[0] - rel_folder = str(folder.relative_to(example_dir)) - log.info("Verarbeite %s: %s", rel_folder, xlsx_path.name) - try: - items = _extract_stk_liste_ist(xlsx_path) - except ValueError as exc: - log.warning("%s/%s uebersprungen: %s", rel_folder, xlsx_path.name, exc) - continue - - result[rel_folder] = [ - { - "position": item.position, - "teilenummer": item.teilenummer, - "menge": item.menge, - } - for item in items - ] - + log.info("Verarbeite %s", folder) + _process_single_folder(folder, example_dir, result, log) + log.info("Fertig. Gelesene Verzeichnisse mit Daten: %d", len(result)) return result @@ -131,8 +133,15 @@ def main() -> None: parser = argparse.ArgumentParser( description="Liest Position/Teilenummer/Menge aus Example-Exceldateien" ) - parser.add_argument("--example-dir", type=Path, default=None, - help="example/ Verzeichnis (default: aus PV_EXAMPLES oder ./examples)") + parser.add_argument( + "--example-dir", + type=Path, + default=None, + help=( + "Unterordnername in PV_EXAMPLES oder direkter Verzeichnispfad " + "(default: alle Unterordner in PV_EXAMPLES)" + ), + ) parser.add_argument("--verbose", "-v", action="store_true", help="Ausfuehrliche Ausgabe") args = parser.parse_args() @@ -143,16 +152,45 @@ def main() -> None: ) import os - if args.example_dir: - example_dir = args.example_dir.resolve() - elif os.environ.get("PV_EXAMPLES"): - example_dir = Path(os.environ["PV_EXAMPLES"]).resolve() - else: - example_dir = Path("example").resolve() - log.info("Beispiel-Verzeichnis: %s", example_dir) - data = process_all(example_dir) - log.info("Objekt erzeugt mit %d Schluesseln", len(data)) + pv_examples = os.environ.get("PV_EXAMPLES") + if not pv_examples: + log.error("PV_EXAMPLES ist nicht gesetzt") + sys.exit(1) + + examples_root = Path(pv_examples).resolve() + if not examples_root.exists() or not examples_root.is_dir(): + log.error("PV_EXAMPLES ist kein gueltiges Verzeichnis: %s", examples_root) + sys.exit(1) + + if args.example_dir is None: + log.info("Beispiel-Verzeichnis (alle Unterordner): %s", examples_root) + data = process_all(examples_root) + log.info("Objekt erzeugt mit %d Schluesseln", len(data)) + return + + # --example-dir: entweder direkter Verzeichnispfad oder Unterordnername in PV_EXAMPLES + candidate = args.example_dir + if candidate.is_absolute(): + target_dir = candidate.resolve() + else: + as_path = candidate.resolve() + if as_path.exists() and as_path.is_dir(): + target_dir = as_path + else: + target_dir = (examples_root / candidate).resolve() + + if not target_dir.exists() or not target_dir.is_dir(): + log.error( + "--example-dir muss ein gueltiger Verzeichnispfad oder Unterordner in PV_EXAMPLES sein: %s", + args.example_dir, + ) + sys.exit(1) + + log.info("Beispiel-Verzeichnis (einzeln): %s", target_dir) + result: dict[str, list[dict[str, Any]]] = {} + _process_single_folder(target_dir, target_dir.parent, result, log) + log.info("Objekt erzeugt mit %d Schluesseln", len(result)) if __name__ == "__main__":