From aa0780dd5184433bb4d02c27c6080c3925d5553a Mon Sep 17 00:00:00 2001 From: Christoph Brandau Date: Thu, 24 Sep 2026 07:53:15 +0200 Subject: [PATCH] feat(tools/file_sourcing): read PSC DefinedEvents and expose .def resolution --- server/src/tools/file_sourcing.py | 47 +++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/server/src/tools/file_sourcing.py b/server/src/tools/file_sourcing.py index 936c30a..8643cae 100644 --- a/server/src/tools/file_sourcing.py +++ b/server/src/tools/file_sourcing.py @@ -1,6 +1,6 @@ import xml.etree.ElementTree as ET import os -from dataclasses import dataclass +from dataclasses import dataclass, field from typing import List, Optional from pathlib import Path @@ -10,6 +10,7 @@ class SourcedFile: layer_name: str subfolder: Optional[str] files: List[str] + defined_events: List[str] = field(default_factory=list) def read_psc_file(psc_file: Path) -> List[SourcedFile]: @@ -34,8 +35,22 @@ def read_psc_file(psc_file: Path) -> List[SourcedFile]: if name: script_names.append(name) + # DefinedEvents-Filenames (.def files) + defined_events = layer.find("DefinedEvents") + event_names = [] + if defined_events is not None: + for filename in defined_events.findall("Filename"): + name = filename.attrib.get("Name") + if name: + event_names.append(name) + layer_info_list.append( - SourcedFile(layer_name=layer_name, subfolder=subfolder, files=script_names) + SourcedFile( + layer_name=layer_name, + subfolder=subfolder, + files=script_names, + defined_events=event_names, + ) ) return layer_info_list @@ -44,20 +59,30 @@ def get_all_psc_files(root_path: Path) -> list[Path]: return sorted(root_path.rglob("*.psc"), key=lambda path: str(path).casefold()) -def psc_script_files(psc_file: Path) -> list[Path]: - """Resolve layer script paths relative to the PSC, preserving load order.""" - def expanded(value): - return Path(os.path.expandvars(value).replace("\\", "/")) +def _expanded(value) -> Path: + return Path(os.path.expandvars(value).replace("\\", "/")) + +def _layer_files(psc_file: Path, attribute: str, suffix: str) -> list[Path]: paths = [] for layer in read_psc_file(psc_file): folder = layer.subfolder or "." - base = psc_file.parent / expanded(os.environ.get(folder, folder)) - for name in layer.files: - filename = expanded(name) + base = psc_file.parent / _expanded(os.environ.get(folder, folder)) + for name in getattr(layer, attribute): + filename = _expanded(name) if not filename.suffix: - filename = filename.with_suffix(".tcl") + filename = filename.with_suffix(suffix) path = (base / filename).resolve() - if path.suffix.lower() == ".tcl": + if path.suffix.lower() == suffix: paths.append(path) return paths + + +def psc_script_files(psc_file: Path) -> list[Path]: + """Resolve layer script paths relative to the PSC, preserving load order.""" + return _layer_files(psc_file, "files", ".tcl") + + +def psc_defined_event_files(psc_file: Path) -> list[Path]: + """Resolve the layers' DefinedEvents (.def) paths relative to the PSC.""" + return _layer_files(psc_file, "defined_events", ".def")