[core][graphIO] PartialSerializer: fix List/GroupAttribute link serialization

Ensure attribute input connection is serialized, even for List/GroupAttributes.
Note: while connecting GroupAttributes is not yet supported, this will benefit
this type of attribute once it is.
This commit is contained in:
Yann Lanthony 2025-02-06 18:03:00 +01:00
parent 724e7fb387
commit 0594f593f2
2 changed files with 21 additions and 3 deletions

View file

@ -200,9 +200,13 @@ class PartialGraphSerializer(GraphSerializer):
Serialize `attribute` (recursively for list/groups) and deal with attributes being connected Serialize `attribute` (recursively for list/groups) and deal with attributes being connected
to nodes that are not part of the partial list of nodes to serialize. to nodes that are not part of the partial list of nodes to serialize.
""" """
# If the attribute is connected to a node that is not in the list of nodes to serialize, linkParam = attribute.getLinkParam()
# the link expression should not be serialized.
if attribute.isLink and attribute.getLinkParam().node not in self.nodes: if linkParam is not None:
# Use standard link serialization if upstream node is part of the serialization.
if linkParam.node in self.nodes:
return attribute.getExportValue()
# Skip link serialization otherwise.
# If part of a list, this entry can be discarded. # If part of a list, this entry can be discarded.
if isinstance(attribute.root, ListAttribute): if isinstance(attribute.root, ListAttribute):
return None return None

View file

@ -243,6 +243,20 @@ class TestGraphPartialSerialization:
assert compareGraphsContent(graph, graphA) assert compareGraphsContent(graph, graphA)
assert compareGraphsContent(graphA, graphB) assert compareGraphsContent(graphA, graphB)
def test_listAttributeToListAttributeConnectionIsSerialized(self):
graph = Graph("")
with registeredNodeTypes([NodeWithListAttributes]):
nodeA = graph.addNewNode(NodeWithListAttributes.__name__)
nodeB = graph.addNewNode(NodeWithListAttributes.__name__)
graph.addEdge(nodeA.listInput, nodeB.listInput)
otherGraph = Graph("")
otherGraph._deserialize(graph.serializePartial([nodeA, nodeB]))
assert otherGraph.node(nodeB.name).listInput.linkParam == otherGraph.node(nodeA.name).listInput
def test_singleNodeWithInputConnectionFromNonSerializedNodeRemovesEdge(self): def test_singleNodeWithInputConnectionFromNonSerializedNodeRemovesEdge(self):
graph = Graph("") graph = Graph("")