diff --git a/src/project_manager.py b/src/project_manager.py index 93becaa..da40648 100644 --- a/src/project_manager.py +++ b/src/project_manager.py @@ -318,10 +318,10 @@ def get_all_tracks(base_dir: Union[str, Path] = ".") -> list[dict[str, Any]]: track_info["id"] = state.metadata.id or track_id track_info["title"] = state.metadata.name or track_id track_info["status"] = state.metadata.status or "unknown" - track_info["complete"] = len([t for t in state.tasks if t.status == "completed"]) - track_info["total"] = len(state.tasks) - if track_info["total"] > 0: - track_info["progress"] = track_info["complete"] / track_info["total"] + progress = calculate_track_progress(state.tasks) + track_info["complete"] = progress["completed"] + track_info["total"] = progress["total"] + track_info["progress"] = progress["percentage"] / 100.0 state_found = True except Exception: pass @@ -352,3 +352,35 @@ def get_all_tracks(base_dir: Union[str, Path] = ".") -> list[dict[str, Any]]: pass results.append(track_info) return results + +def calculate_track_progress(tickets: list) -> dict: + """ + Calculates track progress based on ticket statuses. + percentage (float), completed (int), total (int), in_progress (int), blocked (int), todo (int) + """ + total = len(tickets) + if total == 0: + return { + "percentage": 0.0, + "completed": 0, + "total": 0, + "in_progress": 0, + "blocked": 0, + "todo": 0 + } + + completed = sum(1 for t in tickets if t.status == "completed") + in_progress = sum(1 for t in tickets if t.status == "in_progress") + blocked = sum(1 for t in tickets if t.status == "blocked") + todo = sum(1 for t in tickets if t.status == "todo") + + percentage = (completed / total) * 100.0 + + return { + "percentage": float(percentage), + "completed": completed, + "total": total, + "in_progress": in_progress, + "blocked": blocked, + "todo": todo + } diff --git a/tests/test_progress_viz.py b/tests/test_progress_viz.py new file mode 100644 index 0000000..f754f49 --- /dev/null +++ b/tests/test_progress_viz.py @@ -0,0 +1,49 @@ +import pytest +from src.project_manager import calculate_track_progress +from src.models import Ticket + +def test_calculate_track_progress_empty(): + results = calculate_track_progress([]) + assert results["total"] == 0 + assert results["percentage"] == 0.0 + assert results["completed"] == 0 + assert results["in_progress"] == 0 + assert results["blocked"] == 0 + assert results["todo"] == 0 + +def test_calculate_track_progress_all_todo(): + tickets = [ + Ticket(id="1", description="desc 1", status="todo"), + Ticket(id="2", description="desc 2", status="todo") + ] + results = calculate_track_progress(tickets) + assert results["total"] == 2 + assert results["percentage"] == 0.0 + assert results["completed"] == 0 + assert results["todo"] == 2 + +def test_calculate_track_progress_mixed(): + tickets = [ + Ticket(id="1", description="desc 1", status="completed"), + Ticket(id="2", description="desc 2", status="in_progress"), + Ticket(id="3", description="desc 3", status="blocked"), + Ticket(id="4", description="desc 4", status="todo") + ] + results = calculate_track_progress(tickets) + assert results["total"] == 4 + assert results["completed"] == 1 + assert results["in_progress"] == 1 + assert results["blocked"] == 1 + assert results["todo"] == 1 + assert results["percentage"] == 25.0 + +def test_calculate_track_progress_all_completed(): + tickets = [ + Ticket(id="1", description="desc 1", status="completed"), + Ticket(id="2", description="desc 2", status="completed") + ] + results = calculate_track_progress(tickets) + assert results["total"] == 2 + assert results["percentage"] == 100.0 + assert results["completed"] == 2 +