Source code for _pytask.report

"""This module contains everything related to reports."""
from __future__ import annotations

from types import TracebackType
from typing import Tuple
from typing import Type
from typing import TYPE_CHECKING
from typing import Union

from _pytask.outcomes import CollectionOutcome
from _pytask.outcomes import TaskOutcome
from _pytask.traceback import remove_internal_traceback_frames_from_exc_info
from attrs import define
from attrs import field


if TYPE_CHECKING:
    from _pytask.nodes import MetaNode
    from _pytask.nodes import Task


ExceptionInfo = Tuple[Type[BaseException], BaseException, Union[TracebackType, None]]


[docs] @define class CollectionReport: """A collection report for a task.""" outcome: CollectionOutcome node: MetaNode | None = None exc_info: ExceptionInfo | None = None @classmethod def from_exception( cls: type[CollectionReport], outcome: CollectionOutcome, exc_info: ExceptionInfo, node: MetaNode | None = None, ) -> CollectionReport: exc_info = remove_internal_traceback_frames_from_exc_info(exc_info) return cls(outcome=outcome, node=node, exc_info=exc_info)
[docs] @define class DagReport: """A report for an error during the creation of the DAG.""" exc_info: ExceptionInfo @classmethod def from_exception(cls, exc_info: ExceptionInfo) -> DagReport: exc_info = remove_internal_traceback_frames_from_exc_info(exc_info) return cls(exc_info)
[docs] @define class ExecutionReport: """A report for an executed task.""" task: Task outcome: TaskOutcome exc_info: ExceptionInfo | None = None sections: list[tuple[str, str, str]] = field(factory=list) @classmethod def from_task_and_exception( cls, task: Task, exc_info: ExceptionInfo ) -> ExecutionReport: """Create a report from a task and an exception.""" exc_info = remove_internal_traceback_frames_from_exc_info(exc_info) return cls(task, TaskOutcome.FAIL, exc_info, task._report_sections) @classmethod def from_task(cls, task: Task) -> ExecutionReport: """Create a report from a task.""" return cls(task, TaskOutcome.SUCCESS, None, task._report_sections)