Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-governance/src/lexigram/ai/governance/relay_ledger/di.py: 52%

27 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 07:19 +0800

1"""DI wiring for the governance relay ledger service. 

2 

3Nothing is bound when governance is disabled. The SQL ledger store 

4and service are built and bound during :func:`boot_relay_ledger` once 

5the database contract is resolvable. 

6""" 

7 

8from __future__ import annotations 

9 

10from lexigram.ai.governance.config import GovernanceConfig 

11from lexigram.ai.governance.relay_ledger import ( 

12 RelayLedgerService, 

13 SqlRelayLedgerStore, 

14) 

15from lexigram.contracts.ai.relay import RelayLedgerServiceProtocol 

16from lexigram.contracts.core.di import BootContainerProtocol 

17from lexigram.contracts.data import DatabaseProviderProtocol 

18from lexigram.logging import get_logger 

19 

20logger = get_logger(__name__) 

21 

22__all__ = ["boot_relay_ledger", "register_relay_ledger"] 

23 

24 

25def register_relay_ledger( 

26 container: object, 

27 config: object, 

28) -> None: 

29 """Register relay ledger services. 

30 

31 Args: 

32 container: The container registrar to bind into. 

33 config: Governance configuration; ``enabled`` gates the service. 

34 """ 

35 del container 

36 if not isinstance(config, GovernanceConfig) or not config.enabled: 

37 logger.info("relay_ledger_disabled", reason="governance disabled") 

38 return 

39 logger.info("relay_ledger_registered") 

40 

41 

42async def boot_relay_ledger( 

43 container: BootContainerProtocol, 

44 config: object, 

45) -> None: 

46 """Build the ledger store and service and bind the service contract. 

47 

48 Args: 

49 container: The boot container used to resolve contracts. 

50 config: Governance configuration driving the bootstrap. 

51 """ 

52 if not isinstance(config, GovernanceConfig) or not config.enabled: 

53 logger.info("relay_ledger_boot_skipped", reason="governance disabled") 

54 return 

55 

56 database = await container.resolve_optional(DatabaseProviderProtocol) 

57 if database is None: 

58 logger.warning( 

59 "relay_ledger_missing_dependency", 

60 missing="DatabaseProviderProtocol", 

61 ) 

62 return 

63 

64 store = SqlRelayLedgerStore(database) 

65 service = RelayLedgerService(store=store) 

66 container.singleton(RelayLedgerServiceProtocol, service) 

67 logger.info("relay_ledger_booted", store="SqlRelayLedgerStore")