workos 5.37.0__py3-none-any.whl → 5.38.1__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/_base_client.py CHANGED
@@ -10,6 +10,7 @@ from workos.events import EventsModule
10
10
  from workos.fga import FGAModule
11
11
  from workos.mfa import MFAModule
12
12
  from workos.organization_domains import OrganizationDomainsModule
13
+ from workos.pipes import PipesModule
13
14
  from workos.organizations import OrganizationsModule
14
15
  from workos.passwordless import PasswordlessModule
15
16
  from workos.portal import PortalModule
@@ -26,6 +27,7 @@ class BaseClient(ClientConfiguration):
26
27
  _base_url: str
27
28
  _client_id: str
28
29
  _request_timeout: int
30
+ _jwt_leeway: float
29
31
 
30
32
  def __init__(
31
33
  self,
@@ -34,6 +36,7 @@ class BaseClient(ClientConfiguration):
34
36
  client_id: Optional[str],
35
37
  base_url: Optional[str] = None,
36
38
  request_timeout: Optional[int] = None,
39
+ jwt_leeway: float = 0,
37
40
  ) -> None:
38
41
  api_key = api_key or os.getenv("WORKOS_API_KEY")
39
42
  if api_key is None:
@@ -65,6 +68,8 @@ class BaseClient(ClientConfiguration):
65
68
  else int(os.getenv("WORKOS_REQUEST_TIMEOUT", DEFAULT_REQUEST_TIMEOUT))
66
69
  )
67
70
 
71
+ self._jwt_leeway = jwt_leeway
72
+
68
73
  @property
69
74
  @abstractmethod
70
75
  def api_keys(self) -> ApiKeysModule: ...
@@ -101,6 +106,10 @@ class BaseClient(ClientConfiguration):
101
106
  @abstractmethod
102
107
  def passwordless(self) -> PasswordlessModule: ...
103
108
 
109
+ @property
110
+ @abstractmethod
111
+ def pipes(self) -> PipesModule: ...
112
+
104
113
  @property
105
114
  @abstractmethod
106
115
  def portal(self) -> PortalModule: ...
@@ -131,3 +140,7 @@ class BaseClient(ClientConfiguration):
131
140
  @property
132
141
  def request_timeout(self) -> int:
133
142
  return self._request_timeout
143
+
144
+ @property
145
+ def jwt_leeway(self) -> float:
146
+ return self._jwt_leeway
@@ -8,3 +8,5 @@ class ClientConfiguration(Protocol):
8
8
  def client_id(self) -> str: ...
9
9
  @property
10
10
  def request_timeout(self) -> int: ...
11
+ @property
12
+ def jwt_leeway(self) -> float: ...
workos/async_client.py CHANGED
@@ -1,5 +1,5 @@
1
1
  from typing import Optional
2
- from workos.__about__ import __version__
2
+ from importlib.metadata import version
3
3
  from workos._base_client import BaseClient
4
4
  from workos.api_keys import AsyncApiKeys
5
5
  from workos.audit_logs import AuditLogsModule
@@ -10,6 +10,7 @@ from workos.mfa import MFAModule
10
10
  from workos.organizations import AsyncOrganizations
11
11
  from workos.organization_domains import AsyncOrganizationDomains
12
12
  from workos.passwordless import PasswordlessModule
13
+ from workos.pipes import AsyncPipes
13
14
  from workos.portal import PortalModule
14
15
  from workos.sso import AsyncSSO
15
16
  from workos.user_management import AsyncUserManagement
@@ -31,18 +32,20 @@ class AsyncClient(BaseClient):
31
32
  client_id: Optional[str] = None,
32
33
  base_url: Optional[str] = None,
33
34
  request_timeout: Optional[int] = None,
35
+ jwt_leeway: float = 0,
34
36
  ):
35
37
  super().__init__(
36
38
  api_key=api_key,
37
39
  client_id=client_id,
38
40
  base_url=base_url,
39
41
  request_timeout=request_timeout,
42
+ jwt_leeway=jwt_leeway,
40
43
  )
41
44
  self._http_client = AsyncHTTPClient(
42
45
  api_key=self._api_key,
43
46
  base_url=self.base_url,
44
47
  client_id=self._client_id,
45
- version=__version__,
48
+ version=version("workos"),
46
49
  timeout=self.request_timeout,
47
50
  )
48
51
 
@@ -102,6 +105,12 @@ class AsyncClient(BaseClient):
102
105
  "Passwordless APIs are not yet supported in the async client."
103
106
  )
104
107
 
108
+ @property
109
+ def pipes(self) -> AsyncPipes:
110
+ if not getattr(self, "_pipes", None):
111
+ self._pipes = AsyncPipes(self._http_client)
112
+ return self._pipes
113
+
105
114
  @property
106
115
  def portal(self) -> PortalModule:
107
116
  raise NotImplementedError(
workos/client.py CHANGED
@@ -1,5 +1,5 @@
1
+ from importlib.metadata import version
1
2
  from typing import Optional
2
- from workos.__about__ import __version__
3
3
  from workos._base_client import BaseClient
4
4
  from workos.api_keys import ApiKeys
5
5
  from workos.audit_logs import AuditLogs
@@ -8,6 +8,7 @@ from workos.fga import FGA
8
8
  from workos.organizations import Organizations
9
9
  from workos.organization_domains import OrganizationDomains
10
10
  from workos.passwordless import Passwordless
11
+ from workos.pipes import Pipes
11
12
  from workos.portal import Portal
12
13
  from workos.sso import SSO
13
14
  from workos.webhooks import Webhooks
@@ -31,18 +32,20 @@ class SyncClient(BaseClient):
31
32
  client_id: Optional[str] = None,
32
33
  base_url: Optional[str] = None,
33
34
  request_timeout: Optional[int] = None,
35
+ jwt_leeway: float = 0,
34
36
  ):
35
37
  super().__init__(
36
38
  api_key=api_key,
37
39
  client_id=client_id,
38
40
  base_url=base_url,
39
41
  request_timeout=request_timeout,
42
+ jwt_leeway=jwt_leeway,
40
43
  )
41
44
  self._http_client = SyncHTTPClient(
42
45
  api_key=self._api_key,
43
46
  base_url=self.base_url,
44
47
  client_id=self._client_id,
45
- version=__version__,
48
+ version=version("workos"),
46
49
  timeout=self.request_timeout,
47
50
  )
48
51
 
@@ -102,6 +105,12 @@ class SyncClient(BaseClient):
102
105
  self._passwordless = Passwordless(self._http_client)
103
106
  return self._passwordless
104
107
 
108
+ @property
109
+ def pipes(self) -> Pipes:
110
+ if not getattr(self, "_pipes", None):
111
+ self._pipes = Pipes(self._http_client)
112
+ return self._pipes
113
+
105
114
  @property
106
115
  def portal(self) -> Portal:
107
116
  if not getattr(self, "_portal", None):
workos/directory_sync.py CHANGED
@@ -176,7 +176,6 @@ class DirectorySync(DirectorySyncModule):
176
176
  after: Optional[str] = None,
177
177
  order: PaginationOrder = "desc",
178
178
  ) -> DirectoryUsersListResource:
179
-
180
179
  list_params: DirectoryUserListFilters = {
181
180
  "limit": limit,
182
181
  "before": before,
@@ -315,7 +314,6 @@ class AsyncDirectorySync(DirectorySyncModule):
315
314
  after: Optional[str] = None,
316
315
  order: PaginationOrder = "desc",
317
316
  ) -> DirectoryUsersListResource:
318
-
319
317
  list_params: DirectoryUserListFilters = {
320
318
  "limit": limit,
321
319
  "before": before,
workos/pipes.py ADDED
@@ -0,0 +1,93 @@
1
+ from typing import Dict, Optional, Protocol
2
+
3
+ from workos.types.pipes import (
4
+ GetAccessTokenFailureResponse,
5
+ GetAccessTokenResponse,
6
+ GetAccessTokenSuccessResponse,
7
+ )
8
+ from workos.typing.sync_or_async import SyncOrAsync
9
+ from workos.utils.http_client import AsyncHTTPClient, SyncHTTPClient
10
+ from workos.utils.request_helper import REQUEST_METHOD_POST
11
+
12
+
13
+ class PipesModule(Protocol):
14
+ """Protocol defining the Pipes module interface."""
15
+
16
+ def get_access_token(
17
+ self,
18
+ *,
19
+ provider: str,
20
+ user_id: str,
21
+ organization_id: Optional[str] = None,
22
+ ) -> SyncOrAsync[GetAccessTokenResponse]:
23
+ """Retrieve an access token for a third-party provider.
24
+
25
+ Kwargs:
26
+ provider (str): The third-party provider identifier
27
+ user_id (str): The WorkOS user ID
28
+ organization_id (str, optional): The WorkOS organization ID
29
+
30
+ Returns:
31
+ GetAccessTokenResponse: Success response with token or failure response with error
32
+ """
33
+ ...
34
+
35
+
36
+ class Pipes(PipesModule):
37
+ """Sync implementation of the Pipes module."""
38
+
39
+ _http_client: SyncHTTPClient
40
+
41
+ def __init__(self, http_client: SyncHTTPClient):
42
+ self._http_client = http_client
43
+
44
+ def get_access_token(
45
+ self,
46
+ *,
47
+ provider: str,
48
+ user_id: str,
49
+ organization_id: Optional[str] = None,
50
+ ) -> GetAccessTokenResponse:
51
+ json_data: Dict[str, str] = {"user_id": user_id}
52
+ if organization_id is not None:
53
+ json_data["organization_id"] = organization_id
54
+
55
+ response = self._http_client.request(
56
+ f"data-integrations/{provider}/token",
57
+ method=REQUEST_METHOD_POST,
58
+ json=json_data,
59
+ )
60
+
61
+ if response.get("active") is True:
62
+ return GetAccessTokenSuccessResponse.model_validate(response)
63
+ return GetAccessTokenFailureResponse.model_validate(response)
64
+
65
+
66
+ class AsyncPipes(PipesModule):
67
+ """Async implementation of the Pipes module."""
68
+
69
+ _http_client: AsyncHTTPClient
70
+
71
+ def __init__(self, http_client: AsyncHTTPClient):
72
+ self._http_client = http_client
73
+
74
+ async def get_access_token(
75
+ self,
76
+ *,
77
+ provider: str,
78
+ user_id: str,
79
+ organization_id: Optional[str] = None,
80
+ ) -> GetAccessTokenResponse:
81
+ json_data: Dict[str, str] = {"user_id": user_id}
82
+ if organization_id is not None:
83
+ json_data["organization_id"] = organization_id
84
+
85
+ response = await self._http_client.request(
86
+ f"data-integrations/{provider}/token",
87
+ method=REQUEST_METHOD_POST,
88
+ json=json_data,
89
+ )
90
+
91
+ if response.get("active") is True:
92
+ return GetAccessTokenSuccessResponse.model_validate(response)
93
+ return GetAccessTokenFailureResponse.model_validate(response)
workos/portal.py CHANGED
@@ -1,4 +1,4 @@
1
- from typing import Optional, Protocol, Dict, Literal, Union
1
+ from typing import Optional, Protocol
2
2
  from workos.types.portal.portal_link import PortalLink
3
3
  from workos.types.portal.portal_link_intent import PortalLinkIntent
4
4
  from workos.types.portal.portal_link_intent_options import IntentOptions
@@ -36,7 +36,6 @@ class PortalModule(Protocol):
36
36
 
37
37
 
38
38
  class Portal(PortalModule):
39
-
40
39
  _http_client: SyncHTTPClient
41
40
 
42
41
  def __init__(self, http_client: SyncHTTPClient):
workos/session.py CHANGED
@@ -35,6 +35,7 @@ class SessionModule(Protocol):
35
35
  cookie_password: str
36
36
  jwks: PyJWKClient
37
37
  jwk_algorithms: List[str]
38
+ jwt_leeway: float
38
39
 
39
40
  def __init__(
40
41
  self,
@@ -43,6 +44,7 @@ class SessionModule(Protocol):
43
44
  client_id: str,
44
45
  session_data: str,
45
46
  cookie_password: str,
47
+ jwt_leeway: float = 0,
46
48
  ) -> None:
47
49
  # If the cookie password is not provided, throw an error
48
50
  if cookie_password is None or cookie_password == "":
@@ -52,6 +54,7 @@ class SessionModule(Protocol):
52
54
  self.client_id = client_id
53
55
  self.session_data = session_data
54
56
  self.cookie_password = cookie_password
57
+ self.jwt_leeway = jwt_leeway
55
58
 
56
59
  self.jwks = _get_jwks_client(self.user_management.get_jwks_url())
57
60
 
@@ -91,13 +94,13 @@ class SessionModule(Protocol):
91
94
  signing_key.key,
92
95
  algorithms=self.jwk_algorithms,
93
96
  options={"verify_aud": False},
97
+ leeway=self.jwt_leeway,
94
98
  )
95
99
  except jwt.exceptions.InvalidTokenError:
96
100
  return AuthenticateWithSessionCookieErrorResponse(
97
101
  authenticated=False,
98
102
  reason=AuthenticateWithSessionCookieFailureReason.INVALID_JWT,
99
103
  )
100
-
101
104
  return AuthenticateWithSessionCookieSuccessResponse(
102
105
  authenticated=True,
103
106
  session_id=decoded["sid"],
@@ -137,6 +140,20 @@ class SessionModule(Protocol):
137
140
  )
138
141
  return str(result)
139
142
 
143
+ def _is_valid_jwt(self, token: str) -> bool:
144
+ try:
145
+ signing_key = self.jwks.get_signing_key_from_jwt(token)
146
+ jwt.decode(
147
+ token,
148
+ signing_key.key,
149
+ algorithms=self.jwk_algorithms,
150
+ options={"verify_aud": False},
151
+ leeway=self.jwt_leeway,
152
+ )
153
+ return True
154
+ except jwt.exceptions.InvalidTokenError:
155
+ return False
156
+
140
157
  @staticmethod
141
158
  def seal_data(data: Dict[str, Any], key: str) -> str:
142
159
  fernet = Fernet(key)
@@ -163,6 +180,7 @@ class Session(SessionModule):
163
180
  client_id: str,
164
181
  session_data: str,
165
182
  cookie_password: str,
183
+ jwt_leeway: float = 0,
166
184
  ) -> None:
167
185
  # If the cookie password is not provided, throw an error
168
186
  if cookie_password is None or cookie_password == "":
@@ -172,6 +190,7 @@ class Session(SessionModule):
172
190
  self.client_id = client_id
173
191
  self.session_data = session_data
174
192
  self.cookie_password = cookie_password
193
+ self.jwt_leeway = jwt_leeway
175
194
 
176
195
  self.jwks = _get_jwks_client(self.user_management.get_jwks_url())
177
196
 
@@ -224,6 +243,7 @@ class Session(SessionModule):
224
243
  signing_key.key,
225
244
  algorithms=self.jwk_algorithms,
226
245
  options={"verify_aud": False},
246
+ leeway=self.jwt_leeway,
227
247
  )
228
248
 
229
249
  return RefreshWithSessionCookieSuccessResponse(
@@ -255,6 +275,7 @@ class AsyncSession(SessionModule):
255
275
  client_id: str,
256
276
  session_data: str,
257
277
  cookie_password: str,
278
+ jwt_leeway: float = 0,
258
279
  ) -> None:
259
280
  # If the cookie password is not provided, throw an error
260
281
  if cookie_password is None or cookie_password == "":
@@ -264,6 +285,7 @@ class AsyncSession(SessionModule):
264
285
  self.client_id = client_id
265
286
  self.session_data = session_data
266
287
  self.cookie_password = cookie_password
288
+ self.jwt_leeway = jwt_leeway
267
289
 
268
290
  self.jwks = _get_jwks_client(self.user_management.get_jwks_url())
269
291
 
@@ -316,6 +338,7 @@ class AsyncSession(SessionModule):
316
338
  signing_key.key,
317
339
  algorithms=self.jwk_algorithms,
318
340
  options={"verify_aud": False},
341
+ leeway=self.jwt_leeway,
319
342
  )
320
343
 
321
344
  return RefreshWithSessionCookieSuccessResponse(
@@ -1,8 +1,8 @@
1
- from typing import Sequence, Union, Any, Dict, Literal
2
- from typing_extensions import Annotated
1
+ from typing import Any, Dict, Literal, Sequence, Union
3
2
 
4
3
  from pydantic import BeforeValidator
5
4
  from pydantic_core.core_schema import ValidationInfo
5
+ from typing_extensions import Annotated
6
6
 
7
7
  from workos.types.workos_model import WorkOSModel
8
8
 
@@ -12,7 +12,7 @@ class FGABaseWarning(WorkOSModel):
12
12
  message: str
13
13
 
14
14
 
15
- class MissingContextKeysWarning(FGABaseWarning):
15
+ class MissingContextKeysWarning(FGABaseWarning): # type: ignore[override, unused-ignore]
16
16
  code: Literal["missing_context_keys"]
17
17
  keys: Sequence[str]
18
18
 
@@ -1,13 +1,12 @@
1
1
  from typing import Literal, Optional, Union
2
2
 
3
- from workos.types.workos_model import WorkOSModel
4
3
  from workos.types.mfa.enroll_authentication_factor_type import (
5
4
  SmsAuthenticationFactorType,
6
5
  TotpAuthenticationFactorType,
7
6
  )
7
+ from workos.types.workos_model import WorkOSModel
8
8
  from workos.typing.literals import LiteralOrUntyped
9
9
 
10
-
11
10
  AuthenticationFactorType = Literal[
12
11
  "generic_otp", SmsAuthenticationFactorType, TotpAuthenticationFactorType
13
12
  ]
@@ -43,21 +42,21 @@ class AuthenticationFactorBase(WorkOSModel):
43
42
  user_id: Optional[str] = None
44
43
 
45
44
 
46
- class AuthenticationFactorTotp(AuthenticationFactorBase):
45
+ class AuthenticationFactorTotp(AuthenticationFactorBase): # type: ignore[override, unused-ignore]
47
46
  """Representation of a MFA Authentication Factor Response as returned by WorkOS through the MFA feature."""
48
47
 
49
48
  type: TotpAuthenticationFactorType
50
49
  totp: TotpFactor
51
50
 
52
51
 
53
- class AuthenticationFactorTotpExtended(AuthenticationFactorBase):
52
+ class AuthenticationFactorTotpExtended(AuthenticationFactorBase): # type: ignore[override, unused-ignore]
54
53
  """Representation of a MFA Authentication Factor Response when enrolling an authentication factor."""
55
54
 
56
55
  type: TotpAuthenticationFactorType
57
56
  totp: ExtendedTotpFactor
58
57
 
59
58
 
60
- class AuthenticationFactorSms(AuthenticationFactorBase):
59
+ class AuthenticationFactorSms(AuthenticationFactorBase): # type: ignore[override, unused-ignore]
61
60
  """Representation of a SMS Authentication Factor Response as returned by WorkOS through the MFA feature."""
62
61
 
63
62
  type: SmsAuthenticationFactorType
@@ -0,0 +1,6 @@
1
+ from workos.types.pipes.pipes import (
2
+ AccessToken as AccessToken,
3
+ GetAccessTokenFailureResponse as GetAccessTokenFailureResponse,
4
+ GetAccessTokenResponse as GetAccessTokenResponse,
5
+ GetAccessTokenSuccessResponse as GetAccessTokenSuccessResponse,
6
+ )
@@ -0,0 +1,34 @@
1
+ from datetime import datetime
2
+ from typing import Literal, Optional, Sequence, Union
3
+
4
+ from workos.types.workos_model import WorkOSModel
5
+
6
+
7
+ class AccessToken(WorkOSModel):
8
+ """Represents an OAuth access token for a third-party provider."""
9
+
10
+ object: Literal["access_token"]
11
+ access_token: str
12
+ expires_at: Optional[datetime] = None
13
+ scopes: Sequence[str]
14
+ missing_scopes: Sequence[str]
15
+
16
+
17
+ class GetAccessTokenSuccessResponse(WorkOSModel):
18
+ """Successful response containing the access token."""
19
+
20
+ active: Literal[True]
21
+ access_token: AccessToken
22
+
23
+
24
+ class GetAccessTokenFailureResponse(WorkOSModel):
25
+ """Failed response indicating why the token couldn't be retrieved."""
26
+
27
+ active: Literal[False]
28
+ error: Literal["not_installed", "needs_reauthorization"]
29
+
30
+
31
+ GetAccessTokenResponse = Union[
32
+ GetAccessTokenSuccessResponse,
33
+ GetAccessTokenFailureResponse,
34
+ ]
@@ -7,6 +7,6 @@ from .magic_auth import *
7
7
  from .organization_membership import *
8
8
  from .password_hash_type import *
9
9
  from .password_reset import *
10
- from .user_management_provider_type import *
11
- from .user import *
12
10
  from .session import *
11
+ from .user import *
12
+ from .user_management_provider_type import *
@@ -1,4 +1,5 @@
1
1
  from typing import Literal
2
2
 
3
-
4
- PasswordHashType = Literal["bcrypt", "firebase-scrypt", "ssha"]
3
+ PasswordHashType = Literal[
4
+ "bcrypt", "firebase-scrypt", "pbkdf2", "scrypt", "ssha", "argon2"
5
+ ]
@@ -1,7 +1,5 @@
1
1
  from enum import Enum
2
- from typing import Optional, Sequence, TypedDict, Union
3
-
4
- from typing_extensions import Literal
2
+ from typing import Literal, Optional, Sequence, TypedDict, Union
5
3
 
6
4
  from workos.types.user_management.impersonator import Impersonator
7
5
  from workos.types.user_management.user import User
@@ -14,7 +14,7 @@ class WorkOSModel(BaseModel):
14
14
  by_alias: bool = False,
15
15
  exclude_unset: bool = False,
16
16
  exclude_defaults: bool = False,
17
- exclude_none: bool = False
17
+ exclude_none: bool = False,
18
18
  ) -> Dict[str, Any]:
19
19
  return self.model_dump(
20
20
  include=include,
workos/user_management.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from typing import Awaitable, Optional, Protocol, Sequence, Type, Union, cast
2
2
  from urllib.parse import urlencode
3
+
3
4
  from workos._client_configuration import ClientConfiguration
4
5
  from workos.session import AsyncSession, Session
5
6
  from workos.types.feature_flags import FeatureFlag
@@ -38,19 +39,20 @@ from workos.types.user_management.authenticate_with_common import (
38
39
  AuthenticateWithTotpParameters,
39
40
  )
40
41
  from workos.types.user_management.authentication_response import (
41
- AuthKitAuthenticationResponse,
42
42
  AuthenticationResponseType,
43
+ AuthKitAuthenticationResponse,
43
44
  )
44
45
  from workos.types.user_management.list_filters import (
45
46
  AuthenticationFactorsListFilters,
46
47
  InvitationsListFilters,
47
48
  OrganizationMembershipsListFilters,
49
+ SessionsListFilters,
48
50
  UsersListFilters,
49
51
  )
50
52
  from workos.types.user_management.password_hash_type import PasswordHashType
51
53
  from workos.types.user_management.screen_hint import ScreenHintType
52
- from workos.types.user_management.session import SessionConfig
53
54
  from workos.types.user_management.session import Session as UserManagementSession
55
+ from workos.types.user_management.session import SessionConfig
54
56
  from workos.types.user_management.user_management_provider_type import (
55
57
  UserManagementProviderType,
56
58
  )
@@ -59,11 +61,11 @@ from workos.utils.http_client import AsyncHTTPClient, SyncHTTPClient
59
61
  from workos.utils.pagination_order import PaginationOrder
60
62
  from workos.utils.request_helper import (
61
63
  DEFAULT_LIST_RESPONSE_LIMIT,
62
- RESPONSE_TYPE_CODE,
63
- REQUEST_METHOD_POST,
64
- REQUEST_METHOD_GET,
65
64
  REQUEST_METHOD_DELETE,
65
+ REQUEST_METHOD_GET,
66
+ REQUEST_METHOD_POST,
66
67
  REQUEST_METHOD_PUT,
68
+ RESPONSE_TYPE_CODE,
67
69
  QueryParameters,
68
70
  RequestHelper,
69
71
  )
@@ -120,8 +122,6 @@ FeatureFlagsListResource = WorkOSListResource[
120
122
  FeatureFlag, FeatureFlagListFilters, ListMetadata
121
123
  ]
122
124
 
123
- from workos.types.user_management.list_filters import SessionsListFilters
124
-
125
125
  SessionsListResource = WorkOSListResource[
126
126
  UserManagementSession, SessionsListFilters, ListMetadata
127
127
  ]
@@ -956,6 +956,7 @@ class UserManagement(UserManagementModule):
956
956
  client_id=self._http_client.client_id,
957
957
  session_data=sealed_session,
958
958
  cookie_password=cookie_password,
959
+ jwt_leeway=self._client_configuration.jwt_leeway,
959
960
  )
960
961
 
961
962
  def get_user(self, user_id: str) -> User:
@@ -1679,6 +1680,7 @@ class AsyncUserManagement(UserManagementModule):
1679
1680
  client_id=self._http_client.client_id,
1680
1681
  session_data=sealed_session,
1681
1682
  cookie_password=cookie_password,
1683
+ jwt_leeway=self._client_configuration.jwt_leeway,
1682
1684
  )
1683
1685
 
1684
1686
  async def get_user(self, user_id: str) -> User:
@@ -14,7 +14,6 @@ QueryParameters = Dict[str, QueryParameterValue]
14
14
 
15
15
 
16
16
  class RequestHelper:
17
-
18
17
  @classmethod
19
18
  def build_parameterized_url(cls, url: str, **params: QueryParameterValue) -> str:
20
19
  escaped_params = {k: urllib.parse.quote(str(v)) for k, v in params.items()}
workos/vault.py CHANGED
@@ -9,7 +9,6 @@ from workos.types.list_resource import (
9
9
  WorkOSListResource,
10
10
  )
11
11
  from workos.utils.http_client import SyncHTTPClient
12
- from workos.utils.pagination_order import PaginationOrder
13
12
  from workos.utils.request_helper import (
14
13
  DEFAULT_LIST_RESPONSE_LIMIT,
15
14
  REQUEST_METHOD_DELETE,
@@ -37,6 +36,17 @@ class VaultModule(Protocol):
37
36
  """
38
37
  ...
39
38
 
39
+ def read_object_by_name(self, *, name: str) -> VaultObject:
40
+ """
41
+ Get a Vault object by name with the value decrypted.
42
+
43
+ Kwargs:
44
+ name (str): The unique name of the object.
45
+ Returns:
46
+ VaultObject: A vault object with metadata, name and decrypted value.
47
+ """
48
+ ...
49
+
40
50
  def list_objects(
41
51
  self,
42
52
  *,
@@ -230,6 +240,24 @@ class Vault(VaultModule):
230
240
 
231
241
  return VaultObject.model_validate(response)
232
242
 
243
+ def read_object_by_name(
244
+ self,
245
+ *,
246
+ name: str,
247
+ ) -> VaultObject:
248
+ if not name:
249
+ raise ValueError("Incomplete arguments: 'name' is a required argument")
250
+
251
+ response = self._http_client.request(
252
+ RequestHelper.build_parameterized_url(
253
+ "vault/v1/kv/name/{name}",
254
+ name=name,
255
+ ),
256
+ method=REQUEST_METHOD_GET,
257
+ )
258
+
259
+ return VaultObject.model_validate(response)
260
+
233
261
  def list_objects(
234
262
  self,
235
263
  *,
workos/widgets.py CHANGED
@@ -30,7 +30,6 @@ class WidgetsModule(Protocol):
30
30
 
31
31
 
32
32
  class Widgets(WidgetsModule):
33
-
34
33
  _http_client: SyncHTTPClient
35
34
 
36
35
  def __init__(self, http_client: SyncHTTPClient):
@@ -1,39 +1,20 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.4
2
2
  Name: workos
3
- Version: 5.37.0
3
+ Version: 5.38.1
4
4
  Summary: WorkOS Python Client
5
- Home-page: https://github.com/workos-inc/workos-python
6
5
  Author: WorkOS
7
- Author-email: team@workos.com
8
- License: MIT
9
- Classifier: Development Status :: 5 - Production/Stable
10
- Classifier: Intended Audience :: Developers
11
- Classifier: License :: OSI Approved :: MIT License
12
- Classifier: Operating System :: OS Independent
13
- Classifier: Programming Language :: Python
14
- Classifier: Programming Language :: Python :: 3
15
- Classifier: Programming Language :: Python :: 3.8
16
- Classifier: Programming Language :: Python :: 3.9
17
- Classifier: Programming Language :: Python :: 3.10
18
- Classifier: Programming Language :: Python :: 3.11
19
- Classifier: Programming Language :: Python :: 3.12
6
+ Author-email: WorkOS <team@workos.com>
7
+ License-Expression: MIT
8
+ Requires-Dist: cryptography>=44.0.2
9
+ Requires-Dist: httpx~=0.28.1
10
+ Requires-Dist: pydantic>=2.10.4
11
+ Requires-Dist: pyjwt>=2.10.0 ; python_full_version >= '3.9'
12
+ Requires-Dist: pyjwt>=2.9.0,<2.10 ; python_full_version == '3.8.*'
13
+ Requires-Python: >=3.8
14
+ Project-URL: Changelog, https://workos.com/docs/sdks/python
15
+ Project-URL: Documentation, https://workos.com/docs/reference
16
+ Project-URL: Homepage, https://workos.com/docs/sdks/python
20
17
  Description-Content-Type: text/markdown
21
- License-File: LICENSE
22
- Requires-Dist: cryptography >=44.0.2
23
- Requires-Dist: httpx >=0.28.1
24
- Requires-Dist: pydantic >=2.10.4
25
- Requires-Dist: PyJWT <2.10,>=2.9.0 ; python_version == "3.8"
26
- Requires-Dist: PyJWT >=2.10.0 ; python_version > "3.8"
27
- Provides-Extra: dev
28
- Requires-Dist: black ==24.4.2 ; extra == 'dev'
29
- Requires-Dist: flake8 ==7.1.1 ; extra == 'dev'
30
- Requires-Dist: httpx ~=0.28.1 ; extra == 'dev'
31
- Requires-Dist: mypy ==1.14.1 ; extra == 'dev'
32
- Requires-Dist: pytest-asyncio ==0.23.8 ; extra == 'dev'
33
- Requires-Dist: pytest-cov ==5.0.0 ; extra == 'dev'
34
- Requires-Dist: pytest ==8.3.4 ; extra == 'dev'
35
- Requires-Dist: six ==1.17.0 ; extra == 'dev'
36
- Requires-Dist: twine ==5.1.1 ; extra == 'dev'
37
18
 
38
19
  # WorkOS Python Library
39
20
 
@@ -57,7 +38,7 @@ pip install workos
57
38
  To install from source, clone the repo and run the following:
58
39
 
59
40
  ```
60
- python setup.py install
41
+ python -m pip install .
61
42
  ```
62
43
 
63
44
  ## Configuration
@@ -1,12 +1,11 @@
1
- workos/__about__.py,sha256=a8T8r-F_Bc9Q5_He3ZLzqGLEGQhwQ_2KCKENsHZ4q6g,406
2
1
  workos/__init__.py,sha256=hOdbO_MJCvpLx8EbRjQg-fvFAB-glJmrmxUZK8kWG0k,167
3
- workos/_base_client.py,sha256=CIfAk6Bdj1hpOy3TcfIGXy8X4Efa7wi7cKracjkcTHk,3633
4
- workos/_client_configuration.py,sha256=g3eXhtrEMN6CW0hZ5uHb2PmLurXjyBkWZeQYMPeJD6s,222
2
+ workos/_base_client.py,sha256=UIdpMKXqShq2Pq4_LsrvvID0V5E4KGhlsySBygP9660,3920
3
+ workos/_client_configuration.py,sha256=FFOVVU5Pd04tNbLGOY_4pnBdGsqA6ficypTcTU8Q3iE,275
5
4
  workos/api_keys.py,sha256=3AljcqAO1uJYP315AZymX184eJ9X_gH7xa_rKU6rMjw,1817
6
- workos/async_client.py,sha256=OYwH4BMEQQSaQoKPgAxGs24TQQcaQQndoivCte-Y1FI,4594
5
+ workos/async_client.py,sha256=CHK_4rHxQ88D5_BJsj_5EeSWbcKj_FqGq-CsfIRTSBw,4879
7
6
  workos/audit_logs.py,sha256=bYoAoNO4FRSaT34UxiVkgTXCVH8givcS2YGhH_9O3NA,3983
8
- workos/client.py,sha256=18fDBbsUnHnJj3WqxEmX72oWxgfJvCWIH1CFb_gsjkU,4566
9
- workos/directory_sync.py,sha256=6Z1gHz1LWNy56EtkXwNm6jhRRcvsJ7ASeDLy_Q1oKM0,14601
7
+ workos/client.py,sha256=WFDREJnzpxu6_Cz-Vd1GfCudQsk1KOeHLiuac_jWgKw,4836
8
+ workos/directory_sync.py,sha256=3p_KSi0YYD_0fK94rSjpSr8oE8HdA33xDp_GZoaZiS8,14599
10
9
  workos/events.py,sha256=b4JIzMbd5LlVtpOMKVojC70RCHAgmLN3nJ62_2U0GwI,3892
11
10
  workos/exceptions.py,sha256=wYDlbMLVxrKQTF0M6ExFlxS5YEkvNZ4BeWLryRxcAFs,2335
12
11
  workos/fga.py,sha256=qjZrdkXKwJDLVTMMrOADxyXRDkswto4kGIdtTjtS3hw,21008
@@ -14,18 +13,12 @@ workos/mfa.py,sha256=J8eOr4ZEmK0TPFKD7pabSalgCFCyg3XJY1stu28_8Vw,6862
14
13
  workos/organization_domains.py,sha256=um-dm54SIs2Kd2FxqxVjIlynlenAG9NamQmNVUGOQ0k,5464
15
14
  workos/organizations.py,sha256=_kiS0KbFd6TjOqFxwA2gL2EaDO7cDPKwb3RWlw8sQi4,15285
16
15
  workos/passwordless.py,sha256=NGXDoxomBkrIml8-VHXH1HvCFMqotQ-YhRobUQXpVZs,3203
17
- workos/portal.py,sha256=lzf3fnOor4AyVdHCHMuJzVSpAC9LWWdC5sZIRtCsb0c,2443
16
+ workos/pipes.py,sha256=nfX1_n9aP4UygVqOb4ctkJ4YHX_-zndAHo8kp8fa67Q,2864
17
+ workos/portal.py,sha256=yrbmxTWl58DCx3lbsuCmxiBlLxVKYtK9hd5uuDno90I,2420
18
18
  workos/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- workos/session.py,sha256=Fh9Y7fyjoX_cK2TayhNzpL725pwrNg-QClsgEfuMZsU,12412
19
+ workos/session.py,sha256=VqzskzcjHx77xiYotdb95-76c1q48Y9Cm8t1rP32IM8,13215
20
20
  workos/sso.py,sha256=ZBC3y-IRmxG0jPd0BOj7s7XQkXJoTLUg1fx-h3Gfy4g,13541
21
- workos/user_management.py,sha256=OJ-_RiLUhjL662t6A3t_eOBKfqWW0_sX-HjfiUS6hsc,86028
22
- workos/vault.py,sha256=SJXr3nJ03qJFuf30FjevMD6LLlDNX3MGaKlYGgICRRE,15657
23
- workos/webhooks.py,sha256=CuwBxh6va9VZFVSXOknveGt6CCGDF3em07a-J12DbXI,4790
24
- workos/widgets.py,sha256=bfbR0hQOHZabbgGL2ekD5sY1sjiUoWBTdrBd_a6WmBc,1721
25
21
  workos/types/__init__.py,sha256=aYScTXq5jOyp0AYvdWffaj5-zdDuNtCCJtbzt5GM19k,267
26
- workos/types/list_resource.py,sha256=VcJaz8qE91y9t-PRI0mTjzPdtyoU8EGAo6-TJGjbqzg,6747
27
- workos/types/metadata.py,sha256=uUqDkGJGyFY3H4JZObSiCfn4jKBue5CBhOqv79TI1n0,52
28
- workos/types/workos_model.py,sha256=bV_p3baadcUJOU_7f6ysZ6KXhpt3E_93spuZnfJs9vc,735
29
22
  workos/types/api_keys/__init__.py,sha256=CMjEAI6EAO2En9UUwvEQW6EAVuV6l5wWPvmuKH8oKhs,53
30
23
  workos/types/api_keys/api_keys.py,sha256=eVpXS6hhLCFhIqJ_oQNIbwjL9u0blVykjpQxZEEKDS8,403
31
24
  workos/types/audit_logs/__init__.py,sha256=daPn8wAVEnlM1fCpOsy3dVZV_0YEp8bA1T_nhk5-pU8,211
@@ -65,12 +58,14 @@ workos/types/fga/authorization_resource_types.py,sha256=wB_CNWhsuCx16u26-o0MJuN2
65
58
  workos/types/fga/authorization_resources.py,sha256=pXDMKGTd6AX7Z6zDAud9ebn_NMOAVoXtBNH1VRkmdyI,263
66
59
  workos/types/fga/check.py,sha256=6AIHsc2WmsXbpEFZcSTy2hIoSr2rmoLt-8wLWdSrc_E,1274
67
60
  workos/types/fga/list_filters.py,sha256=wLQt_AJprmvglZSWv7ZRjwjD4b2vHL0V_7c9u-5u_Uw,640
68
- workos/types/fga/warnings.py,sha256=zCasrVd19nRgSR4u5AhsyS_qCUduIfuhMLUdEUtE9Xg,869
61
+ workos/types/fga/warnings.py,sha256=hX2A-PvXpy9rH0E4_-8Hfrv_to0tgL6jqeGzhz-N2yA,910
69
62
  workos/types/fga/warrant.py,sha256=aKO-9t0NGk-9oQs8j_gnG3VfNU6U9IdGCH4EN3imRWs,1016
63
+ workos/types/list_resource.py,sha256=VcJaz8qE91y9t-PRI0mTjzPdtyoU8EGAo6-TJGjbqzg,6747
64
+ workos/types/metadata.py,sha256=uUqDkGJGyFY3H4JZObSiCfn4jKBue5CBhOqv79TI1n0,52
70
65
  workos/types/mfa/__init__.py,sha256=-gHL2QwZYbqDGPrIMkUrciJm4EiSRz3fJVF55B3rKiM,253
71
66
  workos/types/mfa/authentication_challenge.py,sha256=V8UYutxCAxenaOeqWuPwQU0QcO4HD_0RoQbkG3sqgAU,436
72
67
  workos/types/mfa/authentication_challenge_verification_response.py,sha256=5HxsMJY6t6bbvpe2YsI7i5NnevCGR6mHo7irCb2OUjw,324
73
- workos/types/mfa/authentication_factor.py,sha256=92Cq9MLwBUXfowzCv2u9ZnoH9tVgDm16jjmelN7BOGs,2021
68
+ workos/types/mfa/authentication_factor.py,sha256=ggzzrqrNjEotS4k1fnmzALw4_zVNGKfMMGoeWjS4Jus,2143
74
69
  workos/types/mfa/authentication_factor_totp_and_challenge_response.py,sha256=Ix_DqF7eQ-x6Up8C_0wzvAXXyDY876nobRuiXXL8nbc,541
75
70
  workos/types/mfa/enroll_authentication_factor_type.py,sha256=l_w4co5BdmfglII5YAQiyL-kdAw8KiiOsYaDhn8lGWE,227
76
71
  workos/types/organization_domains/__init__.py,sha256=fpNRKfzZ0p1FybwQG4L-YY12nFPTCJjD4j60OJI5fXE,35
@@ -83,6 +78,8 @@ workos/types/organizations/organization_common.py,sha256=lelq-Id9AGSmosFprFAET_Q
83
78
  workos/types/passwordless/__init__.py,sha256=ZP_XIcGUKXsATb--bfesnsFFbbvg3WYzgqRC_qvW0rw,77
84
79
  workos/types/passwordless/passwordless_session.py,sha256=izmTI5F7qvBdoVodaXP7fnYo_XodG-ygyYTPrCEObTM,293
85
80
  workos/types/passwordless/passwordless_session_type.py,sha256=ltZAV8KFiYDVcxpVt5Hcdc089tB5VETYaa9X6E7Mvoo,75
81
+ workos/types/pipes/__init__.py,sha256=xW5LqJAmrLMMZ8N3soScKf11Gs6DfJlH2rzF01Z6p3w,263
82
+ workos/types/pipes/pipes.py,sha256=J5q62a6LwS-WdZq0DpVt95PZNo-IdRXT5riWsZluCks,890
86
83
  workos/types/portal/__init__.py,sha256=3fuGV-zAfsRI0JLK4atYmplTBEUm-4xUwY40iYqVkeI,61
87
84
  workos/types/portal/portal_link.py,sha256=1eCjQnw3gYv2xl7rrLK41qR9tOcqwu-jXUoQqgLDBEg,167
88
85
  workos/types/portal/portal_link_intent.py,sha256=k49TjGykD1XQnPzzfIbvT4DR42FBV_YYv7LMGXCqq2Q,174
@@ -94,7 +91,7 @@ workos/types/sso/connection.py,sha256=GTpaS02EMv2cJAkt20tSxldVCcKQlpl37vQSIAIHSd
94
91
  workos/types/sso/connection_domain.py,sha256=kMa9GatwUl6YilMU9iiyUKXFfEUKWYub7PyjjYmqhLc,185
95
92
  workos/types/sso/profile.py,sha256=htysPjNhago855TXVfDe685hQKEnc60u6AO0CHWs1T4,1125
96
93
  workos/types/sso/sso_provider_type.py,sha256=JfO-Ta1wJP7jhtbnWKcS9tElMK_7P6AM10nY-7mM4XE,159
97
- workos/types/user_management/__init__.py,sha256=paHEZ8-QWPjX6PftupYRRVqfy6tVNevfl2kAD3ZgEZw,384
94
+ workos/types/user_management/__init__.py,sha256=t6S0ye89O__p7qLK6BD8TAW2y27x2ZZ0y4e4jScC6_Y,384
98
95
  workos/types/user_management/authenticate_with_common.py,sha256=2mGRfIgoeX5Ee7c_rxQm6rb6PHyaIBHbGFQsWAhGhY8,2101
99
96
  workos/types/user_management/authentication_response.py,sha256=2A6vU8FBEE7bXl5aULB-s80_xsR9caqC9tSr9Yq1NtE,1437
100
97
  workos/types/user_management/email_verification.py,sha256=4EqlN7qZBVTZGKaU9WdCSdgFjOMZtkYWTolE-h_hTXA,399
@@ -104,10 +101,10 @@ workos/types/user_management/list_filters.py,sha256=9QH4UbU28LaZ1iyiMs8H6heqbWpb
104
101
  workos/types/user_management/magic_auth.py,sha256=Sda13_uMOC-hHlyGeOXNnCn-HrpwUmtrf2hO5ek9U98,359
105
102
  workos/types/user_management/oauth_tokens.py,sha256=pANk6AyqyRq6hrOrJYQ9AHALVxUbqhGnggzD8PVV-Ew,468
106
103
  workos/types/user_management/organization_membership.py,sha256=dllONFtD1IZZiyqxnV8lJpJyH55OeOeaHRBDZlcWLwk,735
107
- workos/types/user_management/password_hash_type.py,sha256=1752LWdXbaH6TZ6IxbJWeRwlYXX9zN5iJATTaDrCQVA,93
104
+ workos/types/user_management/password_hash_type.py,sha256=hT8UagiPJtYJn1pNouuCr8gzcksUDuTRZnyvzDh1vWw,128
108
105
  workos/types/user_management/password_reset.py,sha256=-NJCfEh4Q1xS9fFXJaF_acYeuUc9POqERLh8urMhqt8,403
109
106
  workos/types/user_management/screen_hint.py,sha256=DnPgvjRK-20i82v3YPzggna1rc6yOMyhiqwUdk01L3s,75
110
- workos/types/user_management/session.py,sha256=crNGjN5pwGM3rXET7iCp0PZpSBK826P_bRlpFOhM5-4,2128
107
+ workos/types/user_management/session.py,sha256=e9uiLu84cpHq8-Fm8KtTgRr7f7imrXc25W8RfAP__Gw,2098
111
108
  workos/types/user_management/user.py,sha256=qHI1zKn3WqFi5bT-g8GQiAUS_8xfpzyZRvOPBDUO3jM,636
112
109
  workos/types/user_management/user_management_provider_type.py,sha256=t7S3zLf9n9GSYQJjshGRdiAfebYQKziGmUgbBlOmYuE,185
113
110
  workos/types/vault/__init__.py,sha256=krBuIl8luysrtDf9-b8KTkXOHDOaSsOR-Aao6Wlil0Q,41
@@ -120,19 +117,22 @@ workos/types/webhooks/webhook_payload.py,sha256=GXt31KtyBM-ji5K5p4dBnu46Gh8adQWT
120
117
  workos/types/widgets/__init__.py,sha256=z2Tdlj_bJsRZeJRh4SOFX58PvJdf0LjKnYhrQX1fpME,65
121
118
  workos/types/widgets/widget_scope.py,sha256=1sdxwfMW0DfiEr1TwPUdlUL8YZAflLAjQ-3auDwo5oA,81
122
119
  workos/types/widgets/widget_token_response.py,sha256=bM2_tIxyBVZqwQ128eCwJ3IjlWpr7CgADUAT9801L8k,168
120
+ workos/types/workos_model.py,sha256=qpXnR1eG-Xv5LSeEM_VDSi9BRdVgWX7BXKBr395xg10,736
123
121
  workos/typing/__init__.py,sha256=kiaJWJSfUT55sm1gPCSx_VPQbigeE7TE-c4tTwYMKhY,61
124
122
  workos/typing/literals.py,sha256=I930NYkbqPA_vX30ZYG-SZD0_FaWP3D3AlcZr-je4T0,1062
125
123
  workos/typing/sync_or_async.py,sha256=O-a-bWqxN5A-UkSC3pOvPgDCGUY5gMD-NNny4HdISeI,101
126
124
  workos/typing/untyped_literal.py,sha256=wf48_6kZJ-AN3-V2gLC_y5k2tnUvgGnhn89HsfOKNTM,1463
127
125
  workos/typing/webhooks.py,sha256=8GhUnrlGrgQbknh32tVtHxeR8FsXsJesW94CtZiB-_4,534
126
+ workos/user_management.py,sha256=9S1Ksg5VZCjCaYUPlMmVSs58Xun8dK520EyrUsitdOc,86103
128
127
  workos/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
128
  workos/utils/_base_http_client.py,sha256=tX2RAk2Mc2oHPTpzIft4-Tss8-vOJZUjmHcQ9cjpwOs,7705
130
129
  workos/utils/crypto_provider.py,sha256=QeQSR4t9xLlb90kEfl8onVUsf1yCkYq0EjFTxK0mUlk,1182
131
130
  workos/utils/http_client.py,sha256=TM5yMFFExmAE8D2Z43-5O301tRbnylLG0aXO0isGorE,6197
132
131
  workos/utils/pagination_order.py,sha256=_-et1DDJLG0czarTU7op4W6RA0V1f85GNsUgtyRU55Q,70
133
- workos/utils/request_helper.py,sha256=NaO16qPPbSNnCeE0fiNKYb8gM-dK_okYVJbLGrEGXz8,793
134
- workos-5.37.0.dist-info/LICENSE,sha256=mU--WL1JzelH2tXpKVoOlpud4cpqKSRTtdArCvYZmb4,1063
135
- workos-5.37.0.dist-info/METADATA,sha256=6JP8iaTlAshQvSIykV7Fr2gYo-BwjBDXzwLISERf-gE,4187
136
- workos-5.37.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
137
- workos-5.37.0.dist-info/top_level.txt,sha256=ZFskIfue1Tw-JwjyIXRvdsAl9i0DX9VbqmgICXV84Sk,7
138
- workos-5.37.0.dist-info/RECORD,,
132
+ workos/utils/request_helper.py,sha256=9FgeDfz_hiHlbCkuo6bcBjSpdDM5ObRok9-G_jFeddo,792
133
+ workos/vault.py,sha256=fe2OkFLVV1U4x9E78baWGksPIxg32decAuawEaJ63w4,16417
134
+ workos/webhooks.py,sha256=CuwBxh6va9VZFVSXOknveGt6CCGDF3em07a-J12DbXI,4790
135
+ workos/widgets.py,sha256=YAjiffcewHXcPx2kjScGs2-xZpmYsed33UQ6xDTqjJM,1720
136
+ workos-5.38.1.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
137
+ workos-5.38.1.dist-info/METADATA,sha256=4UXaoFZJ5d1hJO8uZ9MyvgOxAutfgPhSBPwz_jKWCuY,3348
138
+ workos-5.38.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.8.24
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
workos/__about__.py DELETED
@@ -1,23 +0,0 @@
1
- __all__ = [
2
- "__package_name__",
3
- "__package_url__",
4
- "__version__",
5
- "__author__",
6
- "__author_email__",
7
- "__description__",
8
- "__license__",
9
- ]
10
-
11
- __package_name__ = "workos"
12
-
13
- __package_url__ = "https://github.com/workos-inc/workos-python"
14
-
15
- __version__ = "5.37.0"
16
-
17
- __author__ = "WorkOS"
18
-
19
- __author_email__ = "team@workos.com"
20
-
21
- __description__ = "WorkOS Python Client"
22
-
23
- __license__ = "MIT"
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2024 WorkOS
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,5 +0,0 @@
1
- Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.42.0)
3
- Root-Is-Purelib: true
4
- Tag: py3-none-any
5
-
@@ -1 +0,0 @@
1
- workos