Coverage for src/objectstate/time_travel_profile.py: 76%

25 statements  

« prev     ^ index     » next       coverage.py v7.16.2, created at 2026-10-17 07:22 +0000

1"""Low-noise time-travel phase profiling.""" 

2 

3from __future__ import annotations 

4 

5from contextlib import contextmanager 

6import logging 

7import os 

8import time 

9from typing import Iterator 

10 

11 

12class TimeTravelProfiler: 

13 """Environment-gated profiler for ObjectState-driven UI restore phases.""" 

14 

15 env_var = "OBJECTSTATE_TIME_TRAVEL_PROFILE" 

16 logger_name = "objectstate.time_travel_profile" 

17 

18 @classmethod 

19 def enabled(cls) -> bool: 

20 value = os.environ.get(cls.env_var, "") 

21 return value.lower() in {"1", "true", "yes", "on"} 

22 

23 @classmethod 

24 @contextmanager 

25 def phase(cls, name: str, **facts: object) -> Iterator[None]: 

26 if not cls.enabled(): 

27 yield 

28 return 

29 

30 started = time.perf_counter() 

31 try: 

32 yield 

33 finally: 

34 elapsed_ms = (time.perf_counter() - started) * 1000.0 

35 fact_text = " ".join(f"{key}={value!r}" for key, value in facts.items()) 

36 logging.getLogger(cls.logger_name).info( 

37 "TT_PHASE name=%s elapsed_ms=%.3f%s%s", 

38 name, 

39 elapsed_ms, 

40 " " if fact_text else "", 

41 fact_text, 

42 )