| 65 | |
| 66 | |
| 67 | def diff_options(left_opts: list[Option], right_opts: list[Option]) -> dict[str, Any]: |
| 68 | li = {opt_key(o): o for o in left_opts} |
| 69 | ri = {opt_key(o): o for o in right_opts} |
| 70 | only_left = set(li) - set(ri) |
| 71 | only_right = set(ri) - set(li) |
| 72 | common = set(li) & set(ri) |
| 73 | text_diffs = sum(1 for k in common if li[k].text.strip() != ri[k].text.strip()) |
| 74 | arg_diffs = sum( |
| 75 | 1 for k in common if bool(li[k].has_argument) != bool(ri[k].has_argument) |
| 76 | ) |
| 77 | denom = max(len(li), len(ri), 1) |
| 78 | return { |
| 79 | "left_n": len(li), |
| 80 | "right_n": len(ri), |
| 81 | "only_left": len(only_left), |
| 82 | "only_right": len(only_right), |
| 83 | "common": len(common), |
| 84 | "text_diffs": text_diffs, |
| 85 | "arg_diffs": arg_diffs, |
| 86 | "agreement": len(common) / denom, |
| 87 | } |
| 88 | |
| 89 | |
| 90 | def run_extractor( |