From 2cf87dedb43d30d017fec6731c48e4823572baca Mon Sep 17 00:00:00 2001 From: Christopher Haster Date: Fri, 6 Feb 2026 19:05:22 -0600 Subject: [PATCH] scripts: csv.py: Added -H/--hlabel and --tlabel These are useful for customizing the table renderer's header and total labels: ./scripts/csv.py test.csv -ba -fc \ -Hc='c(MiB/s)' \ --tlabel='wow so many (%(c)s)' a c(MiB/s) x 6 wow so many (6) 6 In theory header labels could be controlled by the field names themselves, but our use of Python's namedtuples internal is quite limiting. The immediate use case is -Hprobe=bench+probe in the bench-related rules, but it may also be useful for adding units such as in the above example. --- I considered adding these to all csv scripts, but decided that was too much. punescape modifiers are probably a good line for what should be limited to csv.py. --- Makefile | 5 ++++ scripts/code.py | 31 +++++++++++-------- scripts/cov.py | 31 +++++++++++-------- scripts/csv.py | 75 +++++++++++++++++++++++++++++++++------------- scripts/ctx.py | 37 +++++++++++++---------- scripts/data.py | 31 +++++++++++-------- scripts/perf.py | 37 +++++++++++++---------- scripts/perfbd.py | 37 +++++++++++++---------- scripts/stack.py | 37 +++++++++++++---------- scripts/structs.py | 37 +++++++++++++---------- 10 files changed, 219 insertions(+), 139 deletions(-) diff --git a/Makefile b/Makefile index 784eb3f1..b40fb7ab 100644 --- a/Makefile +++ b/Makefile @@ -609,6 +609,7 @@ bench-marks: $(BENCH_CSV) -ft='max(float(bench_simtime)/1.0e9)' \ -o-) \ -bprobe \ + -Hprobe=bench+probe \ -fn \ -ft \ -fthroughput='avg(float(n) / max(t, 1.0e-9))' \ @@ -641,6 +642,7 @@ bench-marks-diff: $(BENCH_CSV) -ft='max(float(bench_simtime)/1.0e9)' \ -o-) \ -bprobe \ + -Hprobe=bench+probe \ -fthroughput='avg(float(n) / max(t, 1.0e-9))' \ $(SUMMARYFLAGS)) @@ -660,6 +662,7 @@ bench-bottlenecks: $(BENCH_CSV) -fruntime='max(bench_runtime)' \ -o-) \ -bprobe \ + -Hprobe=bench+probe \ -fn \ -ft \ -fruntime \ @@ -674,6 +677,7 @@ bench-ops: $(BENCH_CSV) commit,namelookup,$\ write,stat,read \ -bprobe='%(case)s+%(probe)s' \ + -Hprobe=bench+probe \ -Fi='min(enumerate())' \ -freads='bench_reads' \ -fprogs='bench_progs' \ @@ -692,6 +696,7 @@ bench-widths: $(BENCH_CSV) commit,namelookup,$\ write,stat,read \ -bprobe='%(case)s+%(probe)s' \ + -Hprobe=bench+probe \ -Fi='min(enumerate())' \ -freaded="avg(saturate(ffrac( \ float(bench_readed)/float(bench_reads), \ diff --git a/scripts/code.py b/scripts/code.py index 2a9e8bbb..b269e67d 100755 --- a/scripts/code.py +++ b/scripts/code.py @@ -599,13 +599,15 @@ def fold(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -662,7 +664,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -670,14 +673,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -822,20 +825,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -867,7 +870,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize diff --git a/scripts/cov.py b/scripts/cov.py index 11daaa96..6a1b961e 100755 --- a/scripts/cov.py +++ b/scripts/cov.py @@ -468,13 +468,15 @@ def fold(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -531,7 +533,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -539,14 +542,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -691,20 +694,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -736,7 +739,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize diff --git a/scripts/csv.py b/scripts/csv.py index 489754ab..dcd3aceb 100755 --- a/scripts/csv.py +++ b/scripts/csv.py @@ -1776,6 +1776,15 @@ def punescape(s, attrs=None): return re.sub(pattern, unescape, s) +class PunescapeGetattr: + def __init__(self, r): + self.r = r + def __getitem__(self, k): + try: + return getattr(self.r, k) + except AttributeError: + raise KeyError(k) + def punescape_help(): print('mods:') print(' %-21s %s' % ('%%', 'A literal % character')) @@ -1916,7 +1925,7 @@ def compile(fields_, results, for k, reverse in it.chain(sort or [], hot or []): # this defaults to typechecking sort/hot fields, which is # probably safer, if you really want to sort by strings you - # can use --by + --label to create hidden by fields + # can use -B/--hidden-by to create hidden by fields if k and k not in by and k not in fields: fields.append(k) # make sure all expr targets are in fields so they get typechecked @@ -2229,13 +2238,15 @@ def hotify(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -2292,7 +2303,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -2300,14 +2312,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -2452,20 +2464,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -2497,7 +2509,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize @@ -2911,6 +2925,8 @@ def main(csv_paths, *, children=None, hot=None, notes=None, + hlabels=None, + tlabel=None, **args): # show mod help text? if args.get('help_mods'): @@ -3000,14 +3016,13 @@ def main(csv_paths, *, ((k, v) for (k, v), reverse in (hot or []))) if v is not None] - # figure out labels/by/fields - labels__ = None + # figure out by/hidden/fields by__ = [] + hidden__ = None fields__ = [] - if by is not None and any(not hidden for (k, v), hidden in by): - labels__ = [k for (k, v), hidden in by if not hidden] if by is not None: by__ = [k for (k, v), hidden in by] + hidden__ = {k for (k, v), hidden in by if hidden} if fields is not None: fields__ = [k for (k, v), hidden in fields if not hidden @@ -3047,8 +3062,8 @@ def main(csv_paths, *, and not any(k == k_ for _, expr in exprs for k_ in expr.fields())) - labels = labels__ by = by__ + hidden = hidden__ fields = fields__ # filter exprs from sort/hot @@ -3145,9 +3160,15 @@ def main(csv_paths, *, table(Result, results, diff_results, by=by, fields=fields, + hidden=hidden, sort=sort, - labels=labels, depth=depth, + hlabel=(lambda hlabels_: (lambda k: + punescape(hlabels_[k]) if k in hlabels_ else k) + )(dict(hlabels)) + if hlabels else None, + tlabel=(lambda r: punescape(tlabel, PunescapeGetattr(r))) + if tlabel else None, **args) @@ -3374,6 +3395,20 @@ if __name__ == "__main__": const='notes', action='append', help="Field to use for notes. Defaults to 'notes'.") + parser.add_argument( + '-H', '--hlabel', + dest='hlabels', + action='append', + type=lambda x: ( + lambda k, v: ( + k.strip(), + v.strip()) + )(*x.split('=', 1)), + help="Change the default header label for a given field. " + "Accepts %% modifiers.") + parser.add_argument( + '--tlabel', + help="Change the default TOTAL label. Accepts %% modifiers.") parser.add_argument( '--no-header', action='store_true', diff --git a/scripts/ctx.py b/scripts/ctx.py index ebe27d9d..01d8919f 100755 --- a/scripts/ctx.py +++ b/scripts/ctx.py @@ -858,13 +858,15 @@ def hotify(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -921,7 +923,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -929,14 +932,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -1081,20 +1084,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -1126,7 +1129,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize @@ -1307,13 +1312,13 @@ def main(obj_paths, *, hot=None, **args): # figure out what fields we're interested in - labels = None + hidden = None if by is None: if args.get('output') or args.get('output_json'): by = CtxResult._by elif depth is not None or hot is not None: by = ['z', 'i', 'function'] - labels = ['function'] + hidden = {'z', 'i'} else: by = ['function'] @@ -1403,8 +1408,8 @@ def main(obj_paths, *, table(CtxResult, results, diff_results, by=by, fields=fields, + hidden=hidden, sort=sort, - labels=labels, depth=depth, **args) diff --git a/scripts/data.py b/scripts/data.py index 626e8ca6..72f3a205 100755 --- a/scripts/data.py +++ b/scripts/data.py @@ -599,13 +599,15 @@ def fold(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -662,7 +664,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -670,14 +673,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -822,20 +825,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -867,7 +870,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize diff --git a/scripts/perf.py b/scripts/perf.py index 84f22360..5cfd4eae 100755 --- a/scripts/perf.py +++ b/scripts/perf.py @@ -957,13 +957,15 @@ def hotify(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -1020,7 +1022,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -1028,14 +1031,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -1180,20 +1183,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -1225,7 +1228,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize @@ -1515,7 +1520,7 @@ def main_(perf_paths, *, args['color'] = False # figure out what fields we're interested in - labels = None + hidden = None if by is None: if (args.get('annotate') or args.get('threshold') @@ -1524,7 +1529,7 @@ def main_(perf_paths, *, by = PerfResult._by elif depth is not None or hot is not None: by = ['z', 'function'] - labels = ['function'] + hidden = {'z'} else: by = ['function'] @@ -1628,8 +1633,8 @@ def main_(perf_paths, *, table(PerfResult, results, diff_results, by=by, fields=fields, + hidden=hidden, sort=sort, - labels=labels, depth=depth, **args) diff --git a/scripts/perfbd.py b/scripts/perfbd.py index fbc0da26..6119f018 100755 --- a/scripts/perfbd.py +++ b/scripts/perfbd.py @@ -931,13 +931,15 @@ def hotify(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -994,7 +996,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -1002,14 +1005,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -1154,20 +1157,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -1199,7 +1202,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize @@ -1501,7 +1506,7 @@ def main_(paths, *, args['color'] = False # figure out what fields we're interested in - labels = None + hidden = None if by is None: if (args.get('annotate') or args.get('threshold') @@ -1513,7 +1518,7 @@ def main_(paths, *, by = PerfBdResult._by elif depth is not None or hot is not None: by = ['z', 'function'] - labels = ['function'] + hidden = {'z'} else: by = ['function'] @@ -1624,8 +1629,8 @@ def main_(paths, *, table(PerfBdResult, results, diff_results, by=by, fields=fields, + hidden=hidden, sort=sort, - labels=labels, depth=depth, **args) diff --git a/scripts/stack.py b/scripts/stack.py index 1624026e..a50ddd3d 100755 --- a/scripts/stack.py +++ b/scripts/stack.py @@ -599,13 +599,15 @@ def hotify(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -662,7 +664,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -670,14 +673,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -822,20 +825,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -867,7 +870,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize @@ -1048,13 +1053,13 @@ def main(ci_paths, hot=None, **args): # figure out what fields we're interested in - labels = None + hidden = None if by is None: if args.get('output') or args.get('output_json'): by = StackResult._by elif depth is not None or hot is not None: by = ['z', 'function'] - labels = ['function'] + hidden = ['z'] else: by = ['function'] @@ -1141,8 +1146,8 @@ def main(ci_paths, table(StackResult, results, diff_results, by=by, fields=fields, + hidden=hidden, sort=sort, - labels=labels, depth=depth, **args) diff --git a/scripts/structs.py b/scripts/structs.py index 4908c8fb..05b17eac 100755 --- a/scripts/structs.py +++ b/scripts/structs.py @@ -747,13 +747,15 @@ def hotify(Result, results, *, def table(Result, results, diff_results=None, *, by=None, fields=None, + hidden=None, sort=None, - labels=None, depth=1, hot=None, percent=False, all=False, compare=None, + hlabel=None, + tlabel=None, no_header=False, small_header=False, no_total=False, @@ -810,7 +812,8 @@ def table(Result, results, diff_results=None, *, # header if not no_header: header = ['%s%s' % ( - ','.join(labels if labels is not None else by), + ','.join((hlabel(k) if hlabel is not None else k) + for k in by if hidden is None or k not in hidden), ' (%d added, %d removed)' % ( sum(1 for n in table if n not in diff_table), sum(1 for n in diff_table if n not in table)) @@ -818,14 +821,14 @@ def table(Result, results, diff_results=None, *, if not small_header else ''] if diff_results is None or percent: for k in fields: - header.append(k) + header.append(hlabel(k) if hlabel is not None else k) else: for k in fields: - header.append('o'+k) + header.append('o'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('n'+k) + header.append('n'+(hlabel(k) if hlabel is not None else k)) for k in fields: - header.append('d'+k) + header.append('d'+(hlabel(k) if hlabel is not None else k)) lines.append(header) # delete these to try to catch typos below, we need to rebuild @@ -970,20 +973,20 @@ def table(Result, results, diff_results=None, *, # find comparable results diff_r = diff_table_.get(n) - # figure out a good label - if labels is not None: - label = next( + # figure out a good name + if hidden is not None: + name = next( ','.join(str(getattr(r_, k) if getattr(r_, k) is not None else '') - for k in labels) + for k in by if k not in hidden) for r_ in [r, diff_r] if r_ is not None) else: - label = n + name = n # build line - line = table_entry(label, r, diff_r) + line = table_entry(name, r, diff_r) # add prefixes line = [x if isinstance(x, tuple) else (x, []) for x in line] @@ -1015,7 +1018,9 @@ def table(Result, results, diff_results=None, *, else: diff_r = next(iter(fold(Result, diff_results, by=[])), Result()) lines.append(table_entry( - 'TOTAL' if not small_total else '', + '' if small_total + else tlabel(r) if tlabel is not None + else 'TOTAL', r, diff_r)) # homogenize @@ -1196,13 +1201,13 @@ def main(obj_paths, *, hot=None, **args): # figure out what fields we're interested in - labels = None + hidden = None if by is None: if args.get('output') or args.get('output_json'): by = StructResult._by elif depth is not None or hot is not None: by = ['z', 'i', 'struct'] - labels = ['struct'] + hidden = {'z', 'i'} else: by = ['struct'] @@ -1292,8 +1297,8 @@ def main(obj_paths, *, table(StructResult, results, diff_results, by=by, fields=fields, + hidden=hidden, sort=sort, - labels=labels, depth=depth, **args)