]> git.madduck.net Git - etc/taskwarrior.git/commitdiff

madduck's git repository

Every one of the projects in this repository is available at the canonical URL git://git.madduck.net/madduck/pub/<projectpath> — see each project's metadata for the exact URL.

All patches and comments are welcome. Please squash your changes to logical commits before using git-format-patch and git-send-email to patches@git.madduck.net. If you'd read over the Git project's submission guidelines and adhered to them, I'd be especially grateful.

SSH access, as well as push access can be individually arranged.

If you use my repositories frequently, consider adding the following snippet to ~/.gitconfig and using the third clone URL listed for each project:

[url "git://git.madduck.net/madduck/"]
  insteadOf = madduck:

Task: Drop support for direct unserialized data in __init__
authorTomas Babej <tomasbabej@gmail.com>
Fri, 2 Jan 2015 07:18:12 +0000 (08:18 +0100)
committerTomas Babej <tomasbabej@gmail.com>
Fri, 2 Jan 2015 12:17:49 +0000 (13:17 +0100)
tasklib/task.py

index d9b2678e084b89fb3e7a75867b0fa0f07bbf02e7..1bd3ce7030271709e937e01dc4447610bc916f76 100644 (file)
@@ -30,9 +30,22 @@ class TaskResource(object):
     def _load_data(self, data):
         self._data = data
         # We need to use a copy for original data, so that changes
-        # are not propagated
+        # are not propagated. Shallow copy is alright, since data dict uses only
+        # primitive data types
         self._original_data = data.copy()
 
+    def _update_data(self, data, update_original=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
+        original_data dict is updated as well.
+        """
+
+        self._data.update(data)
+
+        if update_original:
+            self._original_data.update(data)
+
     def __getitem__(self, key):
         # This is a workaround to make TaskResource non-iterable
         # over simple index-based iteration
@@ -116,7 +129,7 @@ class Task(TaskResource):
         """
         pass
 
-    def __init__(self, warrior, data={}, **kwargs):
+    def __init__(self, warrior, **kwargs):
         self.warrior = warrior
 
         # We serialize the data in kwargs so that users of the library
@@ -127,11 +140,6 @@ class Task(TaskResource):
         self._load_data(dict((key, self._serialize(key, value))
                         for (key, value) in six.iteritems(kwargs)))
 
-        # We keep data for backwards compatibility
-        # TODO: Should we keep this using unserialized access to _data dict?
-        self._data.update(data)
-        self._original_data.update(data)
-
     def __unicode__(self):
         return self['description']
 
@@ -348,14 +356,9 @@ class Task(TaskResource):
         if only_fields:
             to_update = dict(
                 [(k, new_data.get(k)) for k in only_fields])
-            self._data.update(to_update)
-            self._original_data.update(to_update)
+            self._update_data(to_update, update_original=True)
         else:
-            self._data = new_data
-            # We need to create a clone for original_data though
-            # Shallow copy is alright, since data dict uses only
-            # primitive data types
-            self._original_data = new_data.copy()
+            self._load_data(new_data)
 
 
 class TaskFilter(object):
@@ -552,7 +555,9 @@ class TaskWarrior(object):
             if line:
                 data = line.strip(',')
                 try:
-                    tasks.append(Task(self, json.loads(data)))
+                    filtered_task = Task(self)
+                    filtered_task._load_data(json.loads(data))
+                    tasks.append(filtered_task)
                 except ValueError:
                     raise TaskWarriorException('Invalid JSON: %s' % data)
         return tasks