Feat: move action to worker with a dispatcher

This commit is contained in:
Bertrand Benjamin 2022-04-10 14:37:19 +02:00
parent 3f1464f3f6
commit 08411bd42d
5 changed files with 36 additions and 9 deletions

View File

@ -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"])
]

View File

@ -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)
# -----------------------------

View File

@ -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}"

View File

@ -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,
}

View File

@ -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}"