Source code for optiland.nonsequential.sources.registry

"""SourceRegistry for Non-Sequential Raytracing.

Kramer Harrison, 2026
"""

from __future__ import annotations

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from optiland.nonsequential.sources.base import BaseNSQSource


[docs] class SourceRegistry: """Named registry of NSQ sources. Attributes: _registry: Ordered dict mapping name -> BaseNSQSource. """ def __init__(self) -> None: """Initialize an empty SourceRegistry.""" self._registry: dict[str, BaseNSQSource] = {}
[docs] def add(self, name: str, source: BaseNSQSource) -> None: """Add a source. Args: name: Unique identifier. source: Source to register. Raises: KeyError: If a source with ``name`` already exists. """ if name in self._registry: raise KeyError(f"Source '{name}' is already registered.") self._registry[name] = source
[docs] def remove(self, name: str) -> None: """Remove a source by name. Args: name: Name of the source to remove. Raises: KeyError: If no source with ``name`` exists. """ if name not in self._registry: raise KeyError(f"Source '{name}' not found.") del self._registry[name]
[docs] def get(self, name: str) -> BaseNSQSource: """Retrieve a source by name. Args: name: Name of the source. Returns: The registered source. Raises: KeyError: If no source with ``name`` exists. """ if name not in self._registry: raise KeyError(f"Source '{name}' not found.") return self._registry[name]
def __contains__(self, name: str) -> bool: """Check whether a source name is registered.""" return name in self._registry @property def sources(self) -> list[BaseNSQSource]: """Ordered list of all registered sources.""" return list(self._registry.values())