@@ -97,7 +97,7 @@ def __init__(
9797 self ._stderr = ()
9898
9999 self .__exit_code = proc_enums .INVALID # type: typing.Union[int, proc_enums.ExitCodes]
100- self .__timestamp = None
100+ self .__timestamp = None # type: typing.Optional[datetime.datetime]
101101 self .exit_code = exit_code
102102
103103 self .__started = started # type: typing.Optional[datetime.datetime]
@@ -139,6 +139,16 @@ def timestamp(self) -> typing.Optional[datetime.datetime]:
139139 """
140140 return self .__timestamp
141141
142+ def set_timestamp (self ) -> None :
143+ """Set timestamp if empty.
144+
145+ This will block future object changes.
146+
147+ .. versionadded:: 4.0.0
148+ """
149+ if self .timestamp is None :
150+ self .__timestamp = datetime .datetime .utcnow ()
151+
142152 @staticmethod
143153 def _get_bytearray_from_array (src : typing .Iterable [bytes ]) -> bytearray :
144154 """Get bytearray from array of bytes blocks.
@@ -370,7 +380,7 @@ def exit_code(self, new_val: typing.Union[int, proc_enums.ExitCodes]) -> None:
370380 with self .stdout_lock , self .stderr_lock :
371381 self .__exit_code = proc_enums .exit_code_to_enum (new_val )
372382 if self .__exit_code != proc_enums .INVALID :
373- self .__timestamp = datetime .datetime .utcnow () # type: ignore
383+ self .__timestamp = datetime .datetime .utcnow ()
374384
375385 @property
376386 def started (self ) -> typing .Optional [datetime .datetime ]:
@@ -471,20 +481,31 @@ def __str__(self) -> str:
471481 """Representation for logging."""
472482 if self .started :
473483 started = "\t started={started},\n " .format (started = self .started .strftime ('%Y-%m-%d %H:%M:%S' ))
484+ if self .timestamp :
485+ _spent = (self .timestamp - self .started ).seconds
486+ spent = "\t spent={hours:02d}:{minutes:02d}:{seconds:02d},\n " .format (
487+ hours = _spent // (60 * 60 ),
488+ minutes = _spent // 60 ,
489+ seconds = _spent % 60
490+ )
491+ else :
492+ spent = ""
474493 else :
475494 started = ""
495+ spent = ""
476496 return (
477497 "{cls}(\n \t cmd={cmd!r},"
478498 "\n \t stdout=\n '{stdout_brief}',"
479499 "\n \t stderr=\n '{stderr_brief}', "
480500 "\n \t exit_code={exit_code!s},"
481- "\n {started})" .format (
501+ "\n {started}{spent} )" .format (
482502 cls = self .__class__ .__name__ ,
483503 cmd = self .cmd ,
484504 stdout_brief = self .stdout_brief ,
485505 stderr_brief = self .stderr_brief ,
486506 exit_code = self .exit_code ,
487- started = started
507+ started = started ,
508+ spent = spent
488509 )
489510 )
490511
0 commit comments