Source code for cadrumo.adapters.persistence.profile._revision_guarded_singleton_mutation
"""Revision-guarded mutation mechanics shared by profile singleton kernels."""from__future__importannotationsfromcollections.abcimportCallablefromtypingimportProtocolfrom..storage.errorsimportSecureObjectRevisionConflictErrorclass_RevisionedSingletonLoader[DocumentT](Protocol):"""Load one singleton document together with its compare-and-swap revision."""def__call__(self)->tuple[DocumentT,str]:...class_RevisionedSingletonWrite[DocumentT,WriteT](Protocol):"""Build a write that asserts the revision read for a singleton document."""def__call__(self,document:DocumentT,*,expected_revision_id:str)->WriteT:...class_RevisionedSingletonSave[WriteT](Protocol):"""Persist one already revision-guarded singleton write."""def__call__(self,write:WriteT,/)->None:...
[docs]defmutate_revision_guarded_singleton[DocumentT,WriteT](mutation:Callable[[DocumentT],DocumentT],*,load_revisioned:_RevisionedSingletonLoader[DocumentT],write:_RevisionedSingletonWrite[DocumentT,WriteT],save:_RevisionedSingletonSave[WriteT],attempts:int,)->DocumentT:"""Apply a pure singleton mutation, retrying only revision conflicts. The caller keeps decoding and wire-format-specific write construction at its own boundary. This helper owns only the invariant shared by both singleton kernels: the write asserts the revision that the same attempt loaded. """last_conflict:SecureObjectRevisionConflictError|None=Nonefor_attemptinrange(attempts):current,revision_id=load_revisioned()updated=mutation(current)try:save(write(updated,expected_revision_id=revision_id))exceptSecureObjectRevisionConflictErrorasexc:last_conflict=exccontinuereturnupdatedraiselast_conflictiflast_conflictisnotNoneelseAssertionError("mutate exhausted without a conflict")