Epic_2_Sprint_1 Create a shared version utility - robbiemu/aclarai GitHub Wiki

Tarea: Crear una utilidad compartida para leer la versión del proyecto desde pyproject.toml

Descripción

Implementar una utilidad centralizada en el paquete aclarai-shared que lea el número de versión directamente desde el fichero pyproject.toml raíz. Esta utilidad proporcionará una constante global (ACLARAI_VERSION) que será expuesta directamente en el nivel superior del paquete aclarai_shared para facilitar su uso. Esto establece una única fuente de verdad para el versionado del proyecto y elimina la necesidad de mantener versiones hardcodeadas en múltiples lugares.

Alcance

Incluido

  • Creación de un nuevo fichero: shared/aclarai_shared/utils/version.py.
  • Implementación de una función robusta find_project_root() que navegue hacia arriba en el árbol de directorios para localizar el pyproject.toml raíz.
  • Implementación de una función get_version() que utilice tomllib (con tomli como fallback) para parsear el pyproject.toml y extraer el valor de la clave project.version.
  • Definición de una constante global ACLARAI_VERSION en version.py.
  • Creación del fichero shared/aclarai_shared/utils/__init__.py para asegurar que utils sea un paquete de Python.
  • Modificación del fichero shared/aclarai_shared/__init__.py para importar y exportar la constante ACLARAI_VERSION, haciéndola accesible desde el nivel superior del paquete.
  • Añadir tomli como una dependencia principal en shared/pyproject.toml para garantizar la compatibilidad con Python < 3.11.

Excluido

  • La refactorización de los servicios para que importen y utilicen la nueva constante ACLARAI_VERSION. (Se abordará en la siguiente tarea).
  • La implementación de tests de integración para esta nueva utilidad.
  • La creación o modificación de cualquier hook de pre-commit.

Criterios de Aceptación

  • El fichero shared/aclarai_shared/utils/version.py existe y contiene la constante ACLARAI_VERSION.
  • Al importar ACLARAI_VERSION directamente desde el paquete compartido (e.g., from aclarai_shared import ACLARAI_VERSION), su valor coincide exactamente con la cadena de versión definida en el pyproject.toml raíz.
  • La lógica para encontrar el pyproject.toml raíz es robusta y no depende del directorio de trabajo actual (cwd).

Dependencias (estas son particularmente las cosas en este EPIC que necesitan ser hechas)

  • Tarea: Establecer la Versión del Proyecto en pyproject.toml Raíz: La clave version debe existir en el pyproject.toml raíz para que esta utilidad pueda leerla.

Entregables

  • Nuevo fichero: shared/aclarai_shared/utils/version.py.
  • Nuevo fichero: shared/aclarai_shared/utils/__init__.py.
  • Fichero modificado: shared/aclarai_shared/__init__.py.
  • Fichero modificado: shared/pyproject.toml.

Estimación de Esfuerzo (en días)

  • 1 día

Riesgos y Mitigaciones

  • Riesgo: La lógica para encontrar el directorio raíz (find_project_root) podría ser frágil y fallar en ciertos entornos de despliegue.
    • Mitigación: La implementación se basará en Path(__file__).resolve().parents para una navegación fiable del sistema de ficheros, en lugar de depender de os.getcwd().
  • Riesgo: La modificación del __init__.py principal podría introducir problemas de importación circular si la utilidad de versión dependiera de otros componentes del paquete compartido.
    • Mitigación: El módulo version.py será diseñado para tener un mínimo de dependencias, importando únicamente módulos de la librería estándar de Python (pathlib, tomllib) y ninguna otra utilidad de aclarai_shared.

Notas Técnicas

  • La lógica de la utilidad se implementará en shared/aclarai_shared/utils/version.py.

  • El fichero shared/aclarai_shared/__init__.py será modificado para exponer la constante:

    # shared/aclarai_shared/__init__.py
    
    # ... otros imports existentes ...
    
    # Importar la constante para que esté disponible en el nivel superior del paquete
    from .utils.version import ACLARAI_VERSION
    
    # Actualizar la lista __all__ para incluir la nueva constante
    __all__ = [
        # ... otros exports existentes ...
        "ACLARAI_VERSION",
    ]
    
  • El consumo de la constante en otros servicios será simple y directo:

    # Ejemplo en un servicio como aclarai-core
    from aclarai_shared import ACLARAI_VERSION
    
    print(f"Versión del servicio: {ACLARAI_VERSION}")