Skip to content

Commit

Permalink
Support dicts for complex types in API calls (#200)
Browse files Browse the repository at this point in the history
  • Loading branch information
logan-stytch authored May 10, 2024
1 parent 1bea42f commit e8237bf
Show file tree
Hide file tree
Showing 18 changed files with 291 additions and 143 deletions.
10 changes: 6 additions & 4 deletions stytch/b2b/api/discovery_organizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from __future__ import annotations

from typing import Any, Dict, List, Optional
from typing import Any, Dict, List, Optional, Union

from stytch.b2b.models.discovery_organizations import CreateResponse, ListResponse
from stytch.b2b.models.organizations import EmailImplicitRoleAssignment
Expand Down Expand Up @@ -39,7 +39,7 @@ def create(
allowed_auth_methods: Optional[List[str]] = None,
mfa_policy: Optional[str] = None,
rbac_email_implicit_role_assignments: Optional[
List[EmailImplicitRoleAssignment]
List[Union[EmailImplicitRoleAssignment, Dict[str, Any]]]
] = None,
mfa_methods: Optional[str] = None,
allowed_mfa_methods: Optional[List[str]] = None,
Expand Down Expand Up @@ -165,7 +165,8 @@ def create(
data["mfa_policy"] = mfa_policy
if rbac_email_implicit_role_assignments is not None:
data["rbac_email_implicit_role_assignments"] = [
item.dict() for item in rbac_email_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in rbac_email_implicit_role_assignments
]
if mfa_methods is not None:
data["mfa_methods"] = mfa_methods
Expand Down Expand Up @@ -319,7 +320,8 @@ async def create_async(
data["mfa_policy"] = mfa_policy
if rbac_email_implicit_role_assignments is not None:
data["rbac_email_implicit_role_assignments"] = [
item.dict() for item in rbac_email_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in rbac_email_implicit_role_assignments
]
if mfa_methods is not None:
data["mfa_methods"] = mfa_methods
Expand Down
24 changes: 14 additions & 10 deletions stytch/b2b/api/organizations.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from __future__ import annotations

from typing import Any, Dict, List, Optional
from typing import Any, Dict, List, Optional, Union

from stytch.b2b.api.organizations_members import Members
from stytch.b2b.models.organizations import (
Expand Down Expand Up @@ -52,7 +52,7 @@ def create(
allowed_auth_methods: Optional[List[str]] = None,
mfa_policy: Optional[str] = None,
rbac_email_implicit_role_assignments: Optional[
List[EmailImplicitRoleAssignment]
List[Union[EmailImplicitRoleAssignment, Dict[str, Any]]]
] = None,
mfa_methods: Optional[str] = None,
allowed_mfa_methods: Optional[List[str]] = None,
Expand Down Expand Up @@ -149,7 +149,8 @@ def create(
data["mfa_policy"] = mfa_policy
if rbac_email_implicit_role_assignments is not None:
data["rbac_email_implicit_role_assignments"] = [
item.dict() for item in rbac_email_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in rbac_email_implicit_role_assignments
]
if mfa_methods is not None:
data["mfa_methods"] = mfa_methods
Expand Down Expand Up @@ -271,7 +272,8 @@ async def create_async(
data["mfa_policy"] = mfa_policy
if rbac_email_implicit_role_assignments is not None:
data["rbac_email_implicit_role_assignments"] = [
item.dict() for item in rbac_email_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in rbac_email_implicit_role_assignments
]
if mfa_methods is not None:
data["mfa_methods"] = mfa_methods
Expand Down Expand Up @@ -335,7 +337,7 @@ def update(
allowed_auth_methods: Optional[List[str]] = None,
mfa_policy: Optional[str] = None,
rbac_email_implicit_role_assignments: Optional[
List[EmailImplicitRoleAssignment]
List[Union[EmailImplicitRoleAssignment, Dict[str, Any]]]
] = None,
mfa_methods: Optional[str] = None,
allowed_mfa_methods: Optional[List[str]] = None,
Expand Down Expand Up @@ -489,7 +491,8 @@ def update(
data["mfa_policy"] = mfa_policy
if rbac_email_implicit_role_assignments is not None:
data["rbac_email_implicit_role_assignments"] = [
item.dict() for item in rbac_email_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in rbac_email_implicit_role_assignments
]
if mfa_methods is not None:
data["mfa_methods"] = mfa_methods
Expand Down Expand Up @@ -671,7 +674,8 @@ async def update_async(
data["mfa_policy"] = mfa_policy
if rbac_email_implicit_role_assignments is not None:
data["rbac_email_implicit_role_assignments"] = [
item.dict() for item in rbac_email_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in rbac_email_implicit_role_assignments
]
if mfa_methods is not None:
data["mfa_methods"] = mfa_methods
Expand Down Expand Up @@ -728,7 +732,7 @@ def search(
self,
cursor: Optional[str] = None,
limit: Optional[int] = None,
query: Optional[SearchQuery] = None,
query: Optional[Union[SearchQuery, Dict[str, Any]]] = None,
) -> SearchResponse:
"""Search for Organizations. If you send a request with no body params, no filtering will be applied and the endpoint will return all Organizations. All fuzzy search filters require a minimum of three characters.
Expand All @@ -744,7 +748,7 @@ def search(
if limit is not None:
data["limit"] = limit
if query is not None:
data["query"] = query.dict()
data["query"] = query if isinstance(query, dict) else query.dict()

url = self.api_base.url_for("/v1/b2b/organizations/search", data)
res = self.sync_client.post(url, data, headers)
Expand All @@ -770,7 +774,7 @@ async def search_async(
if limit is not None:
data["limit"] = limit
if query is not None:
data["query"] = query.dict()
data["query"] = query if isinstance(query, dict) else query.dict()

url = self.api_base.url_for("/v1/b2b/organizations/search", data)
res = await self.async_client.post(url, data, headers)
Expand Down
8 changes: 4 additions & 4 deletions stytch/b2b/api/organizations_members.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from __future__ import annotations

from typing import Any, Dict, List, Optional
from typing import Any, Dict, List, Optional, Union

from stytch.b2b.api.organizations_members_oauth_providers import OAuthProviders
from stytch.b2b.models.organizations import SearchQuery
Expand Down Expand Up @@ -485,7 +485,7 @@ def search(
organization_ids: List[str],
cursor: Optional[str] = None,
limit: Optional[int] = None,
query: Optional[SearchQuery] = None,
query: Optional[Union[SearchQuery, Dict[str, Any]]] = None,
method_options: Optional[SearchRequestOptions] = None,
) -> SearchResponse:
"""Search for Members within specified Organizations. An array with at least one `organization_id` is required. Submitting an empty `query` returns all non-deleted Members within the specified Organizations.
Expand Down Expand Up @@ -521,7 +521,7 @@ def search(
if limit is not None:
data["limit"] = limit
if query is not None:
data["query"] = query.dict()
data["query"] = query if isinstance(query, dict) else query.dict()

url = self.api_base.url_for("/v1/b2b/organizations/members/search", data)
res = self.sync_client.post(url, data, headers)
Expand Down Expand Up @@ -568,7 +568,7 @@ async def search_async(
if limit is not None:
data["limit"] = limit
if query is not None:
data["query"] = query.dict()
data["query"] = query if isinstance(query, dict) else query.dict()

url = self.api_base.url_for("/v1/b2b/organizations/members/search", data)
res = await self.async_client.post(url, data, headers)
Expand Down
62 changes: 47 additions & 15 deletions stytch/b2b/api/passwords.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,11 +120,11 @@ def migrate(
hash: str,
hash_type: Union[MigrateRequestHashType, str],
organization_id: str,
md_5_config: Optional[MD5Config] = None,
argon_2_config: Optional[Argon2Config] = None,
sha_1_config: Optional[SHA1Config] = None,
scrypt_config: Optional[ScryptConfig] = None,
pbkdf_2_config: Optional[PBKDF2Config] = None,
md_5_config: Optional[Union[MD5Config, Dict[str, Any]]] = None,
argon_2_config: Optional[Union[Argon2Config, Dict[str, Any]]] = None,
sha_1_config: Optional[Union[SHA1Config, Dict[str, Any]]] = None,
scrypt_config: Optional[Union[ScryptConfig, Dict[str, Any]]] = None,
pbkdf_2_config: Optional[Union[PBKDF2Config, Dict[str, Any]]] = None,
name: Optional[str] = None,
trusted_metadata: Optional[Dict[str, Any]] = None,
untrusted_metadata: Optional[Dict[str, Any]] = None,
Expand Down Expand Up @@ -168,15 +168,31 @@ def migrate(
"organization_id": organization_id,
}
if md_5_config is not None:
data["md_5_config"] = md_5_config.dict()
data["md_5_config"] = (
md_5_config if isinstance(md_5_config, dict) else md_5_config.dict()
)
if argon_2_config is not None:
data["argon_2_config"] = argon_2_config.dict()
data["argon_2_config"] = (
argon_2_config
if isinstance(argon_2_config, dict)
else argon_2_config.dict()
)
if sha_1_config is not None:
data["sha_1_config"] = sha_1_config.dict()
data["sha_1_config"] = (
sha_1_config if isinstance(sha_1_config, dict) else sha_1_config.dict()
)
if scrypt_config is not None:
data["scrypt_config"] = scrypt_config.dict()
data["scrypt_config"] = (
scrypt_config
if isinstance(scrypt_config, dict)
else scrypt_config.dict()
)
if pbkdf_2_config is not None:
data["pbkdf_2_config"] = pbkdf_2_config.dict()
data["pbkdf_2_config"] = (
pbkdf_2_config
if isinstance(pbkdf_2_config, dict)
else pbkdf_2_config.dict()
)
if name is not None:
data["name"] = name
if trusted_metadata is not None:
Expand Down Expand Up @@ -246,15 +262,31 @@ async def migrate_async(
"organization_id": organization_id,
}
if md_5_config is not None:
data["md_5_config"] = md_5_config.dict()
data["md_5_config"] = (
md_5_config if isinstance(md_5_config, dict) else md_5_config.dict()
)
if argon_2_config is not None:
data["argon_2_config"] = argon_2_config.dict()
data["argon_2_config"] = (
argon_2_config
if isinstance(argon_2_config, dict)
else argon_2_config.dict()
)
if sha_1_config is not None:
data["sha_1_config"] = sha_1_config.dict()
data["sha_1_config"] = (
sha_1_config if isinstance(sha_1_config, dict) else sha_1_config.dict()
)
if scrypt_config is not None:
data["scrypt_config"] = scrypt_config.dict()
data["scrypt_config"] = (
scrypt_config
if isinstance(scrypt_config, dict)
else scrypt_config.dict()
)
if pbkdf_2_config is not None:
data["pbkdf_2_config"] = pbkdf_2_config.dict()
data["pbkdf_2_config"] = (
pbkdf_2_config
if isinstance(pbkdf_2_config, dict)
else pbkdf_2_config.dict()
)
if name is not None:
data["name"] = name
if trusted_metadata is not None:
Expand Down
8 changes: 5 additions & 3 deletions stytch/b2b/api/scim_connections.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ def update(
display_name: Optional[str] = None,
identity_provider: Optional[Union[UpdateRequestIdp, str]] = None,
scim_group_implicit_role_assignments: Optional[
List[SCIMGroupImplicitRoleAssignments]
List[Union[SCIMGroupImplicitRoleAssignments, Dict[str, Any]]]
] = None,
method_options: Optional[UpdateRequestOptions] = None,
) -> UpdateResponse:
Expand All @@ -72,7 +72,8 @@ def update(
data["identity_provider"] = identity_provider
if scim_group_implicit_role_assignments is not None:
data["scim_group_implicit_role_assignments"] = [
item.dict() for item in scim_group_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in scim_group_implicit_role_assignments
]

url = self.api_base.url_for(
Expand Down Expand Up @@ -114,7 +115,8 @@ async def update_async(
data["identity_provider"] = identity_provider
if scim_group_implicit_role_assignments is not None:
data["scim_group_implicit_role_assignments"] = [
item.dict() for item in scim_group_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in scim_group_implicit_role_assignments
]

url = self.api_base.url_for(
Expand Down
14 changes: 11 additions & 3 deletions stytch/b2b/api/sessions.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ def authenticate(
session_duration_minutes: Optional[int] = None,
session_jwt: Optional[str] = None,
session_custom_claims: Optional[Dict[str, Any]] = None,
authorization_check: Optional[AuthorizationCheck] = None,
authorization_check: Optional[Union[AuthorizationCheck, Dict[str, Any]]] = None,
) -> AuthenticateResponse:
"""Authenticates a Session and updates its lifetime by the specified `session_duration_minutes`. If the `session_duration_minutes` is not specified, a Session will not be extended. This endpoint requires either a `session_jwt` or `session_token` be included in the request. It will return an error if both are present.
Expand Down Expand Up @@ -148,7 +148,11 @@ def authenticate(
if session_custom_claims is not None:
data["session_custom_claims"] = session_custom_claims
if authorization_check is not None:
data["authorization_check"] = authorization_check.dict()
data["authorization_check"] = (
authorization_check
if isinstance(authorization_check, dict)
else authorization_check.dict()
)

url = self.api_base.url_for("/v1/b2b/sessions/authenticate", data)
res = self.sync_client.post(url, data, headers)
Expand Down Expand Up @@ -215,7 +219,11 @@ async def authenticate_async(
if session_custom_claims is not None:
data["session_custom_claims"] = session_custom_claims
if authorization_check is not None:
data["authorization_check"] = authorization_check.dict()
data["authorization_check"] = (
authorization_check
if isinstance(authorization_check, dict)
else authorization_check.dict()
)

url = self.api_base.url_for("/v1/b2b/sessions/authenticate", data)
res = await self.async_client.post(url, data, headers)
Expand Down
18 changes: 11 additions & 7 deletions stytch/b2b/api/sso_saml.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

from __future__ import annotations

from typing import Any, Dict, List, Optional
from typing import Any, Dict, List, Optional, Union

from stytch.b2b.models.sso import (
SAMLConnectionImplicitRoleAssignment,
Expand Down Expand Up @@ -94,10 +94,10 @@ def update_connection(
x509_certificate: Optional[str] = None,
idp_sso_url: Optional[str] = None,
saml_connection_implicit_role_assignments: Optional[
List[SAMLConnectionImplicitRoleAssignment]
List[Union[SAMLConnectionImplicitRoleAssignment, Dict[str, Any]]]
] = None,
saml_group_implicit_role_assignments: Optional[
List[SAMLGroupImplicitRoleAssignment]
List[Union[SAMLGroupImplicitRoleAssignment, Dict[str, Any]]]
] = None,
alternative_audience_uri: Optional[str] = None,
method_options: Optional[UpdateConnectionRequestOptions] = None,
Expand Down Expand Up @@ -147,11 +147,13 @@ def update_connection(
data["idp_sso_url"] = idp_sso_url
if saml_connection_implicit_role_assignments is not None:
data["saml_connection_implicit_role_assignments"] = [
item.dict() for item in saml_connection_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in saml_connection_implicit_role_assignments
]
if saml_group_implicit_role_assignments is not None:
data["saml_group_implicit_role_assignments"] = [
item.dict() for item in saml_group_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in saml_group_implicit_role_assignments
]
if alternative_audience_uri is not None:
data["alternative_audience_uri"] = alternative_audience_uri
Expand Down Expand Up @@ -225,11 +227,13 @@ async def update_connection_async(
data["idp_sso_url"] = idp_sso_url
if saml_connection_implicit_role_assignments is not None:
data["saml_connection_implicit_role_assignments"] = [
item.dict() for item in saml_connection_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in saml_connection_implicit_role_assignments
]
if saml_group_implicit_role_assignments is not None:
data["saml_group_implicit_role_assignments"] = [
item.dict() for item in saml_group_implicit_role_assignments
item if isinstance(item, dict) else item.dict()
for item in saml_group_implicit_role_assignments
]
if alternative_audience_uri is not None:
data["alternative_audience_uri"] = alternative_audience_uri
Expand Down
Loading

0 comments on commit e8237bf

Please sign in to comment.