Meshroom/meshroom/core/test.py
Candice Bentéjac c3e8b8833f [core] checkTemplateVersions: Ensure nodes are not loaded several times
By performing a `initNodes()` every single time `checkTemplateVersions`
was called without ever unregistering the nodes, warnings about nodes
being already registered were raised when for example calling
`checkAllTemplatesVersions`.
2025-03-18 14:04:06 +00:00

77 lines
2.8 KiB
Python

#!/usr/bin/env python
# coding:utf-8
from meshroom.core import unregisterNodeType, pipelineTemplates, Version
from meshroom.core.node import CompatibilityIssue, CompatibilityNode
from meshroom.core.graphIO import GraphIO
import meshroom
import json
def checkTemplateVersions(path: str, nodesAlreadyLoaded: bool = False) -> bool:
""" Check whether there is a compatibility issue with the nodes saved in the template provided with "path". """
if not nodesAlreadyLoaded:
meshroom.core.initNodes()
with open(path) as jsonFile:
fileData = json.load(jsonFile)
try:
graphData = fileData.get(GraphIO.Keys.Graph, fileData)
if not isinstance(graphData, dict):
return False
header = fileData.get(GraphIO.Keys.Header, {})
if not header.get("template", False):
return False
nodesVersions = header.get(GraphIO.Keys.NodesVersions, {})
for _, nodeData in graphData.items():
nodeType = nodeData["nodeType"]
if not nodeType in meshroom.core.nodesDesc:
return False
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
if compatibilityIssue is not None:
print("{} in {} for node {}".format(compatibilityIssue, path, nodeType))
return False
return True
finally:
if not nodesAlreadyLoaded:
nodeTypes = [nodeType for _, nodeType in meshroom.core.nodesDesc.items()]
for nodeType in nodeTypes:
unregisterNodeType(nodeType)
def checkAllTemplatesVersions() -> bool:
meshroom.core.initNodes()
meshroom.core.initPipelines()
validVersions = []
for _, path in pipelineTemplates.items():
validVersions.append(checkTemplateVersions(path, nodesAlreadyLoaded=True))
return all(validVersions)