5  Estructura de Carpetas Recomendada

mi_app_shiny/
├── .vscode/
│   └── launch.json         # Configuraciones de depuración (opcional)
├── app/
│   ├── __init__.py         # Inicialización del módulo de la app
│   ├── main.py             # Punto de entrada de la aplicación (alternativo a run.py)
│   ├── ui.py               # Definición de la interfaz (UI) de la app
│   ├── server.py           # Lógica del servidor (reactividad, callbacks, etc.)
│   ├── modules/            # Componentes o funcionalidades reutilizables
│   │   ├── __init__.py
│   │   ├── dashboard.py    # Ejemplo de módulo: dashboard
│   │   └── db_handler.py   # Módulo para conexiones y operaciones con la BD
│   └── assets/             # Archivos estáticos (CSS, JS, imágenes)
│       ├── styles.css
│       └── scripts.js
├── config/
│   ├── config.yml          # Configuraciones generales (parámetros, rutas, etc.)
│   └── .env                # Variables de entorno sensibles (credenciales, API keys)
├── data/
│   ├── raw/                # Datos originales sin procesar
│   ├── interim/            # Datos en proceso de transformación o pruebas
│   └── processed/          # Datos ya limpios/preparados para alimentar la BD
├── scripts/                # Carpeta para análisis y pruebas con archivos .py (IPython)
│   └── analisis_data.py    # Script de ejemplo para "simular" celdas con ipykernel
├── tests/
│   ├── __init__.py
│   └── test_app.py         # Pruebas unitarias e integración (ej.: usando pytest)
├── run.py                  # Archivo principal para ejecutar la app
├── .gitignore              # Archivos y carpetas a excluir en Git
├── requirements.txt        # Dependencias del proyecto
├── README.md               # Documentación e introducción del proyecto
└── setup.py                # Script de instalación/empaquetado (opcional)

Descripción de la Estructura

  1. app/:
    • main.py: Punto de entrada de la aplicación. También puedes usar run.py en la raíz y simplemente importar aquí tu aplicación para mayor claridad.
    • ui.py y server.py: Separar la lógica de UI y server es una buena práctica para hacer más legible y mantenible tu código Shiny.
    • modules/: Ubica componentes o funcionalidades reutilizables (conexiones a BD, secciones específicas del dashboard, etc.).
    • assets/: Archivos estáticos (CSS, JS, imágenes) que la app podría necesitar.
  2. config/:
    • config.yml o config.json para configuraciones generales.
    • .env para credenciales o claves API que no se deben versionar.
    • Se recomienda usar librerías como pyyaml o python-dotenv.
  3. data/:
    • raw/ para datos originales.
    • interim/ para datos temporales o en proceso.
    • processed/ para datos listos para la BD o la app.
  4. scripts/:
    • Aquí trabajas con archivos .py (en lugar de libretas Jupyter) para hacer pruebas, análisis, o transformaciones de datos. Puedes emular celdas con IPython o ipykernel.
  5. tests/:
    • Ubica aquí tus pruebas unitarias (pytest, unittest, etc.) y validaciones de integración para la aplicación.
  6. run.py:
    • Archivo sencillo en la raíz del proyecto que llama a tu app. Este patrón es muy común y facilita la ejecución y la detección de la aplicación, tanto en VSCode como en servidores de producción.
    # run.py
    from app.main import app
    
    if __name__ == "__main__":
        app.run()
  7. .vscode/:
    • Carpeta con configuraciones de VSCode, como launch.json para depuración o settings.json para extensiones, formateadores, etc.
  8. .gitignore:
    • Excluye archivos o carpetas sensibles o generados por el sistema (p.ej., entornos virtuales, archivos .pyc, datos confidenciales).
  9. requirements.txt:
    • Lista de dependencias que facilita la instalación del entorno con pip install -r requirements.txt.
  10. README.md:
    • Explica cómo instalar, configurar y ejecutar la aplicación.
    • Incluye cualquier instrucción de despliegue o referencia adicional.
  11. setup.py:
    • Útil si más adelante deseas empaquetar o distribuir tu aplicación.
    • No es obligatorio si manejas la instalación únicamente con requirements.txt.

Ejemplo de Código Base

app/main.py

from shiny import App
from app.ui import app_ui
from app.server import server

app = App(app_ui, server)

if __name__ == '__main__':
    # Puedes correr la app directamente desde `app/main.py`
    # o desde `run.py` en la raíz.
    app.run()

app/ui.py

from shiny import ui

app_ui = ui.page_fluid(
    ui.h2("Mi Aplicación Shiny en Python"),
    # Más componentes de UI...
)

app/server.py

from shiny import render

def server(input, output, session):
    @output
    @render.text
    def saludo():
        return "¡Hola desde el servidor!"

app/modules/db_handler.py

import sqlalchemy as db
from config.config import get_config  # Ejemplo de una función que retorna parámetros

def get_engine():
    config = get_config()  # Configuración cargada desde config.yml o .env
    db_url = config.get('DATABASE_URL')
    engine = db.create_engine(db_url)
    return engine

def obtener_datos():
    engine = get_engine()
    connection = engine.connect()
    resultado = connection.execute("SELECT * FROM tabla_ejemplo")
    datos = [row for row in resultado]
    connection.close()
    return datos

Configuración en VSCode para la Aplicación Shiny

  1. Entorno Virtual:

    • Crea un entorno virtual (python -m venv venv o conda create -n shiny_env python=3.xx).
    • Actívalo y asegúrate de instalar tus dependencias (pip install -r requirements.txt).
    • VSCode detectará el intérprete si lo seleccionas correctamente en la parte inferior derecha (o en el panel de comandos).
  2. Depuración con launch.json (opcional):
    En .vscode/launch.json, define la configuración de lanzamiento:

    {
      "version": "0.2.0",
      "configurations": [
        {
          "name": "Python: Run Shiny App",
          "type": "python",
          "request": "launch",
          "program": "${workspaceFolder}/run.py",
          "console": "integratedTerminal"
        }
      ]
    }

    Si prefieres apuntar directamente a app/main.py, modifica la ruta en "program".

  3. Plugin de Shiny para Python:

    • Si has instalado la extensión de Shiny para Python en VSCode, usualmente detectará el archivo principal (run.py o app/main.py) como la entrada.
    • No habrá conflicto con que tu aplicación resida en la carpeta app/, siempre que la ruta al archivo principal esté bien configurada.

Recomendaciones Finales

  • Modularidad y Reutilización: A medida que tu aplicación crezca, mantén una arquitectura limpia: separa la lógica de datos, la configuración y la interfaz.
  • Control de Versiones en GitHub:
    • Usa ramas para cada feature/fix y haz pull requests bien documentados.
    • Mantén el .gitignore actualizado para no subir archivos sensibles o pesados.
  • Pruebas Automatizadas (CI/CD):
    • Configura GitHub Actions u otro sistema de CI para que ejecute pytest (u otro framework de pruebas) en cada push o pull request.
  • Documentación y README.md:
    • Explica cómo instalar, configurar y arrancar la app.
    • Indica cualquier dependencia externa (por ejemplo, servicios de base de datos o APIs).