defaultverhalten des Skripts ist es jetzt alle Beispiele zu bauen. Ansonsten kann man auch nur ein Unterverzeichnis angeben

This commit is contained in:
2026-04-30 15:49:51 +02:00
parent 1abd469043
commit 1f9193d332
+71 -33
View File
@@ -80,6 +80,27 @@ def _extract_stk_liste_ist(xlsx_path: Path) -> list[StkItem]:
wb.close() wb.close()
return items 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]]]: 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]]] = {} result: dict[str, list[dict[str, Any]]] = {}
for folder in subdirs: for folder in subdirs:
xlsx_files = sorted(folder.glob("*.xlsx")) log.info("Verarbeite %s", folder)
if not xlsx_files: _process_single_folder(folder, example_dir, result, log)
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("Fertig. Gelesene Verzeichnisse mit Daten: %d", len(result)) log.info("Fertig. Gelesene Verzeichnisse mit Daten: %d", len(result))
return result return result
@@ -131,8 +133,15 @@ def main() -> None:
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Liest Position/Teilenummer/Menge aus Example-Exceldateien" description="Liest Position/Teilenummer/Menge aus Example-Exceldateien"
) )
parser.add_argument("--example-dir", type=Path, default=None, parser.add_argument(
help="example/ Verzeichnis (default: aus PV_EXAMPLES oder ./examples)") "--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", parser.add_argument("--verbose", "-v", action="store_true",
help="Ausfuehrliche Ausgabe") help="Ausfuehrliche Ausgabe")
args = parser.parse_args() args = parser.parse_args()
@@ -143,16 +152,45 @@ def main() -> None:
) )
import os 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) pv_examples = os.environ.get("PV_EXAMPLES")
data = process_all(example_dir) if not pv_examples:
log.info("Objekt erzeugt mit %d Schluesseln", len(data)) 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__": if __name__ == "__main__":