feat(tools/file_sourcing): read PSC DefinedEvents and expose .def resolution

This commit is contained in:
2026-09-24 07:53:15 +02:00
parent b2656599b2
commit aa0780dd51
+35 -10
View File
@@ -1,6 +1,6 @@
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import os import os
from dataclasses import dataclass from dataclasses import dataclass, field
from typing import List, Optional from typing import List, Optional
from pathlib import Path from pathlib import Path
@@ -10,6 +10,7 @@ class SourcedFile:
layer_name: str layer_name: str
subfolder: Optional[str] subfolder: Optional[str]
files: List[str] files: List[str]
defined_events: List[str] = field(default_factory=list)
def read_psc_file(psc_file: Path) -> List[SourcedFile]: def read_psc_file(psc_file: Path) -> List[SourcedFile]:
@@ -34,8 +35,22 @@ def read_psc_file(psc_file: Path) -> List[SourcedFile]:
if name: if name:
script_names.append(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( 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 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()) return sorted(root_path.rglob("*.psc"), key=lambda path: str(path).casefold())
def psc_script_files(psc_file: Path) -> list[Path]: def _expanded(value) -> Path:
"""Resolve layer script paths relative to the PSC, preserving load order."""
def expanded(value):
return Path(os.path.expandvars(value).replace("\\", "/")) return Path(os.path.expandvars(value).replace("\\", "/"))
def _layer_files(psc_file: Path, attribute: str, suffix: str) -> list[Path]:
paths = [] paths = []
for layer in read_psc_file(psc_file): for layer in read_psc_file(psc_file):
folder = layer.subfolder or "." folder = layer.subfolder or "."
base = psc_file.parent / expanded(os.environ.get(folder, folder)) base = psc_file.parent / _expanded(os.environ.get(folder, folder))
for name in layer.files: for name in getattr(layer, attribute):
filename = expanded(name) filename = _expanded(name)
if not filename.suffix: if not filename.suffix:
filename = filename.with_suffix(".tcl") filename = filename.with_suffix(suffix)
path = (base / filename).resolve() path = (base / filename).resolve()
if path.suffix.lower() == ".tcl": if path.suffix.lower() == suffix:
paths.append(path) paths.append(path)
return paths 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")