changeset 39353:0d21b1f1722c

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
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 27 Aug 2018 09:02:39 -0700
parents 035517d48865
children 5ed7c6caf24d
files mercurial/utils/stringutil.py
diffstat 1 files changed, 15 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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"""