class Serializer(with_metaclass(ABCMeta, object)): """ The abstract base class for Serializers. Allows TinyDB to handle arbitrary objects by running them through a list of registerd serializers. Every serializer has to tell which class it can handle. """ @abstractproperty def OBJ_CLASS(self): raise NotImplementedError('To be overriden!') @abstractmethod def encode(self, obj): """ Encode an object. :param obj: :return: :rtype: str """ raise NotImplementedError('To be overriden!') @abstractmethod def decode(self, s): """ Decode an object. :param s: :type s: str :return: """ raise NotImplementedError('To be overriden!')
class Storage(with_metaclass(ABCMeta, object)): """ The abstract base class for all Storages. A Storage (de)serializes the current state of the database and stores it in some place (memory, file on disk, ...). """ # Using ABCMeta as metaclass allows instantiating only storages that have # implemented read and write @abstractmethod def read(self): """ Read the last stored state. Any kind of deserialization should go here. Raise ``ValueError`` here to indicate that the storage is empty. :rtype: dict """ raise NotImplementedError('To be overriden!') @abstractmethod def write(self, data): """ Write the current state of the database to the storage. Any kind of serialization should go here. :param data: The current state of the database. :type data: dict """ raise NotImplementedError('To be overriden!') def close(self): """ Optional: Close open file handles, etc. """ pass