Source code for gpxity.backends.memory

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Copyright (c) 2019 Wolfgang Rohdewald <wolfgang@rohdewald.de>
# See LICENSE for details.

"""This implements :class:`gpxity.memory.Memory`."""

# pylint: disable=protected-access


from .. import Backend
from ..accounts import MemoryAccount

__all__ = ['Memory']


[docs]class Memory(Backend): """Keep it in RAM only. Uses id(GpxFile) as id_in_backend, if none is given. Memory.clone() returns self._new_id_from Useful if you want to do multiple manipulations and batch_changes() would be inconvenient. Args: Account: If its url is unset, this will create a temporary directory named :attr:`prefix`.X where X are some random characters. It will be removed in __exit__ / detach. """ # pylint: disable=abstract-method test_is_expensive = False accepts_zero_points = True def __init__(self, account=None): """See class docstring.""" if account is None: account = MemoryAccount() assert isinstance(account, MemoryAccount) super(Memory, self).__init__(account) self.__my_storage = dict()
[docs] def clone(self): """Return myself.""" result = super(Memory, self).clone() result.__my_storage = self.__my_storage return result
def _list(self): """get all gpxfiles for this user.""" for key, value in self.__my_storage.items(): self._found_gpxfile(key, value) def _read(self, gpxfile): """Nothing to do, _list already read everything.""" def _write_all(self, gpxfile) ->str: """Just do nothing but give an id_in_backend if needed. Returns: The new id_in_backend. """ if gpxfile.id_in_backend is None: gpxfile.id_in_backend = self._new_id_from(str(id(gpxfile))) self.__my_storage[gpxfile.id_in_backend] = gpxfile.gpx.clone() return gpxfile.id_in_backend def _new_id_from(self, wanted): """Make it unique within this Backend. Returns: The unique id_in_backend. """ result = wanted counter = 1 while result in self.__my_storage: result = '{}.{}'.format(wanted, counter) return result def _change_ident(self, gpxfile, new_ident: str): """Change the id in the backend. Make it unique if needed.""" assert gpxfile.id_in_backend != new_ident gpx = self.__my_storage[gpxfile.id_in_backend] del self.__my_storage[gpxfile.id_in_backend] unique_id = self._new_id_from(new_ident) self.__my_storage[unique_id] = gpx self.logger.info('%s: renamed %s to %s', self.account, gpxfile.id_in_backend, unique_id) gpxfile.id_in_backend = unique_id def _remove_ident(self, ident: str): """Remove this GpxFile.""" del self.__my_storage[ident] def __str__(self) ->str: """Used for formatting strings. Must be unique within the process. Returns: a unique identifier """ return str(self.account) @staticmethod def _new_ident(gpxfile): """Create an id for gpxfile. Returns: The new ident. """ return gpxfile.id_in_backend or str(id(gpxfile))