# HG changeset patch # User Gregory Szorc # Date 2018-08-27 16:02:39 # Node ID 0d21b1f1722c21336d9cda441d53de76ff8f16e2 # Parent 035517d48865b26588dbb6966a2bd0e10d66d006 stringutil: refactor core of pprint so it emits chunks This commit splits the core of pprint() to a new function that is a generator of chunks instead of a function returning a single value. This will make it possible to stream output without waiting for all data to be formatted first. And it will make it easier to implement support for indenting. Differential Revision: https://phab.mercurial-scm.org/D4397 diff --git a/mercurial/utils/stringutil.py b/mercurial/utils/stringutil.py --- a/mercurial/utils/stringutil.py +++ b/mercurial/utils/stringutil.py @@ -45,30 +45,36 @@ def reescape(pat): def pprint(o, bprefix=False): """Pretty print an object.""" + return b''.join(pprintgen(o, bprefix=bprefix)) + +def pprintgen(o, bprefix=False): + """Pretty print an object to a generator of atoms.""" + if isinstance(o, bytes): if bprefix: - return "b'%s'" % escapestr(o) - return "'%s'" % escapestr(o) + yield "b'%s'" % escapestr(o) + else: + yield "'%s'" % escapestr(o) elif isinstance(o, bytearray): # codecs.escape_encode() can't handle bytearray, so escapestr fails # without coercion. - return "bytearray['%s']" % escapestr(bytes(o)) + yield "bytearray['%s']" % escapestr(bytes(o)) elif isinstance(o, list): - return '[%s]' % (b', '.join(pprint(a, bprefix=bprefix) for a in o)) + yield '[%s]' % (b', '.join(pprint(a, bprefix=bprefix) for a in o)) elif isinstance(o, dict): - return '{%s}' % (b', '.join( + yield '{%s}' % (b', '.join( '%s: %s' % (pprint(k, bprefix=bprefix), pprint(v, bprefix=bprefix)) for k, v in sorted(o.items()))) elif isinstance(o, set): - return 'set([%s])' % (b', '.join( + yield 'set([%s])' % (b', '.join( pprint(k, bprefix=bprefix) for k in sorted(o))) elif isinstance(o, tuple): - return '(%s)' % (b', '.join(pprint(a, bprefix=bprefix) for a in o)) + yield '(%s)' % (b', '.join(pprint(a, bprefix=bprefix) for a in o)) elif isinstance(o, types.GeneratorType): - return 'gen[%s]' % (b', '.join(pprint(a, bprefix=bprefix) for a in o)) + yield 'gen[%s]' % (b', '.join(pprint(a, bprefix=bprefix) for a in o)) else: - return pycompat.byterepr(o) + yield pycompat.byterepr(o) def prettyrepr(o): """Pretty print a representation of a possibly-nested object"""