Una API RESTful completa para gestión de tareas construida con FastAPI. Ofrece operaciones CRUD completas, validación de datos, logging exhaustivo, auditoría de eliminaciones con timestamps, documentación automática OpenAPI/Swagger, y una interfaz web integrada.
- ✅ Operaciones CRUD completas: Crear, leer, actualizar y eliminar tareas
- ✅ Validación de datos: Modelos Pydantic con validaciones estrictas y mensajes de error detallados
- ✅ Documentación automática: OpenAPI/Swagger y ReDoc integrados
- ✅ Logging completo: Registro estructurado de todas las operaciones con niveles configurables
- ✅ Auditoría completa: Historial de tareas eliminadas con timestamps ISO 8601
- ✅ CORS habilitado: Configuración flexible para integración con frontends
- ✅ Pruebas unitarias: Suite completa con pytest y reportes de cobertura
- ✅ Frontend integrado: Interfaz web responsiva incluida
- ✅ Gestión de IDs: Sistema automático de asignación de IDs únicos persistentes
- ✅ Recuperación de datos: Funcionalidad de restauración de tareas eliminadas
- ✅ Eliminación permanente: Opción de limpieza definitiva del historial
- Python: Versión 3.8 o superior
- pip: Gestor de paquetes de Python (incluido con Python 3.4+)
- Sistema Operativo: Windows, macOS, o Linux
-
Clonar o descargar el proyecto:
cd API # Navegar al directorio del proyecto
-
Instalar dependencias:
pip install -r requirements.txt
-
Verificar instalación:
python -c "import fastapi, uvicorn, pydantic; print('✅ Todas las dependencias instaladas correctamente')"
La aplicación crea automáticamente los directorios y archivos necesarios:
data/: Directorio para archivos JSON de datoslogs/: Directorio para archivos de logstatic/: Archivos estáticos del frontend
Nota: No se requiere configuración adicional. La aplicación es autocontenida.
python main.pyComandos alternativos:
# Usando uvicorn directamente
uvicorn main:app --host 127.0.0.1 --port 8000 --reload
# Con variables de entorno
UVICORN_HOST=127.0.0.1 UVICORN_PORT=8000 uvicorn main:appUna vez iniciada, la API estará disponible en:
- API Base: http://127.0.0.1:8000
- Documentación Swagger UI: http://127.0.0.1:8000/docs
- Documentación ReDoc: http://127.0.0.1:8000/redoc
- Frontend Web: http://127.0.0.1:8000 (redirige automáticamente)
# Verificar que la API responde
curl http://127.0.0.1:8000/
# Obtener todas las tareas (inicialmente vacío)
curl http://127.0.0.1:8000/tareas| Método | Endpoint | Descripción | Estado |
|---|---|---|---|
| GET | /tareas |
Obtener todas las tareas activas | ✅ |
| GET | /tareas/{id} |
Obtener tarea específica por ID | ✅ |
| POST | /tareas |
Crear nueva tarea | ✅ |
| PUT | /tareas/{id} |
Actualizar tarea completa | ✅ |
| PATCH | /tareas/{id} |
Actualizar tarea parcialmente | ✅ |
| DELETE | /tareas/{id} |
Eliminar tarea (mover a historial) | ✅ |
| Método | Endpoint | Descripción | Estado |
|---|---|---|---|
| GET | /eliminadas |
Obtener todas las tareas eliminadas | ✅ |
| GET | /eliminadas/{id} |
Obtener tarea eliminada específica | ✅ |
| POST | /eliminadas/{id} |
Restaurar tarea eliminada | ✅ |
| DELETE | /eliminadas/{id}! |
Eliminar permanentemente del historial | ✅ |
| GET | / |
Información de la API y frontend | ✅ |
- 200 OK: Operación exitosa
- 201 Created: Recurso creado exitosamente
- 204 No Content: Operación exitosa sin contenido de respuesta
- 400 Bad Request: Datos de entrada inválidos
- 404 Not Found: Recurso no encontrado
- 422 Unprocessable Entity: Validación de datos fallida
- 500 Internal Server Error: Error interno del servidor
{
"id": 1,
"titulo": "Aprender FastAPI",
"descripcion": "Estudiar los conceptos básicos de FastAPI y crear mi primera API",
"completada": false
}| Campo | Tipo | Requerido | Validación | Descripción |
|---|---|---|---|---|
id |
integer | ❌ | ≥ 1 (auto-asignado) | Identificador único |
titulo |
string | ✅ | 1-100 caracteres | Título descriptivo |
descripcion |
string | ✅ | 1-500 caracteres | Descripción detallada |
completada |
boolean | ❌ | true/false (default: false) | Estado de completitud |
{
"titulo": "Nuevo título opcional",
"descripcion": "Nueva descripción opcional",
"completada": true
}Nota: En actualizaciones parciales, todos los campos son opcionales. Solo los campos proporcionados serán modificados.
{
"id": 1,
"titulo": "Tarea eliminada",
"descripcion": "Esta tarea fue eliminada",
"completada": false,
"fecha_eliminacion": "2023-01-01T12:00:00.000000"
}Campo adicional: fecha_eliminacion (timestamp ISO 8601) se agrega automáticamente al eliminar una tarea.
curl -X POST "http://127.0.0.1:8000/tareas" \
-H "Content-Type: application/json" \
-d '{
"titulo": "Aprender FastAPI",
"descripcion": "Estudiar los conceptos básicos de FastAPI y crear mi primera API RESTful",
"completada": false
}'Respuesta esperada:
{
"id": 1,
"titulo": "Aprender FastAPI",
"descripcion": "Estudiar los conceptos básicos de FastAPI y crear mi primera API RESTful",
"completada": false
}curl -X GET "http://127.0.0.1:8000/tareas"curl -X GET "http://127.0.0.1:8000/tareas/1"curl -X PUT "http://127.0.0.1:8000/tareas/1" \
-H "Content-Type: application/json" \
-d '{
"titulo": "Aprender FastAPI Avanzado",
"descripcion": "Dominar conceptos avanzados de FastAPI incluyendo autenticación y bases de datos",
"completada": false
}'# Marcar como completada
curl -X PATCH "http://127.0.0.1:8000/tareas/1" \
-H "Content-Type: application/json" \
-d '{"completada": true}'
# Cambiar solo el título
curl -X PATCH "http://127.0.0.1:8000/tareas/1" \
-H "Content-Type: application/json" \
-d '{"titulo": "Nuevo título"}'curl -X DELETE "http://127.0.0.1:8000/tareas/1"Nota: La tarea se mueve al historial, no se elimina permanentemente.
curl -X GET "http://127.0.0.1:8000/eliminadas"curl -X POST "http://127.0.0.1:8000/eliminadas/1"curl -X DELETE "http://127.0.0.1:8000/eliminadas/1%21"import requests
# Crear tarea
response = requests.post("http://127.0.0.1:8000/tareas", json={
"titulo": "Mi tarea",
"descripcion": "Descripción detallada"
})
tarea = response.json()
print(f"Tarea creada con ID: {tarea['id']}")
# Obtener todas las tareas
tareas = requests.get("http://127.0.0.1:8000/tareas").json()
print(f"Total de tareas: {len(tareas)}")
# Marcar como completada
requests.patch(f"http://127.0.0.1:8000/tareas/{tarea['id']}", json={"completada": True})# Ejecutar todas las pruebas
pytest
# Ejecutar con salida detallada
pytest -v
# Ejecutar pruebas específicas
pytest tests/test_routers.py
pytest tests/test_utils.py# Generar reporte HTML de cobertura
pytest --cov=. --cov-report=html
# Ver reporte en navegador
# El reporte se genera en htmlcov/index.html
# Cobertura en terminal
pytest --cov=. --cov-report=term-missingLas pruebas están configuradas en tests/conftest.py con:
- Fixtures para datos de prueba
- Configuración de logging para pruebas
- Inicialización de archivos de datos temporales
tests/
├── conftest.py # Configuración y fixtures
├── test_utils.py # Pruebas de utilidades
└── test_routers.py # Pruebas de endpoints
API/
├── main.py # Punto de entrada de la aplicación
├── requirements.txt # Dependencias del proyecto
├── README.md # Esta documentación
├── constants/
│ ├── __init__.py
│ ├── constants.py # Constantes del proyecto
│ └── modelos.py # Modelos Pydantic
├── routers/
│ ├── __init__.py
│ ├── GET.py # Endpoints GET
│ ├── POST.py # Endpoints POST
│ ├── PUT.py # Endpoints PUT
│ ├── PATCH.py # Endpoints PATCH
│ ├── DELETE.py # Endpoints DELETE
│ └── OTHERS.py # Endpoints misceláneos
├── utils/
│ ├── __init__.py
│ ├── MDleer_json.py # Utilidades para leer JSON
│ ├── MDobtener_proximo_id.py # Gestión de IDs
│ ├── MDguardar_eliminada.py # Auditoría de eliminaciones
│ └── MDescribir_datos.py # Escritura de datos
├── data/
│ ├── .gitkeep
│ ├── tareas.json # Datos de tareas activas
│ └── tareas_eliminadas.json # Historial de eliminadas
├── logs/
│ ├── .gitkeep
│ └── app.log # Logs de la aplicación
├── static/
│ ├── index.html # Frontend básico
│ ├── css/
│ │ └── styles.css
│ └── js/
│ └── app.js
└── tests/
├── conftest.py # Configuración de pruebas
├── test_utils.py # Pruebas de utilidades
└── test_routers.py # Pruebas de endpoints
Los logs se almacenan en API/logs/app.log con el siguiente formato:
2023-01-01 12:00:00,000 - main - INFO - Mensaje de log
¡Las contribuciones son bienvenidas! Este proyecto sigue el modelo de desarrollo abierto.
-
Fork el repositorio en GitHub
-
Clona tu fork localmente:
git clone https://github.com/tu-usuario/api-tareas.git cd api-tareas -
Crea una rama para tu contribución:
git checkout -b feature/nueva-funcionalidad # o git checkout -b fix/error-en-endpoint -
Desarrolla siguiendo las mejores prácticas:
- Agrega docstrings a nuevas funciones
- Incluye pruebas para nueva funcionalidad
- Actualiza documentación si es necesario
- Sigue el estilo de código existente
-
Ejecuta las pruebas:
pytest --cov=. --cov-report=term-missing
-
Commit tus cambios:
git add . git commit -m "feat: agrega nueva funcionalidad X"
-
Push y crea Pull Request:
git push origin feature/nueva-funcionalidad
- Python: PEP 8 con verificación mediante flake8
- Commits: Conventional Commits
- Docstrings: Formato Google/Numpy
- Pruebas: Cobertura mínima del 80%
- 🐛 Bug fixes: Corrección de errores
- ✨ Features: Nueva funcionalidad
- 📚 Documentation: Mejoras en documentación
- 🧪 Tests: Agregar o mejorar pruebas
- 🔧 Maintenance: Mejoras de código, refactorización
Este proyecto está bajo la Licencia MIT. Ver el archivo LICENSE para más detalles.
MIT License
Copyright (c) 2023 API de Tareas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software...
Para reportar bugs o solicitar nuevas características:
- Verifica que el issue no existe ya
- Usa las plantillas de issue disponibles
- Proporciona información detallada:
- Versión de Python
- Sistema operativo
- Pasos para reproducir
- Comportamiento esperado vs actual
- 📧 Email: Para consultas privadas
- 💬 Issues: Para preguntas técnicas públicas
- 📖 Documentación: Wiki del repositorio
Este proyecto sigue un código de conducta para mantener un ambiente respetuoso e inclusivo. Al participar, aceptas:
- Ser respetuoso con todos los colaboradores
- Mantener un lenguaje profesional
- Aceptar constructivamente críticas y sugerencias
- Enfocarte en resolver problemas técnicos
⭐ Si encuentras útil este proyecto, considera darle una estrella en GitHub.