# Guía de Desarrollo: Launcher para Scripts GUI
La aplicación original @app.py busca y ejecuta scripts Python sin GUI. Deseo agregar una nueva funcionalidad para scripts con GUI que no necesiten el sistema de datos grupal o directorio de trabajo con eschema de datos. La página principal @index.html se dividirá en dos pestañas: una sin cambios y otra para un launcher de scripts Python con GUI. Esta nueva pagina de launcher usará una lista manual de directorios almacenada en un archivo launcher_scripts.json. Necesitamos la opcion de poder agregar, eliminar o modificar estos directorios de grupos de scripts. La lista se mostrará en un combo box, similar a la aplicación actual, describiendo cada grupo de scripts. Al seleccionar un grupo, se buscarán los scripts en el directorio root correspondiente. El sistema de configuración no se usará, solo el directorio de trabajo para indicar desde donde se ejecuta el script, por defecto el directorio root del script. El sistema de logging se mantendrá. Además, si hay un archivo icon.ico en un directorio de scripts, se mostrará como referencia gráfica del grupo en la página. De ser posible quisiera que el icono del grupo se muestre en la combo de seleccion de grupos.
## Resumen del Proyecto
Esta guía detalla la implementación de un nuevo launcher para scripts Python con interfaz gráfica (GUI), que coexistirá con el sistema actual de scripts de configuración. El nuevo sistema incluirá funcionalidades avanzadas como categorización, favoritos, historial y argumentos simples.
## Índice
1. [Arquitectura General](#arquitectura-general)
2. [Estructura de Archivos](#estructura-de-archivos)
3. [Fase 1: Estructura Básica](#fase-1-estructura-básica)
4. [Fase 2: Funcionalidad Core](#fase-2-funcionalidad-core)
5. [Fase 3: Mejoras Avanzadas](#fase-3-mejoras-avanzadas)
6. [Fase 4: Sistema de Iconos](#fase-4-sistema-de-iconos)
7. [APIs Requeridas](#apis-requeridas)
8. [Estructura de Datos](#estructura-de-datos)
9. [Componentes UI](#componentes-ui)
10. [Testing y Validación](#testing-y-validación)
---
## Arquitectura General
### Principios de Diseño
- **Coexistencia**: El nuevo launcher coexistirá con el sistema actual sin interferir
- **Reutilización**: Aprovechar componentes existentes (logging, UI base, etc.)
- **Modularidad**: Código separado y mantenible
- **Flexibilidad**: Configuración manual de directorios y categorías
- Mecanismo para seleccionar el entorno miniconda a utlizar para cada grupo de scripts.
### Diferencias con Sistema Actual
| Aspecto | Sistema Actual | Nuevo Launcher GUI |
|---------|---------------|-------------------|
| Fuente de grupos | Directorios automáticos | `launcher_scripts.json` manual |
| Configuración | 3 niveles de schemas | Sin configuración compleja |
| Directorio trabajo | Configurable avanzado | Por defecto directorio del script |
| Metadatos | Archivos separados | Centralizados en JSON |
| Categorización | No disponible | ✅ Por categorías |
| Favoritos | No disponible | ✅ Sistema de favoritos |
| Historial | No disponible | ✅ Historial de ejecución |
| Argumentos | Vía configuración | ✅ Argumentos simples |
---
## Estructura de Archivos
### Archivos Nuevos a Crear
ParamManagerScripts/
├── data/
│ ├── launcher_scripts.json # Configuración principal del launcher
│ ├── launcher_favorites.json # Scripts marcados como favoritos
│ └── launcher_history.json # Historial de ejecución
├── lib/
│ └── launcher_manager.py # Gestor principal del launcher
├── static/
│ ├── css/
│ │ └── launcher.css # Estilos específicos
│ └── js/
│ └── launcher.js # Lógica JavaScript
├── templates/
│ └── components/
│ ├── launcher_tab.html # Tab del launcher
│ ├── launcher_editor.html # Editor de grupos
│ ├── script_args_modal.html # Modal para argumentos
│ └── favorites_panel.html # Panel de favoritos
└── adicion_launcher4GUI.md # Esta guía
### Archivos a Modificar
ParamManagerScripts/
├── app.py # Agregar rutas del launcher
├── templates/
│ └── index.html # Implementar sistema de tabs
└── static/
├── css/
│ └── styles.css # Estilos para tabs y iconos
└── js/
└── scripts.js # Lógica de tabs
---
## Fase 1: Estructura Básica
### 1.1 Crear launcher_manager.py
```python
# lib/launcher_manager.py
import os
import json
from typing import Dict, Any, List, Optional
from datetime import datetime
class LauncherManager:
def __init__(self, data_path: str):
self.data_path = data_path
self.launcher_config_path = os.path.join(data_path, "launcher_scripts.json")
self.favorites_path = os.path.join(data_path, "launcher_favorites.json")
self.history_path = os.path.join(data_path, "launcher_history.json")
# Inicializar archivos si no existen
self._initialize_files()
def _initialize_files(self):
"""Crear archivos de configuración por defecto si no existen"""
# Implementar inicialización
pass
def get_launcher_groups(self) -> List[Dict[str, Any]]:
"""Obtener todos los grupos de scripts GUI"""
pass
def add_launcher_group(self, group_data: Dict[str, Any]) -> Dict[str, str]:
"""Agregar nuevo grupo de scripts GUI"""
pass
def update_launcher_group(self, group_id: str, group_data: Dict[str, Any]) -> Dict[str, str]:
"""Actualizar grupo existente"""
pass
def delete_launcher_group(self, group_id: str) -> Dict[str, str]:
"""Eliminar grupo de scripts GUI"""
pass
def get_group_scripts(self, group_id: str) -> List[Dict[str, Any]]:
"""Obtener scripts de un grupo específico"""
pass
```
### 1.2 Implementar Sistema de Tabs en index.html
```html
```
---
## Testing y Validación
### Plan de Testing
#### 1. Testing Unitario
- **LauncherManager**: Todas las operaciones CRUD
- **Validación**: Rutas de directorios, estructura JSON
- **Ejecución**: Scripts con diferentes argumentos
#### 2. Testing de Integración
- **APIs**: Todos los endpoints del launcher
- **Persistencia**: Guardado y carga de configuraciones
- **Logging**: Integración con sistema de logs existente
#### 3. Testing de UI
- **Navegación**: Cambio entre tabs
- **Responsividad**: Funcionalidad en diferentes tamaños de pantalla
- **Interactividad**: Favoritos, filtros, argumentos
#### 4. Testing de Sistema
- **Coexistencia**: No interferencia con sistema actual
- **Rendimiento**: Carga de grupos grandes
- **Seguridad**: Validación de rutas y argumentos
### Casos de Prueba
#### Funcionalidad Básica
```javascript
// Ejemplo de test para favoritos
describe('Favorites System', () => {
test('should add script to favorites', async () => {
const result = await launcherManager.addToFavorites('group1', 'script1.py');
expect(result.status).toBe('success');
expect(launcherManager.favorites.has('group1_script1.py')).toBe(true);
});
test('should remove script from favorites', async () => {
await launcherManager.removeFromFavorites('group1', 'script1.py');
expect(launcherManager.favorites.has('group1_script1.py')).toBe(false);
});
});
```
#### Validación de Datos
```python
# Ejemplo de validación de grupo
def test_group_validation():
invalid_group = {
"name": "", # Nombre vacío
"directory": "/path/that/does/not/exist" # Directorio inexistente
}
result = launcher_manager.add_launcher_group(invalid_group)
assert result["status"] == "error"
assert "validation" in result["message"]
```
---
## Cronograma de Desarrollo
### Semana 1: Estructura Básica
- [ ] Crear `launcher_manager.py` con funciones básicas
- [ ] Implementar sistema de tabs en `index.html`
- [ ] Configurar rutas básicas en `app.py`
- [ ] CSS base para tabs y componentes
### Semana 2: Funcionalidad Core
- [ ] APIs completas para gestión de grupos
- [ ] Editor de grupos funcional
- [ ] Carga y listado de scripts
- [ ] Ejecución básica de scripts
### Semana 3: Mejoras Avanzadas
- [ ] Sistema de categorías
- [ ] Funcionalidad de favoritos
- [ ] Historial de ejecución
- [ ] Modal de argumentos
### Semana 4: Sistema de Iconos y Pulimiento
- [ ] API de iconos
- [ ] Iconos por defecto
- [ ] Refinamiento de UI
- [ ] Testing y correcciones
### Semana 5: Testing y Documentación
- [ ] Testing completo
- [ ] Documentación de usuario
- [ ] Optimizaciones de rendimiento
- [ ] Deployment y validación final
---
## Notas de Implementación
### Consideraciones de Seguridad
1. **Validación de Rutas**: Verificar que los directorios especificados existen y son accesibles
2. **Sanitización de Argumentos**: Limpiar argumentos de línea de comandos para prevenir inyección
3. **Permisos**: Verificar permisos de ejecución en scripts
4. **Logging de Seguridad**: Registrar intentos de acceso a rutas no autorizadas
### Optimizaciones de Rendimiento
1. **Caché de Scripts**: Cachear lista de scripts por directorio
2. **Lazy Loading**: Cargar scripts solo cuando se selecciona un grupo
3. **Debouncing**: Evitar búsquedas/filtros excesivos
4. **Paginación**: Para directorios con muchos scripts
### Compatibilidad
1. **Paths Multiplataforma**: Usar `os.path` para compatibilidad Windows/Linux
2. **Encoding**: UTF-8 para todos los archivos JSON
3. **Fallbacks**: Manejar casos donde faltan dependencias o archivos
### Extensibilidad Futura
1. **Plugins**: Sistema para agregar nuevos tipos de launcher
2. **Temas**: Personalización visual
3. **Integración**: APIs para herramientas externas
4. **Sincronización**: Posible sincronización entre múltiples instancias
---
## Recursos de Referencia
### Documentación Relevante
- [Flask Documentation](https://flask.palletsprojects.com/)
- [Tailwind CSS](https://tailwindcss.com/docs)
- [JavaScript ES6+](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
### Archivos de Referencia del Proyecto
- `lib/config_manager.py` - Patrón de gestión existente
- `static/js/scripts.js` - Implementación JavaScript actual
- `templates/index.html` - Estructura HTML base
---
**Autor**: Sistema de Desarrollo ParamManagerScripts
**Fecha**: Enero 2024
**Versión**: 1.0