Compare class definitions. Returns (warnings, errors).
(baseline: dict, current: dict)
| 117 | |
| 118 | |
| 119 | def _diff_classes(baseline: dict, current: dict): |
| 120 | """Compare class definitions. Returns (warnings, errors).""" |
| 121 | warnings = [] |
| 122 | errors = [] |
| 123 | |
| 124 | baseline_names = set(baseline.keys()) |
| 125 | current_names = set(current.keys()) |
| 126 | |
| 127 | for name in sorted(baseline_names - current_names): |
| 128 | errors.append(f"Removed class '{name}'") |
| 129 | |
| 130 | for name in sorted(current_names - baseline_names): |
| 131 | warnings.append(f"Added class '{name}'") |
| 132 | |
| 133 | for name in sorted(baseline_names & current_names): |
| 134 | b_cls = baseline[name] |
| 135 | c_cls = current[name] |
| 136 | |
| 137 | # Check extends |
| 138 | if b_cls.get("extends") != c_cls.get("extends"): |
| 139 | warnings.append( |
| 140 | f"Changed '{name}' extends:\n" |
| 141 | f" baseline: {b_cls.get('extends')}\n" |
| 142 | f" current: {c_cls.get('extends')}" |
| 143 | ) |
| 144 | |
| 145 | # Check methods |
| 146 | b_methods = b_cls.get("methods", {}) |
| 147 | c_methods = c_cls.get("methods", {}) |
| 148 | |
| 149 | b_keys = set(b_methods.keys()) |
| 150 | c_keys = set(c_methods.keys()) |
| 151 | |
| 152 | for method in sorted(b_keys - c_keys): |
| 153 | errors.append(f"Removed '{name}.{method}' (was: {b_methods[method]})") |
| 154 | |
| 155 | for method in sorted(c_keys - b_keys): |
| 156 | warnings.append(f"Added '{name}.{method}': {c_methods[method]}") |
| 157 | |
| 158 | for method in sorted(b_keys & c_keys): |
| 159 | if b_methods[method] != c_methods[method]: |
| 160 | warnings.append( |
| 161 | f"Changed '{name}.{method}':\n" |
| 162 | f" baseline: {b_methods[method]}\n" |
| 163 | f" current: {c_methods[method]}" |
| 164 | ) |
| 165 | |
| 166 | return warnings, errors |
| 167 | |
| 168 | |
| 169 | def check(open_source_root: Path, strict: bool = False) -> int: |