X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/96cd505ef5e22acc9707b3497449a9dfdf6dfc5e..b9539265b8094c49d02317f97fd2cabb585e69a8:/tasklib/task.py diff --git a/tasklib/task.py b/tasklib/task.py index 537c792..e8e5dfd 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -52,9 +52,6 @@ class ReadOnlyDictView(object): def get(self, key, default=None): return copy.deepcopy(self.viewed_dict.get(key, default)) - def has_key(self, key): - return self.viewed_dict.has_key(key) - def items(self): return [copy.deepcopy(v) for v in self.viewed_dict.items()] @@ -106,6 +103,10 @@ class SerializingObject(object): or entered as a value of Task attribute. """ + # None value should not be converted by normalizer + if value is None: + return None + normalize_func = getattr(self, 'normalize_{0}'.format(key), lambda x: x) @@ -236,13 +237,14 @@ 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 - + return localized def normalize_uuid(self, value): # Enforce sane UUID - if not isinstance(value, six.text_type) or value == '': - raise ValueError("UUID must be a valid non-empty string.") + if not isinstance(value, six.string_types) or value == '': + raise ValueError("UUID must be a valid non-empty string, " + "not: {}".format(value)) return value @@ -383,7 +385,7 @@ class Task(TaskResource): pass @classmethod - def from_input(cls, input_file=sys.stdin, modify=None): + def from_input(cls, input_file=sys.stdin, modify=None, warrior=None): """ Creates a Task object, directly from the stdin, by reading one line. If modify=True, two lines are used, first line interpreted as the @@ -399,13 +401,18 @@ class Task(TaskResource): but defaults to sys.stdin. """ - # TaskWarrior instance is set to None - task = cls(None) - # Detect the hook type if not given directly name = os.path.basename(sys.argv[0]) modify = name.startswith('on-modify') if modify is None else modify + # Create the TaskWarrior instance if none passed + if warrior is None: + hook_parent_dir = os.path.dirname(os.path.dirname(sys.argv[0])) + warrior = TaskWarrior(data_location=hook_parent_dir) + + # TaskWarrior instance is set to None + task = cls(warrior) + # Load the data from the input task._load_data(json.loads(input_file.readline().strip())) @@ -838,7 +845,7 @@ class TaskWarrior(object): stdout, stderr = [x.decode('utf-8') for x in p.communicate()] if p.returncode and allow_failure: if stderr.strip(): - error_msg = stderr.strip().splitlines()[-1] + error_msg = stderr.strip() else: error_msg = stdout.strip() raise TaskWarriorException(error_msg)