from contextlib import contextmanager
from unittest.mock import patch
from typing import Type

import meshroom
from meshroom.core import registerNodeType, unregisterNodeType
from meshroom.core import desc

@contextmanager
def registeredNodeTypes(nodeTypes: list[Type[desc.Node]]):
    for nodeType in nodeTypes:
        registerNodeType(nodeType)

    yield

    for nodeType in nodeTypes:
        unregisterNodeType(nodeType)

@contextmanager
def overrideNodeTypeVersion(nodeType: Type[desc.Node], version: str):
    """Helper context manager to override the version of a given node type."""
    unpatchedFunc = meshroom.core.nodeVersion
    with patch.object(
        meshroom.core,
        "nodeVersion",
        side_effect=lambda type: version if type is nodeType else unpatchedFunc(type),
    ):
        yield