feat(mma): Add topological sorting to TrackDAG with cycle detection
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user