11from __future__ import annotations
22
33from dataclasses import dataclass
4+ from datetime import datetime
45from types import TracebackType
56from typing import Callable , ContextManager , Iterable , Optional , Sequence , Type
67
@@ -19,6 +20,7 @@ class Phase:
1920class PhaseProgressStatus (ProgressStatus ):
2021 phase_stage : Optional [str ] = None
2122 phase_step : Optional [int ] = None
23+ phase_started : Optional [datetime ] = None
2224
2325
2426class PhaseProgress (ContextManager [Callable [[ProgressStatus ], None ]]):
@@ -70,6 +72,7 @@ def __init__(self, progress: Optional[Callable[[ProgressStatus], None]], phases:
7072 self ._percent_completed = 0.0
7173 self ._step = 0
7274 self ._prev_phase_last_step = 0
75+ self ._phase_started = None
7376
7477 @property
7578 def phases (self ) -> Sequence [Phase ]:
@@ -80,6 +83,7 @@ def current_phase(self) -> Optional[Phase]:
8083 return None if self ._current_phase_index == - 1 else self ._phases [self ._current_phase_index ]
8184
8285 def start_next_phase (self ) -> PhaseProgress :
86+ self ._phase_started = datetime .now ()
8387 self ._prev_phase_last_step = self ._step
8488 self ._percent_completed += self ._current_phase_percentage
8589 self ._current_phase_index += 1
@@ -102,6 +106,7 @@ def _report(self, value: ProgressStatus) -> None:
102106 value .step_count ,
103107 self .current_phase .stage if self .current_phase is not None else None ,
104108 value .step ,
109+ self ._phase_started ,
105110 )
106111 )
107112
0 commit comments