diff --git a/bopytex/planner/fake_planner.py b/bopytex/planner/fake_planner.py index 380e23f..6617992 100644 --- a/bopytex/planner/fake_planner.py +++ b/bopytex/planner/fake_planner.py @@ -4,6 +4,6 @@ from bopytex.tasks import Task def simple(options: dict) -> list[Task]: """Simple planner with options['quantity'] tasks and no dependencies""" return [ - Task("Do", args={"number": i}, deps=[], output=f"{i}") + Task("DO", args={"number": i}, deps=[], output=f"{i}") for i in range(options["quantity"]) ] diff --git a/bopytex/service.py b/bopytex/service.py index 723af4f..217ed67 100755 --- a/bopytex/service.py +++ b/bopytex/service.py @@ -5,14 +5,13 @@ Producing then compiling templates """ -from bopytex.actions import ACTIONS from bopytex.scheduler import Scheduler def orcherstrator( options: dict, planner, - actions: dict = ACTIONS, + dispatcher, ): tasks = planner(options) @@ -20,7 +19,7 @@ def orcherstrator( scheduler.append(tasks) for task in scheduler.backlog(): - yield task + yield from dispatcher(task) # ----------------------------- diff --git a/bopytex/worker/__init__.py b/bopytex/worker/__init__.py new file mode 100644 index 0000000..fa48f63 --- /dev/null +++ b/bopytex/worker/__init__.py @@ -0,0 +1,23 @@ +class ActionNotFound(Exception): + pass + + +class Dispatcher: + def __init__(self, actions: list): + self._actions = actions + + def __call__(self, task): + try: + choosen_action = self._actions[task.action] + except KeyError: + raise ActionNotFound(f"The action {task.action} is not in {self._actions.keys()}") + + return choosen_action( + args=task.args, + deps=task.deps, + output=task.output + ) + +def fake_worker(args, deps, output): + yield f"FAKE - {args} - {deps} - {output}" + diff --git a/bopytex/actions.py b/bopytex/worker/worker.py similarity index 79% rename from bopytex/actions.py rename to bopytex/worker/worker.py index 89805a4..d544d77 100644 --- a/bopytex/actions.py +++ b/bopytex/worker/worker.py @@ -1,3 +1,4 @@ +""" A worker consumes tasks """ def generate(): pass @@ -18,10 +19,10 @@ def clean(): pass -ACTIONS = { +WORKERS = { "GENERATE": generate, "COMPILE": compile, "ACTIVATE_CORR": activate_corr, "JOIN_PDF": join_pdf, - "clean": clean, + "CLEAN": clean, } diff --git a/test/test_service.py b/test/test_service.py index bf200be..2e6970a 100644 --- a/test/test_service.py +++ b/test/test_service.py @@ -1,10 +1,14 @@ from bopytex.planner import fake_planner from bopytex.service import orcherstrator from bopytex.tasks import Task +from bopytex.worker import Dispatcher, fake_worker def test_service(): options = {"quantity": 3, "template": "tpl_src.tex"} - service = orcherstrator(options, fake_planner.simple) - for i, task in enumerate(service): - assert task == Task("Do", args={"number": i}, deps=[], output=f"{i}") + dispatcher = Dispatcher(actions={"DO": fake_worker}) + + service = orcherstrator(options, fake_planner.simple, dispatcher) + + for i, task_output in enumerate(service): + assert task_output == f"FAKE - {{'number': {i}}} - [] - {i}"