diff --git a/.release-please-manifest.json b/.release-please-manifest.json index e9657e4..8696062 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "7.20.0" + ".": "7.21.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 4417498..e2794c7 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 139 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier/courier-b03f5346718dcd7b22f15893445ea593ab87535c90c540fc5a796c6ecd54d779.yml -openapi_spec_hash: 15677d3be4ecd33eab154080b4bc437f -config_hash: dcd58abf1e56b114bdce22336ca3d570 +configured_endpoints: 134 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/courier/courier-b053468fefe6d757f86f3233ebbc52d80329ed2a6e7a6740fee01e4028a4c3b9.yml +openapi_spec_hash: 416835e693de0fe19945be90a787d3f3 +config_hash: 8d28dbeabe9d4dcc7d5b8c021a4cbbd7 diff --git a/CHANGELOG.md b/CHANGELOG.md index 60f9bda..55b22b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 7.21.0 (2026-07-23) + +Full Changelog: [v7.20.0...v7.21.0](https://github.com/trycourier/courier-python/compare/v7.20.0...v7.21.0) + +### Features + +* Remove /bulk endpoints from api-spec (C-19507) ([#171](https://github.com/trycourier/courier-python/issues/171)) ([8fdd704](https://github.com/trycourier/courier-python/commit/8fdd7045e10a5b8c83397cdca6a27466875126d2)) + ## 7.20.0 (2026-07-20) Full Changelog: [v7.19.2...v7.20.0](https://github.com/trycourier/courier-python/compare/v7.19.2...v7.20.0) diff --git a/api.md b/api.md index 77ff284..160903e 100644 --- a/api.md +++ b/api.md @@ -296,28 +296,6 @@ Methods: - client.brands.list(\*\*params) -> BrandListResponse - client.brands.delete(brand_id) -> None -# Bulk - -Types: - -```python -from courier.types import ( - InboundBulkMessage, - InboundBulkMessageUser, - BulkCreateJobResponse, - BulkListUsersResponse, - BulkRetrieveJobResponse, -) -``` - -Methods: - -- client.bulk.add_users(job_id, \*\*params) -> None -- client.bulk.create_job(\*\*params) -> BulkCreateJobResponse -- client.bulk.list_users(job_id, \*\*params) -> BulkListUsersResponse -- client.bulk.retrieve_job(job_id) -> BulkRetrieveJobResponse -- client.bulk.run_job(job_id) -> None - # Digests Types: diff --git a/pyproject.toml b/pyproject.toml index e1909c6..caddccb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "trycourier" -version = "7.20.0" +version = "7.21.0" description = "The official Python library for the Courier API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/courier/_client.py b/src/courier/_client.py index b9f0e70..8ab2207 100644 --- a/src/courier/_client.py +++ b/src/courier/_client.py @@ -37,7 +37,6 @@ if TYPE_CHECKING: from .resources import ( auth, - bulk, send, lists, users, @@ -59,7 +58,6 @@ workspace_preferences, ) from .resources.auth import AuthResource, AsyncAuthResource - from .resources.bulk import BulkResource, AsyncBulkResource from .resources.send import SendResource, AsyncSendResource from .resources.brands import BrandsResource, AsyncBrandsResource from .resources.inbound import InboundResource, AsyncInboundResource @@ -198,12 +196,6 @@ def brands(self) -> BrandsResource: return BrandsResource(self) - @cached_property - def bulk(self) -> BulkResource: - from .resources.bulk import BulkResource - - return BulkResource(self) - @cached_property def digests(self) -> DigestsResource: from .resources.digests import DigestsResource @@ -501,12 +493,6 @@ def brands(self) -> AsyncBrandsResource: return AsyncBrandsResource(self) - @cached_property - def bulk(self) -> AsyncBulkResource: - from .resources.bulk import AsyncBulkResource - - return AsyncBulkResource(self) - @cached_property def digests(self) -> AsyncDigestsResource: from .resources.digests import AsyncDigestsResource @@ -746,12 +732,6 @@ def brands(self) -> brands.BrandsResourceWithRawResponse: return BrandsResourceWithRawResponse(self._client.brands) - @cached_property - def bulk(self) -> bulk.BulkResourceWithRawResponse: - from .resources.bulk import BulkResourceWithRawResponse - - return BulkResourceWithRawResponse(self._client.bulk) - @cached_property def digests(self) -> digests.DigestsResourceWithRawResponse: from .resources.digests import DigestsResourceWithRawResponse @@ -879,12 +859,6 @@ def brands(self) -> brands.AsyncBrandsResourceWithRawResponse: return AsyncBrandsResourceWithRawResponse(self._client.brands) - @cached_property - def bulk(self) -> bulk.AsyncBulkResourceWithRawResponse: - from .resources.bulk import AsyncBulkResourceWithRawResponse - - return AsyncBulkResourceWithRawResponse(self._client.bulk) - @cached_property def digests(self) -> digests.AsyncDigestsResourceWithRawResponse: from .resources.digests import AsyncDigestsResourceWithRawResponse @@ -1012,12 +986,6 @@ def brands(self) -> brands.BrandsResourceWithStreamingResponse: return BrandsResourceWithStreamingResponse(self._client.brands) - @cached_property - def bulk(self) -> bulk.BulkResourceWithStreamingResponse: - from .resources.bulk import BulkResourceWithStreamingResponse - - return BulkResourceWithStreamingResponse(self._client.bulk) - @cached_property def digests(self) -> digests.DigestsResourceWithStreamingResponse: from .resources.digests import DigestsResourceWithStreamingResponse @@ -1145,12 +1113,6 @@ def brands(self) -> brands.AsyncBrandsResourceWithStreamingResponse: return AsyncBrandsResourceWithStreamingResponse(self._client.brands) - @cached_property - def bulk(self) -> bulk.AsyncBulkResourceWithStreamingResponse: - from .resources.bulk import AsyncBulkResourceWithStreamingResponse - - return AsyncBulkResourceWithStreamingResponse(self._client.bulk) - @cached_property def digests(self) -> digests.AsyncDigestsResourceWithStreamingResponse: from .resources.digests import AsyncDigestsResourceWithStreamingResponse diff --git a/src/courier/_version.py b/src/courier/_version.py index 1d3f57e..04464d3 100644 --- a/src/courier/_version.py +++ b/src/courier/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "courier" -__version__ = "7.20.0" # x-release-please-version +__version__ = "7.21.0" # x-release-please-version diff --git a/src/courier/resources/__init__.py b/src/courier/resources/__init__.py index 54282b8..625b8b1 100644 --- a/src/courier/resources/__init__.py +++ b/src/courier/resources/__init__.py @@ -8,14 +8,6 @@ AuthResourceWithStreamingResponse, AsyncAuthResourceWithStreamingResponse, ) -from .bulk import ( - BulkResource, - AsyncBulkResource, - BulkResourceWithRawResponse, - AsyncBulkResourceWithRawResponse, - BulkResourceWithStreamingResponse, - AsyncBulkResourceWithStreamingResponse, -) from .send import ( SendResource, AsyncSendResource, @@ -218,12 +210,6 @@ "AsyncBrandsResourceWithRawResponse", "BrandsResourceWithStreamingResponse", "AsyncBrandsResourceWithStreamingResponse", - "BulkResource", - "AsyncBulkResource", - "BulkResourceWithRawResponse", - "AsyncBulkResourceWithRawResponse", - "BulkResourceWithStreamingResponse", - "AsyncBulkResourceWithStreamingResponse", "DigestsResource", "AsyncDigestsResource", "DigestsResourceWithRawResponse", diff --git a/src/courier/resources/bulk.py b/src/courier/resources/bulk.py deleted file mode 100644 index 464a615..0000000 --- a/src/courier/resources/bulk.py +++ /dev/null @@ -1,539 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable, Optional - -import httpx - -from ..types import bulk_add_users_params, bulk_create_job_params, bulk_list_users_params -from .._types import Body, Omit, Query, Headers, NoneType, NotGiven, omit, not_given -from .._utils import path_template, maybe_transform, async_maybe_transform -from .._compat import cached_property -from .._resource import SyncAPIResource, AsyncAPIResource -from .._response import ( - to_raw_response_wrapper, - to_streamed_response_wrapper, - async_to_raw_response_wrapper, - async_to_streamed_response_wrapper, -) -from .._base_client import make_request_options -from ..types.bulk_create_job_response import BulkCreateJobResponse -from ..types.bulk_list_users_response import BulkListUsersResponse -from ..types.bulk_retrieve_job_response import BulkRetrieveJobResponse -from ..types.inbound_bulk_message_param import InboundBulkMessageParam -from ..types.inbound_bulk_message_user_param import InboundBulkMessageUserParam - -__all__ = ["BulkResource", "AsyncBulkResource"] - - -class BulkResource(SyncAPIResource): - @cached_property - def with_raw_response(self) -> BulkResourceWithRawResponse: - """ - This property can be used as a prefix for any HTTP method call to return - the raw response object instead of the parsed content. - - For more information, see https://www.github.com/trycourier/courier-python#accessing-raw-response-data-eg-headers - """ - return BulkResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> BulkResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/trycourier/courier-python#with_streaming_response - """ - return BulkResourceWithStreamingResponse(self) - - def add_users( - self, - job_id: str, - *, - users: Iterable[InboundBulkMessageUserParam], - # 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, - ) -> None: - """ - Ingest user data into a Bulk Job. - - **Important**: For email-based bulk jobs, each user must include `profile.email` - for provider routing to work correctly. The `to.email` field is not sufficient - for email provider routing. - - 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 - """ - if not job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._post( - path_template("/bulk/{job_id}", job_id=job_id), - body=maybe_transform({"users": users}, bulk_add_users_params.BulkAddUsersParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - def create_job( - self, - *, - message: InboundBulkMessageParam, - # 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, - ) -> BulkCreateJobResponse: - """ - Creates a new bulk job for sending messages to multiple recipients. - - **Required**: `message.event` (event ID or notification ID) - - **Optional (V2 format)**: `message.template` (notification ID) or - `message.content` (Elemental content) can be provided to override the - notification associated with the event. - - Args: - message: - Bulk message definition. Supports two formats: - - - V1 format: Requires `event` field (event ID or notification ID) - - V2 format: Optionally use `template` (notification ID) or `content` (Elemental - content) in addition to `event` - - 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._post( - "/bulk", - body=maybe_transform({"message": message}, bulk_create_job_params.BulkCreateJobParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=BulkCreateJobResponse, - ) - - def list_users( - self, - job_id: str, - *, - cursor: Optional[str] | Omit = omit, - # 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, - ) -> BulkListUsersResponse: - """ - Get Bulk Job Users - - Args: - cursor: A unique identifier that allows for fetching the next set of users added to the - bulk job - - 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 job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - return self._get( - path_template("/bulk/{job_id}/users", job_id=job_id), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=maybe_transform({"cursor": cursor}, bulk_list_users_params.BulkListUsersParams), - ), - cast_to=BulkListUsersResponse, - ) - - def retrieve_job( - self, - job_id: str, - *, - # 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, - ) -> BulkRetrieveJobResponse: - """ - Get a bulk job - - 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 - """ - if not job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - return self._get( - path_template("/bulk/{job_id}", job_id=job_id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=BulkRetrieveJobResponse, - ) - - def run_job( - self, - job_id: str, - *, - # 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, - ) -> None: - """ - Run a bulk job - - 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 - """ - if not job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return self._post( - path_template("/bulk/{job_id}/run", job_id=job_id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - -class AsyncBulkResource(AsyncAPIResource): - @cached_property - def with_raw_response(self) -> AsyncBulkResourceWithRawResponse: - """ - This property can be used as a prefix for any HTTP method call to return - the raw response object instead of the parsed content. - - For more information, see https://www.github.com/trycourier/courier-python#accessing-raw-response-data-eg-headers - """ - return AsyncBulkResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncBulkResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/trycourier/courier-python#with_streaming_response - """ - return AsyncBulkResourceWithStreamingResponse(self) - - async def add_users( - self, - job_id: str, - *, - users: Iterable[InboundBulkMessageUserParam], - # 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, - ) -> None: - """ - Ingest user data into a Bulk Job. - - **Important**: For email-based bulk jobs, each user must include `profile.email` - for provider routing to work correctly. The `to.email` field is not sufficient - for email provider routing. - - 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 - """ - if not job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._post( - path_template("/bulk/{job_id}", job_id=job_id), - body=await async_maybe_transform({"users": users}, bulk_add_users_params.BulkAddUsersParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - async def create_job( - self, - *, - message: InboundBulkMessageParam, - # 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, - ) -> BulkCreateJobResponse: - """ - Creates a new bulk job for sending messages to multiple recipients. - - **Required**: `message.event` (event ID or notification ID) - - **Optional (V2 format)**: `message.template` (notification ID) or - `message.content` (Elemental content) can be provided to override the - notification associated with the event. - - Args: - message: - Bulk message definition. Supports two formats: - - - V1 format: Requires `event` field (event ID or notification ID) - - V2 format: Optionally use `template` (notification ID) or `content` (Elemental - content) in addition to `event` - - 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._post( - "/bulk", - body=await async_maybe_transform({"message": message}, bulk_create_job_params.BulkCreateJobParams), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=BulkCreateJobResponse, - ) - - async def list_users( - self, - job_id: str, - *, - cursor: Optional[str] | Omit = omit, - # 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, - ) -> BulkListUsersResponse: - """ - Get Bulk Job Users - - Args: - cursor: A unique identifier that allows for fetching the next set of users added to the - bulk job - - 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 job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - return await self._get( - path_template("/bulk/{job_id}/users", job_id=job_id), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - query=await async_maybe_transform({"cursor": cursor}, bulk_list_users_params.BulkListUsersParams), - ), - cast_to=BulkListUsersResponse, - ) - - async def retrieve_job( - self, - job_id: str, - *, - # 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, - ) -> BulkRetrieveJobResponse: - """ - Get a bulk job - - 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 - """ - if not job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - return await self._get( - path_template("/bulk/{job_id}", job_id=job_id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=BulkRetrieveJobResponse, - ) - - async def run_job( - self, - job_id: str, - *, - # 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, - ) -> None: - """ - Run a bulk job - - 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 - """ - if not job_id: - raise ValueError(f"Expected a non-empty value for `job_id` but received {job_id!r}") - extra_headers = {"Accept": "*/*", **(extra_headers or {})} - return await self._post( - path_template("/bulk/{job_id}/run", job_id=job_id), - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=NoneType, - ) - - -class BulkResourceWithRawResponse: - def __init__(self, bulk: BulkResource) -> None: - self._bulk = bulk - - self.add_users = to_raw_response_wrapper( - bulk.add_users, - ) - self.create_job = to_raw_response_wrapper( - bulk.create_job, - ) - self.list_users = to_raw_response_wrapper( - bulk.list_users, - ) - self.retrieve_job = to_raw_response_wrapper( - bulk.retrieve_job, - ) - self.run_job = to_raw_response_wrapper( - bulk.run_job, - ) - - -class AsyncBulkResourceWithRawResponse: - def __init__(self, bulk: AsyncBulkResource) -> None: - self._bulk = bulk - - self.add_users = async_to_raw_response_wrapper( - bulk.add_users, - ) - self.create_job = async_to_raw_response_wrapper( - bulk.create_job, - ) - self.list_users = async_to_raw_response_wrapper( - bulk.list_users, - ) - self.retrieve_job = async_to_raw_response_wrapper( - bulk.retrieve_job, - ) - self.run_job = async_to_raw_response_wrapper( - bulk.run_job, - ) - - -class BulkResourceWithStreamingResponse: - def __init__(self, bulk: BulkResource) -> None: - self._bulk = bulk - - self.add_users = to_streamed_response_wrapper( - bulk.add_users, - ) - self.create_job = to_streamed_response_wrapper( - bulk.create_job, - ) - self.list_users = to_streamed_response_wrapper( - bulk.list_users, - ) - self.retrieve_job = to_streamed_response_wrapper( - bulk.retrieve_job, - ) - self.run_job = to_streamed_response_wrapper( - bulk.run_job, - ) - - -class AsyncBulkResourceWithStreamingResponse: - def __init__(self, bulk: AsyncBulkResource) -> None: - self._bulk = bulk - - self.add_users = async_to_streamed_response_wrapper( - bulk.add_users, - ) - self.create_job = async_to_streamed_response_wrapper( - bulk.create_job, - ) - self.list_users = async_to_streamed_response_wrapper( - bulk.list_users, - ) - self.retrieve_job = async_to_streamed_response_wrapper( - bulk.retrieve_job, - ) - self.run_job = async_to_streamed_response_wrapper( - bulk.run_job, - ) diff --git a/src/courier/types/__init__.py b/src/courier/types/__init__.py index 9c9ec09..b3c63f2 100644 --- a/src/courier/types/__init__.py +++ b/src/courier/types/__init__.py @@ -153,13 +153,11 @@ from .brand_settings_param import BrandSettingsParam as BrandSettingsParam from .brand_snippets_param import BrandSnippetsParam as BrandSnippetsParam from .brand_template_param import BrandTemplateParam as BrandTemplateParam -from .inbound_bulk_message import InboundBulkMessage as InboundBulkMessage from .journey_version_item import JourneyVersionItem as JourneyVersionItem from .provider_list_params import ProviderListParams as ProviderListParams from .tenant_list_response import TenantListResponse as TenantListResponse from .tenant_update_params import TenantUpdateParams as TenantUpdateParams from .brand_settings_in_app import BrandSettingsInApp as BrandSettingsInApp -from .bulk_add_users_params import BulkAddUsersParams as BulkAddUsersParams from .journey_ai_node_param import JourneyAINodeParam as JourneyAINodeParam from .journey_cancel_params import JourneyCancelParams as JourneyCancelParams from .journey_create_params import JourneyCreateParams as JourneyCreateParams @@ -171,8 +169,6 @@ from .audience_list_response import AudienceListResponse as AudienceListResponse from .audience_update_params import AudienceUpdateParams as AudienceUpdateParams from .automation_list_params import AutomationListParams as AutomationListParams -from .bulk_create_job_params import BulkCreateJobParams as BulkCreateJobParams -from .bulk_list_users_params import BulkListUsersParams as BulkListUsersParams from .element_with_checksums import ElementWithChecksums as ElementWithChecksums from .journey_condition_atom import JourneyConditionAtom as JourneyConditionAtom from .journey_merge_strategy import JourneyMergeStrategy as JourneyMergeStrategy @@ -197,8 +193,6 @@ from .providers_catalog_entry import ProvidersCatalogEntry as ProvidersCatalogEntry from .widget_background_param import WidgetBackgroundParam as WidgetBackgroundParam from .audience_update_response import AudienceUpdateResponse as AudienceUpdateResponse -from .bulk_create_job_response import BulkCreateJobResponse as BulkCreateJobResponse -from .bulk_list_users_response import BulkListUsersResponse as BulkListUsersResponse from .journey_conditions_field import JourneyConditionsField as JourneyConditionsField from .journey_delay_until_node import JourneyDelayUntilNode as JourneyDelayUntilNode from .journey_experiment_param import JourneyExperimentParam as JourneyExperimentParam @@ -215,14 +209,11 @@ from .audit_event_list_response import AuditEventListResponse as AuditEventListResponse from .auth_issue_token_response import AuthIssueTokenResponse as AuthIssueTokenResponse from .default_preferences_param import DefaultPreferencesParam as DefaultPreferencesParam -from .inbound_bulk_message_user import InboundBulkMessageUser as InboundBulkMessageUser from .message_retrieve_response import MessageRetrieveResponse as MessageRetrieveResponse from .profile_retrieve_response import ProfileRetrieveResponse as ProfileRetrieveResponse from .translation_update_params import TranslationUpdateParams as TranslationUpdateParams from .automation_invoke_response import AutomationInvokeResponse as AutomationInvokeResponse from .brand_settings_email_param import BrandSettingsEmailParam as BrandSettingsEmailParam -from .bulk_retrieve_job_response import BulkRetrieveJobResponse as BulkRetrieveJobResponse -from .inbound_bulk_message_param import InboundBulkMessageParam as InboundBulkMessageParam from .inbound_track_event_params import InboundTrackEventParams as InboundTrackEventParams from .journey_experiment_variant import JourneyExperimentVariant as JourneyExperimentVariant from .notification_create_params import NotificationCreateParams as NotificationCreateParams @@ -265,7 +256,6 @@ from .notification_template_response import NotificationTemplateResponse as NotificationTemplateResponse from .routing_strategy_create_params import RoutingStrategyCreateParams as RoutingStrategyCreateParams from .routing_strategy_list_response import RoutingStrategyListResponse as RoutingStrategyListResponse -from .inbound_bulk_message_user_param import InboundBulkMessageUserParam as InboundBulkMessageUserParam from .journey_api_invoke_trigger_node import JourneyAPIInvokeTriggerNode as JourneyAPIInvokeTriggerNode from .notification_put_content_params import NotificationPutContentParams as NotificationPutContentParams from .notification_put_element_params import NotificationPutElementParams as NotificationPutElementParams diff --git a/src/courier/types/bulk_add_users_params.py b/src/courier/types/bulk_add_users_params.py deleted file mode 100644 index 6c0027d..0000000 --- a/src/courier/types/bulk_add_users_params.py +++ /dev/null @@ -1,14 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Iterable -from typing_extensions import Required, TypedDict - -from .inbound_bulk_message_user_param import InboundBulkMessageUserParam - -__all__ = ["BulkAddUsersParams"] - - -class BulkAddUsersParams(TypedDict, total=False): - users: Required[Iterable[InboundBulkMessageUserParam]] diff --git a/src/courier/types/bulk_create_job_params.py b/src/courier/types/bulk_create_job_params.py deleted file mode 100644 index 9b97442..0000000 --- a/src/courier/types/bulk_create_job_params.py +++ /dev/null @@ -1,19 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing_extensions import Required, TypedDict - -from .inbound_bulk_message_param import InboundBulkMessageParam - -__all__ = ["BulkCreateJobParams"] - - -class BulkCreateJobParams(TypedDict, total=False): - message: Required[InboundBulkMessageParam] - """Bulk message definition. Supports two formats: - - - V1 format: Requires `event` field (event ID or notification ID) - - V2 format: Optionally use `template` (notification ID) or `content` (Elemental - content) in addition to `event` - """ diff --git a/src/courier/types/bulk_create_job_response.py b/src/courier/types/bulk_create_job_response.py deleted file mode 100644 index a7ba4e5..0000000 --- a/src/courier/types/bulk_create_job_response.py +++ /dev/null @@ -1,11 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from pydantic import Field as FieldInfo - -from .._models import BaseModel - -__all__ = ["BulkCreateJobResponse"] - - -class BulkCreateJobResponse(BaseModel): - job_id: str = FieldInfo(alias="jobId") diff --git a/src/courier/types/bulk_list_users_params.py b/src/courier/types/bulk_list_users_params.py deleted file mode 100644 index 3889e62..0000000 --- a/src/courier/types/bulk_list_users_params.py +++ /dev/null @@ -1,16 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Optional -from typing_extensions import TypedDict - -__all__ = ["BulkListUsersParams"] - - -class BulkListUsersParams(TypedDict, total=False): - cursor: Optional[str] - """ - A unique identifier that allows for fetching the next set of users added to the - bulk job - """ diff --git a/src/courier/types/bulk_list_users_response.py b/src/courier/types/bulk_list_users_response.py deleted file mode 100644 index b49aa18..0000000 --- a/src/courier/types/bulk_list_users_response.py +++ /dev/null @@ -1,24 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import List, Optional -from typing_extensions import Literal - -from pydantic import Field as FieldInfo - -from .._models import BaseModel -from .shared.paging import Paging -from .inbound_bulk_message_user import InboundBulkMessageUser - -__all__ = ["BulkListUsersResponse", "Item"] - - -class Item(InboundBulkMessageUser): - status: Literal["PENDING", "ENQUEUED", "ERROR"] - - message_id: Optional[str] = FieldInfo(alias="messageId", default=None) - - -class BulkListUsersResponse(BaseModel): - items: List[Item] - - paging: Paging diff --git a/src/courier/types/bulk_retrieve_job_response.py b/src/courier/types/bulk_retrieve_job_response.py deleted file mode 100644 index 6456278..0000000 --- a/src/courier/types/bulk_retrieve_job_response.py +++ /dev/null @@ -1,30 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing_extensions import Literal - -from .._models import BaseModel -from .inbound_bulk_message import InboundBulkMessage - -__all__ = ["BulkRetrieveJobResponse", "Job"] - - -class Job(BaseModel): - definition: InboundBulkMessage - """Bulk message definition. Supports two formats: - - - V1 format: Requires `event` field (event ID or notification ID) - - V2 format: Optionally use `template` (notification ID) or `content` (Elemental - content) in addition to `event` - """ - - enqueued: int - - failures: int - - received: int - - status: Literal["CREATED", "PROCESSING", "COMPLETED", "ERROR"] - - -class BulkRetrieveJobResponse(BaseModel): - job: Job diff --git a/src/courier/types/inbound_bulk_message.py b/src/courier/types/inbound_bulk_message.py deleted file mode 100644 index 86428eb..0000000 --- a/src/courier/types/inbound_bulk_message.py +++ /dev/null @@ -1,50 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import Dict, Union, Optional -from typing_extensions import TypeAlias - -from .._models import BaseModel -from .shared.elemental_content import ElementalContent -from .shared.elemental_content_sugar import ElementalContentSugar - -__all__ = ["InboundBulkMessage", "Content"] - -Content: TypeAlias = Union[ElementalContentSugar, ElementalContent, None] - - -class InboundBulkMessage(BaseModel): - """Bulk message definition. - - Supports two formats: - - V1 format: Requires `event` field (event ID or notification ID) - - V2 format: Optionally use `template` (notification ID) or `content` (Elemental content) in addition to `event` - """ - - event: str - """Event ID or Notification ID (required). - - Can be either a Notification ID (e.g., "FRH3QXM9E34W4RKP7MRC8NZ1T8V8") or a - custom Event ID (e.g., "welcome-email") mapped to a notification. - """ - - brand: Optional[str] = None - - content: Optional[Content] = None - """Elemental content (optional, for V2 format). - - When provided, this will be used instead of the notification associated with the - `event` field. - """ - - data: Optional[Dict[str, object]] = None - - locale: Optional[Dict[str, Dict[str, object]]] = None - - override: Optional[Dict[str, object]] = None - - template: Optional[str] = None - """Notification ID or template ID (optional, for V2 format). - - When provided, this will be used instead of the notification associated with the - `event` field. - """ diff --git a/src/courier/types/inbound_bulk_message_param.py b/src/courier/types/inbound_bulk_message_param.py deleted file mode 100644 index 909acb5..0000000 --- a/src/courier/types/inbound_bulk_message_param.py +++ /dev/null @@ -1,51 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Dict, Union, Optional -from typing_extensions import Required, TypeAlias, TypedDict - -from .shared_params.elemental_content import ElementalContent -from .shared_params.elemental_content_sugar import ElementalContentSugar - -__all__ = ["InboundBulkMessageParam", "Content"] - -Content: TypeAlias = Union[ElementalContentSugar, ElementalContent] - - -class InboundBulkMessageParam(TypedDict, total=False): - """Bulk message definition. - - Supports two formats: - - V1 format: Requires `event` field (event ID or notification ID) - - V2 format: Optionally use `template` (notification ID) or `content` (Elemental content) in addition to `event` - """ - - event: Required[str] - """Event ID or Notification ID (required). - - Can be either a Notification ID (e.g., "FRH3QXM9E34W4RKP7MRC8NZ1T8V8") or a - custom Event ID (e.g., "welcome-email") mapped to a notification. - """ - - brand: Optional[str] - - content: Optional[Content] - """Elemental content (optional, for V2 format). - - When provided, this will be used instead of the notification associated with the - `event` field. - """ - - data: Optional[Dict[str, object]] - - locale: Optional[Dict[str, Dict[str, object]]] - - override: Optional[Dict[str, object]] - - template: Optional[str] - """Notification ID or template ID (optional, for V2 format). - - When provided, this will be used instead of the notification associated with the - `event` field. - """ diff --git a/src/courier/types/inbound_bulk_message_user.py b/src/courier/types/inbound_bulk_message_user.py deleted file mode 100644 index 54374fe..0000000 --- a/src/courier/types/inbound_bulk_message_user.py +++ /dev/null @@ -1,34 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from typing import Dict, Optional - -from .._models import BaseModel -from .shared.user_recipient import UserRecipient -from .shared.recipient_preferences import RecipientPreferences - -__all__ = ["InboundBulkMessageUser"] - - -class InboundBulkMessageUser(BaseModel): - data: Optional[object] = None - """User-specific data that will be merged with message.data""" - - preferences: Optional[RecipientPreferences] = None - - profile: Optional[Dict[str, object]] = None - """User profile information. - - For email-based bulk jobs, `profile.email` is required for provider routing to - determine if the message can be delivered. The email address should be provided - here rather than in `to.email`. - """ - - recipient: Optional[str] = None - """User ID (legacy field, use profile or to.user_id instead)""" - - to: Optional[UserRecipient] = None - """Optional recipient information. - - Note: For email provider routing, use `profile.email` instead of `to.email`. The - `to` field is primarily used for recipient identification and data merging. - """ diff --git a/src/courier/types/inbound_bulk_message_user_param.py b/src/courier/types/inbound_bulk_message_user_param.py deleted file mode 100644 index 18c8acf..0000000 --- a/src/courier/types/inbound_bulk_message_user_param.py +++ /dev/null @@ -1,36 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing import Dict, Optional -from typing_extensions import TypedDict - -from .shared_params.user_recipient import UserRecipient -from .shared_params.recipient_preferences import RecipientPreferences - -__all__ = ["InboundBulkMessageUserParam"] - - -class InboundBulkMessageUserParam(TypedDict, total=False): - data: object - """User-specific data that will be merged with message.data""" - - preferences: Optional[RecipientPreferences] - - profile: Optional[Dict[str, object]] - """User profile information. - - For email-based bulk jobs, `profile.email` is required for provider routing to - determine if the message can be delivered. The email address should be provided - here rather than in `to.email`. - """ - - recipient: Optional[str] - """User ID (legacy field, use profile or to.user_id instead)""" - - to: Optional[UserRecipient] - """Optional recipient information. - - Note: For email provider routing, use `profile.email` instead of `to.email`. The - `to` field is primarily used for recipient identification and data merging. - """ diff --git a/tests/api_resources/test_bulk.py b/tests/api_resources/test_bulk.py deleted file mode 100644 index 177cddb..0000000 --- a/tests/api_resources/test_bulk.py +++ /dev/null @@ -1,496 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import os -from typing import Any, cast - -import pytest - -from courier import Courier, AsyncCourier -from tests.utils import assert_matches_type -from courier.types import ( - BulkCreateJobResponse, - BulkListUsersResponse, - BulkRetrieveJobResponse, -) - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestBulk: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_method_add_users(self, client: Courier) -> None: - bulk = client.bulk.add_users( - job_id="job_id", - users=[{}], - ) - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_raw_response_add_users(self, client: Courier) -> None: - response = client.bulk.with_raw_response.add_users( - job_id="job_id", - users=[{}], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = response.parse() - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_streaming_response_add_users(self, client: Courier) -> None: - with client.bulk.with_streaming_response.add_users( - job_id="job_id", - users=[{}], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = response.parse() - assert bulk is None - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_path_params_add_users(self, client: Courier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - client.bulk.with_raw_response.add_users( - job_id="", - users=[{}], - ) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_method_create_job(self, client: Courier) -> None: - bulk = client.bulk.create_job( - message={"event": "event"}, - ) - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_method_create_job_with_all_params(self, client: Courier) -> None: - bulk = client.bulk.create_job( - message={ - "event": "event", - "brand": "brand", - "content": { - "body": "body", - "title": "title", - }, - "data": {"foo": "bar"}, - "locale": {"foo": {"foo": "bar"}}, - "override": {"foo": "bar"}, - "template": "template", - }, - ) - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_raw_response_create_job(self, client: Courier) -> None: - response = client.bulk.with_raw_response.create_job( - message={"event": "event"}, - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = response.parse() - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_streaming_response_create_job(self, client: Courier) -> None: - with client.bulk.with_streaming_response.create_job( - message={"event": "event"}, - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = response.parse() - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_method_list_users(self, client: Courier) -> None: - bulk = client.bulk.list_users( - job_id="job_id", - ) - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_method_list_users_with_all_params(self, client: Courier) -> None: - bulk = client.bulk.list_users( - job_id="job_id", - cursor="cursor", - ) - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_raw_response_list_users(self, client: Courier) -> None: - response = client.bulk.with_raw_response.list_users( - job_id="job_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = response.parse() - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_streaming_response_list_users(self, client: Courier) -> None: - with client.bulk.with_streaming_response.list_users( - job_id="job_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = response.parse() - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_path_params_list_users(self, client: Courier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - client.bulk.with_raw_response.list_users( - job_id="", - ) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_method_retrieve_job(self, client: Courier) -> None: - bulk = client.bulk.retrieve_job( - "job_id", - ) - assert_matches_type(BulkRetrieveJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_raw_response_retrieve_job(self, client: Courier) -> None: - response = client.bulk.with_raw_response.retrieve_job( - "job_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = response.parse() - assert_matches_type(BulkRetrieveJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_streaming_response_retrieve_job(self, client: Courier) -> None: - with client.bulk.with_streaming_response.retrieve_job( - "job_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = response.parse() - assert_matches_type(BulkRetrieveJobResponse, bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_path_params_retrieve_job(self, client: Courier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - client.bulk.with_raw_response.retrieve_job( - "", - ) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_method_run_job(self, client: Courier) -> None: - bulk = client.bulk.run_job( - "job_id", - ) - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_raw_response_run_job(self, client: Courier) -> None: - response = client.bulk.with_raw_response.run_job( - "job_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = response.parse() - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_streaming_response_run_job(self, client: Courier) -> None: - with client.bulk.with_streaming_response.run_job( - "job_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = response.parse() - assert bulk is None - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - def test_path_params_run_job(self, client: Courier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - client.bulk.with_raw_response.run_job( - "", - ) - - -class TestAsyncBulk: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_method_add_users(self, async_client: AsyncCourier) -> None: - bulk = await async_client.bulk.add_users( - job_id="job_id", - users=[{}], - ) - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_raw_response_add_users(self, async_client: AsyncCourier) -> None: - response = await async_client.bulk.with_raw_response.add_users( - job_id="job_id", - users=[{}], - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = await response.parse() - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_streaming_response_add_users(self, async_client: AsyncCourier) -> None: - async with async_client.bulk.with_streaming_response.add_users( - job_id="job_id", - users=[{}], - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = await response.parse() - assert bulk is None - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_path_params_add_users(self, async_client: AsyncCourier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - await async_client.bulk.with_raw_response.add_users( - job_id="", - users=[{}], - ) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_method_create_job(self, async_client: AsyncCourier) -> None: - bulk = await async_client.bulk.create_job( - message={"event": "event"}, - ) - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_method_create_job_with_all_params(self, async_client: AsyncCourier) -> None: - bulk = await async_client.bulk.create_job( - message={ - "event": "event", - "brand": "brand", - "content": { - "body": "body", - "title": "title", - }, - "data": {"foo": "bar"}, - "locale": {"foo": {"foo": "bar"}}, - "override": {"foo": "bar"}, - "template": "template", - }, - ) - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_raw_response_create_job(self, async_client: AsyncCourier) -> None: - response = await async_client.bulk.with_raw_response.create_job( - message={"event": "event"}, - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = await response.parse() - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_streaming_response_create_job(self, async_client: AsyncCourier) -> None: - async with async_client.bulk.with_streaming_response.create_job( - message={"event": "event"}, - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = await response.parse() - assert_matches_type(BulkCreateJobResponse, bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_method_list_users(self, async_client: AsyncCourier) -> None: - bulk = await async_client.bulk.list_users( - job_id="job_id", - ) - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_method_list_users_with_all_params(self, async_client: AsyncCourier) -> None: - bulk = await async_client.bulk.list_users( - job_id="job_id", - cursor="cursor", - ) - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_raw_response_list_users(self, async_client: AsyncCourier) -> None: - response = await async_client.bulk.with_raw_response.list_users( - job_id="job_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = await response.parse() - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_streaming_response_list_users(self, async_client: AsyncCourier) -> None: - async with async_client.bulk.with_streaming_response.list_users( - job_id="job_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = await response.parse() - assert_matches_type(BulkListUsersResponse, bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_path_params_list_users(self, async_client: AsyncCourier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - await async_client.bulk.with_raw_response.list_users( - job_id="", - ) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_method_retrieve_job(self, async_client: AsyncCourier) -> None: - bulk = await async_client.bulk.retrieve_job( - "job_id", - ) - assert_matches_type(BulkRetrieveJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_raw_response_retrieve_job(self, async_client: AsyncCourier) -> None: - response = await async_client.bulk.with_raw_response.retrieve_job( - "job_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = await response.parse() - assert_matches_type(BulkRetrieveJobResponse, bulk, path=["response"]) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_streaming_response_retrieve_job(self, async_client: AsyncCourier) -> None: - async with async_client.bulk.with_streaming_response.retrieve_job( - "job_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = await response.parse() - assert_matches_type(BulkRetrieveJobResponse, bulk, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_path_params_retrieve_job(self, async_client: AsyncCourier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - await async_client.bulk.with_raw_response.retrieve_job( - "", - ) - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_method_run_job(self, async_client: AsyncCourier) -> None: - bulk = await async_client.bulk.run_job( - "job_id", - ) - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_raw_response_run_job(self, async_client: AsyncCourier) -> None: - response = await async_client.bulk.with_raw_response.run_job( - "job_id", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - bulk = await response.parse() - assert bulk is None - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_streaming_response_run_job(self, async_client: AsyncCourier) -> None: - async with async_client.bulk.with_streaming_response.run_job( - "job_id", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - bulk = await response.parse() - assert bulk is None - - assert cast(Any, response.is_closed) is True - - @pytest.mark.skip(reason="Mock server tests are disabled") - @parametrize - async def test_path_params_run_job(self, async_client: AsyncCourier) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `job_id` but received ''"): - await async_client.bulk.with_raw_response.run_job( - "", - )