catopt-graph-graph-calculus.../core/graph_of_contracts.py

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, {})