scripts: Added --small-table, renamed -%/--percent-diff

So now three levels of diff info available:

-d/--diff (default):

  bench (0 added, 0 removed)   othroughput nthroughput dthroughput
  bench_wt_seq+write               29405.8     29405.7        -0.1 (-0.0%)
  bench_wt_random+write              957.3       957.3        +0.0
  bench_wt_logging+write            2153.4      2153.4        +0.0
  bench_wt_many+write               6855.4       453.6     -6401.8 (-93.4%)
  bench_rt_seq+read             23939212.8  23939212.7        -0.1 (-0.0%)
  bench_rt_random+read           6461004.1   6461004.1        +0.0
  bench_rt_logging+read             4164.0      4163.9        -0.1 (-0.0%)
  bench_rt_many+read              392368.5    392380.4       +11.9 (+0.0%)
  TOTAL                         30836121.3  30829731.1     -6390.2 (-0.0%)

-d/--diff + --small-diff:

  bench                    othroughput nthroughput
  bench_wt_seq+write           29405.8     29405.7 (-0.0%)
  bench_wt_random+write          957.3       957.3
  bench_wt_logging+write        2153.4      2153.4
  bench_wt_many+write           6855.4       453.6 (-93.4%)
  bench_rt_seq+read         23939212.8  23939212.7 (-0.0%)
  bench_rt_random+read       6461004.1   6461004.1
  bench_rt_logging+read         4164.0      4163.9 (-0.0%)
  bench_rt_many+read          392368.5    392380.4 (+0.0%)
  TOTAL                     30836121.3  30829731.1 (-0.0%)

-d/--diff + -%/--percent-diff:

  bench                     throughput
  bench_wt_seq+write           29405.7 (-0.0%)
  bench_wt_random+write          957.3 (+0.0%)
  bench_wt_logging+write        2153.4 (+0.0%)
  bench_wt_many+write            453.6 (-93.4%)
  bench_rt_seq+read         23939212.7 (-0.0%)
  bench_rt_random+read       6461004.1 (+0.0%)
  bench_rt_logging+read         4163.9 (-0.0%)
  bench_rt_many+read          392380.4 (+0.0%)
  TOTAL                     30829731.1 (-0.0%)

The motivation for this is easier rendering of bench diffs, where we
have a relatively long list (8, for now) of benches, with large enough
numbers that including all of old + new + delta ends up a bit much.
This commit is contained in:
Christopher Haster
2026-03-05 09:24:28 -06:00
parent be509bcc91
commit e521e21764
9 changed files with 369 additions and 108 deletions
+41 -12
View File
@@ -611,7 +611,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -665,11 +666,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -711,8 +719,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -724,6 +732,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1149,22 +1174,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',
+41 -12
View File
@@ -480,7 +480,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -534,11 +535,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -580,8 +588,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -593,6 +601,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1132,22 +1157,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',
+41 -12
View File
@@ -2288,7 +2288,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -2342,11 +2343,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -2388,8 +2396,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -2401,6 +2409,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -3254,22 +3279,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
class AppendEnumerate(argparse.Action): class AppendEnumerate(argparse.Action):
def __call__(self, parser, namespace, value, option): def __call__(self, parser, namespace, value, option):
if namespace.by is None: if namespace.by is None:
+41 -12
View File
@@ -870,7 +870,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -924,11 +925,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -970,8 +978,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -983,6 +991,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1444,22 +1469,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',
+41 -12
View File
@@ -611,7 +611,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -665,11 +666,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -711,8 +719,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -724,6 +732,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1149,22 +1174,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',
+41 -12
View File
@@ -969,7 +969,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -1023,11 +1024,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -1069,8 +1077,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -1082,6 +1090,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1689,22 +1714,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',
+41 -12
View File
@@ -943,7 +943,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -997,11 +998,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -1043,8 +1051,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -1056,6 +1064,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1693,22 +1718,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',
+41 -12
View File
@@ -611,7 +611,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -665,11 +666,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -711,8 +719,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -724,6 +732,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1187,22 +1212,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',
+41 -12
View File
@@ -759,7 +759,8 @@ def table(Result, results, diff_results=None, *,
sort=None, sort=None,
depth=1, depth=1,
hot=None, hot=None,
percent=False, small_diff=False,
percent_diff=False,
all=False, all=False,
compare=None, compare=None,
hlabel=None, hlabel=None,
@@ -813,11 +814,18 @@ def table(Result, results, diff_results=None, *,
' (%d added, %d removed)' % ( ' (%d added, %d removed)' % (
sum(1 for n in table if n not in diff_table), sum(1 for n in table if n not in diff_table),
sum(1 for n in diff_table if n not in table)) sum(1 for n in diff_table if n not in table))
if diff_results is not None and not percent else '') if diff_results is not None
and not percent_diff
and not small_diff
else '')
if not small_header else ''] if not small_header else '']
if diff_results is None or percent: if diff_results is None or percent_diff:
for k in fields: for k in fields:
header.append(hlabel(k) if hlabel is not None else k) header.append(hlabel(k) if hlabel is not None else k)
elif small_diff:
for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k))
header.append('n'+(hlabel(k) if hlabel is not None else k))
else: else:
for k in fields: for k in fields:
header.append('o'+(hlabel(k) if hlabel is not None else k)) header.append('o'+(hlabel(k) if hlabel is not None else k))
@@ -859,8 +867,8 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(compare_r, k, None))))) getattr(compare_r, k, None)))))
# percent entry? # percent diff entry?
elif percent: elif percent_diff:
for k in fields: for k in fields:
entry.append( entry.append(
(getattr(r, k).table() (getattr(r, k).table()
@@ -872,6 +880,23 @@ def table(Result, results, diff_results=None, *,
types[k].ratio( types[k].ratio(
getattr(r, k, None), getattr(r, k, None),
getattr(diff_r, k, None))))) getattr(diff_r, k, None)))))
# small diff entry?
elif small_diff:
for k in fields:
entry.append(getattr(diff_r, k).table()
if getattr(diff_r, k, None) is not None
else types[k].none)
entry.append(
(getattr(r, k).table()
if getattr(r, k, None) is not None
else types[k].none,
(lambda t: ['+∞%'] if t == +mt.inf
else ['-∞%'] if t == -mt.inf
else ['%+.1f%%' % (100*t)] if t
else [])(
types[k].ratio(
getattr(r, k, None),
getattr(diff_r, k, None)))))
# diff entry? # diff entry?
else: else:
for k in fields: for k in fields:
@@ -1333,22 +1358,26 @@ if __name__ == "__main__":
parser.add_argument( parser.add_argument(
'-d', '--diff', '-d', '--diff',
help="Specify CSV/JSON file to diff against.") help="Specify CSV/JSON file to diff against.")
parser.add_argument(
'--small-diff',
action='store_true',
help="Don't show diff delta.")
# need a special Action here because this % causes problems # need a special Action here because this % causes problems
class StoreTruePercent(argparse._StoreTrueAction): class StoreTruePercentDiff(argparse._StoreTrueAction):
def format_usage(self): def format_usage(self):
return '-%%' return '-%%'
parser.add_argument( parser.add_argument(
'-%', '--percent', '-%', '--percent-diff',
action=StoreTruePercent, action=StoreTruePercentDiff,
help="Only show percentage change, not a full diff.") help="Only show percentage change, not a full diff.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-a', '--all', '-a', '--all',
action='store_true', action='store_true',
help="Show all, not just the ones that changed.") help="Show all, not just the ones that changed.")
parser.add_argument(
'-C', '--compare',
type=lambda x: tuple(v.strip() for v in x.split(',')),
help="Compare results to the row matching this by pattern.")
parser.add_argument( parser.add_argument(
'-b', '--by', '-b', '--by',
action='append', action='append',