4
0
mirror of https://github.com/nerfstudio-project/nerfstudio.git synced 2026-11-10 18:17:31 +08:00
nerfstudio/tests/plugins/test_registry.py

174 lines
6.1 KiB
Python

"""
Tests for the nerfstudio.plugins.registry module.
"""
import os
import sys
from dataclasses import dataclass, field
from nerfstudio.engine.trainer import TrainerConfig
from nerfstudio.pipelines.base_pipeline import VanillaPipelineConfig
from nerfstudio.plugins import registry, registry_dataparser
from nerfstudio.plugins.registry_dataparser import DataParserConfig, DataParserSpecification, discover_dataparsers
from nerfstudio.plugins.types import MethodSpecification
if sys.version_info < (3, 10):
import importlib_metadata
else:
from importlib import metadata as importlib_metadata
@dataclass
class TestConfigClass(MethodSpecification):
config: TrainerConfig = TrainerConfig(
method_name="test-method",
pipeline=VanillaPipelineConfig(),
optimizers={},
)
description: str = "Test description"
def TestConfigFunc():
return TestConfigClass()
TestConfig = TestConfigClass()
def test_discover_methods():
"""Tests if a custom method gets properly registered using the discover_methods method"""
entry_points_backup = registry.entry_points
def entry_points(group=None):
return importlib_metadata.EntryPoints(
[
importlib_metadata.EntryPoint(
name="test", value="test_registry:TestConfig", group="nerfstudio.method_configs"
)
]
).select(group=group)
try:
# Mock importlib entry_points
registry.entry_points = entry_points
# Discover plugins
methods, _ = registry.discover_methods()
assert "test-method" in methods
config = methods["test-method"]
assert isinstance(config, TrainerConfig)
finally:
# Revert mock
registry.entry_points = entry_points_backup
def _test_discover_methods_from_environment_variable(method):
"""Tests if a custom method from env variable gets properly registered using the discover_methods method"""
old_env = None
try:
old_env = os.environ.get("NERFSTUDIO_METHOD_CONFIGS", None)
method_key = f"{method}-env"
os.environ["NERFSTUDIO_METHOD_CONFIGS"] = f"{method_key}=test_registry:{method}"
# Discover plugins
methods, _ = registry.discover_methods()
assert method_key in methods
config = methods[method_key]
assert isinstance(config, TrainerConfig)
finally:
# Revert mock
if old_env is not None:
os.environ["NERFSTUDIO_METHOD_CONFIGS"] = old_env
else:
del os.environ["NERFSTUDIO_METHOD_CONFIGS"]
def test_discover_methods_from_environment_variable_class():
"""Tests if a custom method class from env variable gets properly registered using the discover_methods method"""
_test_discover_methods_from_environment_variable("TestConfigClass")
def test_discover_methods_from_environment_variable_function():
"""Tests if a custom method function from env variable gets properly registered using the discover_methods method"""
_test_discover_methods_from_environment_variable("TestConfigFunc")
def test_discover_methods_from_environment_variable_instance():
"""Tests if a custom method instance from env variable gets properly registered using the discover_methods method"""
_test_discover_methods_from_environment_variable("TestConfig")
@dataclass
class TestDataparserConfigClass(DataParserSpecification):
config: DataParserConfig = field(default_factory=DataParserConfig)
description: str = "Test description"
def TestDataparserConfigFunc():
return TestDataparserConfigClass()
TestDataparserConfig = TestDataparserConfigClass()
def test_discover_dataparser():
"""Tests if a custom method gets properly registered using the discover_dataparsers method"""
entry_points_backup = registry_dataparser.entry_points
def entry_points(group=None):
return importlib_metadata.EntryPoints(
[
importlib_metadata.EntryPoint(
name="test", value="test_registry:TestDataparserConfig", group="nerfstudio.dataparser_configs"
)
]
).select(group=group)
try:
# Mock importlib entry_points
registry_dataparser.entry_points = entry_points
# Discover plugins
dataparsers, _ = discover_dataparsers()
assert "test" in dataparsers
config = dataparsers["test"]
assert isinstance(config, DataParserConfig)
finally:
# Revert mock
registry_dataparser.entry_points = entry_points_backup
def _test_discover_dataparsers_from_environment_variable(method):
"""Tests if a custom method from env variable gets properly registered using the discover_dataparsers method"""
old_env = None
try:
old_env = os.environ.get("NERFSTUDIO_DATAPARSER_CONFIGS", None)
method_key = f"{method}-env"
os.environ["NERFSTUDIO_DATAPARSER_CONFIGS"] = f"{method_key}=test_registry:{method}"
# Discover plugins
dataparsers, _ = discover_dataparsers()
assert method_key in dataparsers
config = dataparsers[method_key]
assert isinstance(config, DataParserConfig)
finally:
# Revert mock
if old_env is not None:
os.environ["NERFSTUDIO_DATAPARSER_CONFIGS"] = old_env
else:
del os.environ["NERFSTUDIO_DATAPARSER_CONFIGS"]
def test_discover_dataparsers_from_environment_variable_class():
"""Tests if a custom dataparser class from env variable gets properly registered using the discover_methods method"""
_test_discover_dataparsers_from_environment_variable("TestDataparserConfigClass")
def test_discover_dataparsers_from_environment_variable_function():
"""Tests if a custom dataparser function from env variable gets properly registered using the discover_methods method"""
_test_discover_dataparsers_from_environment_variable("TestDataparserConfigFunc")
def test_discover_dataparsers_from_environment_variable_instance():
"""Tests if a custom dataparser instance from env variable gets properly registered using the discover_methods method"""
_test_discover_dataparsers_from_environment_variable("TestDataparserConfig")