Coverage for src/lexigram/admin/data/lazy.py: 100%
20 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 14:56 +0800
1"""Lazy loading and deferred field support for large data models."""
3from __future__ import annotations
5from collections.abc import Awaitable, Callable
6from typing import Any, Generic, TypeVar
8T = TypeVar("T")
11class LazyField(Generic[T]):
12 """
13 A field that loads its value only on demand.
14 Useful for heavy BLOBs, large JSON fields, or remote related data.
15 """
17 def __init__(self, loader: Callable[[], Awaitable[T]]):
18 self._loader = loader
19 self._value: T | None = None
20 self._loaded = False
22 async def get(self) -> T:
23 """Fetch and return the value, caching it for future calls."""
24 if not self._loaded:
25 self._value = await self._loader()
26 self._loaded = True
27 return self._value # type: ignore[return-value]
29 @property
30 def is_loaded(self) -> bool:
31 return self._loaded
34class DeferredField:
35 """
36 Marker for fields that should be excluded from default SELECT
37 and only fetched when explicitly requested.
38 """
40 def __init__(self, original_type: Any):
41 self.original_type = original_type