Skip to content

Commit

Permalink
improve readme
Browse files Browse the repository at this point in the history
  • Loading branch information
felipao-mx committed Aug 14, 2024
1 parent 565c177 commit 54f596d
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 9 deletions.
62 changes: 59 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,16 @@
[![Downloads](https://pepy.tech/badge/clabe)](https://pepy.tech/project/clabe)

Librería para validar y calcular un número CLABE basado en
https://es.wikipedia.org/wiki/CLABE
https://es.wikipedia.org/wiki/CLABE.

Además, incluye la clase `Clabe`, un tipo personalizado diseñado
para integrarse con Pydantic, proporcionando un validador
robusto y eficiente para números CLABE dentro de tus
modelos Pydantic. Compatible con Pydantic V1.10.x y V2.x.x

## Requerimientos

Python 3.6 o superior.
Python 3.8 o superior.

## Instalación

Expand All @@ -22,9 +27,30 @@ pip install clabe

## Pruebas

Para ejecutar las pruebas
### Requisitos previos

#### Instalar PDM

Usamos PDM como administrador de paquetes y entornos virtuales (virtualenv).
Esto nos permite ejecutar pruebas unitarias con Pydantic
tanto en las versiones 1.x.x como 2.x.x. Sigue la [guía oficial](https://pdm-project.org/en/latest/#recommended-installation-method)
de instalación para instalarlo.

#### Instalar dependencias

El siguiente comando creará dos virtualenv. Uno donde se instala
pydantic V1.x.x y otro donde se instala Pydantic V2. Todo esto
es gestionado por PDM.
```bash
make install
```

### Ejecutar las pruebas

El siguiente comando ejecutará el conjunto de pruebas de ambos
virtualenv y generará un único reporte de pruebas y cobertura.

```bash
$ make test
```

Expand Down Expand Up @@ -57,3 +83,33 @@ Para generar nuevo válido CLABES
import clabe
clabe.generate_new_clabes(10, '002123456')
```

### Como tipo personalizado en un modelo de Pydantic

```python
from pydantic import BaseModel, ValidationError

from clabe import Clabe


class Account(BaseModel):
id: str
clabe: Clabe


account = Account(id='123', clabe='723010123456789019')
print(account)
"""
id='123' clabe='723010123456789019'
"""

try:
account = Account(id='321', clabe='000000000000000011')
except ValidationError as exc:
print(exc)
"""
1 validation error for Account
clabe
código de banco no es válido [type=clabe.bank_code, input_value='000000000000000011', input_type=str]
"""
```
4 changes: 2 additions & 2 deletions clabe/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
__all__ = ['Clabe']

if is_pydantic_v1():
from .clabes_legacy.clabes import Clabe
from .clabes_legacy.clabes import Clabe # type: ignore
else:
from .clabes import Clabe
from .clabes import Clabe # type: ignore
13 changes: 9 additions & 4 deletions clabe/types/clabes.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,19 @@ def __get_pydantic_json_schema__(
cls, schema: core_schema.CoreSchema, handler: GetJsonSchemaHandler
) -> dict[str, Any]:
json_schema = handler(schema)
json_schema.update({'format': 'phone'})
json_schema.update(
type="string",
pattern="^[0-9]{18}$",
description="CLABE (Clave Bancaria Estandarizada)",
examples=["723010123456789019"],
)
return json_schema

@classmethod
def __get_pydantic_core_schema__(
cls, source: type[Any], handler: GetCoreSchemaHandler
cls, _: type[Any], __: GetCoreSchemaHandler
) -> core_schema.CoreSchema:
return core_schema.with_info_after_validator_function(
return core_schema.no_info_after_validator_function(
cls._validate,
core_schema.str_schema(
min_length=cls.min_length,
Expand All @@ -42,7 +47,7 @@ def __get_pydantic_core_schema__(
)

@classmethod
def _validate(cls, clabe: str, _: core_schema.ValidationInfo) -> 'Clabe':
def _validate(cls, clabe: str) -> 'Clabe':
if not clabe.isdigit():
raise PydanticCustomError('clabe', 'debe ser numérico')
if clabe[:3] not in BANKS.keys():
Expand Down
16 changes: 16 additions & 0 deletions tests/test_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,19 @@ def test_invalid_clabe(clabe: str, expected_message: str) -> None:
Cuenta(clabe=clabe)

assert expected_message in str(exc.value)


@pytest.mark.skipif(is_pydantic_v1(), reason='only pydantic v2')
def test_get_json_schema() -> None:
from pydantic import TypeAdapter

adapter = TypeAdapter(Clabe)
schema = adapter.json_schema()
assert schema == {
'description': 'CLABE (Clave Bancaria Estandarizada)',
'examples': ['723010123456789019'],
'maxLength': 18,
'minLength': 18,
'pattern': '^[0-9]{18}$',
'type': 'string',
}

0 comments on commit 54f596d

Please sign in to comment.