Hook System¶
Hooks are Python classes that run before and after each task session. They let you integrate external systems (databases, Slack, and other integrations) without modifying task code.
Call points¶
TaskProcess.__init__()
connect Bpod
── pre-hooks run ─── hooks may mutate task_settings here
init_task() task reads the (possibly patched) settings
run_task thread
TaskProcess.__exit__()
── post-hooks run ── hooks may read session output
disconnect Bpod
Implementing a hook¶
from murineshiftwork.logic.hooks import TaskHook, HookContext
class FetchSubjectLevel(TaskHook):
def pre_run(self, ctx: HookContext) -> None:
level = my_db.get_level(ctx.subject, ctx.task_name)
if level is not None:
ctx.task_settings["start_level"] = level
def post_run(self, ctx: HookContext) -> None:
final = ctx.output.get("final_level")
if final is not None:
my_db.set_level(ctx.subject, ctx.task_name, final)
Registering hooks¶
In the setup YAML (runs for every task on this setup):
In task.yaml (runs only for this task):
HookContext fields¶
| Field | Type | Description |
|---|---|---|
subject |
str |
Subject name |
task_name |
str |
Resolved task name |
task_settings |
dict |
Mutable task settings dict (pre-hooks write here) |
session_paths |
dict |
File paths for this session |
execution_config |
ExecutionConfig |
Full setup + subject config |
output |
dict |
Shared dict; any hook can write / read |
Error isolation¶
A hook that raises logs a WARNING and is skipped. The session continues with whatever
task_settings were already set.