diff --git a/bopytex/scheduler.py b/bopytex/scheduler.py index db00b12..8155f1c 100644 --- a/bopytex/scheduler.py +++ b/bopytex/scheduler.py @@ -1,6 +1,9 @@ """ Scheduler for action to make """ +from logging import exception + + class Scheduler: def __init__(self, actions: list): self.actions = actions @@ -23,15 +26,32 @@ class Scheduler: ans = self.actions[task.action](task.deps, task.args) return ans + def __iter__(self): + return self def __next__(self): + return self.next() + + def next(self): undoable = [] - task = self._tasks.pop(0) + try: + task = self._tasks.pop(0) + except IndexError: + raise StopIteration + while not all([d in self.done for d in task.deps]): undoable.append(task) - task = self._tasks.pop(0) + try: + task = self._tasks.pop(0) + except IndexError: + self.append(undoable) + raise StopIteration self.append(undoable) ans = self.dispatch(task) self._done.append(ans) return ans + + def run(self): + for i in self: + pass diff --git a/test/test_scheduler.py b/test/test_scheduler.py index a79c764..9176e6e 100644 --- a/test/test_scheduler.py +++ b/test/test_scheduler.py @@ -1,5 +1,6 @@ from bopytex.planner import Task from bopytex.scheduler import Scheduler +import pytest def test_schedule_append(): @@ -22,7 +23,7 @@ def test_schedule_one_task(): actions = {"DO": lambda deps, args: "done"} scheduler = Scheduler(actions) scheduler.append([Task(action="DO", args={}, deps=[])]) - result = scheduler.__next__() + result = scheduler.next() assert result == "done" assert scheduler.tasks == [] assert scheduler.done == ["done"] @@ -32,7 +33,7 @@ def test_schedule_one_task_with_args(): actions = {"DO": lambda deps, args: f"{args['task']} done"} scheduler = Scheduler(actions) scheduler.append([Task(action="DO", args={"task": "one"}, deps=[])]) - result = scheduler.__next__() + result = scheduler.next() assert result == "one done" assert scheduler.tasks == [] assert scheduler.done == ["one done"] @@ -45,17 +46,17 @@ def test_schedule_multiple_tasks(): t2 = Task(action="DO", args={"task": "two"}, deps=[]) t3 = Task(action="DO", args={"task": "three"}, deps=[]) scheduler.append([t1, t2, t3]) - result = scheduler.__next__() + result = scheduler.next() assert result == "one done" assert scheduler.tasks == [t2, t3] assert scheduler.done == ["one done"] - result = scheduler.__next__() + result = scheduler.next() assert result == "two done" assert scheduler.tasks == [t3] assert scheduler.done == ["one done", "two done"] - result = scheduler.__next__() + result = scheduler.next() assert result == "three done" assert scheduler.tasks == [] assert scheduler.done == ["one done", "two done", "three done"] @@ -69,18 +70,37 @@ def test_schedule_multiple_tasks_with_dependencies(): t3 = Task(action="DO", args={"task": "three"}, deps=[]) scheduler.append([t1, t2, t3]) - result = scheduler.__next__() + result = scheduler.next() assert result == "three done" assert scheduler.tasks == [t1, t2] assert scheduler.done == ["three done"] - result = scheduler.__next__() + result = scheduler.next() assert result == "one done" assert scheduler.tasks == [t2] assert scheduler.done == ["three done", "one done"] - result = scheduler.__next__() + result = scheduler.next() assert result == "two done" assert scheduler.tasks == [] assert scheduler.done == ["three done", "one done", "two done"] + +def test_schedule_empty_task(): + actions = {"DO": lambda deps, args: f"{args['task']} done"} + scheduler = Scheduler(actions) + scheduler.append([]) + with pytest.raises(StopIteration): + scheduler.next() + + +def test_schedule_multiple_tasks_with_undoable_dependencies(): + actions = {"DO": lambda deps, args: f"{args['task']} done"} + scheduler = Scheduler(actions) + t1 = Task(action="DO", args={"task": "one"}, deps=["three done"]) + t2 = Task(action="DO", args={"task": "two"}, deps=[]) + scheduler.append([t1, t2]) + scheduler.run() + assert scheduler.tasks == [t1] + assert scheduler.done == ["two done"] +