Skip to content

Commit b2b1fbf

Browse files
gjtorikianclaude
andcommitted
fix: improve method names, restore timeout, add Event fields
Regenerated from updated emitter with: - Audit log exports: exports/export -> create_export/get_export - Authorization role permissions: unwieldy names replaced with set_organization_role_permissions, add_organization_role_permission, etc. - Default request timeout restored to 30s (was 25s) - Event model hand-maintained via oagen-ignore with id, event, data, created_at fields (emitter produces empty placeholder for oneOf unions) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 1be98d5 commit b2b1fbf

File tree

9 files changed

+155
-57
lines changed

9 files changed

+155
-57
lines changed

src/workos/_client.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ def __init__(
420420
self._request_timeout = (
421421
request_timeout
422422
if request_timeout is not None
423-
else int(os.environ.get("WORKOS_REQUEST_TIMEOUT", "25"))
423+
else int(os.environ.get("WORKOS_REQUEST_TIMEOUT", "30"))
424424
)
425425
self._max_retries = max_retries
426426
self._jwt_leeway = jwt_leeway
@@ -647,7 +647,7 @@ def __init__(
647647
api_key: WorkOS API key. Falls back to the WORKOS_API_KEY environment variable.
648648
client_id: WorkOS client ID. Falls back to the WORKOS_CLIENT_ID environment variable.
649649
base_url: Base URL for API requests. Falls back to WORKOS_BASE_URL or "https://api.workos.com".
650-
request_timeout: HTTP request timeout in seconds. Falls back to WORKOS_REQUEST_TIMEOUT or 25.
650+
request_timeout: HTTP request timeout in seconds. Falls back to WORKOS_REQUEST_TIMEOUT or 30.
651651
jwt_leeway: JWT clock skew leeway in seconds.
652652
max_retries: Maximum number of retries for failed requests. Defaults to 3.
653653
@@ -926,7 +926,7 @@ def __init__(
926926
api_key: WorkOS API key. Falls back to the WORKOS_API_KEY environment variable.
927927
client_id: WorkOS client ID. Falls back to the WORKOS_CLIENT_ID environment variable.
928928
base_url: Base URL for API requests. Falls back to WORKOS_BASE_URL or "https://api.workos.com".
929-
request_timeout: HTTP request timeout in seconds. Falls back to WORKOS_REQUEST_TIMEOUT or 25.
929+
request_timeout: HTTP request timeout in seconds. Falls back to WORKOS_REQUEST_TIMEOUT or 30.
930930
jwt_leeway: JWT clock skew leeway in seconds.
931931
max_retries: Maximum number of retries for failed requests. Defaults to 3.
932932

src/workos/audit_logs/_resource.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ def create_events(
219219
request_options=request_options,
220220
)
221221

222-
def exports(
222+
def create_export(
223223
self,
224224
*,
225225
organization_id: str,
@@ -278,7 +278,11 @@ def exports(
278278
request_options=request_options,
279279
)
280280

281-
def export(
281+
def exports(self, *args: Any, **kwargs: Any) -> Any:
282+
"""Compatibility alias for `create_export`."""
283+
return self.create_export(*args, **kwargs)
284+
285+
def get_export(
282286
self,
283287
audit_log_export_id: str,
284288
*,
@@ -308,6 +312,10 @@ def export(
308312
request_options=request_options,
309313
)
310314

315+
def export(self, *args: Any, **kwargs: Any) -> Any:
316+
"""Compatibility alias for `get_export`."""
317+
return self.get_export(*args, **kwargs)
318+
311319

312320
class AsyncAuditLogs:
313321
"""Audit Logs API resources (async)."""
@@ -507,7 +515,7 @@ async def create_events(
507515
request_options=request_options,
508516
)
509517

510-
async def exports(
518+
async def create_export(
511519
self,
512520
*,
513521
organization_id: str,
@@ -566,7 +574,11 @@ async def exports(
566574
request_options=request_options,
567575
)
568576

569-
async def export(
577+
async def exports(self, *args: Any, **kwargs: Any) -> Any:
578+
"""Compatibility alias for `create_export`."""
579+
return await self.create_export(*args, **kwargs)
580+
581+
async def get_export(
570582
self,
571583
audit_log_export_id: str,
572584
*,
@@ -595,3 +607,7 @@ async def export(
595607
model=AuditLogExportJson,
596608
request_options=request_options,
597609
)
610+
611+
async def export(self, *args: Any, **kwargs: Any) -> Any:
612+
"""Compatibility alias for `get_export`."""
613+
return await self.get_export(*args, **kwargs)

src/workos/authorization/_resource.py

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -534,7 +534,7 @@ def delete_roles(self, *args: Any, **kwargs: Any) -> Any:
534534
"""Compatibility alias for `delete_organization_role`."""
535535
return self.delete_organization_role(*args, **kwargs)
536536

537-
def add_permission_permissions_organizations_roles(
537+
def add_organization_role_permission(
538538
self,
539539
organization_id: str,
540540
slug: str,
@@ -575,7 +575,13 @@ def add_permission_permissions_organizations_roles(
575575
request_options=request_options,
576576
)
577577

578-
def set_permissions_permissions_organizations_roles(
578+
def add_permission_permissions_organizations_roles(
579+
self, *args: Any, **kwargs: Any
580+
) -> Any:
581+
"""Compatibility alias for `add_organization_role_permission`."""
582+
return self.add_organization_role_permission(*args, **kwargs)
583+
584+
def set_organization_role_permissions(
579585
self,
580586
organization_id: str,
581587
slug: str,
@@ -615,7 +621,13 @@ def set_permissions_permissions_organizations_roles(
615621
request_options=request_options,
616622
)
617623

618-
def remove_permission(
624+
def set_permissions_permissions_organizations_roles(
625+
self, *args: Any, **kwargs: Any
626+
) -> Any:
627+
"""Compatibility alias for `set_organization_role_permissions`."""
628+
return self.set_organization_role_permissions(*args, **kwargs)
629+
630+
def remove_organization_role_permission(
619631
self,
620632
organization_id: str,
621633
slug: str,
@@ -646,6 +658,10 @@ def remove_permission(
646658
request_options=request_options,
647659
)
648660

661+
def remove_permission(self, *args: Any, **kwargs: Any) -> Any:
662+
"""Compatibility alias for `remove_organization_role_permission`."""
663+
return self.remove_organization_role_permission(*args, **kwargs)
664+
649665
def get_by_external_id(
650666
self,
651667
organization_id: str,
@@ -1317,7 +1333,7 @@ def update_roles(
13171333
request_options=request_options,
13181334
)
13191335

1320-
def add_permission_permissions_roles(
1336+
def add_environment_role_permission(
13211337
self,
13221338
slug: str,
13231339
*,
@@ -1356,7 +1372,11 @@ def add_permission_permissions_roles(
13561372
request_options=request_options,
13571373
)
13581374

1359-
def set_permissions_permissions_roles(
1375+
def add_permission_permissions_roles(self, *args: Any, **kwargs: Any) -> Any:
1376+
"""Compatibility alias for `add_environment_role_permission`."""
1377+
return self.add_environment_role_permission(*args, **kwargs)
1378+
1379+
def set_environment_role_permissions(
13601380
self,
13611381
slug: str,
13621382
*,
@@ -1395,6 +1415,10 @@ def set_permissions_permissions_roles(
13951415
request_options=request_options,
13961416
)
13971417

1418+
def set_permissions_permissions_roles(self, *args: Any, **kwargs: Any) -> Any:
1419+
"""Compatibility alias for `set_environment_role_permissions`."""
1420+
return self.set_environment_role_permissions(*args, **kwargs)
1421+
13981422

13991423
class AsyncAuthorization:
14001424
"""Authorization API resources (async)."""
@@ -1909,7 +1933,7 @@ async def delete_roles(self, *args: Any, **kwargs: Any) -> Any:
19091933
"""Compatibility alias for `delete_organization_role`."""
19101934
return await self.delete_organization_role(*args, **kwargs)
19111935

1912-
async def add_permission_permissions_organizations_roles(
1936+
async def add_organization_role_permission(
19131937
self,
19141938
organization_id: str,
19151939
slug: str,
@@ -1950,7 +1974,13 @@ async def add_permission_permissions_organizations_roles(
19501974
request_options=request_options,
19511975
)
19521976

1953-
async def set_permissions_permissions_organizations_roles(
1977+
async def add_permission_permissions_organizations_roles(
1978+
self, *args: Any, **kwargs: Any
1979+
) -> Any:
1980+
"""Compatibility alias for `add_organization_role_permission`."""
1981+
return await self.add_organization_role_permission(*args, **kwargs)
1982+
1983+
async def set_organization_role_permissions(
19541984
self,
19551985
organization_id: str,
19561986
slug: str,
@@ -1990,7 +2020,13 @@ async def set_permissions_permissions_organizations_roles(
19902020
request_options=request_options,
19912021
)
19922022

1993-
async def remove_permission(
2023+
async def set_permissions_permissions_organizations_roles(
2024+
self, *args: Any, **kwargs: Any
2025+
) -> Any:
2026+
"""Compatibility alias for `set_organization_role_permissions`."""
2027+
return await self.set_organization_role_permissions(*args, **kwargs)
2028+
2029+
async def remove_organization_role_permission(
19942030
self,
19952031
organization_id: str,
19962032
slug: str,
@@ -2021,6 +2057,10 @@ async def remove_permission(
20212057
request_options=request_options,
20222058
)
20232059

2060+
async def remove_permission(self, *args: Any, **kwargs: Any) -> Any:
2061+
"""Compatibility alias for `remove_organization_role_permission`."""
2062+
return await self.remove_organization_role_permission(*args, **kwargs)
2063+
20242064
async def get_by_external_id(
20252065
self,
20262066
organization_id: str,
@@ -2692,7 +2732,7 @@ async def update_roles(
26922732
request_options=request_options,
26932733
)
26942734

2695-
async def add_permission_permissions_roles(
2735+
async def add_environment_role_permission(
26962736
self,
26972737
slug: str,
26982738
*,
@@ -2731,7 +2771,11 @@ async def add_permission_permissions_roles(
27312771
request_options=request_options,
27322772
)
27332773

2734-
async def set_permissions_permissions_roles(
2774+
async def add_permission_permissions_roles(self, *args: Any, **kwargs: Any) -> Any:
2775+
"""Compatibility alias for `add_environment_role_permission`."""
2776+
return await self.add_environment_role_permission(*args, **kwargs)
2777+
2778+
async def set_environment_role_permissions(
27352779
self,
27362780
slug: str,
27372781
*,
@@ -2769,3 +2813,7 @@ async def set_permissions_permissions_roles(
27692813
model=Role,
27702814
request_options=request_options,
27712815
)
2816+
2817+
async def set_permissions_permissions_roles(self, *args: Any, **kwargs: Any) -> Any:
2818+
"""Compatibility alias for `set_environment_role_permissions`."""
2819+
return await self.set_environment_role_permissions(*args, **kwargs)

src/workos/events/models/event.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,49 @@
33
from __future__ import annotations
44

55
from dataclasses import dataclass
6-
from typing import Any, Dict
6+
from typing import Any, Dict, Optional
77
from workos._errors import BaseRequestException
88

99

10+
# @oagen-ignore-start
1011
@dataclass(slots=True)
1112
class Event:
12-
"""An event emitted by WorkOS."""
13+
"""An event emitted by WorkOS.
1314
14-
pass
15+
The ``event`` field is the discriminator (e.g. ``"dsync.activated"``).
16+
``data`` contains the event-specific payload as a dictionary.
17+
"""
18+
19+
id: str
20+
event: str
21+
data: Dict[str, Any]
22+
created_at: Optional[str] = None
1523

1624
@classmethod
1725
def from_dict(cls, data: Dict[str, Any]) -> "Event":
1826
"""Deserialize from a dictionary."""
1927
try:
20-
return cls()
28+
return cls(
29+
id=data["id"],
30+
event=data["event"],
31+
data=data.get("data", {}),
32+
created_at=data.get("created_at"),
33+
)
2134
except (KeyError, ValueError) as e:
2235
raise BaseRequestException(
2336
f"Unexpected API response while parsing Event: {e!s}"
2437
) from e
2538

2639
def to_dict(self) -> Dict[str, Any]:
2740
"""Serialize to a dictionary."""
28-
result: Dict[str, Any] = {}
41+
result: Dict[str, Any] = {
42+
"id": self.id,
43+
"event": self.event,
44+
"data": self.data,
45+
}
46+
if self.created_at is not None:
47+
result["created_at"] = self.created_at
2948
return result
49+
50+
51+
# @oagen-ignore-end

tests/fixtures/event.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,9 @@
1-
{}
1+
{
2+
"id": "event_01FGCPNV312FHFRCX0BYQVBMEQ",
3+
"event": "dsync.activated",
4+
"data": {
5+
"id": "directory_01FGCPNV312FHFRCX0BYQVBMEQ",
6+
"name": "Foo Corp's Directory"
7+
},
8+
"created_at": "2021-10-28T15:13:51.486Z"
9+
}

tests/fixtures/list_event.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
{
22
"data": [
3-
{}
3+
{
4+
"id": "event_01FGCPNV312FHFRCX0BYQVBMEQ",
5+
"event": "dsync.activated",
6+
"data": {
7+
"id": "directory_01FGCPNV312FHFRCX0BYQVBMEQ",
8+
"name": "Foo Corp's Directory"
9+
},
10+
"created_at": "2021-10-28T15:13:51.486Z"
11+
}
412
],
513
"list_metadata": {
614
"before": null,

tests/test_audit_logs.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -111,11 +111,11 @@ def test_create_events(self, workos, httpx_mock):
111111
assert body["organization_id"] == "test_organization_id"
112112
assert "event" in body
113113

114-
def test_exports(self, workos, httpx_mock):
114+
def test_create_export(self, workos, httpx_mock):
115115
httpx_mock.add_response(
116116
json=load_fixture("audit_log_export_json.json"),
117117
)
118-
result = workos.audit_logs.exports(
118+
result = workos.audit_logs.create_export(
119119
organization_id="test_organization_id",
120120
range_start="test_range_start",
121121
range_end="test_range_end",
@@ -131,11 +131,11 @@ def test_exports(self, workos, httpx_mock):
131131
assert body["range_start"] == "test_range_start"
132132
assert body["range_end"] == "test_range_end"
133133

134-
def test_export(self, workos, httpx_mock):
134+
def test_get_export(self, workos, httpx_mock):
135135
httpx_mock.add_response(
136136
json=load_fixture("audit_log_export_json.json"),
137137
)
138-
result = workos.audit_logs.export("test_auditLogExportId")
138+
result = workos.audit_logs.get_export("test_auditLogExportId")
139139
assert isinstance(result, AuditLogExportJson)
140140
assert result.object == "audit_log_export"
141141
assert result.id == "audit_log_export_01GBZK5MP7TD1YCFQHFR22180V"
@@ -264,9 +264,9 @@ async def test_create_events(self, async_workos, httpx_mock):
264264
assert request.method == "POST"
265265
assert request.url.path.endswith("/audit_logs/events")
266266

267-
async def test_exports(self, async_workos, httpx_mock):
267+
async def test_create_export(self, async_workos, httpx_mock):
268268
httpx_mock.add_response(json=load_fixture("audit_log_export_json.json"))
269-
result = await async_workos.audit_logs.exports(
269+
result = await async_workos.audit_logs.create_export(
270270
organization_id="test_organization_id",
271271
range_start="test_range_start",
272272
range_end="test_range_end",
@@ -278,9 +278,9 @@ async def test_exports(self, async_workos, httpx_mock):
278278
assert request.method == "POST"
279279
assert request.url.path.endswith("/audit_logs/exports")
280280

281-
async def test_export(self, async_workos, httpx_mock):
281+
async def test_get_export(self, async_workos, httpx_mock):
282282
httpx_mock.add_response(json=load_fixture("audit_log_export_json.json"))
283-
result = await async_workos.audit_logs.export("test_auditLogExportId")
283+
result = await async_workos.audit_logs.get_export("test_auditLogExportId")
284284
assert isinstance(result, AuditLogExportJson)
285285
assert result.object == "audit_log_export"
286286
assert result.id == "audit_log_export_01GBZK5MP7TD1YCFQHFR22180V"

0 commit comments

Comments
 (0)