示例#1
0
    def test_class_deserialization(self):
        """Tests JSON deserialization of a class dependency graph.

        Since we only ever construct package graphs from class graphs
        (and that feature is tested elsewhere), we do not need to test
        deserialization of package dependency graphs as well.
        """
        test_graph = serialization.create_class_graph_from_json_obj(
            self.JSON_CLASS_GRAPH)

        node_1 = test_graph.get_node_by_key(self.CLASS_1)
        node_2 = test_graph.get_node_by_key(self.CLASS_2)
        node_3 = test_graph.get_node_by_key(self.CLASS_3)

        self.assertIsNotNone(node_1)
        self.assertIsNotNone(node_2)
        self.assertIsNotNone(node_3)
        self.assertEqual(node_1.nested_classes,
                         {self.CLASS_1_NESTED_1, self.CLASS_1_NESTED_2})
        self.assertEqual(node_2.nested_classes, {self.CLASS_2_NESTED_1})
        self.assertEqual(node_3.nested_classes, set())
        self.assertEqual(node_1.build_targets, {self.BUILD_TARGET_1})
        self.assertEqual(node_2.build_targets, set())
        self.assertEqual(node_3.build_targets,
                         {self.BUILD_TARGET_1, self.BUILD_TARGET_2})
        self.assertEqual(
            graph.sorted_edges_by_name(test_graph.edges),
            graph.sorted_edges_by_name([(node_1, node_2), (node_1, node_3),
                                        (node_2, node_3)]))
    def test_add_edge_double_sided(self):
        """Tests adding a bidirectional edge to the graph."""
        node1 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_1)
        node2 = self.test_graph.add_node_if_new(self.UNIQUE_KEY_2)
        self.test_graph.add_edge_if_new(self.UNIQUE_KEY_1, self.UNIQUE_KEY_2)
        self.test_graph.add_edge_if_new(self.UNIQUE_KEY_2, self.UNIQUE_KEY_1)

        self.assertEqual(self.test_graph.num_edges, 2)
        self.assertEqual(node1.inbound, {node2})
        self.assertEqual(node1.outbound, {node2})
        self.assertEqual(node2.inbound, {node1})
        self.assertEqual(node2.outbound, {node1})
        self.assertEqual(
            graph.sorted_edges_by_name(self.test_graph.edges),
            graph.sorted_edges_by_name([(node1, node2), (node2, node1)]))
def print_package_dependencies_for_edge(begin, end):
    """Prints dependencies for an edge in the package graph.

    Since these are package edges, we also print the class dependency edges
    comprising the printed package edge.
    """
    if begin == end:
        return
    print(f'\t{begin.name} -> {end.name}')
    class_deps = begin.get_class_dependencies_in_outbound_edge(end)
    print(f'\t{len(class_deps)} class edge(s) comprising the dependency:')
    for begin_class, end_class in graph.sorted_edges_by_name(class_deps):
        print(f'\t\t{begin_class.class_name} -> {end_class.class_name}')
示例#4
0
def create_json_obj_from_graph(graph_obj: graph.Graph) -> Dict:
    """Generates a JSON representation of the current graph.

    The list of nodes and edges is sorted in order to help with testing.
    Structure:
    {
        'nodes': [
            { see create_json_obj_from_node }, ...
        ],
        'edges': [
            {
                'begin': str,
                'end': str,
                'meta': { see Graph.get_edge_metadata },
            }, ...
        ],
    }
    """
    sorted_nodes = graph.sorted_nodes_by_name(graph_obj.nodes)
    json_nodes = [create_json_obj_from_node(node) for node in sorted_nodes]

    json_edges = []
    for begin_node, end_node in graph.sorted_edges_by_name(graph_obj.edges):
        edge_json_obj = {
            json_consts.BEGIN: begin_node.name,
            json_consts.END: end_node.name,
        }
        edge_meta = graph_obj.get_edge_metadata(begin_node, end_node)
        if edge_meta is not None:
            edge_json_obj[json_consts.META] = edge_meta
        json_edges.append(edge_json_obj)

    return {
        json_consts.NODES: json_nodes,
        json_consts.EDGES: json_edges,
    }