Example #1
0
    def restore_node(self, node: ModuleNode):
        if not self.is_removed_node(node):
            raise InvalidRestoreTargetError()

        # 対象ノードの接続元/接続先ノードだけで構成されたグラフを取得
        node_adjacent = self.master_graph.find_adjacent_graph(node)
        if not node_adjacent:
            return

        # 現在自身に残っているノードに対してのエッジを復元する
        current_nodes = self.list_all_nodes()

        # ノードからの接続先エッジを復元
        for outgoing_node in node_adjacent.outgoing_nodes:
            for current_node in current_nodes:
                if outgoing_node.belongs_to(current_node):
                    self.add_edge(ModuleEdge(tail=node, head=current_node))

        # ノードへの接続エッジを復元
        for incoming_node in node_adjacent.incoming_nodes:
            for current_node in current_nodes:
                if incoming_node.belongs_to(current_node):
                    self.add_edge(ModuleEdge(tail=current_node, head=node))

        # クラスタ内のノードの場合はクラスタも復元した上でそこに追加する
        parent_path = node.path.parent()
        if parent_path:
            cluster = self._find_or_create_clusters(parent_path)
            cluster.add(node)
Example #2
0
    def sample(cls) -> "GraphController":
        master_graph = MasterGraph(edges=ModuleEdgeCollection([
            ModuleEdge.from_str("A.A", "B.B"),
            ModuleEdge.from_str("X.A", "Y.B")
        ]))

        g = Graph(master_graph=master_graph)
        g.add_edge(ModuleEdge.from_str("A", "B"))
        g.add_edge(ModuleEdge.from_str("X", "Y"))

        return cls(g)
Example #3
0
    def _dig_predecessors(self, node: ModuleNode, next_path_level: int):
        # 現在のnodeからの接続元エッジを取得
        current_edges = ModuleEdgeCollection(
            [ModuleEdge(p, node) for p in self.predecessors(node)]
        )

        for new_edge in self.master_graph:
            parent_edge = current_edges.find_parent_edge(new_edge)

            if parent_edge:
                # ノード分解した新しいノードから、ノード分解していないノードへつなぐ
                edge = ModuleEdge(
                    parent_edge.tail, new_edge.head.limit_path_level(next_path_level)
                )
                self.add_edge(edge)
Example #4
0
    def add_edge(self, edge: ModuleEdge):
        if edge.is_self_loop():
            return

        self.edges.add(edge)

        self.add_node(edge.tail)
        self.add_node(edge.head)
Example #5
0
    def reset(self) -> None:
        self.nodes.clear()
        self.edges.clear()
        self.clusters.clear()
        self.graph_style.reset_all_styles()
        self.hide_filter.reset()

        # トップレベルの依存関係をGraphに追加する
        for edge in self.master_graph.edges:
            tail = edge.tail.path_in_depth(1).name
            head = edge.head.path_in_depth(1).name
            if tail == head:
                self.add_node(ModuleNode.from_str(tail))
            else:
                self.add_edge(ModuleEdge.from_str(tail=tail, head=head))
Example #6
0
def edge(tail: str, head: str) -> ModuleEdge:
    return ModuleEdge.from_str(tail, head)