Meshroom/meshroom/env.py
Fabien Castan db8fd02aeb New plugins load
MESHROOM_PLUGINS_PATH can be used to automatically load nodes and
pipelines from a folder structure.
2025-04-13 13:09:24 +02:00

85 lines
2.7 KiB
Python

"""
Meshroom environment variable management.
"""
__all__ = [
"EnvVar",
"EnvVarHelpAction",
]
import argparse
import os
from dataclasses import dataclass
from enum import Enum
import sys
from typing import Any, Type
meshroomFolder = os.path.dirname(__file__)
@dataclass
class VarDefinition:
"""Environment variable definition."""
# The type to cast the value to.
valueType: Type
# Default value if the variable is not set in the environment.
default: str
# Description of the purpose of the variable.
description: str = ""
def __str__(self) -> str:
return f"{self.description} ({self.valueType.__name__}, default: '{self.default}')"
class EnvVar(Enum):
"""Meshroom environment variables catalog."""
# UI - Debug
MESHROOM_QML_DEBUG = VarDefinition(bool, "False", "Enable QML debugging")
MESHROOM_QML_DEBUG_PARAMS = VarDefinition(
str, "port:3768", "QML debugging params as expected by -qmljsdebugger"
)
# Core
MESHROOM_PLUGINS_PATH = VarDefinition(str, "", "Paths to plugins folders containing nodes, submitters and pipeline templates")
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 et of 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", "yes", "y"}
return valueType(value)
@classmethod
def help(cls) -> str:
"""Return a formatted string with the details of each environment variables."""
return "\n".join([f"{var.name}: {var.value}" for var in cls])
class EnvVarHelpAction(argparse.Action):
"""Argparse action for printing Meshroom environment variables help and exit."""
DEFAULT_HELP = "Print Meshroom environment variables help and exit."
def __call__(self, parser, namespace, value, option_string=None):
print("Meshroom environment variables:")
print(EnvVar.help())
sys.exit(0)