|  | import argparse | 
|  | import json | 
|  | from collections import namedtuple | 
|  |  | 
|  | Result = namedtuple("Result", ["name", "base_time", "diff_time"]) | 
|  |  | 
|  | def construct_name(fwd_bwd, test_name): | 
|  | bwd = 'backward' in fwd_bwd | 
|  | suite_name = fwd_bwd.replace('-backward', '') | 
|  | return '{suite}[{test}]:{fwd_bwd}'.format(suite=suite_name, test=test_name, fwd_bwd='bwd' if bwd else 'fwd') | 
|  |  | 
|  | def get_times(json_data): | 
|  | r = {} | 
|  | for fwd_bwd in json_data: | 
|  | for test_name in json_data[fwd_bwd]: | 
|  | name = construct_name(fwd_bwd, test_name) | 
|  | r[name] = json_data[fwd_bwd][test_name] | 
|  | return r | 
|  |  | 
|  | parser = argparse.ArgumentParser("compare two pytest jsons") | 
|  | parser.add_argument('base', help="base json file") | 
|  | parser.add_argument('diff', help='diff json file') | 
|  | parser.add_argument('--format', default='md', type=str, help='output format (csv, md, json, table)') | 
|  | args = parser.parse_args() | 
|  |  | 
|  | with open(args.base, "r") as base: | 
|  | base_times = get_times(json.load(base)) | 
|  | with open(args.diff, "r") as diff: | 
|  | diff_times = get_times(json.load(diff)) | 
|  |  | 
|  | all_keys = set(base_times.keys()).union(diff_times.keys()) | 
|  | results = [ | 
|  | Result(name, base_times.get(name, float("nan")), diff_times.get(name, float("nan"))) | 
|  | for name in sorted(all_keys) | 
|  | ] | 
|  |  | 
|  | header_fmt = {'table' : '{:48s} {:>13s} {:>15s} {:>10s}', | 
|  | 'md'    : '| {:48s} | {:>13s} | {:>15s} | {:>10s} |', | 
|  | 'csv'   : '{:s}, {:s}, {:s}, {:s}'} | 
|  | data_fmt = {'table' : '{:48s} {:13.6f} {:15.6f} {:9.1f}%', | 
|  | 'md'    : '| {:48s} | {:13.6f} | {:15.6f} | {:9.1f}% |', | 
|  | 'csv'   : '{:s}, {:.6f}, {:.6f}, {:.2f}%'} | 
|  |  | 
|  | if args.format in ['table', 'md', 'csv']: | 
|  | header_fmt_str = header_fmt[args.format] | 
|  | data_fmt_str = data_fmt[args.format] | 
|  | print(header_fmt_str.format("name", "base time (s)", "diff time (s)", "% change")) | 
|  | if args.format == 'md': | 
|  | print(header_fmt_str.format(":---", "---:", "---:", "---:")) | 
|  | for r in results: | 
|  | print(data_fmt_str.format(r.name, r.base_time, r.diff_time, (r.diff_time / r.base_time - 1.0) * 100.0)) | 
|  | elif args.format == 'json': | 
|  | print(json.dumps(results)) | 
|  | else: | 
|  | raise ValueError('Unknown output format: ' + args.format) |