feat(mma): Add topological sorting to TrackDAG with cycle detection

This commit is contained in:
2026-02-27 20:04:04 -05:00
parent a3cfeff9d8
commit f85ec9d06f
2 changed files with 43 additions and 0 deletions

View File

@@ -50,3 +50,29 @@ class TrackDAG:
if is_cyclic(ticket.id): if is_cyclic(ticket.id):
return True return True
return False return False
def topological_sort(self) -> List[str]:
"""
Returns a list of ticket IDs in topological order.
Raises ValueError if a cycle is detected.
"""
if self.has_cycle():
raise ValueError("Dependency cycle detected")
visited = set()
stack = []
def visit(ticket_id):
if ticket_id in visited:
return
visited.add(ticket_id)
ticket = self.ticket_map.get(ticket_id)
if ticket:
for dep_id in ticket.depends_on:
visit(dep_id)
stack.append(ticket_id)
for ticket in self.tickets:
visit(ticket.id)
return stack

View File

@@ -65,3 +65,20 @@ def test_get_ready_tasks_multiple_deps():
t2.status = "todo" t2.status = "todo"
assert [t.id for t in dag.get_ready_tasks()] == ["T2"] assert [t.id for t in dag.get_ready_tasks()] == ["T2"]
def test_topological_sort():
t1 = Ticket(id="T1", description="T1", status="todo", assigned_to="worker")
t2 = Ticket(id="T2", description="T2", status="todo", assigned_to="worker", depends_on=["T1"])
t3 = Ticket(id="T3", description="T3", status="todo", assigned_to="worker", depends_on=["T2"])
dag = TrackDAG([t1, t2, t3])
sort = dag.topological_sort()
assert sort == ["T1", "T2", "T3"]
def test_topological_sort_cycle():
t1 = Ticket(id="T1", description="T1", status="todo", assigned_to="worker", depends_on=["T2"])
t2 = Ticket(id="T2", description="T2", status="todo", assigned_to="worker", depends_on=["T1"])
dag = TrackDAG([t1, t2])
with pytest.raises(ValueError, match="Dependency cycle detected"):
dag.topological_sort()