feat(diff): Add diff rendering helpers for GUI
- Add get_line_color() to classify diff lines - Add render_diff_text_immediate() for immediate mode rendering - Add tests for rendering functions
This commit is contained in:
@@ -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**
|
3. [x] **Track: Visual DAG & Interactive Ticket Editing**
|
||||||
*Link: [./tracks/visual_dag_ticket_editing_20260306/](./tracks/visual_dag_ticket_editing_20260306/)*
|
*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/)*
|
*Link: [./tracks/tier4_auto_patching_20260306/](./tracks/tier4_auto_patching_20260306/)*
|
||||||
|
|
||||||
5. [ ] **Track: Transitioning to Native Orchestrator**
|
5. [ ] **Track: Transitioning to Native Orchestrator**
|
||||||
|
|||||||
@@ -127,3 +127,23 @@ def format_diff_for_display(diff_files: List[DiffFile]) -> str:
|
|||||||
for line in hunk.lines:
|
for line in hunk.lines:
|
||||||
output.append(f" {line}")
|
output.append(f" {line}")
|
||||||
return "\n".join(output)
|
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
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
import pytest
|
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:
|
def test_parse_diff_empty() -> None:
|
||||||
result = parse_diff("")
|
result = parse_diff("")
|
||||||
@@ -81,3 +81,24 @@ def test_diff_line_classification() -> None:
|
|||||||
assert any(line.startswith("-") for line in hunk.lines)
|
assert any(line.startswith("-") for line in hunk.lines)
|
||||||
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)
|
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
|
||||||
Reference in New Issue
Block a user