Use EnvVar for loading nodes, pipeline templates and submitters

This commit is contained in:
Fabien Castan 2025-03-23 23:56:19 +01:00
parent 3f69724788
commit 1c9c027b00
2 changed files with 47 additions and 22 deletions

View file

@ -19,8 +19,10 @@ except Exception:
pass
from meshroom.core.submitter import BaseSubmitter
from meshroom.env import EnvVar, meshroomFolder
from . import desc
# Setup logging
logging.basicConfig(format='[%(asctime)s][%(levelname)s] %(message)s', level=logging.INFO)
@ -55,7 +57,6 @@ def add_to_path(p):
def loadPlugins(folder, packageName, classType):
"""
"""
pluginTypes = []
errors = []
@ -296,7 +297,7 @@ def registerNodeType(nodeType):
"""
global nodesDesc
if nodeType.__name__ in nodesDesc:
logging.error("Node Desc {} is already registered.".format(nodeType.__name__))
logging.error(f"Node Desc {nodeType.__name__} is already registered.")
nodesDesc[nodeType.__name__] = nodeType
@ -308,7 +309,11 @@ def unregisterNodeType(nodeType):
def loadNodes(folder, packageName):
return loadPlugins(folder, packageName, desc.Node)
if not os.path.isdir(folder):
logging.error("Node folder '{folder}' does not exist.")
return
return loadPlugins(folder, packageName, desc.BaseNode)
def loadAllNodes(folder):
@ -318,51 +323,56 @@ def loadAllNodes(folder):
nodeTypes = loadNodes(folder, package)
for nodeType in nodeTypes:
registerNodeType(nodeType)
logging.debug('Nodes loaded [{}]: {}'.format(package, ', '.join([nodeType.__name__ for nodeType in nodeTypes])))
nodesStr = ', '.join([nodeType.__name__ for nodeType in nodeTypes])
logging.debug(f'Nodes loaded [{package}]: {nodesStr}')
def registerSubmitter(s):
global submitters
if s.name in submitters:
logging.error("Submitter {} is already registered.".format(s.name))
logging.error(f"Submitter {s.name} is already registered.")
submitters[s.name] = s
def loadSubmitters(folder, packageName):
if not os.path.isdir(folder):
logging.error(f"Submitters folder '{folder}' does not exist.")
return
return loadPlugins(folder, packageName, BaseSubmitter)
def loadPipelineTemplates(folder):
global pipelineTemplates
if not os.path.isdir(folder):
logging.error(f"Pipeline templates folder '{folder}' does not exist.")
return
for file in os.listdir(folder):
if file.endswith(".mg") and file not in pipelineTemplates:
pipelineTemplates[os.path.splitext(file)[0]] = os.path.join(folder, file)
def initNodes():
meshroomFolder = os.path.dirname(os.path.dirname(__file__))
additionalNodesPath = os.environ.get("MESHROOM_NODES_PATH", "").split(os.pathsep)
# filter empty strings
additionalNodesPath = [i for i in additionalNodesPath if i]
additionalNodesPath = EnvVar.getList(EnvVar.MESHROOM_NODES_PATH)
nodesFolders = [os.path.join(meshroomFolder, 'nodes')] + additionalNodesPath
for f in nodesFolders:
loadAllNodes(folder=f)
def initSubmitters():
meshroomFolder = os.path.dirname(os.path.dirname(__file__))
subs = loadSubmitters(os.environ.get("MESHROOM_SUBMITTERS_PATH", meshroomFolder), 'submitters')
for sub in subs:
registerSubmitter(sub())
additionalPaths = EnvVar.getList(EnvVar.MESHROOM_SUBMITTERS_PATH)
allSubmittersFolders = [meshroomFolder] + additionalPaths
for folder in allSubmittersFolders:
subs = loadSubmitters(folder, 'submitters')
for sub in subs:
registerSubmitter(sub())
def initPipelines():
meshroomFolder = os.path.dirname(os.path.dirname(__file__))
# Load pipeline templates: check in any folder the user might have added to the environment variable
pipelinesPath = os.environ.get("MESHROOM_PIPELINE_TEMPLATES_PATH", "").split(os.pathsep)
pipelineTemplatesFolders = [i for i in pipelinesPath if i]
# Load pipeline templates: check in the default folder and any folder the user might have
# added to the environment variable
additionalPipelinesPath = EnvVar.getList(EnvVar.MESHROOM_PIPELINE_TEMPLATES_PATH)
pipelineTemplatesFolders = [os.path.join(meshroomFolder, 'pipelines')] + additionalPipelinesPath
for f in pipelineTemplatesFolders:
if os.path.isdir(f):
loadPipelineTemplates(f)
else:
logging.warning("Pipeline templates folder '{}' does not exist.".format(f))
loadPipelineTemplates(f)

View file

@ -15,6 +15,8 @@ import sys
from typing import Any, Type
meshroomFolder = os.path.dirname(__file__)
@dataclass
class VarDefinition:
"""Environment variable definition."""
@ -39,18 +41,31 @@ class EnvVar(Enum):
str, "port:3768", "QML debugging params as expected by -qmljsdebugger"
)
# Core
MESHROOM_PLUGINS_PATH = VarDefinition(str, "", "Paths to plugins folders")
MESHROOM_NODES_PATH = VarDefinition(str, "", "Paths to set of nodes folders")
MESHROOM_SUBMITTERS_PATH = VarDefinition(str, "", "Paths to set of submitters folders")
MESHROOM_PIPELINE_TEMPLATES_PATH = VarDefinition(str, "", "Paths to pipeline templates folders")
@staticmethod
def get(envVar: "EnvVar") -> Any:
"""Get the value of `envVar`, cast to the variable type."""
value = os.environ.get(envVar.name, envVar.value.default)
return EnvVar._cast(value, envVar.value.valueType)
@staticmethod
def getList(envVar: "EnvVar") -> list[Any]:
"""Get the value of `envVar` as a list of non-empty strings."""
paths = EnvVar.get(envVar).split(os.pathsep)
# filter empty values
return [p for p in paths if p]
@staticmethod
def _cast(value: str, valueType: Type) -> Any:
if valueType is str:
return value
elif valueType is bool:
return value.lower() in {"true", "1", "on"}
return value.lower() in {"true", "1", "on", "yes", "y"}
return valueType(value)
@classmethod