From 88aabec4b1737ad53b20046b6a90009ae92243f3 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 00:54:35 +0000 Subject: [PATCH 1/2] feat(api): api update --- .stats.yml | 6 +- api.md | 19 +- src/increase/_client.py | 9 - src/increase/resources/__init__.py | 14 - src/increase/resources/card_details.py | 392 ------------------ src/increase/resources/cards.py | 322 +++++++++++++- src/increase/types/__init__.py | 6 +- .../card_create_details_iframe_params.py | 15 + ...ard_detail_create_details_iframe_params.py | 12 - src/increase/types/card_update_params.py | 3 - ...te_params.py => card_update_pin_params.py} | 4 +- tests/api_resources/test_card_details.py | 279 ------------- tests/api_resources/test_cards.py | 260 +++++++++++- 13 files changed, 596 insertions(+), 745 deletions(-) delete mode 100644 src/increase/resources/card_details.py create mode 100644 src/increase/types/card_create_details_iframe_params.py delete mode 100644 src/increase/types/card_detail_create_details_iframe_params.py rename src/increase/types/{card_detail_update_params.py => card_update_pin_params.py} (73%) delete mode 100644 tests/api_resources/test_card_details.py diff --git a/.stats.yml b/.stats.yml index afc57da05..5a7b82c92 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ configured_endpoints: 214 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/increase%2Fincrease-4c440e14682c4e4c886da6d05b2f5ff539a3aadc6906bb4069a5df45e0d3cae9.yml -openapi_spec_hash: e400be1da67cec4ce706eda1868dd86b -config_hash: 8dadd60eab7ab858cf06c6a8633ed9f3 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/increase%2Fincrease-e0a19c46b65842ff370613aac24ba8777d7b961bd46a20e936e878386e048852.yml +openapi_spec_hash: 0f635610cedd9a0aacc6d5b347c3cccf +config_hash: a143293c5450ae8f52acad08f3102575 diff --git a/api.md b/api.md index 9df83d18c..bdeb9a9ba 100644 --- a/api.md +++ b/api.md @@ -51,7 +51,7 @@ Methods: Types: ```python -from increase.types import Card +from increase.types import Card, CardDetails, CardIframeURL ``` Methods: @@ -60,20 +60,9 @@ Methods: - client.cards.retrieve(card_id) -> Card - client.cards.update(card_id, \*\*params) -> Card - client.cards.list(\*\*params) -> SyncPage[Card] - -# CardDetails - -Types: - -```python -from increase.types import CardDetails, CardIframeURL -``` - -Methods: - -- client.card_details.update(card_id, \*\*params) -> CardDetails -- client.card_details.create_details_iframe(card_id, \*\*params) -> CardIframeURL -- client.card_details.details(card_id) -> CardDetails +- client.cards.create_details_iframe(card_id, \*\*params) -> CardIframeURL +- client.cards.details(card_id) -> CardDetails +- client.cards.update_pin(card_id, \*\*params) -> CardDetails # CardPayments diff --git a/src/increase/_client.py b/src/increase/_client.py index 94c7372b9..acbde35b9 100644 --- a/src/increase/_client.py +++ b/src/increase/_client.py @@ -39,7 +39,6 @@ lockboxes, file_links, card_tokens, - card_details, oauth_tokens, transactions, ach_transfers, @@ -114,7 +113,6 @@ class Increase(SyncAPIClient): account_numbers: account_numbers.AccountNumbersResource account_transfers: account_transfers.AccountTransfersResource cards: cards.CardsResource - card_details: card_details.CardDetailsResource card_payments: card_payments.CardPaymentsResource card_purchase_supplements: card_purchase_supplements.CardPurchaseSupplementsResource physical_cards: physical_cards.PhysicalCardsResource @@ -261,7 +259,6 @@ def __init__( self.account_numbers = account_numbers.AccountNumbersResource(self) self.account_transfers = account_transfers.AccountTransfersResource(self) self.cards = cards.CardsResource(self) - self.card_details = card_details.CardDetailsResource(self) self.card_payments = card_payments.CardPaymentsResource(self) self.card_purchase_supplements = card_purchase_supplements.CardPurchaseSupplementsResource(self) self.physical_cards = physical_cards.PhysicalCardsResource(self) @@ -477,7 +474,6 @@ class AsyncIncrease(AsyncAPIClient): account_numbers: account_numbers.AsyncAccountNumbersResource account_transfers: account_transfers.AsyncAccountTransfersResource cards: cards.AsyncCardsResource - card_details: card_details.AsyncCardDetailsResource card_payments: card_payments.AsyncCardPaymentsResource card_purchase_supplements: card_purchase_supplements.AsyncCardPurchaseSupplementsResource physical_cards: physical_cards.AsyncPhysicalCardsResource @@ -626,7 +622,6 @@ def __init__( self.account_numbers = account_numbers.AsyncAccountNumbersResource(self) self.account_transfers = account_transfers.AsyncAccountTransfersResource(self) self.cards = cards.AsyncCardsResource(self) - self.card_details = card_details.AsyncCardDetailsResource(self) self.card_payments = card_payments.AsyncCardPaymentsResource(self) self.card_purchase_supplements = card_purchase_supplements.AsyncCardPurchaseSupplementsResource(self) self.physical_cards = physical_cards.AsyncPhysicalCardsResource(self) @@ -845,7 +840,6 @@ def __init__(self, client: Increase) -> None: self.account_numbers = account_numbers.AccountNumbersResourceWithRawResponse(client.account_numbers) self.account_transfers = account_transfers.AccountTransfersResourceWithRawResponse(client.account_transfers) self.cards = cards.CardsResourceWithRawResponse(client.cards) - self.card_details = card_details.CardDetailsResourceWithRawResponse(client.card_details) self.card_payments = card_payments.CardPaymentsResourceWithRawResponse(client.card_payments) self.card_purchase_supplements = card_purchase_supplements.CardPurchaseSupplementsResourceWithRawResponse( client.card_purchase_supplements @@ -956,7 +950,6 @@ def __init__(self, client: AsyncIncrease) -> None: client.account_transfers ) self.cards = cards.AsyncCardsResourceWithRawResponse(client.cards) - self.card_details = card_details.AsyncCardDetailsResourceWithRawResponse(client.card_details) self.card_payments = card_payments.AsyncCardPaymentsResourceWithRawResponse(client.card_payments) self.card_purchase_supplements = card_purchase_supplements.AsyncCardPurchaseSupplementsResourceWithRawResponse( client.card_purchase_supplements @@ -1081,7 +1074,6 @@ def __init__(self, client: Increase) -> None: client.account_transfers ) self.cards = cards.CardsResourceWithStreamingResponse(client.cards) - self.card_details = card_details.CardDetailsResourceWithStreamingResponse(client.card_details) self.card_payments = card_payments.CardPaymentsResourceWithStreamingResponse(client.card_payments) self.card_purchase_supplements = card_purchase_supplements.CardPurchaseSupplementsResourceWithStreamingResponse( client.card_purchase_supplements @@ -1206,7 +1198,6 @@ def __init__(self, client: AsyncIncrease) -> None: client.account_transfers ) self.cards = cards.AsyncCardsResourceWithStreamingResponse(client.cards) - self.card_details = card_details.AsyncCardDetailsResourceWithStreamingResponse(client.card_details) self.card_payments = card_payments.AsyncCardPaymentsResourceWithStreamingResponse(client.card_payments) self.card_purchase_supplements = ( card_purchase_supplements.AsyncCardPurchaseSupplementsResourceWithStreamingResponse( diff --git a/src/increase/resources/__init__.py b/src/increase/resources/__init__.py index 11ef3d99c..64fc78c87 100644 --- a/src/increase/resources/__init__.py +++ b/src/increase/resources/__init__.py @@ -105,14 +105,6 @@ SimulationsResourceWithStreamingResponse, AsyncSimulationsResourceWithStreamingResponse, ) -from .card_details import ( - CardDetailsResource, - AsyncCardDetailsResource, - CardDetailsResourceWithRawResponse, - AsyncCardDetailsResourceWithRawResponse, - CardDetailsResourceWithStreamingResponse, - AsyncCardDetailsResourceWithStreamingResponse, -) from .oauth_tokens import ( OAuthTokensResource, AsyncOAuthTokensResource, @@ -467,12 +459,6 @@ "AsyncCardsResourceWithRawResponse", "CardsResourceWithStreamingResponse", "AsyncCardsResourceWithStreamingResponse", - "CardDetailsResource", - "AsyncCardDetailsResource", - "CardDetailsResourceWithRawResponse", - "AsyncCardDetailsResourceWithRawResponse", - "CardDetailsResourceWithStreamingResponse", - "AsyncCardDetailsResourceWithStreamingResponse", "CardPaymentsResource", "AsyncCardPaymentsResource", "CardPaymentsResourceWithRawResponse", diff --git a/src/increase/resources/card_details.py b/src/increase/resources/card_details.py deleted file mode 100644 index d729ac2a9..000000000 --- a/src/increase/resources/card_details.py +++ /dev/null @@ -1,392 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -import httpx - -from ..types import card_detail_update_params, card_detail_create_details_iframe_params -from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import 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.card_details import CardDetails -from ..types.card_iframe_url import CardIframeURL - -__all__ = ["CardDetailsResource", "AsyncCardDetailsResource"] - - -class CardDetailsResource(SyncAPIResource): - @cached_property - def with_raw_response(self) -> CardDetailsResourceWithRawResponse: - """ - 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/Increase/increase-python#accessing-raw-response-data-eg-headers - """ - return CardDetailsResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> CardDetailsResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/Increase/increase-python#with_streaming_response - """ - return CardDetailsResourceWithStreamingResponse(self) - - def update( - self, - card_id: str, - *, - pin: 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, - idempotency_key: str | None = None, - ) -> CardDetails: - """ - Update a Card's PIN - - Args: - card_id: The card identifier. - - pin: The 4-digit PIN for the card, for use with ATMs. - - 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 - - idempotency_key: Specify a custom idempotency key for this request - """ - if not card_id: - raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") - return self._patch( - f"/cards/{card_id}/details", - body=maybe_transform({"pin": pin}, card_detail_update_params.CardDetailUpdateParams), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - idempotency_key=idempotency_key, - ), - cast_to=CardDetails, - ) - - def create_details_iframe( - self, - card_id: str, - *, - physical_card_id: 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, - idempotency_key: str | None = None, - ) -> CardIframeURL: - """Create an iframe URL for a Card to display the card details. - - More details about - styling and usage can be found in the - [documentation](/documentation/embedded-card-component). - - Args: - card_id: The identifier of the Card to retrieve details for. - - physical_card_id: The identifier of the Physical Card to retrieve details for. - - 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 - - idempotency_key: Specify a custom idempotency key for this request - """ - if not card_id: - raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") - return self._post( - f"/cards/{card_id}/create_details_iframe", - body=maybe_transform( - {"physical_card_id": physical_card_id}, - card_detail_create_details_iframe_params.CardDetailCreateDetailsIframeParams, - ), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - idempotency_key=idempotency_key, - ), - cast_to=CardIframeURL, - ) - - def details( - self, - card_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, - ) -> CardDetails: - """ - Sensitive details for a Card include the primary account number, expiry, card - verification code, and PIN. - - Args: - card_id: The identifier of the Card to retrieve details for. - - 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 card_id: - raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") - return self._get( - f"/cards/{card_id}/details", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=CardDetails, - ) - - -class AsyncCardDetailsResource(AsyncAPIResource): - @cached_property - def with_raw_response(self) -> AsyncCardDetailsResourceWithRawResponse: - """ - 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/Increase/increase-python#accessing-raw-response-data-eg-headers - """ - return AsyncCardDetailsResourceWithRawResponse(self) - - @cached_property - def with_streaming_response(self) -> AsyncCardDetailsResourceWithStreamingResponse: - """ - An alternative to `.with_raw_response` that doesn't eagerly read the response body. - - For more information, see https://www.github.com/Increase/increase-python#with_streaming_response - """ - return AsyncCardDetailsResourceWithStreamingResponse(self) - - async def update( - self, - card_id: str, - *, - pin: 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, - idempotency_key: str | None = None, - ) -> CardDetails: - """ - Update a Card's PIN - - Args: - card_id: The card identifier. - - pin: The 4-digit PIN for the card, for use with ATMs. - - 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 - - idempotency_key: Specify a custom idempotency key for this request - """ - if not card_id: - raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") - return await self._patch( - f"/cards/{card_id}/details", - body=await async_maybe_transform({"pin": pin}, card_detail_update_params.CardDetailUpdateParams), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - idempotency_key=idempotency_key, - ), - cast_to=CardDetails, - ) - - async def create_details_iframe( - self, - card_id: str, - *, - physical_card_id: 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, - idempotency_key: str | None = None, - ) -> CardIframeURL: - """Create an iframe URL for a Card to display the card details. - - More details about - styling and usage can be found in the - [documentation](/documentation/embedded-card-component). - - Args: - card_id: The identifier of the Card to retrieve details for. - - physical_card_id: The identifier of the Physical Card to retrieve details for. - - 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 - - idempotency_key: Specify a custom idempotency key for this request - """ - if not card_id: - raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") - return await self._post( - f"/cards/{card_id}/create_details_iframe", - body=await async_maybe_transform( - {"physical_card_id": physical_card_id}, - card_detail_create_details_iframe_params.CardDetailCreateDetailsIframeParams, - ), - options=make_request_options( - extra_headers=extra_headers, - extra_query=extra_query, - extra_body=extra_body, - timeout=timeout, - idempotency_key=idempotency_key, - ), - cast_to=CardIframeURL, - ) - - async def details( - self, - card_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, - ) -> CardDetails: - """ - Sensitive details for a Card include the primary account number, expiry, card - verification code, and PIN. - - Args: - card_id: The identifier of the Card to retrieve details for. - - 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 card_id: - raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") - return await self._get( - f"/cards/{card_id}/details", - options=make_request_options( - extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout - ), - cast_to=CardDetails, - ) - - -class CardDetailsResourceWithRawResponse: - def __init__(self, card_details: CardDetailsResource) -> None: - self._card_details = card_details - - self.update = to_raw_response_wrapper( - card_details.update, - ) - self.create_details_iframe = to_raw_response_wrapper( - card_details.create_details_iframe, - ) - self.details = to_raw_response_wrapper( - card_details.details, - ) - - -class AsyncCardDetailsResourceWithRawResponse: - def __init__(self, card_details: AsyncCardDetailsResource) -> None: - self._card_details = card_details - - self.update = async_to_raw_response_wrapper( - card_details.update, - ) - self.create_details_iframe = async_to_raw_response_wrapper( - card_details.create_details_iframe, - ) - self.details = async_to_raw_response_wrapper( - card_details.details, - ) - - -class CardDetailsResourceWithStreamingResponse: - def __init__(self, card_details: CardDetailsResource) -> None: - self._card_details = card_details - - self.update = to_streamed_response_wrapper( - card_details.update, - ) - self.create_details_iframe = to_streamed_response_wrapper( - card_details.create_details_iframe, - ) - self.details = to_streamed_response_wrapper( - card_details.details, - ) - - -class AsyncCardDetailsResourceWithStreamingResponse: - def __init__(self, card_details: AsyncCardDetailsResource) -> None: - self._card_details = card_details - - self.update = async_to_streamed_response_wrapper( - card_details.update, - ) - self.create_details_iframe = async_to_streamed_response_wrapper( - card_details.create_details_iframe, - ) - self.details = async_to_streamed_response_wrapper( - card_details.details, - ) diff --git a/src/increase/resources/cards.py b/src/increase/resources/cards.py index 93b4025bc..f5dae7300 100644 --- a/src/increase/resources/cards.py +++ b/src/increase/resources/cards.py @@ -6,7 +6,13 @@ import httpx -from ..types import card_list_params, card_create_params, card_update_params +from ..types import ( + card_list_params, + card_create_params, + card_update_params, + card_update_pin_params, + card_create_details_iframe_params, +) from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given from .._utils import maybe_transform, async_maybe_transform from .._compat import cached_property @@ -20,6 +26,8 @@ from ..pagination import SyncPage, AsyncPage from ..types.card import Card from .._base_client import AsyncPaginator, make_request_options +from ..types.card_details import CardDetails +from ..types.card_iframe_url import CardIframeURL __all__ = ["CardsResource", "AsyncCardsResource"] @@ -154,7 +162,6 @@ def update( description: str | Omit = omit, digital_wallet: card_update_params.DigitalWallet | Omit = omit, entity_id: str | Omit = omit, - pin: str | Omit = omit, status: Literal["active", "disabled", "canceled"] | 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. @@ -181,8 +188,6 @@ def update( entity_id: The Entity the card belongs to. You only need to supply this in rare situations when the card is not for the Account holder. - pin: The 4-digit PIN for the card, for use with ATMs. - status: The status to update the Card with. - `active` - The card is active. @@ -209,7 +214,6 @@ def update( "description": description, "digital_wallet": digital_wallet, "entity_id": entity_id, - "pin": pin, "status": status, }, card_update_params.CardUpdateParams, @@ -287,6 +291,140 @@ def list( model=Card, ) + def create_details_iframe( + self, + card_id: str, + *, + physical_card_id: 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, + idempotency_key: str | None = None, + ) -> CardIframeURL: + """Create an iframe URL for a Card to display the card details. + + More details about + styling and usage can be found in the + [documentation](/documentation/embedded-card-component). + + Args: + card_id: The identifier of the Card to create an iframe for. + + physical_card_id: The identifier of the Physical Card to create an iframe for. This will inform + the appearance of the card rendered in the iframe. + + 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 + + idempotency_key: Specify a custom idempotency key for this request + """ + if not card_id: + raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") + return self._post( + f"/cards/{card_id}/create_details_iframe", + body=maybe_transform( + {"physical_card_id": physical_card_id}, card_create_details_iframe_params.CardCreateDetailsIframeParams + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=CardIframeURL, + ) + + def details( + self, + card_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, + ) -> CardDetails: + """ + Sensitive details for a Card include the primary account number, expiry, card + verification code, and PIN. + + Args: + card_id: The identifier of the Card to retrieve details for. + + 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 card_id: + raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") + return self._get( + f"/cards/{card_id}/details", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=CardDetails, + ) + + def update_pin( + self, + card_id: str, + *, + pin: 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, + idempotency_key: str | None = None, + ) -> CardDetails: + """ + Update a Card's PIN + + Args: + card_id: The identifier of the Card to update the PIN for. + + pin: The 4-digit PIN for the card, for use with ATMs. + + 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 + + idempotency_key: Specify a custom idempotency key for this request + """ + if not card_id: + raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") + return self._post( + f"/cards/{card_id}/update_pin", + body=maybe_transform({"pin": pin}, card_update_pin_params.CardUpdatePinParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=CardDetails, + ) + class AsyncCardsResource(AsyncAPIResource): @cached_property @@ -418,7 +556,6 @@ async def update( description: str | Omit = omit, digital_wallet: card_update_params.DigitalWallet | Omit = omit, entity_id: str | Omit = omit, - pin: str | Omit = omit, status: Literal["active", "disabled", "canceled"] | 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. @@ -445,8 +582,6 @@ async def update( entity_id: The Entity the card belongs to. You only need to supply this in rare situations when the card is not for the Account holder. - pin: The 4-digit PIN for the card, for use with ATMs. - status: The status to update the Card with. - `active` - The card is active. @@ -473,7 +608,6 @@ async def update( "description": description, "digital_wallet": digital_wallet, "entity_id": entity_id, - "pin": pin, "status": status, }, card_update_params.CardUpdateParams, @@ -551,6 +685,140 @@ def list( model=Card, ) + async def create_details_iframe( + self, + card_id: str, + *, + physical_card_id: 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, + idempotency_key: str | None = None, + ) -> CardIframeURL: + """Create an iframe URL for a Card to display the card details. + + More details about + styling and usage can be found in the + [documentation](/documentation/embedded-card-component). + + Args: + card_id: The identifier of the Card to create an iframe for. + + physical_card_id: The identifier of the Physical Card to create an iframe for. This will inform + the appearance of the card rendered in the iframe. + + 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 + + idempotency_key: Specify a custom idempotency key for this request + """ + if not card_id: + raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") + return await self._post( + f"/cards/{card_id}/create_details_iframe", + body=await async_maybe_transform( + {"physical_card_id": physical_card_id}, card_create_details_iframe_params.CardCreateDetailsIframeParams + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=CardIframeURL, + ) + + async def details( + self, + card_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, + ) -> CardDetails: + """ + Sensitive details for a Card include the primary account number, expiry, card + verification code, and PIN. + + Args: + card_id: The identifier of the Card to retrieve details for. + + 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 card_id: + raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") + return await self._get( + f"/cards/{card_id}/details", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=CardDetails, + ) + + async def update_pin( + self, + card_id: str, + *, + pin: 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, + idempotency_key: str | None = None, + ) -> CardDetails: + """ + Update a Card's PIN + + Args: + card_id: The identifier of the Card to update the PIN for. + + pin: The 4-digit PIN for the card, for use with ATMs. + + 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 + + idempotency_key: Specify a custom idempotency key for this request + """ + if not card_id: + raise ValueError(f"Expected a non-empty value for `card_id` but received {card_id!r}") + return await self._post( + f"/cards/{card_id}/update_pin", + body=await async_maybe_transform({"pin": pin}, card_update_pin_params.CardUpdatePinParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=CardDetails, + ) + class CardsResourceWithRawResponse: def __init__(self, cards: CardsResource) -> None: @@ -568,6 +836,15 @@ def __init__(self, cards: CardsResource) -> None: self.list = to_raw_response_wrapper( cards.list, ) + self.create_details_iframe = to_raw_response_wrapper( + cards.create_details_iframe, + ) + self.details = to_raw_response_wrapper( + cards.details, + ) + self.update_pin = to_raw_response_wrapper( + cards.update_pin, + ) class AsyncCardsResourceWithRawResponse: @@ -586,6 +863,15 @@ def __init__(self, cards: AsyncCardsResource) -> None: self.list = async_to_raw_response_wrapper( cards.list, ) + self.create_details_iframe = async_to_raw_response_wrapper( + cards.create_details_iframe, + ) + self.details = async_to_raw_response_wrapper( + cards.details, + ) + self.update_pin = async_to_raw_response_wrapper( + cards.update_pin, + ) class CardsResourceWithStreamingResponse: @@ -604,6 +890,15 @@ def __init__(self, cards: CardsResource) -> None: self.list = to_streamed_response_wrapper( cards.list, ) + self.create_details_iframe = to_streamed_response_wrapper( + cards.create_details_iframe, + ) + self.details = to_streamed_response_wrapper( + cards.details, + ) + self.update_pin = to_streamed_response_wrapper( + cards.update_pin, + ) class AsyncCardsResourceWithStreamingResponse: @@ -622,3 +917,12 @@ def __init__(self, cards: AsyncCardsResource) -> None: self.list = async_to_streamed_response_wrapper( cards.list, ) + self.create_details_iframe = async_to_streamed_response_wrapper( + cards.create_details_iframe, + ) + self.details = async_to_streamed_response_wrapper( + cards.details, + ) + self.update_pin = async_to_streamed_response_wrapper( + cards.update_pin, + ) diff --git a/src/increase/types/__init__.py b/src/increase/types/__init__.py index a9c02408e..73a9288f4 100644 --- a/src/increase/types/__init__.py +++ b/src/increase/types/__init__.py @@ -73,6 +73,7 @@ from .wire_drawdown_request import WireDrawdownRequest as WireDrawdownRequest from .account_balance_params import AccountBalanceParams as AccountBalanceParams from .card_token_list_params import CardTokenListParams as CardTokenListParams +from .card_update_pin_params import CardUpdatePinParams as CardUpdatePinParams from .document_create_params import DocumentCreateParams as DocumentCreateParams from .card_token_capabilities import CardTokenCapabilities as CardTokenCapabilities from .file_link_create_params import FileLinkCreateParams as FileLinkCreateParams @@ -80,7 +81,6 @@ from .ach_transfer_list_params import ACHTransferListParams as ACHTransferListParams from .card_payment_list_params import CardPaymentListParams as CardPaymentListParams from .card_purchase_supplement import CardPurchaseSupplement as CardPurchaseSupplement -from .card_detail_update_params import CardDetailUpdateParams as CardDetailUpdateParams from .check_deposit_list_params import CheckDepositListParams as CheckDepositListParams from .oauth_token_create_params import OAuthTokenCreateParams as OAuthTokenCreateParams from .physical_card_list_params import PhysicalCardListParams as PhysicalCardListParams @@ -134,6 +134,7 @@ from .bookkeeping_account_create_params import BookkeepingAccountCreateParams as BookkeepingAccountCreateParams from .bookkeeping_account_update_params import BookkeepingAccountUpdateParams as BookkeepingAccountUpdateParams from .bookkeeping_entry_set_list_params import BookkeepingEntrySetListParams as BookkeepingEntrySetListParams +from .card_create_details_iframe_params import CardCreateDetailsIframeParams as CardCreateDetailsIframeParams from .digital_card_profile_clone_params import DigitalCardProfileCloneParams as DigitalCardProfileCloneParams from .inbound_check_deposit_list_params import InboundCheckDepositListParams as InboundCheckDepositListParams from .inbound_wire_transfer_list_params import InboundWireTransferListParams as InboundWireTransferListParams @@ -167,9 +168,6 @@ from .real_time_payments_transfer_list_params import ( RealTimePaymentsTransferListParams as RealTimePaymentsTransferListParams, ) -from .card_detail_create_details_iframe_params import ( - CardDetailCreateDetailsIframeParams as CardDetailCreateDetailsIframeParams, -) from .intrafi_account_enrollment_create_params import ( IntrafiAccountEnrollmentCreateParams as IntrafiAccountEnrollmentCreateParams, ) diff --git a/src/increase/types/card_create_details_iframe_params.py b/src/increase/types/card_create_details_iframe_params.py new file mode 100644 index 000000000..1aeb3786f --- /dev/null +++ b/src/increase/types/card_create_details_iframe_params.py @@ -0,0 +1,15 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import TypedDict + +__all__ = ["CardCreateDetailsIframeParams"] + + +class CardCreateDetailsIframeParams(TypedDict, total=False): + physical_card_id: str + """The identifier of the Physical Card to create an iframe for. + + This will inform the appearance of the card rendered in the iframe. + """ diff --git a/src/increase/types/card_detail_create_details_iframe_params.py b/src/increase/types/card_detail_create_details_iframe_params.py deleted file mode 100644 index 47efe4422..000000000 --- a/src/increase/types/card_detail_create_details_iframe_params.py +++ /dev/null @@ -1,12 +0,0 @@ -# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. - -from __future__ import annotations - -from typing_extensions import TypedDict - -__all__ = ["CardDetailCreateDetailsIframeParams"] - - -class CardDetailCreateDetailsIframeParams(TypedDict, total=False): - physical_card_id: str - """The identifier of the Physical Card to retrieve details for.""" diff --git a/src/increase/types/card_update_params.py b/src/increase/types/card_update_params.py index 800728156..85c1842d9 100644 --- a/src/increase/types/card_update_params.py +++ b/src/increase/types/card_update_params.py @@ -28,9 +28,6 @@ class CardUpdateParams(TypedDict, total=False): Account holder. """ - pin: str - """The 4-digit PIN for the card, for use with ATMs.""" - status: Literal["active", "disabled", "canceled"] """The status to update the Card with. diff --git a/src/increase/types/card_detail_update_params.py b/src/increase/types/card_update_pin_params.py similarity index 73% rename from src/increase/types/card_detail_update_params.py rename to src/increase/types/card_update_pin_params.py index dfed669fc..8c4380609 100644 --- a/src/increase/types/card_detail_update_params.py +++ b/src/increase/types/card_update_pin_params.py @@ -4,9 +4,9 @@ from typing_extensions import Required, TypedDict -__all__ = ["CardDetailUpdateParams"] +__all__ = ["CardUpdatePinParams"] -class CardDetailUpdateParams(TypedDict, total=False): +class CardUpdatePinParams(TypedDict, total=False): pin: Required[str] """The 4-digit PIN for the card, for use with ATMs.""" diff --git a/tests/api_resources/test_card_details.py b/tests/api_resources/test_card_details.py deleted file mode 100644 index 598c813b0..000000000 --- a/tests/api_resources/test_card_details.py +++ /dev/null @@ -1,279 +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 increase import Increase, AsyncIncrease -from tests.utils import assert_matches_type -from increase.types import ( - CardDetails, - CardIframeURL, -) - -base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") - - -class TestCardDetails: - parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) - - @parametrize - def test_method_update(self, client: Increase) -> None: - card_detail = client.card_details.update( - card_id="card_oubs0hwk5rn6knuecxg2", - pin="1234", - ) - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - def test_raw_response_update(self, client: Increase) -> None: - response = client.card_details.with_raw_response.update( - card_id="card_oubs0hwk5rn6knuecxg2", - pin="1234", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - card_detail = response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - def test_streaming_response_update(self, client: Increase) -> None: - with client.card_details.with_streaming_response.update( - card_id="card_oubs0hwk5rn6knuecxg2", - pin="1234", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - card_detail = response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_update(self, client: Increase) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): - client.card_details.with_raw_response.update( - card_id="", - pin="1234", - ) - - @parametrize - def test_method_create_details_iframe(self, client: Increase) -> None: - card_detail = client.card_details.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - ) - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - @parametrize - def test_method_create_details_iframe_with_all_params(self, client: Increase) -> None: - card_detail = client.card_details.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - physical_card_id="physical_card_id", - ) - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - @parametrize - def test_raw_response_create_details_iframe(self, client: Increase) -> None: - response = client.card_details.with_raw_response.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - card_detail = response.parse() - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - @parametrize - def test_streaming_response_create_details_iframe(self, client: Increase) -> None: - with client.card_details.with_streaming_response.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - card_detail = response.parse() - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_create_details_iframe(self, client: Increase) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): - client.card_details.with_raw_response.create_details_iframe( - card_id="", - ) - - @parametrize - def test_method_details(self, client: Increase) -> None: - card_detail = client.card_details.details( - "card_oubs0hwk5rn6knuecxg2", - ) - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - def test_raw_response_details(self, client: Increase) -> None: - response = client.card_details.with_raw_response.details( - "card_oubs0hwk5rn6knuecxg2", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - card_detail = response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - def test_streaming_response_details(self, client: Increase) -> None: - with client.card_details.with_streaming_response.details( - "card_oubs0hwk5rn6knuecxg2", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - card_detail = response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - def test_path_params_details(self, client: Increase) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): - client.card_details.with_raw_response.details( - "", - ) - - -class TestAsyncCardDetails: - parametrize = pytest.mark.parametrize( - "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] - ) - - @parametrize - async def test_method_update(self, async_client: AsyncIncrease) -> None: - card_detail = await async_client.card_details.update( - card_id="card_oubs0hwk5rn6knuecxg2", - pin="1234", - ) - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - async def test_raw_response_update(self, async_client: AsyncIncrease) -> None: - response = await async_client.card_details.with_raw_response.update( - card_id="card_oubs0hwk5rn6knuecxg2", - pin="1234", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - card_detail = await response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - async def test_streaming_response_update(self, async_client: AsyncIncrease) -> None: - async with async_client.card_details.with_streaming_response.update( - card_id="card_oubs0hwk5rn6knuecxg2", - pin="1234", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - card_detail = await response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_update(self, async_client: AsyncIncrease) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): - await async_client.card_details.with_raw_response.update( - card_id="", - pin="1234", - ) - - @parametrize - async def test_method_create_details_iframe(self, async_client: AsyncIncrease) -> None: - card_detail = await async_client.card_details.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - ) - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - @parametrize - async def test_method_create_details_iframe_with_all_params(self, async_client: AsyncIncrease) -> None: - card_detail = await async_client.card_details.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - physical_card_id="physical_card_id", - ) - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - @parametrize - async def test_raw_response_create_details_iframe(self, async_client: AsyncIncrease) -> None: - response = await async_client.card_details.with_raw_response.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - card_detail = await response.parse() - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - @parametrize - async def test_streaming_response_create_details_iframe(self, async_client: AsyncIncrease) -> None: - async with async_client.card_details.with_streaming_response.create_details_iframe( - card_id="card_oubs0hwk5rn6knuecxg2", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - card_detail = await response.parse() - assert_matches_type(CardIframeURL, card_detail, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_create_details_iframe(self, async_client: AsyncIncrease) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): - await async_client.card_details.with_raw_response.create_details_iframe( - card_id="", - ) - - @parametrize - async def test_method_details(self, async_client: AsyncIncrease) -> None: - card_detail = await async_client.card_details.details( - "card_oubs0hwk5rn6knuecxg2", - ) - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - async def test_raw_response_details(self, async_client: AsyncIncrease) -> None: - response = await async_client.card_details.with_raw_response.details( - "card_oubs0hwk5rn6knuecxg2", - ) - - assert response.is_closed is True - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - card_detail = await response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - @parametrize - async def test_streaming_response_details(self, async_client: AsyncIncrease) -> None: - async with async_client.card_details.with_streaming_response.details( - "card_oubs0hwk5rn6knuecxg2", - ) as response: - assert not response.is_closed - assert response.http_request.headers.get("X-Stainless-Lang") == "python" - - card_detail = await response.parse() - assert_matches_type(CardDetails, card_detail, path=["response"]) - - assert cast(Any, response.is_closed) is True - - @parametrize - async def test_path_params_details(self, async_client: AsyncIncrease) -> None: - with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): - await async_client.card_details.with_raw_response.details( - "", - ) diff --git a/tests/api_resources/test_cards.py b/tests/api_resources/test_cards.py index 61ef7dcfa..447e714b0 100644 --- a/tests/api_resources/test_cards.py +++ b/tests/api_resources/test_cards.py @@ -9,7 +9,11 @@ from increase import Increase, AsyncIncrease from tests.utils import assert_matches_type -from increase.types import Card +from increase.types import ( + Card, + CardDetails, + CardIframeURL, +) from increase._utils import parse_datetime from increase.pagination import SyncPage, AsyncPage @@ -134,7 +138,6 @@ def test_method_update_with_all_params(self, client: Increase) -> None: "phone": "x", }, entity_id="entity_id", - pin="xxxx", status="active", ) assert_matches_type(Card, card, path=["response"]) @@ -212,6 +215,132 @@ def test_streaming_response_list(self, client: Increase) -> None: assert cast(Any, response.is_closed) is True + @parametrize + def test_method_create_details_iframe(self, client: Increase) -> None: + card = client.cards.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + ) + assert_matches_type(CardIframeURL, card, path=["response"]) + + @parametrize + def test_method_create_details_iframe_with_all_params(self, client: Increase) -> None: + card = client.cards.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + physical_card_id="physical_card_id", + ) + assert_matches_type(CardIframeURL, card, path=["response"]) + + @parametrize + def test_raw_response_create_details_iframe(self, client: Increase) -> None: + response = client.cards.with_raw_response.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + card = response.parse() + assert_matches_type(CardIframeURL, card, path=["response"]) + + @parametrize + def test_streaming_response_create_details_iframe(self, client: Increase) -> None: + with client.cards.with_streaming_response.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + card = response.parse() + assert_matches_type(CardIframeURL, card, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_create_details_iframe(self, client: Increase) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): + client.cards.with_raw_response.create_details_iframe( + card_id="", + ) + + @parametrize + def test_method_details(self, client: Increase) -> None: + card = client.cards.details( + "card_oubs0hwk5rn6knuecxg2", + ) + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + def test_raw_response_details(self, client: Increase) -> None: + response = client.cards.with_raw_response.details( + "card_oubs0hwk5rn6knuecxg2", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + card = response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + def test_streaming_response_details(self, client: Increase) -> None: + with client.cards.with_streaming_response.details( + "card_oubs0hwk5rn6knuecxg2", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + card = response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_details(self, client: Increase) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): + client.cards.with_raw_response.details( + "", + ) + + @parametrize + def test_method_update_pin(self, client: Increase) -> None: + card = client.cards.update_pin( + card_id="card_oubs0hwk5rn6knuecxg2", + pin="1234", + ) + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + def test_raw_response_update_pin(self, client: Increase) -> None: + response = client.cards.with_raw_response.update_pin( + card_id="card_oubs0hwk5rn6knuecxg2", + pin="1234", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + card = response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + def test_streaming_response_update_pin(self, client: Increase) -> None: + with client.cards.with_streaming_response.update_pin( + card_id="card_oubs0hwk5rn6knuecxg2", + pin="1234", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + card = response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_update_pin(self, client: Increase) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): + client.cards.with_raw_response.update_pin( + card_id="", + pin="1234", + ) + class TestAsyncCards: parametrize = pytest.mark.parametrize( @@ -333,7 +462,6 @@ async def test_method_update_with_all_params(self, async_client: AsyncIncrease) "phone": "x", }, entity_id="entity_id", - pin="xxxx", status="active", ) assert_matches_type(Card, card, path=["response"]) @@ -410,3 +538,129 @@ async def test_streaming_response_list(self, async_client: AsyncIncrease) -> Non assert_matches_type(AsyncPage[Card], card, path=["response"]) assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_create_details_iframe(self, async_client: AsyncIncrease) -> None: + card = await async_client.cards.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + ) + assert_matches_type(CardIframeURL, card, path=["response"]) + + @parametrize + async def test_method_create_details_iframe_with_all_params(self, async_client: AsyncIncrease) -> None: + card = await async_client.cards.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + physical_card_id="physical_card_id", + ) + assert_matches_type(CardIframeURL, card, path=["response"]) + + @parametrize + async def test_raw_response_create_details_iframe(self, async_client: AsyncIncrease) -> None: + response = await async_client.cards.with_raw_response.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + card = await response.parse() + assert_matches_type(CardIframeURL, card, path=["response"]) + + @parametrize + async def test_streaming_response_create_details_iframe(self, async_client: AsyncIncrease) -> None: + async with async_client.cards.with_streaming_response.create_details_iframe( + card_id="card_oubs0hwk5rn6knuecxg2", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + card = await response.parse() + assert_matches_type(CardIframeURL, card, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_create_details_iframe(self, async_client: AsyncIncrease) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): + await async_client.cards.with_raw_response.create_details_iframe( + card_id="", + ) + + @parametrize + async def test_method_details(self, async_client: AsyncIncrease) -> None: + card = await async_client.cards.details( + "card_oubs0hwk5rn6knuecxg2", + ) + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + async def test_raw_response_details(self, async_client: AsyncIncrease) -> None: + response = await async_client.cards.with_raw_response.details( + "card_oubs0hwk5rn6knuecxg2", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + card = await response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + async def test_streaming_response_details(self, async_client: AsyncIncrease) -> None: + async with async_client.cards.with_streaming_response.details( + "card_oubs0hwk5rn6knuecxg2", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + card = await response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_details(self, async_client: AsyncIncrease) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): + await async_client.cards.with_raw_response.details( + "", + ) + + @parametrize + async def test_method_update_pin(self, async_client: AsyncIncrease) -> None: + card = await async_client.cards.update_pin( + card_id="card_oubs0hwk5rn6knuecxg2", + pin="1234", + ) + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + async def test_raw_response_update_pin(self, async_client: AsyncIncrease) -> None: + response = await async_client.cards.with_raw_response.update_pin( + card_id="card_oubs0hwk5rn6knuecxg2", + pin="1234", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + card = await response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + @parametrize + async def test_streaming_response_update_pin(self, async_client: AsyncIncrease) -> None: + async with async_client.cards.with_streaming_response.update_pin( + card_id="card_oubs0hwk5rn6knuecxg2", + pin="1234", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + card = await response.parse() + assert_matches_type(CardDetails, card, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_update_pin(self, async_client: AsyncIncrease) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `card_id` but received ''"): + await async_client.cards.with_raw_response.update_pin( + card_id="", + pin="1234", + ) From f07051eb526fc6ab2fac7579d092d28d17317e2d Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 00:54:54 +0000 Subject: [PATCH 2/2] release: 0.339.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ pyproject.toml | 2 +- src/increase/_version.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 2503a8405..705b0cb27 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.338.0" + ".": "0.339.0" } \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 100fd61d7..03e49210c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.339.0 (2025-09-24) + +Full Changelog: [v0.338.0...v0.339.0](https://github.com/Increase/increase-python/compare/v0.338.0...v0.339.0) + +### Features + +* **api:** api update ([88aabec](https://github.com/Increase/increase-python/commit/88aabec4b1737ad53b20046b6a90009ae92243f3)) + ## 0.338.0 (2025-09-24) Full Changelog: [v0.337.0...v0.338.0](https://github.com/Increase/increase-python/compare/v0.337.0...v0.338.0) diff --git a/pyproject.toml b/pyproject.toml index 5cf15d47a..8db0fb1f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "increase" -version = "0.338.0" +version = "0.339.0" description = "The official Python library for the increase API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/increase/_version.py b/src/increase/_version.py index 2e0464044..aef62a468 100644 --- a/src/increase/_version.py +++ b/src/increase/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "increase" -__version__ = "0.338.0" # x-release-please-version +__version__ = "0.339.0" # x-release-please-version