feat(tools/file_sourcing): read PSC DefinedEvents and expose .def resolution
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
Reference in New Issue
Block a user