diff --git a/taskflow/tests/unit/test_failure.py b/taskflow/tests/unit/test_failure.py index 4ecaa83c..bad99456 100644 --- a/taskflow/tests/unit/test_failure.py +++ b/taskflow/tests/unit/test_failure.py @@ -152,6 +152,14 @@ class FailureObjectTestCase(test.TestCase): } self.assertRaises(exceptions.InvalidFormat, failure.Failure.validate, f) + f = { + 'exception_str': 'blah', + 'traceback_str': 'blah', + 'exc_type_names': ['Exception'], + 'version': -1, + } + self.assertRaises(exceptions.InvalidFormat, + failure.Failure.validate, f) def test_valid_from_dict_to_dict(self): f = _captured_failure('Woot!') diff --git a/taskflow/types/failure.py b/taskflow/types/failure.py index 91cd4903..72f3710f 100644 --- a/taskflow/types/failure.py +++ b/taskflow/types/failure.py @@ -121,6 +121,7 @@ class Failure(mixins.StrMixin): backport at https://pypi.python.org/pypi/traceback2/ to (hopefully) simplify the methods and contents of this object... """ + DICT_VERSION = 1 BASE_EXCEPTIONS = ('BaseException', 'Exception') """ @@ -136,6 +137,10 @@ class Failure(mixins.StrMixin): "cause": { "type": "object", 'properties': { + 'version': { + "type": "integer", + "minimum": 0, + }, 'exception_str': { "type": "string", }, @@ -462,6 +467,10 @@ class Failure(mixins.StrMixin): def from_dict(cls, data): """Converts this from a dictionary to a object.""" data = dict(data) + version = data.pop('version', None) + if version != cls.DICT_VERSION: + raise ValueError('Invalid dict version of failure object: %r' + % version) causes = data.get('causes') if causes is not None: data['causes'] = tuple(cls.from_dict(d) for d in causes) @@ -473,6 +482,7 @@ class Failure(mixins.StrMixin): 'exception_str': self.exception_str, 'traceback_str': self.traceback_str, 'exc_type_names': list(self), + 'version': self.DICT_VERSION, 'causes': [f.to_dict() for f in self.causes], }