From a432e3efc0fc873ef9a7a2057b7fe7a321ca2678 Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Tue, 13 Jan 2026 08:26:57 +0000 Subject: [PATCH 1/2] ## Python SDK Changes: * `gr4vy.payment-links.list()`: `response.items.[].installment_count` **Added** * `gr4vy.payment-links.create()`: * `request.installment_count` **Added** * `response.installment_count` **Added** * `gr4vy.payment-links.get()`: `response.installment_count` **Added** --- .speakeasy/gen.lock | 55 ++++++++++++++------------- .speakeasy/gen.yaml | 2 +- .speakeasy/workflow.lock | 14 +++---- RELEASES.md | 12 +++++- docs/models/paymentlink.md | 3 +- docs/models/paymentlinkcreate.md | 3 +- docs/sdks/paymentlinkssdk/README.md | 1 + pyproject.toml | 2 +- src/gr4vy/_version.py | 6 +-- src/gr4vy/models/paymentlink.py | 7 ++++ src/gr4vy/models/paymentlinkcreate.py | 7 ++++ src/gr4vy/payment_links_sdk.py | 6 +++ src/gr4vy/utils/requestbodies.py | 6 +-- 13 files changed, 79 insertions(+), 45 deletions(-) diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 337f466..8404479 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,24 +1,24 @@ lockVersion: 2.0.0 id: 833c6a67-4a4a-4ef1-ba24-165a29264e4a management: - docChecksum: 90099f32b796d54c90b38f7a03deddff + docChecksum: c085668c13bc2030b2e9476716daf3ca docVersion: 1.0.0 - speakeasyVersion: 1.684.0 - generationVersion: 2.793.0 - releaseVersion: 1.10.9 - configChecksum: ca8c445f86a62134c3b356a2cf9f86bd + speakeasyVersion: 1.685.0 + generationVersion: 2.794.1 + releaseVersion: 1.10.10 + configChecksum: 3a4c7ffc22702ff72807fbd8861043a1 repoURL: https://github.com/gr4vy/gr4vy-python.git installationURL: https://github.com/gr4vy/gr4vy-python.git published: true persistentEdits: - generation_id: c6a6b7d8-1ecc-4160-96ac-b320819e3514 - pristine_commit_hash: de1cf4b99e240924142e97418f27ebb89e2ec266 - pristine_tree_hash: e1bfc31d99cee706d8d08ce506de99a4837519ac + generation_id: 6372c37c-303e-464e-ac20-d251cba44ce3 + pristine_commit_hash: 4665cf9b6666a5976a1046befd82bd32b4b720ee + pristine_tree_hash: 383ab4d2fd5992ddc76f21fee5de88be8e3e4397 features: python: additionalDependencies: 1.0.0 constsAndDefaults: 1.0.5 - core: 5.23.17 + core: 5.23.18 defaultEnabledRetries: 0.2.0 enumUnions: 0.1.0 envVarSecurityUsage: 0.3.2 @@ -1384,12 +1384,12 @@ trackedFiles: pristine_git_object: e9ed05f71f900dc8b1ff14742840ef837e8e5a28 docs/models/paymentlink.md: id: b2924fda489a - last_write_checksum: sha1:78bb9a929b8227692c24ed2d4fc5f1aa697490e0 - pristine_git_object: 9083c04978f575f9ec70c43daae3025f7141c31b + last_write_checksum: sha1:6bcfc91153c323a7b57852061f5753e47a1d6010 + pristine_git_object: bd29b475428aa8a3b87d959b1940991efeb9be75 docs/models/paymentlinkcreate.md: id: f540e80d1489 - last_write_checksum: sha1:faaee460f01f14dd7f5364ae8b68de22be01f4bd - pristine_git_object: 9df25a043910eca5dad37511322f6c246b87af19 + last_write_checksum: sha1:814f9137d9b1f218e93e5be40ff33844aafa8b23 + pristine_git_object: 546d9ecb154785be155a7c3acb107a41c760a920 docs/models/paymentlinks.md: id: 174693489d9c last_write_checksum: sha1:b3324bd45e4ac6987b7f474bbffb23a5dbe4256d @@ -2148,8 +2148,8 @@ trackedFiles: pristine_git_object: 78e4c5293dd0b9d3491e6768e96ba50ef15c890c docs/sdks/paymentlinkssdk/README.md: id: 443d95cf5bd0 - last_write_checksum: sha1:ae45470495a773e8009cff77310a3c2bbd52ed19 - pristine_git_object: a261230beff1c2d4710448e56ff78306720b76a8 + last_write_checksum: sha1:a26c07320273f81e3d100d088d7c90e6ee85ebee + pristine_git_object: b69aac433111a5a0fc87b5e8006785da290e121a docs/sdks/paymentmethodsnetworktokens/README.md: id: badc1bd37263 last_write_checksum: sha1:f651897772dc723efaccab6353ae53adfbea3b50 @@ -2220,8 +2220,8 @@ trackedFiles: pristine_git_object: e8cd3e85682cd3d489cf3c5be75a0563d0c9f4bf pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:0e3b1cc32e136fa5cad0cdbc0fae314e9eac3276 - pristine_git_object: fea54369c1e37ab9b79ef87281e861e5afef2ded + last_write_checksum: sha1:afd5110208203e47713187f7b09a02dcdbf87852 + pristine_git_object: 9bfbfc25ff5da13dbfaca1ca6009f2e13e339213 scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:63a92abbd1de3323613f0d4c1ae4412076577710 @@ -2248,8 +2248,8 @@ trackedFiles: pristine_git_object: 83a0d00f9b5b1a6d837643a32bfd0f82cd4f98ce src/gr4vy/_version.py: id: 1b5ad1da47aa - last_write_checksum: sha1:9cb596ae033f064e12d8c64c299f2b12af02d703 - pristine_git_object: 6b1424c9ec08c6eb709e541e688717b63028fcfd + last_write_checksum: sha1:719b22a042358f767cefb1da3d51b4b805d82078 + pristine_git_object: ef6e6dd3aa781cf1bb4a5980a0c83090e1a17b79 src/gr4vy/account_updater.py: id: 6dc8f39e2fb9 last_write_checksum: sha1:fabc79a59dd06fb927ce2d834fbafbcad5836a4b @@ -3296,12 +3296,12 @@ trackedFiles: pristine_git_object: 9646893c48a46826a713ec9120d30dd1292639d1 src/gr4vy/models/paymentlink.py: id: 47106b89b1d1 - last_write_checksum: sha1:1578b4c6544969f58195e47f99a9c651e32f9067 - pristine_git_object: 49b2e9fae59b3c6ce7031348707cb0f64adbe94e + last_write_checksum: sha1:1db62970838292f6ead8be1334b388cb25a34df0 + pristine_git_object: 51d0e1cbdd0132040ae5ab6ded9dc43356491418 src/gr4vy/models/paymentlinkcreate.py: id: fe02bafa886f - last_write_checksum: sha1:46e657dee315095cec7b19b5096f537a1d80f8f0 - pristine_git_object: 54c085afc01dc1fdbc06ee4e20b2707061c2d417 + last_write_checksum: sha1:3659d042316bf2ea8cab033c77b98d337b341b04 + pristine_git_object: 34536479448bb9e705a85a0201f4f9ee3d512e7e src/gr4vy/models/paymentlinks.py: id: 7093cb5f2185 last_write_checksum: sha1:6ac9963eaa58afff95a7e0b8b0b1893290c54c4b @@ -3864,8 +3864,8 @@ trackedFiles: pristine_git_object: de10650fe08f836cbe63a7a0ab80fa438eca6661 src/gr4vy/payment_links_sdk.py: id: 86fd2e455dc3 - last_write_checksum: sha1:17b0039d89541647adccf2af00c8e52e006b0e9a - pristine_git_object: c3fd52cfdec5a502b74cbc97c26da56f0924390f + last_write_checksum: sha1:35dfb73b0be7ecdb54fc174860ee6d9aa7d3ec76 + pristine_git_object: 3eecb11a8bf04065e14b12e91fc69fddff0cdbef src/gr4vy/payment_methods_network_tokens.py: id: 18b5696a2982 last_write_checksum: sha1:504c6f0fc8b006dfc56531ad1c8150f0efdb4265 @@ -3984,8 +3984,8 @@ trackedFiles: pristine_git_object: c04e0db82b68eca041f2cb2614d748fbac80fd41 src/gr4vy/utils/requestbodies.py: id: d60649fdc471 - last_write_checksum: sha1:41885982c1cc10dc28ab857bdb22c1014612b7b3 - pristine_git_object: 9215e4531ce128ac665fc6ceddd9b9e7062db654 + last_write_checksum: sha1:41e2d2d2d3ecc394c8122ca4d4b85e1c3e03f054 + pristine_git_object: 1de32b6d26f46590232f398fdba6ce0072f1659c src/gr4vy/utils/retries.py: id: c486412ce323 last_write_checksum: sha1:5b97ac4f59357d70c2529975d50364c88bcad607 @@ -7478,6 +7478,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.payment-links.list()`: `response.items.[].installment_count` **Added**\n* `gr4vy.payment-links.create()`: \n * `request.installment_count` **Added**\n * `response.installment_count` **Added**\n* `gr4vy.payment-links.get()`: `response.installment_count` **Added**\n" generatedFiles: - .gitattributes - .vscode/settings.json diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index b15ac5d..b966a42 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -26,7 +26,7 @@ generation: generateNewTests: false skipResponseBodyAssertions: false python: - version: 1.10.9 + version: 1.10.10 additionalDependencies: dev: freezegun: ^1.5.1 diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index f48354f..2198e58 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -1,21 +1,21 @@ -speakeasyVersion: 1.684.0 +speakeasyVersion: 1.685.0 sources: openapi: sourceNamespace: openapi - sourceRevisionDigest: sha256:40bcd1820d1ce60afa46f81b7377fccb54ce5c457e65d3d507694358b4a32371 - sourceBlobDigest: sha256:788e6a9330f806b1d19c8622dfba103cec391567f575b8d4bc2f038548c0ca86 + sourceRevisionDigest: sha256:70f0fa25987d6517e76aed6746f33def38f27a1dcc3c05f0c8dbab0bfbaa773a + sourceBlobDigest: sha256:e4f78fe6567c8e4da16544ef5d236c8435a72beafa14995b381fcecd3479ac1c tags: - latest - - speakeasy-sdk-regen-1768244931 + - speakeasy-sdk-regen-1768292720 - 1.0.0 targets: python: source: openapi sourceNamespace: openapi - sourceRevisionDigest: sha256:40bcd1820d1ce60afa46f81b7377fccb54ce5c457e65d3d507694358b4a32371 - sourceBlobDigest: sha256:788e6a9330f806b1d19c8622dfba103cec391567f575b8d4bc2f038548c0ca86 + sourceRevisionDigest: sha256:70f0fa25987d6517e76aed6746f33def38f27a1dcc3c05f0c8dbab0bfbaa773a + sourceBlobDigest: sha256:e4f78fe6567c8e4da16544ef5d236c8435a72beafa14995b381fcecd3479ac1c codeSamplesNamespace: openapi-python-code-samples - codeSamplesRevisionDigest: sha256:b34bfdfbc959a364aa98c52f9e0fac23b5f98f6762ecd84f2ba311624b3ed223 + codeSamplesRevisionDigest: sha256:12aae9352990f96861ca5c941bffa33ec8cf50f1b0ce38dfa4b30985d9674bd8 workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/RELEASES.md b/RELEASES.md index c1e4321..5cdf693 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1308,4 +1308,14 @@ Based on: ### Generated - [python v1.10.9] . ### Releases -- [PyPI v1.10.9] https://pypi.org/project/gr4vy/1.10.9 - . \ No newline at end of file +- [PyPI v1.10.9] https://pypi.org/project/gr4vy/1.10.9 - . + +## 2026-01-13 08:25:02 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.685.0 (2.794.1) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.10.10] . +### Releases +- [PyPI v1.10.10] https://pypi.org/project/gr4vy/1.10.10 - . \ No newline at end of file diff --git a/docs/models/paymentlink.md b/docs/models/paymentlink.md index 9083c04..bd29b47 100644 --- a/docs/models/paymentlink.md +++ b/docs/models/paymentlink.md @@ -34,4 +34,5 @@ | `shipping_details` | [OptionalNullable[models.ShippingDetails]](../models/shippingdetails.md) | :heavy_minus_sign: | The shipping details for the payment link. | | | `connection_options` | Dict[str, Dict[str, *Any*]] | :heavy_minus_sign: | The connection options for the payment link. | | | `store` | *Optional[bool]* | :heavy_minus_sign: | Whether the payment method was stored. | | -| `buyer_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the buyer to associate with the stored payment method. | a1b2c3d4-5678-90ab-cdef-1234567890ab | \ No newline at end of file +| `buyer_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the buyer to associate with the stored payment method. | a1b2c3d4-5678-90ab-cdef-1234567890ab | +| `installment_count` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of installments a buyer is required to make. | | \ No newline at end of file diff --git a/docs/models/paymentlinkcreate.md b/docs/models/paymentlinkcreate.md index 9df25a0..546d9ec 100644 --- a/docs/models/paymentlinkcreate.md +++ b/docs/models/paymentlinkcreate.md @@ -27,4 +27,5 @@ | `metadata` | Dict[str, *Any*] | :heavy_minus_sign: | Arbitrary metadata for the payment link. | {
"order_id": "ORD-12345"
} | | `payment_source` | [Optional[models.TransactionPaymentSource]](../models/transactionpaymentsource.md) | :heavy_minus_sign: | The way payment method information made it to this transaction. | | | `store` | *Optional[bool]* | :heavy_minus_sign: | Whether to store the payment method for future use. | true | -| `buyer_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the buyer to associate the payment method with. Note: When `buyer_id` is provided, the payment link should be treated as a secret as it will allow the user to manage payment methods for the associated buyer. | a1b2c3d4-5678-90ab-cdef-1234567890ab | \ No newline at end of file +| `buyer_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the buyer to associate the payment method with. Note: When `buyer_id` is provided, the payment link should be treated as a secret as it will allow the user to manage payment methods for the associated buyer. | a1b2c3d4-5678-90ab-cdef-1234567890ab | +| `installment_count` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of installments a buyer is required to make. | | \ No newline at end of file diff --git a/docs/sdks/paymentlinkssdk/README.md b/docs/sdks/paymentlinkssdk/README.md index a261230..b69aac4 100644 --- a/docs/sdks/paymentlinkssdk/README.md +++ b/docs/sdks/paymentlinkssdk/README.md @@ -61,6 +61,7 @@ with Gr4vy( | `payment_source` | [Optional[models.TransactionPaymentSource]](../../models/transactionpaymentsource.md) | :heavy_minus_sign: | The way payment method information made it to this transaction. | | | `store` | *Optional[bool]* | :heavy_minus_sign: | Whether to store the payment method for future use. | true | | `buyer_id` | *OptionalNullable[str]* | :heavy_minus_sign: | The ID of the buyer to associate the payment method with. Note: When `buyer_id` is provided, the payment link should be treated as a secret as it will allow the user to manage payment methods for the associated buyer. | a1b2c3d4-5678-90ab-cdef-1234567890ab | +| `installment_count` | *OptionalNullable[int]* | :heavy_minus_sign: | The number of installments a buyer is required to make. | | | `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.md) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | | ### Response diff --git a/pyproject.toml b/pyproject.toml index fea5436..9bfbfc2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "gr4vy" -version = "1.10.9" +version = "1.10.10" 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 6b1424c..ef6e6dd 100644 --- a/src/gr4vy/_version.py +++ b/src/gr4vy/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "gr4vy" -__version__: str = "1.10.9" +__version__: str = "1.10.10" __openapi_doc_version__: str = "1.0.0" -__gen_version__: str = "2.793.0" -__user_agent__: str = "speakeasy-sdk/python 1.10.9 2.793.0 1.0.0 gr4vy" +__gen_version__: str = "2.794.1" +__user_agent__: str = "speakeasy-sdk/python 1.10.10 2.794.1 1.0.0 gr4vy" try: if __package__ is not None: diff --git a/src/gr4vy/models/paymentlink.py b/src/gr4vy/models/paymentlink.py index 49b2e9f..51d0e1c 100644 --- a/src/gr4vy/models/paymentlink.py +++ b/src/gr4vy/models/paymentlink.py @@ -77,6 +77,8 @@ class PaymentLinkTypedDict(TypedDict): r"""Whether the payment method was stored.""" buyer_id: NotRequired[Nullable[str]] r"""The ID of the buyer to associate with the stored payment method.""" + installment_count: NotRequired[Nullable[int]] + r"""The number of installments a buyer is required to make.""" class PaymentLink(BaseModel): @@ -174,6 +176,9 @@ class PaymentLink(BaseModel): buyer_id: OptionalNullable[str] = UNSET r"""The ID of the buyer to associate with the stored payment method.""" + installment_count: OptionalNullable[int] = UNSET + r"""The number of installments a buyer is required to make.""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ @@ -196,6 +201,7 @@ def serialize_model(self, handler): "connection_options", "store", "buyer_id", + "installment_count", ] nullable_fields = [ "expires_at", @@ -216,6 +222,7 @@ def serialize_model(self, handler): "shipping_details", "connection_options", "buyer_id", + "installment_count", ] null_default_fields = [] diff --git a/src/gr4vy/models/paymentlinkcreate.py b/src/gr4vy/models/paymentlinkcreate.py index 54c085a..3453647 100644 --- a/src/gr4vy/models/paymentlinkcreate.py +++ b/src/gr4vy/models/paymentlinkcreate.py @@ -63,6 +63,8 @@ class PaymentLinkCreateTypedDict(TypedDict): r"""Whether to store the payment method for future use.""" buyer_id: NotRequired[Nullable[str]] r"""The ID of the buyer to associate the payment method with. Note: When `buyer_id` is provided, the payment link should be treated as a secret as it will allow the user to manage payment methods for the associated buyer.""" + installment_count: NotRequired[Nullable[int]] + r"""The number of installments a buyer is required to make.""" class PaymentLinkCreate(BaseModel): @@ -134,6 +136,9 @@ class PaymentLinkCreate(BaseModel): buyer_id: OptionalNullable[str] = UNSET r"""The ID of the buyer to associate the payment method with. Note: When `buyer_id` is provided, the payment link should be treated as a secret as it will allow the user to manage payment methods for the associated buyer.""" + installment_count: OptionalNullable[int] = UNSET + r"""The number of installments a buyer is required to make.""" + @model_serializer(mode="wrap") def serialize_model(self, handler): optional_fields = [ @@ -157,6 +162,7 @@ def serialize_model(self, handler): "payment_source", "store", "buyer_id", + "installment_count", ] nullable_fields = [ "buyer", @@ -176,6 +182,7 @@ def serialize_model(self, handler): "cart_items", "metadata", "buyer_id", + "installment_count", ] null_default_fields = [] diff --git a/src/gr4vy/payment_links_sdk.py b/src/gr4vy/payment_links_sdk.py index c3fd52c..3eecb11 100644 --- a/src/gr4vy/payment_links_sdk.py +++ b/src/gr4vy/payment_links_sdk.py @@ -50,6 +50,7 @@ def create( payment_source: Optional[models.TransactionPaymentSource] = None, store: Optional[bool] = False, buyer_id: OptionalNullable[str] = UNSET, + installment_count: OptionalNullable[int] = UNSET, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -83,6 +84,7 @@ def create( :param payment_source: The way payment method information made it to this transaction. :param store: Whether to store the payment method for future use. :param buyer_id: The ID of the buyer to associate the payment method with. Note: When `buyer_id` is provided, the payment link should be treated as a secret as it will allow the user to manage payment methods for the associated buyer. + :param installment_count: The number of installments a buyer is required to make. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -133,6 +135,7 @@ def create( payment_source=payment_source, store=store, buyer_id=buyer_id, + installment_count=installment_count, ), ) @@ -289,6 +292,7 @@ async def create_async( payment_source: Optional[models.TransactionPaymentSource] = None, store: Optional[bool] = False, buyer_id: OptionalNullable[str] = UNSET, + installment_count: OptionalNullable[int] = UNSET, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, @@ -322,6 +326,7 @@ async def create_async( :param payment_source: The way payment method information made it to this transaction. :param store: Whether to store the payment method for future use. :param buyer_id: The ID of the buyer to associate the payment method with. Note: When `buyer_id` is provided, the payment link should be treated as a secret as it will allow the user to manage payment methods for the associated buyer. + :param installment_count: The number of installments a buyer is required to make. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds @@ -372,6 +377,7 @@ async def create_async( payment_source=payment_source, store=store, buyer_id=buyer_id, + installment_count=installment_count, ), ) diff --git a/src/gr4vy/utils/requestbodies.py b/src/gr4vy/utils/requestbodies.py index 9215e45..1de32b6 100644 --- a/src/gr4vy/utils/requestbodies.py +++ b/src/gr4vy/utils/requestbodies.py @@ -44,15 +44,15 @@ def serialize_request_body( serialized_request_body = SerializedRequestBody(media_type) - if re.match(r"(application|text)\/([^+]+\+)*json.*", media_type) is not None: + if re.match(r"^(application|text)\/([^+]+\+)*json.*", media_type) is not None: serialized_request_body.content = marshal_json(request_body, request_body_type) - elif re.match(r"multipart\/.*", media_type) is not None: + elif re.match(r"^multipart\/.*", media_type) is not None: ( serialized_request_body.media_type, serialized_request_body.data, serialized_request_body.files, ) = serialize_multipart_form(media_type, request_body) - elif re.match(r"application\/x-www-form-urlencoded.*", media_type) is not None: + elif re.match(r"^application\/x-www-form-urlencoded.*", media_type) is not None: serialized_request_body.data = serialize_form_data(request_body) elif isinstance(request_body, (bytes, bytearray, io.BytesIO, io.BufferedReader)): serialized_request_body.content = request_body From bb1d63bfd35a63852edca9c64a2ba9a818430e06 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Tue, 13 Jan 2026 08:27:06 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow