Ctrl K
ComunidadGuías…

examples/task_batch.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Two synthetic tasks with exact short-lived permissions; no network or credentials.

PYTHONPATH=. python examples/task_batch.py NEW_JOURNAL --owner demo
These example permits authorize only the pure uppercase handler, never real user actions.
"""

from __future__ import annotations

import argparse
import asyncio
import json
from dataclasses import asdict
from datetime import UTC, datetime, timedelta
from pathlib import Path

from morgan_brain.task_batches import TaskPermissions, TaskPermit, run_batch
from morgan_brain.tasks import Task, TaskControl, TaskJournal, TaskKey, TaskRequest


async def uppercase(task: Task, control: TaskControl) -> str:
    control.check_ready()
    return task.payload.upper()


async def main() -> None:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("journal", type=Path)
    parser.add_argument("--owner", required=True)
    args = parser.parse_args()
    journal = TaskJournal(args.journal)
    try:
        requests = [
            TaskRequest(TaskKey(args.owner, "synthetic-batch", key), "uppercase-v1", key)
            for key in ("first", "second")
        ]
        journal.create_many(requests)
        policy = TaskPermissions()
        for item in requests:
            policy.grant(
                TaskPermit(item, "synthetic-example", datetime.now(UTC) + timedelta(minutes=1))
            )
        result = await run_batch(
            journal,
            [item.key for item in requests],
            permissions=policy,
            handlers={"uppercase-v1": uppercase},
            timeout_seconds=2,
        )
        print(json.dumps(asdict(result)))
    finally:
        journal.close()


if __name__ == "__main__":
    asyncio.run(main())