33 lines
1.3 KiB
Python
33 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Dict, Optional
|
|
|
|
from .contracts import ContractDefinition
|
|
|
|
|
|
class GraphOfContracts:
|
|
"""Lightweight registry graph mapping adapters to contract versions.
|
|
|
|
This is intentionally minimal: it stores per-adapter contracts organized by
|
|
contract name -> version -> ContractDefinition, enabling plug-and-play across
|
|
domain adapters while keeping a canonical reference per adapter.
|
|
"""
|
|
|
|
def __init__(self) -> None:
|
|
# adapter_name -> contract_name -> version -> ContractDefinition
|
|
self._graph: Dict[str, Dict[str, Dict[str, ContractDefinition]]] = {}
|
|
|
|
def register(self, adapter: str, contract_name: str, version: str, schema: Dict[str, object]) -> None:
|
|
self._graph.setdefault(adapter, {})
|
|
self._graph[adapter].setdefault(contract_name, {})[version] = ContractDefinition(
|
|
name=contract_name,
|
|
version=version,
|
|
schema=schema,
|
|
)
|
|
|
|
def get_contract(self, adapter: str, contract_name: str, version: str) -> Optional[ContractDefinition]:
|
|
return self._graph.get(adapter, {}).get(contract_name, {}).get(version)
|
|
|
|
def list_adapter_contracts(self, adapter: str) -> Dict[str, Dict[str, ContractDefinition]]:
|
|
return self._graph.get(adapter, {})
|