From 582568f180943d8b0be66e3e621bec838621d8a4 Mon Sep 17 00:00:00 2001 Message-Id: <582568f180943d8b0be66e3e621bec838621d8a4.1716268747.git.mdw@distorted.org.uk> From: Mark Wooding Date: Mon, 1 May 2017 01:38:30 +0100 Subject: [PATCH] catacomb/__init__.py: Abstract out common pretty-printing patterns. Organization: Straylight/Edgeware From: Mark Wooding Don't hardwire indentation levels from header lengths; don't hardwire type names; hide away the ugly `type(me).__name__' rune. --- catacomb/__init__.py | 123 ++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 66 deletions(-) diff --git a/catacomb/__init__.py b/catacomb/__init__.py index d0478ce..f943680 100644 --- a/catacomb/__init__.py +++ b/catacomb/__init__.py @@ -84,9 +84,14 @@ def _checkend(r): ## Some pretty-printing utilities. def _pp_str(me, pp, cyclep): pp.text(cyclep and '...' or str(me)) +def _pp_bgroup(pp, text): + ind = len(text) + pp.begin_group(ind, text) + return ind +def _pp_bgroup_tyname(pp, obj, open = '('): + return _pp_bgroup(pp, type(obj).__name__ + open) def _pp_kv(pp, k, v): - ind = len(k) + 3 - pp.begin_group(ind, k + ' = ') + ind = _pp_bgroup(pp, k + ' = ') pp.pretty(v) pp.end_group(ind, '') def _pp_commas(pp, printfn, items): @@ -97,14 +102,14 @@ def _pp_commas(pp, printfn, items): printfn(i) def _pp_dict(pp, items): def p((k, v)): - pp.begin_group(0, '') + pp.begin_group(0) pp.pretty(k) pp.text(':') - pp.begin_group(2, '') + pp.begin_group(2) pp.breakable() pp.pretty(v) - pp.end_group(2, '') - pp.end_group(0, '') + pp.end_group(2) + pp.end_group(0) _pp_commas(pp, p, items) ###-------------------------------------------------------------------------- @@ -254,14 +259,10 @@ class _tmp: def __repr__(me): return '%s(%sL)' % (type(me).__name__, me.p) def __hash__(me): return 0x114401de ^ hash(me.p) def _repr_pretty_(me, pp, cyclep): - tyname = type(me).__name__ - if cyclep: - pp.text(tyname + '(...)') - else: - ind = len(tyname) + 1 - pp.begin_group(ind, tyname + '(') - pp.pretty(me.p) - pp.end_group(ind, ')') + ind = _pp_bgroup_tyname(pp, me) + if cyclep: pp.text('...') + else: pp.pretty(me.p) + pp.end_group(ind, ')') def ec(me, a, b): return ECPrimeProjCurve(me, a, b) _augment(PrimeField, _tmp) @@ -269,14 +270,10 @@ class _tmp: def __repr__(me): return '%s(%#xL)' % (type(me).__name__, me.p) def ec(me, a, b): return ECBinProjCurve(me, a, b) def _repr_pretty_(me, pp, cyclep): - tyname = type(me).__name__ - if cyclep: - pp.text(tyname + '(...)') - else: - ind = len(tyname) + 1 - pp.begin_group(ind, tyname + '(') - pp.text('%#x' % me.p) - pp.end_group(ind, ')') + ind = _pp_bgroup_tyname(pp, me) + if cyclep: pp.text('...') + else: pp.text('%#x' % me.p) + pp.end_group(ind, ')') _augment(BinField, _tmp) class _tmp: @@ -304,16 +301,14 @@ class _tmp: def __repr__(me): return '%s(%r, %s, %s)' % (type(me).__name__, me.field, me.a, me.b) def _repr_pretty_(me, pp, cyclep): - tyname = type(me).__name__ + ind = _pp_bgroup_tyname(pp, me) if cyclep: - pp.text(tyname + '(...)') + pp.text('...') else: - ind = len(tyname) + 1 - pp.begin_group(ind, tyname + '(') pp.pretty(me.field); pp.text(','); pp.breakable() pp.pretty(me.a); pp.text(','); pp.breakable() pp.pretty(me.b) - pp.end_group(ind, ')') + pp.end_group(ind, ')') def frombuf(me, s): return ecpt.frombuf(me, s) def fromraw(me, s): @@ -353,10 +348,10 @@ class _tmp: elif not me: pp.text('inf') else: - pp.begin_group(1, '(') + ind = _pp_bgroup(pp, '(') pp.pretty(me.ix); pp.text(','); pp.breakable() pp.pretty(me.iy) - pp.end_group(1, ')') + pp.end_group(ind, ')') _augment(ECPt, _tmp) class _tmp: @@ -364,15 +359,15 @@ class _tmp: return 'ECInfo(curve = %r, G = %r, r = %s, h = %s)' % \ (me.curve, me.G, me.r, me.h) def _repr_pretty_(me, pp, cyclep): + ind = _pp_bgroup_tyname(pp, me) if cyclep: - pp.text('ECInfo(...)') + pp.text('...') else: - pp.begin_group(7, 'ECInfo(') _pp_kv(pp, 'curve', me.curve); pp.text(','); pp.breakable() _pp_kv(pp, 'G', me.G); pp.text(','); pp.breakable() _pp_kv(pp, 'r', me.r); pp.text(','); pp.breakable() _pp_kv(pp, 'h', me.h) - pp.end_group(7, ')') + pp.end_group(ind, ')') def __hash__(me): h = 0x9bedb8de h ^= hash(me.curve) @@ -405,15 +400,15 @@ class _tmp: return 'KeySZRange(%d, %d, %d, %d)' % \ (me.default, me.min, me.max, me.mod) def _repr_pretty_(me, pp, cyclep): + ind = _pp_bgroup_tyname(pp, me) if cyclep: - pp.text('KeySZRange(...)') + pp.text('...') else: - pp.begin_group(11, 'KeySZRange(') pp.pretty(me.default); pp.text(','); pp.breakable() pp.pretty(me.min); pp.text(','); pp.breakable() pp.pretty(me.max); pp.text(','); pp.breakable() pp.pretty(me.mod) - pp.end_group(11, ')') + pp.end_group(ind, ')') def check(me, sz): return me.min <= sz <= me.max and sz % me.mod == 0 def best(me, sz): if sz < me.min: raise ValueError, 'key too small' @@ -424,15 +419,15 @@ _augment(KeySZRange, _tmp) class _tmp: def __repr__(me): return 'KeySZSet(%d, %s)' % (me.default, me.set) def _repr_pretty_(me, pp, cyclep): + ind = _pp_bgroup_tyname(pp, me) if cyclep: - pp.text('KeySZSet(...)') + pp.text('...') else: - pp.begin_group(9, 'KeySZSet(') pp.pretty(me.default); pp.text(','); pp.breakable() - pp.begin_group(1, '{') + ind1 = _pp_bgroup(pp, '{') _pp_commas(pp, pp.pretty, me.set) - pp.end_group(1, '}') - pp.end_group(9, ')') + pp.end_group(ind1, '}') + pp.end_group(ind, ')') def check(me, sz): return sz in me.set def best(me, sz): found = -1 @@ -458,75 +453,75 @@ class _tmp: return 'KeyAttributes({%s})' % \ ', '.join(['%r: %r' % kv for kv in me.iteritems()]) def _repr_pretty_(me, pp, cyclep): - pp.begin_group(14, 'KeyAttributes(') + ind = _pp_bgroup_tyname(pp, me) if cyclep: pp.text('...') else: _pp_dict(pp, me.iteritems()) - pp.end_group(14, ')') + pp.end_group(ind, ')') _augment(KeyAttributes, _tmp) class _tmp: def __repr__(me): return 'KeyDataBinary(%r, %r)' % \ (me.bin, me.writeflags(me.flags)) def _repr_pretty_(me, pp, cyclep): - pp.begin_group(14, 'KeyDataBinary(') + ind = _pp_bgroup_tyname(pp, me) if cyclep: - pp.text('KeyDataBinary(...)') + pp.text('...') else: pp.pretty(me.bin); pp.text(','); pp.breakable() pp.pretty(me.writeflags(me.flags)) - pp.end_group(14, ')') + pp.end_group(ind, ')') _augment(KeyDataBinary, _tmp) class _tmp: def __repr__(me): return 'KeyDataEncrypted(%r, %r)' % \ (me.ct, me.writeflags(me.flags)) def _repr_pretty_(me, pp, cyclep): - pp.begin_group(17, 'KeyDataEncrypted(') + ind = _pp_bgroup_tyname(pp, me) if cyclep: pp.text('...') else: pp.pretty(me.ct); pp.text(','); pp.breakable() pp.pretty(me.writeflags(me.flags)) - pp.end_group(17, ')') + pp.end_group(ind, ')') _augment(KeyDataEncrypted, _tmp) class _tmp: def __repr__(me): return 'KeyDataMP(%r, %r)' % \ (me.mp, me.writeflags(me.flags)) def _repr_pretty_(me, pp, cyclep): - pp.begin_group(10, 'KeyDataMP(') + ind = _pp_bgroup_tyname(pp, me) if cyclep: pp.text('...') else: pp.pretty(me.mp); pp.text(','); pp.breakable() pp.pretty(me.writeflags(me.flags)) - pp.end_group(10, ')') + pp.end_group(ind, ')') _augment(KeyDataMP, _tmp) class _tmp: def __repr__(me): return 'KeyDataString(%r)' % \ (me.str, me.writeflags(me.flags)) def _repr_pretty_(me, pp, cyclep): - pp.begin_group(14, 'KeyDataString(') + ind = _pp_bgroup_tyname(pp, me) if cyclep: pp.text('...') else: pp.pretty(me.str); pp.text(','); pp.breakable() pp.pretty(me.writeflags(me.flags)) - pp.end_group(14, ')') + pp.end_group(ind, ')') _augment(KeyDataString, _tmp) class _tmp: def __repr__(me): return 'KeyDataECPt(%r)' % \ (me.ecpt, me.writeflags(me.flags)) def _repr_pretty_(me, pp, cyclep): - pp.begin_group(12, 'KeyDataECPt(') + ind = _pp_bgroup_tyname(pp, me) if cyclep: pp.text('...') else: pp.pretty(me.ecpt); pp.text(','); pp.breakable() pp.pretty(me.writeflags(me.flags)) - pp.end_group(12, ')') + pp.end_group(ind, ')') _augment(KeyDataECPt, _tmp) class _tmp: @@ -534,10 +529,10 @@ class _tmp: return 'KeyDataStructured({%s})' % \ ', '.join(['%r: %r' % kv for kv in me.iteritems()]) def _repr_pretty_(me, pp, cyclep): - pp.begin_group(20, 'KeyDataStructured({ ') + ind = _pp_bgroup_tyname(pp, me, '({ ') if cyclep: pp.text('...') else: _pp_dict(pp, me.iteritems()) - pp.end_group(20, ' })') + pp.end_group(ind, ' })') _augment(KeyDataStructured, _tmp) ###-------------------------------------------------------------------------- @@ -548,16 +543,14 @@ class _tmp: return '%s(p = %s, r = %s, g = %s)' % \ (type(me).__name__, me.p, me.r, me.g) def _repr_pretty_(me, pp, cyclep): - tyname = type(me).__name__ + ind = _pp_bgroup_tyname(pp, me) if cyclep: - pp.text(tyname + '(...)') + pp.text('...') else: - ind = len(tyname) + 1 - pp.begin_group(ind, tyname + '(') _pp_kv(pp, 'p', me.p); pp.text(','); pp.breakable() _pp_kv(pp, 'r', me.r); pp.text(','); pp.breakable() _pp_kv(pp, 'g', me.g) - pp.end_group(ind, ')') + pp.end_group(ind, ')') _augment(FGInfo, _tmp) class _tmp: @@ -744,12 +737,10 @@ class _groupmap (object): def __repr__(me): return '{%s}' % ', '.join(['%r: %r' % kv for kv in me.iteritems()]) def _repr_pretty_(me, pp, cyclep): - if cyclep: - pp.text('{ ... }') - else: - pp.begin_group(2, '{ ') - _pp_dict(pp, me.iteritems()) - pp.end_group(2, ' }') + ind = _pp_bgroup(pp, '{ ') + if cyclep: pp.text('...') + else: _pp_dict(pp, me.iteritems()) + pp.end_group(ind, ' }') def __len__(me): return me._n def __contains__(me, k): -- [mdw]