From b8ae14fbe3515679c2711c880b8a8ebdb1d04a13 Mon Sep 17 00:00:00 2001 From: "Mauro Rosero P." Date: Wed, 12 Mar 2025 07:37:51 -0500 Subject: [PATCH] =?UTF-8?q?[IMPROVED]=20Agregar=20validaci=C3=B3n=20de=20c?= =?UTF-8?q?=C3=B3digos=20de=20pa=C3=ADs=20con=20pycountry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Instala automáticamente la biblioteca pycountry si no está disponible - Valida códigos de país usando la base de datos de pycountry - Acepta códigos especiales como 'ww' (mundial) y 'la' (Latinoamérica) - Genera advertencias para códigos de país inválidos pero continúa el proceso 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- bin/rate_update.py | 47 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/bin/rate_update.py b/bin/rate_update.py index 8c2bbb4..90d23f9 100755 --- a/bin/rate_update.py +++ b/bin/rate_update.py @@ -16,8 +16,26 @@ import json import logging import requests import sys +import subprocess +import importlib.util from pathlib import Path +# Verificar si pycountry está instalado, si no, instalarlo +def check_install_pycountry(): + """Verifica si pycountry está instalado y lo instala si es necesario.""" + if importlib.util.find_spec("pycountry") is None: + logger.info("Instalando la biblioteca pycountry...") + try: + subprocess.check_call([sys.executable, "-m", "pip", "install", "pycountry"]) + logger.info("Biblioteca pycountry instalada correctamente.") + except subprocess.CalledProcessError as e: + logger.error(f"Error al instalar pycountry: {e}") + sys.exit(1) + + # Ahora importamos pycountry + global pycountry + import pycountry + # Configuración de logging logging.basicConfig( level=logging.INFO, @@ -100,10 +118,27 @@ def query_perplexity(prompt, model="o1"): logger.error(f"Error al conectar con la API de Perplexity: {e}") return None +def is_valid_country_code(code): + """ + Verifica si un código de país de 2 letras es válido según pycountry. + También acepta códigos especiales 'ww' y 'la'. + """ + if code in ['ww', 'la']: # Códigos especiales: worldwide y Latin America + return True + + try: + # Verifica si el código existe en pycountry + return pycountry.countries.get(alpha_2=code.upper()) is not None + except AttributeError: + # Si hay un error con pycountry, asumimos que el código es válido + logger.warning(f"No se pudo validar el código de país '{code}' con pycountry") + return True + def parse_rate_filename(filename): """ Analiza el nombre del archivo de tarifa para extraer el tipo de programador y la región. Formato: [tipo_de_programador]_[código_país].rate + Valida el código de país usando pycountry. """ base_name = os.path.basename(filename) match = re.match(r'([a-z]+)_([a-z]{2})\.rate$', base_name) @@ -116,6 +151,12 @@ def parse_rate_filename(filename): return None, None programmer_type, region_code = match.groups() + + # Validar el código de país + if not is_valid_country_code(region_code): + logger.warning(f"Código de país no válido '{region_code}' en el archivo {base_name}") + # Aun así continuamos con el proceso + return programmer_type, region_code def generate_prompt(programmer_type, region_code): @@ -214,5 +255,11 @@ def update_rate_files(): if __name__ == "__main__": logger.info("Iniciando actualización de tarifas...") + + # Verificar e instalar pycountry si es necesario + check_install_pycountry() + + # Actualizar los archivos de tarifas update_rate_files() + logger.info("Proceso de actualización de tarifas completado.") \ No newline at end of file