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

1import ast 

2 

3from rich.console import Console 

4from rich.tree import Tree 

5 

6 

7def dump_tree(tree, extra=lambda node: ""): 7 ↛ exitline 7 didn't run the lambda on line 7

8 

9 node = tree 

10 

11 def report(node, tree, field_name): 

12 if isinstance(node, (ast.expr_context, ast.operator, ast.unaryop, ast.cmpop)): 

13 return 

14 

15 if field_name: 

16 field_name = f"[blue]{field_name}[/]" 

17 

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) 

24 

25 return 

26 else: 

27 e = extra(node) 

28 

29 type_name = f"[blue bold]{type(node).__name__}()[/]" 

30 

31 if e: 

32 type_name += f" [yellow]{e}[/]" 

33 

34 name = f"{field_name}: {type_name}" if field_name else type_name 

35 

36 if isinstance(node, ast.Attribute): 

37 name += "(.%s)" % node.attr 

38 

39 t = tree.add(name) 

40 

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) 

48 

49 tree = Tree("ast") 

50 report(node, tree, "root") 

51 console = Console(color_system="standard") 

52 console.print(tree)