Coverage for src / lexigram / admin / data / lazy.py: 0%

20 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-08-11 02:25 +0800

1"""Lazy loading and deferred field support for large data models.""" 

2 

3from __future__ import annotations 

4 

5from collections.abc import Awaitable, Callable 

6from typing import Any, Generic, TypeVar 

7 

8T = TypeVar("T") 

9 

10 

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 """ 

16 

17 def __init__(self, loader: Callable[[], Awaitable[T]]): 

18 self._loader = loader 

19 self._value: T | None = None 

20 self._loaded = False 

21 

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] 

28 

29 @property 

30 def is_loaded(self) -> bool: 

31 return self._loaded 

32 

33 

34class DeferredField: 

35 """ 

36 Marker for fields that should be excluded from default SELECT 

37 and only fetched when explicitly requested. 

38 """ 

39 

40 def __init__(self, original_type: Any): 

41 self.original_type = original_type