From 73cb96ecbbcaf43f05dc825a1017c2680b79f5a9 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 9 Aug 2015 00:17:56 +0200 Subject: [PATCH] SerializingObject: Abstract datetime string conversion --- tasklib/backends.py | 20 ++++++++++++++++++++ tasklib/serializing.py | 16 +++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/tasklib/backends.py b/tasklib/backends.py index 51285b5..2a00dee 100644 --- a/tasklib/backends.py +++ b/tasklib/backends.py @@ -67,6 +67,13 @@ class Backend(object): """Syncs the backend database with the taskd server""" pass + def convert_datetime_string(self, value): + """ + Converts TW syntax datetime string to a localized datetime + object. This method is not mandatory. + """ + raise NotImplemented + class TaskWarriorException(Exception): pass @@ -184,6 +191,19 @@ class TaskWarrior(object): else: return six.u("description:'{0}'").format(task._data['description'] or '') + def convert_datetime_string(self, value): + + if self.version >= VERSION_2_4_0: + # For strings, use 'task calc' to evaluate the string to datetime + # available since TW 2.4.0 + args = value.split() + result = self.execute_command(['calc'] + args) + naive = datetime.datetime.strptime(result[0], DATE_FORMAT_CALC) + localized = local_zone.localize(naive) + else: + raise ValueError("Provided value could not be converted to " + "datetime, its type is not supported: {}" + .format(type(value))) # Public interface diff --git a/tasklib/serializing.py b/tasklib/serializing.py index 5d848ff..ed2881d 100644 --- a/tasklib/serializing.py +++ b/tasklib/serializing.py @@ -25,8 +25,8 @@ class SerializingObject(object): to raise ValueError. """ - def __init__(self, warrior): - self.warrior = warrior + def __init__(self, backend): + self.backend = backend def _deserialize(self, key, value): hydrate_func = getattr(self, 'deserialize_{0}'.format(key), @@ -180,7 +180,7 @@ class SerializingObject(object): else: uuids = raw_uuids - return set(self.warrior.tasks.get(uuid=uuid) for uuid in uuids if uuid) + return set(self.backend.tasks.get(uuid=uuid) for uuid in uuids if uuid) def datetime_normalizer(self, value): """ @@ -205,14 +205,8 @@ class SerializingObject(object): # If the value is already localized, there is no need to change # time zone at this point. Also None is a valid value too. localized = value - elif (isinstance(value, six.string_types) - and self.warrior.version >= VERSION_2_4_0): - # For strings, use 'task calc' to evaluate the string to datetime - # available since TW 2.4.0 - args = value.split() - result = self.warrior.execute_command(['calc'] + args) - naive = datetime.datetime.strptime(result[0], DATE_FORMAT_CALC) - localized = local_zone.localize(naive) + elif isinstance(value, six.string_types): + localized = self.backend.convert_datetime_string(value) else: raise ValueError("Provided value could not be converted to " "datetime, its type is not supported: {}" -- 2.39.2