diff --git a/taskw/task.py b/taskw/task.py index 7cd408d..1bceb64 100644 --- a/taskw/task.py +++ b/taskw/task.py @@ -14,7 +14,7 @@ StringField, UUIDField, ) -from taskw.fields.base import Dirtyable +from taskw.fields.base import Dirtyable, DirtyableList, DirtyableDict # Sentinel value for not specifying a default UNSPECIFIED = object() @@ -97,12 +97,10 @@ def _field_is_writable(self, key): return False return True - def get(self, key, default=UNSPECIFIED): + def get(self, key, default=None): try: return self[key] except KeyError: - if default is UNSPECIFIED: - return self._deserialize(key, None) return default def _record_change(self, key, from_, to): @@ -182,18 +180,22 @@ def serialized_changes(self, keep=False): return serialized def __setitem__(self, key, value, force=False): + if isinstance(value, dict) and not isinstance(value, DirtyableDict): + value = DirtyableDict(value) + elif isinstance(value, list) and not isinstance(value, DirtyableList): + value = DirtyableList(value) + existing_value = self.get(key) - if not existing_value and not value: - # Do not attempt to record changes if both the existing - # and previous values are Falsy. We cannot distinguish - # between `''` and `None` for...reasons. - return False if force or value != existing_value: - self._record_change( - key, - self.get(key), - value, - ) + if force or existing_value or value: + # Do not attempt to record changes if both the existing + # and previous values are Falsy. We cannot distinguish + # between `''` and `None` for...reasons. + self._record_change( + key, + self.get(key), + value, + ) # Serialize just to make sure we can; it's better to throw # this error early. diff --git a/taskw/test/test_task.py b/taskw/test/test_task.py index f09bea2..8c59abf 100644 --- a/taskw/test/test_task.py +++ b/taskw/test/test_task.py @@ -27,11 +27,13 @@ def setUp(self): }) def test_append_when_absent(self): + self.task['annotations'] = [] self.task['annotations'].append('awesome') self.assertEqual(self.task['annotations'], ['awesome']) def test_append_when_absent_but_with_tags(self): self.task = Task({'uuid': str(uuid.uuid4()), 'description': 'Test'}) + self.task['tags'] = [] self.task['tags'].append('awesome') self.assertEqual(self.task['tags'], ['awesome'])