Proyecto Final: Weather CLI — Aplicación de Consulta Meteorológica¶
1. Descripción general del proyecto¶
En este proyecto desarrollarás una aplicación de consola (CLI) en Python que permitirá consultar el tiempo actual y las previsiones meteorológicas de cualquier ciudad del mundo utilizando servicios web gratuitos (APIs públicas).
La aplicación no tendrá interfaz gráfica, sino que funcionará directamente desde el terminal o la consola de comandos, solicitando información al usuario y mostrando los resultados formateados en texto.
El objetivo es integrar en un proyecto completo los conocimientos básicos de programación estructurada, manejo de ficheros, control de errores, y consumo de datos desde Internet (JSON).
Este proyecto está pensado para un nivel introductorio, pero con margen para que los estudiantes más avanzados puedan ampliar funcionalidades.
2. Funcionamiento general del programa¶
La aplicación se ejecutará desde consola, mostrando un menú interactivo con opciones como:
Cuando el usuario elija la opción “Consultar ciudad”, el programa:
- Solicitará el nombre de la ciudad.
- Consultará una API de geolocalización para obtener su latitud y longitud.
- Con esas coordenadas, llamará a una API meteorológica para obtener la temperatura actual, máxima y mínima, amanecer, atardecer y probabilidad de lluvia.
- Mostrará los resultados en pantalla y los guardará en un archivo local (
ultimo.json). - Además, añadirá los datos a un historial de consultas (
historial.json).
El programa debe ser capaz de manejar errores comunes (ciudad no encontrada, falta de conexión, formato erróneo del JSON, etc.) y funcionar incluso en modo offline usando un archivo local de ejemplo.
3. APIs utilizadas en el proyecto¶
El proyecto utiliza dos APIs públicas de la plataforma Open-Meteo, que no requieren registro ni autenticación.
3.1. API de Geocoding (para obtener coordenadas)¶
URL base:
https://geocoding-api.open-meteo.com/v1/search
Ejemplo de uso:
Respuesta típica (formato JSON):
A partir de este JSON, el programa extraerá:
name→ nombre normalizado de la ciudadlatitudeylongitude→ coordenadas para la segunda API
3.2. API de Previsión Meteorológica¶
URL base:
https://api.open-meteo.com/v1/forecast
Ejemplo de uso:
Respuesta típica:
De aquí se extraerán los valores de:
- Temperatura actual (primer valor horario)
- Temperatura máxima y mínima del día
- Hora de amanecer y atardecer (últimos 5 caracteres:
HH:MM) - Probabilidad de precipitación
4. Estructura de archivos del proyecto¶
El proyecto se dividirá en varios módulos de Python, cada uno con una función clara y bien delimitada. Esta separación facilita la comprensión y el mantenimiento del código, y ayuda a los alumnos a entender cómo se organizan los programas reales.
Descripción de cada archivo:¶
-
main.pyEs el punto de entrada del programa. Contiene el bucle principal que muestra el menú, llama a las funciones adecuadas y coordina el flujo entre los demás módulos. -
cli.pyGestiona la interacción con el usuario: mostrar el menú, pedir opciones y textos, validar entradas y devolverlas al programa principal. -
services.pyContiene las funciones encargadas de conectarse a las APIs. Define cómo construir las URLs, enviar las peticiones y extraer los datos útiles del JSON. También puede incluir un pequeño control de errores de red (por ejemplo,requests.exceptions.Timeout). -
storage.pySe encarga de la persistencia de datos. Permite guardar el último resultado enultimo.json, mantener un historial enhistorial.json. -
formatter.pyDefine cómo se muestran los resultados al usuario: formato de texto, etiquetas, redondeos, alineación, etc.
5. Funcionalidades obligatorias¶
Las siguientes características forman parte del núcleo del proyecto. Todo alumno deberá implementarlas correctamente para considerar la práctica completa:
- Menú principal interactivo con opciones numeradas y control básico de errores.
-
Consulta meteorológica por ciudad:
-
Solicitar nombre de la ciudad al usuario.
- Obtener sus coordenadas mediante la API de Geocoding.
- Obtener los datos del tiempo mediante la API de Forecast.
-
Mostrar un resumen claro con:
- Ciudad y coordenadas
- Temperatura actual
- Temperaturas máxima y mínima del día
- Amanecer y atardecer
- Probabilidad de precipitación
- Persistencia de datos:
-
Guardar el último resultado (
ultimo.json). - Registrar todas las consultas en un archivo de historial (
historial.json). - Visualización de historial: mostrar las últimas 5 consultas realizadas.
-
Manejo de errores y robustez:
-
Validar entradas del usuario (no vacías, sin números en el nombre de ciudad).
- Controlar errores de red (sin conexión, ciudad inexistente).
- Evitar que el programa se cierre inesperadamente.
6. Posibles ampliaciones (para quienes quieran ir más allá)¶
Estas ampliaciones son opcionales, pensadas para los alumnos que deseen profundizar:
| Nivel | Ampliación | Descripción |
|---|---|---|
| 🟢 Fácil | Limitar el historial | Mostrar solo las últimas N consultas o filtrarlas por ciudad |
| 🟢 Fácil | Mostrar fecha y hora de la consulta | Añadir un campo timestamp (fecha/hora ISO) al guardar datos |
| 🟠 Intermedio | Cachear resultados | Si se consulta la misma ciudad en menos de 10 minutos, leer de ultimo.json sin llamar a la API |
| 🟠 Intermedio | Permitir días personalizados | Pasar el número de días como parámetro (--dias N) desde la línea de comandos |
| 🟠 Intermedio | Mejorar formato de salida | Mostrar las temperaturas en tabla o con colores usando ANSI |
| 🔵 Avanzado | Exportar datos a CSV o JSON comprimido | Generar un informe con todas las consultas |
| 🔵 Avanzado | Gráfica ASCII | Dibujar una gráfica de temperaturas por hora con caracteres en texto |
| 🔵 Avanzado | Tests unitarios | Probar funciones puras con pytest (por ejemplo, formateo o parsing de JSON) |
7. Temporización¶
- Sesión 1: Creación del proyecto, estructura de archivos, menú principal y conexión a las API.
- Sesión 2: Implementación de las diferentes consultas meteorológicas, presentación de resultados, manejo de datos JSON.
- Sesión 3: Persistencia de datos, historial de consultas, configuración de localización por defecto.
- Extras: Opciones de elección de datos a visualizar.