Coverage for src/blob_dict/blob/json.py: 0%
35 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-27 22:31 -0700
« prev ^ index » next coverage.py v7.7.1, created at 2025-03-27 22:31 -0700
1from __future__ import annotations
3import json
4from typing import Any, override
6from pydantic import BaseModel
8from . import StrBlob
11class JsonDictBlob(StrBlob):
12 def __init__(self, blob: bytes | str | dict[str, Any]) -> None:
13 if isinstance(blob, dict):
14 blob = json.dumps(blob)
16 super().__init__(blob)
18 def as_dict(self) -> dict[str, Any]:
19 return json.loads(self._blob_bytes)
21 @override
22 def __repr__(self) -> str:
23 return f"{self.__class__.__name__}({self.as_dict().__repr__()})"
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
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)
39 if model_class == BaseModel:
40 raise ValueError(JsonModelBlob.__BAD_MODEL_CLASS_ERROR_MESSAGE)
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
49 super().__init__(blob)
51 def as_model(self) -> BaseModel:
52 return self.__model_class.model_validate_json(self._blob_bytes)
54 @override
55 def __repr__(self) -> str:
56 return f"{self.__class__.__name__}({self.as_model().__repr__()})"