From e692b325d67a43fa42b2478c66985533c2339b98 Mon Sep 17 00:00:00 2001 From: RogelioLpz Date: Wed, 24 Jun 2026 09:46:36 -0600 Subject: [PATCH 1/7] session-agent --- cuenca_validations/types/__init__.py | 8 ++++++ cuenca_validations/types/enums.py | 7 +++++ cuenca_validations/types/queries.py | 5 ++++ cuenca_validations/types/requests.py | 40 ++++++++++++++++++++++++++++ cuenca_validations/version.py | 2 +- tests/test_requests.py | 16 +++++++++++ 6 files changed, 77 insertions(+), 1 deletion(-) diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index b5370342..c2fbd895 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -2,6 +2,10 @@ 'AccountUseType', 'AccountQuery', 'Address', + 'AgentQuery', + 'AgentRequest', + 'AgentStatus', + 'AgentUpdateRequest', 'ApiKeyQuery', 'ApiKeyUpdateRequest', 'AuthorizerTransaction', @@ -127,6 +131,7 @@ from .card import StrictPaymentCardNumber from .enums import ( AccountUseType, + AgentStatus, AuthorizerTransaction, BankAccountStatus, CardErrorType, @@ -200,6 +205,7 @@ ) from .queries import ( AccountQuery, + AgentQuery, ApiKeyQuery, BalanceEntryQuery, BankAccountValidationQuery, @@ -223,6 +229,8 @@ WalletTransactionQuery, ) from .requests import ( + AgentRequest, + AgentUpdateRequest, ApiKeyUpdateRequest, BankAccountValidationRequest, BeneficiaryRequest, diff --git a/cuenca_validations/types/enums.py b/cuenca_validations/types/enums.py index f64f01ad..5cd13c1d 100644 --- a/cuenca_validations/types/enums.py +++ b/cuenca_validations/types/enums.py @@ -589,6 +589,13 @@ class SessionType(str, Enum): account_entries = 'session.account_entries' download_file = 'session.download_file' upload_file = 'session.upload_file' + agent = 'session.agent' + + +class AgentStatus(str, Enum): + created = 'created' + succeeded = 'succeeded' + failed = 'failed' class WebhookObject(str, Enum): diff --git a/cuenca_validations/types/queries.py b/cuenca_validations/types/queries.py index 8d641bcf..6f237727 100644 --- a/cuenca_validations/types/queries.py +++ b/cuenca_validations/types/queries.py @@ -15,6 +15,7 @@ from ..typing import DictStrAny from ..validators import sanitize_dict from .enums import ( + AgentStatus, BankAccountStatus, CardFundingType, CardIssuer, @@ -193,6 +194,10 @@ class SessionQuery(QueryParams): type: SessionType +class AgentQuery(QueryParams): + status: Optional[AgentStatus] = None + + class FileQuery(QueryParams): type: Optional[KYCFileType] = None id: Optional[str] = None diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 661db882..3dc7e428 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -18,6 +18,7 @@ from ..types.enums import ( AccountUseType, + AgentStatus, AuthorizerTransaction, CardDesign, CardFundingType, @@ -645,6 +646,45 @@ class SessionRequest(BaseRequest): ) +class AgentRequest(BaseRequest): + phone_number: PhoneNumber + device_info: DictStrAny = Field(default_factory=dict) + model_config = ConfigDict( + json_schema_extra={ + 'example': { + 'phone_number': '+525512345678', + 'device_info': {'client': 'cursor', 'os': 'macOS'}, + } + } + ) + + @field_validator('phone_number', mode='before') + @classmethod + def normalize_phone(cls, v: PhoneNumber) -> str: + return normalize_phone_number(str(v)) + + +class AgentUpdateRequest(BaseRequest): + pairing_code: Optional[str] = None + status: AgentStatus + model_config = ConfigDict( + json_schema_extra={ + 'example': { + 'pairing_code': 'ABC-123', + 'status': 'succeeded', + } + } + ) + + @model_validator(mode='after') + def validate_update(self) -> 'AgentUpdateRequest': + if self.status == AgentStatus.created: + raise ValueError('Invalid status') + if self.status == AgentStatus.succeeded and not self.pairing_code: + raise ValueError('pairing_code is required') + return self + + class EndpointRequest(BaseRequest): url: SerializableHttpUrl events: Optional[list[WebhookEvent]] = None diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index c8942909..48863b13 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.38' +__version__ = '2.1.39.dev0' diff --git a/tests/test_requests.py b/tests/test_requests.py index aba93592..02b362ed 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -2,6 +2,7 @@ from pydantic import ValidationError from pydantic_extra_types.phone_numbers import PhoneNumber +from cuenca_validations.types import AgentStatus, AgentUpdateRequest from cuenca_validations.types.enums import VerificationType from cuenca_validations.types.requests import ( PasswordResetRequest, @@ -123,3 +124,18 @@ def test_update_transfer_request_forbids_extra() -> None: {'status': 'succeeded', 'foo': 'bar'} ) assert 'Extra inputs are not permitted' in str(ex.value) + + +def test_agent_update_request_rejects_created_status() -> None: + with pytest.raises(ValidationError) as exc: + AgentUpdateRequest( + pairing_code='ABC-123', + status=AgentStatus.created, + ) + assert 'Invalid status' in str(exc.value) + + +def test_agent_update_request_succeeded_requires_pairing_code() -> None: + with pytest.raises(ValidationError) as exc: + AgentUpdateRequest(status=AgentStatus.succeeded) + assert 'pairing_code is required' in str(exc.value) From 30458a8c29cc29bb182829038ac86976cfb91726 Mon Sep 17 00:00:00 2001 From: RogelioLpz Date: Wed, 24 Jun 2026 09:48:21 -0600 Subject: [PATCH 2/7] version --- cuenca_validations/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 48863b13..aec0a84c 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.39.dev0' +__version__ = '2.1.39.dev1' From 92c01f1169f2f73ea9190f838510028969b53627 Mon Sep 17 00:00:00 2001 From: RogelioLpz Date: Wed, 24 Jun 2026 14:29:06 -0600 Subject: [PATCH 3/7] changes --- cuenca_validations/types/__init__.py | 2 -- cuenca_validations/types/enums.py | 5 ++--- cuenca_validations/types/requests.py | 24 ++---------------------- cuenca_validations/version.py | 2 +- tests/test_requests.py | 21 +++++++-------------- 5 files changed, 12 insertions(+), 42 deletions(-) diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index c2fbd895..9c7b6067 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -5,7 +5,6 @@ 'AgentQuery', 'AgentRequest', 'AgentStatus', - 'AgentUpdateRequest', 'ApiKeyQuery', 'ApiKeyUpdateRequest', 'AuthorizerTransaction', @@ -230,7 +229,6 @@ ) from .requests import ( AgentRequest, - AgentUpdateRequest, ApiKeyUpdateRequest, BankAccountValidationRequest, BeneficiaryRequest, diff --git a/cuenca_validations/types/enums.py b/cuenca_validations/types/enums.py index 5cd13c1d..cd1e5e59 100644 --- a/cuenca_validations/types/enums.py +++ b/cuenca_validations/types/enums.py @@ -593,9 +593,8 @@ class SessionType(str, Enum): class AgentStatus(str, Enum): - created = 'created' - succeeded = 'succeeded' - failed = 'failed' + active = 'active' + cancelled = 'cancelled' class WebhookObject(str, Enum): diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 3dc7e428..2e5ff98d 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -18,7 +18,6 @@ from ..types.enums import ( AccountUseType, - AgentStatus, AuthorizerTransaction, CardDesign, CardFundingType, @@ -647,11 +646,13 @@ class SessionRequest(BaseRequest): class AgentRequest(BaseRequest): + pairing_code: str phone_number: PhoneNumber device_info: DictStrAny = Field(default_factory=dict) model_config = ConfigDict( json_schema_extra={ 'example': { + 'pairing_code': 'secret_code', 'phone_number': '+525512345678', 'device_info': {'client': 'cursor', 'os': 'macOS'}, } @@ -664,27 +665,6 @@ def normalize_phone(cls, v: PhoneNumber) -> str: return normalize_phone_number(str(v)) -class AgentUpdateRequest(BaseRequest): - pairing_code: Optional[str] = None - status: AgentStatus - model_config = ConfigDict( - json_schema_extra={ - 'example': { - 'pairing_code': 'ABC-123', - 'status': 'succeeded', - } - } - ) - - @model_validator(mode='after') - def validate_update(self) -> 'AgentUpdateRequest': - if self.status == AgentStatus.created: - raise ValueError('Invalid status') - if self.status == AgentStatus.succeeded and not self.pairing_code: - raise ValueError('pairing_code is required') - return self - - class EndpointRequest(BaseRequest): url: SerializableHttpUrl events: Optional[list[WebhookEvent]] = None diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index aec0a84c..45c3770b 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.39.dev1' +__version__ = '2.1.39.dev2' diff --git a/tests/test_requests.py b/tests/test_requests.py index 02b362ed..5dd1e416 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -2,7 +2,7 @@ from pydantic import ValidationError from pydantic_extra_types.phone_numbers import PhoneNumber -from cuenca_validations.types import AgentStatus, AgentUpdateRequest +from cuenca_validations.types import AgentRequest from cuenca_validations.types.enums import VerificationType from cuenca_validations.types.requests import ( PasswordResetRequest, @@ -126,16 +126,9 @@ def test_update_transfer_request_forbids_extra() -> None: assert 'Extra inputs are not permitted' in str(ex.value) -def test_agent_update_request_rejects_created_status() -> None: - with pytest.raises(ValidationError) as exc: - AgentUpdateRequest( - pairing_code='ABC-123', - status=AgentStatus.created, - ) - assert 'Invalid status' in str(exc.value) - - -def test_agent_update_request_succeeded_requires_pairing_code() -> None: - with pytest.raises(ValidationError) as exc: - AgentUpdateRequest(status=AgentStatus.succeeded) - assert 'pairing_code is required' in str(exc.value) +def test_agent_request_normalizes_phone() -> None: + request = AgentRequest( + pairing_code='A1B2C3', + phone_number='+52 55 1234 5678', + ) + assert request.phone_number == '+525512345678' From 0349dfd8bdb10c07700ccd51bbf02f134448be61 Mon Sep 17 00:00:00 2001 From: RogelioLpz Date: Wed, 24 Jun 2026 14:35:07 -0600 Subject: [PATCH 4/7] lint --- cuenca_validations/types/requests.py | 5 ----- tests/test_requests.py | 9 --------- 2 files changed, 14 deletions(-) diff --git a/cuenca_validations/types/requests.py b/cuenca_validations/types/requests.py index 2e5ff98d..8ddbc6b5 100644 --- a/cuenca_validations/types/requests.py +++ b/cuenca_validations/types/requests.py @@ -659,11 +659,6 @@ class AgentRequest(BaseRequest): } ) - @field_validator('phone_number', mode='before') - @classmethod - def normalize_phone(cls, v: PhoneNumber) -> str: - return normalize_phone_number(str(v)) - class EndpointRequest(BaseRequest): url: SerializableHttpUrl diff --git a/tests/test_requests.py b/tests/test_requests.py index 5dd1e416..aba93592 100644 --- a/tests/test_requests.py +++ b/tests/test_requests.py @@ -2,7 +2,6 @@ from pydantic import ValidationError from pydantic_extra_types.phone_numbers import PhoneNumber -from cuenca_validations.types import AgentRequest from cuenca_validations.types.enums import VerificationType from cuenca_validations.types.requests import ( PasswordResetRequest, @@ -124,11 +123,3 @@ def test_update_transfer_request_forbids_extra() -> None: {'status': 'succeeded', 'foo': 'bar'} ) assert 'Extra inputs are not permitted' in str(ex.value) - - -def test_agent_request_normalizes_phone() -> None: - request = AgentRequest( - pairing_code='A1B2C3', - phone_number='+52 55 1234 5678', - ) - assert request.phone_number == '+525512345678' From 5327c9b2e646a953afe59dd9e28b290689b90691 Mon Sep 17 00:00:00 2001 From: RogelioLpz Date: Wed, 24 Jun 2026 14:35:17 -0600 Subject: [PATCH 5/7] version --- cuenca_validations/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 45c3770b..da3c9558 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.39.dev2' +__version__ = '2.1.39.dev3' From 7f1b9d7e406946f979b73b6c954de0045c0eaaba Mon Sep 17 00:00:00 2001 From: RogelioLpz Date: Fri, 26 Jun 2026 19:49:53 -0600 Subject: [PATCH 6/7] changes --- cuenca_validations/types/__init__.py | 2 -- cuenca_validations/types/enums.py | 5 ----- cuenca_validations/types/queries.py | 3 +-- cuenca_validations/version.py | 2 +- 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/cuenca_validations/types/__init__.py b/cuenca_validations/types/__init__.py index 9c7b6067..b36296b4 100644 --- a/cuenca_validations/types/__init__.py +++ b/cuenca_validations/types/__init__.py @@ -4,7 +4,6 @@ 'Address', 'AgentQuery', 'AgentRequest', - 'AgentStatus', 'ApiKeyQuery', 'ApiKeyUpdateRequest', 'AuthorizerTransaction', @@ -130,7 +129,6 @@ from .card import StrictPaymentCardNumber from .enums import ( AccountUseType, - AgentStatus, AuthorizerTransaction, BankAccountStatus, CardErrorType, diff --git a/cuenca_validations/types/enums.py b/cuenca_validations/types/enums.py index cd1e5e59..ea98eab8 100644 --- a/cuenca_validations/types/enums.py +++ b/cuenca_validations/types/enums.py @@ -592,11 +592,6 @@ class SessionType(str, Enum): agent = 'session.agent' -class AgentStatus(str, Enum): - active = 'active' - cancelled = 'cancelled' - - class WebhookObject(str, Enum): user = 'user' transaction = 'transaction' diff --git a/cuenca_validations/types/queries.py b/cuenca_validations/types/queries.py index 6f237727..5981c269 100644 --- a/cuenca_validations/types/queries.py +++ b/cuenca_validations/types/queries.py @@ -15,7 +15,6 @@ from ..typing import DictStrAny from ..validators import sanitize_dict from .enums import ( - AgentStatus, BankAccountStatus, CardFundingType, CardIssuer, @@ -195,7 +194,7 @@ class SessionQuery(QueryParams): class AgentQuery(QueryParams): - status: Optional[AgentStatus] = None + active: Optional[bool] = None class FileQuery(QueryParams): diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index da3c9558..244df590 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.39.dev3' +__version__ = '2.1.39.dev4' From a2e6ad5bbc21d47d192059407cc506d8b291c739 Mon Sep 17 00:00:00 2001 From: RogelioLpz Date: Fri, 26 Jun 2026 19:51:57 -0600 Subject: [PATCH 7/7] version --- cuenca_validations/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cuenca_validations/version.py b/cuenca_validations/version.py index 244df590..6a4505d4 100644 --- a/cuenca_validations/version.py +++ b/cuenca_validations/version.py @@ -1 +1 @@ -__version__ = '2.1.39.dev4' +__version__ = '2.1.39'