stringutil: refactor core of pprint so it emits chunks
authorGregory Szorc <gregory.szorc@gmail.com>
Mon, 27 Aug 2018 09:02:39 -0700
changeset 39353 0d21b1f1722c
parent 39352 035517d48865
child 39354 5ed7c6caf24d
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
mercurial/utils/stringutil.py
--- a/mercurial/utils/stringutil.py	Wed Jul 25 13:28:36 2018 -0400
+++ b/mercurial/utils/stringutil.py	Mon Aug 27 09:02:39 2018 -0700
@@ -45,30 +45,36 @@
 
 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"""