Saltar a contenido

API — Validador

rutificador.validador.ValidadorRut

Validador de RUT con niveles de rigurosidad configurables.

Source code in rutificador/validador.py
class ValidadorRut:
    """Validador de RUT con niveles de rigurosidad configurables."""

    def __init__(
        self,
        configuracion: ConfiguracionRut = CONFIGURACION_POR_DEFECTO,
        modo: RigorValidacion = RigorValidacion.ESTRICTO,
    ) -> None:
        """Inicializa el validador con configuración y rigor.

        Args:
            configuracion: Parámetros de validación (factores, módulo,
                dígitos mínimo/máximo).
            modo: Nivel de rigurosidad (``ESTRICTO`` o ``FLEXIBLE``).
        """
        self.configuracion = configuracion
        self.modo = modo
        logger.debug("ValidadorRut inicializado con modo: %s", modo.value)

    def validar_formato(self, cadena_rut: str) -> Match[str]:
        """Valida el formato del RUT."""
        cadena_rut = asegurar_cadena_no_vacia(cadena_rut, "RUT")

        if self.modo == RigorValidacion.FLEXIBLE:
            cadena_rut, _ = _limpiar_entrada(cadena_rut)

        match = RUT_REGEX.fullmatch(cadena_rut)
        if not match:
            raise ErrorFormatoRut(
                cadena_rut,
                (
                    "XXXXXXXX-X o XX.XXX.XXX-X donde X son dígitos "
                    "y el último puede ser 'k'"
                ),
            )

        base_capturada = match.group(1)
        base_normalizada = normalizar_base_rut(base_capturada)
        if len(base_normalizada) > self.configuracion.max_digitos:
            raise ErrorLongitudRut(
                cadena_rut, len(base_normalizada), self.configuracion.max_digitos
            )
        logger.debug("Formato de RUT validado correctamente")
        return match

    def validar_base(self, base: str, rut_original: str) -> str:
        """Valida y normaliza el número base del RUT."""
        base = asegurar_cadena_no_vacia(base, "base")

        if not (RE_BASE_CON_PUNTOS.match(base) or RE_BASE_DIGITOS.match(base)):
            raise ErrorFormatoRut(
                base, "cadena numérica con separadores de miles opcionales"
            )

        base_normalizada = normalizar_base_rut(base)
        if len(base_normalizada) < self.configuracion.min_digitos:
            raise ErrorLongitudRut(
                rut_original,
                len(base_normalizada),
                self.configuracion.min_digitos,
                minimo=True,
            )
        if len(base_normalizada) > self.configuracion.max_digitos:
            raise ErrorLongitudRut(
                rut_original, len(base_normalizada), self.configuracion.max_digitos
            )
        logger.debug("Base validada y normalizada correctamente")
        return base_normalizada

    def validar_digito_verificador(
        self, digito_ingresado: str | None, digito_calculado: str
    ) -> None:
        """Valida el dígito verificador del RUT."""
        if digito_ingresado is None:
            return
        if not isinstance(digito_ingresado, str):
            raise ErrorValidacionRut(
                "El dígito verificador debe ser una cadena", codigo_error="ERROR_TIPO"
            )
        if digito_ingresado.lower() != digito_calculado.lower():
            raise ErrorDigitoRut(digito_ingresado, digito_calculado)
        logger.debug(
            "Dígito verificador validado: %s == %s", digito_ingresado, digito_calculado
        )

__init__

__init__(configuracion: ConfiguracionRut = CONFIGURACION_POR_DEFECTO, modo: RigorValidacion = RigorValidacion.ESTRICTO) -> None

Inicializa el validador con configuración y rigor.

Parameters:

Name Type Description Default
configuracion ConfiguracionRut

Parámetros de validación (factores, módulo, dígitos mínimo/máximo).

CONFIGURACION_POR_DEFECTO
modo RigorValidacion

Nivel de rigurosidad (ESTRICTO o FLEXIBLE).

ESTRICTO
Source code in rutificador/validador.py
def __init__(
    self,
    configuracion: ConfiguracionRut = CONFIGURACION_POR_DEFECTO,
    modo: RigorValidacion = RigorValidacion.ESTRICTO,
) -> None:
    """Inicializa el validador con configuración y rigor.

    Args:
        configuracion: Parámetros de validación (factores, módulo,
            dígitos mínimo/máximo).
        modo: Nivel de rigurosidad (``ESTRICTO`` o ``FLEXIBLE``).
    """
    self.configuracion = configuracion
    self.modo = modo
    logger.debug("ValidadorRut inicializado con modo: %s", modo.value)

validar_formato

validar_formato(cadena_rut: str) -> Match[str]

Valida el formato del RUT.

Source code in rutificador/validador.py
def validar_formato(self, cadena_rut: str) -> Match[str]:
    """Valida el formato del RUT."""
    cadena_rut = asegurar_cadena_no_vacia(cadena_rut, "RUT")

    if self.modo == RigorValidacion.FLEXIBLE:
        cadena_rut, _ = _limpiar_entrada(cadena_rut)

    match = RUT_REGEX.fullmatch(cadena_rut)
    if not match:
        raise ErrorFormatoRut(
            cadena_rut,
            (
                "XXXXXXXX-X o XX.XXX.XXX-X donde X son dígitos "
                "y el último puede ser 'k'"
            ),
        )

    base_capturada = match.group(1)
    base_normalizada = normalizar_base_rut(base_capturada)
    if len(base_normalizada) > self.configuracion.max_digitos:
        raise ErrorLongitudRut(
            cadena_rut, len(base_normalizada), self.configuracion.max_digitos
        )
    logger.debug("Formato de RUT validado correctamente")
    return match

validar_base

validar_base(base: str, rut_original: str) -> str

Valida y normaliza el número base del RUT.

Source code in rutificador/validador.py
def validar_base(self, base: str, rut_original: str) -> str:
    """Valida y normaliza el número base del RUT."""
    base = asegurar_cadena_no_vacia(base, "base")

    if not (RE_BASE_CON_PUNTOS.match(base) or RE_BASE_DIGITOS.match(base)):
        raise ErrorFormatoRut(
            base, "cadena numérica con separadores de miles opcionales"
        )

    base_normalizada = normalizar_base_rut(base)
    if len(base_normalizada) < self.configuracion.min_digitos:
        raise ErrorLongitudRut(
            rut_original,
            len(base_normalizada),
            self.configuracion.min_digitos,
            minimo=True,
        )
    if len(base_normalizada) > self.configuracion.max_digitos:
        raise ErrorLongitudRut(
            rut_original, len(base_normalizada), self.configuracion.max_digitos
        )
    logger.debug("Base validada y normalizada correctamente")
    return base_normalizada

validar_digito_verificador

validar_digito_verificador(digito_ingresado: str | None, digito_calculado: str) -> None

Valida el dígito verificador del RUT.

Source code in rutificador/validador.py
def validar_digito_verificador(
    self, digito_ingresado: str | None, digito_calculado: str
) -> None:
    """Valida el dígito verificador del RUT."""
    if digito_ingresado is None:
        return
    if not isinstance(digito_ingresado, str):
        raise ErrorValidacionRut(
            "El dígito verificador debe ser una cadena", codigo_error="ERROR_TIPO"
        )
    if digito_ingresado.lower() != digito_calculado.lower():
        raise ErrorDigitoRut(digito_ingresado, digito_calculado)
    logger.debug(
        "Dígito verificador validado: %s == %s", digito_ingresado, digito_calculado
    )