workos 5.33.0__py3-none-any.whl → 5.35.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
workos/__about__.py CHANGED
@@ -12,7 +12,7 @@ __package_name__ = "workos"
12
12
 
13
13
  __package_url__ = "https://github.com/workos-inc/workos-python"
14
14
 
15
- __version__ = "5.33.0"
15
+ __version__ = "5.35.0"
16
16
 
17
17
  __author__ = "WorkOS"
18
18
 
workos/_base_client.py CHANGED
@@ -1,21 +1,21 @@
1
- from abc import abstractmethod
2
1
  import os
2
+ from abc import abstractmethod
3
3
  from typing import Optional
4
- from workos.__about__ import __version__
4
+
5
5
  from workos._client_configuration import ClientConfiguration
6
- from workos.fga import FGAModule
7
- from workos.utils._base_http_client import DEFAULT_REQUEST_TIMEOUT
8
- from workos.utils.http_client import HTTPClient
6
+ from workos.api_keys import ApiKeysModule
9
7
  from workos.audit_logs import AuditLogsModule
10
8
  from workos.directory_sync import DirectorySyncModule
11
9
  from workos.events import EventsModule
10
+ from workos.fga import FGAModule
12
11
  from workos.mfa import MFAModule
13
- from workos.organizations import OrganizationsModule
14
12
  from workos.organization_domains import OrganizationDomainsModule
13
+ from workos.organizations import OrganizationsModule
15
14
  from workos.passwordless import PasswordlessModule
16
15
  from workos.portal import PortalModule
17
16
  from workos.sso import SSOModule
18
17
  from workos.user_management import UserManagementModule
18
+ from workos.utils._base_http_client import DEFAULT_REQUEST_TIMEOUT
19
19
  from workos.webhooks import WebhooksModule
20
20
 
21
21
 
@@ -65,6 +65,10 @@ class BaseClient(ClientConfiguration):
65
65
  else int(os.getenv("WORKOS_REQUEST_TIMEOUT", DEFAULT_REQUEST_TIMEOUT))
66
66
  )
67
67
 
68
+ @property
69
+ @abstractmethod
70
+ def api_keys(self) -> ApiKeysModule: ...
71
+
68
72
  @property
69
73
  @abstractmethod
70
74
  def audit_logs(self) -> AuditLogsModule: ...
workos/api_keys.py ADDED
@@ -0,0 +1,53 @@
1
+ from typing import Optional, Protocol
2
+
3
+ from workos.types.api_keys import ApiKey
4
+ from workos.typing.sync_or_async import SyncOrAsync
5
+ from workos.utils.http_client import AsyncHTTPClient, SyncHTTPClient
6
+ from workos.utils.request_helper import REQUEST_METHOD_POST
7
+
8
+ API_KEY_VALIDATION_PATH = "api_keys/validations"
9
+ RESOURCE_OBJECT_ATTRIBUTE_NAME = "api_key"
10
+
11
+
12
+ class ApiKeysModule(Protocol):
13
+ def validate_api_key(self, *, value: str) -> SyncOrAsync[Optional[ApiKey]]:
14
+ """Validate an API key.
15
+
16
+ Kwargs:
17
+ value (str): API key value
18
+
19
+ Returns:
20
+ Optional[ApiKey]: Returns ApiKey resource object
21
+ if supplied value was valid, None if it was not
22
+ """
23
+ ...
24
+
25
+
26
+ class ApiKeys(ApiKeysModule):
27
+ _http_client: SyncHTTPClient
28
+
29
+ def __init__(self, http_client: SyncHTTPClient):
30
+ self._http_client = http_client
31
+
32
+ def validate_api_key(self, *, value: str) -> Optional[ApiKey]:
33
+ response = self._http_client.request(
34
+ API_KEY_VALIDATION_PATH, method=REQUEST_METHOD_POST, json={"value": value}
35
+ )
36
+ if response.get(RESOURCE_OBJECT_ATTRIBUTE_NAME) is None:
37
+ return None
38
+ return ApiKey.model_validate(response[RESOURCE_OBJECT_ATTRIBUTE_NAME])
39
+
40
+
41
+ class AsyncApiKeys(ApiKeysModule):
42
+ _http_client: AsyncHTTPClient
43
+
44
+ def __init__(self, http_client: AsyncHTTPClient):
45
+ self._http_client = http_client
46
+
47
+ async def validate_api_key(self, *, value: str) -> Optional[ApiKey]:
48
+ response = await self._http_client.request(
49
+ API_KEY_VALIDATION_PATH, method=REQUEST_METHOD_POST, json={"value": value}
50
+ )
51
+ if response.get(RESOURCE_OBJECT_ATTRIBUTE_NAME) is None:
52
+ return None
53
+ return ApiKey.model_validate(response[RESOURCE_OBJECT_ATTRIBUTE_NAME])
workos/async_client.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from typing import Optional
2
2
  from workos.__about__ import __version__
3
3
  from workos._base_client import BaseClient
4
+ from workos.api_keys import AsyncApiKeys
4
5
  from workos.audit_logs import AuditLogsModule
5
6
  from workos.directory_sync import AsyncDirectorySync
6
7
  from workos.events import AsyncEvents
@@ -45,6 +46,12 @@ class AsyncClient(BaseClient):
45
46
  timeout=self.request_timeout,
46
47
  )
47
48
 
49
+ @property
50
+ def api_keys(self) -> AsyncApiKeys:
51
+ if not getattr(self, "_api_keys", None):
52
+ self._api_keys = AsyncApiKeys(self._http_client)
53
+ return self._api_keys
54
+
48
55
  @property
49
56
  def sso(self) -> AsyncSSO:
50
57
  if not getattr(self, "_sso", None):
workos/client.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from typing import Optional
2
2
  from workos.__about__ import __version__
3
3
  from workos._base_client import BaseClient
4
+ from workos.api_keys import ApiKeys
4
5
  from workos.audit_logs import AuditLogs
5
6
  from workos.directory_sync import DirectorySync
6
7
  from workos.fga import FGA
@@ -45,6 +46,12 @@ class SyncClient(BaseClient):
45
46
  timeout=self.request_timeout,
46
47
  )
47
48
 
49
+ @property
50
+ def api_keys(self) -> ApiKeys:
51
+ if not getattr(self, "_api_keys", None):
52
+ self._api_keys = ApiKeys(self._http_client)
53
+ return self._api_keys
54
+
48
55
  @property
49
56
  def sso(self) -> SSO:
50
57
  if not getattr(self, "_sso", None):
@@ -0,0 +1 @@
1
+ from .api_keys import ApiKey as ApiKey # noqa: F401
@@ -0,0 +1,20 @@
1
+ from typing import Literal, Optional, Sequence
2
+
3
+ from workos.types.workos_model import WorkOSModel
4
+
5
+
6
+ class ApiKeyOwner(WorkOSModel):
7
+ type: str
8
+ id: str
9
+
10
+
11
+ class ApiKey(WorkOSModel):
12
+ object: Literal["api_key"]
13
+ id: str
14
+ owner: ApiKeyOwner
15
+ name: str
16
+ obfuscated_value: str
17
+ last_used_at: Optional[str] = None
18
+ permissions: Sequence[str]
19
+ created_at: str
20
+ updated_at: str
@@ -38,6 +38,7 @@ class DirectoryUser(WorkOSModel):
38
38
  created_at: str
39
39
  updated_at: str
40
40
  role: Optional[InlineRole] = None
41
+ roles: Optional[Sequence[InlineRole]] = None
41
42
 
42
43
  def primary_email(self) -> Union[DirectoryUserEmail, None]:
43
44
  return next((email for email in self.emails if email.primary), None)
@@ -22,6 +22,7 @@ class Profile(WorkOSModel):
22
22
  last_name: Optional[str] = None
23
23
  idp_id: str
24
24
  role: Optional[ProfileRole] = None
25
+ roles: Optional[Sequence[ProfileRole]] = None
25
26
  groups: Optional[Sequence[str]] = None
26
27
  custom_attributes: Optional[Mapping[str, Any]] = None
27
28
  raw_attributes: Optional[Mapping[str, Any]] = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: workos
3
- Version: 5.33.0
3
+ Version: 5.35.0
4
4
  Summary: WorkOS Python Client
5
5
  Home-page: https://github.com/workos-inc/workos-python
6
6
  Author: WorkOS
@@ -1,10 +1,11 @@
1
- workos/__about__.py,sha256=-nB8UrwKFTtayBxBV9wbxK-eZX381M0MPI4jlQUT290,406
1
+ workos/__about__.py,sha256=FY3Dake_y_fTMLwYhgwGt3TE9MkKL521aj0eNeXv5WE,406
2
2
  workos/__init__.py,sha256=hOdbO_MJCvpLx8EbRjQg-fvFAB-glJmrmxUZK8kWG0k,167
3
- workos/_base_client.py,sha256=YWLXBpd0YeID3WKYZkKa4l9ZuB9e6HgdLmPKZIzXsME,3599
3
+ workos/_base_client.py,sha256=CIfAk6Bdj1hpOy3TcfIGXy8X4Efa7wi7cKracjkcTHk,3633
4
4
  workos/_client_configuration.py,sha256=g3eXhtrEMN6CW0hZ5uHb2PmLurXjyBkWZeQYMPeJD6s,222
5
- workos/async_client.py,sha256=c_lP7y49k3FEx0S6We8PrEw3PhTkD0VHyHJaKgc51HU,4358
5
+ workos/api_keys.py,sha256=3AljcqAO1uJYP315AZymX184eJ9X_gH7xa_rKU6rMjw,1817
6
+ workos/async_client.py,sha256=OYwH4BMEQQSaQoKPgAxGs24TQQcaQQndoivCte-Y1FI,4594
6
7
  workos/audit_logs.py,sha256=bYoAoNO4FRSaT34UxiVkgTXCVH8givcS2YGhH_9O3NA,3983
7
- workos/client.py,sha256=hIm87iNtKfwQ93H5aRXnhTqUJIOzUEG1GX0jdLBLAYc,4345
8
+ workos/client.py,sha256=18fDBbsUnHnJj3WqxEmX72oWxgfJvCWIH1CFb_gsjkU,4566
8
9
  workos/directory_sync.py,sha256=6Z1gHz1LWNy56EtkXwNm6jhRRcvsJ7ASeDLy_Q1oKM0,14601
9
10
  workos/events.py,sha256=b4JIzMbd5LlVtpOMKVojC70RCHAgmLN3nJ62_2U0GwI,3892
10
11
  workos/exceptions.py,sha256=wYDlbMLVxrKQTF0M6ExFlxS5YEkvNZ4BeWLryRxcAFs,2335
@@ -25,6 +26,8 @@ workos/types/__init__.py,sha256=aYScTXq5jOyp0AYvdWffaj5-zdDuNtCCJtbzt5GM19k,267
25
26
  workos/types/list_resource.py,sha256=VcJaz8qE91y9t-PRI0mTjzPdtyoU8EGAo6-TJGjbqzg,6747
26
27
  workos/types/metadata.py,sha256=uUqDkGJGyFY3H4JZObSiCfn4jKBue5CBhOqv79TI1n0,52
27
28
  workos/types/workos_model.py,sha256=bV_p3baadcUJOU_7f6ysZ6KXhpt3E_93spuZnfJs9vc,735
29
+ workos/types/api_keys/__init__.py,sha256=CMjEAI6EAO2En9UUwvEQW6EAVuV6l5wWPvmuKH8oKhs,53
30
+ workos/types/api_keys/api_keys.py,sha256=eVpXS6hhLCFhIqJ_oQNIbwjL9u0blVykjpQxZEEKDS8,403
28
31
  workos/types/audit_logs/__init__.py,sha256=daPn8wAVEnlM1fCpOsy3dVZV_0YEp8bA1T_nhk5-pU8,211
29
32
  workos/types/audit_logs/audit_log_event.py,sha256=GVvbu3JJpXW-N16zdWi-0c3W9z_t3JB7Y6-Rc463upw,672
30
33
  workos/types/audit_logs/audit_log_event_actor.py,sha256=vYojEwq4EPwAO01p_9FmVuKg6Cr7lycrWkldB_W26GA,320
@@ -37,7 +40,7 @@ workos/types/directory_sync/directory.py,sha256=M7IvlTeKrLj-BpGeX-nafBM6BWUnHb3-
37
40
  workos/types/directory_sync/directory_group.py,sha256=4bRB3inN72GfsJEA17OpMEI-_6hhdXFVGpTL0PWaXL0,439
38
41
  workos/types/directory_sync/directory_state.py,sha256=4qaD1Snonde1oVj1tDUITzXh0imPUKkacQnb2TcuAIY,607
39
42
  workos/types/directory_sync/directory_type.py,sha256=NuHJzxI80WjxKiCSwMj1dfMpfB4o5JHErfLWfxCnKRs,443
40
- workos/types/directory_sync/directory_user.py,sha256=MqojNO_Wy4Fwv-xXp_dPhZm7rE1OQwtszzrY3uWE10Q,2086
43
+ workos/types/directory_sync/directory_user.py,sha256=ZIlhkR2afO5cvWxEXAWsYjOy_sBC9_GBFaa5B3ZYyBo,2135
41
44
  workos/types/directory_sync/list_filters.py,sha256=Q4jlocRp4DguCm5e4Oo7udK7IfKmm3N1Rojtg4Eu96w,449
42
45
  workos/types/events/__init__.py,sha256=t_Pt--jhehN-qFACREbSsZbUFQjQDe12xU-dQAjZfoI,548
43
46
  workos/types/events/authentication_payload.py,sha256=-4DhxWNxyd0Q01w2R4RyoQAwxNrRKMYJAdcRJUrzjEk,1779
@@ -89,7 +92,7 @@ workos/types/roles/role.py,sha256=GhY6tCFIW33Z-SCbP---Esyoz_ePFvoamxIqyWvCNJ4,54
89
92
  workos/types/sso/__init__.py,sha256=feBeNqummbAvLaiAn9mTmW5O8axKHUWxh6IkQceKeAc,115
90
93
  workos/types/sso/connection.py,sha256=GTpaS02EMv2cJAkt20tSxldVCcKQlpl37vQSIAIHSdM,1679
91
94
  workos/types/sso/connection_domain.py,sha256=kMa9GatwUl6YilMU9iiyUKXFfEUKWYub7PyjjYmqhLc,185
92
- workos/types/sso/profile.py,sha256=IWHpg2GdIvE7eAGi1RJheAqp9AozsKuGfiFc9_IteHI,1075
95
+ workos/types/sso/profile.py,sha256=htysPjNhago855TXVfDe685hQKEnc60u6AO0CHWs1T4,1125
93
96
  workos/types/sso/sso_provider_type.py,sha256=JfO-Ta1wJP7jhtbnWKcS9tElMK_7P6AM10nY-7mM4XE,159
94
97
  workos/types/user_management/__init__.py,sha256=paHEZ8-QWPjX6PftupYRRVqfy6tVNevfl2kAD3ZgEZw,384
95
98
  workos/types/user_management/authenticate_with_common.py,sha256=2mGRfIgoeX5Ee7c_rxQm6rb6PHyaIBHbGFQsWAhGhY8,2101
@@ -128,8 +131,8 @@ workos/utils/crypto_provider.py,sha256=QeQSR4t9xLlb90kEfl8onVUsf1yCkYq0EjFTxK0mU
128
131
  workos/utils/http_client.py,sha256=TM5yMFFExmAE8D2Z43-5O301tRbnylLG0aXO0isGorE,6197
129
132
  workos/utils/pagination_order.py,sha256=_-et1DDJLG0czarTU7op4W6RA0V1f85GNsUgtyRU55Q,70
130
133
  workos/utils/request_helper.py,sha256=NaO16qPPbSNnCeE0fiNKYb8gM-dK_okYVJbLGrEGXz8,793
131
- workos-5.33.0.dist-info/LICENSE,sha256=mU--WL1JzelH2tXpKVoOlpud4cpqKSRTtdArCvYZmb4,1063
132
- workos-5.33.0.dist-info/METADATA,sha256=yqlekSvf2kMaq1cjaweH1L7mN2mo7lZnJ9XYhiRxz2U,4187
133
- workos-5.33.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
134
- workos-5.33.0.dist-info/top_level.txt,sha256=ZFskIfue1Tw-JwjyIXRvdsAl9i0DX9VbqmgICXV84Sk,7
135
- workos-5.33.0.dist-info/RECORD,,
134
+ workos-5.35.0.dist-info/LICENSE,sha256=mU--WL1JzelH2tXpKVoOlpud4cpqKSRTtdArCvYZmb4,1063
135
+ workos-5.35.0.dist-info/METADATA,sha256=UPSLxCbIUU7Zd5g2lgIxhpxdVxwtL58i_jO09rMDyRs,4187
136
+ workos-5.35.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
137
+ workos-5.35.0.dist-info/top_level.txt,sha256=ZFskIfue1Tw-JwjyIXRvdsAl9i0DX9VbqmgICXV84Sk,7
138
+ workos-5.35.0.dist-info/RECORD,,