Source code for pyiron_workflow.actions

from __future__ import annotations

import dataclasses
from typing import TYPE_CHECKING, Protocol, TypeAlias

if TYPE_CHECKING:
    import flowrep as fr

    from pyiron_workflow import datatypes


[docs] class GraphAction(Protocol):
[docs] def inverse(self) -> GraphAction: ...
[docs] @dataclasses.dataclass(frozen=True) class AddInput: port: datatypes.InputPort
[docs] def inverse(self) -> RemoveInput: return RemoveInput(self.port)
[docs] @dataclasses.dataclass(frozen=True) class RemoveInput: port: datatypes.InputPort
[docs] def inverse(self) -> AddInput: return AddInput(self.port)
[docs] @dataclasses.dataclass(frozen=True) class AddOutput: port: datatypes.OutputPort
[docs] def inverse(self) -> RemoveOutput: return RemoveOutput(self.port)
[docs] @dataclasses.dataclass(frozen=True) class RemoveOutput: port: datatypes.OutputPort
[docs] def inverse(self) -> AddOutput: return AddOutput(self.port)
[docs] @dataclasses.dataclass(frozen=True) class ReplacePort: old_port: datatypes.InputPort | datatypes.OutputPort new_port: datatypes.InputPort | datatypes.OutputPort
[docs] def inverse(self) -> ReplacePort: return ReplacePort(self.new_port, self.old_port)
[docs] @dataclasses.dataclass(frozen=True) class AddNode: node: datatypes.Node
[docs] def inverse(self) -> RemoveNode: return RemoveNode(self.node)
[docs] @dataclasses.dataclass(frozen=True) class RemoveNode: node: datatypes.Node
[docs] def inverse(self) -> AddNode: return AddNode(self.node)
[docs] @dataclasses.dataclass(frozen=True) class AddEdge: edge: datatypes.EdgeTuple
[docs] def inverse(self) -> RemoveEdge: return RemoveEdge(self.edge)
[docs] @dataclasses.dataclass(frozen=True) class RemoveEdge: edge: datatypes.EdgeTuple
[docs] def inverse(self) -> AddEdge: return AddEdge(self.edge)
[docs] @dataclasses.dataclass(frozen=True) class RenameNode: node: datatypes.Node old_label: fr.schemas.Label new_label: fr.schemas.Label
[docs] def inverse(self) -> RenameNode: return RenameNode(self.node, self.new_label, self.old_label)
[docs] @dataclasses.dataclass(frozen=True) class MoveNode: node: datatypes.Node from_graph: datatypes.MutableDag to_graph: datatypes.MutableDag old_label: fr.schemas.Label new_label: fr.schemas.Label
[docs] def inverse(self) -> MoveNode: return MoveNode( node=self.node, from_graph=self.to_graph, to_graph=self.from_graph, old_label=self.new_label, new_label=self.old_label, )
GraphDiff: TypeAlias = list[GraphAction]