(
res: SelectorResult,
limit: int = 40,
style: str = "minimal",
emoji: bool = False,
)
| 656 | |
| 657 | |
| 658 | def _render_decision_markdown( |
| 659 | res: SelectorResult, |
| 660 | limit: int = 40, |
| 661 | style: str = "minimal", |
| 662 | emoji: bool = False, |
| 663 | ) -> str: |
| 664 | def bullet(items: list[str], limit_: int = limit) -> str: |
| 665 | if not items: |
| 666 | return "_(none)_" |
| 667 | shown = items[:limit_] |
| 668 | s = "\n".join(f"- `{x}`" for x in shown) |
| 669 | if len(items) > limit_: |
| 670 | s += f"\n- … and {len(items) - limit_} more" |
| 671 | return s |
| 672 | |
| 673 | # Selection line (minimal, no emoji by default) |
| 674 | selected_lanes = _enabled_lane_names(res) |
| 675 | if emoji: |
| 676 | selected_lanes_label = ", ".join(_lane_label(name, emoji=True) for name in selected_lanes) |
| 677 | else: |
| 678 | selected_lanes_label = ", ".join(f"`{name}`" for name in selected_lanes) |
| 679 | |
| 680 | if not selected_lanes_label: |
| 681 | selected_lanes_label = "_(none)_" |
| 682 | |
| 683 | diff_mode = f"{MODE_LABELS.get(res.diff_mode, res.diff_mode.value)}" |
| 684 | |
| 685 | md: list[str] = [] |
| 686 | md.append("# Test selection\n") |
| 687 | md.append(f"**Selected workflows:** {selected_lanes_label}\n") |
| 688 | md.append(f"**Diff mode:** `{diff_mode}`\n") |
| 689 | |
| 690 | # Reasons (compacted) |
| 691 | md.append("## Why\n") |
| 692 | for r in _compact_reasons(res.reasons): |
| 693 | md.append(f"- `{r}`") |
| 694 | md.append("") |
| 695 | |
| 696 | if style == "detailed" and res.lane_reasons: |
| 697 | md.append("## Workflow lanes\n") |
| 698 | for lane in _enabled_lane_names(res): |
| 699 | lane_rs = res.lane_reasons.get(lane, []) |
| 700 | md.append(f"### `{lane}`") |
| 701 | if lane_rs: |
| 702 | for r in lane_rs: |
| 703 | md.append(f"- `{r}`") |
| 704 | else: |
| 705 | md.append("_(none)_") |
| 706 | md.append("") |
| 707 | |
| 708 | # Explain changed files |
| 709 | exp = explain_changed_files(res.changed_files) |
| 710 | |
| 711 | md.append("## Changed files (explained)\n") |
| 712 | |
| 713 | # 1) Collapsible: Files that match full-suite triggers |
| 714 | # (Always collapsible if present; otherwise omit section.) |
| 715 | if exp["full_trigger_files"]: |
no test coverage detected