diff options
author | Idan Kamara <idankk86@gmail.com> | 2013-10-05 20:16:17 +0300 |
---|---|---|
committer | Idan Kamara <idankk86@gmail.com> | 2013-10-05 20:16:17 +0300 |
commit | e787c8b9d1155023089937314fd2b965821f2108 (patch) | |
tree | 3a157de5d07e2ba1319c69baf396946a51d2bef0 /simplejson | |
parent | 35816bfe2d0ddeb5ddcc68239683cbb35b7e3ff2 (diff) | |
download | simplejson-e787c8b9d1155023089937314fd2b965821f2108.tar.gz |
fix pickle breakage with JSONDecodeError
pickle doesn't behave correctly with custom Exceptions, we workaround the issue
by explicitly defining how to pickle JSONDecodeError.
Diffstat (limited to 'simplejson')
-rw-r--r-- | simplejson/scanner.py | 3 | ||||
-rw-r--r-- | simplejson/tests/test_errors.py | 18 |
2 files changed, 20 insertions, 1 deletions
diff --git a/simplejson/scanner.py b/simplejson/scanner.py index 6a0099f..b7918b3 100644 --- a/simplejson/scanner.py +++ b/simplejson/scanner.py @@ -41,6 +41,9 @@ class JSONDecodeError(ValueError): else: self.endlineno, self.endcolno = None, None + def __reduce__(self): + return self.__class__, (self.msg, self.doc, self.pos, self.end) + def linecol(doc, pos): lineno = doc.count('\n', 0, pos) + 1 diff --git a/simplejson/tests/test_errors.py b/simplejson/tests/test_errors.py index 6bc2fc8..e86121d 100644 --- a/simplejson/tests/test_errors.py +++ b/simplejson/tests/test_errors.py @@ -1,4 +1,4 @@ -import sys +import sys, pickle from unittest import TestCase import simplejson as json @@ -33,3 +33,19 @@ class TestErrors(TestCase): self.fail('Expected JSONDecodeError') self.assertEqual(err.lineno, 1) self.assertEqual(err.colno, 10) + + def test_error_is_pickable(self): + err = None + try: + json.loads('{}\na\nb') + except json.JSONDecodeError: + err = sys.exc_info()[1] + else: + self.fail('Expected JSONDecodeError') + s = pickle.dumps(err) + e = pickle.loads(s) + + self.assertEquals(err.msg, e.msg) + self.assertEquals(err.doc, e.doc) + self.assertEquals(err.pos, e.pos) + self.assertEquals(err.end, e.end) |