Source code for flaskbb.core.changesets

# -*- coding: utf-8 -*-
"""
flaskbb.core.changesets
~~~~~~~~~~~~~~~~~~~~~

Core interfaces for handlers, services, etc.

:copyright: (c) 2018 the FlaskBB Team
:license: BSD, see LICENSE for more details
"""

from abc import ABC, abstractmethod
from inspect import isclass

empty = None


[docs] class EmptyValue(object): """ Represents an empty change set value when None is a valid value to apply to the model. This class is a singleton. """ __slots__ = () def __new__(cls): # hack to cut down on instances global empty if empty is None: empty = super(EmptyValue, EmptyValue).__new__(cls) return empty def __eq__(self, other): return isinstance(other, EmptyValue) or ( isclass(other) and issubclass(other, EmptyValue) ) def __bool__(self): return False __nonzero__ = __bool__
empty = EmptyValue()
[docs] def is_empty(value, consider_none=False): """ Helper to check if an arbitrary value is an EmptyValue """ return empty == value or (consider_none and value is None)
[docs] class ChangeSetValidator(ABC): """ Used to validate a change set is valid to apply against a model """
[docs] @abstractmethod def validate(self, model, changeset): """ May raise a :class:`~flaskbb.core.exceptions.ValidationError` to signify that the changeset cannot be applied to the model. Or a :class:`~flaskbb.core.exceptions.StopValidation` to immediately halt all validation. """ pass
[docs] class ChangeSetHandler(ABC): """ Used to apply a changeset to a model. """
[docs] @abstractmethod def apply_changeset(self, model, changeset): """ Receives the current model and the changeset object, apply the changeset to the model and persist the model. May raise a :class:`~flaskbb.core.exceptions.StopValidation` if the changeset could not be applied. """
[docs] class ChangeSetPostProcessor(ABC): """ Used to handle actions after a change set has been persisted. """
[docs] @abstractmethod def post_process_changeset(self, model, changeset): """ Used to react to a changeset's application to a model. """