Spaces:
Runtime error
Runtime error
| """Backend registry for garment detectors.""" | |
| import logging | |
| from typing import Type | |
| from ._types import DetectorBackend | |
| logger = logging.getLogger(__name__) | |
| _BACKENDS: dict[str, Type[DetectorBackend]] = {} | |
| _INSTANCES: dict[str, DetectorBackend] = {} | |
| def register(name: str): | |
| """Decorator to register a detector backend class.""" | |
| def decorator(cls: Type[DetectorBackend]): | |
| _BACKENDS[name] = cls | |
| return cls | |
| return decorator | |
| def get_backend(name: str) -> DetectorBackend: | |
| """Get a backend instance by name (lazy-instantiated singleton).""" | |
| if name not in _BACKENDS: | |
| available = list_available() | |
| raise ValueError( | |
| f"Unknown detector backend: '{name}'. " | |
| f"Available: {available}" | |
| ) | |
| if name not in _INSTANCES: | |
| _INSTANCES[name] = _BACKENDS[name]() | |
| return _INSTANCES[name] | |
| def list_registered() -> list[str]: | |
| """List all registered backend names (even if deps are missing).""" | |
| return list(_BACKENDS.keys()) | |
| def list_available() -> list[tuple[str, str]]: | |
| """List backends whose dependencies are installed. | |
| Returns (name, description) tuples for UI display. | |
| """ | |
| available = [] | |
| for name, cls in _BACKENDS.items(): | |
| try: | |
| instance = get_backend(name) | |
| if instance.is_available(): | |
| available.append((instance.description, name)) | |
| except Exception as e: | |
| logger.debug("Backend '%s' not available: %s", name, e) | |
| return available | |