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
+36 -11
View File
@@ -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")