"""
A system for two phase updates: Update, and Commit.
"""
from dataclasses import dataclass
from ppb.systemslib import System
from ppb.eventlib import EventMixin
__all__ = 'Commit',
[docs]@dataclass
class Commit:
"""
Fired after Update.
"""
[docs]class TwoPhaseSystem(System):
"""
Produces the Commit event.
"""
def on_update(self, event, signal):
signal(Commit())
[docs]class TwoPhaseMixin(EventMixin):
"""
Mixin to apply to objects to handle two phase updates.
"""
__staged_changes = None
[docs] def stage_changes(self, **kwargs):
"""
Stage changes for the next commit.
These are just properties on the current object to update.
"""
if self.__staged_changes is None:
self.__staged_changes = {}
self.__staged_changes.update(kwargs)
[docs] def on_commit(self, event, signal):
"""
Commit changes previously staged.
"""
changes, self.__staged_changes = self.__staged_changes, {}
if changes:
for name, value in changes.items():
setattr(self, name, value)