From b5af4c3102c40db19cac6fbac2968b2d453e2764 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 19 May 2025 22:05:22 +0000
Subject: [PATCH 1/4] feat(docs): updating documented docs for stainless
---
.stats.yml | 6 +-
README.md | 2 +-
api.md | 2 -
src/openint/_client.py | 126 ++----------
src/openint/types/__init__.py | 2 -
.../types/client_create_connection_params.py | 180 ++++++++++++++++++
.../types/client_create_magic_link_params.py | 106 -----------
.../types/client_create_token_params.py | 5 +
.../types/client_list_connections_params.py | 6 +
.../types/create_connection_response.py | 180 ++++++++++++++++++
.../types/create_magic_link_response.py | 10 -
src/openint/types/create_token_response.py | 21 +-
src/openint/types/get_connection_response.py | 180 ++++++++++++++++++
.../types/list_connections_response.py | 180 ++++++++++++++++++
tests/api_resources/test_client.py | 125 +-----------
15 files changed, 779 insertions(+), 352 deletions(-)
delete mode 100644 src/openint/types/client_create_magic_link_params.py
delete mode 100644 src/openint/types/create_magic_link_response.py
diff --git a/.stats.yml b/.stats.yml
index d75fd4d..e290fc5 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
+configured_endpoints: 9
+openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openint%2Fopenint-bacbc8c9cbe5ff0643c5413e7f1ef80fe15094393e788142b84075998fc7ad85.yml
+openapi_spec_hash: 044dac4816a3a8fed6a303cf2eb65ed4
config_hash: 9e645fd6bff74d3299e2924f99ec4034
diff --git a/README.md b/README.md
index c9c93d5..9f17fd1 100644
--- a/README.md
+++ b/README.md
@@ -76,7 +76,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..f69cc4a 100644
--- a/api.md
+++ b/api.md
@@ -6,7 +6,6 @@ Types:
from openint.types import (
CheckConnectionResponse,
CreateConnectionResponse,
- CreateMagicLinkResponse,
CreateTokenResponse,
DeleteConnectionResponse,
GetConnectionResponse,
@@ -21,7 +20,6 @@ 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
diff --git a/src/openint/_client.py b/src/openint/_client.py
index aa7af8c..2ee1430 100644
--- a/src/openint/_client.py
+++ b/src/openint/_client.py
@@ -16,7 +16,6 @@
client_list_connectors_params,
client_list_connections_params,
client_create_connection_params,
- client_create_magic_link_params,
client_list_connection_configs_params,
)
from ._types import (
@@ -61,7 +60,6 @@
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.list_connection_configs_response import ListConnectionConfigsResponse
@@ -303,53 +301,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 +322,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
@@ -694,6 +649,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 +676,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 +704,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 +1031,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 +1052,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
@@ -1462,6 +1379,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 +1406,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 +1434,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 +1534,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,
)
@@ -1646,9 +1565,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,
)
@@ -1680,9 +1596,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,
)
@@ -1714,9 +1627,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,
)
diff --git a/src/openint/types/__init__.py b/src/openint/types/__init__.py
index 9fef387..7a73fd6 100644
--- a/src/openint/types/__init__.py
+++ b/src/openint/types/__init__.py
@@ -10,13 +10,11 @@
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 .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_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_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/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..b87ef8d 100644
--- a/tests/api_resources/test_client.py
+++ b/tests/api_resources/test_client.py
@@ -15,7 +15,6 @@
GetCurrentUserResponse,
ListConnectorsResponse,
CheckConnectionResponse,
- CreateMagicLinkResponse,
ListConnectionsResponse,
CreateConnectionResponse,
DeleteConnectionResponse,
@@ -105,7 +104,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 +143,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:
@@ -439,6 +381,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 +526,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 +565,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:
@@ -917,6 +803,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"])
From db2b3f4d82a2a498b4b67eadc5191a3e1ff28220 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 19 May 2025 22:08:03 +0000
Subject: [PATCH 2/4] feat(api): scheme sync
---
.stats.yml | 2 +-
README.md | 14 +++-
tests/conftest.py | 6 +-
tests/test_client.py | 165 ++++++++++++++++++++++++++++++++-----------
4 files changed, 140 insertions(+), 47 deletions(-)
diff --git a/.stats.yml b/.stats.yml
index e290fc5..8fa1bc2 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
configured_endpoints: 9
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openint%2Fopenint-bacbc8c9cbe5ff0643c5413e7f1ef80fe15094393e788142b84075998fc7ad85.yml
openapi_spec_hash: 044dac4816a3a8fed6a303cf2eb65ed4
-config_hash: 9e645fd6bff74d3299e2924f99ec4034
+config_hash: 91394b148b1f41b69b5a7934121ab013
diff --git a/README.md b/README.md
index 9f17fd1..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:
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)
From 85b729443bfe6aed5b5e1335a058ea721a425ec8 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 19 May 2025 22:10:51 +0000
Subject: [PATCH 3/4] feat(api): adding message template
---
.stats.yml | 4 +-
api.md | 2 +
src/openint/_client.py | 102 ++++++++++++++++++
src/openint/types/__init__.py | 2 +
.../client_get_message_template_params.py | 17 +++
.../types/get_message_template_response.py | 11 ++
tests/api_resources/test_client.py | 89 +++++++++++++++
7 files changed, 225 insertions(+), 2 deletions(-)
create mode 100644 src/openint/types/client_get_message_template_params.py
create mode 100644 src/openint/types/get_message_template_response.py
diff --git a/.stats.yml b/.stats.yml
index 8fa1bc2..f71ce24 100644
--- a/.stats.yml
+++ b/.stats.yml
@@ -1,4 +1,4 @@
-configured_endpoints: 9
+configured_endpoints: 10
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/openint%2Fopenint-bacbc8c9cbe5ff0643c5413e7f1ef80fe15094393e788142b84075998fc7ad85.yml
openapi_spec_hash: 044dac4816a3a8fed6a303cf2eb65ed4
-config_hash: 91394b148b1f41b69b5a7934121ab013
+config_hash: be212d1ce37acf5836869f40d1654c82
diff --git a/api.md b/api.md
index f69cc4a..a8f1cb1 100644
--- a/api.md
+++ b/api.md
@@ -10,6 +10,7 @@ from openint.types import (
DeleteConnectionResponse,
GetConnectionResponse,
GetCurrentUserResponse,
+ GetMessageTemplateResponse,
ListConnectionConfigsResponse,
ListConnectionsResponse,
ListConnectorsResponse,
@@ -24,6 +25,7 @@ Methods:
- 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/src/openint/_client.py b/src/openint/_client.py
index 2ee1430..3c4d305 100644
--- a/src/openint/_client.py
+++ b/src/openint/_client.py
@@ -16,6 +16,7 @@
client_list_connectors_params,
client_list_connections_params,
client_create_connection_params,
+ client_get_message_template_params,
client_list_connection_configs_params,
)
from ._types import (
@@ -61,6 +62,7 @@
from .types.list_connections_response import ListConnectionsResponse
from .types.create_connection_response import CreateConnectionResponse
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"]
@@ -462,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,
*,
@@ -1192,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,
*,
@@ -1546,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,
)
@@ -1577,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,
)
@@ -1608,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,
)
@@ -1639,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/types/__init__.py b/src/openint/types/__init__.py
index 7a73fd6..9a729bf 100644
--- a/src/openint/types/__init__.py
+++ b/src/openint/types/__init__.py
@@ -13,9 +13,11 @@
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 .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_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/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/tests/api_resources/test_client.py b/tests/api_resources/test_client.py
index b87ef8d..be85d30 100644
--- a/tests/api_resources/test_client.py
+++ b/tests/api_resources/test_client.py
@@ -18,6 +18,7 @@
ListConnectionsResponse,
CreateConnectionResponse,
DeleteConnectionResponse,
+ GetMessageTemplateResponse,
ListConnectionConfigsResponse,
)
from openint.pagination import SyncOffsetPagination, AsyncOffsetPagination
@@ -324,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:
@@ -746,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:
From 8b4788dda0a0036a80cac7df9c17aeddb28b8947 Mon Sep 17 00:00:00 2001
From: "stainless-app[bot]"
<142633134+stainless-app[bot]@users.noreply.github.com>
Date: Mon, 19 May 2025 22:11:06 +0000
Subject: [PATCH 4/4] release: 2.1.0
---
.release-please-manifest.json | 2 +-
CHANGELOG.md | 10 ++++++++++
pyproject.toml | 2 +-
src/openint/_version.py | 2 +-
4 files changed, 13 insertions(+), 3 deletions(-)
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/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/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/_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