From d3c527618fecec4a9027b93ec7f30ba91d6f1099 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Sat, 15 Feb 2014 09:40:41 +0100 Subject: [PATCH] Add memory storage --- vdirsyncer/exceptions.py | 3 +++ vdirsyncer/storage/base.py | 5 +++-- vdirsyncer/storage/filesystem.py | 16 ++++++++------- vdirsyncer/storage/memory.py | 34 ++++++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 vdirsyncer/storage/memory.py diff --git a/vdirsyncer/exceptions.py b/vdirsyncer/exceptions.py index 8ee9365..fdc5205 100644 --- a/vdirsyncer/exceptions.py +++ b/vdirsyncer/exceptions.py @@ -1,6 +1,9 @@ class Error(Exception): pass +class NotFoundError(Error): + pass + class AlreadyExistingError(Error): pass diff --git a/vdirsyncer/storage/base.py b/vdirsyncer/storage/base.py index d41b016..dead9b5 100644 --- a/vdirsyncer/storage/base.py +++ b/vdirsyncer/storage/base.py @@ -46,8 +46,9 @@ class Storage(object): def update(self, obj, etag): ''' - Update the object, raise error if the etag on the server doesn't match - the given etag. + Update the object, raise :exc:`vdirsyncer.exceptions.WrongEtagError` if + the etag on the server doesn't match the given etag, raise + :exc:`vdirsyncer.exceptions.NotFoundError` if the item doesn't exist. :returns: etag on the server ''' diff --git a/vdirsyncer/storage/filesystem.py b/vdirsyncer/storage/filesystem.py index c1a625a..5e618c7 100644 --- a/vdirsyncer/storage/filesystem.py +++ b/vdirsyncer/storage/filesystem.py @@ -1,6 +1,6 @@ import os from vdirsyncer.storage.base import Storage, Item -from vdirsyncer.exceptions import AlreadyExistingError +import vdirsyncer.exceptions as exceptions class FilesystemStorage(Storage): def __init__(self, path, **kwargs): @@ -10,6 +10,9 @@ class FilesystemStorage(Storage): def _get_etag(self, href): return os.path.getmtime(href) + def _get_href(self, obj): + return os.path.join(self.path, obj.uid + b'b' + self.fileext) + def _get_hrefs(self): for fname in os.listdir(self.path): href = os.path.join(self.path, fname) @@ -28,13 +31,10 @@ class FilesystemStorage(Storage): def item_exists(self, href): return os.path.isfile(path) - def _get_href(self, obj): - return os.path.join(self.path, obj.uid + b'b' + self.fileext) - def upload(self, obj): href = self._get_href(obj) if os.path.exists(href): - raise AlreadyExistingError(href) + raise exceptions.AlreadyExistingError(href) with open(href, 'wb+') as f: f.write(obj.raw) return href, self._get_etag(href) @@ -43,8 +43,10 @@ class FilesystemStorage(Storage): href = self._get_href(obj) actual_etag = self._get_etag(href) if etag != actual_etag: - raise WrongEtagError(etag, actual_etag) - + raise exceptions.WrongEtagError(etag, actual_etag) + if not os.path.exists(href): + raise exceptions.NotFoundError(href) with open(href, 'wb') as f: f.write(obj.raw) + return self._get_etag(href) diff --git a/vdirsyncer/storage/memory.py b/vdirsyncer/storage/memory.py new file mode 100644 index 0000000..414c919 --- /dev/null +++ b/vdirsyncer/storage/memory.py @@ -0,0 +1,34 @@ +import datetime +from vdirsyncer.storage.base import Item, Storage +import vdirsyncer.exceptions as exceptions + +class MemoryStorage(Storage): + def __init__(self, **kwargs): + self.items = {} # href => (etag, object) + super(MemoryStorage, self).__init__(**kwargs) + + def list_items(self): + for href, (etag, obj) in self.items.items(): + yield href, etag + + def get_items(self, hrefs): + for href in hrefs: + etag, obj = self.items[href] + return obj, href, etag + + def item_exists(self, href): + return href in self.items + + def upload(self, obj): + if obj.uid in self.items: + raise exceptions.AlreadyExistingError(obj) + etag = datetime.datetime.now() + self.items[obj.uid] = (etag, obj) + return obj.uid, etag + + def update(self, obj, etag): + if obj.uid not in self.items: + raise exceptions.NotFoundError(obj) + etag = datetime.datetime.now() + self.items[obj.uid] = (etag, obj) + return obj.uid, etag