ParamManagerScripts/backend/script_groups/TwinCat/.doc/backend_setup.md

8.6 KiB

Guía de Configuración para Scripts Backend

Introducción

Esta guía explica cómo configurar y usar correctamente la función load_configuration() en scripts ubicados bajo el directorio /backend. La función carga configuraciones desde un archivo script_config.json ubicado en el mismo directorio que el script que la llama.

Configuración del Path e Importación

1. Configuración estándar del Path

Para scripts ubicados en subdirectorios bajo /backend, usa este patrón estándar:

import os
import sys

# Configurar el path al directorio raíz del proyecto
script_root = os.path.dirname(
    os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
)
sys.path.append(script_root)

# Importar la función de configuración
from backend.script_utils import load_configuration

Nota: El número de os.path.dirname() anidados depende de la profundidad del script:

  • Scripts en /backend/script_groups/grupo/: 4 niveles
  • Scripts en /backend/: 2 niveles

2. Importación Correcta

Correcto:

from backend.script_utils import load_configuration

Incorrecto:

from script_utils import load_configuration  # No funciona desde subdirectorios

Uso de la Función load_configuration()

Implementación Básica

def main():
    # Cargar configuraciones
    configs = load_configuration()
    
    # Obtener el directorio de trabajo
    working_directory = configs.get("working_directory", "")
    
    # Acceder a configuraciones por nivel
    level1_config = configs.get("level1", {})
    level2_config = configs.get("level2", {})
    level3_config = configs.get("level3", {})
    
    # Ejemplo de uso de parámetros específicos con valores por defecto
    scl_output_dir = level2_config.get("scl_output_dir", "scl_output")
    xref_output_dir = level2_config.get("xref_output_dir", "xref_output")
    
if __name__ == "__main__":
    main()

Estructura del Archivo script_config.json

El archivo script_config.json debe estar ubicado en el mismo directorio que el script que llama a load_configuration(). Estructura recomendada:

{
    "working_directory": "/ruta/al/directorio/de/trabajo",
    "level1": {
        "parametro_global_1": "valor1",
        "parametro_global_2": "valor2"
    },
    "level2": {
        "scl_output_dir": "scl_output",
        "xref_output_dir": "xref_output",
        "xref_source_subdir": "source",
        "aggregated_filename": "full_project_representation.md"
    },
    "level3": {
        "parametro_especifico_1": true,
        "parametro_especifico_2": 100
    }
}

Ejemplo Completo de Implementación

"""
Script de ejemplo que demuestra el uso completo de load_configuration()
"""

import os
import sys
import json

# Configuración del path
script_root = os.path.dirname(
    os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
)
sys.path.append(script_root)
from backend.script_utils import load_configuration


def main():
    print("=== Cargando Configuración ===")
    
    # Cargar configuraciones
    configs = load_configuration()
    
    # Verificar que se cargó correctamente
    if not configs:
        print("Error: No se pudo cargar la configuración")
        return
    
    # Obtener configuraciones
    working_directory = configs.get("working_directory", "")
    level1_config = configs.get("level1", {})
    level2_config = configs.get("level2", {})
    level3_config = configs.get("level3", {})
    
    # Mostrar configuraciones cargadas
    print(f"Directorio de trabajo: {working_directory}")
    print("Configuración Nivel 1:", json.dumps(level1_config, indent=2))
    print("Configuración Nivel 2:", json.dumps(level2_config, indent=2))
    print("Configuración Nivel 3:", json.dumps(level3_config, indent=2))
    
    # Ejemplo de uso de parámetros con valores por defecto
    scl_output_dir = level2_config.get("scl_output_dir", "scl_output")
    xref_output_dir = level2_config.get("xref_output_dir", "xref_output")
    
    print(f"Directorio de salida SCL: {scl_output_dir}")
    print(f"Directorio de salida XREF: {xref_output_dir}")


if __name__ == "__main__":
    main()

Manejo de Errores

La función load_configuration() maneja automáticamente los siguientes casos:

  1. Archivo no encontrado: Retorna un diccionario vacío {}
  2. JSON inválido: Retorna un diccionario vacío y muestra un mensaje de error
  3. Errores de lectura: Retorna un diccionario vacío y muestra un mensaje de error

Verificación de Configuración Válida

configs = load_configuration()

# Verificar que se cargó correctamente
if not configs:
    print("Advertencia: No se pudo cargar la configuración, usando valores por defecto")
    working_directory = "."
else:
    working_directory = configs.get("working_directory", ".")

# Verificar directorio de trabajo
if not os.path.exists(working_directory):
    print(f"Error: El directorio de trabajo no existe: {working_directory}")
    return

Mejores Prácticas

  1. Siempre proporciona valores por defecto al usar .get():

    valor = config.get("clave", "valor_por_defecto")
    
  2. Verifica la existencia de directorios críticos:

    if not os.path.exists(working_directory):
        print(f"Error: Directorio no encontrado: {working_directory}")
        return
    
  3. Documenta los parámetros esperados en tu script:

    # Parámetros esperados en level2:
    # - scl_output_dir: Directorio de salida para archivos SCL
    # - xref_output_dir: Directorio de salida para referencias cruzadas
    
  4. Usa nombres de parámetros consistentes en todos los scripts del mismo grupo.

Definición Técnica de load_configuration()

def load_configuration() -> Dict[str, Any]:
    """
    Load configuration from script_config.json in the current script directory.

    Returns:
        Dict containing configurations with levels 1, 2, 3 and working_directory

    Example usage in scripts:
        from backend.script_utils import load_configuration

        configs = load_configuration()
        level1_config = configs.get("level1", {})
        level2_config = configs.get("level2", {})
        level3_config = configs.get("level3", {})
        working_dir = configs.get("working_directory", "")
    """

La función utiliza inspect.stack() para determinar automáticamente el directorio del script que la llama, asegurando que siempre busque el archivo script_config.json en la ubicación correcta.

Documentación de Scripts para el Launcher

El sistema de launcher utiliza archivos JSON para mostrar información sobre los grupos de scripts y scripts individuales en la interfaz web.

Archivo description.json (Descripción del Grupo)

Ubicación: En el directorio raíz del grupo de scripts.

{
  "name": "Nombre del Grupo",
  "description": "Descripción del propósito y funcionalidad del grupo",
  "version": "1.0",
  "author": "Nombre del Autor"
}

Archivo scripts_description.json (Descripción de Scripts)

Ubicación: En el directorio raíz del grupo de scripts.

{
    "nombre_script.py": {
        "display_name": "Nombre para mostrar en la UI",
        "short_description": "Descripción breve del script",
        "long_description": "Descripción detallada con explicación completa de funcionalidad, pasos que ejecuta, y contexto de uso",
        "hidden": false
    },
    "script_interno.py": {
        "display_name": "Script Interno",
        "short_description": "Script de uso interno",
        "long_description": "",
        "hidden": true
    }
}

Propiedades Importantes

  • hidden: true oculta el script del launcher (útil para scripts auxiliares)
  • display_name: Nombre amigable que aparece en la interfaz
  • short_description: Se muestra en la lista de scripts
  • long_description: Se muestra al expandir detalles del script

Ejemplo Práctico

Para un grupo "XML Parser to SCL":

description.json:

{
  "name": "Siemens-Tia : 03 : Procesador de XML LAD-SCL-AWL",
  "description": "Scripts que procesan archivos XML exportados de TIA, convirtiendo LAD a SCL",
  "version": "1.0",
  "author": "Miguel"
}

scripts_description.json:

{
    "x0_main.py": {
        "display_name": "1: Procesar Exportación XML completa",
        "short_description": "Conversor principal de LAD/FUP XML a SCL",
        "long_description": "Script orquestador que procesa todos los archivos XML...",
        "hidden": false
    },
    "x1_to_json.py": {
        "display_name": "x1_to_json",
        "short_description": "Converter XML interno",
        "long_description": "",
        "hidden": true
    }
}