diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 97d8dbba..aebbc8bc 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.100.0" + ".": "0.101.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index b4ca4228..4f6855e4 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 166 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic%2Flithic-aa089e65735b8884f8cb391b39b9a0b295819e438bf976c98cc6150628ca5488.yml -openapi_spec_hash: 719876533d1496e9192c7a734a78c736 -config_hash: e9a46eb8acb9dc2c236f3e1958a1c4dd +configured_endpoints: 168 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic%2Flithic-529662462c00af160f74568fe26dbe576cf1fdc9f427e11bb1939bd8acdcb43f.yml +openapi_spec_hash: a98631dfc66716d41ada4ddb199f7028 +config_hash: 2d501901f343d00775037fcec4121983 diff --git a/CHANGELOG.md b/CHANGELOG.md index b7e62177..8e80fdc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.101.0 (2025-08-04) + +Full Changelog: [v0.100.0...v0.101.0](https://github.com/lithic-com/lithic-python/compare/v0.100.0...v0.101.0) + +### Features + +* **api:** adds new Account Activity API ([62a2b97](https://github.com/lithic-com/lithic-python/commit/62a2b970195c5a3969187e20921d9b5c859d91e8)) +* **client:** support file upload requests ([97fa938](https://github.com/lithic-com/lithic-python/commit/97fa9388daaf5147aeeaeb1911ca1847c149ff3a)) + ## 0.100.0 (2025-07-28) Full Changelog: [v0.99.0...v0.100.0](https://github.com/lithic-com/lithic-python/compare/v0.99.0...v0.100.0) diff --git a/api.md b/api.md index 57316bcc..c6fb2d1d 100644 --- a/api.md +++ b/api.md @@ -766,3 +766,16 @@ Methods: - client.network_programs.retrieve(network_program_token) -> NetworkProgram - client.network_programs.list(\*\*params) -> SyncSinglePage[NetworkProgram] + +# AccountActivity + +Types: + +```python +from lithic.types import AccountActivityListResponse, AccountActivityRetrieveTransactionResponse +``` + +Methods: + +- client.account_activity.list(\*\*params) -> SyncCursorPage[AccountActivityListResponse] +- client.account_activity.retrieve_transaction(transaction_token) -> AccountActivityRetrieveTransactionResponse diff --git a/pyproject.toml b/pyproject.toml index 42d829b1..e2e16fca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "lithic" -version = "0.100.0" +version = "0.101.0" description = "The official Python library for the lithic API" dynamic = ["readme"] license = "Apache-2.0" diff --git a/src/lithic/_base_client.py b/src/lithic/_base_client.py index fd80c4f6..50679a45 100644 --- a/src/lithic/_base_client.py +++ b/src/lithic/_base_client.py @@ -533,7 +533,10 @@ def _build_request( is_body_allowed = options.method.lower() != "get" if is_body_allowed: - kwargs["json"] = json_data if is_given(json_data) else None + if isinstance(json_data, bytes): + kwargs["content"] = json_data + else: + kwargs["json"] = json_data if is_given(json_data) else None kwargs["files"] = files else: headers.pop("Content-Type", None) diff --git a/src/lithic/_client.py b/src/lithic/_client.py index f847af26..f440a529 100644 --- a/src/lithic/_client.py +++ b/src/lithic/_client.py @@ -56,6 +56,7 @@ funding_events, account_holders, credit_products, + account_activity, digital_card_art, network_programs, external_payments, @@ -80,6 +81,7 @@ from .resources.funding_events import FundingEvents, AsyncFundingEvents from .resources.account_holders import AccountHolders, AsyncAccountHolders from .resources.reports.reports import Reports, AsyncReports + from .resources.account_activity import AccountActivity, AsyncAccountActivity from .resources.digital_card_art import DigitalCardArtResource, AsyncDigitalCardArtResource from .resources.network_programs import NetworkPrograms, AsyncNetworkPrograms from .resources.external_payments import ExternalPayments, AsyncExternalPayments @@ -368,6 +370,12 @@ def network_programs(self) -> NetworkPrograms: return NetworkPrograms(self) + @cached_property + def account_activity(self) -> AccountActivity: + from .resources.account_activity import AccountActivity + + return AccountActivity(self) + @cached_property def with_raw_response(self) -> LithicWithRawResponse: return LithicWithRawResponse(self) @@ -754,6 +762,12 @@ def network_programs(self) -> AsyncNetworkPrograms: return AsyncNetworkPrograms(self) + @cached_property + def account_activity(self) -> AsyncAccountActivity: + from .resources.account_activity import AsyncAccountActivity + + return AsyncAccountActivity(self) + @cached_property def webhooks(self) -> webhooks.AsyncWebhooks: from .resources.webhooks import AsyncWebhooks @@ -1069,6 +1083,12 @@ def network_programs(self) -> network_programs.NetworkProgramsWithRawResponse: return NetworkProgramsWithRawResponse(self._client.network_programs) + @cached_property + def account_activity(self) -> account_activity.AccountActivityWithRawResponse: + from .resources.account_activity import AccountActivityWithRawResponse + + return AccountActivityWithRawResponse(self._client.account_activity) + class AsyncLithicWithRawResponse: _client: AsyncLithic @@ -1242,6 +1262,12 @@ def network_programs(self) -> network_programs.AsyncNetworkProgramsWithRawRespon return AsyncNetworkProgramsWithRawResponse(self._client.network_programs) + @cached_property + def account_activity(self) -> account_activity.AsyncAccountActivityWithRawResponse: + from .resources.account_activity import AsyncAccountActivityWithRawResponse + + return AsyncAccountActivityWithRawResponse(self._client.account_activity) + class LithicWithStreamedResponse: _client: Lithic @@ -1415,6 +1441,12 @@ def network_programs(self) -> network_programs.NetworkProgramsWithStreamingRespo return NetworkProgramsWithStreamingResponse(self._client.network_programs) + @cached_property + def account_activity(self) -> account_activity.AccountActivityWithStreamingResponse: + from .resources.account_activity import AccountActivityWithStreamingResponse + + return AccountActivityWithStreamingResponse(self._client.account_activity) + class AsyncLithicWithStreamedResponse: _client: AsyncLithic @@ -1588,6 +1620,12 @@ def network_programs(self) -> network_programs.AsyncNetworkProgramsWithStreaming return AsyncNetworkProgramsWithStreamingResponse(self._client.network_programs) + @cached_property + def account_activity(self) -> account_activity.AsyncAccountActivityWithStreamingResponse: + from .resources.account_activity import AsyncAccountActivityWithStreamingResponse + + return AsyncAccountActivityWithStreamingResponse(self._client.account_activity) + Client = Lithic diff --git a/src/lithic/_files.py b/src/lithic/_files.py index 715cc207..cc14c14f 100644 --- a/src/lithic/_files.py +++ b/src/lithic/_files.py @@ -69,12 +69,12 @@ def _transform_file(file: FileTypes) -> HttpxFileTypes: return file if is_tuple_t(file): - return (file[0], _read_file_content(file[1]), *file[2:]) + return (file[0], read_file_content(file[1]), *file[2:]) raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple") -def _read_file_content(file: FileContent) -> HttpxFileContent: +def read_file_content(file: FileContent) -> HttpxFileContent: if isinstance(file, os.PathLike): return pathlib.Path(file).read_bytes() return file @@ -111,12 +111,12 @@ async def _async_transform_file(file: FileTypes) -> HttpxFileTypes: return file if is_tuple_t(file): - return (file[0], await _async_read_file_content(file[1]), *file[2:]) + return (file[0], await async_read_file_content(file[1]), *file[2:]) raise TypeError(f"Expected file types input to be a FileContent type or to be a tuple") -async def _async_read_file_content(file: FileContent) -> HttpxFileContent: +async def async_read_file_content(file: FileContent) -> HttpxFileContent: if isinstance(file, os.PathLike): return await anyio.Path(file).read_bytes() diff --git a/src/lithic/_version.py b/src/lithic/_version.py index c16a3142..8fd6a8f9 100644 --- a/src/lithic/_version.py +++ b/src/lithic/_version.py @@ -1,4 +1,4 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. __title__ = "lithic" -__version__ = "0.100.0" # x-release-please-version +__version__ = "0.101.0" # x-release-please-version diff --git a/src/lithic/resources/__init__.py b/src/lithic/resources/__init__.py index 8037eda6..1d7a2e76 100644 --- a/src/lithic/resources/__init__.py +++ b/src/lithic/resources/__init__.py @@ -137,6 +137,14 @@ CreditProductsWithStreamingResponse, AsyncCreditProductsWithStreamingResponse, ) +from .account_activity import ( + AccountActivity, + AsyncAccountActivity, + AccountActivityWithRawResponse, + AsyncAccountActivityWithRawResponse, + AccountActivityWithStreamingResponse, + AsyncAccountActivityWithStreamingResponse, +) from .digital_card_art import ( DigitalCardArtResource, AsyncDigitalCardArtResource, @@ -383,4 +391,10 @@ "AsyncNetworkProgramsWithRawResponse", "NetworkProgramsWithStreamingResponse", "AsyncNetworkProgramsWithStreamingResponse", + "AccountActivity", + "AsyncAccountActivity", + "AccountActivityWithRawResponse", + "AsyncAccountActivityWithRawResponse", + "AccountActivityWithStreamingResponse", + "AsyncAccountActivityWithStreamingResponse", ] diff --git a/src/lithic/resources/account_activity.py b/src/lithic/resources/account_activity.py new file mode 100644 index 00000000..287924c1 --- /dev/null +++ b/src/lithic/resources/account_activity.py @@ -0,0 +1,391 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import Any, List, Union, cast +from datetime import datetime +from typing_extensions import Literal + +import httpx + +from .. import _legacy_response +from ..types import account_activity_list_params +from .._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from .._utils import maybe_transform +from .._compat import cached_property +from .._resource import SyncAPIResource, AsyncAPIResource +from .._response import to_streamed_response_wrapper, async_to_streamed_response_wrapper +from ..pagination import SyncCursorPage, AsyncCursorPage +from .._base_client import AsyncPaginator, make_request_options +from ..types.account_activity_list_response import AccountActivityListResponse +from ..types.account_activity_retrieve_transaction_response import AccountActivityRetrieveTransactionResponse + +__all__ = ["AccountActivity", "AsyncAccountActivity"] + + +class AccountActivity(SyncAPIResource): + @cached_property + def with_raw_response(self) -> AccountActivityWithRawResponse: + """ + 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/lithic-com/lithic-python#accessing-raw-response-data-eg-headers + """ + return AccountActivityWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AccountActivityWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/lithic-com/lithic-python#with_streaming_response + """ + return AccountActivityWithStreamingResponse(self) + + def list( + self, + *, + begin: Union[str, datetime] | NotGiven = NOT_GIVEN, + business_account_token: str | NotGiven = NOT_GIVEN, + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + | NotGiven = NOT_GIVEN, + end: Union[str, datetime] | NotGiven = NOT_GIVEN, + ending_before: str | NotGiven = NOT_GIVEN, + financial_account_token: str | NotGiven = NOT_GIVEN, + page_size: int | NotGiven = NOT_GIVEN, + result: List[Literal["APPROVED", "DECLINED"]] | NotGiven = NOT_GIVEN, + starting_after: str | NotGiven = NOT_GIVEN, + status: List[Literal["DECLINED", "EXPIRED", "PENDING", "SETTLED", "VOIDED", "RETURNED", "REVERSED"]] + | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> SyncCursorPage[AccountActivityListResponse]: + """ + Retrieve a list of transactions across all public accounts. + + Args: + begin: Date string in RFC 3339 format. Only entries created after the specified time + will be included. UTC time zone. + + business_account_token: Filter by business account token + + category: Filter by transaction category + + end: Date string in RFC 3339 format. Only entries created before the specified time + will be included. UTC time zone. + + ending_before: A cursor representing an item's token before which a page of results should end. + Used to retrieve the previous page of results before this item. + + financial_account_token: Filter by financial account token + + page_size: Page size (for pagination). + + result: Filter by transaction result + + starting_after: A cursor representing an item's token after which a page of results should + begin. Used to retrieve the next page of results after this item. + + status: Filter by transaction status + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get_api_list( + "/v1/account_activity", + page=SyncCursorPage[AccountActivityListResponse], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "begin": begin, + "business_account_token": business_account_token, + "category": category, + "end": end, + "ending_before": ending_before, + "financial_account_token": financial_account_token, + "page_size": page_size, + "result": result, + "starting_after": starting_after, + "status": status, + }, + account_activity_list_params.AccountActivityListParams, + ), + ), + model=cast( + Any, AccountActivityListResponse + ), # Union types cannot be passed in as arguments in the type system + ) + + def retrieve_transaction( + self, + transaction_token: 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, + ) -> AccountActivityRetrieveTransactionResponse: + """ + Retrieve a single transaction + + 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 transaction_token: + raise ValueError(f"Expected a non-empty value for `transaction_token` but received {transaction_token!r}") + return cast( + AccountActivityRetrieveTransactionResponse, + self._get( + f"/v1/account_activity/{transaction_token}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=cast( + Any, AccountActivityRetrieveTransactionResponse + ), # Union types cannot be passed in as arguments in the type system + ), + ) + + +class AsyncAccountActivity(AsyncAPIResource): + @cached_property + def with_raw_response(self) -> AsyncAccountActivityWithRawResponse: + """ + 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/lithic-com/lithic-python#accessing-raw-response-data-eg-headers + """ + return AsyncAccountActivityWithRawResponse(self) + + @cached_property + def with_streaming_response(self) -> AsyncAccountActivityWithStreamingResponse: + """ + An alternative to `.with_raw_response` that doesn't eagerly read the response body. + + For more information, see https://www.github.com/lithic-com/lithic-python#with_streaming_response + """ + return AsyncAccountActivityWithStreamingResponse(self) + + def list( + self, + *, + begin: Union[str, datetime] | NotGiven = NOT_GIVEN, + business_account_token: str | NotGiven = NOT_GIVEN, + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + | NotGiven = NOT_GIVEN, + end: Union[str, datetime] | NotGiven = NOT_GIVEN, + ending_before: str | NotGiven = NOT_GIVEN, + financial_account_token: str | NotGiven = NOT_GIVEN, + page_size: int | NotGiven = NOT_GIVEN, + result: List[Literal["APPROVED", "DECLINED"]] | NotGiven = NOT_GIVEN, + starting_after: str | NotGiven = NOT_GIVEN, + status: List[Literal["DECLINED", "EXPIRED", "PENDING", "SETTLED", "VOIDED", "RETURNED", "REVERSED"]] + | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | httpx.Timeout | None | NotGiven = NOT_GIVEN, + ) -> AsyncPaginator[AccountActivityListResponse, AsyncCursorPage[AccountActivityListResponse]]: + """ + Retrieve a list of transactions across all public accounts. + + Args: + begin: Date string in RFC 3339 format. Only entries created after the specified time + will be included. UTC time zone. + + business_account_token: Filter by business account token + + category: Filter by transaction category + + end: Date string in RFC 3339 format. Only entries created before the specified time + will be included. UTC time zone. + + ending_before: A cursor representing an item's token before which a page of results should end. + Used to retrieve the previous page of results before this item. + + financial_account_token: Filter by financial account token + + page_size: Page size (for pagination). + + result: Filter by transaction result + + starting_after: A cursor representing an item's token after which a page of results should + begin. Used to retrieve the next page of results after this item. + + status: Filter by transaction status + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get_api_list( + "/v1/account_activity", + page=AsyncCursorPage[AccountActivityListResponse], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "begin": begin, + "business_account_token": business_account_token, + "category": category, + "end": end, + "ending_before": ending_before, + "financial_account_token": financial_account_token, + "page_size": page_size, + "result": result, + "starting_after": starting_after, + "status": status, + }, + account_activity_list_params.AccountActivityListParams, + ), + ), + model=cast( + Any, AccountActivityListResponse + ), # Union types cannot be passed in as arguments in the type system + ) + + async def retrieve_transaction( + self, + transaction_token: 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, + ) -> AccountActivityRetrieveTransactionResponse: + """ + Retrieve a single transaction + + 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 transaction_token: + raise ValueError(f"Expected a non-empty value for `transaction_token` but received {transaction_token!r}") + return cast( + AccountActivityRetrieveTransactionResponse, + await self._get( + f"/v1/account_activity/{transaction_token}", + options=make_request_options( + extra_headers=extra_headers, extra_query=extra_query, extra_body=extra_body, timeout=timeout + ), + cast_to=cast( + Any, AccountActivityRetrieveTransactionResponse + ), # Union types cannot be passed in as arguments in the type system + ), + ) + + +class AccountActivityWithRawResponse: + def __init__(self, account_activity: AccountActivity) -> None: + self._account_activity = account_activity + + self.list = _legacy_response.to_raw_response_wrapper( + account_activity.list, + ) + self.retrieve_transaction = _legacy_response.to_raw_response_wrapper( + account_activity.retrieve_transaction, + ) + + +class AsyncAccountActivityWithRawResponse: + def __init__(self, account_activity: AsyncAccountActivity) -> None: + self._account_activity = account_activity + + self.list = _legacy_response.async_to_raw_response_wrapper( + account_activity.list, + ) + self.retrieve_transaction = _legacy_response.async_to_raw_response_wrapper( + account_activity.retrieve_transaction, + ) + + +class AccountActivityWithStreamingResponse: + def __init__(self, account_activity: AccountActivity) -> None: + self._account_activity = account_activity + + self.list = to_streamed_response_wrapper( + account_activity.list, + ) + self.retrieve_transaction = to_streamed_response_wrapper( + account_activity.retrieve_transaction, + ) + + +class AsyncAccountActivityWithStreamingResponse: + def __init__(self, account_activity: AsyncAccountActivity) -> None: + self._account_activity = account_activity + + self.list = async_to_streamed_response_wrapper( + account_activity.list, + ) + self.retrieve_transaction = async_to_streamed_response_wrapper( + account_activity.retrieve_transaction, + ) diff --git a/src/lithic/types/__init__.py b/src/lithic/types/__init__.py index 9b641f87..295b2fe5 100644 --- a/src/lithic/types/__init__.py +++ b/src/lithic/types/__init__.py @@ -88,6 +88,7 @@ from .card_web_provision_response import CardWebProvisionResponse as CardWebProvisionResponse from .funding_event_list_response import FundingEventListResponse as FundingEventListResponse from .network_program_list_params import NetworkProgramListParams as NetworkProgramListParams +from .account_activity_list_params import AccountActivityListParams as AccountActivityListParams from .account_holder_create_params import AccountHolderCreateParams as AccountHolderCreateParams from .account_holder_update_params import AccountHolderUpdateParams as AccountHolderUpdateParams from .book_transfer_reverse_params import BookTransferReverseParams as BookTransferReverseParams @@ -99,6 +100,7 @@ from .dispute_list_evidences_params import DisputeListEvidencesParams as DisputeListEvidencesParams from .external_bank_account_address import ExternalBankAccountAddress as ExternalBankAccountAddress from .financial_account_list_params import FinancialAccountListParams as FinancialAccountListParams +from .account_activity_list_response import AccountActivityListResponse as AccountActivityListResponse from .account_holder_create_response import AccountHolderCreateResponse as AccountHolderCreateResponse from .account_holder_update_response import AccountHolderUpdateResponse as AccountHolderUpdateResponse from .external_payment_cancel_params import ExternalPaymentCancelParams as ExternalPaymentCancelParams @@ -192,6 +194,9 @@ from .transaction_simulate_return_reversal_response import ( TransactionSimulateReturnReversalResponse as TransactionSimulateReturnReversalResponse, ) +from .account_activity_retrieve_transaction_response import ( + AccountActivityRetrieveTransactionResponse as AccountActivityRetrieveTransactionResponse, +) from .tokenization_decisioning_rotate_secret_response import ( TokenizationDecisioningRotateSecretResponse as TokenizationDecisioningRotateSecretResponse, ) diff --git a/src/lithic/types/account_activity_list_params.py b/src/lithic/types/account_activity_list_params.py new file mode 100644 index 00000000..6de22fcb --- /dev/null +++ b/src/lithic/types/account_activity_list_params.py @@ -0,0 +1,70 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from __future__ import annotations + +from typing import List, Union +from datetime import datetime +from typing_extensions import Literal, Annotated, TypedDict + +from .._utils import PropertyInfo + +__all__ = ["AccountActivityListParams"] + + +class AccountActivityListParams(TypedDict, total=False): + begin: Annotated[Union[str, datetime], PropertyInfo(format="iso8601")] + """Date string in RFC 3339 format. + + Only entries created after the specified time will be included. UTC time zone. + """ + + business_account_token: str + """Filter by business account token""" + + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + """Filter by transaction category""" + + end: Annotated[Union[str, datetime], PropertyInfo(format="iso8601")] + """Date string in RFC 3339 format. + + Only entries created before the specified time will be included. UTC time zone. + """ + + ending_before: str + """A cursor representing an item's token before which a page of results should end. + + Used to retrieve the previous page of results before this item. + """ + + financial_account_token: str + """Filter by financial account token""" + + page_size: int + """Page size (for pagination).""" + + result: List[Literal["APPROVED", "DECLINED"]] + """Filter by transaction result""" + + starting_after: str + """A cursor representing an item's token after which a page of results should + begin. + + Used to retrieve the next page of results after this item. + """ + + status: List[Literal["DECLINED", "EXPIRED", "PENDING", "SETTLED", "VOIDED", "RETURNED", "REVERSED"]] + """Filter by transaction status""" diff --git a/src/lithic/types/account_activity_list_response.py b/src/lithic/types/account_activity_list_response.py new file mode 100644 index 00000000..7c083dc6 --- /dev/null +++ b/src/lithic/types/account_activity_list_response.py @@ -0,0 +1,312 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Union, Optional +from datetime import date, datetime +from typing_extensions import Literal, TypeAlias + +from .._models import BaseModel +from .transaction import Transaction +from .external_payment import ExternalPayment +from .external_resource import ExternalResource +from .management_operation_transaction import ManagementOperationTransaction + +__all__ = [ + "AccountActivityListResponse", + "FinancialTransaction", + "BookTransferTransaction", + "BookTransferTransactionTransactionSeries", + "CardTransaction", + "PaymentTransaction", + "PaymentTransactionMethodAttributes", + "PaymentTransactionMethodAttributesACHMethodAttributes", + "PaymentTransactionMethodAttributesWireMethodAttributes", + "PaymentTransactionRelatedAccountTokens", +] + + +class FinancialTransaction(BaseModel): + token: str + """Unique identifier for the transaction""" + + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + """Transaction category""" + + created: datetime + """ISO 8601 timestamp of when the transaction was created""" + + currency: str + """Currency of the transaction, represented in ISO 4217 format""" + + descriptor: str + """Transaction descriptor""" + + events: List[object] + """List of transaction events""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + financial_account_token: str + """Financial account token associated with the transaction""" + + pending_amount: int + """Pending amount in cents""" + + result: Literal["APPROVED", "DECLINED"] + """Transaction result""" + + settled_amount: int + """Settled amount in cents""" + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] + """The status of the transaction""" + + updated: datetime + """ISO 8601 timestamp of when the transaction was last updated""" + + +class BookTransferTransactionTransactionSeries(BaseModel): + related_transaction_event_token: Optional[str] = None + + related_transaction_token: Optional[str] = None + + type: str + + +class BookTransferTransaction(BaseModel): + token: str + """Unique identifier for the transaction""" + + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + + created: datetime + """ISO 8601 timestamp of when the transaction was created""" + + currency: str + """Currency of the transaction in ISO 4217 format""" + + events: List[object] + """List of events associated with this book transfer""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + from_financial_account_token: str + """Source account token""" + + pending_amount: int + """The pending amount of the transaction in cents""" + + result: Literal["APPROVED", "DECLINED"] + + settled_amount: int + """The settled amount of the transaction in cents""" + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] + """The status of the transaction""" + + to_financial_account_token: str + """Destination account token""" + + updated: datetime + """ISO 8601 timestamp of when the transaction was last updated""" + + external_id: Optional[str] = None + """External identifier for the transaction""" + + external_resource: Optional[ExternalResource] = None + """External resource associated with the management operation""" + + transaction_series: Optional[BookTransferTransactionTransactionSeries] = None + + +class CardTransaction(Transaction): + token: str # type: ignore + """Unique identifier for the transaction""" + + created: datetime # type: ignore + """ISO 8601 timestamp of when the transaction was created""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] # type: ignore + """The status of the transaction""" + + updated: datetime # type: ignore + """ISO 8601 timestamp of when the transaction was last updated""" + + +class PaymentTransactionMethodAttributesACHMethodAttributes(BaseModel): + sec_code: Literal["CCD", "PPD", "WEB", "TEL", "CIE", "CTX"] + """SEC code for ACH transaction""" + + addenda: Optional[str] = None + """Addenda information""" + + company_id: Optional[str] = None + """Company ID for the ACH transaction""" + + receipt_routing_number: Optional[str] = None + """Receipt routing number""" + + retries: Optional[int] = None + """Number of retries attempted""" + + return_reason_code: Optional[str] = None + """Return reason code if the transaction was returned""" + + trace_numbers: Optional[List[str]] = None + """Trace numbers for the ACH transaction""" + + +class PaymentTransactionMethodAttributesWireMethodAttributes(BaseModel): + wire_transfer_type: Literal["FEDWIRE", "SWIFT"] + """Type of wire transfer""" + + external_bank_name: Optional[str] = None + """External bank name""" + + external_bank_routing_number: Optional[str] = None + """External bank routing number""" + + external_individual_name: Optional[str] = None + """External individual name""" + + lithic_bank_name: Optional[str] = None + """Lithic bank name""" + + lithic_bank_routing_number: Optional[str] = None + """Lithic bank routing number""" + + lithic_individual_name: Optional[str] = None + """Lithic individual name""" + + previous_transfer: Optional[str] = None + """UUID of previous transfer if this is a retry""" + + +PaymentTransactionMethodAttributes: TypeAlias = Union[ + PaymentTransactionMethodAttributesACHMethodAttributes, PaymentTransactionMethodAttributesWireMethodAttributes +] + + +class PaymentTransactionRelatedAccountTokens(BaseModel): + account_token: Optional[str] = None + """Globally unique identifier for the account""" + + business_account_token: Optional[str] = None + """Globally unique identifier for the business account""" + + +class PaymentTransaction(BaseModel): + token: str + """Unique identifier for the transaction""" + + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + """Transaction category""" + + created: datetime + """ISO 8601 timestamp of when the transaction was created""" + + descriptor: str + """Transaction descriptor""" + + direction: Literal["CREDIT", "DEBIT"] + """Transfer direction""" + + events: List[object] + """List of transaction events""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + financial_account_token: str + """Financial account token""" + + method: Literal["ACH_NEXT_DAY", "ACH_SAME_DAY", "WIRE"] + """Transfer method""" + + method_attributes: PaymentTransactionMethodAttributes + """Method-specific attributes""" + + pending_amount: int + """Pending amount in cents""" + + related_account_tokens: PaymentTransactionRelatedAccountTokens + """Related account tokens for the transaction""" + + result: Literal["APPROVED", "DECLINED"] + """Transaction result""" + + settled_amount: int + """Settled amount in cents""" + + source: Literal["LITHIC", "EXTERNAL", "CUSTOMER"] + """Transaction source""" + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] + """The status of the transaction""" + + updated: datetime + """ISO 8601 timestamp of when the transaction was last updated""" + + currency: Optional[str] = None + """Currency of the transaction in ISO 4217 format""" + + expected_release_date: Optional[date] = None + """Expected release date for the transaction""" + + external_bank_account_token: Optional[str] = None + """External bank account token""" + + user_defined_id: Optional[str] = None + """User-defined identifier""" + + +AccountActivityListResponse: TypeAlias = Union[ + FinancialTransaction, + BookTransferTransaction, + CardTransaction, + PaymentTransaction, + ExternalPayment, + ManagementOperationTransaction, +] diff --git a/src/lithic/types/account_activity_retrieve_transaction_response.py b/src/lithic/types/account_activity_retrieve_transaction_response.py new file mode 100644 index 00000000..6982fafa --- /dev/null +++ b/src/lithic/types/account_activity_retrieve_transaction_response.py @@ -0,0 +1,312 @@ +# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +from typing import List, Union, Optional +from datetime import date, datetime +from typing_extensions import Literal, TypeAlias + +from .._models import BaseModel +from .transaction import Transaction +from .external_payment import ExternalPayment +from .external_resource import ExternalResource +from .management_operation_transaction import ManagementOperationTransaction + +__all__ = [ + "AccountActivityRetrieveTransactionResponse", + "FinancialTransaction", + "BookTransferTransaction", + "BookTransferTransactionTransactionSeries", + "CardTransaction", + "PaymentTransaction", + "PaymentTransactionMethodAttributes", + "PaymentTransactionMethodAttributesACHMethodAttributes", + "PaymentTransactionMethodAttributesWireMethodAttributes", + "PaymentTransactionRelatedAccountTokens", +] + + +class FinancialTransaction(BaseModel): + token: str + """Unique identifier for the transaction""" + + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + """Transaction category""" + + created: datetime + """ISO 8601 timestamp of when the transaction was created""" + + currency: str + """Currency of the transaction, represented in ISO 4217 format""" + + descriptor: str + """Transaction descriptor""" + + events: List[object] + """List of transaction events""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + financial_account_token: str + """Financial account token associated with the transaction""" + + pending_amount: int + """Pending amount in cents""" + + result: Literal["APPROVED", "DECLINED"] + """Transaction result""" + + settled_amount: int + """Settled amount in cents""" + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] + """The status of the transaction""" + + updated: datetime + """ISO 8601 timestamp of when the transaction was last updated""" + + +class BookTransferTransactionTransactionSeries(BaseModel): + related_transaction_event_token: Optional[str] = None + + related_transaction_token: Optional[str] = None + + type: str + + +class BookTransferTransaction(BaseModel): + token: str + """Unique identifier for the transaction""" + + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + + created: datetime + """ISO 8601 timestamp of when the transaction was created""" + + currency: str + """Currency of the transaction in ISO 4217 format""" + + events: List[object] + """List of events associated with this book transfer""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + from_financial_account_token: str + """Source account token""" + + pending_amount: int + """The pending amount of the transaction in cents""" + + result: Literal["APPROVED", "DECLINED"] + + settled_amount: int + """The settled amount of the transaction in cents""" + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] + """The status of the transaction""" + + to_financial_account_token: str + """Destination account token""" + + updated: datetime + """ISO 8601 timestamp of when the transaction was last updated""" + + external_id: Optional[str] = None + """External identifier for the transaction""" + + external_resource: Optional[ExternalResource] = None + """External resource associated with the management operation""" + + transaction_series: Optional[BookTransferTransactionTransactionSeries] = None + + +class CardTransaction(Transaction): + token: str # type: ignore + """Unique identifier for the transaction""" + + created: datetime # type: ignore + """ISO 8601 timestamp of when the transaction was created""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] # type: ignore + """The status of the transaction""" + + updated: datetime # type: ignore + """ISO 8601 timestamp of when the transaction was last updated""" + + +class PaymentTransactionMethodAttributesACHMethodAttributes(BaseModel): + sec_code: Literal["CCD", "PPD", "WEB", "TEL", "CIE", "CTX"] + """SEC code for ACH transaction""" + + addenda: Optional[str] = None + """Addenda information""" + + company_id: Optional[str] = None + """Company ID for the ACH transaction""" + + receipt_routing_number: Optional[str] = None + """Receipt routing number""" + + retries: Optional[int] = None + """Number of retries attempted""" + + return_reason_code: Optional[str] = None + """Return reason code if the transaction was returned""" + + trace_numbers: Optional[List[str]] = None + """Trace numbers for the ACH transaction""" + + +class PaymentTransactionMethodAttributesWireMethodAttributes(BaseModel): + wire_transfer_type: Literal["FEDWIRE", "SWIFT"] + """Type of wire transfer""" + + external_bank_name: Optional[str] = None + """External bank name""" + + external_bank_routing_number: Optional[str] = None + """External bank routing number""" + + external_individual_name: Optional[str] = None + """External individual name""" + + lithic_bank_name: Optional[str] = None + """Lithic bank name""" + + lithic_bank_routing_number: Optional[str] = None + """Lithic bank routing number""" + + lithic_individual_name: Optional[str] = None + """Lithic individual name""" + + previous_transfer: Optional[str] = None + """UUID of previous transfer if this is a retry""" + + +PaymentTransactionMethodAttributes: TypeAlias = Union[ + PaymentTransactionMethodAttributesACHMethodAttributes, PaymentTransactionMethodAttributesWireMethodAttributes +] + + +class PaymentTransactionRelatedAccountTokens(BaseModel): + account_token: Optional[str] = None + """Globally unique identifier for the account""" + + business_account_token: Optional[str] = None + """Globally unique identifier for the business account""" + + +class PaymentTransaction(BaseModel): + token: str + """Unique identifier for the transaction""" + + category: Literal[ + "ACH", + "BALANCE_OR_FUNDING", + "CARD", + "EXTERNAL_ACH", + "EXTERNAL_CHECK", + "EXTERNAL_TRANSFER", + "EXTERNAL_WIRE", + "MANAGEMENT_ADJUSTMENT", + "MANAGEMENT_DISPUTE", + "MANAGEMENT_FEE", + "MANAGEMENT_REWARD", + "MANAGEMENT_DISBURSEMENT", + "PROGRAM_FUNDING", + ] + """Transaction category""" + + created: datetime + """ISO 8601 timestamp of when the transaction was created""" + + descriptor: str + """Transaction descriptor""" + + direction: Literal["CREDIT", "DEBIT"] + """Transfer direction""" + + events: List[object] + """List of transaction events""" + + family: Literal["CARD", "PAYMENT", "TRANSFER", "INTERNAL", "EXTERNAL_PAYMENT", "MANAGEMENT_OPERATION"] + + financial_account_token: str + """Financial account token""" + + method: Literal["ACH_NEXT_DAY", "ACH_SAME_DAY", "WIRE"] + """Transfer method""" + + method_attributes: PaymentTransactionMethodAttributes + """Method-specific attributes""" + + pending_amount: int + """Pending amount in cents""" + + related_account_tokens: PaymentTransactionRelatedAccountTokens + """Related account tokens for the transaction""" + + result: Literal["APPROVED", "DECLINED"] + """Transaction result""" + + settled_amount: int + """Settled amount in cents""" + + source: Literal["LITHIC", "EXTERNAL", "CUSTOMER"] + """Transaction source""" + + status: Literal["PENDING", "SETTLED", "DECLINED", "REVERSED", "CANCELED"] + """The status of the transaction""" + + updated: datetime + """ISO 8601 timestamp of when the transaction was last updated""" + + currency: Optional[str] = None + """Currency of the transaction in ISO 4217 format""" + + expected_release_date: Optional[date] = None + """Expected release date for the transaction""" + + external_bank_account_token: Optional[str] = None + """External bank account token""" + + user_defined_id: Optional[str] = None + """User-defined identifier""" + + +AccountActivityRetrieveTransactionResponse: TypeAlias = Union[ + FinancialTransaction, + BookTransferTransaction, + CardTransaction, + PaymentTransaction, + ExternalPayment, + ManagementOperationTransaction, +] diff --git a/src/lithic/types/book_transfer_response.py b/src/lithic/types/book_transfer_response.py index 49fb5663..9c119275 100644 --- a/src/lithic/types/book_transfer_response.py +++ b/src/lithic/types/book_transfer_response.py @@ -1,12 +1,13 @@ # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -from typing import List +from typing import List, Optional from datetime import datetime from typing_extensions import Literal from .._models import BaseModel +from .external_resource import ExternalResource -__all__ = ["BookTransferResponse", "Event"] +__all__ = ["BookTransferResponse", "Event", "TransactionSeries"] class Event(BaseModel): @@ -41,6 +42,14 @@ class Event(BaseModel): """Type of the book transfer""" +class TransactionSeries(BaseModel): + related_transaction_event_token: Optional[str] = None + + related_transaction_token: Optional[str] = None + + type: str + + class BookTransferResponse(BaseModel): token: str """Customer-provided token that will serve as an idempotency token. @@ -63,6 +72,9 @@ class BookTransferResponse(BaseModel): events: List[Event] """A list of all financial events that have modified this transfer.""" + external_resource: Optional[ExternalResource] = None + """External resource associated with the management operation""" + from_financial_account_token: str """ Globally unique identifier for the financial account or card that will send the @@ -101,5 +113,8 @@ class BookTransferResponse(BaseModel): the funds. Accepted type dependent on the program's use case. """ + transaction_series: Optional[TransactionSeries] = None + """A series of transactions that are grouped together.""" + updated: datetime """Date and time when the financial transaction was last updated. UTC time zone.""" diff --git a/src/lithic/types/external_payment.py b/src/lithic/types/external_payment.py index 15567ce0..98f2f952 100644 --- a/src/lithic/types/external_payment.py +++ b/src/lithic/types/external_payment.py @@ -16,7 +16,7 @@ class Event(BaseModel): created: datetime - detailed_results: List[Literal["APPROVED"]] + detailed_results: List[Literal["APPROVED", "INSUFFICIENT_FUNDS"]] effective_date: date diff --git a/src/lithic/types/management_operation_transaction.py b/src/lithic/types/management_operation_transaction.py index 2a46cb16..797983d1 100644 --- a/src/lithic/types/management_operation_transaction.py +++ b/src/lithic/types/management_operation_transaction.py @@ -17,7 +17,7 @@ class Event(BaseModel): created: datetime - detailed_results: List[Literal["APPROVED"]] + detailed_results: List[Literal["APPROVED", "INSUFFICIENT_FUNDS"]] effective_date: date diff --git a/src/lithic/types/payment.py b/src/lithic/types/payment.py index 644537e5..e985d2cf 100644 --- a/src/lithic/types/payment.py +++ b/src/lithic/types/payment.py @@ -6,7 +6,7 @@ from .._models import BaseModel -__all__ = ["Payment", "Event", "MethodAttributes"] +__all__ = ["Payment", "Event", "MethodAttributes", "RelatedAccountTokens"] class Event(BaseModel): @@ -94,6 +94,14 @@ class MethodAttributes(BaseModel): addenda: Optional[str] = None +class RelatedAccountTokens(BaseModel): + account_token: Optional[str] = None + """Globally unique identifier for the account""" + + business_account_token: Optional[str] = None + """Globally unique identifier for the business account""" + + class Payment(BaseModel): token: str """Globally unique identifier.""" @@ -132,6 +140,9 @@ class Payment(BaseModel): value of this field will go to zero over time once the payment is settled. """ + related_account_tokens: RelatedAccountTokens + """Account tokens related to a payment transaction""" + result: Literal["APPROVED", "DECLINED"] """ APPROVED payments were successful while DECLINED payments were declined by diff --git a/tests/api_resources/test_account_activity.py b/tests/api_resources/test_account_activity.py new file mode 100644 index 00000000..3ab3d621 --- /dev/null +++ b/tests/api_resources/test_account_activity.py @@ -0,0 +1,187 @@ +# 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 lithic import Lithic, AsyncLithic +from tests.utils import assert_matches_type +from lithic.types import ( + AccountActivityListResponse, + AccountActivityRetrieveTransactionResponse, +) +from lithic._utils import parse_datetime +from lithic.pagination import SyncCursorPage, AsyncCursorPage + +base_url = os.environ.get("TEST_API_BASE_URL", "http://127.0.0.1:4010") + + +class TestAccountActivity: + parametrize = pytest.mark.parametrize("client", [False, True], indirect=True, ids=["loose", "strict"]) + + @parametrize + def test_method_list(self, client: Lithic) -> None: + account_activity = client.account_activity.list() + assert_matches_type(SyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + @parametrize + def test_method_list_with_all_params(self, client: Lithic) -> None: + account_activity = client.account_activity.list( + begin=parse_datetime("2019-12-27T18:11:19.117Z"), + business_account_token="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + category="ACH", + end=parse_datetime("2019-12-27T18:11:19.117Z"), + ending_before="ending_before", + financial_account_token="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + page_size=1, + result=["APPROVED"], + starting_after="starting_after", + status=["DECLINED"], + ) + assert_matches_type(SyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + @parametrize + def test_raw_response_list(self, client: Lithic) -> None: + response = client.account_activity.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + account_activity = response.parse() + assert_matches_type(SyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + @parametrize + def test_streaming_response_list(self, client: Lithic) -> None: + with client.account_activity.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + account_activity = response.parse() + assert_matches_type(SyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_method_retrieve_transaction(self, client: Lithic) -> None: + account_activity = client.account_activity.retrieve_transaction( + "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + ) + assert_matches_type(AccountActivityRetrieveTransactionResponse, account_activity, path=["response"]) + + @parametrize + def test_raw_response_retrieve_transaction(self, client: Lithic) -> None: + response = client.account_activity.with_raw_response.retrieve_transaction( + "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + account_activity = response.parse() + assert_matches_type(AccountActivityRetrieveTransactionResponse, account_activity, path=["response"]) + + @parametrize + def test_streaming_response_retrieve_transaction(self, client: Lithic) -> None: + with client.account_activity.with_streaming_response.retrieve_transaction( + "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + account_activity = response.parse() + assert_matches_type(AccountActivityRetrieveTransactionResponse, account_activity, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + def test_path_params_retrieve_transaction(self, client: Lithic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `transaction_token` but received ''"): + client.account_activity.with_raw_response.retrieve_transaction( + "", + ) + + +class TestAsyncAccountActivity: + parametrize = pytest.mark.parametrize( + "async_client", [False, True, {"http_client": "aiohttp"}], indirect=True, ids=["loose", "strict", "aiohttp"] + ) + + @parametrize + async def test_method_list(self, async_client: AsyncLithic) -> None: + account_activity = await async_client.account_activity.list() + assert_matches_type(AsyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + @parametrize + async def test_method_list_with_all_params(self, async_client: AsyncLithic) -> None: + account_activity = await async_client.account_activity.list( + begin=parse_datetime("2019-12-27T18:11:19.117Z"), + business_account_token="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + category="ACH", + end=parse_datetime("2019-12-27T18:11:19.117Z"), + ending_before="ending_before", + financial_account_token="182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + page_size=1, + result=["APPROVED"], + starting_after="starting_after", + status=["DECLINED"], + ) + assert_matches_type(AsyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + @parametrize + async def test_raw_response_list(self, async_client: AsyncLithic) -> None: + response = await async_client.account_activity.with_raw_response.list() + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + account_activity = response.parse() + assert_matches_type(AsyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + @parametrize + async def test_streaming_response_list(self, async_client: AsyncLithic) -> None: + async with async_client.account_activity.with_streaming_response.list() as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + account_activity = await response.parse() + assert_matches_type(AsyncCursorPage[AccountActivityListResponse], account_activity, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_method_retrieve_transaction(self, async_client: AsyncLithic) -> None: + account_activity = await async_client.account_activity.retrieve_transaction( + "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + ) + assert_matches_type(AccountActivityRetrieveTransactionResponse, account_activity, path=["response"]) + + @parametrize + async def test_raw_response_retrieve_transaction(self, async_client: AsyncLithic) -> None: + response = await async_client.account_activity.with_raw_response.retrieve_transaction( + "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + ) + + assert response.is_closed is True + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + account_activity = response.parse() + assert_matches_type(AccountActivityRetrieveTransactionResponse, account_activity, path=["response"]) + + @parametrize + async def test_streaming_response_retrieve_transaction(self, async_client: AsyncLithic) -> None: + async with async_client.account_activity.with_streaming_response.retrieve_transaction( + "182bd5e5-6e1a-4fe4-a799-aa6d9a6ab26e", + ) as response: + assert not response.is_closed + assert response.http_request.headers.get("X-Stainless-Lang") == "python" + + account_activity = await response.parse() + assert_matches_type(AccountActivityRetrieveTransactionResponse, account_activity, path=["response"]) + + assert cast(Any, response.is_closed) is True + + @parametrize + async def test_path_params_retrieve_transaction(self, async_client: AsyncLithic) -> None: + with pytest.raises(ValueError, match=r"Expected a non-empty value for `transaction_token` but received ''"): + await async_client.account_activity.with_raw_response.retrieve_transaction( + "", + ) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy