Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
195 changes: 195 additions & 0 deletions recetas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
"""Interfaz de consola para consultar las recetas de recetas_saludables.csv."""

import csv
import os
import sys

ARCHIVO_CSV = os.path.join(os.path.dirname(os.path.abspath(__file__)), "recetas_saludables.csv")


def cargar_recetas(ruta):
with open(ruta, encoding="utf-8", newline="") as f:
return list(csv.DictReader(f))


def texto_a_entero(texto, por_defecto=0):
try:
return int(float(texto))
except (TypeError, ValueError):
return por_defecto


def mostrar_resumen(receta):
print(
" [{id}] {nombre} | {categoria} | {tiempo} min | {dificultad} | {kcal} kcal".format(
id=receta["id"],
nombre=receta["nombre"],
categoria=receta["categoria"],
tiempo=receta["tiempo_min"],
dificultad=receta["dificultad"],
kcal=receta["calorias_kcal"],
)
)


def mostrar_lista(recetas):
if not recetas:
print(" No hay recetas que cumplan el criterio.")
return
for receta in recetas:
mostrar_resumen(receta)
print(" Total: {} receta(s).".format(len(recetas)))


def mostrar_detalle(receta):
print("")
print("=" * 60)
print("{} (id {})".format(receta["nombre"], receta["id"]))
print("=" * 60)
print("Categoría : {}".format(receta["categoria"]))
print("Raciones : {}".format(receta["raciones"]))
print("Tiempo : {} min".format(receta["tiempo_min"]))
print("Dificultad : {}".format(receta["dificultad"]))
print("")
print("Ingredientes:")
for ingrediente in receta["ingredientes"].split("|"):
print(" - {}".format(ingrediente.strip()))
print("")
print("Preparación:")
print(" {}".format(receta["preparacion"]))
print("")
print("Información nutricional (por ración):")
print(" Calorías : {} kcal".format(receta["calorias_kcal"]))
print(" Proteínas : {} g".format(receta["proteinas_g"]))
print(" Carbohidratos : {} g".format(receta["carbohidratos_g"]))
print(" Grasas : {} g".format(receta["grasas_g"]))
print(" Azúcares : {} g".format(receta["azucares_g"]))
print(" Fibra : {} g".format(receta["fibra_g"]))
print("")
print("Fuente nutricional: {}".format(receta["fuente_nutricional"]))
print("Fuente receta : {}".format(receta["fuente_receta"]))
print("=" * 60)


def pedir_texto(mensaje):
return input(mensaje).strip()


def opcion_listar(recetas):
print("")
print("Todas las recetas:")
mostrar_lista(recetas)


def opcion_ver_detalle(recetas):
identificador = pedir_texto("\nId de la receta: ")
for receta in recetas:
if receta["id"] == identificador:
mostrar_detalle(receta)
return
print("No existe ninguna receta con id '{}'.".format(identificador))


def opcion_buscar_nombre(recetas):
termino = pedir_texto("\nTexto a buscar en el nombre: ").lower()
if not termino:
print("Hay que escribir algún texto.")
return
encontradas = [r for r in recetas if termino in r["nombre"].lower()]
print("")
mostrar_lista(encontradas)


def opcion_buscar_ingrediente(recetas):
termino = pedir_texto("\nIngrediente a buscar: ").lower()
if not termino:
print("Hay que escribir algún ingrediente.")
return
encontradas = [r for r in recetas if termino in r["ingredientes"].lower()]
print("")
mostrar_lista(encontradas)


def opcion_filtrar_calorias(recetas):
entrada = pedir_texto("\nCalorías máximas (kcal): ")
maximo = texto_a_entero(entrada, -1)
if maximo < 0:
print("Hay que introducir un número entero positivo.")
return
encontradas = [r for r in recetas if texto_a_entero(r["calorias_kcal"]) <= maximo]
encontradas.sort(key=lambda r: texto_a_entero(r["calorias_kcal"]))
print("")
mostrar_lista(encontradas)


def opcion_filtrar_categoria(recetas):
categorias = sorted({r["categoria"] for r in recetas})
print("\nCategorías disponibles: {}".format(", ".join(categorias)))
termino = pedir_texto("Categoría: ").lower()
encontradas = [r for r in recetas if r["categoria"].lower() == termino]
print("")
mostrar_lista(encontradas)


def opcion_estadisticas(recetas):
if not recetas:
print("\nNo hay recetas cargadas.")
return
calorias = [texto_a_entero(r["calorias_kcal"]) for r in recetas]
proteinas = [texto_a_entero(r["proteinas_g"]) for r in recetas]
tiempos = [texto_a_entero(r["tiempo_min"]) for r in recetas]
print("")
print("Recetas totales : {}".format(len(recetas)))
print("Calorías (min/media/max): {} / {:.1f} / {}".format(min(calorias), sum(calorias) / len(calorias), max(calorias)))
print("Proteínas medias : {:.1f} g".format(sum(proteinas) / len(proteinas)))
print("Tiempo medio : {:.1f} min".format(sum(tiempos) / len(tiempos)))


def mostrar_menu():
print("")
print("--- RECETARIO SALUDABLE ---")
print("1. Listar todas las recetas")
print("2. Ver el detalle de una receta")
print("3. Buscar por nombre")
print("4. Buscar por ingrediente")
print("5. Filtrar por calorías máximas")
print("6. Filtrar por categoría")
print("7. Estadísticas")
print("0. Salir")


def main():
if not os.path.exists(ARCHIVO_CSV):
print("No se encuentra el archivo {}".format(ARCHIVO_CSV))
return 1
recetas = cargar_recetas(ARCHIVO_CSV)
print("Cargadas {} recetas de {}".format(len(recetas), os.path.basename(ARCHIVO_CSV)))

acciones = {
"1": opcion_listar,
"2": opcion_ver_detalle,
"3": opcion_buscar_nombre,
"4": opcion_buscar_ingrediente,
"5": opcion_filtrar_calorias,
"6": opcion_filtrar_categoria,
"7": opcion_estadisticas,
}

while True:
mostrar_menu()
try:
opcion = pedir_texto("Elige una opción: ")
except EOFError:
print("")
return 0
if opcion == "0":
print("¡Hasta la próxima!")
return 0
if opcion in acciones:
acciones[opcion](recetas)
else:
print("Opción no válida.")


if __name__ == "__main__":
sys.exit(main())
Loading