Coverage for src / lexigram / contracts / exceptions / idempotency.py: 0%

16 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-15 18:57 +0800

1"""Exception hierarchy for idempotency support.""" 

2 

3from __future__ import annotations 

4 

5from lexigram.contracts.exceptions.base import LexigramError 

6 

7 

8class IdempotencyError(LexigramError): 

9 """Base exception for idempotency flows.""" 

10 

11 _code: str = "LEX_ERR_IDEM_001" 

12 

13 

14class DuplicateRequestError(IdempotencyError): 

15 """Raised when an idempotent key is reused before completion.""" 

16 

17 _code: str = "LEX_ERR_IDEM_002" 

18 

19 def __init__(self, key: str, message: str | None = None) -> None: 

20 detail = message or f"Duplicate idempotency key: {key}" 

21 super().__init__(detail) 

22 self.key = key 

23 self.message = detail 

24 

25 

26class IdempotencyStoreError(IdempotencyError): 

27 """Raised on unexpected failures inside the idempotency store.""" 

28 

29 _code: str = "LEX_ERR_IDEM_003" 

30 

31 

32class IdempotencyConflictError(IdempotencyError): 

33 """Raised when an idempotency key is already claimed (PENDING).""" 

34 

35 _code: str = "LEX_ERR_IDEM_004" 

36 

37 

38__all__ = [ 

39 "DuplicateRequestError", 

40 "IdempotencyConflictError", 

41 "IdempotencyError", 

42 "IdempotencyStoreError", 

43]