Herramientas para validar, calcular y formatear el Rol Único Tributario (RUT) en Chile, con procesamiento por lotes y salida en múltiples formatos.
Project description
Rutificador
Biblioteca en Python para validar, calcular y formatear RUTs (Rol Único Tributario) chilenos de forma eficiente.
Tabla de Contenidos
- Rutificador
Características
- Validación de formato y cálculo de dígito verificador.
- Formateo configurable (separador de miles, mayúsculas, separador personalizado).
- Procesamiento por lotes con separación de válidos/ inválidos y salida en CSV, XML o JSON.
- Validación configurable por instancia: cada
Rutreutiliza elValidadorRutinyectado. - Metadatos enriquecidos: cada validación genera un
RutProcesadocon duración y modo de rigurosidad. - Paralelismo adaptable en la API (
parallel_backendpor procesos o hilos); la CLI usa el backend predeterminado. - Compatibilidad con Python >=3.9 y <4.0.
Instalación
Puedes instalar la librería utilizando pip:
pip install rutificador
Uso
Importar la clase Rut
from rutificador import Rut
Crear un objeto
rut1 = Rut('12345678-5')
rut2 = Rut('12.345.670')
Validar un RUT
La validación del RUT se realiza automáticamente al crear un objeto Rut. La clase Rut acepta RUTs con y sin dígito verificador, así como RUTs con y sin separador de miles. Si el RUT ingresado no es válido, se lanzará una excepción RutInvalidoError.
Calcular el Dígito Verificador de un RUT
from rutificador import calcular_digito_verificador
digito_verificador = calcular_digito_verificador("12345678")
print(digito_verificador) # Salida: 5
Formatear un RUT
# Formato predeterminado
print(rut1.formatear()) # Salida: 12345678-5
# Con separador de miles
print(rut1.formatear(separador_miles=True)) # Salida: 12.345.678-5
# Formato predeterminado (Rut con dígito verificador = 'k')
print(rut2.formatear()) # Salida: 12345670-k
# Con separador de miles y en mayúsculas
print(rut2.formatear(separador_miles=True, mayusculas=True)) # Salida: 12.345.670-K
Validar y formatear una lista de RUTs en diversos formatos
Al igual que con los RUTs individuales, el uso de formatear_lista_ruts realiza la validación de forma automática cuando se trabaja con secuencias de RUTs. En lugar de lanzar una excepción RutInvalidoError, separará los RUTs válidos de los inválidos. Veamos algunos ejemplos:
from rutificador import formatear_lista_ruts
# Sin formato
ruts = ["12345678-5", "12345670-k", "98765432-1"]
print(formatear_lista_ruts(ruts, separador_miles=True, mayusculas=True, formato=None))
# Salida:
# RUTs válidos:
# 12.345.678-5
# 12.345.670-K
RUTs inválidos:
98765432-1 - El dígito verificador '1' no coincide con el dígito verificador calculado '5'.
# En formato csv
ruts = ["12.345.678", "9876543", "1.234.567-4", "18005183"]
csv_ruts = formatear_lista_ruts(ruts, formato="csv")
print(csv_ruts)
# Salida
# RUTs válidos:
# rut
# 12345678-5
# 9876543-3
# 1234567-4
# 18005183-k
# En formato json
ruts = ["12.345.678", "9876543", "1.234.567-4", "18005183"]
json_ruts = formatear_lista_ruts(ruts, formato="json")
print(json_ruts)
# Salida
# RUTs válidos:
# [{"rut": "12345678-5"}, {"rut": "9876543-3"}, {"rut": "1234567-4"}, {"rut": "18005183-k"}]
# En formato xml
ruts = ["12.345.678", "9876543", "1.234.567-4", "18005183"]
xml_ruts = formatear_lista_ruts(ruts, formato="xml")
print(xml_ruts)
# Salida
# RUTs válidos:
# <root>
# <rut>12345678-5</rut>
# <rut>9876543-3</rut>
# <rut>1234567-4</rut>
# <rut>18005183-k</rut>
# </root>
Personalizar la validación
from rutificador import Rut, ValidadorRut, RigorValidacion
validador = ValidadorRut(modo=RigorValidacion.FLEXIBLE)
rut = Rut('12.345.678-5', validador=validador)
print(rut)
Procesamiento en lotes
from rutificador import ProcesadorLotesRut
ruts = ['12.345.678-5', '98.765.432-1', '1-9']
processor = ProcesadorLotesRut(parallel_backend="process")
resultado = processor.formatear_lista_ruts(ruts, formato='json')
print(resultado)
Todas las operaciones en lote reutilizan las instancias de Rut generadas durante la validación, evitando recalcular cada entrada al momento de formatear o transmitir resultados por streaming. Esto mantiene la coherencia con los validadores personalizados y mejora el rendimiento en conjuntos grandes. Para cargas masivas puedes alternar entre parallel_backend="thread" (compatible con I/O intensivo) o parallel_backend="process" (ideal para CPU-bound).
CLI con archivos grandes
# Procesa un archivo gigantesco mediante streaming
$ rutificador validar datos/ruts_masivos.txt > ruts_validos.txt
La herramienta lee línea a línea y usa el backend predeterminado; si necesitas seleccionar explícitamente hilos o procesos, hazlo mediante la API (parallel_backend) y combina el resultado con tus scripts para generar informes especializados.
Registro y depuración
import logging
from rutificador import configurar_registro
configurar_registro(level=logging.DEBUG)
configurar_registro prepara un logger dedicado (rutificador) sin alterar la configuración global del proyecto que lo consume. Si ya cuentas con tu propio esquema de logging puedes pasar cualquier logging.Handler personalizado (JSON, Syslog, etc.) mediante el parámetro handler, y la función se encargará de integrarlo sin tocar los handlers existentes de tu aplicación:
import logging
import json
from rutificador import configurar_registro
class JsonFormatter(logging.Formatter):
def format(self, record):
return json.dumps({"nivel": record.levelname, "mensaje": record.getMessage()})
handler = logging.StreamHandler()
handler.setFormatter(JsonFormatter())
configurar_registro(level=logging.INFO, handler=handler)
Información de versión
La versión del paquete se define en rutificador/version.py y puede consultarse directamente:
from rutificador import __version__
print(__version__)
También puedes obtener metadatos adicionales:
from rutificador import obtener_informacion_version
info = obtener_informacion_version()
print(info['version'])
### Acceder a metadatos de validación
```python
from rutificador import ProcesadorLotesRut
procesador = ProcesadorLotesRut()
resultado = procesador.validar_lista_ruts(["12.345.678-5"], parallel=False)
detalle = resultado.detalles_validos[0]
print(detalle.valor) # 12345678-5
print(detalle.validador_modo) # estricto/flexible
print(detalle.duracion) # segundos consumidos en la validación
# Errores con código y mensaje
resultado_error = procesador.validar_lista_ruts(["12345678-9"])
if resultado_error.ruts_invalidos:
problema = resultado_error.ruts_invalidos[0]
print(problema.rut, problema.codigo, problema.mensaje)
Los objetos RutProcesado permiten instrumentar dashboards o auditorías sin volver a recorrer el lote original.
### Evaluar rendimiento
```python
from rutificador import evaluar_rendimiento
resultados = evaluar_rendimiento(num_ruts=1000)
print(resultados['tasa_exito'])
Registrar un formateador personalizado
from rutificador import FormateadorRut, FabricaFormateadorRut
class FormateadorLista(FormateadorRut):
def formatear(self, ruts):
return ','.join(ruts)
FabricaFormateadorRut.registrar_formateador('lista', FormateadorLista)
Uso desde la línea de comandos
El paquete incluye un comando de consola llamado rutificador con dos subcomandos:
rutificador validar [archivo]: valida RUTs recibidos porstdino desde un archivo.rutificador formatear [archivo]: valida y formatea los RUTs; acepta las opciones--separador-milesy--mayusculas.
Ejemplos:
$ echo "12345678-5" | rutificador validar
12345678-5
$ echo "12345678-5" | rutificador formatear --separador-miles
12.345.678-5
Desarrollo
Configuración del Entorno
-
Clonar el repositorio: git clone https://github.com/cortega26/rutificador.git cd rutificador
-
Crear un entorno virtual: python -m venv venv source venv/bin/activate # En Windows use venv\Scripts\activate
-
Actualizar pip a una versión segura y luego instalar las dependencias de desarrollo: python -m pip install --upgrade "pip>=25.2" pip install -r requirements-dev.txt
-
Instalar los ganchos de pre-commit: pre-commit install
Ejecutar pruebas y linters
Antes de enviar tus cambios, verifica la calidad del código con:
pre-commit run --files pytest
Notas de validación y seguridad
- La suite incluye pruebas que aseguran el soporte de configuraciones
personalizadas de
ConfiguracionRut, incluyendo bases de hasta 9 dígitos, tanto para entradas con como sin dígito verificador. Esto evita regresiones en escenarios donde se amplíamax_digitospara integraciones externas. - Para detalles del flujo de escaneo y de la gestión temporal del aviso
GHSA-4xh5-x5gv-qwph, consulta
SECURITY_SCANNING_NOTES.md.
Problemas o Requerimientos
¿Te gustaría reportar algún error, solicitar alguna modificación o característica adicional en esta librería? Solo debes abrir un issue y describir tu petición de la forma más precisa y clara posible.
Contribuciones
Las contribuciones son bienvenidas. Antes de comenzar, revisa las directrices en AGENTS.md. Haz un fork del repositorio, crea una rama nueva, documenta tus cambios y finalmente haz push para abrir un pull request hacia la rama principal.
Licencia
Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo LICENSE para más detalles.
Créditos
Este paquete fue creado por Carlos Ortega y se inspiró en el proyecto rut-chile de gevalenz, que es un módulo Python que proporciona funcionalidades comunes relacionadas con el RUT chileno.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rutificador-1.0.23.tar.gz.
File metadata
- Download URL: rutificador-1.0.23.tar.gz
- Upload date:
- Size: 21.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b42135a111d0a2e504715148edb0d7bbc2bde145543951883fb071fa309fe72b
|
|
| MD5 |
ce5729d48a37cefb8b53d2d4e276b745
|
|
| BLAKE2b-256 |
2f0fa903c11912b30218feb2be37c644795e35de4d73adc561761d3afa082913
|
Provenance
The following attestation bundles were made for rutificador-1.0.23.tar.gz:
Publisher:
publish-package.yml on cortega26/rutificador
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rutificador-1.0.23.tar.gz -
Subject digest:
b42135a111d0a2e504715148edb0d7bbc2bde145543951883fb071fa309fe72b - Sigstore transparency entry: 721850210
- Sigstore integration time:
-
Permalink:
cortega26/rutificador@26e6a3b1dac15e7be05b0da3664fb2b1138f2c63 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/cortega26
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@26e6a3b1dac15e7be05b0da3664fb2b1138f2c63 -
Trigger Event:
push
-
Statement type:
File details
Details for the file rutificador-1.0.23-py3-none-any.whl.
File metadata
- Download URL: rutificador-1.0.23-py3-none-any.whl
- Upload date:
- Size: 22.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e5d1c2b77e15703cbcf67fb8fba56cf1cfab0689a64403be68d41fef1aa1035
|
|
| MD5 |
0b5ba3e70dd1993d0c302ca78f9b9c50
|
|
| BLAKE2b-256 |
3dfaa71f0a1556d4d42da3d3118cf03e83b58c107fd96fb43d4f863715161885
|
Provenance
The following attestation bundles were made for rutificador-1.0.23-py3-none-any.whl:
Publisher:
publish-package.yml on cortega26/rutificador
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rutificador-1.0.23-py3-none-any.whl -
Subject digest:
5e5d1c2b77e15703cbcf67fb8fba56cf1cfab0689a64403be68d41fef1aa1035 - Sigstore transparency entry: 721850306
- Sigstore integration time:
-
Permalink:
cortega26/rutificador@26e6a3b1dac15e7be05b0da3664fb2b1138f2c63 -
Branch / Tag:
refs/heads/master - Owner: https://github.com/cortega26
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-package.yml@26e6a3b1dac15e7be05b0da3664fb2b1138f2c63 -
Trigger Event:
push
-
Statement type: