Historial de Cambios (Changelog)¶
Todas las modificaciones notables de este proyecto se documentarán en este archivo.
El formato se basa en Keep a Changelog y este proyecto adhiere a la Semántica de Versiones.
[2.3.0] - 2026-09-16¶
Añadido¶
- [FEAT] Contratos machine-readable: JSON Schemas versionados (
schemas/cli-salida.json,schemas/fastapi-error-422.json) para salidas CLI--format json|jsonly detalle de error 422 FastAPI, con tests entests/test_contracts.pyy guía endocs/guia/contratos.md.
[2.2.1] - 2026-09-16¶
Corregido¶
- [FIXED] import del paquete ya no arrastra multiprocessing (compatibilidad Pyodide, startup más liviano).
[2.2.0] - 2026-09-15¶
Corregido¶
- [FIXED] ESTRICTO rechaza guiones alternativos (_, –, —, −) con CARACTERES_INVALIDOS (antes: valido con advertencia); FLEXIBLE sin cambios. Alinea código con especificación §5.1 y docstring de Rut.parse.
[2.1.0] - 2026-09-15¶
Añadido¶
- [FEAT] CLI validar: flag --max-tasa-error (0.0-1.0) como gate de calidad; retorna exit code 2 si la tasa de inválidos supera el umbral y agrega
tasa_erroral resumen de auditoría.
[2.0.0] - 2026-07-14¶
Breaking Changes¶
- [BREAKING] Eliminado
RigorValidacion.LEGADO. Solo existenESTRICTOyFLEXIBLE. - [BREAKING] Eliminado protocolo
Validador. UsarValidadorRut. - [BREAKING] Eliminados alias obsoletos en
exceptions.py:RutInvalidoError,RutError,RutValidationError,RutFormatError,RutDigitError,RutLengthError,RutProcessingError. Usar sus equivalentes en español. - [BREAKING] Eliminados exports obsoletos en
__init__.py:RutConfig,RutValidator,RutInvalidoError. UsarConfiguracionRut,ValidadorRut,ErrorValidacionRut. - [BREAKING] Eliminados shims
__getattr__en__init__.py,exceptions.pyyvalidador.py. Los imports de símbolos obsoletos ahora lanzanAttributeError.
Añadido¶
- [FEAT] Script de migración automática
scripts/migrate.pycon modos--checky--fixbasado en AST. - [FEAT] Módulo
rutificador.calidad_datoscon detección de duplicados, auditoría de formatos y perfilamiento estadístico. - [FEAT]
mypy --stricthabilitado en los 10 módulos del núcleo.
Seguridad¶
- [SEC] Workflow de publicación ahora genera attestación de procedencia SLSA v1.0 y adjunta SBOM CycloneDX a los releases.
Documentación¶
- [DOC] Guía de migración v1.x → v2.0 en
GUIA_MIGRACION_v2.md. - [DOC] Sección de verificación de integridad en
SECURITY.md. - [DOC] Test vectors canónicos unificados en
tests/vectors/conformance.jsoncon JSON Schema. - [DOC] Script de conformidad standalone
scripts/conformance.py.
[1.9.0] - 2026-07-14¶
Añadido¶
- [FEAT] CLI: subcomando
enmascararahora soporta tokenización HMAC-SHA256 con los flags--tokeny--clave(y variable de entornoRUTIFICADOR_TOKEN_KEY). - [DOC] Especificación formal de reglas de validación RUT con test vectors canónicos en JSON (
docs/especificacion-reglas-rut.md,tests/vectors/). - [I18N] Infraestructura de internacionalización en
crear_detalle_error(idioma="es"|"en"). Catálogo en español e inglés con fallback automático.
Calidad¶
- [TYPES]
mypy --stricthabilitado en 5 módulos del núcleo:errores.py,version.py,config.py,utils.py,validador.py. CI verifica estricto en esos módulos.
Documentación¶
- [DOC] MkDocs desplegado en GitHub Pages:
tooltician.com/rutificador/. - [DOC]
workflow_dispatchagregado al workflow de documentación para despliegues manuales.
[1.8.0] - 2026-06-20¶
Añadido¶
- [DEVOPS] Workflow de regresión de rendimiento en CI: benchmarks comparados contra rama base con umbral de 20% (no bloqueante).
- [DEVOPS] Workflow de despliegue de documentación MkDocs a GitHub Pages.
Calidad¶
- [DEVOPS] Python 3.14 en matriz CI con
continue-on-error.
Documentación¶
- [DOC] Sitio de documentación con MkDocs Material: API reference desde docstrings, buscador, ejemplos interactivos.
[1.7.0] - 2026-06-20¶
Calidad¶
- [DEVOPS]
import-linteradoptado: 3 contratos de arquitectura (nucleo-no-depende-de-contrib,nucleo-no-depende-de-cli,contrib-no-depende-entre-si) enpyproject.toml. - [DEVOPS]
mutmut(mutation testing) evaluado y rechazado: incompatible con Python 3.12. - [DEVOPS]
pyperfevaluado y rechazado:pytest-benchmarkofrece mejor integración. - [DEVOPS]
uvevaluado y rechazado: incompatible con Poetry lockfile.
[1.6.1] - 2026-06-20¶
Mantenimiento¶
- [DEVOPS] Añadidos
deptry,pytest-benchmark,cyclonedx-bom,pre-commityhttpx2como dependencias exclusivas de desarrollo, sin modificar las dependencias de instalación del núcleo;httpx2elimina la advertencia obsoleta deTestClienten Starlette reciente. - [DEVOPS] CI valida la coherencia de dependencias y la configuración de pre-commit; el flujo de seguridad genera y conserva un SBOM CycloneDX reproducible.
- [DEVOPS] Migrada la configuración obsoleta
poetry.dev-dependenciesapoetry.group.dev.dependenciesy eliminadotomli, que no era utilizado, para conservar un núcleo sin dependencias también en Python 3.10.
Tests¶
- [TEST] Benchmark funcional de
Rut.parse()para verificar la integración depytest-benchmarky habilitar futuras líneas base de rendimiento.
[1.6.0] - 2026-06-12¶
Rendimiento¶
- [PERF]
validar_flujo_rutsyformatear_flujo_rutsen modoparalelo=Trueahora usanchunksize=256por defecto enExecutor.map, eliminando un overhead de ~10× respecto al modo serial que se producía con el valor por defectochunksize=1. El parámetrochunksizequeda expuesto como kwarg opcional en ambas funciones para ajuste manual. - [PERF] Constante pública
CHUNKSIZE_FLUJO_POR_DEFECTO = 256añadida aprocesador.py.
Deprecaciones¶
- [DEPRECATED]
RigorValidacion.LEGADOahora emiteDeprecationWarningal usarse enValidadorRut,Rut.parseyRut.normalizar. El valor se eliminará en v2.0; usarRigorValidacion.FLEXIBLEen su lugar.
Calidad¶
- [REFACTOR] Rama muerta eliminada de
formatear_lista_ruts: el bloqueif not fuentesreconstruíaRutProcesadodesderuts_validos, pero ambas listas siempre se llenan en paralelo porvalidar_lista_ruts, por lo que el bloque era inalcanzable.
Documentación¶
- [DOC] Contrato builder/classifier documentado en
Rut,Rut.__init__yRut.parse: el constructor normaliza la entrada y lanza excepciones tipadas;parse()clasifica bajo elmodoindicado y devuelve unValidacionResultado. Actualizado también enCLAUDE.md. - [DOC]
RigorValidacioncon docstring de clase que define la semántica de cada modo (ESTRICTO,FLEXIBLE,LEGADOobsoleto).
Tests¶
- [TEST]
tests/test_procesador_flujo.py: tests de regresión para la corrección dechunksize; incluye un caso con generador puro (sin__len__) que garantiza que no se llamelen()sobre el iterable de flujo. - [TEST]
tests/test_consistencia_parse.py: tests de caracterización que fijan el contrato constructor↔parse(); incluye tests de deprecación deLEGADOy el test de contrato builder/classifier. - [TEST]
tests/test_procesador_paralelo.py: cobertura de las ramas paralelas deProcesadorLotesRut.validar_lista_ruts.
1.5.8 - 2026-05-14¶
Mantenimiento¶
- [DEVOPS] Workflows CI consolidados:
quality.ymlfusionado dentro deci.ymlcomo job independiente; ejecución de tests reducida a 1 pasada (antes eran 2: cobertura + deprecaciones);security.ymlsimplificado de 3 auditorías pip-audit a 1;pylint.ymlyrepo-hygiene-gate.ymleliminados. - [DEVOPS] Dependencias muertas eliminadas de
requirements-dev.txt:black(reemplazado porruff format),requestsyzipp(pins transitivos de Snyk). - [DEVOPS]
dependency-review-actionactualizado a v5; Python de quality/security estandarizado a 3.13. - [CLEANUP] Código muerto eliminado de
config.py: aliasRutConfigy__getattr__deprecado que era inalcanzable (la deprecación ya se maneja en__init__.py). - [CLEANUP]
pylintrceliminado (pylint reemplazado porruff check). - [CLEANUP]
coverage.lcovañadido a.gitignore.
Documentación¶
- [DOC] README reestructurado: mejor jerarquía visual con separadores, secciones reorganizadas en orden progresivo, tabla de errores dividida en errores/advertencias, tabla de formatos CLI corregida (bug
|0|).
1.5.7 - 2026-05-13¶
Añadido¶
- [DOC] Google-style docstrings en español en métodos públicos clave (
Rut.__init__,Rut.formatear,ValidadorRut,ProcesadorLotesRut,FormateadorJSON,aplicar_formato). - [DOC] Docstrings de módulo en 9 archivos:
version.py,rut.py,validador.py,procesador.py,cli.py,sugestor.py,contrib/fastapi.py,contrib/pandas.py,contrib/polars.py. - [DOC] Texto
help=para los subcomandosformatear(--separador-miles,--mayusculas) yenmascarar(descripción del comando,archivo,--mantener,--caracter,--separador-miles,--mayusculas). - [DOC]
CONTRIBUTING.md— guía de contribución completa en español con setup, quality gates, estilo Google-style, Conventional Commits, estructura del proyecto y PR process.
Mantenimiento¶
- [DEVOPS]
filterwarningseliminado depyproject.toml— las causas raíz ya están corregidas víaspawnenconftest.py.
1.5.6 - 2026-05-13¶
Corregido¶
- [FIX]
conftest.pyglobal conmultiprocessing.set_start_method("spawn")para eliminar los 48 DeprecationWarnings defork()con hilos en Python 3.13+.
Mantenimiento¶
- [DEVOPS] mypy ahora bloquea el CI (
continue-on-erroreliminado enquality.yml).
1.5.5 - 2026-05-13¶
Añadido¶
- [QUALITY] Marcador
py.typedpara señalizar PEP 561 (tipado estático para consumidores). - [QUALITY] Paso
-W error::DeprecationWarningen CI para detectar deprecaciones de librerías temprano. - [QUALITY]
conftest.pyglobal conmultiprocessing.set_start_method("spawn")para evitar race conditions defork()con hilos en Python 3.13+. - [DEV]
__init__.pyañadidos entests/contrib/ytests/contrib/pydantic/. - [DOC] Anotaciones
# nosecen los 2 hallazgos aceptables de bandit (XML generado internamente, random para benchmarks).
Corregido¶
- [FIX] Deprecación
starlette.status.HTTP_422_UNPROCESSABLE_ENTITYreemplazada porHTTP_422_UNPROCESSABLE_CONTENTencontrib/fastapi.py. - [FIX]
assertreemplazados por guardas explícitas enrut.py(B101, se pierden conpython -O). - [FIX]
except Exception: passreemplazados porlogger.warningensugestor.py(B110). - [FIX] 14 errores de mypy corregidos (tipos de retorno en
procesador.py,cli.py,test_rutstr.py; narrowing enrut.py). - [FIX] Import no usado
importlibeliminado detest_rutstr.py. - [FIX] Pre-commit migrado de black+flake8 a ruff (elimina redundancia, black 23→26).
Seguridad¶
- [SECURITY] Workflow
publish-package.yml:workflow_dispatchrestringido a la ramamaster. - [SECURITY]
quality.yml: mypy ahora bloquea el CI si hay errores de tipos (continue-on-erroreliminado).
Mantenimiento¶
- [DEVOPS]
ruffactualizado a 0.15.12 ymypya 2.1.0 enrequirements-dev.txt. - [DEVOPS]
pytest-covampliado a<8.0.0enpyproject.toml. - [DEVOPS] Filtro
filterwarningspara suprimir DeprecationWarning demultiprocessing.forken Python 3.13+.
1.5.4 - 2026-05-09¶
Corregido¶
- [FIX] Todos los
import warningsmovidos a toplevel para cumplir con pylintC0415. - [FIX] Aliases deprecados removidos de
__all__en__init__.py(pylintE0603). - [FIX] Tests actualizados:
RutInvalidoError→ErrorValidacionRut(pylintE0611); imports locales duplicados consolidados (pylintW0404/W0621).
1.5.3 - 2026-05-09¶
Corregido¶
- [FIX] Tests de versión ahora usan
__version__dinámico en vez de strings hardcodeadas para evitar regresiones en futuros bumps. - [FIX] Tests de pandas/polars:
Rut.parse()siempre retornaValidacionResultado(nuncaNone), corregida aserción que esperabaNonepara RUTs inválidos.
1.5.2 - 2026-05-09¶
Corregido¶
- [SECURITY] pytest actualizado de
^7.2.1a>=9.0.3para corregir vulnerabilidad de tmpdir (CVE en/tmp/pytest-of-{user}). - [FIX] Tests de
test_audit_v2.pyusaban versión hardcodeada1.4.5en vez de__version__. - [FIX] Tests de pandas/polars
test_validar_seriescorregidos: validación inválida retornaValidacionResultado, noNone.
1.5.1 - 2026-05-09¶
Corregido¶
- [DEVOPS] Workflow
security.yml: reemplazada la lectura depoetry.lock(no versionado) porpip freezepara la exportación de dependencias runtime.
1.5.0 - 2026-05-09¶
Añadido¶
- [SECURITY] Sanitización de PII (RUT) en los logs de
ErrorRut.__init__: el mensaje que recibelogger.exception()ya no contiene RUTs en texto plano. - [SECURITY] Mitigación de inyección de fórmulas CSV en la salida de la CLI (
_emitir_resultados), alineada con elFormateadorCSVdel móduloformatter. - [TEST] Suite de tests para CLI (
test_cli.py), incluyendo_comando_enmascarar,_comando_infoy tests de memoria con pipeline real. - [TEST] Tests de cobertura para 9 códigos de error faltantes (
FORMATO_GUION,DV_INVALIDO,LONGITUD_MAXIMA,NORMALIZACION_DV,CEROS_IZQUIERDA,NORMALIZACION_PUNTOS,ESTADO_ENMASCARADO,CLAVE_TOKEN_REQUERIDA,LONGITUD_MAXIMA). - [TEST] Tests basados en propiedades con Hypothesis: roundtrip de
Rut.parse, idempotencia denormalizar, enmascarado preserva DV, seguridad CSV. - [TEST] Tests de integración para contrib/pandas y contrib/polars (
s.rut.es_valido,formatear,validar,normalizar). - [TEST] Tests para
Rut.__init__con argumentoint,Rut.enmascararcon paths extremos (mantener=0,separador_miles,mayusculas, token conclave=bytes). - [TEST] Test end-to-end con backend
ProcessPoolExecutor.
Cambiado¶
- [REFACTOR] Descomposición de
Rut.normalizar()(87→9 métodos helper estáticos) para reducir complejidad ciclomática. - [REFACTOR] Estrategias de emisión en CLI:
_emitir_resultadosextraído en 5 clases Strategy (_EmisionTexto,_EmisionJSON,_EmisionJSONL,_EmisionCSV,_EmisionXML). - [REFACTOR] Lógica de transposición duplicada en
sugestor.pyconsolidada en helper_generar_transposiciones. - [REFACTOR] Regex
RE_BASE_CON_PUNTOS/RE_BASE_DIGITOSdeduplicados: movidos autils.py, reimportados enrut.py/validador.py. - [REFACTOR] Lógica de formato de Pandas/Polars deduplicada en helper compartido
contrib/_formato_comun.py. - [REFACTOR]
_normalizar_entradaeliminado deValidadorRut(inline directo de_limpiar_entrada). - [REFACTOR]
monitor_de_rendimientoactualizado conParamSpecpara tipos precisos (Python 3.10+). - [REFACTOR]
ConfiguracionRut.__post_init__levantaErrorValidacionRuten vez deValueErrorpara consistencia. - [DEVOPS] Cobertura de tests unificada en
ci.yml; eliminadocoveralls.yml. - [DEVOPS] Workflow
security.ymlcorregido: triggers apuntan amasteren vez demain. - [DEVOPS]
publish-package.ymlya no se dispara en cada push. - [DEVOPS]
quality.yml: mypy concontinue-on-error: true(no bloqueante); tests removidos (se ejecutan enci.yml). - [DEVOPS] Clasificador Python 3.9 eliminado de
pyproject.toml(requerido 3.10+). - [DEVOPS] Pines de FastAPI/httpx flexibilizados (
^0.110.0→>=0.110.0,<2.0.0,^0.27.0→>=0.27.0,<1.0.0).
Corregido¶
- [FIX] Versión hardcodeada
"1.4.0"en metadatos de auditoría CLI: ahora usaobtener_informacion_version()["version"]. - [FIX]
__init__.py(_registrar_contribs): cambio deexcept (ImportError, AttributeError)a soloexcept ImportError. - [FIX]
_leer_ruts: captura deFileNotFoundErroryUnicodeDecodeErrorcon mensajes legibles ysys.exit(1). - [FIX] Tests de memoria: reemplazados monkeypatches no-op por pipeline real con 1000 RUTs.
- [FIX] Parámetro muerto en test (
_ = esperado) corregido a aserción real.
Deprecado¶
- [DEPR] Aliases de compatibilidad (
RutInvalidoError,RutError,RutValidationError,RutFormatError,RutDigitError,RutLengthError,RutProcessingError,RutValidator,RutConfig) emitenDeprecationWarningal ser accedidos. Se eliminarán en v2.0.
1.4.5 - 2026-03-29¶
Cambiado¶
- [MAINTENANCE] Refactorización de la clase
RutStrpara reducir la complejidad ciclomática de sus validadores internos de 11 a menos de 8.
Corregido¶
- [FIX] Endurecimiento del manejo de excepciones en la detección dinámica de la versión del paquete en
version.py, reemplazando capturas genéricas por excepciones específicas (OSError,re.error,UnicodeDecodeError).
1.4.4 - 2026-03-29¶
Cambiado¶
- [STYLE] Renombrado de funciones públicas a
snake_caseencontrib/fastapi(consulta_rut,parametro_rut) ycontrib/pydantic(rut_str_annotated) para cumplir con PEP 8. Se mantienen alias para asegurar compatibilidad retroactiva. - [MAINTENANCE] Centralización de la versión en
pyproject.tomlcomo única fuente de verdad, utilizando recuperación dinámica víaimportlib.metadatacon fallback para desarrollo local. - [MAINTENANCE] Refactorización integral del codebase para alcanzar una puntuación de 10/10 en Pylint.
- [MAINTENANCE] Mejora de la estructura de imports en
rutificador/rut.pyeliminando imports locales innecesarios y comentarios de desactivación de Pylint. - [MAINTENANCE] Implementación de
lazy % formattingen logs y mejora de la trazabilidad de excepciones confrom exc.
Corregido¶
- [FIX] Error de miembro inexistente
RigorValidacion.HOLGADOen las integraciones de Pandas y Polars (corregido aFLEXIBLE). - [FIX] Eliminación de importaciones no utilizadas y limpieza de espacios en blanco en todo el proyecto y suite de pruebas.
1.4.3 - 2026-03-29¶
Corregido¶
- [DEVOPS] Actualización de GitHub Actions (
checkout,setup-python,upload-artifact,cache) para soportar Node.js 24 y resolver advertencias de deprecación.
1.4.2 - 2026-03-28¶
Añadido¶
- [PERF] Integración nativa (accessors) para Pandas y Polars.
- [PERF] Soporte para
chunksizeenProcesadorLotesRutpara optimizar el procesamiento paralelo masivo. - [PERF] Cálculo automático de
chunksizebasado en la carga y el número de núcleos. - Extras
[pandas],[polars]y[full]en dependencias.
Corregido¶
- Optimización del overhead de comunicación IPC en procesamiento multiproceso.
1.4.1 - 2026-03-28¶
Añadido¶
- CLI Info: Nuevo comando
rutificador infopara diagnósticos del sistema. - Pydantic Dinámico: Soporte para múltiples formatos en
RutStrmediante la función factoryRutStrAnnotated(formato=...). - Integración Unix: Flags
--quiety--sugeriren la CLI para control granular de la salida.
Cambiado¶
- Salida de CLI: Las estadísticas de auditoría ahora se envían a
stderrpor defecto para mantenerstdoutlimpio. - Sugerencias: Ahora son desactivadas por defecto (opt-in) vía
--sugerir.
Corregido¶
- Privacidad: Sanitización de valores PII (RUT) en los logs de excepciones de
ErrorRut. - Limpieza de Código: Eliminación de redundancias en rtas de retorno de la CLI y definiciones de excepciones.
1.4.0 - 2026-03-28¶
1.3.0 - 2026-03-??¶
Añadido¶
- Soporte para procesamiento en paralelo mediante
parallel_backend. - Nuevas excepciones estructuradas en
rutificador.exceptions. - Validación de longitud mínima y máxima configurable.
Cambiado¶
- Mejora en el rendimiento de normalización de cadenas.
1.2.1 - 2025-10-15¶
Corregido¶
- Error en el cálculo del dígito verificador para RUTs de 9 dígitos.
- Soporte para Python 3.12.
1.2.0 - 2025-09-01¶
Añadido¶
- Soporte inicial para Pydantic v1.
- Comandos CLI básicos.