From: Tomas Babej Date: Mon, 23 Mar 2015 20:07:39 +0000 (+0100) Subject: Task: Make sure tasklib hooks do not ignore removal of attributes X-Git-Url: https://git.madduck.net/etc/taskwarrior.git/commitdiff_plain/7283e46db89585fc87bad242e97d81b9f9e0fc88?ds=sidebyside;hp=-c Task: Make sure tasklib hooks do not ignore removal of attributes --- 7283e46db89585fc87bad242e97d81b9f9e0fc88 diff --git a/tasklib/task.py b/tasklib/task.py index b3f59f0..fad13bd 100644 --- a/tasklib/task.py +++ b/tasklib/task.py @@ -297,7 +297,7 @@ class TaskResource(SerializingObject): # are not propagated. self._original_data = copy.deepcopy(self._data) - def _update_data(self, data, update_original=False): + def _update_data(self, data, update_original=False, remove_missing=False): """ Low level update of the internal _data dict. Data which are coming as updates should already be serialized. If update_original is True, the @@ -306,6 +306,11 @@ class TaskResource(SerializingObject): self._data.update(dict((key, self._deserialize(key, value)) for key, value in data.items())) + # In certain situations, we want to treat missing keys as removals + if remove_missing: + for key in set(self._data.keys()) - set(data.keys()): + self._data[key] = None + if update_original: self._original_data = copy.deepcopy(self._data) @@ -464,7 +469,8 @@ class Task(TaskResource): # 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())) + task._update_data(json.loads(input_file.readline().strip()), + remove_missing=True) return task