Extract builder nodes

This commit is contained in:
2026-06-26 23:32:39 +02:00
parent ef8b7f5b89
commit 30b5280da1
6 changed files with 363 additions and 237 deletions
+39 -10
View File
@@ -48,10 +48,12 @@ def _assignment_dict(path: Path, name: str) -> dict[str, Any]:
def _class_return_names(path: Path) -> dict[str, tuple[str, ...]]:
tree = ast.parse(path.read_text(encoding="utf-8"))
result: dict[str, tuple[str, ...]] = {}
classes: dict[str, tuple[list[str], tuple[str, ...]]] = {}
for node in tree.body:
if not isinstance(node, ast.ClassDef) or not node.name.startswith("SxCP"):
if not isinstance(node, ast.ClassDef):
continue
bases = [base.id for base in node.bases if isinstance(base, ast.Name)]
return_names: tuple[str, ...] = ()
for item in node.body:
if not isinstance(item, ast.Assign):
continue
@@ -59,7 +61,29 @@ def _class_return_names(path: Path) -> dict[str, tuple[str, ...]]:
continue
value = _literal_or_none(item.value)
if isinstance(value, tuple) and all(isinstance(part, str) for part in value):
result[node.name] = value
return_names = value
classes[node.name] = (bases, return_names)
def resolve(class_name: str, seen: set[str] | None = None) -> tuple[str, ...]:
seen = seen or set()
if class_name in seen:
return ()
seen.add(class_name)
bases, return_names = classes.get(class_name, ([], ()))
if return_names:
return return_names
for base_name in bases:
inherited = resolve(base_name, seen)
if inherited:
return inherited
return ()
result: dict[str, tuple[str, ...]] = {}
for class_name in classes:
if class_name.startswith("SxCP"):
return_names = resolve(class_name)
if return_names:
result[class_name] = return_names
return result
@@ -97,6 +121,12 @@ def _category_json_paths() -> list[Path]:
return sorted((ROOT / "categories").glob("*.json"))
def _node_python_paths() -> list[Path]:
paths = [ROOT / "__init__.py", ROOT / "loop_nodes.py"]
paths.extend(sorted(ROOT.glob("node_*.py")))
return [path for path in paths if path.exists()]
def _load_category_json(path: Path) -> dict[str, Any]:
data = json.loads(path.read_text(encoding="utf-8"))
return data if isinstance(data, dict) else {}
@@ -246,14 +276,13 @@ def print_table(headers: tuple[str, ...], rows: list[tuple[Any, ...]]) -> None:
def main() -> int:
init_path = ROOT / "__init__.py"
loop_path = ROOT / "loop_nodes.py"
category_paths = _category_json_paths()
display = _assignment_dict(init_path, "NODE_DISPLAY_NAME_MAPPINGS")
loop_display = _assignment_dict(loop_path, "LOOP_NODE_DISPLAY_NAME_MAPPINGS")
display.update(loop_display)
returns = _class_return_names(init_path)
returns.update(_class_return_names(loop_path))
display: dict[str, Any] = {}
returns: dict[str, tuple[str, ...]] = {}
for path in _node_python_paths():
display.update(_assignment_dict(path, "NODE_DISPLAY_NAME_MAPPINGS"))
display.update(_assignment_dict(path, "LOOP_NODE_DISPLAY_NAME_MAPPINGS"))
returns.update(_class_return_names(path))
print("# Node Display Map")
node_rows = []