Files
blender-portable-repo/scripts/addons/Rokoko Libraries/python311/gql/utilities/node_tree.py
T
2026-03-17 14:58:51 -06:00

93 lines
2.8 KiB
Python

from typing import Any, Iterable, List, Optional, Sized
from graphql import Node
def _node_tree_recursive(
obj: Any,
*,
indent: int = 0,
ignored_keys: List,
):
assert ignored_keys is not None
results = []
if hasattr(obj, "__slots__"):
results.append(" " * indent + f"{type(obj).__name__}")
try:
keys = sorted(obj.keys)
except AttributeError:
# If the object has no keys attribute, print its repr and return.
results.append(" " * (indent + 1) + repr(obj))
else:
for key in keys:
if key in ignored_keys:
continue
attr_value = getattr(obj, key, None)
results.append(" " * (indent + 1) + f"{key}:")
if isinstance(attr_value, Iterable) and not isinstance(
attr_value, (str, bytes)
):
if isinstance(attr_value, Sized) and len(attr_value) == 0:
results.append(
" " * (indent + 2) + f"empty {type(attr_value).__name__}"
)
else:
for item in attr_value:
results.append(
_node_tree_recursive(
item,
indent=indent + 2,
ignored_keys=ignored_keys,
)
)
else:
results.append(
_node_tree_recursive(
attr_value,
indent=indent + 2,
ignored_keys=ignored_keys,
)
)
else:
results.append(" " * indent + repr(obj))
return "\n".join(results)
def node_tree(
obj: Node,
*,
ignore_loc: bool = True,
ignore_block: bool = True,
ignored_keys: Optional[List] = None,
):
"""Method which returns a tree of Node elements as a String.
Useful to debug deep DocumentNode instances created by gql or dsl_gql.
NOTE: from gql version 3.6.0b4 the elements of each node are sorted to ignore
small changes in graphql-core
WARNING: the output of this method is not guaranteed and may change without notice.
"""
assert isinstance(obj, Node)
if ignored_keys is None:
ignored_keys = []
if ignore_loc:
# We are ignoring loc attributes by default
ignored_keys.append("loc")
if ignore_block:
# We are ignoring block attributes by default (in StringValueNode)
ignored_keys.append("block")
return _node_tree_recursive(obj, ignored_keys=ignored_keys)