-
Notifications
You must be signed in to change notification settings - Fork 2
/
registro.py
130 lines (95 loc) · 3.56 KB
/
registro.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# from funciones import generar_matriz, mostrar_por_tags, descomponer_fecha
class Popularidad:
def __init__(self, mes, estrellas, cant_proy):
self.mes = mes
self.estrellas = estrellas
self.cant_proy = cant_proy
def __str__(self):
return "{:^6} | {:>10.2f}k | {:>10}".format(self.mes, self.estrellas, self.cant_proy)
def cabera_popularidad():
return "{:^6} | {:>11} | {:>10}".format("Mes", "Estrellas", "Proyectos") + "\n" + "-" * 34
class Proyecto:
def __init__(self, nombre_usuario, repositorio, fecha_actualizacion, lenguaje, likes, tags, url):
self.nombre_usuario = nombre_usuario
self.repositorio = repositorio
self.fecha_actualizacion = fecha_actualizacion
self.lenguaje = lenguaje
self.likes = likes
self.tags = tags
self.url = url
def formato_archivo(self):
return f"{self.nombre_usuario}|{self.repositorio}|{self.fecha_actualizacion}|{self.lenguaje}|{self.likes}|{','.join(self.tags)}|{self.url}"
def __str__(self):
return "{:^16} | {:^20} | {:^12} | {:^11} | {:^5.2f}k | {:^60} | {:^20}".format(self.nombre_usuario, self.repositorio, self.fecha_actualizacion, self.lenguaje, self.likes, ", ".join(self.tags), self.url)
def cabezera_proyectos():
return "{:^16} | {:^20} | {:^12} | {:^11} | {:^7} | {:^60} | {:^20}".format(
"Nombre usuario",
"Repositorio",
"Fecha Act.",
"Lenguaje",
"Likes",
"Tags",
"URL") + "\n" + "-" * 180
def convertir_a_proyecto(cadena, sep="|"):
campos = cadena.split(sep)
return Proyecto(
campos[0],
campos[1],
campos[3],
campos[4],
float(campos[5].replace("k", "")),
campos[6].split(","), # Tags
campos[7]
)
def busqueda_binaria(proyecto, vec_proyectos):
n = len(vec_proyectos)
izq = 0
der = n - 1
c = 0
while izq <= der:
c = (izq + der) // 2
if vec_proyectos[c].repositorio.lower() == proyecto.repositorio.lower():
return -1 # No deben repetirse los repositorios.
elif vec_proyectos[c].repositorio.lower() > proyecto.repositorio.lower():
der = c - 1
else:
izq = c + 1
if izq > der:
return izq
return c
def insetar_proy_ordenado(proyecto, vec_proyectos):
# Buscar la posición donde se debe insertar el proyecto mediante busqueda binaria
pos = busqueda_binaria(proyecto, vec_proyectos)
if pos != -1:
# Inserta un proyecto en el vector de proyectos
vec_proyectos[pos:pos] = [proyecto]
return True
return False # Repetido
def comprobar_linea(linea):
campos = linea.split("|")
# lenguaje en blanco
if campos[4] == "":
return False
return True
def discriminar_lenguajes(vec_proyectos):
# [ [lenguaje, cantidad] ]
lenguajes_cantidad = []
for i in range(len(vec_proyectos)):
linea = vec_proyectos[i].lenguaje
exist = False
for j in range(len(lenguajes_cantidad)):
# si se encuentra en la lista lo suma
if linea == lenguajes_cantidad[j][0]:
exist = True
lenguajes_cantidad[j][1] += 1
# si no lo encuentra lo añade
if not exist:
box = [linea, 1]
lenguajes_cantidad.append(box)
return lenguajes_cantidad
def buscar_por_tag(tag, vec_proyectos):
coincidencias = []
for i in range(len(vec_proyectos)):
if tag in vec_proyectos[i].tags:
coincidencias.append(vec_proyectos[i])
return coincidencias