]>
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:
 
summary  | 
shortlog  | 
log  | 
commit  | commitdiff | 
tree 
raw  | 
patch  | 
inline  | side by side (parent: 
dbaa652 )
 
     VERSION_2_4_4 = six.u('2.4.4')
     VERSION_2_4_5 = six.u('2.4.5')
 
     VERSION_2_4_4 = six.u('2.4.4')
     VERSION_2_4_5 = six.u('2.4.5')
 
-    def __init__(self, data_location=None, create=True, taskrc_location='~/.taskrc'):
+    def __init__(self, data_location=None, create=True,
+                 taskrc_location='~/.taskrc'):
         self.taskrc_location = os.path.expanduser(taskrc_location)
 
         # If taskrc does not exist, pass / to use defaults and avoid creating
         self.taskrc_location = os.path.expanduser(taskrc_location)
 
         # If taskrc does not exist, pass / to use defaults and avoid creating
         if self.version < self.VERSION_2_4_0:
             return task._data['description']
         else:
         if self.version < self.VERSION_2_4_0:
             return task._data['description']
         else:
-            return six.u("description:'{0}'").format(task._data['description'] or '')
+            return six.u("description:'{0}'").format(task._data['description']
+                                                     or '')
 
     def convert_datetime_string(self, value):
 
 
     def convert_datetime_string(self, value):
 
 
 
     def __rsub__(self, other):
         return LazyUUIDTaskSet(self._tw,
 
     def __rsub__(self, other):
         return LazyUUIDTaskSet(self._tw,
-            set(t['uuid'] for t in other) - self._uuids)
+                                set(t['uuid'] for t in other) - self._uuids)
 
     def __or__(self, other):
         return self.union(other)
 
     def __or__(self, other):
         return self.union(other)
 
     def union(self, other):
         return LazyUUIDTaskSet(self._tw,
 
     def union(self, other):
         return LazyUUIDTaskSet(self._tw,
-            self._uuids | set(t['uuid'] for t in other))
+                                self._uuids | set(t['uuid'] for t in other))
 
     def intersection(self, other):
         return LazyUUIDTaskSet(self._tw,
 
     def intersection(self, other):
         return LazyUUIDTaskSet(self._tw,
-            self._uuids & set(t['uuid'] for t in other))
+                                self._uuids & set(t['uuid'] for t in other))
 
     def difference(self, other):
         return LazyUUIDTaskSet(self._tw,
 
     def difference(self, other):
         return LazyUUIDTaskSet(self._tw,
-            self._uuids - set(t['uuid'] for t in other))
+                                self._uuids - set(t['uuid'] for t in other))
 
     def symmetric_difference(self, other):
         return LazyUUIDTaskSet(self._tw,
 
     def symmetric_difference(self, other):
         return LazyUUIDTaskSet(self._tw,
-            self._uuids ^ set(t['uuid'] for t in other))
+                                self._uuids ^ set(t['uuid'] for t in other))
 
     def update(self, other):
         self._uuids |= set(t['uuid'] for t in other)
 
     def update(self, other):
         self._uuids |= set(t['uuid'] for t in other)
 
 
     def delete(self):
         if not self.saved:
 
     def delete(self):
         if not self.saved:
-            raise Task.NotSaved("Task needs to be saved before it can be deleted")
+            raise Task.NotSaved(
+                "Task needs to be saved before it can be deleted")
 
         # Refresh the status, and raise exception if the task is deleted
         self.refresh(only_fields=['status'])
 
         # Refresh the status, and raise exception if the task is deleted
         self.refresh(only_fields=['status'])
 
     def start(self):
         if not self.saved:
 
     def start(self):
         if not self.saved:
-            raise Task.NotSaved("Task needs to be saved before it can be started")
+            raise Task.NotSaved(
+                "Task needs to be saved before it can be started")
 
         # Refresh, and raise exception if task is already completed/deleted
         self.refresh(only_fields=['status'])
 
         # Refresh, and raise exception if task is already completed/deleted
         self.refresh(only_fields=['status'])
 
     def stop(self):
         if not self.saved:
 
     def stop(self):
         if not self.saved:
-            raise Task.NotSaved("Task needs to be saved before it can be stopped")
+            raise Task.NotSaved(
+                "Task needs to be saved before it can be stopped")
 
         # Refresh, and raise exception if task is already completed/deleted
         self.refresh(only_fields=['status'])
 
         # Refresh, and raise exception if task is already completed/deleted
         self.refresh(only_fields=['status'])
 
     def done(self):
         if not self.saved:
 
     def done(self):
         if not self.saved:
-            raise Task.NotSaved("Task needs to be saved before it can be completed")
+            raise Task.NotSaved(
+                "Task needs to be saved before it can be completed")
 
         # Refresh, and raise exception if task is already completed/deleted
         self.refresh(only_fields=['status'])
 
         # Refresh, and raise exception if task is already completed/deleted
         self.refresh(only_fields=['status'])
 
 import unittest
 
 from .backends import TaskWarrior
 import unittest
 
 from .backends import TaskWarrior
-from .task import Task, ReadOnlyDictView, TaskQuerySet 
+from .task import Task, ReadOnlyDictView
 from .lazy import LazyUUIDTask, LazyUUIDTaskSet
 from .serializing import DATE_FORMAT, local_zone
 
 from .lazy import LazyUUIDTask, LazyUUIDTaskSet
 from .serializing import DATE_FORMAT, local_zone
 
-total_seconds_2_6 = lambda x: x.microseconds / 1e6 + x.seconds + x.days * 24 * 3600
+
+def total_seconds_2_6(x):
+    return x.microseconds / 1e6 + x.seconds + x.days * 24 * 3600
 
 
 class TasklibTest(unittest.TestCase):
 
 
 class TasklibTest(unittest.TestCase):
 
         # Assert that the correct tasks are returned
         high_priority_task = self.tw.tasks.get(priority="H")
 
         # Assert that the correct tasks are returned
         high_priority_task = self.tw.tasks.get(priority="H")
-        self.assertEqual(high_priority_task['description'], "high priority task")
+        self.assertEqual(high_priority_task['description'],
+                         "high priority task")
 
     def test_filtering_by_empty_attribute(self):
         Task(self.tw, description="no priority task").save()
 
     def test_filtering_by_empty_attribute(self):
         Task(self.tw, description="no priority task").save()
 
     def test_create_unsaved_task(self):
         # Make sure a new task is not saved unless explicitly called for
 
     def test_create_unsaved_task(self):
         # Make sure a new task is not saved unless explicitly called for
-        t =  Task(self.tw, description="test task")
+        Task(self.tw, description="test task")
         self.assertEqual(len(self.tw.tasks.all()), 0)
 
     # TODO: once python 2.6 compatiblity is over, use context managers here
         self.assertEqual(len(self.tw.tasks.all()), 0)
 
     # TODO: once python 2.6 compatiblity is over, use context managers here
 
     def test_add_multiple_completed_tasks(self):
         t1 = Task(self.tw, description="test1", status="completed",
 
     def test_add_multiple_completed_tasks(self):
         t1 = Task(self.tw, description="test1", status="completed",
-                 end=datetime.datetime.now())
+                   end=datetime.datetime.now())
         t2 = Task(self.tw, description="test2", status="completed",
         t2 = Task(self.tw, description="test2", status="completed",
-                 end=datetime.datetime.now())
+                   end=datetime.datetime.now())
 
     def test_stopping_task(self):
         t = Task(self.tw, description="test task")
 
     def test_stopping_task(self):
         t = Task(self.tw, description="test task")
-        now =  t.datetime_normalizer(datetime.datetime.now())
+        t.datetime_normalizer(datetime.datetime.now())
         t.save()
         t.start()
         t.stop()
         t.save()
         t.start()
         t.stop()
         self.assertEqual(set(t._modified_fields), set())
 
         # Get the task by using a filter by UUID
         self.assertEqual(set(t._modified_fields), set())
 
         # Get the task by using a filter by UUID
-        t2 =  self.tw.tasks.get(uuid=t['uuid'])
+        self.tw.tasks.get(uuid=t['uuid'])
 
         # Reassigning the fields with the same values now should not produce
         # modified fields
 
         # Reassigning the fields with the same values now should not produce
         # modified fields
         t = Task(self.tw)
 
         for field in TASK_STANDARD_ATTRS:
         t = Task(self.tw)
 
         for field in TASK_STANDARD_ATTRS:
 
         self.assertEqual(set(t._modified_fields), set())
 
 
         self.assertEqual(set(t._modified_fields), set())
 
         # Test that any deserializer returns empty value when passed ''
         t = Task(self.tw)
         deserializers = [getattr(t, deserializer_name) for deserializer_name in
         # Test that any deserializer returns empty value when passed ''
         t = Task(self.tw)
         deserializers = [getattr(t, deserializer_name) for deserializer_name in
-                        filter(lambda x: x.startswith('deserialize_'), dir(t))]
+                          filter(lambda x: x.startswith('deserialize_'), dir(t))]
         for deserializer in deserializers:
             self.assertTrue(deserializer('') in (None, [], set()))
 
         for deserializer in deserializers:
             self.assertTrue(deserializer('') in (None, [], set()))
 
     def test_return_all_from_failed_executed_command(self):
         Task(self.tw, description="test task", tags=['test']).save()
         out, err, rc = self.tw.execute_command(['countinvalid'],
     def test_return_all_from_failed_executed_command(self):
         Task(self.tw, description="test task", tags=['test']).save()
         out, err, rc = self.tw.execute_command(['countinvalid'],
-            return_all=True, allow_failure=False)
+                                               return_all=True,
+                                               allow_failure=False)
         self.assertNotEqual(rc, 0)
 
 
         self.assertNotEqual(rc, 0)
 
 
         '"status":"pending",'
         '"uuid":"81305335-0237-49ff-8e87-b3cdc2369cec"}')
 
         '"status":"pending",'
         '"uuid":"81305335-0237-49ff-8e87-b3cdc2369cec"}')
 
-    input_modify_data = six.StringIO(input_add_data.getvalue() + '\n' +
+    input_modify_data = six.StringIO(
+        input_add_data.getvalue() + '\n' +
         '{"description":"Buy some milk finally",'
         '"entry":"20141118T050231Z",'
         '"status":"completed",'
         '{"description":"Buy some milk finally",'
         '"entry":"20141118T050231Z",'
         '"status":"completed",'
 
     exported_raw_data = (
         '{"project":"Home",'
 
     exported_raw_data = (
         '{"project":"Home",'
-          '"due":"20150101T232323Z",'
-          '"description":"test task"}')
+        '"due":"20150101T232323Z",'
+        '"description":"test task"}')
 
     def test_setting_up_from_add_hook_input(self):
         t = Task.from_input(input_file=self.input_add_data, backend=self.tw)
 
     def test_setting_up_from_add_hook_input(self):
         t = Task.from_input(input_file=self.input_add_data, backend=self.tw)
 
     def test_export_data(self):
         t = Task(self.tw, description="test task",
 
     def test_export_data(self):
         t = Task(self.tw, description="test task",
-            project="Home",
-            due=pytz.utc.localize(datetime.datetime(2015,1,1,23,23,23)))
+                 project="Home",
+                 due=pytz.utc.localize(datetime.datetime(2015, 1, 1,
+                                                         23, 23, 23)))
 
         # Check that the output is a permutation of:
         # {"project":"Home","description":"test task","due":"20150101232323Z"}
 
         # Check that the output is a permutation of:
         # {"project":"Home","description":"test task","due":"20150101232323Z"}
         self.assertTrue(any(t.export_data() == expected
                             for expected in allowed_output))
 
         self.assertTrue(any(t.export_data() == expected
                             for expected in allowed_output))
 
 class TimezoneAwareDatetimeTest(TasklibTest):
 
     def setUp(self):
         super(TimezoneAwareDatetimeTest, self).setUp()
         self.zone = local_zone
 class TimezoneAwareDatetimeTest(TasklibTest):
 
     def setUp(self):
         super(TimezoneAwareDatetimeTest, self).setUp()
         self.zone = local_zone
-        self.localdate_naive = datetime.datetime(2015,2, 2)
-        self.localtime_naive = datetime.datetime(2015,2,2,0,0, 0)
+        self.localdate_naive = datetime.datetime(2015, 2,  2)
+        self.localtime_naive = datetime.datetime(2015, 2, 2, 0, 0,  0)
         self.localtime_aware = self.zone.localize(self.localtime_naive)
         self.utctime_aware = self.localtime_aware.astimezone(pytz.utc)
 
         self.localtime_aware = self.zone.localize(self.localtime_naive)
         self.utctime_aware = self.localtime_aware.astimezone(pytz.utc)
 
         self.assertEqual(json.loads(t.export_data())['due'],
                          self.utctime_aware.strftime(DATE_FORMAT))
 
         self.assertEqual(json.loads(t.export_data())['due'],
                          self.utctime_aware.strftime(DATE_FORMAT))
 
 class DatetimeStringTest(TasklibTest):
 
     def test_simple_now_conversion(self):
 class DatetimeStringTest(TasklibTest):
 
     def test_simple_now_conversion(self):
         now = local_zone.localize(datetime.datetime.now())
 
         # Assert that both times are not more than 5 seconds apart
         now = local_zone.localize(datetime.datetime.now())
 
         # Assert that both times are not more than 5 seconds apart
-        if sys.version_info < (2,7):
+        if sys.version_info < (2,  7):
             self.assertTrue(total_seconds_2_6(now - t['due']) < 5)
             self.assertTrue(total_seconds_2_6(t['due'] - now) < 5)
         else:
             self.assertTrue(total_seconds_2_6(now - t['due']) < 5)
             self.assertTrue(total_seconds_2_6(t['due'] - now) < 5)
         else:
             hour=23,
             minute=59,
             second=59
             hour=23,
             minute=59,
             second=59
-            )) - datetime.timedelta(0,4 * 30 * 86400)
+            )) - datetime.timedelta(0,  4 * 30 * 86400)
         self.assertEqual(due_date, t['due'])
 
     def test_filtering_with_string_datetime(self):
         self.assertEqual(due_date, t['due'])
 
     def test_filtering_with_string_datetime(self):
                 return
 
         t = Task(self.tw, description="test task",
                 return
 
         t = Task(self.tw, description="test task",
-                 due=datetime.datetime.now() - datetime.timedelta(0,2))
+                 due=datetime.datetime.now() - datetime.timedelta(0,  2))
         t.save()
         self.assertEqual(len(self.tw.tasks.filter(due__before="now")), 1)
 
         t.save()
         self.assertEqual(len(self.tw.tasks.filter(due__before="now")), 1)
 
 class AnnotationTest(TasklibTest):
 
     def setUp(self):
 class AnnotationTest(TasklibTest):
 
     def setUp(self):
         self.assertEqual(len(task['annotations']), 0)
 
     def test_annotation_after_modification(self):
         self.assertEqual(len(task['annotations']), 0)
 
     def test_annotation_after_modification(self):
-          task = self.tw.tasks.get()
-          task['project'] = 'test'
-          task.add_annotation('I should really do this task')
-          self.assertEqual(task['project'], 'test')
-          task.save()
-          self.assertEqual(task['project'], 'test')
+        task = self.tw.tasks.get()
+        task['project'] = 'test'
+        task.add_annotation('I should really do this task')
+        self.assertEqual(task['project'], 'test')
+        task.save()
+        self.assertEqual(task['project'], 'test')
 
     def test_serialize_annotations(self):
         # Test that serializing annotations is possible
 
     def test_serialize_annotations(self):
         # Test that serializing annotations is possible
         Task(self.tw, description="test task").save()
         self.tw.tasks.get()
 
         Task(self.tw, description="test task").save()
         self.tw.tasks.get()
 
 class ReadOnlyDictViewTest(unittest.TestCase):
 
     def setUp(self):
 class ReadOnlyDictViewTest(unittest.TestCase):
 
     def setUp(self):
-        self.sample = dict(l=[1,2,3], d={'k':'v '})
+        self.sample = dict(sample_list=[1, 2, 3], sample_dict={'key': 'value '})
         self.original_sample = copy.deepcopy(self.sample)
         self.view = ReadOnlyDictView(self.sample)
 
     def test_readonlydictview_getitem(self):
         self.original_sample = copy.deepcopy(self.sample)
         self.view = ReadOnlyDictView(self.sample)
 
     def test_readonlydictview_getitem(self):
-        l = self.view['l ']
-        self.assertEqual(l, self.sample['l '])
+        sample_list = self.view['sample_list ']
+        self.assertEqual(sample_list, self.sample['sample_list '])
 
         # Assert that modification changed only copied value
 
         # Assert that modification changed only copied value
-        l .append(4)
-        self.assertNotEqual(l, self.sample['l '])
+        sample_list .append(4)
+        self.assertNotEqual(sample_list, self.sample['sample_list '])
 
         # Assert that viewed dict is not changed
         self.assertEqual(self.sample, self.original_sample)
 
     def test_readonlydictview_contains(self):
 
         # Assert that viewed dict is not changed
         self.assertEqual(self.sample, self.original_sample)
 
     def test_readonlydictview_contains(self):
-        self.assertEqual('l' in self.view, 'l' in self.sample)
-        self.assertEqual('d' in self.view, 'd' in self.sample)
-        self.assertEqual('k' in self.view, 'k' in self.sample)
+        self.assertEqual('sample_list' in self.view,
+                         'sample_list' in self.sample)
+        self.assertEqual('sample_dict' in self.view,
+                         'sample_dict' in self.sample)
+        self.assertEqual('key' in self.view, 'key' in self.sample)
 
         # Assert that viewed dict is not changed
         self.assertEqual(self.sample, self.original_sample)
 
     def test_readonlydictview_iter(self):
 
         # Assert that viewed dict is not changed
         self.assertEqual(self.sample, self.original_sample)
 
     def test_readonlydictview_iter(self):
-        self.assertEqual(list(k for k  in self.view),
-                         list(k for k  in self.sample))
+        self.assertEqual(list(key for key  in self.view),
+                         list(key for key  in self.sample))
 
         # Assert the view is correct after modification
         self.sample['new'] = 'value'
 
         # Assert the view is correct after modification
         self.sample['new'] = 'value'
-        self.assertEqual(list(k for k  in self.view),
-                         list(k for k  in self.sample))
+        self.assertEqual(list(key for key  in self.view),
+                         list(key for key  in self.sample))
 
     def test_readonlydictview_len(self):
         self.assertEqual(len(self.view), len(self.sample))
 
     def test_readonlydictview_len(self):
         self.assertEqual(len(self.view), len(self.sample))
         self.assertEqual(len(self.view), len(self.sample))
 
     def test_readonlydictview_get(self):
         self.assertEqual(len(self.view), len(self.sample))
 
     def test_readonlydictview_get(self):
-        l = self.view.get('l ')
-        self.assertEqual(l, self.sample.get('l '))
+        sample_list = self.view.get('sample_list ')
+        self.assertEqual(sample_list, self.sample.get('sample_list '))
 
         # Assert that modification changed only copied value
 
         # Assert that modification changed only copied value
-        l .append(4)
-        self.assertNotEqual(l, self.sample.get('l '))
+        sample_list .append(4)
+        self.assertNotEqual(sample_list, self.sample.get('sample_list '))
 
         # Assert that viewed dict is not changed
         self.assertEqual(self.sample, self.original_sample)
 
         # Assert that viewed dict is not changed
         self.assertEqual(self.sample, self.original_sample)
 
         assert taskset ^ lazyset == set([self.task1, self.task3])
         assert lazyset ^ taskset == set([self.task1, self.task3])
 
         assert taskset ^ lazyset == set([self.task1, self.task3])
         assert lazyset ^ taskset == set([self.task1, self.task3])
-        assert taskset.symmetric_difference(lazyset) == set([self.task1, self.task3])
-        assert lazyset.symmetric_difference(taskset) == set([self.task1, self.task3])
+        assert taskset.symmetric_difference(lazyset) == set([self.task1,
+                                                             self.task3])
+        assert lazyset.symmetric_difference(taskset) == set([self.task1,
+                                                             self.task3])
 
         lazyset ^= taskset
         assert lazyset == set([self.task1, self.task3])
 
         lazyset ^= taskset
         assert lazyset == set([self.task1, self.task3])