return ','.join(task['uuid'] for task in value)
def deserialize_depends(self, raw_uuids):
- raw_uuids = raw_uuids or '' # Convert None to empty string
- uuids = raw_uuids.split(',')
+ raw_uuids = raw_uuids or [] # Convert None to empty list
+
+ # TW 2.4.4 encodes list of dependencies as a single string
+ if type(raw_uuids) is not list:
+ uuids = raw_uuids.split(',')
+ # TW 2.4.5 and later exports them as a list, no conversion needed
+ else:
+ uuids = raw_uuids
+
return set(self.warrior.tasks.get(uuid=uuid) for uuid in uuids if uuid)
def datetime_normalizer(self, value):
"task: %s" % '\n'.join(id_lines))
# Circumvent the ID storage, since ID is considered read-only
- self._data['id'] = int(id_lines[0].split(' ')[2].rstrip('.'))
+ identifier = id_lines[0].split(' ')[2].rstrip('.')
+
+ # Identifier can be either ID or UUID for completed tasks
+ try:
+ self._data['id'] = int(identifier)
+ except ValueError:
+ self._data['uuid'] = identifier
# Refreshing is very important here, as not only modification time
# is updated, but arbitrary attribute may have changed due hooks
'confirmation': 'no',
'dependency.confirmation': 'no', # See TW-1483 or taskrc man page
'recurrence.confirmation': 'no', # Necessary for modifying R tasks
+
+ # Defaults to on since 2.4.5, we expect off during parsing
+ 'json.array': 'off',
+
# 2.4.3 onwards supports 0 as infite bulk, otherwise set just
# arbitrary big number which is likely to be large enough
'bulk': 0 if self.version >= VERSION_2_4_3 else 100000,