Skip to content

Commit a2e16b5

Browse files
committed
Added more flexibility for request
1. Added `_build_request_lambda` function to be able to override function creation. Was used at Clopos, for ensuring header argument. 2. Now request fields are filtered out if they are UNSET
1 parent e2cc72a commit a2e16b5

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

src/integrify/api.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,21 @@ def add_handler(self, route_name: str, handler_class: type['APIPayloadHandler'])
7878
"""
7979
self.handlers[route_name] = handler_class()
8080

81+
def _build_request_lambda(
82+
self,
83+
func: Callable,
84+
url: str,
85+
verb: str,
86+
handler: 'APIPayloadHandler',
87+
) -> Callable:
88+
return lambda *args, **kwds: func(
89+
url,
90+
verb,
91+
handler,
92+
*(arg for arg in args if arg is not UNSET),
93+
**{k: v for k, v in kwds.items() if v is not UNSET},
94+
)
95+
8196
def __getattribute__(self, name: str) -> Any:
8297
"""Möcüzənin baş verdiyi yer:
8398
@@ -100,14 +115,7 @@ def __getattribute__(self, name: str) -> Any:
100115
handler = self.handlers.get(name, self.default_handler)
101116

102117
func = self.request_executor.request_function
103-
return lambda *args, **kwds: func(
104-
url,
105-
verb,
106-
handler,
107-
# Exclude unset values, to trigger pydantic defaults
108-
*(arg for arg in args if arg is not UNSET),
109-
**{k: v for k, v in kwds.items() if v is not UNSET},
110-
)
118+
return self._build_request_lambda(func, url, verb, handler)
111119

112120

113121
class APIPayloadHandler:
@@ -178,7 +186,6 @@ def handle_payload(self, *args, **kwds):
178186
return self.__req_model.model_dump(
179187
by_alias=True,
180188
exclude=self.req_model.URL_PARAM_FIELDS,
181-
exclude_unset=True,
182189
mode='json',
183190
)
184191

src/integrify/schemas.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import json
22
from typing import Any, ClassVar, Generic, Union
33

4-
from pydantic import BaseModel, Field, field_validator
4+
from pydantic import BaseModel, Field, field_validator, model_serializer
55
from typing_extensions import TypedDict
66

7-
from integrify.utils import _ResponseT
7+
from integrify.utils import UNSET, _ResponseT
88

99

1010
class APIResponse(BaseModel, Generic[_ResponseT]):
@@ -66,3 +66,9 @@ def from_args(cls, *args, **kwds):
6666
EYNİ OLMALIDIR, əks halda, bu method yararsızdır.
6767
"""
6868
return cls.model_validate({**dict(zip(cls.get_input_fields(), args)), **kwds})
69+
70+
@model_serializer(mode='wrap')
71+
def _serialize(self, serializer):
72+
data = serializer(self)
73+
# Exclude UNSET values
74+
return {k: v for k, v in data.items() if v is not UNSET}

0 commit comments

Comments
 (0)