Volver a la wiki

Servicio Adapter Registry — Factory de resolución de adapters por vendor

Descripción

Registry centralizado que mapea un slug de vendor a la clase de adapter correspondiente. Resuelve la instancia correcta del adapter para un player digital signage, en función de su fabricante registrado.

Ubicación: signage/services/adapters/registry.py
Funciones públicas:

Historia de cambios (Hito B)

Antes (fallback silencioso)

Ahora (fallback explícito → ValueError)

Firma pública

def get_adapter(
    slug: str, 
    ip: str, 
    credentials: dict, 
    adapter_config: dict
) -> SignageDeviceAdapter:
    """
    Resolver el adapter correcto por slug de vendor.
    
    Raises:
        ValueError: Si el slug no está registrado.
    """
    ...

def supports_real_push(slug: str) -> bool:
    """
    Retorna True si el vendor tiene un adapter que implementa push real.
    Monitor-only vendors y generic_snmp retornan False.
    """
    ...

def register_adapter(
    slug: str, 
    adapter_cls: type[SignageDeviceAdapter]
) -> None:
    """Registrar un adapter para un vendor slug (extensibilidad)."""
    ...

Mapeo de registros

Real-push adapters (7)

spinetix      → SpinetiXAdapter
brightsign    → BrightSignAdapter
samsung       → SamsungAdapter
lg            → LGAdapter
yodeck        → YodeckAdapter
signagelive   → SignageliveAdapter
iadea         → IAdeaAdapter

Monitor-only vendors (5)

crestron      → GenericSNMPAdapter (SNMP status, no push)
philips       → GenericSNMPAdapter (SNMP status, no push)
barco         → GenericSNMPAdapter (SNMP status, no push)
christie      → GenericSNMPAdapter (SNMP status, no push)
nec_sharp     → GenericSNMPAdapter (SNMP status, no push)

Genéricos

generic_snmp  → GenericSNMPAdapter (fallback explícito)

Constantes internas

_PUSH_SLUGS = frozenset({
    "spinetix", "brightsign", "samsung", "lg", 
    "yodeck", "signagelive", "iadea"
})

_MONITOR_ONLY_SLUGS = frozenset({
    "crestron", "philips", "barco", "christie", "nec_sharp"
})

_REGISTRY: dict[str, type[SignageDeviceAdapter]] = {}

Flujo de get_adapter()

  1. Lazy load: Carga el registro en memoria la primera vez (si no está ya cargado).
  2. Lookup: Busca slug en _REGISTRY.
  3. No encontrado:
    • Antes (fallback): Resolvía a GenericSNMP silenciosamente.
    • Ahora: Lanza ValueError(f"No signage adapter registered for slug '{slug}'. Known slugs: {sorted(_REGISTRY)}").
  4. Encontrado: Instancia adapter_cls(ip, credentials, adapter_config) y retorna.

Flujo de supports_real_push(slug)

  1. Verifica si slug in _PUSH_SLUGS.
  2. Retorna True o False.
  3. Usado por signage/api/players.py para derivar el campo push_implemented en la respuesta de list_adapters().

Impacto en call-sites

Los 4 call-sites que usan get_adapter() ya capturan ValueError:

Call-siteUbicaciónManejo
Deploy Hueysignage/services/deployment_worker.pyTry/except, degrada a noop
Proof-of-play collectorsignage/services/proof_of_play.pyTry/except, logea error
Screenshot takersignage/services/screenshot_worker.pyTry/except, retorna None
Reboot handlersignage/api/display_control.pyTry/except, retorna error

→ Todos ellos ya esperaban que get_adapter() podía fallar y lo manejan gracefully.

Véase también

Subir