File: node_tree.py

package info (click to toggle)
python-gql 4.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,900 kB
  • sloc: python: 21,677; makefile: 54
file content (92 lines) | stat: -rw-r--r-- 2,845 bytes parent folder | download
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)