[core] plugins: Simplify the types of ProcessEnv objects

Instead of a distinguishing the type of `DirTreeProcessEnv`, simply
use it whenever the process environment differs from rez.
This commit is contained in:
Candice Bentéjac 2025-06-12 16:43:33 +02:00
parent 09e086eea9
commit 3e6948d8e3
2 changed files with 12 additions and 38 deletions

View file

@ -429,7 +429,6 @@ def initPlugins():
for f in pluginsFolders: for f in pluginsFolders:
plugins = loadPluginFolder(folder=f) plugins = loadPluginFolder(folder=f)
# Set the ProcessEnv for each plugin # Set the ProcessEnv for each plugin
# TODO: make the distinction between default, conda, and venv plugins from the get-go
if plugins: if plugins:
for plugin in plugins: for plugin in plugins:
plugin.processEnv = processEnvFactory(f) plugin.processEnv = processEnvFactory(f)

View file

@ -49,9 +49,7 @@ def validateNodeDesc(nodeDesc: desc.Node) -> list:
class ProcessEnvType(Enum): class ProcessEnvType(Enum):
""" Supported process environments. """ """ Supported process environments. """
DEFAULT = "default", DIRTREE = "dirtree",
CONDA = "conda",
VIRTUALENV = "virtualenv",
REZ = "rez" REZ = "rez"
@ -65,11 +63,11 @@ class ProcessEnv(BaseObject):
uri: (optional) the Unique Resource Identifier to activate the environment. uri: (optional) the Unique Resource Identifier to activate the environment.
""" """
def __init__(self, folder: str, envType: ProcessEnvType = ProcessEnvType.DEFAULT): def __init__(self, folder: str, envType: ProcessEnvType = ProcessEnvType.DIRTREE, uri: str = ""):
super().__init__() super().__init__()
self._folder = folder self._folder: str = folder
self._processEnvType: ProcessEnvType = envType self._processEnvType: ProcessEnvType = envType
self.uri = "" self.uri: str = uri
def getEnvDict(self) -> dict: def getEnvDict(self) -> dict:
""" Return the environment dictionary if it has been modified, None otherwise. """ """ Return the environment dictionary if it has been modified, None otherwise. """
@ -87,15 +85,9 @@ class ProcessEnv(BaseObject):
class DirTreeProcessEnv(ProcessEnv): class DirTreeProcessEnv(ProcessEnv):
""" """
""" """
def __init__(self, folder: str, envType: ProcessEnvType = ProcessEnvType.DEFAULT, uri: str = ""): def __init__(self, folder: str):
if envType == ProcessEnvType.REZ: super().__init__(folder, ProcessEnvType.DIRTREE)
raise RuntimeError("Wrong process environment type.")
if not uri and envType != ProcessEnvType.DEFAULT:
raise RuntimeError("URI should be provided for the process environment.")
super().__init__(folder, envType)
self.uri = uri
self.binPaths: list = [str(Path(folder, "bin"))] self.binPaths: list = [str(Path(folder, "bin"))]
self.libPaths: list = [str(Path(folder, "lib")), str(Path(folder, "lib64"))] self.libPaths: list = [str(Path(folder, "lib")), str(Path(folder, "lib64"))]
self.pythonPaths: list = [str(Path(folder))] + self.binPaths self.pythonPaths: list = [str(Path(folder))] + self.binPaths
@ -105,31 +97,18 @@ class DirTreeProcessEnv(ProcessEnv):
env["PYTHONPATH"] = f"{_MESHROOM_ROOT}{os.pathsep}{os.pathsep.join(self.pythonPaths)}{os.pathsep}{os.getenv('PYTHONPATH', '')}" env["PYTHONPATH"] = f"{_MESHROOM_ROOT}{os.pathsep}{os.pathsep.join(self.pythonPaths)}{os.pathsep}{os.getenv('PYTHONPATH', '')}"
env["LD_LIBRARY_PATH"] = f"{os.pathsep.join(self.libPaths)}{os.pathsep}{os.getenv('LD_LIBRARY_PATH', '')}" env["LD_LIBRARY_PATH"] = f"{os.pathsep.join(self.libPaths)}{os.pathsep}{os.getenv('LD_LIBRARY_PATH', '')}"
env["PATH"] = f"{os.pathsep.join(self.binPaths)}{os.pathsep}{os.getenv('PATH', '')}" env["PATH"] = f"{os.pathsep.join(self.binPaths)}{os.pathsep}{os.getenv('PATH', '')}"
# env["PYTHONPATH"] = f"{_MESHROOM_ROOT}{os.pathsep}{os.pathsep.join(self.pythonPaths)}"
# env["LD_LIBRARY_PATH"] = f"{os.pathsep.join(self.libPaths)}"
# env["PATH"] = f"{os.pathsep.join(self.binPaths)}"
return env return env
def getCommandPrefix(self) -> str:
if self._processEnvType == ProcessEnvType.CONDA:
return f"conda run -n {self.uri} "
if self._processEnvType == ProcessEnvType.VIRTUALENV:
return f"{self.uri}/bin/python "
return super().getCommandPrefix()
class RezProcessEnv(ProcessEnv): class RezProcessEnv(ProcessEnv):
""" """
""" """
def __init__(self, folder: str, envType: ProcessEnvType = ProcessEnvType.REZ, uri: str = ""): def __init__(self, folder: str, uri: str = ""):
if envType != ProcessEnvType.REZ:
raise RuntimeError("Wrong process environment type.")
if not uri: if not uri:
raise RuntimeError("Wrong URI for Rez environment process.") raise RuntimeError("Missing name of the Rez environment needs to be provided.")
super().__init__(folder, ProcessEnvType.REZ, uri)
super().__init__(folder, envType)
self.uri = uri
def getEnvDict(self): def getEnvDict(self):
env = os.environ.copy() env = os.environ.copy()
@ -144,14 +123,10 @@ class RezProcessEnv(ProcessEnv):
return "'" return "'"
def processEnvFactory(folder: str, envType: str = "default", uri: str = "") -> ProcessEnv: def processEnvFactory(folder: str, envType: str = "dirtree", uri: str = "") -> ProcessEnv:
if envType == "default": if envType == "dirtree":
return DirTreeProcessEnv(folder) return DirTreeProcessEnv(folder)
if envType == "conda": return RezProcessEnv(folder, uri=uri)
return DirTreeProcessEnv(folder, ProcessEnvType.CONDA, uri)
if envType == "virtualenv":
return DirTreeProcessEnv(folder, ProcessEnvType.VIRTUALENV, uri)
return RezProcessEnv(folder, ProcessEnvType.REZ, uri)
class NodePluginStatus(Enum): class NodePluginStatus(Enum):