Generador de Backends a partir de YAML
Project description
YAML-to-Backend - Generador de Backends desde YAML
Una librería Python para generar automáticamente backends asincrónicos completos que crean endpoints RESTful CRUD, autenticación y autorización basada en roles a partir de archivos YAML.
🚀 Instalación
pip install yaml-to-backend
📦 Uso como librería
from yaml_to_backend import update_config, get_run_backend
# Configurar el backend
update_config(
DB_HOST='localhost',
DB_USER='root',
DB_PASSWORD='1234',
DB_NAME='mi_db',
PORT=8001
)
# Ejecutar el backend
run_backend = get_run_backend()
run_backend()
🖥️ Uso desde línea de comandos
# Ejecutar con configuración por defecto
yaml-to-backend
# Cambiar puerto
yaml-to-backend --port 8001
# Configurar base de datos
yaml-to-backend --db-host localhost --db-name test --db-user root --db-password 1234
# Especificar ruta de entidades
yaml-to-backend --entities ./mis_entidades/
# Modo debug
yaml-to-backend --debug
🔐 Publicación Automática
Este proyecto usa Trusted Publishers de PyPI para publicación automática:
- ✅ Sin tokens: No necesitas manejar credenciales
- ✅ Automático: Se publica con cada release de GitHub
- ✅ Seguro: Solo se publica desde el repositorio oficial
Para contribuir:
- Fork el repositorio
- Desarrolla tus cambios
- Crea un Pull Request
- Los maintainers crearán un release
- Automáticamente se publicará en PyPI
🚀 Características
- Generación automática: Crea backends completos desde archivos YAML
- Backend asincrónico: Usa FastAPI y TortoiseORM para máxima performance
- Autenticación JWT: Sistema de autenticación seguro con tokens JWT
- Autorización por roles: Control de acceso granular por entidad y campo
- Permisos condicionales: Soporte para permisos tipo "yo" (solo datos del usuario)
- Borrado lógico: Soporte para borrado lógico y físico
- Pruebas automáticas: Tests unitarios y de endpoints generados automáticamente
- Configuración centralizada: Todo configurable desde
config.py
📋 Requisitos
- Python >= 3.10
- MySQL (configurable)
- Dependencias listadas en
requirements.txt
🛠️ Instalación y Configuración
Opción 1: Instalación desde PyPI (Recomendado)
pip install yaml-to-backend
Opción 2: Instalación desde desarrollo
# Clonar el repositorio
git clone <repository-url>
cd IPAS
# Instalar en modo desarrollo
pip install -e .
Configuración
-
Configurar base de datos:
- Crear una base de datos MySQL
- Configurar credenciales en
main.pyo variables de entorno
-
Configurar entidades:
- Crear archivos YAML en la carpeta
entidades/ - Ver ejemplos en
entidades/usuario.yamlyentidades/tarea.yaml
- Crear archivos YAML en la carpeta
-
Ejecutar el backend:
# Usando el CLI
yaml-to-backend
# O usando Python
python main.py
⚙️ Configuración
Variables de entorno
# Base de datos
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=root
DB_NAME=mi_base
# Servidor
DEBUG=True
PORT=8000
INSTALL=True
LOG=True
# Entidades
ENTITIES_PATH=./entidades/
# JWT
JWT_SECRET_KEY=tu_clave_secreta_muy_segura_aqui
Archivo config.py
# Configuración de base de datos
DB_HOST = 'localhost'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = 'root'
DB_NAME = 'mi_base'
# Configuración del servidor
DEBUG = True
PORT = 8000
INSTALL = True
LOG = True
# Configuración de autenticación
AUTH = {
'tabla': 'usuarios',
'columna_usuario': 'username',
'columna_password': 'password',
'superusuario': 'admin',
'password_default': 'admin123',
'columna_borrado': 'deleted_at',
'borrado_logico': 'timestamp'
}
📝 Definición de Entidades
Estructura YAML
entidad: NombreEntidad
tabla: nombre_tabla
campos:
id:
tipo: integer
pk: true
nombre:
tipo: string
max: 100
descripcion:
tipo: text
usuario_id:
tipo: integer
fk: usuarios.id
activo:
tipo: boolean
fecha_creacion:
tipo: datetime
permisos:
admin: [r, w, d]
usuario:
yo:
campo_usuario: usuario_id
Tipos de campos soportados
integer/int: Número enterostring: Texto con longitud máximatext: Texto largoboolean/bool: Valor booleanodatetime: Fecha y horadate: Solo fechafloat: Número decimaldecimal: Decimal con precisiónjson: Datos JSON
Permisos
r: Lecturaw: Escriturad: Eliminaciónyo: Solo datos del usuario actual- Sin configuración: filtra por
iddel usuario - Con
campo_usuario: filtra por campo específico
- Sin configuración: filtra por
🔐 Autenticación y Autorización
Login
POST /api/auth/login
Content-Type: application/json
{
"username": "admin",
"password": "admin123"
}
Respuesta
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...",
"token_type": "bearer"
}
Uso de tokens
GET /api/entidades
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9...
📡 Endpoints Generados
Para cada entidad se generan automáticamente:
GET /api/entidad/ # Listar todas
POST /api/entidad/ # Crear nueva
GET /api/entidad/{id} # Obtener por ID
PUT /api/entidad/{id} # Actualizar
DELETE /api/entidad/{id} # Eliminar
GET /api/entidad/yo # Solo si hay permisos 'yo'
🧪 Pruebas
Ejecutar pruebas con el ejecutor integrado
# Ejecutar todas las pruebas
python tests/run_tests.py all
# Solo pruebas de integración
python tests/run_tests.py integration
# Solo pruebas unitarias
python tests/run_tests.py unit
# Solo pruebas de autenticación
python tests/run_tests.py auth
# Solo pruebas del parser
python tests/run_tests.py parser
# Solo pruebas de endpoints
python tests/run_tests.py endpoints
# Pruebas con cobertura
python tests/run_tests.py coverage
# Ver ayuda
python tests/run_tests.py help
Ejecutar pytest directamente
# Ejecutar todas las pruebas
pytest tests/ -v
# Solo pruebas de integración
pytest tests/ -m integration -v
# Solo pruebas unitarias
pytest tests/ -m "not integration" -v
# Solo pruebas de autenticación
pytest tests/test_auth.py
# Solo pruebas de endpoints
pytest tests/test_endpoints.py
# Solo pruebas del parser
pytest tests/test_entity_parser.py
# Con cobertura
pytest tests/ --cov=backend --cov-report=html
Nota: Para las pruebas de integración, asegúrate de que el backend esté ejecutándose en otra terminal con python main.py.
📁 Estructura del Proyecto
IPAS/
├── main.py # Punto de entrada (usa YAML-to-Backend)
├── pyproject.toml # Configuración del paquete
├── setup.py # Configuración de instalación
├── MANIFEST.in # Archivos incluidos en el paquete
├── requirements.txt # Dependencias de desarrollo
├── pytest.ini # Configuración de pruebas
├── README.md # Documentación
├── Criterio_Aceptacion_Backend.md # Criterios de aceptación
├── yaml_to_backend/ # Librería YAML-to-Backend (paquete principal)
│ ├── __init__.py # API pública
│ ├── cli.py # Interfaz de línea de comandos
│ ├── app.py # Aplicación principal
│ ├── config.py # Configuración
│ ├── core/ # Lógica base
│ │ ├── entity_parser.py # Parser de YAML
│ │ └── model_generator.py # Generador de modelos
│ ├── db/ # Base de datos
│ │ ├── connection.py # Conexión DB
│ │ └── models.py # Modelos base
│ ├── api/ # Endpoints
│ │ ├── auth_routes.py # Rutas de auth
│ │ └── crud_generator.py # Generador CRUD
│ └── security/ # Seguridad
│ └── auth.py # Autenticación
├── tests/ # Pruebas
│ ├── conftest.py # Configuración de pytest
│ ├── run_tests.py # Ejecutor de pruebas
│ ├── test_auth.py # Pruebas de auth
│ ├── test_entity_parser.py # Pruebas del parser
│ ├── test_endpoints.py # Pruebas unitarias de endpoints
│ ├── test_endpoints_simple.py # Pruebas simples de endpoints
│ ├── test_endpoints_integration.py # Pruebas de integración
│ └── test_endpoints_complete.py # Pruebas completas
└── entidades/ # Archivos YAML
├── usuario.yaml # Entidad Usuario
└── tarea.yaml # Entidad Tarea
🔄 Modo Instalación
Cuando INSTALL = True en la configuración:
- Se conecta a la base de datos
- Borra todas las tablas existentes
- Regenera las tablas desde los YAML
- Crea usuarios iniciales definidos en
config.py
Usuarios iniciales por defecto
- admin / admin123 (rol: admin)
- usuario1 / usuario123 (rol: usuario)
🚀 Ejemplos de Uso
1. Crear una nueva entidad
Crear entidades/producto.yaml:
entidad: Producto
tabla: productos
campos:
id:
tipo: integer
pk: true
nombre:
tipo: string
max: 100
precio:
tipo: float
categoria_id:
tipo: integer
fk: categorias.id
activo:
tipo: boolean
permisos:
admin: [r, w, d]
vendedor: [r, w]
cliente: [r]
2. Usar el endpoint generado
# Login
curl -X POST "http://localhost:8000/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"username": "admin", "password": "admin123"}'
# Crear producto
curl -X POST "http://localhost:8000/api/producto/" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{"nombre": "Laptop", "precio": 999.99, "activo": true}'
🔧 Desarrollo
Agregar nuevas funcionalidades
- Nuevos tipos de campo: Modificar
yaml_to_backend.core.model_generator.ModelGenerator._get_tortoise_field_type() - Nuevos permisos: Extender
yaml_to_backend.security.auth.AuthManager.has_permission() - Nuevos endpoints: Modificar
yaml_to_backend.api.crud_generator.CRUDGenerator.generate_crud_router()
Debugging
Con DEBUG = True:
- Logs detallados en consola
- Información de generación de modelos
- Errores detallados
📄 Licencia
Este proyecto está bajo la Licencia MIT.
🤝 Contribuciones
Las contribuciones son bienvenidas. Por favor:
- Fork el proyecto
- Crea una rama para tu feature
- Commit tus cambios
- Push a la rama
- Abre un Pull Request
📞 Soporte
Para soporte y preguntas:
- Crear un issue en GitHub
- Revisar la documentación
- Verificar los logs con
DEBUG = True
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file yaml_to_backend-0.1.0.tar.gz.
File metadata
- Download URL: yaml_to_backend-0.1.0.tar.gz
- Upload date:
- Size: 42.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c5b46af4ab1d6cc64c8a6226a14dae16d308e9255d86864412c3dda12e93ef0c
|
|
| MD5 |
5fdc06b20774e93d7d379f0e7c63996c
|
|
| BLAKE2b-256 |
990aeb00ad73d319c85f1fca0549a63e33f452378aaf911334f923c50eaae409
|
Provenance
The following attestation bundles were made for yaml_to_backend-0.1.0.tar.gz:
Publisher:
publish.yml on cxmjg/yaml-to-backend
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yaml_to_backend-0.1.0.tar.gz -
Subject digest:
c5b46af4ab1d6cc64c8a6226a14dae16d308e9255d86864412c3dda12e93ef0c - Sigstore transparency entry: 326629301
- Sigstore integration time:
-
Permalink:
cxmjg/yaml-to-backend@59e1abcd7cf14ba7004f22b896ebc820d8fb58d4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/cxmjg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@59e1abcd7cf14ba7004f22b896ebc820d8fb58d4 -
Trigger Event:
release
-
Statement type:
File details
Details for the file yaml_to_backend-0.1.0-py3-none-any.whl.
File metadata
- Download URL: yaml_to_backend-0.1.0-py3-none-any.whl
- Upload date:
- Size: 29.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c326cdd12f2a0122e919102eb6494009aa161812ac20cea7989fb2df2589b201
|
|
| MD5 |
31a8e5b33060555b44b0c2022f6584c8
|
|
| BLAKE2b-256 |
19591dcb530a6ba83c00e821a0fc01c28b6f9678dfb91edd4f64b7faf4ce3d20
|
Provenance
The following attestation bundles were made for yaml_to_backend-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on cxmjg/yaml-to-backend
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
yaml_to_backend-0.1.0-py3-none-any.whl -
Subject digest:
c326cdd12f2a0122e919102eb6494009aa161812ac20cea7989fb2df2589b201 - Sigstore transparency entry: 326629317
- Sigstore integration time:
-
Permalink:
cxmjg/yaml-to-backend@59e1abcd7cf14ba7004f22b896ebc820d8fb58d4 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/cxmjg
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@59e1abcd7cf14ba7004f22b896ebc820d8fb58d4 -
Trigger Event:
release
-
Statement type: