Source code for council.contexts._execution_log_entry

from datetime import datetime, timezone
from typing import Any, Dict, List, Sequence

from ._budget import Consumption
from ._chat_message import ChatMessage


[docs] class ExecutionLogEntry: """ represents one entry in the :class:`ExecutionLog` """ def __init__(self, source: str): self._source = source self._start = datetime.now(timezone.utc) self._duration = 0 self._error = None self._consumptions: List[Consumption] = [] self._messages: List[ChatMessage] = [] @property def source(self) -> str: """ the source/name of the entry """ return self._source
[docs] def log_consumption(self, consumption: Consumption) -> None: """ logs a budget's :class:`Consumption` """ self._consumptions.append(consumption)
[docs] def log_consumptions(self, consumptions: Sequence[Consumption]) -> None: """ logs multiple budget's :class:`Consumption` """ for consumption in consumptions: self.log_consumption(consumption)
[docs] def log_message(self, message: ChatMessage) -> None: """ logs a :class:`ChatMessage` """ self._messages.append(message)
def __enter__(self): return self def __exit__(self, exc_type, exc_val, exc_tb): self._duration = (datetime.now(timezone.utc) - self._start).total_seconds() self._error = exc_val def __repr__(self): return ( "ExecutionLogEntry(" f"source={self._source}, start={self._start}, duration={self._duration}, error={self._error}" ")" )
[docs] def to_dict(self) -> Dict[str, Any]: """ convert into a dictionary """ result = { "source": self._source, "start": self._start.isoformat(), "duration": self._duration, "consumptions": [item.to_dict() for item in self._consumptions], "messages": [item.to_dict() for item in self._messages], } if self._error is not None: result["error"] = self._error return result