Meshroom/tests/test_templatesVersion.py
Yann Lanthony a665200c38 [core] Introducing new graphIO module
Move Graph.IO internal class to its own module, and rename it to `GraphIO`.
This avoid nested classes within the core Graph class, and starts decoupling
the management of graph's IO from the logic of the graph itself.
2025-02-06 16:46:04 +01:00

61 lines
2.4 KiB
Python

#!/usr/bin/env python
# coding:utf-8
from meshroom.core.graph import Graph
from meshroom.core import pipelineTemplates, Version
from meshroom.core.node import CompatibilityIssue, CompatibilityNode
from meshroom.core.graphIO import GraphIO
import json
import meshroom
def test_templateVersions():
"""
This test checks that there is no compatibility issue with the nodes saved in the template files.
It fails when an upgrade of a templates is needed. Any template can still be opened even if its
nodes are not up-to-date, as they will be automatically upgraded.
"""
meshroom.core.initNodes()
meshroom.core.initPipelines()
assert len(pipelineTemplates) >= 1
for _, path in pipelineTemplates.items():
with open(path) as jsonFile:
fileData = json.load(jsonFile)
graphData = fileData.get(GraphIO.Keys.Graph, fileData)
assert isinstance(graphData, dict)
header = fileData.get(GraphIO.Keys.Header, {})
assert header.get("template", False)
nodesVersions = header.get(GraphIO.Keys.NodesVersions, {})
for _, nodeData in graphData.items():
nodeType = nodeData["nodeType"]
assert nodeType in meshroom.core.nodesDesc
nodeDesc = meshroom.core.nodesDesc[nodeType]
currentNodeVersion = meshroom.core.nodeVersion(nodeDesc)
inputs = nodeData.get("inputs", {})
internalInputs = nodeData.get("internalInputs", {})
version = nodesVersions.get(nodeType, None)
compatibilityIssue = None
if version and currentNodeVersion and Version(version).major != Version(currentNodeVersion).major:
compatibilityIssue = CompatibilityIssue.VersionConflict
else:
for attrName, value in inputs.items():
if not CompatibilityNode.attributeDescFromName(nodeDesc.inputs, attrName, value):
compatibilityIssue = CompatibilityIssue.DescriptionConflict
break
for attrName, value in internalInputs.items():
if not CompatibilityNode.attributeDescFromName(nodeDesc.internalInputs, attrName, value):
compatibilityIssue = CompatibilityIssue.DescriptionConflict
break
assert compatibilityIssue is None, "{} in {} for node {}".format(compatibilityIssue, path, nodeType)