jsonutils: add set() tests and simplify recursive code

Change-Id: I6fd3a78d2caee2e4891d00530350407d407ff677
This commit is contained in:
Julien Danjou 2015-01-14 16:04:36 +01:00
parent 73f7155af2
commit 22cea10c38
2 changed files with 11 additions and 7 deletions

View File

@ -141,8 +141,6 @@ def to_primitive(value, convert_instances=False, convert_datetime=True,
max_depth=max_depth)
if isinstance(value, dict):
return dict((k, recursive(v)) for k, v in six.iteritems(value))
elif isinstance(value, (list, tuple)):
return [recursive(lv) for lv in value]
# It's not clear why xmlrpclib created their own DateTime type, but
# for our purposes, make it a datetime type which is explicitly
@ -155,17 +153,16 @@ def to_primitive(value, convert_instances=False, convert_datetime=True,
elif hasattr(value, 'iteritems'):
return recursive(dict(value.iteritems()), level=level + 1)
elif hasattr(value, '__iter__'):
return recursive(list(value))
return list(map(recursive, value))
elif convert_instances and hasattr(value, '__dict__'):
# Likely an instance of something. Watch for cycles.
# Ignore class member vars.
return recursive(value.__dict__, level=level + 1)
elif netaddr and isinstance(value, netaddr.IPAddress):
return six.text_type(value)
else:
if any(test(value) for test in _nasty_type_tests):
return six.text_type(value)
return value
elif any(test(value) for test in _nasty_type_tests):
return six.text_type(value)
return value
except TypeError:
# Class objects are tricky since they may define something like
# __iter__ defined but it isn't callable as list().

View File

@ -74,6 +74,10 @@ class JSONUtilsTestMixin(object):
jsonutils.dumps(
uuid.UUID("87edfaf49bff11e482bdb7b4e88d3780")))
def test_dump_set(self):
# Only test with one entry because the order is random :]
self.assertEqual("[1]", jsonutils.dumps(set([1])))
def test_loads(self):
self.assertEqual({'a': 'b'}, jsonutils.loads('{"a": "b"}'))
@ -123,6 +127,9 @@ class ToPrimitiveTestCase(test_base.BaseTestCase):
def test_list(self):
self.assertEqual(jsonutils.to_primitive([1, 2, 3]), [1, 2, 3])
def test_set(self):
self.assertEqual(jsonutils.to_primitive(set([1, 2, 3])), [1, 2, 3])
def test_empty_list(self):
self.assertEqual(jsonutils.to_primitive([]), [])