Revision 02141fb1

b/lib/serializer.py
42 42
_RE_EOLSP = re.compile('[ \t]+$', re.MULTILINE)
43 43

  
44 44

  
45
def _GetJsonDumpers():
45
def _GetJsonDumpers(_encoder_class=simplejson.JSONEncoder):
46 46
  """Returns two JSON functions to serialize data.
47 47

  
48 48
  @rtype: (callable, callable)
......
50 50
           generate a more readable, indented form of JSON (if supported)
51 51

  
52 52
  """
53
  plain_dump = simplejson.dumps
53
  plain_encoder = _encoder_class(sort_keys=True)
54 54

  
55 55
  # Check whether the simplejson module supports indentation
56 56
  try:
57
    simplejson.dumps(1, indent=_JSON_INDENT)
57
    indent_encoder = _encoder_class(indent=_JSON_INDENT, sort_keys=True)
58 58
  except TypeError:
59 59
    # Indentation not supported
60
    indent_dump = plain_dump
61
  else:
62
    # Indentation supported
63
    indent_dump = lambda data: simplejson.dumps(data, indent=_JSON_INDENT)
64

  
65
  assert callable(plain_dump)
66
  assert callable(indent_dump)
60
    indent_encoder = plain_encoder
67 61

  
68
  return (plain_dump, indent_dump)
62
  return (plain_encoder.encode, indent_encoder.encode)
69 63

  
70 64

  
71 65
(_DumpJson, _DumpJsonIndent) = _GetJsonDumpers()
b/test/ganeti.serializer_unittest.py
52 52
    ]
53 53

  
54 54
  def _TestSerializer(self, dump_fn, load_fn):
55
    for data in self._TESTDATA:
56
      self.failUnless(dump_fn(data).endswith("\n"))
57
      self.assertEqualValues(load_fn(dump_fn(data)), data)
55
    for indent in [True, False]:
56
      for data in self._TESTDATA:
57
        self.failUnless(dump_fn(data, indent=indent).endswith("\n"))
58
        self.assertEqualValues(load_fn(dump_fn(data, indent=indent)), data)
58 59

  
59 60
  def testGeneric(self):
60
    return self._TestSerializer(serializer.Dump, serializer.Load)
61
    self._TestSerializer(serializer.Dump, serializer.Load)
61 62

  
62 63
  def testJson(self):
63
    return self._TestSerializer(serializer.DumpJson, serializer.LoadJson)
64
    self._TestSerializer(serializer.DumpJson, serializer.LoadJson)
65

  
66
  def testJsonIndent(self):
67
    data = {
68
      "k1": 1,
69
      "k2": 3,
70
      "k3": 4,
71
      }
72
    self.assert_(len(serializer.DumpJson(data, indent=True).splitlines()) > 3)
64 73

  
65 74
  def testSignedMessage(self):
66 75
    LoadSigned = serializer.LoadSigned

Also available in: Unified diff