diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 65f558e..656a2ef 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "2.0.0" + ".": "2.1.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index d75fd4d..f71ce24 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 10 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openint%2Fopenint-fc7527fabd8beebd9c639bd6ac66f10ac26805db119cb625c67840c51f622dd9.yml -openapi_spec_hash: 394209b9c4d294c6509002851a5448c8 -config_hash: 9e645fd6bff74d3299e2924f99ec4034 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openint%2Fopenint-bacbc8c9cbe5ff0643c5413e7f1ef80fe15094393e788142b84075998fc7ad85.yml +openapi_spec_hash: 044dac4816a3a8fed6a303cf2eb65ed4 +config_hash: be212d1ce37acf5836869f40d1654c82 diff --git a/CHANGELOG.md b/CHANGELOG.md index 41a7ea1..a9c9414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ # Changelog +## 2.1.0 (2025-05-19) + +Full Changelog: [v2.0.0...v2.1.0](https://github.com/openintegrations/python-sdk/compare/v2.0.0...v2.1.0) + +### Features + +* **api:** adding message template ([85b7294](https://github.com/openintegrations/python-sdk/commit/85b729443bfe6aed5b5e1335a058ea721a425ec8)) +* **api:** scheme sync ([db2b3f4](https://github.com/openintegrations/python-sdk/commit/db2b3f4d82a2a498b4b67eadc5191a3e1ff28220)) +* **docs:** updating documented docs for stainless ([b5af4c3](https://github.com/openintegrations/python-sdk/commit/b5af4c3102c40db19cac6fbac2968b2d453e2764)) + ## 2.0.0 (2025-05-19) Full Changelog: [v1.6.1...v2.0.0](https://github.com/openintegrations/python-sdk/compare/v1.6.1...v2.0.0) diff --git a/README.md b/README.md index c9c93d5..590ac79 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,14 @@ pip install openint The full API of this library can be found in [api.md](api.md). ```python +import os from openint import Openint -client = Openint() +client = Openint( + token=os.environ.get( + "OPENINT_API_KEY_OR_CUSTOMER_TOKEN_OR_CUSTOMER_API_KEY" + ), # This is the default and can be omitted +) page = client.list_connections() print(page.items) @@ -42,10 +47,15 @@ so that your Token is not stored in source control. Simply import `AsyncOpenint` instead of `Openint` and use `await` with each API call: ```python +import os import asyncio from openint import AsyncOpenint -client = AsyncOpenint() +client = AsyncOpenint( + token=os.environ.get( + "OPENINT_API_KEY_OR_CUSTOMER_TOKEN_OR_CUSTOMER_API_KEY" + ), # This is the default and can be omitted +) async def main() -> None: @@ -76,7 +86,7 @@ from openint import Openint client = Openint() -response = client.create_magic_link( +response = client.create_token( customer_id="x", connect_options={ "connector_names": ["acme-oauth2"], diff --git a/api.md b/api.md index d40d282..a8f1cb1 100644 --- a/api.md +++ b/api.md @@ -6,11 +6,11 @@ Types: from openint.types import ( CheckConnectionResponse, CreateConnectionResponse, - CreateMagicLinkResponse, CreateTokenResponse, DeleteConnectionResponse, GetConnectionResponse, GetCurrentUserResponse, + GetMessageTemplateResponse, ListConnectionConfigsResponse, ListConnectionsResponse, ListConnectorsResponse, @@ -21,11 +21,11 @@ Methods: - client.check_connection(id) -> CheckConnectionResponse - client.create_connection(\*\*params) -> CreateConnectionResponse -- client.create_magic_link(customer_id, \*\*params) -> CreateMagicLinkResponse - client.create_token(customer_id, \*\*params) -> CreateTokenResponse - client.delete_connection(id) -> DeleteConnectionResponse - client.get_connection(id, \*\*params) -> GetConnectionResponse - client.get_current_user() -> GetCurrentUserResponse +- client.get_message_template(\*\*params) -> GetMessageTemplateResponse - client.list_connection_configs(\*\*params) -> SyncOffsetPagination[ListConnectionConfigsResponse] - client.list_connections(\*\*params) -> SyncOffsetPagination[ListConnectionsResponse] - client.list_connectors(\*\*params) -> SyncOffsetPagination[ListConnectorsResponse] diff --git a/pyproject.toml b/pyproject.toml index b6a2b71..08aa26e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openint" -version = "2.0.0" +version = "2.1.0" description = "The official Python library for the Openint API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/openint/_client.py b/src/openint/_client.py index aa7af8c..3c4d305 100644 --- a/src/openint/_client.py +++ b/src/openint/_client.py @@ -16,7 +16,7 @@ client_list_connectors_params, client_list_connections_params, client_create_connection_params, - client_create_magic_link_params, + client_get_message_template_params, client_list_connection_configs_params, ) from ._types import ( @@ -61,8 +61,8 @@ from .types.get_current_user_response import GetCurrentUserResponse from .types.list_connections_response import ListConnectionsResponse from .types.create_connection_response import CreateConnectionResponse -from .types.create_magic_link_response import CreateMagicLinkResponse from .types.delete_connection_response import DeleteConnectionResponse +from .types.get_message_template_response import GetMessageTemplateResponse from .types.list_connection_configs_response import ListConnectionConfigsResponse __all__ = ["Timeout", "Transport", "ProxiesTypes", "RequestOptions", "Openint", "AsyncOpenint", "Client", "AsyncClient"] @@ -303,53 +303,6 @@ def create_connection( ), ) - def create_magic_link( - self, - customer_id: str, - *, - connect_options: client_create_magic_link_params.ConnectOptions | NotGiven = NOT_GIVEN, - validity_in_seconds: float | NotGiven = NOT_GIVEN, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> CreateMagicLinkResponse: - """ - Create a @Connect magic link that is ready to be shared with customers who want - to use @Connect - - Args: - customer_id: The unique ID of the customer to create the magic link for - - validity_in_seconds: How long the magic link will be valid for (in seconds) before it expires - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - if not customer_id: - raise ValueError(f"Expected a non-empty value for `customer_id` but received {customer_id!r}") - return self.post( - f"/customer/{customer_id}/magic-link", - body=maybe_transform( - { - "connect_options": connect_options, - "validity_in_seconds": validity_in_seconds, - }, - client_create_magic_link_params.ClientCreateMagicLinkParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=CreateMagicLinkResponse, - ) - def create_token( self, customer_id: str, @@ -371,6 +324,10 @@ def create_token( Args: customer_id: The unique ID of the customer to create the token for + validity_in_seconds: How long the publishable token and magic link url will be valid for (in seconds) + before it expires. By default it will be valid for 30 days unless otherwise + specified. + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -507,6 +464,50 @@ def get_current_user( cast_to=GetCurrentUserResponse, ) + def get_message_template( + self, + *, + customer_id: str, + language: Literal["javascript"] | NotGiven = NOT_GIVEN, + use_environment_variables: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> GetMessageTemplateResponse: + """ + Get a message template for an AI agent + + Args: + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self.get( + "/ai/message_template", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "customer_id": customer_id, + "language": language, + "use_environment_variables": use_environment_variables, + }, + client_get_message_template_params.ClientGetMessageTemplateParams, + ), + ), + cast_to=GetMessageTemplateResponse, + ) + def list_connection_configs( self, *, @@ -694,6 +695,7 @@ def list_connections( include_secrets: bool | NotGiven = NOT_GIVEN, limit: int | NotGiven = NOT_GIVEN, offset: int | NotGiven = NOT_GIVEN, + refresh_policy: Literal["none", "force", "auto"] | NotGiven = NOT_GIVEN, search_query: str | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -720,6 +722,9 @@ def list_connections( offset: Offset the items returned + refresh_policy: Controls credential refresh: none (never), force (always), or auto (when + expired, default) + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -745,6 +750,7 @@ def list_connections( "include_secrets": include_secrets, "limit": limit, "offset": offset, + "refresh_policy": refresh_policy, "search_query": search_query, }, client_list_connections_params.ClientListConnectionsParams, @@ -1071,53 +1077,6 @@ async def create_connection( ), ) - async def create_magic_link( - self, - customer_id: str, - *, - connect_options: client_create_magic_link_params.ConnectOptions | NotGiven = NOT_GIVEN, - validity_in_seconds: float | NotGiven = NOT_GIVEN, - # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. - # The extra values given here take precedence over values defined on the client or passed to this method. - extra_headers: Headers | None = None, - extra_query: Query | None = None, - extra_body: Body | None = None, - timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, - ) -> CreateMagicLinkResponse: - """ - Create a @Connect magic link that is ready to be shared with customers who want - to use @Connect - - Args: - customer_id: The unique ID of the customer to create the magic link for - - validity_in_seconds: How long the magic link will be valid for (in seconds) before it expires - - extra_headers: Send extra headers - - extra_query: Add additional query parameters to the request - - extra_body: Add additional JSON properties to the request - - timeout: Override the client-level default timeout for this request, in seconds - """ - if not customer_id: - raise ValueError(f"Expected a non-empty value for `customer_id` but received {customer_id!r}") - return await self.post( - f"/customer/{customer_id}/magic-link", - body=await async_maybe_transform( - { - "connect_options": connect_options, - "validity_in_seconds": validity_in_seconds, - }, - client_create_magic_link_params.ClientCreateMagicLinkParams, - ), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=CreateMagicLinkResponse, - ) - async def create_token( self, customer_id: str, @@ -1139,6 +1098,10 @@ async def create_token( Args: customer_id: The unique ID of the customer to create the token for + validity_in_seconds: How long the publishable token and magic link url will be valid for (in seconds) + before it expires. By default it will be valid for 30 days unless otherwise + specified. + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -1275,6 +1238,50 @@ async def get_current_user( cast_to=GetCurrentUserResponse, ) + async def get_message_template( + self, + *, + customer_id: str, + language: Literal["javascript"] | NotGiven = NOT_GIVEN, + use_environment_variables: bool | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> GetMessageTemplateResponse: + """ + Get a message template for an AI agent + + Args: + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return await self.get( + "/ai/message_template", + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=await async_maybe_transform( + { + "customer_id": customer_id, + "language": language, + "use_environment_variables": use_environment_variables, + }, + client_get_message_template_params.ClientGetMessageTemplateParams, + ), + ), + cast_to=GetMessageTemplateResponse, + ) + def list_connection_configs( self, *, @@ -1462,6 +1469,7 @@ def list_connections( include_secrets: bool | NotGiven = NOT_GIVEN, limit: int | NotGiven = NOT_GIVEN, offset: int | NotGiven = NOT_GIVEN, + refresh_policy: Literal["none", "force", "auto"] | NotGiven = NOT_GIVEN, search_query: str | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. # The extra values given here take precedence over values defined on the client or passed to this method. @@ -1488,6 +1496,9 @@ def list_connections( offset: Offset the items returned + refresh_policy: Controls credential refresh: none (never), force (always), or auto (when + expired, default) + extra_headers: Send extra headers extra_query: Add additional query parameters to the request @@ -1513,6 +1524,7 @@ def list_connections( "include_secrets": include_secrets, "limit": limit, "offset": offset, + "refresh_policy": refresh_policy, "search_query": search_query, }, client_list_connections_params.ClientListConnectionsParams, @@ -1612,9 +1624,6 @@ def __init__(self, client: Openint) -> None: self.create_connection = to_raw_response_wrapper( client.create_connection, ) - self.create_magic_link = to_raw_response_wrapper( - client.create_magic_link, - ) self.create_token = to_raw_response_wrapper( client.create_token, ) @@ -1627,6 +1636,9 @@ def __init__(self, client: Openint) -> None: self.get_current_user = to_raw_response_wrapper( client.get_current_user, ) + self.get_message_template = to_raw_response_wrapper( + client.get_message_template, + ) self.list_connection_configs = to_raw_response_wrapper( client.list_connection_configs, ) @@ -1646,9 +1658,6 @@ def __init__(self, client: AsyncOpenint) -> None: self.create_connection = async_to_raw_response_wrapper( client.create_connection, ) - self.create_magic_link = async_to_raw_response_wrapper( - client.create_magic_link, - ) self.create_token = async_to_raw_response_wrapper( client.create_token, ) @@ -1661,6 +1670,9 @@ def __init__(self, client: AsyncOpenint) -> None: self.get_current_user = async_to_raw_response_wrapper( client.get_current_user, ) + self.get_message_template = async_to_raw_response_wrapper( + client.get_message_template, + ) self.list_connection_configs = async_to_raw_response_wrapper( client.list_connection_configs, ) @@ -1680,9 +1692,6 @@ def __init__(self, client: Openint) -> None: self.create_connection = to_streamed_response_wrapper( client.create_connection, ) - self.create_magic_link = to_streamed_response_wrapper( - client.create_magic_link, - ) self.create_token = to_streamed_response_wrapper( client.create_token, ) @@ -1695,6 +1704,9 @@ def __init__(self, client: Openint) -> None: self.get_current_user = to_streamed_response_wrapper( client.get_current_user, ) + self.get_message_template = to_streamed_response_wrapper( + client.get_message_template, + ) self.list_connection_configs = to_streamed_response_wrapper( client.list_connection_configs, ) @@ -1714,9 +1726,6 @@ def __init__(self, client: AsyncOpenint) -> None: self.create_connection = async_to_streamed_response_wrapper( client.create_connection, ) - self.create_magic_link = async_to_streamed_response_wrapper( - client.create_magic_link, - ) self.create_token = async_to_streamed_response_wrapper( client.create_token, ) @@ -1729,6 +1738,9 @@ def __init__(self, client: AsyncOpenint) -> None: self.get_current_user = async_to_streamed_response_wrapper( client.get_current_user, ) + self.get_message_template = async_to_streamed_response_wrapper( + client.get_message_template, + ) self.list_connection_configs = async_to_streamed_response_wrapper( client.list_connection_configs, ) diff --git a/src/openint/_version.py b/src/openint/_version.py index 6c9bd3a..4211ba2 100644 --- a/src/openint/_version.py +++ b/src/openint/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "openint" -__version__ = "2.0.0" # x-release-please-version +__version__ = "2.1.0" # x-release-please-version diff --git a/src/openint/types/__init__.py b/src/openint/types/__init__.py index 9fef387..9a729bf 100644 --- a/src/openint/types/__init__.py +++ b/src/openint/types/__init__.py @@ -10,14 +10,14 @@ from .list_connections_response import ListConnectionsResponse as ListConnectionsResponse from .client_create_token_params import ClientCreateTokenParams as ClientCreateTokenParams from .create_connection_response import CreateConnectionResponse as CreateConnectionResponse -from .create_magic_link_response import CreateMagicLinkResponse as CreateMagicLinkResponse from .delete_connection_response import DeleteConnectionResponse as DeleteConnectionResponse from .client_get_connection_params import ClientGetConnectionParams as ClientGetConnectionParams from .client_list_connectors_params import ClientListConnectorsParams as ClientListConnectorsParams +from .get_message_template_response import GetMessageTemplateResponse as GetMessageTemplateResponse from .client_list_connections_params import ClientListConnectionsParams as ClientListConnectionsParams from .client_create_connection_params import ClientCreateConnectionParams as ClientCreateConnectionParams -from .client_create_magic_link_params import ClientCreateMagicLinkParams as ClientCreateMagicLinkParams from .list_connection_configs_response import ListConnectionConfigsResponse as ListConnectionConfigsResponse +from .client_get_message_template_params import ClientGetMessageTemplateParams as ClientGetMessageTemplateParams from .client_list_connection_configs_params import ( ClientListConnectionConfigsParams as ClientListConnectionConfigsParams, ) diff --git a/src/openint/types/client_create_connection_params.py b/src/openint/types/client_create_connection_params.py index a4439dd..082bef4 100644 --- a/src/openint/types/client_create_connection_params.py +++ b/src/openint/types/client_create_connection_params.py @@ -250,6 +250,12 @@ class DataConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth(TypedD class DataConnectorAcmeOauth2DiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorAcmeOauth2DiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["acme-oauth2"]] @@ -292,6 +298,12 @@ class DataConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth(TypedDict class DataConnectorAircallDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorAircallDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["aircall"]] @@ -334,6 +346,12 @@ class DataConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth(TypedD class DataConnectorConfluenceDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorConfluenceDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["confluence"]] @@ -376,6 +394,12 @@ class DataConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth(TypedDict class DataConnectorDiscordDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorDiscordDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["discord"]] @@ -418,6 +442,12 @@ class DataConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth(TypedDic class DataConnectorFacebookDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorFacebookDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["facebook"]] @@ -460,6 +490,12 @@ class DataConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, class DataConnectorGitHubDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorGitHubDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["github"]] @@ -505,6 +541,12 @@ class DataConnectorGongDiscriminatedConnectionSettingsSettings(TypedDict, total= oauth: Required[DataConnectorGongDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorGongDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["gong"]] @@ -547,6 +589,12 @@ class DataConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth(Ty class DataConnectorGoogleCalendarDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorGoogleCalendarDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["google-calendar"]] @@ -589,6 +637,12 @@ class DataConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth(TypedD class DataConnectorGoogleDocsDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorGoogleDocsDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["google-docs"]] @@ -631,6 +685,12 @@ class DataConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth(Typed class DataConnectorGoogleDriveDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorGoogleDriveDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["google-drive"]] @@ -673,6 +733,12 @@ class DataConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth(TypedD class DataConnectorGoogleMailDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorGoogleMailDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["google-mail"]] @@ -715,6 +781,12 @@ class DataConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth(Typed class DataConnectorGoogleSheetDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorGoogleSheetDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["google-sheet"]] @@ -757,6 +829,12 @@ class DataConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth(TypedDict class DataConnectorHubspotDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorHubspotDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["hubspot"]] @@ -799,6 +877,12 @@ class DataConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth(TypedDi class DataConnectorInstagramDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorInstagramDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["instagram"]] @@ -841,6 +925,12 @@ class DataConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth(TypedDic class DataConnectorIntercomDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorIntercomDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["intercom"]] @@ -883,6 +973,12 @@ class DataConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, t class DataConnectorJiraDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorJiraDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["jira"]] @@ -925,6 +1021,12 @@ class DataConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, class DataConnectorLeverDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorLeverDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["lever"]] @@ -967,6 +1069,12 @@ class DataConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, class DataConnectorLinearDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorLinearDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["linear"]] @@ -1009,6 +1117,12 @@ class DataConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth(TypedDic class DataConnectorLinkedinDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorLinkedinDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["linkedin"]] @@ -1051,6 +1165,12 @@ class DataConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, class DataConnectorNotionDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorNotionDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["notion"]] @@ -1093,6 +1213,12 @@ class DataConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth(TypedDic class DataConnectorOutreachDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorOutreachDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["outreach"]] @@ -1138,6 +1264,12 @@ class DataConnectorPipedriveDiscriminatedConnectionSettingsSettings(TypedDict, t oauth: Required[DataConnectorPipedriveDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorPipedriveDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["pipedrive"]] @@ -1180,6 +1312,12 @@ class DataConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth(TypedD class DataConnectorQuickbooksDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorQuickbooksDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["quickbooks"]] @@ -1222,6 +1360,12 @@ class DataConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, class DataConnectorRedditDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorRedditDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["reddit"]] @@ -1264,6 +1408,12 @@ class DataConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth(TypedDi class DataConnectorSalesloftDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorSalesloftDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["salesloft"]] @@ -1306,6 +1456,12 @@ class DataConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth(TypedD class DataConnectorSharepointDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorSharepointDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["sharepoint"]] @@ -1348,6 +1504,12 @@ class DataConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, class DataConnectorSlackDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorSlackDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["slack"]] @@ -1390,6 +1552,12 @@ class DataConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth(TypedDict class DataConnectorTwitterDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorTwitterDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["twitter"]] @@ -1432,6 +1600,12 @@ class DataConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth(TypedDict, t class DataConnectorXeroDiscriminatedConnectionSettingsSettings(TypedDict, total=False): oauth: Required[DataConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorXeroDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["xero"]] @@ -1477,6 +1651,12 @@ class DataConnectorZohoDeskDiscriminatedConnectionSettingsSettings(TypedDict, to oauth: Required[DataConnectorZohoDeskDiscriminatedConnectionSettingsSettingsOAuth] + access_token: str + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class DataConnectorZohoDeskDiscriminatedConnectionSettings(TypedDict, total=False): connector_name: Required[Literal["zoho-desk"]] diff --git a/src/openint/types/client_create_magic_link_params.py b/src/openint/types/client_create_magic_link_params.py deleted file mode 100644 index 48a7933..0000000 --- a/src/openint/types/client_create_magic_link_params.py +++ /dev/null @@ -1,106 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import List -from typing_extensions import Literal, TypedDict - -__all__ = ["ClientCreateMagicLinkParams", "ConnectOptions"] - - -class ClientCreateMagicLinkParams(TypedDict, total=False): - connect_options: ConnectOptions - - validity_in_seconds: float - """How long the magic link will be valid for (in seconds) before it expires""" - - -class ConnectOptions(TypedDict, total=False): - connector_names: List[ - Literal[ - "acme-oauth2", - "aircall", - "airtable", - "apollo", - "brex", - "coda", - "confluence", - "discord", - "facebook", - "finch", - "firebase", - "foreceipt", - "github", - "gong", - "google-calendar", - "google-docs", - "google-drive", - "google-mail", - "google-sheet", - "greenhouse", - "heron", - "hubspot", - "instagram", - "intercom", - "jira", - "lever", - "linear", - "linkedin", - "lunchmoney", - "mercury", - "merge", - "moota", - "notion", - "onebrick", - "openledger", - "outreach", - "pipedrive", - "plaid", - "postgres", - "quickbooks", - "ramp", - "reddit", - "salesloft", - "saltedge", - "sharepoint", - "slack", - "splitwise", - "stripe", - "teller", - "toggl", - "twenty", - "twitter", - "venmo", - "wise", - "xero", - "yodlee", - "zoho-desk", - ] - ] - """The names of the connectors to show in the connect page. - - If not provided, all connectors will be shown - """ - - debug: bool - """Whether to enable debug mode""" - - is_embedded: bool - """Whether to enable embedded mode. - - Embedded mode hides the side bar with extra context for the end user (customer) - on the organization - """ - - return_url: str - """ - Optional URL to return customers after adding a connection or if they press the - Return To Organization button - """ - - view: Literal["add", "manage"] - """The default view to show when the magic link is opened. - - If omitted, by default it will smartly load the right view based on whether the - user has connections or not - """ diff --git a/src/openint/types/client_create_token_params.py b/src/openint/types/client_create_token_params.py index 4f36460..a44acf1 100644 --- a/src/openint/types/client_create_token_params.py +++ b/src/openint/types/client_create_token_params.py @@ -12,6 +12,11 @@ class ClientCreateTokenParams(TypedDict, total=False): connect_options: ConnectOptions validity_in_seconds: float + """ + How long the publishable token and magic link url will be valid for (in seconds) + before it expires. By default it will be valid for 30 days unless otherwise + specified. + """ class ConnectOptions(TypedDict, total=False): diff --git a/src/openint/types/client_get_message_template_params.py b/src/openint/types/client_get_message_template_params.py new file mode 100644 index 0000000..348bca5 --- /dev/null +++ b/src/openint/types/client_get_message_template_params.py @@ -0,0 +1,17 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Literal, Required, Annotated, TypedDict + +from .._utils import PropertyInfo + +__all__ = ["ClientGetMessageTemplateParams"] + + +class ClientGetMessageTemplateParams(TypedDict, total=False): + customer_id: Required[Annotated[str, PropertyInfo(alias="customerId")]] + + language: Literal["javascript"] + + use_environment_variables: Annotated[bool, PropertyInfo(alias="useEnvironmentVariables")] diff --git a/src/openint/types/client_list_connections_params.py b/src/openint/types/client_list_connections_params.py index 44477a4..b50760f 100644 --- a/src/openint/types/client_list_connections_params.py +++ b/src/openint/types/client_list_connections_params.py @@ -91,4 +91,10 @@ class ClientListConnectionsParams(TypedDict, total=False): offset: int """Offset the items returned""" + refresh_policy: Literal["none", "force", "auto"] + """ + Controls credential refresh: none (never), force (always), or auto (when + expired, default) + """ + search_query: str diff --git a/src/openint/types/create_connection_response.py b/src/openint/types/create_connection_response.py index f935dc6..ba5479a 100644 --- a/src/openint/types/create_connection_response.py +++ b/src/openint/types/create_connection_response.py @@ -230,6 +230,12 @@ class ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorAcmeOauth2DiscriminatedConnectionSettings(BaseModel): connector_name: Literal["acme-oauth2"] @@ -299,6 +305,12 @@ class ConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorAircallDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorAircallDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["aircall"] @@ -368,6 +380,12 @@ class ConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorConfluenceDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorConfluenceDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["confluence"] @@ -437,6 +455,12 @@ class ConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorDiscordDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorDiscordDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["discord"] @@ -506,6 +530,12 @@ class ConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorFacebookDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorFacebookDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["facebook"] @@ -575,6 +605,12 @@ class ConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorGitHubDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGitHubDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["github"] @@ -647,6 +683,12 @@ class ConnectorGongDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGongDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGongDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["gong"] @@ -716,6 +758,12 @@ class ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth(BaseMo class ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleCalendarDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-calendar"] @@ -785,6 +833,12 @@ class ConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorGoogleDocsDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleDocsDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-docs"] @@ -854,6 +908,12 @@ class ConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth(BaseModel class ConnectorGoogleDriveDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleDriveDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-drive"] @@ -923,6 +983,12 @@ class ConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorGoogleMailDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleMailDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-mail"] @@ -992,6 +1058,12 @@ class ConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth(BaseModel class ConnectorGoogleSheetDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleSheetDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-sheet"] @@ -1061,6 +1133,12 @@ class ConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorHubspotDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorHubspotDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["hubspot"] @@ -1130,6 +1208,12 @@ class ConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorInstagramDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorInstagramDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["instagram"] @@ -1199,6 +1283,12 @@ class ConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorIntercomDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorIntercomDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["intercom"] @@ -1268,6 +1358,12 @@ class ConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorJiraDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorJiraDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["jira"] @@ -1337,6 +1433,12 @@ class ConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLeverDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLeverDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["lever"] @@ -1406,6 +1508,12 @@ class ConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLinearDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLinearDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["linear"] @@ -1475,6 +1583,12 @@ class ConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLinkedinDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLinkedinDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["linkedin"] @@ -1544,6 +1658,12 @@ class ConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorNotionDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorNotionDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["notion"] @@ -1613,6 +1733,12 @@ class ConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorOutreachDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorOutreachDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["outreach"] @@ -1685,6 +1811,12 @@ class ConnectorPipedriveDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorPipedriveDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorPipedriveDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["pipedrive"] @@ -1754,6 +1886,12 @@ class ConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorQuickbooksDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorQuickbooksDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["quickbooks"] @@ -1823,6 +1961,12 @@ class ConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorRedditDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorRedditDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["reddit"] @@ -1892,6 +2036,12 @@ class ConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorSalesloftDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSalesloftDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["salesloft"] @@ -1961,6 +2111,12 @@ class ConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorSharepointDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSharepointDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["sharepoint"] @@ -2030,6 +2186,12 @@ class ConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorSlackDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSlackDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["slack"] @@ -2099,6 +2261,12 @@ class ConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorTwitterDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorTwitterDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["twitter"] @@ -2168,6 +2336,12 @@ class ConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorXeroDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorXeroDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["xero"] @@ -2240,6 +2414,12 @@ class ConnectorZohoDeskDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorZohoDeskDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorZohoDeskDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["zoho-desk"] diff --git a/src/openint/types/create_magic_link_response.py b/src/openint/types/create_magic_link_response.py deleted file mode 100644 index f87bae4..0000000 --- a/src/openint/types/create_magic_link_response.py +++ /dev/null @@ -1,10 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from .._models import BaseModel - -__all__ = ["CreateMagicLinkResponse"] - - -class CreateMagicLinkResponse(BaseModel): - magic_link_url: str - """The Connect magic link url to share with the user.""" diff --git a/src/openint/types/create_token_response.py b/src/openint/types/create_token_response.py index f5292da..d757dc7 100644 --- a/src/openint/types/create_token_response.py +++ b/src/openint/types/create_token_response.py @@ -1,5 +1,7 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +from typing import Optional + from .._models import BaseModel __all__ = ["CreateTokenResponse"] @@ -7,4 +9,21 @@ class CreateTokenResponse(BaseModel): token: str - """The authentication token to use for API requests""" + """ + A short-lived publishable authentication token to use for customer api requests + from the frontend. This token by default expires in 30 days unless otherwise + specified via the validity_in_seconds parameter. + """ + + api_key: Optional[str] = None + """A long-lived customer API key to use for API requests. + + Not meant to be published to the frontend. + """ + + magic_link_url: str + """A link that can be shared with customers to use @Connect in any browser. + + This link will expire in 30 days by default unless otherwise specified via the + validity_in_seconds parameter. + """ diff --git a/src/openint/types/get_connection_response.py b/src/openint/types/get_connection_response.py index e85a5b0..22d3034 100644 --- a/src/openint/types/get_connection_response.py +++ b/src/openint/types/get_connection_response.py @@ -590,6 +590,12 @@ class ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorAcmeOauth2DiscriminatedConnectionSettings(BaseModel): connector_name: Literal["acme-oauth2"] @@ -795,6 +801,12 @@ class ConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorAircallDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorAircallDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["aircall"] @@ -1000,6 +1012,12 @@ class ConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorConfluenceDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorConfluenceDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["confluence"] @@ -1205,6 +1223,12 @@ class ConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorDiscordDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorDiscordDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["discord"] @@ -1410,6 +1434,12 @@ class ConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorFacebookDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorFacebookDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["facebook"] @@ -1615,6 +1645,12 @@ class ConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorGitHubDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGitHubDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["github"] @@ -1823,6 +1859,12 @@ class ConnectorGongDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGongDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGongDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["gong"] @@ -2028,6 +2070,12 @@ class ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth(BaseMo class ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleCalendarDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-calendar"] @@ -2233,6 +2281,12 @@ class ConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorGoogleDocsDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleDocsDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-docs"] @@ -2438,6 +2492,12 @@ class ConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth(BaseModel class ConnectorGoogleDriveDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleDriveDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-drive"] @@ -2643,6 +2703,12 @@ class ConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorGoogleMailDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleMailDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-mail"] @@ -2848,6 +2914,12 @@ class ConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth(BaseModel class ConnectorGoogleSheetDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleSheetDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-sheet"] @@ -3053,6 +3125,12 @@ class ConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorHubspotDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorHubspotDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["hubspot"] @@ -3258,6 +3336,12 @@ class ConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorInstagramDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorInstagramDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["instagram"] @@ -3463,6 +3547,12 @@ class ConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorIntercomDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorIntercomDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["intercom"] @@ -3668,6 +3758,12 @@ class ConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorJiraDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorJiraDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["jira"] @@ -3873,6 +3969,12 @@ class ConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLeverDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLeverDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["lever"] @@ -4078,6 +4180,12 @@ class ConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLinearDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLinearDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["linear"] @@ -4283,6 +4391,12 @@ class ConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLinkedinDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLinkedinDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["linkedin"] @@ -4488,6 +4602,12 @@ class ConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorNotionDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorNotionDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["notion"] @@ -4693,6 +4813,12 @@ class ConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorOutreachDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorOutreachDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["outreach"] @@ -4901,6 +5027,12 @@ class ConnectorPipedriveDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorPipedriveDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorPipedriveDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["pipedrive"] @@ -5106,6 +5238,12 @@ class ConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorQuickbooksDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorQuickbooksDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["quickbooks"] @@ -5311,6 +5449,12 @@ class ConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorRedditDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorRedditDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["reddit"] @@ -5516,6 +5660,12 @@ class ConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorSalesloftDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSalesloftDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["salesloft"] @@ -5721,6 +5871,12 @@ class ConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorSharepointDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSharepointDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["sharepoint"] @@ -5926,6 +6082,12 @@ class ConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorSlackDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSlackDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["slack"] @@ -6131,6 +6293,12 @@ class ConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorTwitterDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorTwitterDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["twitter"] @@ -6336,6 +6504,12 @@ class ConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorXeroDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorXeroDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["xero"] @@ -6544,6 +6718,12 @@ class ConnectorZohoDeskDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorZohoDeskDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorZohoDeskDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["zoho-desk"] diff --git a/src/openint/types/get_message_template_response.py b/src/openint/types/get_message_template_response.py new file mode 100644 index 0000000..51eb5e2 --- /dev/null +++ b/src/openint/types/get_message_template_response.py @@ -0,0 +1,11 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from .._models import BaseModel + +__all__ = ["GetMessageTemplateResponse"] + + +class GetMessageTemplateResponse(BaseModel): + language: str + + template: str diff --git a/src/openint/types/list_connections_response.py b/src/openint/types/list_connections_response.py index 4bdad8a..cc976a8 100644 --- a/src/openint/types/list_connections_response.py +++ b/src/openint/types/list_connections_response.py @@ -590,6 +590,12 @@ class ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorAcmeOauth2DiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorAcmeOauth2DiscriminatedConnectionSettings(BaseModel): connector_name: Literal["acme-oauth2"] @@ -795,6 +801,12 @@ class ConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorAircallDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorAircallDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorAircallDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["aircall"] @@ -1000,6 +1012,12 @@ class ConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorConfluenceDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorConfluenceDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorConfluenceDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["confluence"] @@ -1205,6 +1223,12 @@ class ConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorDiscordDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorDiscordDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorDiscordDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["discord"] @@ -1410,6 +1434,12 @@ class ConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorFacebookDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorFacebookDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorFacebookDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["facebook"] @@ -1615,6 +1645,12 @@ class ConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorGitHubDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGitHubDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGitHubDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["github"] @@ -1823,6 +1859,12 @@ class ConnectorGongDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGongDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGongDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["gong"] @@ -2028,6 +2070,12 @@ class ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth(BaseMo class ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleCalendarDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleCalendarDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-calendar"] @@ -2233,6 +2281,12 @@ class ConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorGoogleDocsDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleDocsDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleDocsDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-docs"] @@ -2438,6 +2492,12 @@ class ConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth(BaseModel class ConnectorGoogleDriveDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleDriveDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleDriveDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-drive"] @@ -2643,6 +2703,12 @@ class ConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorGoogleMailDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleMailDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleMailDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-mail"] @@ -2848,6 +2914,12 @@ class ConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth(BaseModel class ConnectorGoogleSheetDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorGoogleSheetDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorGoogleSheetDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["google-sheet"] @@ -3053,6 +3125,12 @@ class ConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorHubspotDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorHubspotDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorHubspotDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["hubspot"] @@ -3258,6 +3336,12 @@ class ConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorInstagramDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorInstagramDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorInstagramDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["instagram"] @@ -3463,6 +3547,12 @@ class ConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorIntercomDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorIntercomDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorIntercomDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["intercom"] @@ -3668,6 +3758,12 @@ class ConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorJiraDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorJiraDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorJiraDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["jira"] @@ -3873,6 +3969,12 @@ class ConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLeverDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLeverDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLeverDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["lever"] @@ -4078,6 +4180,12 @@ class ConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLinearDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLinearDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLinearDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["linear"] @@ -4283,6 +4391,12 @@ class ConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorLinkedinDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorLinkedinDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorLinkedinDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["linkedin"] @@ -4488,6 +4602,12 @@ class ConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorNotionDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorNotionDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorNotionDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["notion"] @@ -4693,6 +4813,12 @@ class ConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorOutreachDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorOutreachDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorOutreachDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["outreach"] @@ -4901,6 +5027,12 @@ class ConnectorPipedriveDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorPipedriveDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorPipedriveDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["pipedrive"] @@ -5106,6 +5238,12 @@ class ConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorQuickbooksDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorQuickbooksDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorQuickbooksDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["quickbooks"] @@ -5311,6 +5449,12 @@ class ConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorRedditDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorRedditDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorRedditDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["reddit"] @@ -5516,6 +5660,12 @@ class ConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorSalesloftDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSalesloftDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSalesloftDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["salesloft"] @@ -5721,6 +5871,12 @@ class ConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth(BaseModel) class ConnectorSharepointDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSharepointDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSharepointDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["sharepoint"] @@ -5926,6 +6082,12 @@ class ConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorSlackDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorSlackDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorSlackDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["slack"] @@ -6131,6 +6293,12 @@ class ConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorTwitterDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorTwitterDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorTwitterDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["twitter"] @@ -6336,6 +6504,12 @@ class ConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth(BaseModel): class ConnectorXeroDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorXeroDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorXeroDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["xero"] @@ -6544,6 +6718,12 @@ class ConnectorZohoDeskDiscriminatedConnectionSettingsSettings(BaseModel): oauth: ConnectorZohoDeskDiscriminatedConnectionSettingsSettingsOAuth + access_token: Optional[str] = None + """Same as oauth.credentials.access_token, but more convenient to access. + + Optional for backward compatibility until we remove the oauth field + """ + class ConnectorZohoDeskDiscriminatedConnectionSettings(BaseModel): connector_name: Literal["zoho-desk"] diff --git a/tests/api_resources/test_client.py b/tests/api_resources/test_client.py index e36c931..be85d30 100644 --- a/tests/api_resources/test_client.py +++ b/tests/api_resources/test_client.py @@ -15,10 +15,10 @@ GetCurrentUserResponse, ListConnectorsResponse, CheckConnectionResponse, - CreateMagicLinkResponse, ListConnectionsResponse, CreateConnectionResponse, DeleteConnectionResponse, + GetMessageTemplateResponse, ListConnectionConfigsResponse, ) from openint.pagination import SyncOffsetPagination, AsyncOffsetPagination @@ -105,7 +105,8 @@ def test_method_create_connection_with_all_params(self, client: Openint) -> None "last_fetched_at": "last_fetched_at", "metadata": {"foo": "bar"}, "updated_at": "updated_at", - } + }, + "access_token": "access_token", }, }, check_connection=True, @@ -143,64 +144,6 @@ def test_streaming_response_create_connection(self, client: Openint) -> None: assert cast(Any, response.is_closed) is True - @pytest.mark.skip() - @parametrize - def test_method_create_magic_link(self, client: Openint) -> None: - client_ = client.create_magic_link( - customer_id="x", - ) - assert_matches_type(CreateMagicLinkResponse, client_, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_method_create_magic_link_with_all_params(self, client: Openint) -> None: - client_ = client.create_magic_link( - customer_id="x", - connect_options={ - "connector_names": ["acme-oauth2"], - "debug": True, - "is_embedded": True, - "return_url": "return_url", - "view": "add", - }, - validity_in_seconds=0, - ) - assert_matches_type(CreateMagicLinkResponse, client_, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_raw_response_create_magic_link(self, client: Openint) -> None: - response = client.with_raw_response.create_magic_link( - customer_id="x", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - client_ = response.parse() - assert_matches_type(CreateMagicLinkResponse, client_, path=["response"]) - - @pytest.mark.skip() - @parametrize - def test_streaming_response_create_magic_link(self, client: Openint) -> None: - with client.with_streaming_response.create_magic_link( - customer_id="x", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - client_ = response.parse() - assert_matches_type(CreateMagicLinkResponse, client_, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - def test_path_params_create_magic_link(self, client: Openint) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `customer_id` but received ''"): - client.with_raw_response.create_magic_link( - customer_id="", - ) - @pytest.mark.skip() @parametrize def test_method_create_token(self, client: Openint) -> None: @@ -382,6 +325,50 @@ def test_streaming_response_get_current_user(self, client: Openint) -> None: assert cast(Any, response.is_closed) is True + @pytest.mark.skip() + @parametrize + def test_method_get_message_template(self, client: Openint) -> None: + client_ = client.get_message_template( + customer_id="customerId", + ) + assert_matches_type(GetMessageTemplateResponse, client_, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_method_get_message_template_with_all_params(self, client: Openint) -> None: + client_ = client.get_message_template( + customer_id="customerId", + language="javascript", + use_environment_variables=True, + ) + assert_matches_type(GetMessageTemplateResponse, client_, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_raw_response_get_message_template(self, client: Openint) -> None: + response = client.with_raw_response.get_message_template( + customer_id="customerId", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + client_ = response.parse() + assert_matches_type(GetMessageTemplateResponse, client_, path=["response"]) + + @pytest.mark.skip() + @parametrize + def test_streaming_response_get_message_template(self, client: Openint) -> None: + with client.with_streaming_response.get_message_template( + customer_id="customerId", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + client_ = response.parse() + assert_matches_type(GetMessageTemplateResponse, client_, path=["response"]) + + assert cast(Any, response.is_closed) is True + @pytest.mark.skip() @parametrize def test_method_list_connection_configs(self, client: Openint) -> None: @@ -439,6 +426,7 @@ def test_method_list_connections_with_all_params(self, client: Openint) -> None: include_secrets=True, limit=0, offset=0, + refresh_policy="none", search_query="search_query", ) assert_matches_type(SyncOffsetPagination[ListConnectionsResponse], client_, path=["response"]) @@ -583,7 +571,8 @@ async def test_method_create_connection_with_all_params(self, async_client: Asyn "last_fetched_at": "last_fetched_at", "metadata": {"foo": "bar"}, "updated_at": "updated_at", - } + }, + "access_token": "access_token", }, }, check_connection=True, @@ -621,64 +610,6 @@ async def test_streaming_response_create_connection(self, async_client: AsyncOpe assert cast(Any, response.is_closed) is True - @pytest.mark.skip() - @parametrize - async def test_method_create_magic_link(self, async_client: AsyncOpenint) -> None: - client = await async_client.create_magic_link( - customer_id="x", - ) - assert_matches_type(CreateMagicLinkResponse, client, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_method_create_magic_link_with_all_params(self, async_client: AsyncOpenint) -> None: - client = await async_client.create_magic_link( - customer_id="x", - connect_options={ - "connector_names": ["acme-oauth2"], - "debug": True, - "is_embedded": True, - "return_url": "return_url", - "view": "add", - }, - validity_in_seconds=0, - ) - assert_matches_type(CreateMagicLinkResponse, client, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_raw_response_create_magic_link(self, async_client: AsyncOpenint) -> None: - response = await async_client.with_raw_response.create_magic_link( - customer_id="x", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - client = await response.parse() - assert_matches_type(CreateMagicLinkResponse, client, path=["response"]) - - @pytest.mark.skip() - @parametrize - async def test_streaming_response_create_magic_link(self, async_client: AsyncOpenint) -> None: - async with async_client.with_streaming_response.create_magic_link( - customer_id="x", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - client = await response.parse() - assert_matches_type(CreateMagicLinkResponse, client, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip() - @parametrize - async def test_path_params_create_magic_link(self, async_client: AsyncOpenint) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `customer_id` but received ''"): - await async_client.with_raw_response.create_magic_link( - customer_id="", - ) - @pytest.mark.skip() @parametrize async def test_method_create_token(self, async_client: AsyncOpenint) -> None: @@ -860,6 +791,50 @@ async def test_streaming_response_get_current_user(self, async_client: AsyncOpen assert cast(Any, response.is_closed) is True + @pytest.mark.skip() + @parametrize + async def test_method_get_message_template(self, async_client: AsyncOpenint) -> None: + client = await async_client.get_message_template( + customer_id="customerId", + ) + assert_matches_type(GetMessageTemplateResponse, client, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_method_get_message_template_with_all_params(self, async_client: AsyncOpenint) -> None: + client = await async_client.get_message_template( + customer_id="customerId", + language="javascript", + use_environment_variables=True, + ) + assert_matches_type(GetMessageTemplateResponse, client, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_raw_response_get_message_template(self, async_client: AsyncOpenint) -> None: + response = await async_client.with_raw_response.get_message_template( + customer_id="customerId", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + client = await response.parse() + assert_matches_type(GetMessageTemplateResponse, client, path=["response"]) + + @pytest.mark.skip() + @parametrize + async def test_streaming_response_get_message_template(self, async_client: AsyncOpenint) -> None: + async with async_client.with_streaming_response.get_message_template( + customer_id="customerId", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + client = await response.parse() + assert_matches_type(GetMessageTemplateResponse, client, path=["response"]) + + assert cast(Any, response.is_closed) is True + @pytest.mark.skip() @parametrize async def test_method_list_connection_configs(self, async_client: AsyncOpenint) -> None: @@ -917,6 +892,7 @@ async def test_method_list_connections_with_all_params(self, async_client: Async include_secrets=True, limit=0, offset=0, + refresh_policy="none", search_query="search_query", ) assert_matches_type(AsyncOffsetPagination[ListConnectionsResponse], client, path=["response"]) diff --git a/tests/conftest.py b/tests/conftest.py index d48c4ab..f857b7d 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -28,6 +28,8 @@ def pytest_collection_modifyitems(items: list[pytest.Function]) -> None: base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") +token = "My Token" + @pytest.fixture(scope="session") def client(request: FixtureRequest) -> Iterator[Openint]: @@ -35,7 +37,7 @@ def client(request: FixtureRequest) -> Iterator[Openint]: if not isinstance(strict, bool): raise TypeError(f"Unexpected fixture parameter type {type(strict)}, expected {bool}") - with Openint(base_url=base_url, _strict_response_validation=strict) as client: + with Openint(base_url=base_url, token=token, _strict_response_validation=strict) as client: yield client @@ -45,5 +47,5 @@ async def async_client(request: FixtureRequest) -> AsyncIterator[AsyncOpenint]: if not isinstance(strict, bool): raise TypeError(f"Unexpected fixture parameter type {type(strict)}, expected {bool}") - async with AsyncOpenint(base_url=base_url, _strict_response_validation=strict) as client: + async with AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=strict) as client: yield client diff --git a/tests/test_client.py b/tests/test_client.py index 29fa269..0e40c8c 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -35,6 +35,7 @@ from .utils import update_env base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") +token = "My Token" def _get_params(client: BaseClient[Any, Any]) -> dict[str, str]: @@ -48,7 +49,7 @@ def _low_retry_timeout(*_args: Any, **_kwargs: Any) -> float: class TestOpenint: - client = Openint(base_url=base_url, _strict_response_validation=True) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True) @pytest.mark.respx(base_url=base_url) def test_raw_response(self, respx_mock: MockRouter) -> None: @@ -74,6 +75,10 @@ def test_copy(self) -> None: copied = self.client.copy() assert id(copied) != id(self.client) + copied = self.client.copy(token="another My Token") + assert copied.token == "another My Token" + assert self.client.token == "My Token" + def test_copy_default_options(self) -> None: # options that have a default are overridden correctly copied = self.client.copy(max_retries=7) @@ -91,7 +96,9 @@ def test_copy_default_options(self) -> None: assert isinstance(self.client.timeout, httpx.Timeout) def test_copy_default_headers(self) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True, default_headers={"X-Foo": "bar"}) + client = Openint( + base_url=base_url, token=token, _strict_response_validation=True, default_headers={"X-Foo": "bar"} + ) assert client.default_headers["X-Foo"] == "bar" # does not override the already given value when not specified @@ -123,7 +130,7 @@ def test_copy_default_headers(self) -> None: client.copy(set_default_headers={}, default_headers={"X-Foo": "Bar"}) def test_copy_default_query(self) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True, default_query={"foo": "bar"}) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True, default_query={"foo": "bar"}) assert _get_params(client)["foo"] == "bar" # does not override the already given value when not specified @@ -246,7 +253,7 @@ def test_request_timeout(self) -> None: assert timeout == httpx.Timeout(100.0) def test_client_timeout_option(self) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True, timeout=httpx.Timeout(0)) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True, timeout=httpx.Timeout(0)) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -255,7 +262,7 @@ def test_client_timeout_option(self) -> None: def test_http_client_timeout_option(self) -> None: # custom timeout given to the httpx client should be used with httpx.Client(timeout=None) as http_client: - client = Openint(base_url=base_url, _strict_response_validation=True, http_client=http_client) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True, http_client=http_client) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -263,7 +270,7 @@ def test_http_client_timeout_option(self) -> None: # no timeout given to the httpx client should not use the httpx default with httpx.Client() as http_client: - client = Openint(base_url=base_url, _strict_response_validation=True, http_client=http_client) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True, http_client=http_client) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -271,7 +278,7 @@ def test_http_client_timeout_option(self) -> None: # explicitly passing the default timeout currently results in it being ignored with httpx.Client(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client: - client = Openint(base_url=base_url, _strict_response_validation=True, http_client=http_client) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True, http_client=http_client) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -280,16 +287,21 @@ def test_http_client_timeout_option(self) -> None: async def test_invalid_http_client(self) -> None: with pytest.raises(TypeError, match="Invalid `http_client` arg"): async with httpx.AsyncClient() as http_client: - Openint(base_url=base_url, _strict_response_validation=True, http_client=cast(Any, http_client)) + Openint( + base_url=base_url, token=token, _strict_response_validation=True, http_client=cast(Any, http_client) + ) def test_default_headers_option(self) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True, default_headers={"X-Foo": "bar"}) + client = Openint( + base_url=base_url, token=token, _strict_response_validation=True, default_headers={"X-Foo": "bar"} + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) assert request.headers.get("x-foo") == "bar" assert request.headers.get("x-stainless-lang") == "python" client2 = Openint( base_url=base_url, + token=token, _strict_response_validation=True, default_headers={ "X-Foo": "stainless", @@ -300,8 +312,29 @@ def test_default_headers_option(self) -> None: assert request.headers.get("x-foo") == "stainless" assert request.headers.get("x-stainless-lang") == "my-overriding-header" + def test_validate_headers(self) -> None: + client = Openint(base_url=base_url, token=token, _strict_response_validation=True) + request = client._build_request(FinalRequestOptions(method="get", url="/foo")) + assert request.headers.get("Authorization") == f"Bearer {token}" + + with update_env(**{"OPENINT_API_KEY_OR_CUSTOMER_TOKEN_OR_CUSTOMER_API_KEY": Omit()}): + client2 = Openint(base_url=base_url, token=None, _strict_response_validation=True) + + with pytest.raises( + TypeError, + match="Could not resolve authentication method. Expected the token to be set. Or for the `Authorization` headers to be explicitly omitted", + ): + client2._build_request(FinalRequestOptions(method="get", url="/foo")) + + request2 = client2._build_request( + FinalRequestOptions(method="get", url="/foo", headers={"Authorization": Omit()}) + ) + assert request2.headers.get("Authorization") is None + def test_default_query_option(self) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True, default_query={"query_param": "bar"}) + client = Openint( + base_url=base_url, token=token, _strict_response_validation=True, default_query={"query_param": "bar"} + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) url = httpx.URL(request.url) assert dict(url.params) == {"query_param": "bar"} @@ -500,7 +533,7 @@ class Model(BaseModel): assert response.foo == 2 def test_base_url_setter(self) -> None: - client = Openint(base_url="https://example.com/from_init", _strict_response_validation=True) + client = Openint(base_url="https://example.com/from_init", token=token, _strict_response_validation=True) assert client.base_url == "https://example.com/from_init/" client.base_url = "https://example.com/from_setter" # type: ignore[assignment] @@ -509,15 +542,16 @@ def test_base_url_setter(self) -> None: def test_base_url_env(self) -> None: with update_env(OPENINT_BASE_URL="http://localhost:5000/from/env"): - client = Openint(_strict_response_validation=True) + client = Openint(token=token, _strict_response_validation=True) assert client.base_url == "http://localhost:5000/from/env/" @pytest.mark.parametrize( "client", [ - Openint(base_url="http://localhost:5000/custom/path/", _strict_response_validation=True), + Openint(base_url="http://localhost:5000/custom/path/", token=token, _strict_response_validation=True), Openint( base_url="http://localhost:5000/custom/path/", + token=token, _strict_response_validation=True, http_client=httpx.Client(), ), @@ -537,9 +571,10 @@ def test_base_url_trailing_slash(self, client: Openint) -> None: @pytest.mark.parametrize( "client", [ - Openint(base_url="http://localhost:5000/custom/path/", _strict_response_validation=True), + Openint(base_url="http://localhost:5000/custom/path/", token=token, _strict_response_validation=True), Openint( base_url="http://localhost:5000/custom/path/", + token=token, _strict_response_validation=True, http_client=httpx.Client(), ), @@ -559,9 +594,10 @@ def test_base_url_no_trailing_slash(self, client: Openint) -> None: @pytest.mark.parametrize( "client", [ - Openint(base_url="http://localhost:5000/custom/path/", _strict_response_validation=True), + Openint(base_url="http://localhost:5000/custom/path/", token=token, _strict_response_validation=True), Openint( base_url="http://localhost:5000/custom/path/", + token=token, _strict_response_validation=True, http_client=httpx.Client(), ), @@ -579,7 +615,7 @@ def test_absolute_request_url(self, client: Openint) -> None: assert request.url == "https://myapi.com/foo" def test_copied_client_does_not_close_http(self) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True) assert not client.is_closed() copied = client.copy() @@ -590,7 +626,7 @@ def test_copied_client_does_not_close_http(self) -> None: assert not client.is_closed() def test_client_context_manager(self) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True) with client as c2: assert c2 is client assert not c2.is_closed() @@ -611,7 +647,7 @@ class Model(BaseModel): def test_client_max_retries_validation(self) -> None: with pytest.raises(TypeError, match=r"max_retries cannot be None"): - Openint(base_url=base_url, _strict_response_validation=True, max_retries=cast(Any, None)) + Openint(base_url=base_url, token=token, _strict_response_validation=True, max_retries=cast(Any, None)) @pytest.mark.respx(base_url=base_url) def test_received_text_for_expected_json(self, respx_mock: MockRouter) -> None: @@ -620,12 +656,12 @@ class Model(BaseModel): respx_mock.get("/foo").mock(return_value=httpx.Response(200, text="my-custom-format")) - strict_client = Openint(base_url=base_url, _strict_response_validation=True) + strict_client = Openint(base_url=base_url, token=token, _strict_response_validation=True) with pytest.raises(APIResponseValidationError): strict_client.get("/foo", cast_to=Model) - client = Openint(base_url=base_url, _strict_response_validation=False) + client = Openint(base_url=base_url, token=token, _strict_response_validation=False) response = client.get("/foo", cast_to=Model) assert isinstance(response, str) # type: ignore[unreachable] @@ -653,7 +689,7 @@ class Model(BaseModel): ) @mock.patch("time.time", mock.MagicMock(return_value=1696004797)) def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None: - client = Openint(base_url=base_url, _strict_response_validation=True) + client = Openint(base_url=base_url, token=token, _strict_response_validation=True) headers = httpx.Headers({"retry-after": retry_after}) options = FinalRequestOptions(method="get", url="/foo", max_retries=3) @@ -739,7 +775,7 @@ def retry_handler(_request: httpx.Request) -> httpx.Response: class TestAsyncOpenint: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True) + client = AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=True) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio @@ -767,6 +803,10 @@ def test_copy(self) -> None: copied = self.client.copy() assert id(copied) != id(self.client) + copied = self.client.copy(token="another My Token") + assert copied.token == "another My Token" + assert self.client.token == "My Token" + def test_copy_default_options(self) -> None: # options that have a default are overridden correctly copied = self.client.copy(max_retries=7) @@ -784,7 +824,9 @@ def test_copy_default_options(self) -> None: assert isinstance(self.client.timeout, httpx.Timeout) def test_copy_default_headers(self) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, default_headers={"X-Foo": "bar"}) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, default_headers={"X-Foo": "bar"} + ) assert client.default_headers["X-Foo"] == "bar" # does not override the already given value when not specified @@ -816,7 +858,9 @@ def test_copy_default_headers(self) -> None: client.copy(set_default_headers={}, default_headers={"X-Foo": "Bar"}) def test_copy_default_query(self) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, default_query={"foo": "bar"}) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, default_query={"foo": "bar"} + ) assert _get_params(client)["foo"] == "bar" # does not override the already given value when not specified @@ -939,7 +983,9 @@ async def test_request_timeout(self) -> None: assert timeout == httpx.Timeout(100.0) async def test_client_timeout_option(self) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, timeout=httpx.Timeout(0)) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, timeout=httpx.Timeout(0) + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -948,7 +994,9 @@ async def test_client_timeout_option(self) -> None: async def test_http_client_timeout_option(self) -> None: # custom timeout given to the httpx client should be used async with httpx.AsyncClient(timeout=None) as http_client: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, http_client=http_client) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, http_client=http_client + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -956,7 +1004,9 @@ async def test_http_client_timeout_option(self) -> None: # no timeout given to the httpx client should not use the httpx default async with httpx.AsyncClient() as http_client: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, http_client=http_client) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, http_client=http_client + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -964,7 +1014,9 @@ async def test_http_client_timeout_option(self) -> None: # explicitly passing the default timeout currently results in it being ignored async with httpx.AsyncClient(timeout=HTTPX_DEFAULT_TIMEOUT) as http_client: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, http_client=http_client) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, http_client=http_client + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) timeout = httpx.Timeout(**request.extensions["timeout"]) # type: ignore @@ -973,16 +1025,21 @@ async def test_http_client_timeout_option(self) -> None: def test_invalid_http_client(self) -> None: with pytest.raises(TypeError, match="Invalid `http_client` arg"): with httpx.Client() as http_client: - AsyncOpenint(base_url=base_url, _strict_response_validation=True, http_client=cast(Any, http_client)) + AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, http_client=cast(Any, http_client) + ) def test_default_headers_option(self) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, default_headers={"X-Foo": "bar"}) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, default_headers={"X-Foo": "bar"} + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) assert request.headers.get("x-foo") == "bar" assert request.headers.get("x-stainless-lang") == "python" client2 = AsyncOpenint( base_url=base_url, + token=token, _strict_response_validation=True, default_headers={ "X-Foo": "stainless", @@ -993,8 +1050,29 @@ def test_default_headers_option(self) -> None: assert request.headers.get("x-foo") == "stainless" assert request.headers.get("x-stainless-lang") == "my-overriding-header" + def test_validate_headers(self) -> None: + client = AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=True) + request = client._build_request(FinalRequestOptions(method="get", url="/foo")) + assert request.headers.get("Authorization") == f"Bearer {token}" + + with update_env(**{"OPENINT_API_KEY_OR_CUSTOMER_TOKEN_OR_CUSTOMER_API_KEY": Omit()}): + client2 = AsyncOpenint(base_url=base_url, token=None, _strict_response_validation=True) + + with pytest.raises( + TypeError, + match="Could not resolve authentication method. Expected the token to be set. Or for the `Authorization` headers to be explicitly omitted", + ): + client2._build_request(FinalRequestOptions(method="get", url="/foo")) + + request2 = client2._build_request( + FinalRequestOptions(method="get", url="/foo", headers={"Authorization": Omit()}) + ) + assert request2.headers.get("Authorization") is None + def test_default_query_option(self) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True, default_query={"query_param": "bar"}) + client = AsyncOpenint( + base_url=base_url, token=token, _strict_response_validation=True, default_query={"query_param": "bar"} + ) request = client._build_request(FinalRequestOptions(method="get", url="/foo")) url = httpx.URL(request.url) assert dict(url.params) == {"query_param": "bar"} @@ -1193,7 +1271,7 @@ class Model(BaseModel): assert response.foo == 2 def test_base_url_setter(self) -> None: - client = AsyncOpenint(base_url="https://example.com/from_init", _strict_response_validation=True) + client = AsyncOpenint(base_url="https://example.com/from_init", token=token, _strict_response_validation=True) assert client.base_url == "https://example.com/from_init/" client.base_url = "https://example.com/from_setter" # type: ignore[assignment] @@ -1202,15 +1280,16 @@ def test_base_url_setter(self) -> None: def test_base_url_env(self) -> None: with update_env(OPENINT_BASE_URL="http://localhost:5000/from/env"): - client = AsyncOpenint(_strict_response_validation=True) + client = AsyncOpenint(token=token, _strict_response_validation=True) assert client.base_url == "http://localhost:5000/from/env/" @pytest.mark.parametrize( "client", [ - AsyncOpenint(base_url="http://localhost:5000/custom/path/", _strict_response_validation=True), + AsyncOpenint(base_url="http://localhost:5000/custom/path/", token=token, _strict_response_validation=True), AsyncOpenint( base_url="http://localhost:5000/custom/path/", + token=token, _strict_response_validation=True, http_client=httpx.AsyncClient(), ), @@ -1230,9 +1309,10 @@ def test_base_url_trailing_slash(self, client: AsyncOpenint) -> None: @pytest.mark.parametrize( "client", [ - AsyncOpenint(base_url="http://localhost:5000/custom/path/", _strict_response_validation=True), + AsyncOpenint(base_url="http://localhost:5000/custom/path/", token=token, _strict_response_validation=True), AsyncOpenint( base_url="http://localhost:5000/custom/path/", + token=token, _strict_response_validation=True, http_client=httpx.AsyncClient(), ), @@ -1252,9 +1332,10 @@ def test_base_url_no_trailing_slash(self, client: AsyncOpenint) -> None: @pytest.mark.parametrize( "client", [ - AsyncOpenint(base_url="http://localhost:5000/custom/path/", _strict_response_validation=True), + AsyncOpenint(base_url="http://localhost:5000/custom/path/", token=token, _strict_response_validation=True), AsyncOpenint( base_url="http://localhost:5000/custom/path/", + token=token, _strict_response_validation=True, http_client=httpx.AsyncClient(), ), @@ -1272,7 +1353,7 @@ def test_absolute_request_url(self, client: AsyncOpenint) -> None: assert request.url == "https://myapi.com/foo" async def test_copied_client_does_not_close_http(self) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True) + client = AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=True) assert not client.is_closed() copied = client.copy() @@ -1284,7 +1365,7 @@ async def test_copied_client_does_not_close_http(self) -> None: assert not client.is_closed() async def test_client_context_manager(self) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True) + client = AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=True) async with client as c2: assert c2 is client assert not c2.is_closed() @@ -1306,7 +1387,7 @@ class Model(BaseModel): async def test_client_max_retries_validation(self) -> None: with pytest.raises(TypeError, match=r"max_retries cannot be None"): - AsyncOpenint(base_url=base_url, _strict_response_validation=True, max_retries=cast(Any, None)) + AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=True, max_retries=cast(Any, None)) @pytest.mark.respx(base_url=base_url) @pytest.mark.asyncio @@ -1316,12 +1397,12 @@ class Model(BaseModel): respx_mock.get("/foo").mock(return_value=httpx.Response(200, text="my-custom-format")) - strict_client = AsyncOpenint(base_url=base_url, _strict_response_validation=True) + strict_client = AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=True) with pytest.raises(APIResponseValidationError): await strict_client.get("/foo", cast_to=Model) - client = AsyncOpenint(base_url=base_url, _strict_response_validation=False) + client = AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=False) response = await client.get("/foo", cast_to=Model) assert isinstance(response, str) # type: ignore[unreachable] @@ -1350,7 +1431,7 @@ class Model(BaseModel): @mock.patch("time.time", mock.MagicMock(return_value=1696004797)) @pytest.mark.asyncio async def test_parse_retry_after_header(self, remaining_retries: int, retry_after: str, timeout: float) -> None: - client = AsyncOpenint(base_url=base_url, _strict_response_validation=True) + client = AsyncOpenint(base_url=base_url, token=token, _strict_response_validation=True) headers = httpx.Headers({"retry-after": retry_after}) options = FinalRequestOptions(method="get", url="/foo", max_retries=3)