Coverage for tests/dump_tree.py: 9%
34 statements
« prev ^ index » next coverage.py v6.5.0, created at 2024-02-21 22:00 +0100
« prev ^ index » next coverage.py v6.5.0, created at 2024-02-21 22:00 +0100
1import ast
3from rich.console import Console
4from rich.tree import Tree
7def dump_tree(tree, extra=lambda node: ""): 7 ↛ exitline 7 didn't run the lambda on line 7
9 node = tree
11 def report(node, tree, field_name):
12 if isinstance(node, (ast.expr_context, ast.operator, ast.unaryop, ast.cmpop)):
13 return
15 if field_name:
16 field_name = f"[blue]{field_name}[/]"
18 if not isinstance(node, ast.AST):
19 value = f"[green]{node!r}[/]"
20 if field_name:
21 tree.add(f"{field_name}: {value}")
22 else:
23 tree.add(value)
25 return
26 else:
27 e = extra(node)
29 type_name = f"[blue bold]{type(node).__name__}()[/]"
31 if e:
32 type_name += f" [yellow]{e}[/]"
34 name = f"{field_name}: {type_name}" if field_name else type_name
36 if isinstance(node, ast.Attribute):
37 name += "(.%s)" % node.attr
39 t = tree.add(name)
41 for field, value in ast.iter_fields(node):
42 if isinstance(value, list) and value:
43 c = t.add(f"[blue]{field}[/]:")
44 for v in value:
45 report(v, c, "")
46 else:
47 report(value, t, field)
49 tree = Tree("ast")
50 report(node, tree, "root")
51 console = Console(color_system="standard")
52 console.print(tree)