| @@ 45-84 (lines=40) @@ | ||
| 42 | yield from _ast_edge(child_ast) |
|
| 43 | ||
| 44 | ||
| 45 | @pytest.fixture() |
|
| 46 | def ast_graph_model(): |
|
| 47 | graph_model = graphinate.model(name='AST Graph') |
|
| 48 | ||
| 49 | root_ast_node = ast.parse(inspect.getsource(graphinate.builders.D3Builder)) |
|
| 50 | ||
| 51 | def node_type(ast_node): |
|
| 52 | return ast_node.__class__.__name__ |
|
| 53 | ||
| 54 | def node_label(ast_node) -> str: |
|
| 55 | label = ast_node.__class__.__name__ |
|
| 56 | ||
| 57 | for field_name in ('name', 'id'): |
|
| 58 | if field_name in ast_node._fields: |
|
| 59 | label = f"{label}\n{field_name}: {operator.attrgetter(field_name)(ast_node)}" |
|
| 60 | ||
| 61 | return label |
|
| 62 | ||
| 63 | def key(value): |
|
| 64 | # noinspection InsecureHash |
|
| 65 | return hashlib.md5(pickle.dumps(value)).hexdigest() |
|
| 66 | ||
| 67 | def endpoint(value, endpoint_name): |
|
| 68 | return key(value[endpoint_name]) |
|
| 69 | ||
| 70 | def source(value): |
|
| 71 | return endpoint(value, 'source') |
|
| 72 | ||
| 73 | def target(value): |
|
| 74 | return endpoint(value, 'target') |
|
| 75 | ||
| 76 | @graph_model.node(_type=node_type, key=key, label=node_label, uniqueness=True) |
|
| 77 | def ast_node(**kwargs): |
|
| 78 | yield from _ast_nodes([root_ast_node]) |
|
| 79 | ||
| 80 | @graph_model.edge(_type='edge', source=source, target=target, label=operator.itemgetter('type')) |
|
| 81 | def ast_edge(**kwargs): |
|
| 82 | yield from _ast_edge(root_ast_node) |
|
| 83 | ||
| 84 | return graph_model |
|
| 85 | ||
| 86 | ||
| 87 | @pytest.fixture() |
|
| @@ 33-71 (lines=39) @@ | ||
| 30 | yield from _ast_edge(child_ast) |
|
| 31 | ||
| 32 | ||
| 33 | def ast_graph_model(): |
|
| 34 | graph_model = graphinate.model(name='AST Graph') |
|
| 35 | ||
| 36 | root_ast_node = ast.parse(inspect.getsource(graphinate.builders.D3Builder)) |
|
| 37 | ||
| 38 | def node_type(ast_node): |
|
| 39 | return ast_node.__class__.__name__ |
|
| 40 | ||
| 41 | def node_label(ast_node) -> str: |
|
| 42 | label = ast_node.__class__.__name__ |
|
| 43 | ||
| 44 | for field_name in ('name', 'id'): |
|
| 45 | if field_name in ast_node._fields: |
|
| 46 | label = f"{label}\n{field_name}: {operator.attrgetter(field_name)(ast_node)}" |
|
| 47 | ||
| 48 | return label |
|
| 49 | ||
| 50 | def key(value): |
|
| 51 | # noinspection InsecureHash |
|
| 52 | return hashlib.md5(pickle.dumps(value)).hexdigest() |
|
| 53 | ||
| 54 | def endpoint(value, endpoint_name): |
|
| 55 | return key(value[endpoint_name]) |
|
| 56 | ||
| 57 | def source(value): |
|
| 58 | return endpoint(value, 'source') |
|
| 59 | ||
| 60 | def target(value): |
|
| 61 | return endpoint(value, 'target') |
|
| 62 | ||
| 63 | @graph_model.node(_type=node_type, key=key, label=node_label, uniqueness=True) |
|
| 64 | def ast_node(**kwargs): |
|
| 65 | yield from _ast_nodes([root_ast_node]) |
|
| 66 | ||
| 67 | @graph_model.edge(_type='edge', source=source, target=target, label=operator.itemgetter('type')) |
|
| 68 | def ast_edge(**kwargs): |
|
| 69 | yield from _ast_edge(root_ast_node) |
|
| 70 | ||
| 71 | return graph_model |
|
| 72 | ||
| 73 | ||
| 74 | if __name__ == '__main__': |
|