idea172-bevault-verifiable-.../idea172_bevault_verifiable_.../registry.py

75 lines
2.6 KiB
Python

"""Graph-of-Contracts (GoC) registry."""
from __future__ import annotations
from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional
from .adapters.broker import BrokerAdapter
from .adapters.price_feed import PriceFeedAdapter
from .core import HedgeDelta
@dataclass
class GoCRegistry:
"""Registry for adapters and data contracts."""
adapters: Dict[str, object] = field(default_factory=dict)
contracts: Dict[str, str] = field(default_factory=dict)
metadata: Dict[str, Any] = field(default_factory=dict)
def __post_init__(self):
# Initialize to an empty mapping if not provided
if self.adapters is None:
self.adapters = {}
def register_adapter(self, adapter) -> None:
self.adapters[adapter.name] = adapter
def get_adapter(self, name: str) -> Optional[object]:
return self.adapters.get(name)
def register_contract(self, name: str, version: str) -> None:
self.contracts[name] = version
def get_contract(self, name: str) -> Optional[str]:
return self.contracts.get(name)
def conformance_report(self, adapter_name: str) -> Dict[str, Any]:
adapter = self.get_adapter(adapter_name)
if adapter is None:
return {"adapter": adapter_name, "registered": False, "conforms": False}
required_methods: List[str] = []
if isinstance(adapter, PriceFeedAdapter):
required_methods = ["generate_signal", "conformance_contract"]
elif isinstance(adapter, BrokerAdapter):
required_methods = ["send_delta", "conformance_contract"]
missing = [method for method in required_methods if not hasattr(adapter, method)]
return {
"adapter": adapter_name,
"registered": True,
"conforms": not missing,
"missing": missing,
"contract": getattr(adapter, "conformance_contract", lambda: None)(),
}
class GraphOfContracts:
"""Catalog for contract versions and replay metadata."""
def __init__(self) -> None:
self.contracts: Dict[str, Dict[str, Any]] = {}
def register_contract(self, name: str, version: str, schema: Optional[Dict[str, Any]] = None) -> None:
self.contracts[name] = {"version": version, "schema": schema or {}}
def get_contract(self, name: str) -> Optional[Dict[str, Any]]:
return self.contracts.get(name)
def list_contracts(self):
return list(self.contracts.items())
def to_dict(self) -> Dict[str, Dict[str, Any]]:
return dict(self.contracts)
__all__ = ["GoCRegistry", "GraphOfContracts"]