D4397: stringutil: refactor core of pprint so it emits chunks
indygreg (Gregory Szorc)
phabricator at mercurial-scm.org
Mon Aug 27 16:15:39 UTC 2018
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.
REVISION SUMMARY
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.
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D4397
AFFECTED FILES
mercurial/utils/stringutil.py
CHANGE DETAILS
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 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"""
To: indygreg, #hg-reviewers
Cc: mercurial-devel
More information about the Mercurial-devel
mailing list