Coverage for src/blob_dict/blob/json.py: 0%

35 statements  

« prev     ^ index     » next       coverage.py v7.7.1, created at 2025-03-29 08:37 -0700

1from __future__ import annotations 

2 

3import json 

4from typing import Any, override 

5 

6from pydantic import BaseModel 

7 

8from . import StrBlob 

9 

10 

11class JsonDictBlob(StrBlob): 

12 def __init__(self, blob: bytes | str | dict[str, Any]) -> None: 

13 if isinstance(blob, dict): 

14 blob = json.dumps(blob) 

15 

16 super().__init__(blob) 

17 

18 def as_dict(self) -> dict[str, Any]: 

19 return json.loads(self._blob_bytes) 

20 

21 @override 

22 def __repr__(self) -> str: 

23 return f"{self.__class__.__name__}({self.as_dict().__repr__()})" 

24 

25 

26class JsonModelBlob(JsonDictBlob): 

27 __MISSING_MODEL_CLASS_ERROR_MESSAGE = "Must specify Pydantic model class if specified blob is not a model object" # noqa: E501 

28 __BAD_MODEL_CLASS_ERROR_MESSAGE = "Must specify Pydantic model class that inherits from `BaseModel`" # noqa: E501 

29 

30 def __init__( 

31 self, 

32 blob: bytes | str | dict[str, Any] | BaseModel, 

33 *, 

34 model_class: type[BaseModel] | None = None, 

35 ) -> None: 

36 if not isinstance(blob, BaseModel) and not model_class: 

37 raise ValueError(JsonModelBlob.__MISSING_MODEL_CLASS_ERROR_MESSAGE) 

38 

39 if model_class == BaseModel: 

40 raise ValueError(JsonModelBlob.__BAD_MODEL_CLASS_ERROR_MESSAGE) 

41 

42 self.__model_class: type[BaseModel] 

43 if isinstance(blob, BaseModel): 

44 self.__model_class = type(blob) 

45 blob = blob.model_dump_json() 

46 elif model_class: 

47 self.__model_class = model_class 

48 

49 super().__init__(blob) 

50 

51 def as_model(self) -> BaseModel: 

52 return self.__model_class.model_validate_json(self._blob_bytes) 

53 

54 @override 

55 def __repr__(self) -> str: 

56 return f"{self.__class__.__name__}({self.as_model().__repr__()})"