Coder Social home page Coder Social logo

tarea_final_python's Introduction

🧑‍🦲 Proyecto "Pedro"

⚠️ Aclaración

La estructura y repartición de tareas de este proyecto ha sido definido por Héctor a las 4 de la tarde mientras está escuchando el partido del Barcelona de fondo. Así que cualquier sugerencia se debe llevar a las organizaciones pertinentes (o sea los otros dos integrantes del equipo)

😹 Chistecillo

  • Mamá los fideos se están pegando en el sartén
  • No te metas, deja que se golpeen

😀 Objetivos del trabajo

  • Lograr que Amaya no deje espacios en blanco innecesarios
  • Conseguir que Hector y José no cometan faltas de ortografía en los comentarios
  • Aprobar Economía Empresarial (opcional)
  • Mantener el nivel de sensualidad del equipo por las nubes

😹 Chistecillo

El otro día vi un otaku triste y lo anime

🕛 Antes de empezar

⚠️ Aclaración

PyQt pesa mas de 60 MB así que cuidado no me denuncien

  • Abrir la consola Anaconda (poner Anaconda Prompt en el buscador de Windows)

  • Crear un entorno virtual en caso de no haber creado uno

    conda create -n <nombre_entorno>
  • Activar con conda el entorno virtual en caso de tenerlo

    conda activate <nombre_entorno>
  • Instalar las librerías (PyQt6, matplotlib)

    pip install -r requirements.txt

😹 Chistecillo

Por qué los pinareños llevan cubos de agua al estadio? Para hacer la ola

📚 Estructura (hasta ahora)

  |--- src
    |--- modules
      |--- file_reader
        |--- classes
        |--- services
      |--- graph
        |--- classes
        |--- services
      |--- views
        |--- Main_Window
          |--- controller.py
          |--- ui.py
  |--- test
      |--- graph
      |--- file

Modules

La carpeta modules se refiere a los módulos o más bien las entidades de la aplicación. En este caso están graph y file_reader. Todos los módulos deben tener las carpetas classes y services.

  • La carpeta classes se refiere a las clases necesarias para trabajar. El caso más fácil es el grafo que habría que crear por ejemplo las clases GraphNode, Graph, GraphEdge, etc.
  • La carpeta services son los servicios del módulo. Por ejemplo para el file_reader se le pueden crear estos servicios
class FileReaderServices:
    // lee el txt y devuelve un grafo a través de lo leído 
    def import_graph_txt(self) -> Graph:
        open('tengo_hambre.txt', encoding='utf-8')
        // resto de la lógica
    
    def export_graph_txt(self, graph: Graph):
        pass

Views

La carpeta views está destinada a contener las carpetas con cada ventana del proyecto. (Lo más probable es que sea solo una que no vamos a hackear la NASA ni nada así).

  • Cada vista debe tener dos archivos: un controller donde estará la lógica de la interfaz, y un ui que tiene todo el código de la interfaz Donde no debe haber lógica practicamente.

Relación Vista-Controlador-Servicio

Para hacerme el inteligente voy a intentar explicar como se debería realizar cualquier procedimiento con esta relación. Como no se escribir voy a hacerlo a través de dibujos

Esta seria una vista de forma general

Esto sería un ejemplo

Test

La carpeta hasta ahora tiene dos sub-carpetas que pertenecen a cada módulo. En cada una de ellas deben ir los casos de test por separado con cada una de sus pruebas

Ejemplo

|--- file
  |--- import_graph_test.py
  |--- export_graph_test.py
  |--- incorrect_pattern_test.py

😹 Chistecillo

Cuál es el vino más amargo? Vino mi suegra

💻 Tareas (por ahora)

🧑‍🚀 Tareas de José

  • ✅ Crear la lógica básica del grafo. O sea crear la clase Graph, GraphEdge, GraphNode con sus propiedades.
  • ✅ Hacer el método dentro de Graph para poder hacer el recorrido a lo ancho. Creo que lo mejor seria que devolviera un array con el nombre de cada nodo que recorre
  • ✅ Crear unos cuantos archivos .txt dentro de la carpeta src/modules/file_reader/data que sean datos de prueba para extraer grafos de ellos.
  • ✅ Crear test que verifiquen que se está haciendo bien el recorrido a lo ancho.
  • ✅ Crear excepciones propias para cada caso de error que pueda devolver los procesos del grafo
  • ✅ Validar el formulario de los nodos (en FormSection.update_gaph_section), hay que mostrar un mensaje con la información del error en caso de que haya algún error (ya está mas menos adelantado sólo hay que fijarse en lo que está hecho)
  • ⭕ Convertir el input text (QLineText) que indica los nodos a los que se puede conectar la arista en un Dropdown con los nodos posibles a los que se puede conectar (La función que crea esto está en FormSection.create_node_connections)

🐈 Tareas de Amaya

  • ✅ Crear los métodos para importar y exportar en txt los grafos en File_Reader_Services.
  • ✅ Crear en Graph un método para recorrer en profundidad. Creo que lo mejor seria que devolviera un array con el nombre de cada nodo que recorre
  • ✅ Crear archivos txt dentro de la carpeta src/modules/file_reader/data (pueden ser con patrones erroneos).
  • ⭕ Crear tests para verificar que se importa bien un grafo, y en caso de importarlo mal lanzar una excepción que se pueda identificar
  • ⭕ Crear excepciones propias para cada error posible a la hora de importar y exportar txts.
  • ⭕ Añadir funcionalidad al botón de Importar que se encuentra en MenuBar, o sea hacer la funcionalidad de importar 1 o varios txts y convertirlos en grafos. Importante detectar los errores y mostrar un mensaje emergente en caso de existir uno al importar

🦍 Tareas de Héctor

  • ✅ Crear la interfaz del Main_Window.
  • ✅ Implementar los controladores dentro de las interfaces.
  • ✅ Crear en Graph_Services los métodos para insertar, eliminar y modificar los nodos de un grafo.
  • ✅ Crear la representación del grafo en la pantalla.
  • ⭕ Intentar no morir intentando hacer la interfaz en la mierda de PyQt

😹 Chistecillo

Qué le dice una nariz a un pañuelo? Me zuenas

📜 Estructura de los txt (pendiente a revisión con el tribunal)

Lo mejor que se me llegó a ocurrir (Gracias a Lissandra) fue que se guarden en forma de matriz de adyacencia las relaciones definiendo las relaciones y darle valor a los pesos.

Ejemplo

A B C D

0 0 2 3
1 0 0 0
0 0 0 4
0 0 1 0
  • La primera fila significa el nombre de cada uno de los nodos
  • Después está una línea en blanco para separar la matriz de los nombres
  • Viene después la matriz que obviamente debe ser cuadrática con la misma cantidad de filas y de columnas que de nodos
  • Cada uno de los valores representan el peso de la conexión (Si es 0 significa que no existe conexión)
  • Los valores de la conexión también pueden ser strings

😹 Chistecillo

Por qué el plátano no tiene dinero? Porque plata-no

🧪 Test

⚠️ Advertencia

Poner test delante del nombre de cada método para que se detecte (no sean como yo que estuve 1 hora sin saber por qué no salía)

import unittest


# se declara la clase y se dice que herede de `unittest.TestCase` para indicar que es un caso de test
class TestSum(unittest.TestCase):
    # cada método de test debe estar con la palabra test delante para que sea detectado
    def test_sum(self):
      realValue = sum([1, 2, 3])
      expectedValue = 6
      
      # Se espera que la suma del array de como resultado 6
      self.assertEqual(realValue, expectedValue, "Should be 6")

    # se pueden declarar tantos test cases como se quiera
    def test_sum_tuple(self):
        self.assertEqual(sum((1, 2, 2)), 6, "Should be 6")

# indica que cuando se llame a este archivo especificamente se ejecutaran todos los tests
if __name__ == '__main__':
    unittest.main()

Llamar al test

Hay que ir a la terminal y poner:

python test/nombre_carpeta/<nombre_archivo>.py

En nuestro caso por ejemplo:

python test/file/import_graph_test.py

Pycharm puede ejecutarlo de distintas formas hasta con distintas interfaces pero ya hay que buscar como se hace especificamente

Links para ver más cosas de unitest

tarea_final_python's People

Contributors

chacaponquin avatar josecarlosgarcia avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.