_RE_EOLSP = re.compile('[ \t]+$', re.MULTILINE)
-def _GetJsonDumpers():
+def _GetJsonDumpers(_encoder_class=simplejson.JSONEncoder):
"""Returns two JSON functions to serialize data.
@rtype: (callable, callable)
generate a more readable, indented form of JSON (if supported)
"""
- plain_dump = simplejson.dumps
+ plain_encoder = _encoder_class(sort_keys=True)
# Check whether the simplejson module supports indentation
try:
- simplejson.dumps(1, indent=_JSON_INDENT)
+ indent_encoder = _encoder_class(indent=_JSON_INDENT, sort_keys=True)
except TypeError:
# Indentation not supported
- indent_dump = plain_dump
- else:
- # Indentation supported
- indent_dump = lambda data: simplejson.dumps(data, indent=_JSON_INDENT)
-
- assert callable(plain_dump)
- assert callable(indent_dump)
+ indent_encoder = plain_encoder
- return (plain_dump, indent_dump)
+ return (plain_encoder.encode, indent_encoder.encode)
(_DumpJson, _DumpJsonIndent) = _GetJsonDumpers()
]
def _TestSerializer(self, dump_fn, load_fn):
- for data in self._TESTDATA:
- self.failUnless(dump_fn(data).endswith("\n"))
- self.assertEqualValues(load_fn(dump_fn(data)), data)
+ for indent in [True, False]:
+ for data in self._TESTDATA:
+ self.failUnless(dump_fn(data, indent=indent).endswith("\n"))
+ self.assertEqualValues(load_fn(dump_fn(data, indent=indent)), data)
def testGeneric(self):
- return self._TestSerializer(serializer.Dump, serializer.Load)
+ self._TestSerializer(serializer.Dump, serializer.Load)
def testJson(self):
- return self._TestSerializer(serializer.DumpJson, serializer.LoadJson)
+ self._TestSerializer(serializer.DumpJson, serializer.LoadJson)
+
+ def testJsonIndent(self):
+ data = {
+ "k1": 1,
+ "k2": 3,
+ "k3": 4,
+ }
+ self.assert_(len(serializer.DumpJson(data, indent=True).splitlines()) > 3)
def testSignedMessage(self):
LoadSigned = serializer.LoadSigned