diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 98af54b2..32ac2e3a 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.430.0" + ".": "0.431.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 61c2836e..ec36c3af 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 236 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/increase%2Fincrease-010fcebf036b735c59221760be7726699913ed68102323b49939ddd880a12e32.yml -openapi_spec_hash: 92d7bc1bf2f3034735206e358249ba5c -config_hash: dda988c5565c2f15cc708122984d7691 +configured_endpoints: 237 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/increase%2Fincrease-defae23482710e9c09a4a09f19b5de303c58f4b3ffd937c6dfafacb4124f4378.yml +openapi_spec_hash: f1404bbd3ac5cbd9cfb952f3c65bb406 +config_hash: 896b006f9647a513eda3b228cf17c199 diff --git a/CHANGELOG.md b/CHANGELOG.md index d752b80f..17e00596 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.431.0 (2026-03-11) + +Full Changelog: [v0.430.0...v0.431.0](https://github.com/Increase/increase-python/compare/v0.430.0...v0.431.0) + +### Features + +* **api:** api update ([4afe591](https://github.com/Increase/increase-python/commit/4afe5916d301d55c896451c0354b1135026df588)) + ## 0.430.0 (2026-03-11) Full Changelog: [v0.429.0...v0.430.0](https://github.com/Increase/increase-python/compare/v0.429.0...v0.430.0) diff --git a/api.md b/api.md index 19a49271..6a8ad2a2 100644 --- a/api.md +++ b/api.md @@ -516,6 +516,7 @@ from increase.types import EntityBeneficialOwner Methods: - client.beneficial_owners.retrieve(entity_beneficial_owner_id) -> EntityBeneficialOwner +- client.beneficial_owners.update(entity_beneficial_owner_id, \*\*params) -> EntityBeneficialOwner - client.beneficial_owners.list(\*\*params) -> SyncPage[EntityBeneficialOwner] # SupplementalDocuments diff --git a/pyproject.toml b/pyproject.toml index d57e2fa9..55f91093 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "increase" -version = "0.430.0" +version = "0.431.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 f8545a5e..5159786e 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.430.0" # x-release-please-version +__version__ = "0.431.0" # x-release-please-version diff --git a/src/increase/resources/beneficial_owners.py b/src/increase/resources/beneficial_owners.py index 37f6eb07..8bed8ef8 100644 --- a/src/increase/resources/beneficial_owners.py +++ b/src/increase/resources/beneficial_owners.py @@ -4,9 +4,9 @@ import httpx -from ..types import beneficial_owner_list_params +from ..types import beneficial_owner_list_params, beneficial_owner_update_params from .._types import Body, Omit, Query, Headers, NotGiven, omit, not_given -from .._utils import maybe_transform +from .._utils import maybe_transform, async_maybe_transform from .._compat import cached_property from .._resource import SyncAPIResource, AsyncAPIResource from .._response import ( @@ -79,6 +79,55 @@ def retrieve( cast_to=EntityBeneficialOwner, ) + def update( + self, + entity_beneficial_owner_id: str, + *, + address: beneficial_owner_update_params.Address | 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, + ) -> EntityBeneficialOwner: + """ + Update a Beneficial Owner + + Args: + entity_beneficial_owner_id: The identifier of the Beneficial Owner to update. + + address: The individual's physical address. Mail receiving locations like PO Boxes and + PMB's are disallowed. + + 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 entity_beneficial_owner_id: + raise ValueError( + f"Expected a non-empty value for `entity_beneficial_owner_id` but received {entity_beneficial_owner_id!r}" + ) + return self._patch( + f"/entity_beneficial_owners/{entity_beneficial_owner_id}", + body=maybe_transform({"address": address}, beneficial_owner_update_params.BeneficialOwnerUpdateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=EntityBeneficialOwner, + ) + def list( self, *, @@ -197,6 +246,57 @@ async def retrieve( cast_to=EntityBeneficialOwner, ) + async def update( + self, + entity_beneficial_owner_id: str, + *, + address: beneficial_owner_update_params.Address | 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, + ) -> EntityBeneficialOwner: + """ + Update a Beneficial Owner + + Args: + entity_beneficial_owner_id: The identifier of the Beneficial Owner to update. + + address: The individual's physical address. Mail receiving locations like PO Boxes and + PMB's are disallowed. + + 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 entity_beneficial_owner_id: + raise ValueError( + f"Expected a non-empty value for `entity_beneficial_owner_id` but received {entity_beneficial_owner_id!r}" + ) + return await self._patch( + f"/entity_beneficial_owners/{entity_beneficial_owner_id}", + body=await async_maybe_transform( + {"address": address}, beneficial_owner_update_params.BeneficialOwnerUpdateParams + ), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=EntityBeneficialOwner, + ) + def list( self, *, @@ -265,6 +365,9 @@ def __init__(self, beneficial_owners: BeneficialOwnersResource) -> None: self.retrieve = to_raw_response_wrapper( beneficial_owners.retrieve, ) + self.update = to_raw_response_wrapper( + beneficial_owners.update, + ) self.list = to_raw_response_wrapper( beneficial_owners.list, ) @@ -277,6 +380,9 @@ def __init__(self, beneficial_owners: AsyncBeneficialOwnersResource) -> None: self.retrieve = async_to_raw_response_wrapper( beneficial_owners.retrieve, ) + self.update = async_to_raw_response_wrapper( + beneficial_owners.update, + ) self.list = async_to_raw_response_wrapper( beneficial_owners.list, ) @@ -289,6 +395,9 @@ def __init__(self, beneficial_owners: BeneficialOwnersResource) -> None: self.retrieve = to_streamed_response_wrapper( beneficial_owners.retrieve, ) + self.update = to_streamed_response_wrapper( + beneficial_owners.update, + ) self.list = to_streamed_response_wrapper( beneficial_owners.list, ) @@ -301,6 +410,9 @@ def __init__(self, beneficial_owners: AsyncBeneficialOwnersResource) -> None: self.retrieve = async_to_streamed_response_wrapper( beneficial_owners.retrieve, ) + self.update = async_to_streamed_response_wrapper( + beneficial_owners.update, + ) self.list = async_to_streamed_response_wrapper( beneficial_owners.list, ) diff --git a/src/increase/types/__init__.py b/src/increase/types/__init__.py index 8fa2797b..654a6772 100644 --- a/src/increase/types/__init__.py +++ b/src/increase/types/__init__.py @@ -123,6 +123,7 @@ from .intrafi_exclusion_list_params import IntrafiExclusionListParams as IntrafiExclusionListParams from .oauth_application_list_params import OAuthApplicationListParams as OAuthApplicationListParams from .account_transfer_create_params import AccountTransferCreateParams as AccountTransferCreateParams +from .beneficial_owner_update_params import BeneficialOwnerUpdateParams as BeneficialOwnerUpdateParams from .card_push_transfer_list_params import CardPushTransferListParams as CardPushTransferListParams from .event_subscription_list_params import EventSubscriptionListParams as EventSubscriptionListParams from .external_account_create_params import ExternalAccountCreateParams as ExternalAccountCreateParams diff --git a/src/increase/types/beneficial_owner_update_params.py b/src/increase/types/beneficial_owner_update_params.py new file mode 100644 index 00000000..62ebcd51 --- /dev/null +++ b/src/increase/types/beneficial_owner_update_params.py @@ -0,0 +1,43 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing_extensions import Required, TypedDict + +__all__ = ["BeneficialOwnerUpdateParams", "Address"] + + +class BeneficialOwnerUpdateParams(TypedDict, total=False): + address: Address + """The individual's physical address. + + Mail receiving locations like PO Boxes and PMB's are disallowed. + """ + + +class Address(TypedDict, total=False): + """The individual's physical address. + + Mail receiving locations like PO Boxes and PMB's are disallowed. + """ + + city: Required[str] + """The city, district, town, or village of the address.""" + + country: Required[str] + """The two-letter ISO 3166-1 alpha-2 code for the country of the address.""" + + line1: Required[str] + """The first line of the address. This is usually the street number and street.""" + + line2: str + """The second line of the address. This might be the floor or room number.""" + + state: str + """ + The two-letter United States Postal Service (USPS) abbreviation for the US + state, province, or region of the address. Required in certain countries. + """ + + zip: str + """The ZIP or postal code of the address. Required in certain countries.""" diff --git a/tests/api_resources/test_beneficial_owners.py b/tests/api_resources/test_beneficial_owners.py index 3edaf063..e1c3bbcb 100644 --- a/tests/api_resources/test_beneficial_owners.py +++ b/tests/api_resources/test_beneficial_owners.py @@ -58,6 +58,61 @@ def test_path_params_retrieve(self, client: Increase) -> None: "", ) + @parametrize + def test_method_update(self, client: Increase) -> None: + beneficial_owner = client.beneficial_owners.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + ) + assert_matches_type(EntityBeneficialOwner, beneficial_owner, path=["response"]) + + @parametrize + def test_method_update_with_all_params(self, client: Increase) -> None: + beneficial_owner = client.beneficial_owners.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + address={ + "city": "New York", + "country": "US", + "line1": "33 Liberty Street", + "line2": "Unit 2", + "state": "NY", + "zip": "10045", + }, + ) + assert_matches_type(EntityBeneficialOwner, beneficial_owner, path=["response"]) + + @parametrize + def test_raw_response_update(self, client: Increase) -> None: + response = client.beneficial_owners.with_raw_response.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + beneficial_owner = response.parse() + assert_matches_type(EntityBeneficialOwner, beneficial_owner, path=["response"]) + + @parametrize + def test_streaming_response_update(self, client: Increase) -> None: + with client.beneficial_owners.with_streaming_response.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + beneficial_owner = response.parse() + assert_matches_type(EntityBeneficialOwner, beneficial_owner, 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 `entity_beneficial_owner_id` but received ''" + ): + client.beneficial_owners.with_raw_response.update( + entity_beneficial_owner_id="", + ) + @parametrize def test_method_list(self, client: Increase) -> None: beneficial_owner = client.beneficial_owners.list( @@ -145,6 +200,61 @@ async def test_path_params_retrieve(self, async_client: AsyncIncrease) -> None: "", ) + @parametrize + async def test_method_update(self, async_client: AsyncIncrease) -> None: + beneficial_owner = await async_client.beneficial_owners.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + ) + assert_matches_type(EntityBeneficialOwner, beneficial_owner, path=["response"]) + + @parametrize + async def test_method_update_with_all_params(self, async_client: AsyncIncrease) -> None: + beneficial_owner = await async_client.beneficial_owners.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + address={ + "city": "New York", + "country": "US", + "line1": "33 Liberty Street", + "line2": "Unit 2", + "state": "NY", + "zip": "10045", + }, + ) + assert_matches_type(EntityBeneficialOwner, beneficial_owner, path=["response"]) + + @parametrize + async def test_raw_response_update(self, async_client: AsyncIncrease) -> None: + response = await async_client.beneficial_owners.with_raw_response.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + beneficial_owner = await response.parse() + assert_matches_type(EntityBeneficialOwner, beneficial_owner, path=["response"]) + + @parametrize + async def test_streaming_response_update(self, async_client: AsyncIncrease) -> None: + async with async_client.beneficial_owners.with_streaming_response.update( + entity_beneficial_owner_id="entity_setup_beneficial_owner_submission_vgkyk7dj5eb4sfhdbkx7", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + beneficial_owner = await response.parse() + assert_matches_type(EntityBeneficialOwner, beneficial_owner, 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 `entity_beneficial_owner_id` but received ''" + ): + await async_client.beneficial_owners.with_raw_response.update( + entity_beneficial_owner_id="", + ) + @parametrize async def test_method_list(self, async_client: AsyncIncrease) -> None: beneficial_owner = await async_client.beneficial_owners.list(