- Agregado logging estructurado en todos los módulos - Implementados try-catches en todos los métodos críticos - Errores ahora se envían automáticamente por Telegram - Mejorado manejo de excepciones en requests HTTP - Agregado try-catch global en main.py para errores no manejados - Logging detallado en timenet_manager, telegram_bot, google_calendar y config_parser
84 lines
3.4 KiB
Python
84 lines
3.4 KiB
Python
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 |