Source code for tidy3d.config.registry
"""Registry utilities for tidy3d configuration sections and handlers."""
from __future__ import annotations
from typing import Callable, Optional, TypeVar
from pydantic import BaseModel
T = TypeVar("T", bound=BaseModel)
_SECTIONS: dict[str, type[BaseModel]] = {}
_HANDLERS: dict[str, Callable[[BaseModel], None]] = {}
_MANAGER: Optional[ConfigManagerProtocol] = None
class ConfigManagerProtocol:
"""Protocol-like interface for manager notifications."""
def on_section_registered(self, section: str) -> None:
"""Called when a new section schema is registered."""
def on_handler_registered(self, section: str) -> None:
"""Called when a handler is registered."""
def attach_manager(manager: ConfigManagerProtocol) -> None:
"""Attach the active configuration manager for registry callbacks."""
global _MANAGER
_MANAGER = manager
def get_manager() -> Optional[ConfigManagerProtocol]:
"""Return the currently attached configuration manager, if any."""
return _MANAGER
[docs]
def register_section(name: str) -> Callable[[type[T]], type[T]]:
"""Decorator to register a configuration section schema."""
def decorator(cls: type[T]) -> type[T]:
_SECTIONS[name] = cls
if _MANAGER is not None:
_MANAGER.on_section_registered(name)
return cls
return decorator
[docs]
def register_plugin(name: str) -> Callable[[type[T]], type[T]]:
"""Decorator to register a plugin configuration schema."""
return register_section(f"plugins.{name}")
[docs]
def register_handler(
name: str,
) -> Callable[[Callable[[BaseModel], None]], Callable[[BaseModel], None]]:
"""Decorator to register a handler for a configuration section."""
def decorator(func: Callable[[BaseModel], None]) -> Callable[[BaseModel], None]:
_HANDLERS[name] = func
if _MANAGER is not None:
_MANAGER.on_handler_registered(name)
return func
return decorator
[docs]
def get_sections() -> dict[str, type[BaseModel]]:
"""Return registered section schemas."""
return dict(_SECTIONS)
[docs]
def get_handlers() -> dict[str, Callable[[BaseModel], None]]:
"""Return registered configuration handlers."""
return dict(_HANDLERS)