1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
from typing import Any, Iterable, List, Optional, Sized
from graphql import Node
def _node_tree_recursive(
obj: Any,
*,
indent: int = 0,
ignored_keys: List,
) -> str:
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,
) -> str:
"""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)
|