46 lines
1.4 KiB
Python
46 lines
1.4 KiB
Python
"""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)
|