| 32 | |
| 33 | |
| 34 | def get_changes(changes_file: str) -> Tuple[list[Change], list[Change]]: |
| 35 | changes_file = os.path.relpath(changes_file, root_dir) |
| 36 | with open(changes_file, "r") as f: |
| 37 | changes_json = json.load(f) |
| 38 | |
| 39 | regressions = [] |
| 40 | progressions = [] |
| 41 | |
| 42 | def diff_key(object_name: Optional[str], object: dict, key: str): |
| 43 | from_value = object.get("from", {}).get(key, 0.0) |
| 44 | to_value = object.get("to", {}).get(key, 0.0) |
| 45 | key = key.removesuffix("_percent") |
| 46 | change = (object_name, key, from_value, to_value) |
| 47 | if from_value > to_value: |
| 48 | regressions.append(change) |
| 49 | elif to_value > from_value: |
| 50 | progressions.append(change) |
| 51 | |
| 52 | for key in UNIT_KEYS_TO_DIFF: |
| 53 | diff_key(None, changes_json, key) |
| 54 | |
| 55 | for unit in changes_json.get("units", []): |
| 56 | unit_name = unit["name"] |
| 57 | for key in UNIT_KEYS_TO_DIFF: |
| 58 | diff_key(unit_name, unit, key) |
| 59 | # Ignore sections |
| 60 | for func in unit.get("functions", []): |
| 61 | func_name = func["name"] |
| 62 | for key in FUNCTION_KEYS_TO_DIFF: |
| 63 | diff_key(func_name, func, key) |
| 64 | |
| 65 | return regressions, progressions |
| 66 | |
| 67 | |
| 68 | def generate_changes_plaintext(changes: list[Change]) -> str: |