import json, os import logging from app import arg_parser args = arg_parser.ArgParser().parse() logger = logging.getLogger(__name__) class ConfigParser: config = None def __init__(self): self.loadConfig() def loadConfig(self): try: ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) path = os.path.join(ROOT_DIR, '../config.json') logger.info(f"Ruta base del config: {path}") if args.config: path = args.config logger.info(f"Usando ruta de config personalizada: {path}") if not os.path.exists(path): error_msg = f"Archivo de configuración no encontrado: {path}" logger.error(error_msg) raise FileNotFoundError(error_msg) logger.info(f"Cargando configuración desde: {path}") with open(path, 'r', encoding='utf-8') as f: try: self.config = json.load(f) logger.info("Configuración cargada correctamente") except json.JSONDecodeError as e: error_msg = f"Error al parsear JSON del archivo de configuración: {str(e)}" logger.error(error_msg, exc_info=True) raise ValueError(error_msg) # Validar estructura básica if not isinstance(self.config, dict): error_msg = "El archivo de configuración no contiene un objeto JSON válido" logger.error(error_msg) raise ValueError(error_msg) # Aplicar overrides de argumentos try: if args.geoLatitude: if 'geo' not in self.config: self.config['geo'] = {} self.config['geo']['latitude'] = args.geoLatitude logger.info(f"Latitud sobrescrita por argumento: {args.geoLatitude}") if args.geoLongitude: if 'geo' not in self.config: self.config['geo'] = {} self.config['geo']['longitude'] = args.geoLongitude logger.info(f"Longitud sobrescrita por argumento: {args.geoLongitude}") if args.user: self.config['user'] = args.user logger.info(f"Usuario sobrescrito por argumento: {args.user}") if args.geoAccuracy: if 'geo' not in self.config: self.config['geo'] = {} self.config['geo']['accuracy'] = args.geoAccuracy logger.info(f"Precisión geográfica sobrescrita por argumento: {args.geoAccuracy}") except Exception as e: logger.warning(f"Error al aplicar overrides de argumentos: {str(e)}") logger.info("Configuración procesada correctamente") return self.config except FileNotFoundError as e: logger.error(f"Archivo de configuración no encontrado: {str(e)}", exc_info=True) raise except json.JSONDecodeError as e: logger.error(f"Error de sintaxis JSON en configuración: {str(e)}", exc_info=True) raise except Exception as e: error_msg = f"Error inesperado al cargar configuración: {str(e)}" logger.error(error_msg, exc_info=True) raise