from__future__importannotations"""Bootstrap helpers for the canonical manager-first service wiring."""fromtangl.configimportsettingsfromtangl.persistenceimportPersistenceManager,PersistenceManagerFactoryfrom.exceptionsimportValidationErrorfrom.remote_service_managerimportRemoteServiceManagerfrom.service_managerimportServiceManager
[docs]defbuild_service_manager(persistence_manager:PersistenceManager|None=None,*,backend:str|None=None,api_url:str|None=None,api_key:str|None=None,secret:str|None=None,timeout_s:float|None=None,)->ServiceManager:"""Build the canonical explicit service manager."""configured_backend=backendorgetattr(getattr(settings.service,"manager",None),"backend","local",)normalized_backend=str(configured_backend).strip().lower()ifnormalized_backend=="remote":remote_settings=getattr(settings.service,"remote",None)resolved_api_url=api_urlifresolved_api_urlisNoneandremote_settingsisnotNone:resolved_api_url=getattr(remote_settings,"api_url",None)resolved_api_key=api_keyifresolved_api_keyisNoneandremote_settingsisnotNone:resolved_api_key=getattr(remote_settings,"api_key",None)resolved_secret=secretifresolved_secretisNoneandremote_settingsisnotNone:resolved_secret=getattr(remote_settings,"secret",None)resolved_timeout=timeout_sifresolved_timeoutisNoneandremote_settingsisnotNone:resolved_timeout=getattr(remote_settings,"timeout_s",5.0)ifresolved_api_urlisNoneornotstr(resolved_api_url).strip():raiseValidationError("Remote service manager requires service.remote.api_url")returnRemoteServiceManager(str(resolved_api_url),persistence_manager=persistence_manager,api_key=str(resolved_api_key)ifresolved_api_keyisnotNoneelseNone,secret=str(resolved_secret)ifresolved_secretisnotNoneelseNone,timeout_s=float(resolved_timeout)ifresolved_timeoutisnotNoneelse5.0,)ifnormalized_backend!="local":raiseValidationError(f"Unknown service manager backend: {configured_backend}")ifpersistence_managerisNone:persistence_manager=PersistenceManagerFactory.create_persistence_manager()returnServiceManager(persistence_manager)