diff --git a/conductor/tracks.md b/conductor/tracks.md index 97d918a..615d218 100644 --- a/conductor/tracks.md +++ b/conductor/tracks.md @@ -26,7 +26,7 @@ This file tracks all major tracks for the project. Each track has its own detail 3. [x] **Track: Visual DAG & Interactive Ticket Editing** *Link: [./tracks/visual_dag_ticket_editing_20260306/](./tracks/visual_dag_ticket_editing_20260306/)* -4. [ ] **Track: Advanced Tier 4 QA Auto-Patching** +4. [~] **Track: Advanced Tier 4 QA Auto-Patching** *Link: [./tracks/tier4_auto_patching_20260306/](./tracks/tier4_auto_patching_20260306/)* 5. [ ] **Track: Transitioning to Native Orchestrator** diff --git a/src/diff_viewer.py b/src/diff_viewer.py index 9cb11cb..c3bec4a 100644 --- a/src/diff_viewer.py +++ b/src/diff_viewer.py @@ -126,4 +126,24 @@ def format_diff_for_display(diff_files: List[DiffFile]) -> str: output.append(f" {hunk.header}") for line in hunk.lines: output.append(f" {line}") - return "\n".join(output) \ No newline at end of file + return "\n".join(output) + +def get_line_color(line: str) -> Optional[str]: + if line.startswith("+"): + return "green" + elif line.startswith("-"): + return "red" + elif line.startswith("@@"): + return "cyan" + return None + +def render_diff_text_immediate(diff_files: List[DiffFile]) -> List[tuple[str, Optional[str]]]: + output: List[tuple[str, Optional[str]]] = [] + for df in diff_files: + output.append((f"File: {df.old_path}", "white")) + for hunk in df.hunks: + output.append((hunk.header, "cyan")) + for line in hunk.lines: + color = get_line_color(line) + output.append((line, color)) + return output \ No newline at end of file diff --git a/tests/test_diff_viewer.py b/tests/test_diff_viewer.py index bb2d491..bacf65f 100644 --- a/tests/test_diff_viewer.py +++ b/tests/test_diff_viewer.py @@ -1,5 +1,5 @@ import pytest -from src.diff_viewer import parse_diff, DiffFile, DiffHunk, parse_hunk_header +from src.diff_viewer import parse_diff, DiffFile, DiffHunk, parse_hunk_header, get_line_color, render_diff_text_immediate def test_parse_diff_empty() -> None: result = parse_diff("") @@ -80,4 +80,25 @@ def test_diff_line_classification() -> None: hunk = result[0].hunks[0] assert any(line.startswith("-") for line in hunk.lines) assert any(line.startswith("+") for line in hunk.lines) - assert any(line.startswith(" ") or not line.startswith(("-", "+")) for line in hunk.lines) \ No newline at end of file + assert any(line.startswith(" ") or not line.startswith(("-", "+")) for line in hunk.lines) + +def test_get_line_color() -> None: + assert get_line_color("+added") == "green" + assert get_line_color("-removed") == "red" + assert get_line_color("@@ -1,3 +1,4 @@") == "cyan" + assert get_line_color(" context") == None + +def test_render_diff_text_immediate() -> None: + diff_text = """--- a/test.py ++++ b/test.py +@@ -1 +1 @@ +-old ++new""" + diff_files = parse_diff(diff_text) + output = render_diff_text_immediate(diff_files) + + assert len(output) > 0 + assert ("File: test.py", "white") in output + assert ("@@ -1 +1 @@", "cyan") in output + assert ("-old", "red") in output + assert ("+new", "green") in output \ No newline at end of file