comparison mercurial/utils/stringutil.py @ 37300:2f859ad7ed8c

stringutil: add function to pretty print an object This is inspired by the pprint() module/function (which we can't use because the output is different on Python 2 and 3 - namely the use of b'' literals). We hook it up to `hg debugwireproto` for printing the response to a wire protocol command. This foreshadows future peer work, which will support decoding CBOR responses into rich data structures. Differential Revision: https://phab.mercurial-scm.org/D2987
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 28 Mar 2018 14:52:57 -0700
parents cc5a040fe150
children a67fd1fe5109
comparison
equal deleted inserted replaced
37299:e9aadee698cf 37300:2f859ad7ed8c
34 def escapedata(s): 34 def escapedata(s):
35 if isinstance(s, bytearray): 35 if isinstance(s, bytearray):
36 s = bytes(s) 36 s = bytes(s)
37 37
38 return _DATA_ESCAPE_RE.sub(lambda m: _DATA_ESCAPE_MAP[m.group(0)], s) 38 return _DATA_ESCAPE_RE.sub(lambda m: _DATA_ESCAPE_MAP[m.group(0)], s)
39
40 def pprint(o):
41 """Pretty print an object."""
42 if isinstance(o, (bytes, bytearray)):
43 return "b'%s'" % escapedata(o)
44 elif isinstance(o, list):
45 return '[%s]' % (b', '.join(pprint(a) for a in o))
46 elif isinstance(o, dict):
47 return '{%s}' % (b', '.join(
48 '%s: %s' % (pprint(k), pprint(v)) for k, v in sorted(o.items())))
49 elif isinstance(o, bool):
50 return b'True' if o else b'False'
51 else:
52 raise error.ProgrammingError('do not know how to format %r' % o)
39 53
40 def binary(s): 54 def binary(s):
41 """return true if a string is binary data""" 55 """return true if a string is binary data"""
42 return bool(s and '\0' in s) 56 return bool(s and '\0' in s)
43 57