Skip to content

Commit 751125c

Browse files
joamagclaude
andcommitted
fix: preserve reserved kwargs in API build() calls
Sanitize params after invoking build() so build hooks receive the full kwargs, while the outgoing HTTP request still strips reserved keys. Adds cls_t argument to _sanitize_kwargs/_desanitize_kwargs to preserve OrderedDict ordering. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent cabb087 commit 751125c

2 files changed

Lines changed: 15 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1717

1818
### Fixed
1919

20-
*
20+
* Preserve reserved kwargs in `build()` calls by sanitizing params after build in API HTTP methods
2121

2222
## [1.45.2] - 2026-04-09
2323

src/appier/api.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,10 @@ def get(
120120
extra = extra or dict()
121121
extra.update(dict(uuid=str(uuid.uuid4())))
122122
extra.update(self._desanitize_kwargs(kwargs))
123-
params = structures.OrderedDict(params or self._sanitize_kwargs(kwargs))
123+
params = structures.OrderedDict(params or kwargs)
124124
auth_callback = self.auth_callback if callback else None
125125
self.build("GET", url, headers=headers, params=params, kwargs=kwargs)
126+
params = self._sanitize_kwargs(params, cls_t=structures.OrderedDict)
126127
return self.request(
127128
http.get,
128129
url,
@@ -157,7 +158,7 @@ def post(
157158
extra = extra or dict()
158159
extra.update(dict(uuid=str(uuid.uuid4())))
159160
extra.update(self._desanitize_kwargs(kwargs))
160-
params = structures.OrderedDict(params or self._sanitize_kwargs(kwargs))
161+
params = structures.OrderedDict(params or kwargs)
161162
auth_callback = self.auth_callback if callback else None
162163
self.build(
163164
"POST",
@@ -170,6 +171,7 @@ def post(
170171
mime=mime,
171172
kwargs=kwargs,
172173
)
174+
params = self._sanitize_kwargs(params, cls_t=structures.OrderedDict)
173175
return self.request(
174176
http.post,
175177
url,
@@ -208,7 +210,7 @@ def put(
208210
extra = extra or dict()
209211
extra.update(dict(uuid=str(uuid.uuid4())))
210212
extra.update(self._desanitize_kwargs(kwargs))
211-
params = structures.OrderedDict(params or self._sanitize_kwargs(kwargs))
213+
params = structures.OrderedDict(params or kwargs)
212214
auth_callback = self.auth_callback if callback else None
213215
self.build(
214216
"PUT",
@@ -221,6 +223,7 @@ def put(
221223
mime=mime,
222224
kwargs=kwargs,
223225
)
226+
params = self._sanitize_kwargs(params, cls_t=structures.OrderedDict)
224227
return self.request(
225228
http.put,
226229
url,
@@ -255,9 +258,10 @@ def delete(
255258
extra = extra or dict()
256259
extra.update(dict(uuid=str(uuid.uuid4())))
257260
extra.update(self._desanitize_kwargs(kwargs))
258-
params = structures.OrderedDict(params or self._sanitize_kwargs(kwargs))
261+
params = structures.OrderedDict(params or kwargs)
259262
auth_callback = self.auth_callback if callback else None
260263
self.build("DELETE", url, headers=headers, params=params, kwargs=kwargs)
264+
params = self._sanitize_kwargs(params, cls_t=structures.OrderedDict)
261265
return self.request(
262266
http.delete,
263267
url,
@@ -292,7 +296,7 @@ def patch(
292296
extra = extra or dict()
293297
extra.update(dict(uuid=str(uuid.uuid4())))
294298
extra.update(self._desanitize_kwargs(kwargs))
295-
params = structures.OrderedDict(params or self._sanitize_kwargs(kwargs))
299+
params = structures.OrderedDict(params or kwargs)
296300
auth_callback = self.auth_callback if callback else None
297301
self.build(
298302
"PATCH",
@@ -305,6 +309,7 @@ def patch(
305309
mime=mime,
306310
kwargs=kwargs,
307311
)
312+
params = self._sanitize_kwargs(params, cls_t=structures.OrderedDict)
308313
return self.request(
309314
http.patch,
310315
url,
@@ -347,16 +352,16 @@ def build(
347352
def handle_error(self, error):
348353
raise
349354

350-
def _sanitize_kwargs(self, kwargs):
351-
params = dict()
355+
def _sanitize_kwargs(self, kwargs, cls_t=dict):
356+
params = cls_t()
352357
for key, value in kwargs.items():
353358
if key in RESERVED_KWARGS:
354359
continue
355360
params[key] = value
356361
return params
357362

358-
def _desanitize_kwargs(self, kwargs):
359-
params = dict()
363+
def _desanitize_kwargs(self, kwargs, cls_t=dict):
364+
params = cls_t()
360365
for key, value in kwargs.items():
361366
if not key in RESERVED_KWARGS:
362367
continue

0 commit comments

Comments
 (0)