29 lines
1.1 KiB
Python
29 lines
1.1 KiB
Python
"""Governance primitives for BeXProof policy changes."""
|
|
from __future__ import annotations
|
|
from typing import Dict, Set
|
|
|
|
|
|
class Governance:
|
|
def __init__(self, signers: Set[str] = None, required: int = 2):
|
|
self.signers = set(signers or {"alice", "bob", "carol"})
|
|
self.required = max(1, min(len(self.signers), required))
|
|
self.proposals: Dict[str, Dict] = {}
|
|
self.approvals: Dict[str, Set[str]] = {}
|
|
|
|
def propose(self, policy_id: str, policy_text: str) -> None:
|
|
self.proposals[policy_id] = {"policy": policy_text, "approved": False}
|
|
self.approvals[policy_id] = set()
|
|
|
|
def approve(self, policy_id: str, signer: str) -> bool:
|
|
if signer not in self.signers:
|
|
return False
|
|
if policy_id not in self.proposals:
|
|
return False
|
|
self.approvals[policy_id].add(signer)
|
|
if len(self.approvals[policy_id]) >= self.required:
|
|
self.proposals[policy_id]["approved"] = True
|
|
return True
|
|
|
|
def is_approved(self, policy_id: str) -> bool:
|
|
return bool(self.proposals.get(policy_id, {}).get("approved", False))
|