(name: str, result: PluginEvalResult, duration_ms: int)
| 61 | |
| 62 | |
| 63 | def row_from_result(name: str, result: PluginEvalResult, duration_ms: int) -> PluginRow: |
| 64 | comp = result.composite |
| 65 | if comp is None: |
| 66 | return PluginRow( |
| 67 | name=name, |
| 68 | score=None, |
| 69 | badge=None, |
| 70 | confidence=None, |
| 71 | ci_lower=None, |
| 72 | ci_upper=None, |
| 73 | anti_patterns=[], |
| 74 | weakest_dimensions=[], |
| 75 | duration_ms=duration_ms, |
| 76 | errored=True, |
| 77 | error="No composite score produced", |
| 78 | ) |
| 79 | |
| 80 | # Collect unique anti-pattern flags across layers |
| 81 | seen: set[str] = set() |
| 82 | anti_patterns: list[str] = [] |
| 83 | for layer in result.layers: |
| 84 | for ap in getattr(layer, "anti_patterns", []) or []: |
| 85 | flag = getattr(ap, "flag", None) or str(ap) |
| 86 | if flag and flag not in seen: |
| 87 | seen.add(flag) |
| 88 | anti_patterns.append(flag) |
| 89 | |
| 90 | # Weakest 3 dimensions (by weighted_score) |
| 91 | dims = sorted( |
| 92 | comp.dimensions, |
| 93 | key=lambda d: (d.weighted_score if d.weight > 0 else 1.0), |
| 94 | )[:3] |
| 95 | weakest = [(d.name, d.score) for d in dims if d.weight > 0] |
| 96 | |
| 97 | badge_val = comp.badge.value if hasattr(comp.badge, "value") else str(comp.badge) |
| 98 | return PluginRow( |
| 99 | name=name, |
| 100 | score=comp.score, |
| 101 | badge=badge_val, |
| 102 | confidence=comp.confidence_label, |
| 103 | ci_lower=comp.ci_lower, |
| 104 | ci_upper=comp.ci_upper, |
| 105 | anti_patterns=anti_patterns, |
| 106 | weakest_dimensions=weakest, |
| 107 | duration_ms=duration_ms, |
| 108 | errored=False, |
| 109 | ) |
| 110 | |
| 111 | |
| 112 | def evaluate_one( |
no test coverage detected