from __future__ import annotations
import datetime
from collections.abc import Mapping
from typing import Any, TypeVar
from attrs import define as _attrs_define
from attrs import field as _attrs_field
from dateutil.parser import isoparse
from ..types import UNSET, Unset
T = TypeVar("T", bound="RunMetadata")
@_attrs_define
class RunMetadata:
"""
Attributes:
started_at (datetime.datetime | Unset):
completed_at (datetime.datetime | Unset): Only present when run has finished (success, failed, or aborted)
duration_ms (int | Unset): Example: 5234.
"""
started_at: datetime.datetime | Unset = UNSET
completed_at: datetime.datetime | Unset = UNSET
duration_ms: int | Unset = UNSET
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
def to_dict(self) -> dict[str, Any]:
started_at: str | Unset = UNSET
if not isinstance(self.started_at, Unset):
started_at = self.started_at.isoformat()
completed_at: str | Unset = UNSET
if not isinstance(self.completed_at, Unset):
completed_at = self.completed_at.isoformat()
duration_ms = self.duration_ms
field_dict: dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})
if started_at is not UNSET:
field_dict["startedAt"] = started_at
if completed_at is not UNSET:
field_dict["completedAt"] = completed_at
if duration_ms is not UNSET:
field_dict["durationMs"] = duration_ms
return field_dict
@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
d = dict(src_dict)
_started_at = d.pop("startedAt", UNSET)
started_at: datetime.datetime | Unset
if isinstance(_started_at, Unset):
started_at = UNSET
else:
started_at = isoparse(_started_at)
_completed_at = d.pop("completedAt", UNSET)
completed_at: datetime.datetime | Unset
if isinstance(_completed_at, Unset):
completed_at = UNSET
else:
completed_at = isoparse(_completed_at)
duration_ms = d.pop("durationMs", UNSET)
run_metadata = cls(
started_at=started_at,
completed_at=completed_at,
duration_ms=duration_ms,
)
run_metadata.additional_properties = d
return run_metadata
@property
def additional_keys(self) -> list[str]:
return list(self.additional_properties.keys())
def __getitem__(self, key: str) -> Any:
return self.additional_properties[key]
def __setitem__(self, key: str, value: Any) -> None:
self.additional_properties[key] = value
def __delitem__(self, key: str) -> None:
del self.additional_properties[key]
def __contains__(self, key: str) -> bool:
return key in self.additional_properties