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
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
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
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
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
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