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
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-17 07:22 +0000
1"""Low-noise time-travel phase profiling."""
3from __future__ import annotations
5from contextlib import contextmanager
6import logging
7import os
8import time
9from typing import Iterator
12class TimeTravelProfiler:
13 """Environment-gated profiler for ObjectState-driven UI restore phases."""
15 env_var = "OBJECTSTATE_TIME_TRAVEL_PROFILE"
16 logger_name = "objectstate.time_travel_profile"
18 @classmethod
19 def enabled(cls) -> bool:
20 value = os.environ.get(cls.env_var, "")
21 return value.lower() in {"1", "true", "yes", "on"}
23 @classmethod
24 @contextmanager
25 def phase(cls, name: str, **facts: object) -> Iterator[None]:
26 if not cls.enabled():
27 yield
28 return
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 )