Example #1
0
def resetear_por_inicio(linea_codigo, datos_formateados):
    '''[Autor: Ivan Litteri]
    [Ayuda: guarda la linea que le llega por parametro y resetea las variables y banderas]'''

    #Se declaran las banderas de comentarios y ayuda por si acaso (no se baja la bandera de funcion ya que se continua en una)
    datos_formateados["bandera_comentario"] = datos_formateados[
        "bandera_ayuda"] = False
    #Agrega un asterisco en el modulo principal, esto se usa luego para facilitar la deteccion de la funcion principal
    if datos_formateados["modulo"] == datos_formateados["modulo_principal"]:
        datos_formateados["lineas_fuente"].append(
            f'"{datos_formateados["funcion"]}","{datos_formateados["parametros"]}","*{datos_formateados["modulo"]}"{datos_formateados["lineas_funcion"]}\n'
        )
    #Guarda la primera parte de la linea a grabar en el fuente correspondiente
    else:
        datos_formateados["lineas_fuente"].append(
            f'"{datos_formateados["funcion"]}","{datos_formateados["parametros"]}","{datos_formateados["modulo"]}"{datos_formateados["lineas_funcion"]}\n'
        )
    datos_formateados["lineas_comentarios"].append(
        f'"{datos_formateados["funcion"]}","{datos_formateados["autor"]}","{datos_formateados["ayuda"]}","{datos_formateados["comentarios"]}"\n'
    )
    #Se reinician las variables que acumulan la informacion de las lineas de la funcion para que comiencen de cero
    datos_formateados["autor"] = datos_formateados[
        "ayuda"] = datos_formateados["comentarios"] = datos_formateados[
            "lineas_funcion"] = ""
    #Se obtiene la informacion de la linea de declaracion de funcion
    datos_formateados["funcion"], datos_formateados[
        "parametros"] = analizar_linea.declaracion_funcion(linea_codigo)

    return datos_formateados
Example #2
0
def resetear_por_inicio(linea_codigo, nombre_modulo, lineas_a_grabar, cadenas,
                        banderas, info_lineas, info_ubicaciones):
    '''[Autor: Ivan Litteri]
    [Ayuda: guarda la linea que le llega por parametro y resetea las variables y banderas]'''

    #Se declaran las banderas de comentarios y ayuda por si acaso (no se baja la bandera de funcion ya que se continua en una)
    banderas[1] = banderas[2] = False
    #Se agrega a la lista de lineas a grabar la informacion acumulada hasta el momento
    lineas_a_grabar[0].append(cadenas[0] + "\n")
    lineas_a_grabar[1].append(
        f'"{info_lineas[0]}","{info_lineas[1]}","{info_lineas[2]}","{info_lineas[3]}"\n'
    )
    #Se reinician las variables que acumulan la informacion de las lineas de la funcion para que comiencen de cero
    cadenas[0] = cadenas[1] = info_lineas[1] = info_lineas[2] = info_lineas[
        3] = ""
    #Se obtiene la informacion de la linea de declaracion de funcion
    info_lineas[0], param = analizar_linea.declaracion_funcion(linea_codigo)
    #Agrega un asterisco en el modulo principal, esto se usa luego para facilitar la deteccion de la funcion principal
    if nombre_modulo == info_ubicaciones[0][1]:
        cadenas[0] += f'"{info_lineas[0]}","{param}","*{nombre_modulo}"'
    #Guarda la primera parte de la linea a grabar en el fuente correspondiente
    else:
        cadenas[0] += f'"{info_lineas[0]}","{param}","{nombre_modulo}"'

    return lineas_a_grabar, cadenas, banderas, info_lineas
Example #3
0
def formatear_declaracion_funcion(linea_codigo, datos_formateados):
    '''[Autor: Ivan Litteri]
    [Ayuda: Analiza las lineas que previamente se catalogaron como declaracion de funcion, y les da formato para el csv]'''

    #Se levanta la bandera de funcion
    datos_formateados["bandera_funcion"] = True
    #Se bajan las banderas de comentario y ayuda en caso de que hayan quedado levantadas
    datos_formateados["bandera_comentario"] = datos_formateados[
        "bandera_ayuda"] = False
    #Se analiza la linea de declaracion
    datos_formateados["funcion"], datos_formateados[
        "parametros"] = analizar_linea.declaracion_funcion(linea_codigo)

    return datos_formateados
Example #4
0
def formatear_declaracion_funcion(linea_codigo, nombre_modulo, cadenas,
                                  banderas, info_lineas, info_ubicaciones):
    '''[Autor: Ivan Litteri]
    [Ayuda: Analiza las lineas que previamente se catalogaron como declaracion de funcion, y les da formato para el csv]'''

    #Se levanta la bandera de funcion
    banderas[0] = True
    #Se bajan las banderas de comentario y ayuda en caso de que hayan quedado levantadas
    banderas[1] = banderas[2] = False
    #Se analiza la linea de declaracion
    info_lineas[0], param = analizar_linea.declaracion_funcion(linea_codigo)
    #Agrega un asterisco en el modulo principal, esto se usa luego para facilitar la deteccion de la funcion principal
    if nombre_modulo == info_ubicaciones[0][1]:
        cadenas[0] += f'"{info_lineas[0]}","{param}","*{nombre_modulo}"'
    #Guarda la primera parte de la linea a grabar en el fuente correspondiente
    else:
        cadenas[0] += f'"{info_lineas[0]}","{param}","{nombre_modulo}"'

    return cadenas, banderas, info_lineas, info_ubicaciones
Example #5
0
def leer_codigo(codigo,
                datos_ordenados,
                nombre_modulo,
                imports,
                bandera_funcion=False,
                bandera_comentario=False,
                bandera_ayuda=False,
                nombre_funcion=None):
    '''[Autor: Ivan Litteri]
    [Ayuda: Lee el codigo que le llega por parametro, lo analiza con distintas funciones y actualiza el 
    diccionario donde se guardan los datos analizados cada vez que se llama.]'''

    linea_codigo = codigo.readline().replace('"', "'")
    while linea_codigo:
        #Se habilita esta bandera cuando en el codigo a leer empieza una funcion, se deshabilita cuando termina o empieza otra.
        if bandera_funcion and not linea_codigo.startswith("def"):
            #Se habilita esta bandera cuando se detecta un comentario multilinea que no se cierra en la misma linea.
            if bandera_comentario:
                ayuda_funcion, bandera_ayuda = analizar.ayuda_funcion(
                    linea_codigo, bandera_ayuda)
                datos_ordenados[nombre_funcion]["comentarios"][
                    "ayuda"] += ayuda_funcion
                #Se deshabilita la bandera cuando se detecta que se cierra el comentario multilinea.
                if "'''" in linea_codigo:
                    bandera_comentario = False
            #Guarda otro tipo de comentarios
            elif "#" in linea_codigo:
                if not linea_codigo.startswith("#"):
                    #Si es None, cambia su valor a una lista vacia para que se pueda hacer append.
                    if datos_ordenados[nombre_funcion]["comentarios"][
                            "otros"] == None:
                        datos_ordenados[nombre_funcion]["comentarios"][
                            "otros"] = []
                    otro_comentario, posible_linea = analizar.comentario_numeral(
                        linea_codigo)
                    datos_ordenados[nombre_funcion]["lineas"].append(
                        f'"{posible_linea.strip()}"')
                    datos_ordenados[nombre_funcion]["comentarios"][
                        "otros"].append(f'"{otro_comentario}"')
                else:
                    datos_ordenados[nombre_funcion]["comentarios"][
                        "otros"].append(f'"{otro_comentario}"')
            #Si un comentario multilinea se abre y cierra en la misma linea, analiza la linea y guarda los datos del autor.
            elif linea_codigo.count("'''") == 2:
                autor_funcion = analizar.autor_funcion(linea_codigo)
                datos_ordenados[nombre_funcion]["comentarios"][
                    "autor"] = autor_funcion
            #Si la linea empieza con un comentario multilinea, y no se cierra en la misma linea, se analiza esta primera linea que corresponde
            #al autor, y luego habilita la bandera de comentario multilinea para que se analicen las lineas siguientes hasta que se cierre
            #el comentario multilinea.
            elif linea_codigo.strip().startswith("'''"):
                bandera_comentario = True
                autor_funcion = analizar.autor_funcion(linea_codigo)
                datos_ordenados[nombre_funcion]["comentarios"][
                    "autor"] = autor_funcion
            #Si ninguna linea es un comentario guarda la linea en lineas de codigo.
            else:
                if not linea_codigo.isspace():
                    datos_ordenados[nombre_funcion]["lineas"].append(
                        f'"{linea_codigo.strip()}"')

        if linea_codigo.strip().startswith("return"):
            bandera_funcion = False
        if linea_codigo.startswith("def"):
            bandera_funcion = True
            nombre_funcion, parametros_funcion = analizar.declaracion_funcion(
                linea_codigo)
            datos_ordenados[nombre_funcion] = {
                "modulo": nombre_modulo,
                "parametros": parametros_funcion,
                "lineas": [],
                "comentarios": {
                    "autor": "",
                    "ayuda": "",
                    "otros": None
                }
            }
        #Almaceno las lineas de imports.
        if linea_codigo.startswith("import"):
            #Si el nombre del modulo no esta como key, entonces lo agrega (Esto ocurre una vez sola).
            if nombre_modulo not in imports:
                imports[nombre_modulo] = []
            imports[nombre_modulo].append(linea_codigo)
        #Lee la siguiente linea del codigo.
        linea_codigo = codigo.readline().replace('"', "'")

    #Devuelvo un diccionario de datos de todos los modulos, y uno de imports.
    return datos_ordenados, imports
Example #6
0
def analizar_linea_codigo(linea_codigo, ubicacion, nombre_modulo, ubicaciones,
                          datos_fuente, datos_comentarios, linea_fuente,
                          linea_comentarios, autor, ayuda, otros_comentarios,
                          lineas_fuera_funcion, bandera_funcion,
                          bandera_comentario, bandera_ayuda, contador_def):
    '''[Autor: Ivan Litteri]'''

    if linea_codigo[0:3] == "def":
        bandera_funcion = True
        contador_def += 1
        if contador_def > 1:
            linea_fuente += "\n"
            linea_comentarios += f',"{autor}","{ayuda}","{otros_comentarios}"\n'
            datos_fuente.append(linea_fuente)
            datos_comentarios.append(linea_comentarios)
            linea_fuente = linea_comentarios = autor = ayuda = otros_comentarios = ""
        else:
            datos_comentarios = []
            datos_fuente = []
        funcion, parametros = analizar_linea.declaracion_funcion(linea_codigo)
        if ubicacion == ubicaciones[0][0]:
            linea_fuente += f'"{funcion}","{parametros}","*{nombre_modulo}"'
        else:
            linea_fuente += f'"{funcion}","{parametros}","{nombre_modulo}"'
        linea_comentarios += f'"{funcion}"'
    elif bandera_funcion:
        if "return" in linea_codigo:
            linea_fuente += f',"{linea_codigo.strip()}"'
            bandera_funcion = False
        else:
            if bandera_comentario:
                ayuda_funcion, bandera_ayuda = analizar_linea.ayuda_funcion(
                    linea_codigo, bandera_ayuda)
                ayuda += f'{ayuda_funcion}'
                if "'''" in linea_codigo or '"""' in linea_codigo:
                    bandera_comentario = False
            elif "#" in linea_codigo:
                comentario, linea = analizar_linea.comentario_numeral(
                    linea_codigo)
                otros_comentarios += f'{comentario}'
                if linea.strip() != "":
                    linea_fuente += f',"{linea}",'
            elif "'''" in linea_codigo or '"""' in linea_codigo:
                if linea_codigo.count("'''") == 2 or linea_codigo.count(
                        '"""') == 2:
                    bandera_comentario = False
                    if "Autor" in linea_codigo:
                        autor += f'{analizar_linea.autor_funcion(linea_codigo)}'
                    elif "Ayuda" in linea_codigo:
                        ayuda += f'{linea_codigo[4:-4]}'
                    else:
                        otros_comentarios += f'{linea_codigo[3:-3]}'
                else:
                    bandera_comentario = True
                    autor += f'{analizar_linea.autor_funcion(linea_codigo)}'
            elif linea_codigo.strip() != "":
                linea_fuente += f',"{linea_codigo.strip()}"'
    else:
        lineas_fuera_funcion.append(linea_codigo.strip())

    return datos_fuente, datos_comentarios, linea_fuente, linea_comentarios, autor, ayuda, otros_comentarios, lineas_fuera_funcion, bandera_funcion, bandera_comentario, bandera_ayuda, contador_def