Skip to main content

Núcleo reutilizable para proyectos Python con arquitectura hexagonal y event handling. Provee abstracciones, utilidades y contratos para DDD, eventos y desacoplamiento de infraestructura.

Project description

HexCore PyPI Downloads

HexCore es un módulo base reutilizable para proyectos Python que implementan arquitectura hexagonal y event handling.


Skills del Proyecto

Este repositorio cuenta con un conjunto de skills adicionales para extender y personalizar funcionalidades en VS Code y otros entornos compatibles. Puedes encontrarlas en:


¿Qué provee HexCore?

  • Clases base y abstracciones para entidades, repositorios, servicios y unidad de trabajo (UoW), siguiendo los principios de DDD y arquitectura hexagonal.
  • Interfaces y contratos para caché, eventos y manejo de dependencias, desacoplando la lógica de negocio de la infraestructura.
  • Utilidades para event sourcing y event dispatching listas para usar en cualquier proyecto.
  • Estructura flexible para que puedas construir microservicios o aplicaciones monolíticas desacopladas y testeables.

Instalación

pip install hexcore

Templates de Proyecto (CLI)

HexCore incluye templates base para bootstrap de proyectos:

hexcore init mi_proyecto --template hexagonal
hexcore init mi_proyecto --template vertical-slice
  • hexagonal: crea src/domain, src/application, src/infrastructure.
  • vertical-slice: crea src/features, src/shared/domain, src/shared/application, src/shared/infrastructure.

En ambos templates se generan:

  • config.py en raíz con repository_discovery_paths de ejemplo.
  • estructura de migraciones con Alembic.

Configuración v2 (Folder-Agnostic)

Desde v2, HexCore usa configuración explícita y no aplica fallback implícito para descubrir repositorios.

1. Configuración visible en raíz

Define un archivo config.py en la raíz del proyecto:

from hexcore.config import ServerConfig

config = ServerConfig(
    repository_discovery_paths={
        "myapp.features.users.infrastructure.repositories",
        "myapp.features.billing.infrastructure.repositories",
    }
)

2. Prioridad para cargar configuración

LazyConfig resuelve módulos en este orden:

  1. HEXCORE_CONFIG_MODULE
  2. HEXCORE_CONFIG_MODULES (lista separada por comas)
  3. módulos configurados por LazyConfig.set_config_modules(...)
  4. config por defecto (raíz del proyecto)

3. Regla de discovery en v2

  • Si repository_discovery_paths está vacío, no se cargan módulos de repositorios.
  • UoW falla con error explícito para evitar comportamiento ambiguo.

Pautas de Colaboración

¡Gracias por tu interés en contribuir a HexCore! Para mantener una colaboración organizada y eficiente, sigue estas pautas:

1. Código de Conducta

Mantén siempre una comunicación respetuosa y profesional. Revisa el Código de Conducta antes de interactuar.

2. Cómo Contribuir

  • Forkea el repositorio y crea una rama para tu contribución (feature/nombre, fix/nombre, etc.).
  • Realiza tus cambios en la rama y asegúrate de que el código funcione correctamente.
  • Escribe una descripción clara y detallada en tu pull request (PR).
  • Relaciona los issues relevantes en tu PR si aplica.

3. Estilo y Formato de Código

  • Sigue la guía de estilos de Python (PEP8).
  • Usa comentarios cuando sea necesario para clarificar el propósito del código.
  • Idealmente, incluye pruebas unitarias para nuevas funciones y arreglos.

4. Revisión de Pull Requests

  • Todos los PR serán revisados antes de ser aceptados. Se pueden solicitar cambios o aclaraciones.
  • Responde a los comentarios de los revisores para facilitar el proceso.

5. Issues

  • Describe claramente los problemas que encuentres.
  • Proporciona información relevante (logs, versiones, pasos para reproducir, etc.).

6. Comunicación

  • Usa los issues y las discusiones para preguntas, sugerencias o propuestas.
  • Si tienes dudas sobre cómo empezar, puedes abrir un issue para orientación.

7. Licencia

Al contribuir, aceptas que tu código será distribuido bajo la licencia del repositorio.


Documentación Básica

Estructura principal

HexCore se organiza con los siguientes submódulos y carpetas:

  • src/domain/: Módulos de dominio, entidades, repositorios, servicios, objetos de valor, eventos, enums y excepciones.
    src/domain/{modulo}/
      ├─ __init__.py
      ├─ entities.py
      ├─ repositories.py
      ├─ services.py
      ├─ value_objects.py
      ├─ events.py
      ├─ enums.py
      └─ exceptions.py
    
  • src/application/: Casos de uso (UseCase) y DTOs para orquestar la lógica de negocio.
  • src/infrastructure/: Implementaciones técnicas (ORM/ODM, CLI, caché, base de datos, repositorios, unit of work).
  • src/infrastructure/database/models/: Modelos SQLAlchemy para base de datos relacional.
  • src/infrastructure/database/documents/: Documentos Beanie para MongoDB.
  • tests/: Pruebas para módulos de dominio e infraestructura.

Abstracciones de Entidades y Eventos

BaseEntity

Clase base para entidades de dominio. Provee atributos comunes y gestión de eventos.

from hexcore.domain.base import BaseEntity

class User(BaseEntity):
    id: UUID
    name: str

DomainEvent y eventos de entidad

Abstracciones para eventos de dominio y para ciclo de vida de entidades.

from hexcore.domain.events import DomainEvent, EntityCreatedEvent

class UserCreatedEvent(EntityCreatedEvent[User]):
    pass

user = User(...)
event = UserCreatedEvent(entity_id=user.id, payload={"name": user.name})

Implementaciones de Repositorios

SQLAlchemyCommonImplementationsRepo

Repositorio genérico para modelos SQLAlchemy con métodos CRUD reutilizables.

class SQLAlchemyCommonImplementationsRepo(BaseSQLAlchemyRepository[T], HasBasicArgs[T, M], t.Generic[T, M]):
    # Métodos principales: get_by_id, list_all, save, delete
    ...

Ejemplo:

class UserRepository(SQLAlchemyCommonImplementationsRepo[UserEntity, UserModel]):
    def __init__(self, uow):
        super().__init__(
            entity_cls=UserEntity,
            model_cls=UserModel,
            not_found_exception=UserNotFoundException,
            fields_resolvers=None,
            fields_serializers=None,
            uow=uow
        )

BeanieODMCommonImplementationsRepo

Repositorio genérico para documentos Beanie ODM (MongoDB) con métodos CRUD reutilizables.

class BeanieODMCommonImplementationsRepo(IBaseRepository[T], HasBasicArgs[T, D], t.Generic[T, D]):
    # Métodos principales: get_by_id, list_all, save, delete
    ...

Ejemplo:

class UserRepository(BeanieODMCommonImplementationsRepo[UserEntity, UserDocument]):
    def __init__(self, uow):
        super().__init__(
            entity_cls=UserEntity,
            document_cls=UserDocument,
            not_found_exception=UserNotFoundException,
            fields_resolvers=None,
            fields_serializers=None,
            uow=uow
        )

Inicialización y Descubrimiento de Documentos Beanie

Para inicializar y registrar automáticamente todos los documentos Beanie:

from hexcore.infrastructure.repositories.orms.beanie.utils import init_beanie_documents

await init_beanie_documents()

Conversión entre modelos/documentos y entidades

Ambos repositorios utilizan to_entity_from_model_or_document para convertir modelos ORM/ODM en entidades del dominio, aplicando resolvers para atributos complejos.


Referencias

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hexcore-2.0.5.tar.gz (45.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hexcore-2.0.5-py3-none-any.whl (59.8 kB view details)

Uploaded Python 3

File details

Details for the file hexcore-2.0.5.tar.gz.

File metadata

  • Download URL: hexcore-2.0.5.tar.gz
  • Upload date:
  • Size: 45.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for hexcore-2.0.5.tar.gz
Algorithm Hash digest
SHA256 984389b5c1c72feb035cc78d446958e9f1f2d94254f197afe104930bc2863f0a
MD5 0cfdcb234f76a0385d9390e098b6674c
BLAKE2b-256 630161f506c2e02af01fb825856608fc7ac906b14d8a8ec72b4911c2895f214c

See more details on using hashes here.

File details

Details for the file hexcore-2.0.5-py3-none-any.whl.

File metadata

  • Download URL: hexcore-2.0.5-py3-none-any.whl
  • Upload date:
  • Size: 59.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for hexcore-2.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 83f19c9596ad5f1deb2eaf20251e2c95fc57790efaa06f3afa94c42b4da4659a
MD5 3417a1051730651d2d2434c60edef45b
BLAKE2b-256 334e0edde6916d6536ee09f07064dfaf42db88ca18184ed22832ec2c7072ef9b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page