47 lines
951 B
Python
47 lines
951 B
Python
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
from datetime import datetime
|
|
from typing import Callable, TYPE_CHECKING
|
|
|
|
if TYPE_CHECKING:
|
|
from .executor import ExecutionContext
|
|
|
|
|
|
TaskHandler = Callable[["ExecutionContext"], "TaskResult"]
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class TaskDefinition:
|
|
key: str
|
|
label: str
|
|
description: str
|
|
category: str
|
|
handler: TaskHandler
|
|
requires_root: bool = True
|
|
default_selected: bool = False
|
|
|
|
|
|
@dataclass
|
|
class TaskResult:
|
|
key: str
|
|
label: str
|
|
success: bool
|
|
changed: bool
|
|
started_at: datetime
|
|
finished_at: datetime
|
|
details: list[str] = field(default_factory=list)
|
|
error: str | None = None
|
|
|
|
@property
|
|
def duration_seconds(self) -> float:
|
|
return (self.finished_at - self.started_at).total_seconds()
|
|
|
|
|
|
@dataclass
|
|
class Scenario:
|
|
name: str
|
|
task_keys: list[str]
|
|
description: str = ""
|
|
builtin: bool = False
|