defaultverhalten des Skripts ist es jetzt alle Beispiele zu bauen. Ansonsten kann man auch nur ein Unterverzeichnis angeben
This commit is contained in:
+71
-33
@@ -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__":
|
||||||
|
|||||||
Reference in New Issue
Block a user