X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/blobdiff_plain/68aa8a1759d350a4e6fcd79ab6b2e0e61e7bd538..9acc463bf53a03a41b6d8539ebd295b3603d2589:/tasklib/task.py?ds=inline diff --git a/tasklib/task.py b/tasklib/task.py index 1ab6347..f21ea43 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -5,6 +5,7 @@ import json import logging import os import six +import sys import subprocess DATE_FORMAT = '%Y%m%dT%H%M%SZ' @@ -205,6 +206,36 @@ class Task(TaskResource): """ pass + @classmethod + def from_input(cls, input_file=sys.stdin, modify=False): + """ + Creates a Task object, directly from the stdin, by reading one line. + If modify=True, two lines are used, first line interpreted as the + original state of the Task object, and second line as its new, + modified value. This is consistent with the TaskWarrior's hook + system. + + Object created by this method should not be saved, deleted + or refreshed, as t could create a infinite loop. For this + reason, TaskWarrior instance is set to None. + + Input_file argument can be used to specify the input file, + but defaults to sys.stdin. + """ + + # TaskWarrior instance is set to None + task = cls(None) + + # Load the data from the input + task._load_data(json.loads(input_file.readline().strip())) + + # If this is a on-modify event, we are provided with additional + # line of input, which provides updated data + if modify: + task._update_data(json.loads(input_file.readline().strip())) + + return task + def __init__(self, warrior, **kwargs): self.warrior = warrior @@ -362,6 +393,9 @@ class Task(TaskResource): # Circumvent the ID storage, since ID is considered read-only self._data['id'] = int(id_lines[0].split(' ')[2].rstrip('.')) + # Refreshing is very important here, as not only modification time + # is updated, but arbitrary attribute may have changed due hooks + # altering the data before saving self.refresh() def add_annotation(self, annotation): @@ -427,6 +461,13 @@ class Task(TaskResource): else: self._load_data(new_data) + def export_data(self): + """ + Exports current data contained in the Task as JSON + """ + + # We need to remove spaces for TW-1504, use custom separators + return json.dumps(self._data, separators=(',',':')) class TaskFilter(SerializingObject): """