Add memory storage

This commit is contained in:
Markus Unterwaditzer 2014-02-15 09:40:41 +01:00
parent 34e2c8e9dd
commit d3c527618f
4 changed files with 49 additions and 9 deletions

View file

@ -1,6 +1,9 @@
class Error(Exception):
pass
class NotFoundError(Error):
pass
class AlreadyExistingError(Error):
pass

View file

@ -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
'''

View file

@ -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)

View file

@ -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