mirror of
https://github.com/samsonjs/vdirsyncer.git
synced 2026-04-27 14:57:41 +00:00
Use cached properties in Item
This commit is contained in:
parent
41848b2432
commit
5b9758e669
1 changed files with 50 additions and 20 deletions
|
|
@ -46,39 +46,69 @@ IGNORE_PROPS = _process_properties(
|
||||||
ICALENDAR_ORIGINAL_ORDER_SUPPORT = \
|
ICALENDAR_ORIGINAL_ORDER_SUPPORT = \
|
||||||
hasattr(icalendar.caselessdict.CaselessDict, '__reversed__')
|
hasattr(icalendar.caselessdict.CaselessDict, '__reversed__')
|
||||||
|
|
||||||
|
_missing = object()
|
||||||
|
|
||||||
|
|
||||||
|
class cached_property(object):
|
||||||
|
'''
|
||||||
|
Copied from Werkzeug.
|
||||||
|
Copyright 2007-2014 Armin Ronacher
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self, func, name=None, doc=None):
|
||||||
|
self.__name__ = name or func.__name__
|
||||||
|
self.__module__ = func.__module__
|
||||||
|
self.__doc__ = doc or func.__doc__
|
||||||
|
self.func = func
|
||||||
|
|
||||||
|
def __get__(self, obj, type=None):
|
||||||
|
if obj is None:
|
||||||
|
return self
|
||||||
|
value = obj.__dict__.get(self.__name__, _missing)
|
||||||
|
if value is _missing:
|
||||||
|
value = self.func(obj)
|
||||||
|
obj.__dict__[self.__name__] = value
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
class Item(object):
|
class Item(object):
|
||||||
|
|
||||||
'''should-be-immutable wrapper class for VCALENDAR (VEVENT, VTODO) and
|
'''should-be-immutable wrapper class for VCALENDAR (VEVENT, VTODO) and
|
||||||
VCARD'''
|
VCARD'''
|
||||||
|
|
||||||
uid = None
|
|
||||||
'''Global identifier of the item, across storages, doesn't change after a
|
|
||||||
modification of the item.'''
|
|
||||||
|
|
||||||
raw = None
|
|
||||||
'''Raw content of the item, which vdirsyncer doesn't validate in any
|
|
||||||
way.'''
|
|
||||||
|
|
||||||
hash = None
|
|
||||||
'''Hash of self.raw, used for etags.'''
|
|
||||||
|
|
||||||
ident = None
|
|
||||||
'''Used for generating hrefs and matching up items during synchronization.
|
|
||||||
This is either the UID or the hash of the item's content.'''
|
|
||||||
|
|
||||||
def __init__(self, raw):
|
def __init__(self, raw):
|
||||||
assert isinstance(raw, text_type)
|
assert isinstance(raw, text_type)
|
||||||
|
|
||||||
for line in raw.splitlines():
|
self._raw = raw
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def raw(self):
|
||||||
|
'''Raw content of the item, which vdirsyncer doesn't validate in any
|
||||||
|
way.'''
|
||||||
|
return self._raw
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def uid(self):
|
||||||
|
'''Global identifier of the item, across storages, doesn't change after
|
||||||
|
a modification of the item.'''
|
||||||
|
|
||||||
|
for line in self.raw.splitlines():
|
||||||
if line.startswith(u'UID:'):
|
if line.startswith(u'UID:'):
|
||||||
uid = line[4:].strip()
|
uid = line[4:].strip()
|
||||||
if uid:
|
if uid:
|
||||||
self.uid = uid
|
return uid
|
||||||
|
|
||||||
self.raw = raw
|
@cached_property
|
||||||
self.hash = hash_item(raw)
|
def hash(self):
|
||||||
self.ident = self.uid or self.hash
|
'''Hash of self.raw, used for etags.'''
|
||||||
|
return hash_item(self.raw)
|
||||||
|
|
||||||
|
@cached_property
|
||||||
|
def ident(self):
|
||||||
|
'''Used for generating hrefs and matching up items during
|
||||||
|
synchronization. This is either the UID or the hash of the item's
|
||||||
|
content.'''
|
||||||
|
return self.uid or self.hash
|
||||||
|
|
||||||
|
|
||||||
def normalize_item(text, ignore_props=IGNORE_PROPS, use_icalendar=True):
|
def normalize_item(text, ignore_props=IGNORE_PROPS, use_icalendar=True):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue