mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-05-01 05:08:10 -07:00
Also pull in a few bugfixes from upstream and fix a DeprecationWarning in the tests. Package-Manager: Portage-2.3.5, Repoman-2.3.2
123 lines
4.0 KiB
Diff
123 lines
4.0 KiB
Diff
commit c9f8318bd823ae9d44797b6b881a2b3e22cdbade
|
|
Author: Joakim Hamren <joakim.hamren@gmail.com>
|
|
Date: Tue Feb 7 02:02:38 2017 +0100
|
|
|
|
Fix for incorrect order when using OrderedDict
|
|
|
|
diff --git a/python/objToJSON.c b/python/objToJSON.c
|
|
index abe6588..9e6a390 100644
|
|
--- a/python/objToJSON.c
|
|
+++ b/python/objToJSON.c
|
|
@@ -253,8 +253,13 @@ static int Dict_iterNext(JSOBJ obj, JSONTypeContext *tc)
|
|
GET_TC(tc)->itemName = NULL;
|
|
}
|
|
|
|
+ if (!(GET_TC(tc)->itemName = PyIter_Next(GET_TC(tc)->iterator)))
|
|
+ {
|
|
+ PRINTMARK();
|
|
+ return 0;
|
|
+ }
|
|
|
|
- if (!PyDict_Next ( (PyObject *)GET_TC(tc)->dictObj, &GET_TC(tc)->index, &GET_TC(tc)->itemName, &GET_TC(tc)->itemValue))
|
|
+ if (!(GET_TC(tc)->itemValue = PyObject_GetItem(GET_TC(tc)->dictObj, GET_TC(tc)->itemName)))
|
|
{
|
|
PRINTMARK();
|
|
return 0;
|
|
@@ -295,6 +300,7 @@ static void Dict_iterEnd(JSOBJ obj, JSONTypeContext *tc)
|
|
Py_DECREF(GET_TC(tc)->itemName);
|
|
GET_TC(tc)->itemName = NULL;
|
|
}
|
|
+ Py_CLEAR(GET_TC(tc)->iterator);
|
|
Py_DECREF(GET_TC(tc)->dictObj);
|
|
PRINTMARK();
|
|
}
|
|
@@ -425,20 +431,23 @@ static char *SortedDict_iterGetName(JSOBJ obj, JSONTypeContext *tc, size_t *outL
|
|
|
|
static void SetupDictIter(PyObject *dictObj, TypeContext *pc, JSONObjectEncoder *enc)
|
|
{
|
|
- if (enc->sortKeys) {
|
|
+ pc->dictObj = dictObj;
|
|
+ if (enc->sortKeys)
|
|
+ {
|
|
pc->iterEnd = SortedDict_iterEnd;
|
|
pc->iterNext = SortedDict_iterNext;
|
|
pc->iterGetValue = SortedDict_iterGetValue;
|
|
pc->iterGetName = SortedDict_iterGetName;
|
|
+ pc->index = 0;
|
|
}
|
|
- else {
|
|
+ else
|
|
+ {
|
|
pc->iterEnd = Dict_iterEnd;
|
|
pc->iterNext = Dict_iterNext;
|
|
pc->iterGetValue = Dict_iterGetValue;
|
|
pc->iterGetName = Dict_iterGetName;
|
|
+ pc->iterator = PyObject_GetIter(dictObj);
|
|
}
|
|
- pc->dictObj = dictObj;
|
|
- pc->index = 0;
|
|
}
|
|
|
|
static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObjectEncoder *enc)
|
|
@@ -446,7 +455,8 @@ static void Object_beginTypeContext (JSOBJ _obj, JSONTypeContext *tc, JSONObject
|
|
PyObject *obj, *objRepr, *exc;
|
|
TypeContext *pc;
|
|
PRINTMARK();
|
|
- if (!_obj) {
|
|
+ if (!_obj)
|
|
+ {
|
|
tc->type = JT_INVALID;
|
|
return;
|
|
}
|
|
diff --git a/tests/tests.py b/tests/tests.py
|
|
index cd928e6..b7e46af 100644
|
|
--- a/tests/tests.py
|
|
+++ b/tests/tests.py
|
|
@@ -10,6 +10,8 @@ import json
|
|
import math
|
|
import time
|
|
import pytz
|
|
+from collections import OrderedDict
|
|
+
|
|
if six.PY2:
|
|
import unittest2 as unittest
|
|
else:
|
|
@@ -383,6 +385,10 @@ class UltraJSONTests(unittest.TestCase):
|
|
input = -float('inf')
|
|
self.assertRaises(OverflowError, ujson.encode, input)
|
|
|
|
+ def test_encodeOrderedDict(self):
|
|
+ input = OrderedDict([(1, 1), (0, 0), (8, 8), (2, 2)])
|
|
+ self.assertEqual('{"1":1,"0":0,"8":8,"2":2}', ujson.encode(input))
|
|
+
|
|
def test_decodeJibberish(self):
|
|
input = "fdsa sda v9sa fdsa"
|
|
self.assertRaises(ValueError, ujson.decode, input)
|
|
@@ -668,7 +674,7 @@ class UltraJSONTests(unittest.TestCase):
|
|
d = {u'key': JSONTest()}
|
|
output = ujson.encode(d)
|
|
dec = ujson.decode(output)
|
|
- self.assertEquals(dec, {u'key': output_text})
|
|
+ self.assertEqual(dec, {u'key': output_text})
|
|
|
|
def test_object_with_json_unicode(self):
|
|
# If __json__ returns a string, then that string
|
|
@@ -681,7 +687,7 @@ class UltraJSONTests(unittest.TestCase):
|
|
d = {u'key': JSONTest()}
|
|
output = ujson.encode(d)
|
|
dec = ujson.decode(output)
|
|
- self.assertEquals(dec, {u'key': output_text})
|
|
+ self.assertEqual(dec, {u'key': output_text})
|
|
|
|
def test_object_with_complex_json(self):
|
|
# If __json__ returns a string, then that string
|
|
@@ -694,7 +700,7 @@ class UltraJSONTests(unittest.TestCase):
|
|
d = {u'key': JSONTest()}
|
|
output = ujson.encode(d)
|
|
dec = ujson.decode(output)
|
|
- self.assertEquals(dec, {u'key': obj})
|
|
+ self.assertEqual(dec, {u'key': obj})
|
|
|
|
def test_object_with_json_type_error(self):
|
|
# __json__ must return a string, otherwise it should raise an error.
|