Coverage for fast_depends/library/serializer.py: 100%
25 statements
« prev ^ index » next coverage.py v7.17.3, created at 2026-11-13 05:19 +0000
« prev ^ index » next coverage.py v7.17.3, created at 2026-11-13 05:19 +0000
1import inspect 1abcdefghijklnopqrsmt
2import json 1abcdefghijklnopqrsmt
3from abc import ABC, abstractmethod 1abcdefghijklnopqrsmt
4from typing import Any, Protocol 1abcdefghijklnopqrsmt
7class OptionItem: 1abcdefghijklnopqrsmt
8 __slots__ = ( 1abcdefghijklnopqrsmt
9 "field_name",
10 "field_type",
11 "default_value",
12 "kind",
13 "source",
14 )
16 def __init__( 1abcdefghijklnopqrsmt
17 self,
18 field_name: str,
19 field_type: Any,
20 source: Any = None,
21 default_value: Any = ...,
22 kind: inspect._ParameterKind = inspect.Parameter.POSITIONAL_OR_KEYWORD,
23 ) -> None:
24 self.field_name = field_name 1abcdefghijklnopqrsmt
25 self.field_type = field_type 1abcdefghijklnopqrsmt
26 self.default_value = default_value 1abcdefghijklnopqrsmt
27 self.source = source 1abcdefghijklnopqrsmt
28 self.kind = kind 1abcdefghijklnopqrsmt
30 def __repr__(self) -> str: 1abcdefghijklnopqrsmt
31 type_name = getattr(self.field_type, "__name__", str(self.field_type)) 1abcdefghijklnopqrsmt
32 content = f"{self.field_name}, type=`{type_name}`" 1abcdefghijklnopqrsmt
33 if self.default_value is not Ellipsis: 1abcdefghijklnopqrsmt
34 content = f"{content}, default=`{self.default_value}`"
35 if self.source: 1abcdefghijklnopqrsmt
36 content = f"{content}, source=`{self.source}`"
37 return f"OptionItem[{content}]" 1abcdefghijklnopqrsmt
40class Serializer(ABC): 1abcdefghijklnopqrsmt
41 def __init__( 1abcdefghijklnopqrsmt
42 self,
43 *,
44 name: str,
45 options: list[OptionItem],
46 response_type: Any,
47 ):
48 self.name = name 1abcdefghijklnopqrsmt
49 self.options = {i.field_name: i for i in options} 1abcdefghijklnopqrsmt
50 self.response_option = { 1abcdefghijklnopqrsmt
51 "return": OptionItem(field_name="return", field_type=response_type),
52 }
54 def get_aliases(self) -> tuple[str, ...]: 1abcdefghijklnopqrsmt
55 return () 1abcdefghijklnopqrsmt
57 @abstractmethod 1abcdefghijklnopqrsmt
58 def __call__(self, call_kwargs: dict[str, Any]) -> dict[str, Any]: 1abcdefghijklnopqrsmt
59 raise NotImplementedError
61 def response(self, value: Any) -> Any: 1abcdefghijklnopqrsmt
62 return value 1abcdefghijklnopqrsmt
65class SerializerProto(Protocol): 1abcdefghijklnopqrsmt
66 def __call__( 1abcdefghijklnopqrsmt
67 self,
68 *,
69 name: str, 1abcdefghijklm
70 options: list[OptionItem], 1abcdefghijklm
71 response_type: Any, 1abcdefghijklm
72 ) -> Serializer: ... 1abcdefghijklm
74 @staticmethod 1abcdefghijklnopqrsmt
75 def encode(message: Any) -> bytes: 1abcdefghijklnopqrsmt
76 return json.dumps(message).encode("utf-8") 1abcdefghijklnopqrsmt