summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIdan Kamara <idankk86@gmail.com>2013-10-05 20:16:17 +0300
committerIdan Kamara <idankk86@gmail.com>2013-10-05 20:16:17 +0300
commite787c8b9d1155023089937314fd2b965821f2108 (patch)
tree3a157de5d07e2ba1319c69baf396946a51d2bef0
parent35816bfe2d0ddeb5ddcc68239683cbb35b7e3ff2 (diff)
downloadsimplejson-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.
-rw-r--r--simplejson/scanner.py3
-rw-r--r--simplejson/tests/test_errors.py18
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)