Example #1
0
    def __init__(self, window, conf_file):
        # Ventana principal
        self.window = window
        # Selecciono el diccionario general y el de los patrones en el archivo de configuración
        self.pattern_dic = conf_file["patterns"]
        self.general_dic = conf_file["general"]
        self.ruta_inicial = self.general_dic["ruta_inicial"]

        #Inicializo una tupla de mensajes
        self.__msg = CT.msg()
Example #2
0
def pdfatexto(arch_sel):
    """Función que convierte el pdf a texto raw

        Arg:
            arch_sel: Ruta y nombre del archivo pfd a convertir a texto
    """

    # Inicializo el objeto que acumula los mensajes en una tupla.
    msg = CT.msg()

    # Nombre del archivo pdf original a evaluar
    file_orig = os.path.basename(arch_sel)
    # Nombre de la ruta original
    ruta_orig = os.path.dirname(arch_sel) + '/'
    # Nombre del archivo convertido a modo texto
    filename = os.path.splitext(file_orig)[0] + ".txt"

    logger.info("-- Convierto archivo pdf a texto")
    logger.info("Archivo original: %s" % arch_sel)
    logger.info("Archivo original Tipo: %s" % type(arch_sel))
    logger.debug("Archivo modo texto: %s" % filename)

    # Si no existe el archivo indicado
    if not os.path.isfile(arch_sel):
        msg.error("No existe el archivo: %s" % file_orig)
        msg.print_tMsg()
        sys.exit()
    # Si no hay un archivo pdf ya convertido con el mismo nombre en el destino => Convierto el archivo indicado
    elif not os.path.isfile(ruta_orig + filename):
        # subprocess.call(["df","-h","/home"])
        subprocess.call([
            "pdftotext", "-f", "1", "-l", "1", "-raw", arch_sel,
            str(ruta_orig + filename)
        ])
        msg.info("Archivo: %s convertido a texto" % file_orig)
    # Si llegó acá es porque ya existe un archivo convertido con el mismo nombre.
    else:
        msg.warning(
            "El archivo: %s ya tiene un archivo convertido a texto con el mismo nombre"
            % file_orig)

    msg.print_tMsg()
    return msg.get_tMsg()
Example #3
0
def pdfatexto(arch_sel):
    """Función que convierte el pdf a texto raw

        Arg:
            arch_sel: Ruta y nombre del archivo pfd a convertir a texto
    """

    # Inicializo el objeto que acumula los mensajes en una tupla.
    msg = CT.msg()

    # Nombre del archivo pdf original a evaluar
    file_orig = os.path.basename(arch_sel)
    # Nombre de la ruta original
    ruta_orig = os.path.dirname(arch_sel) + '/'
    # Nombre del archivo convertido a modo texto
    filename = os.path.splitext(file_orig)[0] + ".txt"

    logger.info("-- Convierto archivo pdf a texto")
    logger.info("Archivo original: %s" % arch_sel)
    logger.info("Archivo original Tipo: %s" % type(arch_sel))
    logger.debug("Archivo modo texto: %s" % filename)

    # Si no existe el archivo indicado
    if not os.path.isfile(arch_sel):
        msg.error("No existe el archivo: %s" % file_orig)
        msg.print_tMsg()
        sys.exit()
    # Si no hay un archivo pdf ya convertido con el mismo nombre en el destino => Convierto el archivo indicado
    elif not os.path.isfile(ruta_orig + filename):
        # subprocess.call(["df","-h","/home"])
        subprocess.call(["pdftotext", "-f", "1", "-l", "1", "-raw", arch_sel, str(ruta_orig + filename)])
        msg.info("Archivo: %s convertido a texto" % file_orig)
    # Si llegó acá es porque ya existe un archivo convertido con el mismo nombre.
    else:
        msg.warning("El archivo: %s ya tiene un archivo convertido a texto con el mismo nombre" % file_orig)

    msg.print_tMsg()
    return  msg.get_tMsg()
Example #4
0
def arch_magic(general_dic, pattern_dic, arch_sel):
    """Función que analiza un archivo pdf y lo compara con un diccionario de patrones

        data_dic: diccionario con la información de los patrones, nombre del archivo de salida,etc.
        ruta_orig: ruta desde donde analizo los archivos.
        file_original: nombre del archivo original a analizar
    """

    # Inicializo el objeto que acumula los mensajes en una tupla.
    msg = CT.msg()

    # Nombre del archivo pdf original a evaluar. Lo codifico en utf-8 para no tener problemas
    file_orig = os.path.basename(arch_sel)
    # Nombre de la ruta original. Lo codifico en utf-8 para no tener problemas
    ruta_orig = os.path.dirname(arch_sel) + '/'
    # Nombre del archivo convertido a modo texto
    filename = os.path.splitext(file_orig)[0] + ".txt"

    msg.info("-- Archivo original: %s --\nRuta original: %s" % (file_orig, ruta_orig))
    logger.info("-- Archivo original: %s -- Ruta original: %s" % (file_orig, ruta_orig))

    logger.debug("Archivo modo texto: %s" % filename)

    if not os.path.isfile(ruta_orig + file_orig):
        logger.debug("No existe el archivo: %s" % file_orig)
        sys.exit()

    # Si el pdf no está convertido a texto lo convierto
    msg.info(pdfatexto(arch_sel))

    # Abro el archivo de texto en modo lectura y cargo el contenido del archivo de texto a una variable
    with open(ruta_orig + filename, "r") as dataFile:
        fullData = dataFile.read()
        # fullData = dataFile.read().splitlines()

    logger.debug("-- Acá comienza el bucle --")
    comp_ok = False
    file_sal = ''   # Variable con el nombre del archivo de salida
    subdir_destino = '' # Variable con el nombre del subdirectorio de salida (Para el caso de opción group_all).
    # Ordeno y recorro el diccionario de patrones.
    for item_conf in sorted(pattern_dic):
        logger.debug('-- Analizando el patrón ...%s' % item_conf)

        # Defino ruta destino para guardar el archivo
        # Si existe una ruta especial uso esa, sino uso ruta general definida al principio del archivo de configuración.
        # Python raises a KeyError whenever a dict() object is requested (using the format a = adict[key])
        # and the key is not in the dictionary. If you don't want to have an exception but would rather a default value
        #  used instead, you can use the get() method:
        ruta_default_dest = general_dic["ruta_destino"]
        ruta_destino = pattern_dic[item_conf].get('ruta_destino', ruta_default_dest)

        # Recupero las opciones específicas del patrón, si no están definidas me quedo con las generales.
        pattern_opt_default = general_dic['pattern_opt']
        pattern_opt = pattern_dic[item_conf].get('pattern_opt', pattern_opt_default)
        copia_destino_default = pattern_opt_default.get('copia_destino')
        copia_destino = pattern_opt.get('copia_destino', copia_destino_default)

        # Patrón a utilizar "pattern", variable con el resultado de la comparación "comp"
        logger.debug(type(pattern_dic[item_conf]['pattern']))
        pattern = r'%s' % pattern_dic[item_conf]['pattern']
        logger.debug('pattern: %s' % type(pattern))
        logger.debug("pattern: %s" % pattern)
        comp = re.search(pattern, fullData, flags=re.DOTALL | re.MULTILINE | re.IGNORECASE)
        if comp:
            logger.info("Coincidencia con el patrón analizado (%s)" % item_conf)
            msg.info("Coincidencia con el patrón analizado (%s)" % item_conf)
            logger.debug("Cantidad de Grupos: %s" % len(comp.groups()))
            # Formateo del nombre del archivo de salida. Convierto la cadena file_salida separada por comas en la tupla ftxt_sal.
            ftxt_sal = tuple(pattern_dic[item_conf]['file_salida'].split(','))
            # Armo de a pedazos el nombre del archivo de salida.
            for kk in ftxt_sal:
                # Si es un entero el nombre corresponde al grupo regex, si al string definido en el archivo conf.
                try:
                    kk = int(kk)
                    vg = comp.group(kk)
                    #print 'Es numerico -> Grupo, Valor:', kk, vg
                except ValueError:
                    vg = kk
                    #print 'Es una Cadena -> Valor:', vg
                file_sal += vg
            file_sal += '.pdf'
            logger.info('Nombre nuevo archivo: %s' % file_sal)
            msg.info('Nombre nuevo archivo: %s' % file_sal)

            # Si está definida group_all tengo que meter el archivo y los directorios adyacentes todos juntos en el
            # destino agrupandolos en un subdirectorio.
            group_all_default = ''
            group_all = pattern_dic[item_conf].get('group_all', group_all_default)
            if (group_all != '' and copia_destino):
                logger.info('Se agrupa a subdirectorio')
                msg.info('Se agrupa a subdirectorio')
                # Formateo del nombre del subdirectorio de destino. Convierto la cadena group_all separada por comas
                # en la tupla subdirtxt_dest.
                subdirtxt_dest = tuple(group_all.split(','))
                logger.debug('Tipo para subdirtxt_dest: %s - %s' % (type(subdirtxt_dest), subdirtxt_dest))
                # Armo de a pedazos el nombre del subdirectorio destino.
                for dkey in subdirtxt_dest:
                    # Si es un entero el nombre corresponde al grupo regex, sino al string definido en el archivo conf.
                    try:
                        dkey = int(dkey)
                        vdg = comp.group(dkey)
                    except ValueError:
                        vdg = dkey

                    subdir_destino += vdg
                subdir_destino += '/'

                # Verifico que el subdirectorio no exista en el destino
                logger.info('Creando el subdirectorio en el destino.')
                nueva_ruta_destino = ruta_destino + subdir_destino
                msg.info(' - Ruta destino: %s' % nueva_ruta_destino)
                logger.info(' - Ruta destino: %s' % nueva_ruta_destino)
                if not os.path.exists(nueva_ruta_destino):
                    # Verifico que el destino exista y tenga permiso de escritura
                    if copia_destino and check_path(ruta_destino,is_dir=True):
                        os.makedirs(nueva_ruta_destino) # Creo el subdirectorio

                        logger.debug('Copio el archivo y los directorios adyacentes al subdirectorio destino.')

                        # Copio el archivo pdf
                        shutil.copy2(ruta_orig + file_orig, nueva_ruta_destino + file_sal)
                        msg.info('\tSe copió el archivo')
                        logger.info('\tSe copió el archivo')

                        # Copio los directorios adyacentes al sudirectorio destino
                        subdir_ady = os.walk(ruta_orig).next()[1]
                        for ix_subd in subdir_ady:
                            shutil.copytree(ruta_orig + ix_subd, nueva_ruta_destino + ix_subd)
                            msg.info('\tDirectorios adyacentes copiados: %s' % ix_subd)
                            logger.info('\tDirectorios adyacentes copiados: %s' % ix_subd)
                    else:
                        msg.warning('Atención: El directorio destino no existe o no tengo permisos de escritura.')
                        group_all_ok = False
                else:
                    msg.warning('Atención: Ya existe un archivo/directorio con el mismo nombre en el destino.')
                    logger.info('Atención: Ya existe un archivo/directorio con el mismo nombre en el destino.')
                    group_all_ok = False

            else:
                # No hay agrupamiento a subdirectorio => Solo copio el archivo
                logger.info('No agrupo a subdirectorio')
                # Verifico que no exista el archivo
                if copia_destino and not os.path.isfile(ruta_destino + file_sal):
                    logger.debug('Entro al bucle de copia 1')
                    if os.access(ruta_destino, os.W_OK):
                        logger.debug('Entro al bucle de copia 2')
                        logger.debug('Copiando archivo %s %s %s %s' % (ruta_orig, file_orig, ruta_destino, file_sal))
                        # Creo una copia y renombro el archivo
                        shutil.copy2(ruta_orig + file_orig, ruta_destino + file_sal)
                        msg.info('Se copió el archivo - Directorio destino: %s' % ruta_destino)
                        logger.info('Se copió el archivo - Directorio destino: %s' % ruta_destino)

                else:
                    logger.debug('Entro al bucle de copia 3')
                    msg.warning('Atención: No copio el archivo porque ya existe un archivo/directorio con el mismo nombre en el destino.')
                    logger.info('Atención: No copio el archivo porque ya existe un archivo/directorio con el mismo nombre en el destino.')
                    #sys.exit('Atención: No muevo el archivo porque ya existe un archivo/directorio con el mismo nombre en el destino.')

            # Renombro el archivo en el lugar
            if not os.path.isfile(ruta_orig + file_sal):
                shutil.move(ruta_orig + file_orig, ruta_orig + file_sal)
                msg.info('Se renombró el archivo en el origen.')
                logger.info('Se renombro el archivo en el origen.')
            else:
                msg.warning('Atención: No renombro el archivo en el directorio de origen porque ya existe uno con el mismo nombre.')
                logger.info('Atención: No renombro el archivo en el directorio de origen porque ya existe uno con el mismo nombre.')

            # Asigno valor a la variable que indica que hubo coincidencia y salgo del bucle.
            comp_ok = True
            break   # A la primera coincidencia salgo del bucle.

        else:
            logger.debug("-- El patrón: %s no coincide con el archivo analizado --" % item_conf)

    # Si no coincide ningún patrón.
    if not comp_ok:
        msg.warning('-- Ningún Patrón conocido coincide con el archivo %s analizado --' % file_orig)
        logger.info('-- Ningún Patrón conocido coincide con el archivo %s analizado --' % file_orig)


    # Borro el archivo convertido a texto
    if os.path.isfile(ruta_orig + filename):
        os.remove(ruta_orig + filename)

    return msg.get_tMsg()
Example #5
0
def arch_magic(general_dic, pattern_dic, arch_sel):
    """Función que analiza un archivo pdf y lo compara con un diccionario de patrones

        data_dic: diccionario con la información de los patrones, nombre del archivo de salida,etc.
        ruta_orig: ruta desde donde analizo los archivos.
        file_original: nombre del archivo original a analizar
    """

    # Inicializo el objeto que acumula los mensajes en una tupla.
    msg = CT.msg()

    # Nombre del archivo pdf original a evaluar. Lo codifico en utf-8 para no tener problemas
    file_orig = os.path.basename(arch_sel)
    # Nombre de la ruta original. Lo codifico en utf-8 para no tener problemas
    ruta_orig = os.path.dirname(arch_sel) + '/'
    # Nombre del archivo convertido a modo texto
    filename = os.path.splitext(file_orig)[0] + ".txt"

    msg.info("-- Archivo original: %s --\nRuta original: %s" %
             (file_orig, ruta_orig))
    logger.info("-- Archivo original: %s -- Ruta original: %s" %
                (file_orig, ruta_orig))

    logger.debug("Archivo modo texto: %s" % filename)

    if not os.path.isfile(ruta_orig + file_orig):
        logger.debug("No existe el archivo: %s" % file_orig)
        sys.exit()

    # Si el pdf no está convertido a texto lo convierto
    msg.info(pdfatexto(arch_sel))

    # Abro el archivo de texto en modo lectura y cargo el contenido del archivo de texto a una variable
    with open(ruta_orig + filename, "r") as dataFile:
        fullData = dataFile.read()
        # fullData = dataFile.read().splitlines()

    logger.debug("-- Acá comienza el bucle --")
    comp_ok = False
    file_sal = ''  # Variable con el nombre del archivo de salida
    subdir_destino = ''  # Variable con el nombre del subdirectorio de salida (Para el caso de opción group_all).
    # Ordeno y recorro el diccionario de patrones.
    for item_conf in sorted(pattern_dic):
        logger.debug('-- Analizando el patrón ...%s' % item_conf)

        # Defino ruta destino para guardar el archivo
        # Si existe una ruta especial uso esa, sino uso ruta general definida al principio del archivo de configuración.
        # Python raises a KeyError whenever a dict() object is requested (using the format a = adict[key])
        # and the key is not in the dictionary. If you don't want to have an exception but would rather a default value
        #  used instead, you can use the get() method:
        ruta_default_dest = general_dic["ruta_destino"]
        ruta_destino = pattern_dic[item_conf].get('ruta_destino',
                                                  ruta_default_dest)

        # Recupero las opciones específicas del patrón, si no están definidas me quedo con las generales.
        pattern_opt_default = general_dic['pattern_opt']
        pattern_opt = pattern_dic[item_conf].get('pattern_opt',
                                                 pattern_opt_default)
        copia_destino_default = pattern_opt_default.get('copia_destino')
        copia_destino = pattern_opt.get('copia_destino', copia_destino_default)

        # Patrón a utilizar "pattern", variable con el resultado de la comparación "comp"
        logger.debug(type(pattern_dic[item_conf]['pattern']))
        pattern = r'%s' % pattern_dic[item_conf]['pattern']
        logger.debug('pattern: %s' % type(pattern))
        logger.debug("pattern: %s" % pattern)
        comp = re.search(pattern,
                         fullData,
                         flags=re.DOTALL | re.MULTILINE | re.IGNORECASE)
        if comp:
            logger.info("Coincidencia con el patrón analizado (%s)" %
                        item_conf)
            msg.info("Coincidencia con el patrón analizado (%s)" % item_conf)
            logger.debug("Cantidad de Grupos: %s" % len(comp.groups()))
            # Formateo del nombre del archivo de salida. Convierto la cadena file_salida separada por comas en la tupla ftxt_sal.
            ftxt_sal = tuple(pattern_dic[item_conf]['file_salida'].split(','))
            # Armo de a pedazos el nombre del archivo de salida.
            for kk in ftxt_sal:
                # Si es un entero el nombre corresponde al grupo regex, si al string definido en el archivo conf.
                try:
                    kk = int(kk)
                    vg = comp.group(kk)
                    #print 'Es numerico -> Grupo, Valor:', kk, vg
                except ValueError:
                    vg = kk
                    #print 'Es una Cadena -> Valor:', vg
                file_sal += vg
            file_sal += '.pdf'
            logger.info('Nombre nuevo archivo: %s' % file_sal)
            msg.info('Nombre nuevo archivo: %s' % file_sal)

            # Si está definida group_all tengo que meter el archivo y los directorios adyacentes todos juntos en el
            # destino agrupandolos en un subdirectorio.
            group_all_default = ''
            group_all = pattern_dic[item_conf].get('group_all',
                                                   group_all_default)
            if (group_all != '' and copia_destino):
                logger.info('Se agrupa a subdirectorio')
                msg.info('Se agrupa a subdirectorio')
                # Formateo del nombre del subdirectorio de destino. Convierto la cadena group_all separada por comas
                # en la tupla subdirtxt_dest.
                subdirtxt_dest = tuple(group_all.split(','))
                logger.debug('Tipo para subdirtxt_dest: %s - %s' %
                             (type(subdirtxt_dest), subdirtxt_dest))
                # Armo de a pedazos el nombre del subdirectorio destino.
                for dkey in subdirtxt_dest:
                    # Si es un entero el nombre corresponde al grupo regex, sino al string definido en el archivo conf.
                    try:
                        dkey = int(dkey)
                        vdg = comp.group(dkey)
                    except ValueError:
                        vdg = dkey

                    subdir_destino += vdg
                subdir_destino += '/'

                # Verifico que el subdirectorio no exista en el destino
                logger.info('Creando el subdirectorio en el destino.')
                nueva_ruta_destino = ruta_destino + subdir_destino
                msg.info(' - Ruta destino: %s' % nueva_ruta_destino)
                logger.info(' - Ruta destino: %s' % nueva_ruta_destino)
                if not os.path.exists(nueva_ruta_destino):
                    # Verifico que el destino exista y tenga permiso de escritura
                    if copia_destino and check_path(ruta_destino, is_dir=True):
                        os.makedirs(
                            nueva_ruta_destino)  # Creo el subdirectorio

                        logger.debug(
                            'Copio el archivo y los directorios adyacentes al subdirectorio destino.'
                        )

                        # Copio el archivo pdf
                        shutil.copy2(ruta_orig + file_orig,
                                     nueva_ruta_destino + file_sal)
                        msg.info('\tSe copió el archivo')
                        logger.info('\tSe copió el archivo')

                        # Copio los directorios adyacentes al sudirectorio destino
                        subdir_ady = os.walk(ruta_orig).next()[1]
                        for ix_subd in subdir_ady:
                            shutil.copytree(ruta_orig + ix_subd,
                                            nueva_ruta_destino + ix_subd)
                            msg.info('\tDirectorios adyacentes copiados: %s' %
                                     ix_subd)
                            logger.info(
                                '\tDirectorios adyacentes copiados: %s' %
                                ix_subd)
                    else:
                        msg.warning(
                            'Atención: El directorio destino no existe o no tengo permisos de escritura.'
                        )
                        group_all_ok = False
                else:
                    msg.warning(
                        'Atención: Ya existe un archivo/directorio con el mismo nombre en el destino.'
                    )
                    logger.info(
                        'Atención: Ya existe un archivo/directorio con el mismo nombre en el destino.'
                    )
                    group_all_ok = False

            else:
                # No hay agrupamiento a subdirectorio => Solo copio el archivo
                logger.info('No agrupo a subdirectorio')
                # Verifico que no exista el archivo
                if copia_destino and not os.path.isfile(ruta_destino +
                                                        file_sal):
                    logger.debug('Entro al bucle de copia 1')
                    if os.access(ruta_destino, os.W_OK):
                        logger.debug('Entro al bucle de copia 2')
                        logger.debug(
                            'Copiando archivo %s %s %s %s' %
                            (ruta_orig, file_orig, ruta_destino, file_sal))
                        # Creo una copia y renombro el archivo
                        shutil.copy2(ruta_orig + file_orig,
                                     ruta_destino + file_sal)
                        msg.info(
                            'Se copió el archivo - Directorio destino: %s' %
                            ruta_destino)
                        logger.info(
                            'Se copió el archivo - Directorio destino: %s' %
                            ruta_destino)

                else:
                    logger.debug('Entro al bucle de copia 3')
                    msg.warning(
                        'Atención: No copio el archivo porque ya existe un archivo/directorio con el mismo nombre en el destino.'
                    )
                    logger.info(
                        'Atención: No copio el archivo porque ya existe un archivo/directorio con el mismo nombre en el destino.'
                    )
                    #sys.exit('Atención: No muevo el archivo porque ya existe un archivo/directorio con el mismo nombre en el destino.')

            # Renombro el archivo en el lugar
            if not os.path.isfile(ruta_orig + file_sal):
                shutil.move(ruta_orig + file_orig, ruta_orig + file_sal)
                msg.info('Se renombró el archivo en el origen.')
                logger.info('Se renombro el archivo en el origen.')
            else:
                msg.warning(
                    'Atención: No renombro el archivo en el directorio de origen porque ya existe uno con el mismo nombre.'
                )
                logger.info(
                    'Atención: No renombro el archivo en el directorio de origen porque ya existe uno con el mismo nombre.'
                )

            # Asigno valor a la variable que indica que hubo coincidencia y salgo del bucle.
            comp_ok = True
            break  # A la primera coincidencia salgo del bucle.

        else:
            logger.debug(
                "-- El patrón: %s no coincide con el archivo analizado --" %
                item_conf)

    # Si no coincide ningún patrón.
    if not comp_ok:
        msg.warning(
            '-- Ningún Patrón conocido coincide con el archivo %s analizado --'
            % file_orig)
        logger.info(
            '-- Ningún Patrón conocido coincide con el archivo %s analizado --'
            % file_orig)

    # Borro el archivo convertido a texto
    if os.path.isfile(ruta_orig + filename):
        os.remove(ruta_orig + filename)

    return msg.get_tMsg()
Example #6
0
# Establezco un objeto logger y su nombre
logger = logging.getLogger(__name__)


# Páginas para implementar la GUI

import ClasesGui as CG
import ClassTools as CT

# Declaro la Ventana principal de la GUI
root = Tk()

result = CG.TkGui(root,default_side=LEFT)

mensaje = CT.msg()
mensaje.info('Es una información')
mensaje.error('Es un error')
mensaje.warning('Es una advertencia')
mensaje.getMsg()
result.msg_text(mensaje.getMsg())
#result.mostrar()


#msg = (('Un mensaje informativo','info'),('Otro mensaje informativo','info'),('Un mensaje de advertencia','warning'),
#       ('Este mensaje final es de error','error'))
#result.msg_text(msg)

result.mensaje('La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa y sigue sigue la cosa '
               'La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa '
               'La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa ')
Example #7
0
import logging

# Establezco un objeto logger y su nombre
logger = logging.getLogger(__name__)

# Páginas para implementar la GUI

import ClasesGui as CG
import ClassTools as CT

# Declaro la Ventana principal de la GUI
root = Tk()

result = CG.TkGui(root, default_side=LEFT)

mensaje = CT.msg()
mensaje.info('Es una información')
mensaje.error('Es un error')
mensaje.warning('Es una advertencia')
mensaje.getMsg()
result.msg_text(mensaje.getMsg())
#result.mostrar()

#msg = (('Un mensaje informativo','info'),('Otro mensaje informativo','info'),('Un mensaje de advertencia','warning'),
#       ('Este mensaje final es de error','error'))
#result.msg_text(msg)

result.mensaje(
    'La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa y sigue sigue la cosa '
    'La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa '
    'La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa La sarasa '