Files
box/packages/protocol-muse/build/lib/protocol_muse/queue.py
T

46 lines
1.4 KiB
Python
Raw Normal View History

"""Task queue model for protocol_muse."""
from dataclasses import dataclass, field
from typing import List, Dict, Any, Optional
@dataclass
class TaskItem:
name: str
queue: str # "pending", "claimed", "done"
owner: Optional[str] = None
age_s: Optional[float] = None
@dataclass
class QueueSnapshot:
ok: bool
tasks: List[TaskItem] = field(default_factory=list)
counts: Dict[str, int] = field(default_factory=lambda: {"pending": 0, "claimed": 0, "done": 0})
@property
def pending_count(self) -> int:
return self.counts.get("pending", 0)
@property
def claimed_count(self) -> int:
return self.counts.get("claimed", 0)
@property
def done_count(self) -> int:
return self.counts.get("done", 0)
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "QueueSnapshot":
tasks = []
for t in data.get("tasks", []):
tasks.append(TaskItem(
name=t.get("name", ""),
queue=t.get("queue", "pending"),
owner=t.get("owner"),
age_s=t.get("age_s"),
))
counts = data.get("counts", {
"pending": sum(1 for t in tasks if t.queue == "pending"),
"claimed": sum(1 for t in tasks if t.queue == "claimed"),
"done": sum(1 for t in tasks if t.queue == "done"),
})
return cls(ok=bool(data.get("ok", True)), tasks=tasks, counts=counts)