From: Tomas Babej Date: Thu, 24 Dec 2015 11:05:28 +0000 (+0100) Subject: lazy: Move lazy class implementations into a separate module X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/commitdiff_plain/8f39904e76a1462d81fbe80e07a82bba11035cd8?ds=inline;hp=-c;pf=etc lazy: Move lazy class implementations into a separate module --- 8f39904e76a1462d81fbe80e07a82bba11035cd8 diff --git a/tasklib/lazy.py b/tasklib/lazy.py new file mode 100644 index 0000000..0bd9332 --- /dev/null +++ b/tasklib/lazy.py @@ -0,0 +1,94 @@ +""" +Provides lazy implementations for Task and TaskQuerySet. +""" + + +class LazyUUIDTask(object): + """ + A lazy wrapper around Task object, referenced by UUID. + + - Supports comparison with LazyUUIDTask or Task objects (equality by UUIDs) + - If any attribute other than 'uuid' requested, a lookup in the + backend will be performed and this object will be replaced by a proper + Task object. + """ + + def __init__(self, tw, uuid): + self._tw = tw + self._uuid = uuid + + def __getitem__(self, key): + # LazyUUIDTask does not provide anything else other than 'uuid' + if key is 'uuid': + return self._uuid + else: + self.replace() + return self[key] + + def __getattr__(self, name): + # Getattr is called only if the attribute could not be found using + # normal means + self.replace() + return self.name + + def __eq__(self, other): + if other['uuid']: + # For saved Tasks, just define equality by equality of uuids + return self['uuid'] == other['uuid'] + + def __hash__(self): + return self['uuid'].__hash__() + + def replace(self): + """ + Performs conversion to the regular Task object, referenced by the + stored UUID. + """ + + replacement = self._tw.tasks.get(uuid=self._uuid) + self.__class__ = replacement.__class__ + self.__dict__ = replacement.__dict__ + + +class LazyUUIDTaskSet(object): + """ + A lazy wrapper around TaskQuerySet object, for tasks referenced by UUID. + + - Supports 'in' operator with LazyUUIDTask or Task objects + - If iteration over the objects in the LazyUUIDTaskSet is requested, the + LazyUUIDTaskSet will be converted to QuerySet and evaluated + """ + + def __init__(self, tw, uuids): + self._tw = tw + self._uuids = set(uuids) + + def __getattr__(self, name): + # Getattr is called only if the attribute could not be found using + # normal means + self.replace() + return self.name + + def __eq__(self, other): + return set(t['uuid'] for t in other) == self._uuids + + def __contains__(self, task): + return task['uuid'] in self._uuids + + def __len__(self): + return len(self._uuids) + + def __iter__(self): + self.replace() + for task in self: + yield task + + def replace(self): + """ + Performs conversion to the regular TaskQuerySet object, referenced by + the stored UUIDs. + """ + + replacement = self._tw.tasks.filter(' '.join(self._uuids)) + self.__class__ = replacement.__class__ + self.__dict__ = replacement.__dict__ diff --git a/tasklib/task.py b/tasklib/task.py index 6ebee4c..5eabc65 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -168,97 +168,6 @@ class TaskAnnotation(TaskResource): __repr__ = __unicode__ -class LazyUUIDTask(object): - """ - A lazy wrapper around Task object, referenced by UUID. - - - Supports comparison with LazyUUIDTask or Task objects (equality by UUIDs) - - If any attribute other than 'uuid' requested, a lookup in the - backend will be performed and this object will be replaced by a proper - Task object. - """ - - def __init__(self, tw, uuid): - self._tw = tw - self._uuid = uuid - - def __getitem__(self, key): - # LazyUUIDTask does not provide anything else other than 'uuid' - if key is 'uuid': - return self._uuid - else: - self.replace() - return self[key] - - def __getattr__(self, name): - # Getattr is called only if the attribute could not be found using - # normal means - self.replace() - return self.name - - def __eq__(self, other): - if other['uuid']: - # For saved Tasks, just define equality by equality of uuids - return self['uuid'] == other['uuid'] - - def __hash__(self): - return self['uuid'].__hash__() - - def replace(self): - """ - Performs conversion to the regular Task object, referenced by the - stored UUID. - """ - - replacement = self._tw.tasks.get(uuid=self._uuid) - self.__class__ = replacement.__class__ - self.__dict__ = replacement.__dict__ - - -class LazyUUIDTaskSet(object): - """ - A lazy wrapper around TaskQuerySet object, for tasks referenced by UUID. - - - Supports 'in' operator with LazyUUIDTask or Task objects - - If iteration over the objects in the LazyUUIDTaskSet is requested, the - LazyUUIDTaskSet will be converted to QuerySet and evaluated - """ - - def __init__(self, tw, uuids): - self._tw = tw - self._uuids = set(uuids) - - def __getattr__(self, name): - # Getattr is called only if the attribute could not be found using - # normal means - self.replace() - return self.name - - def __eq__(self, other): - return set(t['uuid'] for t in other) == self._uuids - - def __contains__(self, task): - return task['uuid'] in self._uuids - - def __len__(self): - return len(self._uuids) - - def __iter__(self): - self.replace() - for task in self: - yield task - - def replace(self): - """ - Performs conversion to the regular TaskQuerySet object, referenced by - the stored UUIDs. - """ - - replacement = self._tw.tasks.filter(' '.join(self._uuids)) - self.__class__ = replacement.__class__ - self.__dict__ = replacement.__dict__ - - class Task(TaskResource): read_only_fields = ['id', 'entry', 'urgency', 'uuid', 'modified'] diff --git a/tasklib/tests.py b/tasklib/tests.py index 7c06f36..48007ea 100644 --- a/tasklib/tests.py +++ b/tasklib/tests.py @@ -12,8 +12,8 @@ import tempfile import unittest from .backends import TaskWarrior -from .task import (Task, ReadOnlyDictView, LazyUUIDTask, - LazyUUIDTaskSet, TaskQuerySet) +from .task import Task, ReadOnlyDictView, TaskQuerySet +from .lazy import LazyUUIDTask, LazyUUIDTaskSet from .serializing import DATE_FORMAT, local_zone # http://taskwarrior.org/docs/design/task.html , Section: The Attributes