"""Helpers for script and automation tracing and debugging.""" from __future__ import annotations from collections import OrderedDict from typing import Any, TypeVar _KT = TypeVar("_KT") _VT = TypeVar("_VT") class LimitedSizeDict(OrderedDict[_KT, _VT]): """OrderedDict limited in size.""" def __init__(self, *args: Any, **kwds: Any) -> None: """Initialize OrderedDict limited in size.""" self.size_limit = kwds.pop("size_limit", None) super().__init__(*args, **kwds) self._check_size_limit() def __setitem__(self, key: _KT, value: _VT) -> None: """Set item and check dict size.""" super().__setitem__(key, value) self._check_size_limit() def _check_size_limit(self) -> None: """Check dict size and evict items in FIFO order if needed.""" if self.size_limit is not None: while len(self) > self.size_limit: self.popitem(last=False)