publish.py 1.1 KB

123456789101112131415161718192021222324252627
  1. from __future__ import annotations
  2. class ChangeSetStateMachine:
  3. _allowed = {
  4. "pending": {"diffed", "failed", "rolled_back"},
  5. "diffed": {"building", "failed", "rolled_back"},
  6. "building": {"validating", "failed", "rolled_back"},
  7. "validating": {"canonical_active", "failed", "rolled_back"},
  8. "canonical_active": {"projecting", "complete", "degraded", "rolled_back"},
  9. "projecting": {"complete", "degraded", "failed", "rolled_back"},
  10. "degraded": {"projecting", "complete", "rolled_back"},
  11. "failed": {"building", "rolled_back"},
  12. "complete": set(),
  13. "rolled_back": set(),
  14. }
  15. def transition(
  16. self, current: str, target: str, *, impact_truncated: bool = False
  17. ) -> str:
  18. if impact_truncated and target == "canonical_active":
  19. raise ValueError("truncated impact scope cannot become canonical active")
  20. if target not in self._allowed.get(current, set()):
  21. raise ValueError(
  22. f"invalid knowledge change-set transition: {current} -> {target}"
  23. )
  24. return target