From cfa33b64428e5e3d930ca2a6b13f62d1daff5981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Candice=20Bent=C3=A9jac?= Date: Mon, 17 Mar 2025 16:58:28 +0100 Subject: [PATCH] [core] Add a `test.py` file that contains sanity methods used for validation For now, it contains methods allowing to check whether a template provided as an argument is valid (i.e. has no compatibility issue). It performs a check that's very similar to what `test_templatesVersions` was doing, but it allows this check to be performed from outside of Meshroom. --- meshroom/core/test.py | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 meshroom/core/test.py diff --git a/meshroom/core/test.py b/meshroom/core/test.py new file mode 100644 index 00000000..74cb2f5c --- /dev/null +++ b/meshroom/core/test.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# coding:utf-8 + +from meshroom.core import pipelineTemplates, Version +from meshroom.core.node import CompatibilityIssue, CompatibilityNode +from meshroom.core.graphIO import GraphIO + +import meshroom + +import json + +def checkTemplateVersions(path: str) -> bool: + """ Check whether there is a compatibility issue with the nodes saved in the template provided with "path". """ + meshroom.core.initNodes() + + with open(path) as jsonFile: + fileData = json.load(jsonFile) + + 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 + + +def checkAllTemplatesVersions() -> bool: + meshroom.core.initPipelines() + + validVersions = [] + for _, path in pipelineTemplates.items(): + validVersions.append(checkTemplateVersions(path)) + + return all(validVersions)