Skip to content

Commit 80ac8ca

Browse files
authored
Merge branch 'main' into birdcar/trusted-publishing
2 parents d68cfee + 3248f49 commit 80ac8ca

File tree

4 files changed

+85
-12
lines changed

4 files changed

+85
-12
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "workos"
3-
version = "5.39.0"
3+
version = "5.39.1"
44
description = "WorkOS Python Client"
55
readme = "README.md"
66
license = "MIT"

src/workos/directory_sync.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional, Protocol
1+
from typing import Any, Dict, Optional, Protocol, Union
22

33
from workos.types.directory_sync.list_filters import (
44
DirectoryGroupListFilters,
@@ -32,6 +32,24 @@
3232
Directory, DirectoryListFilters, ListMetadata
3333
]
3434

35+
# Mapping from SDK parameter names to API parameter names
36+
PARAM_KEY_MAPPING = {
37+
"directory_id": "directory",
38+
"group_id": "group",
39+
"user_id": "user",
40+
}
41+
42+
43+
def _prepare_request_params(
44+
list_params: Union[DirectoryUserListFilters, DirectoryGroupListFilters],
45+
) -> Dict[str, Any]:
46+
"""Convert list_params to API request params by renaming keys."""
47+
request_params: Dict[str, Any] = dict(list_params)
48+
for sdk_key, api_key in PARAM_KEY_MAPPING.items():
49+
if sdk_key in request_params:
50+
request_params[api_key] = request_params.pop(sdk_key)
51+
return request_params
52+
3553

3654
class DirectorySyncModule(Protocol):
3755
"""Offers methods through the WorkOS Directory Sync service."""
@@ -191,7 +209,7 @@ def list_users(
191209
response = self._http_client.request(
192210
"directory_users",
193211
method=REQUEST_METHOD_GET,
194-
params=list_params,
212+
params=_prepare_request_params(list_params),
195213
)
196214

197215
return WorkOSListResource(
@@ -225,7 +243,7 @@ def list_groups(
225243
response = self._http_client.request(
226244
"directory_groups",
227245
method=REQUEST_METHOD_GET,
228-
params=list_params,
246+
params=_prepare_request_params(list_params),
229247
)
230248

231249
return WorkOSListResource[
@@ -329,7 +347,7 @@ async def list_users(
329347
response = await self._http_client.request(
330348
"directory_users",
331349
method=REQUEST_METHOD_GET,
332-
params=list_params,
350+
params=_prepare_request_params(list_params),
333351
)
334352

335353
return WorkOSListResource(
@@ -354,6 +372,7 @@ async def list_groups(
354372
"after": after,
355373
"order": order,
356374
}
375+
357376
if user_id is not None:
358377
list_params["user_id"] = user_id
359378
if directory_id is not None:
@@ -362,7 +381,7 @@ async def list_groups(
362381
response = await self._http_client.request(
363382
"directory_groups",
364383
method=REQUEST_METHOD_GET,
365-
params=list_params,
384+
params=_prepare_request_params(list_params),
366385
)
367386

368387
return WorkOSListResource[

tests/test_directory_sync.py

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from typing import Union
22

33
import pytest
4-
from workos.directory_sync import AsyncDirectorySync, DirectorySync
54

65
from tests.types.test_auto_pagination_function import TestAutoPaginationFunction
76
from tests.utils.fixtures.mock_directory import (
@@ -13,6 +12,11 @@
1312
from tests.utils.fixtures.mock_directory_user import MockDirectoryUser
1413
from tests.utils.list_resource import list_data_to_dicts, list_response_of
1514
from tests.utils.syncify import syncify
15+
from workos.directory_sync import (
16+
_prepare_request_params,
17+
AsyncDirectorySync,
18+
DirectorySync,
19+
)
1620

1721

1822
def api_directory_to_sdk(directory):
@@ -145,7 +149,7 @@ def test_list_users_with_directory(
145149
assert request_kwargs["url"].endswith("/directory_users")
146150
assert request_kwargs["method"] == "get"
147151
assert request_kwargs["params"] == {
148-
"directory_id": "directory_id",
152+
"directory": "directory_id",
149153
"limit": 10,
150154
"order": "desc",
151155
}
@@ -163,7 +167,7 @@ def test_list_users_with_group(
163167
assert request_kwargs["url"].endswith("/directory_users")
164168
assert request_kwargs["method"] == "get"
165169
assert request_kwargs["params"] == {
166-
"group_id": "directory_grp_id",
170+
"group": "directory_grp_id",
167171
"limit": 10,
168172
"order": "desc",
169173
}
@@ -181,7 +185,7 @@ def test_list_groups_with_directory(
181185
assert request_kwargs["url"].endswith("/directory_groups")
182186
assert request_kwargs["method"] == "get"
183187
assert request_kwargs["params"] == {
184-
"directory_id": "directory_id",
188+
"directory": "directory_id",
185189
"limit": 10,
186190
"order": "desc",
187191
}
@@ -199,7 +203,7 @@ def test_list_groups_with_user(
199203
assert request_kwargs["url"].endswith("/directory_groups")
200204
assert request_kwargs["method"] == "get"
201205
assert request_kwargs["params"] == {
202-
"user_id": "directory_user_id",
206+
"user": "directory_user_id",
203207
"limit": 10,
204208
"order": "desc",
205209
}
@@ -371,3 +375,53 @@ def test_directory_user_groups_auto_pagination(
371375
list_function=self.directory_sync.list_groups,
372376
expected_all_page_data=mock_directory_groups_multiple_data_pages,
373377
)
378+
379+
380+
class TestPrepareRequestParams:
381+
"""Tests for SDK-to-API parameter name translation.
382+
383+
The SDK uses Pythonic parameter names (directory_id, group_id, user_id)
384+
but the WorkOS API expects shorter names (directory, group, user).
385+
The _prepare_request_params function handles this translation.
386+
387+
See: https://github.com/workos/workos-python/issues/511
388+
See: https://github.com/workos/workos-python/issues/519
389+
"""
390+
391+
def test_translates_directory_id_to_directory(self):
392+
params = {"directory_id": "dir_123", "limit": 10}
393+
result = _prepare_request_params(params)
394+
assert "directory" in result
395+
assert "directory_id" not in result
396+
assert result["directory"] == "dir_123"
397+
398+
def test_translates_group_id_to_group(self):
399+
params = {"group_id": "grp_123", "limit": 10}
400+
result = _prepare_request_params(params)
401+
assert "group" in result
402+
assert "group_id" not in result
403+
assert result["group"] == "grp_123"
404+
405+
def test_translates_user_id_to_user(self):
406+
params = {"user_id": "usr_123", "limit": 10}
407+
result = _prepare_request_params(params)
408+
assert "user" in result
409+
assert "user_id" not in result
410+
assert result["user"] == "usr_123"
411+
412+
def test_preserves_non_id_params(self):
413+
params = {
414+
"directory_id": "dir_123",
415+
"limit": 10,
416+
"order": "desc",
417+
"after": "cursor",
418+
}
419+
result = _prepare_request_params(params)
420+
assert result["limit"] == 10
421+
assert result["order"] == "desc"
422+
assert result["after"] == "cursor"
423+
424+
def test_handles_empty_params(self):
425+
params = {"limit": 10, "order": "desc"}
426+
result = _prepare_request_params(params)
427+
assert result == {"limit": 10, "order": "desc"}

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)