diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index b50b26ae..1f8441e3 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,19 +1,19 @@ lockVersion: 2.0.0 id: 833c6a67-4a4a-4ef1-ba24-165a29264e4a management: - docChecksum: 9faf39793edec13a55a217705a2a6fd9 + docChecksum: 4fdb818a59991531ca2894adabab5124 docVersion: 1.0.0 - speakeasyVersion: 1.778.0 - generationVersion: 2.904.2 - releaseVersion: 2.1.10 - configChecksum: cb5bfdcdb4073015499b550983b99c6d + speakeasyVersion: 1.780.0 + generationVersion: 2.906.0 + releaseVersion: 2.1.11 + configChecksum: a4b2b1d859362c5d0ba2efed3fa1da20 repoURL: https://github.com/gr4vy/gr4vy-python.git installationURL: https://github.com/gr4vy/gr4vy-python.git published: true persistentEdits: - generation_id: e2a5a013-c423-4648-ae85-16bdd9395ccc - pristine_commit_hash: 9c6ca3bec58bb624b861e6639006e566e364f6f7 - pristine_tree_hash: c4d370e9a1a26c73f6e57f454d74e6c21ca88993 + generation_id: f547f727-5aaa-4fc9-86c4-09adccdb4679 + pristine_commit_hash: b93b03e3455dd717ed22dce7633ecd6a07c87f57 + pristine_tree_hash: 0176ae0d72f589968c845b6edc780bedec34163f features: python: additionalDependencies: 1.1.0 @@ -37,7 +37,7 @@ features: openEnums: 1.0.4 pagination: 3.0.10 responseFormat: 1.1.0 - retries: 3.0.5 + retries: 3.0.6 sdkHooks: 1.2.1 serverIDs: 3.0.0 unions: 3.1.6 @@ -180,8 +180,8 @@ trackedFiles: pristine_git_object: 78276b8752601503bc20e0389189789ab1189858 docs/models/adyencardoptions.md: id: b4250440538b - last_write_checksum: sha1:008378be8d8e3e2329c8dd0c59178f202f7179aa - pristine_git_object: 253da576995744126f9abbd72f5bf0b49bf5e241 + last_write_checksum: sha1:ab1c9f15360ff7aa4c757bc696b5ed7b173aba8e + pristine_git_object: 0c9d5c1c730aa4e336a1b5d647d4d61e30d078d3 docs/models/adyenoptions.md: id: 9dae80e273ed last_write_checksum: sha1:6f471957fa79997ed800b9886295914c2ab1e3c3 @@ -2680,8 +2680,8 @@ trackedFiles: pristine_git_object: cb9c15d314c1930557401074329ed7a737147919 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:909346221099dc094aef858f0510886bf78faa7a - pristine_git_object: 4102cafa82114c58f84419763c2b574bc61edab2 + last_write_checksum: sha1:4dfc7696461275d90ed8c5f62c98ced4cd873c58 + pristine_git_object: 871f02fd43a8f388f4a5509158f0d2cf7989f3e6 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:63a92abbd1de3323613f0d4c1ae4412076577710 @@ -2708,8 +2708,8 @@ trackedFiles: pristine_git_object: 83a0d00f9b5b1a6d837643a32bfd0f82cd4f98ce src/gr4vy/_version.py: id: 1b5ad1da47aa - last_write_checksum: sha1:5a90a65ce589939a6e71a662ed45b09a041f2233 - pristine_git_object: 7432aa522ee4efc6892220c6f91fd1e3237a9792 + last_write_checksum: sha1:8be4fd492a00e6633d02cc48f883750f4987e7f2 + pristine_git_object: 14eac953319cb12c29b0b823c4d4c3184a13eedb src/gr4vy/account_updater.py: id: 6dc8f39e2fb9 last_write_checksum: sha1:fabc79a59dd06fb927ce2d834fbafbcad5836a4b @@ -2920,8 +2920,8 @@ trackedFiles: pristine_git_object: 6e326e646ca00e7e57cad5b8bbc0fd793b8ef2a9 src/gr4vy/models/adyencardoptions.py: id: a85776b081fa - last_write_checksum: sha1:92b0cb1fdc76fa899f4bdd47c9f1bb18b49c799d - pristine_git_object: 75b3312eff478ce8c7d40993b2ec5b0540bc2742 + last_write_checksum: sha1:0e0c9e306bc17d25ec77ab03186cca9c912a4423 + pristine_git_object: 59caa6e17acaacae5ef94306ea8d748e741802ea src/gr4vy/models/adyenoptions.py: id: 77d460c16e14 last_write_checksum: sha1:b61eb557bdf7f70041adeee65b61314a283da14d @@ -4772,8 +4772,8 @@ trackedFiles: pristine_git_object: 591415af8e64baa410627b507d2740afb5387d13 src/gr4vy/utils/retries.py: id: c486412ce323 - last_write_checksum: sha1:471372f5c5d1dd5583239c9cf3c75f1b636e5d87 - pristine_git_object: af07d4e941007af4213c5ec9047ef8a2fca04e5e + last_write_checksum: sha1:9fcb404e0a5113634df964b4f393ba4eea5a76f3 + pristine_git_object: bab2066f128973f7a38a94ccc5b378bd849a3cd9 src/gr4vy/utils/security.py: id: 648156d4ba48 last_write_checksum: sha1:8f2a2aef55d9cf6eb91a7a752d3b22ff83e98312 @@ -8751,7 +8751,7 @@ examples: application/json: {"type": "error", "code": "gateway_timeout", "status": 504, "message": "Request could not be processed"} examplesVersion: 1.0.2 generatedTests: {} -releaseNotes: "## Python SDK Changes:\n* `gr4vy.buyers.payment_methods.list()`: `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.list()`: `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.create()`: \n * `request_body.union(RedirectPaymentMethodCreate).method.enum(cashappafterpay)` **Added**\n * `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.get()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_methods.update()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.list()`: \n * `request.method` **Changed**\n * `response.items[].payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.create()`: \n * `request` **Changed**\n * `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.get()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.update()`: \n * `request.connection_options.adyen_cashappafterpay` **Added**\n * `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.capture()`: `response.union(TransactionCapture).transaction.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.void()`: `response.union(Transaction).payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.cancel()`: `response.transaction.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.transactions.sync()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_service_definitions.list()`: `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_service_definitions.get()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.list()`: \n * `request.method` **Changed**\n * `response.items[].method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.create()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.get()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_services.update()`: `response.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payouts.list()`: `response.items[].payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payouts.create()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payouts.get()`: `response.payment_method.method.enum(cashappafterpay)` **Added**\n* `gr4vy.payment_links.create()`: \n * `request.connection_options.adyen_cashappafterpay` **Added**\n" +releaseNotes: "## Python SDK Changes:\n* `gr4vy.transactions.create()`: \n * `request.connection_options.adyen_card` **Changed**\n* `gr4vy.transactions.update()`: \n * `request.connection_options.adyen_card` **Changed**\n* `gr4vy.payment_links.create()`: \n * `request.connection_options.adyen_card` **Changed**\n" generatedFiles: - .gitattributes - .vscode/settings.json diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 0477d593..1dca2425 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -29,7 +29,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false python: - version: 2.1.10 + version: 2.1.11 additionalDependencies: dev: freezegun: ^1.5.1 @@ -56,6 +56,7 @@ python: enableCustomCodeRegions: false enumFormat: union envVarPrefix: GR4VY + errorSchemaValidation: true eventStreamClassNames: async: EventStreamAsync sync: EventStream diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index f321139c..1d348b27 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,9 +1,9 @@ -speakeasyVersion: 1.778.0 +speakeasyVersion: 1.780.0 sources: openapi: sourceNamespace: openapi - sourceRevisionDigest: sha256:68ce4128cf61e4d0ad003743a0721d885dc8f71fc7c2bcc3ee74663fceeeeae5 - sourceBlobDigest: sha256:c753189022bd1b9b86045723686a8bfbbc5d69acaa9a5a0c36b411c076c55b37 + sourceRevisionDigest: sha256:833eb24386a201c5dfbd2531e47afead6c4b53966cebad471038ea9ce767289b + sourceBlobDigest: sha256:28c33078b578408e783911018cd8093eaf98799884febe9df73c9dc7fa422213 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: python: source: openapi sourceNamespace: openapi - sourceRevisionDigest: sha256:68ce4128cf61e4d0ad003743a0721d885dc8f71fc7c2bcc3ee74663fceeeeae5 - sourceBlobDigest: sha256:c753189022bd1b9b86045723686a8bfbbc5d69acaa9a5a0c36b411c076c55b37 + sourceRevisionDigest: sha256:833eb24386a201c5dfbd2531e47afead6c4b53966cebad471038ea9ce767289b + sourceBlobDigest: sha256:28c33078b578408e783911018cd8093eaf98799884febe9df73c9dc7fa422213 codeSamplesNamespace: openapi-python-code-samples - codeSamplesRevisionDigest: sha256:d18fbde68c150c9e2abff807dd3818ad4f90de99877e41e6fc442e1a8d48b1e6 + codeSamplesRevisionDigest: sha256:cb565749e8866597ba4c8fbe7fc9e5ac5c51c467a8eb1b644aba419c4a059b8d workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/RELEASES.md b/RELEASES.md index c664968e..aefe76d5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -2018,4 +2018,14 @@ Based on: ### Generated - [python v2.1.10] . ### Releases -- [PyPI v2.1.10] https://pypi.org/project/gr4vy/2.1.10 - . \ No newline at end of file +- [PyPI v2.1.10] https://pypi.org/project/gr4vy/2.1.10 - . + +## 2026-06-16 15:24:29 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.780.0 (2.906.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v2.1.11] . +### Releases +- [PyPI v2.1.11] https://pypi.org/project/gr4vy/2.1.11 - . \ No newline at end of file diff --git a/docs/models/adyencardoptions.md b/docs/models/adyencardoptions.md index 253da576..0c9d5c1c 100644 --- a/docs/models/adyencardoptions.md +++ b/docs/models/adyencardoptions.md @@ -10,4 +10,9 @@ | `additional_data` | Dict[str, *str*] | :heavy_minus_sign: | Passes additional data to the Adyen API when creating a transaction. | {
"subMerchantID": "12345"
} | | `auto_rescue_scenario` | [OptionalNullable[models.AdyenCardAutoRescueScenariosEnum]](../models/adyencardautorescuescenariosenum.md) | :heavy_minus_sign: | The rescue scenario to simulate for a transaction, when `autoRescue` is set to `true`. | AutoRescueSuccessfulFirst | | `window_origin` | *OptionalNullable[str]* | :heavy_minus_sign: | The origin of the window where the payment is initiated, used for 3D Secure authentication. | https://example.com | -| `splits` | [OptionalNullable[models.AdyenSplitsOptions]](../models/adyensplitsoptions.md) | :heavy_minus_sign: | Passes information of splitting payment amounts to the Adyen API. | | \ No newline at end of file +| `splits` | [OptionalNullable[models.AdyenSplitsOptions]](../models/adyensplitsoptions.md) | :heavy_minus_sign: | Passes information of splitting payment amounts to the Adyen API. | | +| `merchant_risk_indicator` | Dict[str, *Any*] | :heavy_minus_sign: | Passes `merchantRiskIndicator` data to Adyen. | | +| `account_info` | Dict[str, *Any*] | :heavy_minus_sign: | Passes `accountInfo` data to Adyen. | | +| `risk_data` | Dict[str, *Any*] | :heavy_minus_sign: | Passes `riskData.customFields` to Adyen. | | +| `three_ds_requestor_challenge_ind` | *OptionalNullable[str]* | :heavy_minus_sign: | Passes `threeDS2RequestData.threeDSRequestorChallengeInd` to Adyen. | | +| `attempt_authentication` | *OptionalNullable[str]* | :heavy_minus_sign: | Passes `authenticationData.attemptAuthentication` to Adyen. | | \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 4102cafa..871f02fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "gr4vy" -version = "2.1.10" +version = "2.1.11" description = "Python Client SDK Generated by Speakeasy." authors = [{ name = "Gr4vy" },] readme = "README-PYPI.md" diff --git a/src/gr4vy/_version.py b/src/gr4vy/_version.py index 7432aa52..14eac953 100644 --- a/src/gr4vy/_version.py +++ b/src/gr4vy/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "gr4vy" -__version__: str = "2.1.10" +__version__: str = "2.1.11" __openapi_doc_version__: str = "1.0.0" -__gen_version__: str = "2.904.2" -__user_agent__: str = "speakeasy-sdk/python 2.1.10 2.904.2 1.0.0 gr4vy" +__gen_version__: str = "2.906.0" +__user_agent__: str = "speakeasy-sdk/python 2.1.11 2.906.0 1.0.0 gr4vy" try: if __package__ is not None: diff --git a/src/gr4vy/models/adyencardoptions.py b/src/gr4vy/models/adyencardoptions.py index 75b3312e..59caa6e1 100644 --- a/src/gr4vy/models/adyencardoptions.py +++ b/src/gr4vy/models/adyencardoptions.py @@ -6,7 +6,7 @@ from gr4vy.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL import pydantic from pydantic import model_serializer -from typing import Dict +from typing import Any, Dict from typing_extensions import Annotated, NotRequired, TypedDict @@ -23,6 +23,16 @@ class AdyenCardOptionsTypedDict(TypedDict): r"""The origin of the window where the payment is initiated, used for 3D Secure authentication.""" splits: NotRequired[Nullable[AdyenSplitsOptionsTypedDict]] r"""Passes information of splitting payment amounts to the Adyen API.""" + merchant_risk_indicator: NotRequired[Nullable[Dict[str, Any]]] + r"""Passes `merchantRiskIndicator` data to Adyen.""" + account_info: NotRequired[Nullable[Dict[str, Any]]] + r"""Passes `accountInfo` data to Adyen.""" + risk_data: NotRequired[Nullable[Dict[str, Any]]] + r"""Passes `riskData.customFields` to Adyen.""" + three_ds_requestor_challenge_ind: NotRequired[Nullable[str]] + r"""Passes `threeDS2RequestData.threeDSRequestorChallengeInd` to Adyen.""" + attempt_authentication: NotRequired[Nullable[str]] + r"""Passes `authenticationData.attemptAuthentication` to Adyen.""" class AdyenCardOptions(BaseModel): @@ -53,6 +63,31 @@ class AdyenCardOptions(BaseModel): splits: OptionalNullable[AdyenSplitsOptions] = UNSET r"""Passes information of splitting payment amounts to the Adyen API.""" + merchant_risk_indicator: Annotated[ + OptionalNullable[Dict[str, Any]], pydantic.Field(alias="merchantRiskIndicator") + ] = UNSET + r"""Passes `merchantRiskIndicator` data to Adyen.""" + + account_info: Annotated[ + OptionalNullable[Dict[str, Any]], pydantic.Field(alias="accountInfo") + ] = UNSET + r"""Passes `accountInfo` data to Adyen.""" + + risk_data: Annotated[ + OptionalNullable[Dict[str, Any]], pydantic.Field(alias="riskData") + ] = UNSET + r"""Passes `riskData.customFields` to Adyen.""" + + three_ds_requestor_challenge_ind: Annotated[ + OptionalNullable[str], pydantic.Field(alias="threeDSRequestorChallengeInd") + ] = UNSET + r"""Passes `threeDS2RequestData.threeDSRequestorChallengeInd` to Adyen.""" + + attempt_authentication: Annotated[ + OptionalNullable[str], pydantic.Field(alias="attemptAuthentication") + ] = UNSET + r"""Passes `authenticationData.attemptAuthentication` to Adyen.""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = set( @@ -63,6 +98,11 @@ def serialize_model(self, handler): "autoRescueScenario", "window_origin", "splits", + "merchantRiskIndicator", + "accountInfo", + "riskData", + "threeDSRequestorChallengeInd", + "attemptAuthentication", ] ) nullable_fields = set( @@ -73,6 +113,11 @@ def serialize_model(self, handler): "autoRescueScenario", "window_origin", "splits", + "merchantRiskIndicator", + "accountInfo", + "riskData", + "threeDSRequestorChallengeInd", + "attemptAuthentication", ] ) serialized = handler(self) diff --git a/src/gr4vy/utils/retries.py b/src/gr4vy/utils/retries.py index af07d4e9..bab2066f 100644 --- a/src/gr4vy/utils/retries.py +++ b/src/gr4vy/utils/retries.py @@ -93,6 +93,21 @@ def _parse_retry_after_header(response: httpx.Response) -> Optional[int]: return None +def _parse_retry_after_ms_header(response: httpx.Response) -> Optional[int]: + retry_after_ms_header = response.headers.get("retry-after-ms") + if not retry_after_ms_header: + return None + + try: + milliseconds = float(retry_after_ms_header) + if milliseconds >= 0: + return round(milliseconds) + except (OverflowError, ValueError): + pass + + return None + + def _get_sleep_interval( exception: Exception, initial_interval: int, @@ -234,6 +249,10 @@ def retry_with_backoff( raise + if isinstance(exception, TemporaryError): + retry_after_ms = _parse_retry_after_ms_header(exception.response) + if retry_after_ms is not None: + exception.retry_after = retry_after_ms sleep = _get_sleep_interval( exception, initial_interval, max_interval, exponent, retries ) @@ -264,6 +283,10 @@ async def retry_with_backoff_async( raise + if isinstance(exception, TemporaryError): + retry_after_ms = _parse_retry_after_ms_header(exception.response) + if retry_after_ms is not None: + exception.retry_after = retry_after_ms sleep = _get_sleep_interval( exception, initial_interval, max_interval, exponent, retries )