Skip to main content

Librería empresarial completa para proyectos Python con DTOs estándar, motor de búsqueda avanzada con SQLAlchemy y utilidades comunes

Project description

🚀 Fluxem Core - Python Edition

Librería empresarial completa para proyectos Python que incluye DTOs estándar, motor de búsqueda avanzada con SQLAlchemy y utilidades comunes.

📦 Características

  • DTOs Estándar: ApiResponse, SearchRequest, FilterCriteria, PaginationMetadata
  • Motor de Búsqueda: Búsqueda avanzada con filtros dinámicos, ordenamiento y paginación
  • AbstractSearchService: Clase base genérica para implementar búsquedas en cualquier entidad
  • Operadores Completos: EQ, NEQ, CONTAINS, GT, GTE, LT, LTE, BETWEEN, IN, IS_NULL, IS_NOT_NULL
  • Validación de Campos: Whitelist de campos permitidos para seguridad
  • Conversión de Tipos: Conversión automática (str → UUID, datetime, Enum, etc.)
  • Búsqueda Global: Full-text search sobre múltiples campos
  • Type Hints: 100% tipado estático con MyPy
  • Testing: Alta cobertura con Pytest
  • Async Support: Compatible con FastAPI y operaciones asíncronas

🎯 Instalación

Con Poetry (Recomendado)

poetry add fluxem-core

Con pip

pip install fluxem-core

📖 Uso Rápido

1. Extender AbstractSearchService

from typing import List, Set
from sqlalchemy.orm import Session
from fluxem_core.search import AbstractSearchService
from fluxem_core.dto.request import SearchRequest, SortDirection
from fluxem_core.dto.response import SearchResponse
from models import User, UserDTO

class UserSearchService(AbstractSearchService[User, int, UserDTO]):
    """Servicio de búsqueda para usuarios."""
    
    def __init__(self, db: Session):
        super().__init__(User, db)
    
    def get_allowed_fields(self) -> Set[str]:
        return {"id", "username", "email", "status", "created_at"}
    
    def get_global_search_fields(self) -> List[str]:
        return ["username", "email", "first_name", "last_name"]
    
    def convert_to_dto(self, entity: User) -> UserDTO:
        return UserDTO(
            id=entity.id,
            username=entity.username,
            email=entity.email,
            status=entity.status,
            created_at=entity.created_at
        )
    
    def get_default_sort_field(self) -> str:
        return "created_at"
    
    def get_default_sort_direction(self) -> SortDirection:
        return SortDirection.DESC

2. Usar en FastAPI Controller

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from fluxem_core.dto.request import SearchRequest
from fluxem_core.dto.response import ApiResponse

router = APIRouter()

@router.post("/users/search")
async def search_users(
    request: SearchRequest,
    db: Session = Depends(get_db)
) -> ApiResponse[SearchResponse[UserDTO]]:
    service = UserSearchService(db)
    results = service.search(request)
    return ApiResponse.success(results)

3. Request JSON

{
  "filters": {
    "and": [
      {
        "field": "status",
        "operator": "eq",
        "value": "ACTIVE"
      },
      {
        "field": "email",
        "operator": "contains",
        "value": "@fluxem.com"
      }
    ]
  },
  "sort": [
    {
      "field": "created_at",
      "direction": "desc"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20
  }
}

4. Response JSON

{
  "success": true,
  "code": 200,
  "data": {
    "items": [
      {
        "id": 1,
        "username": "jgarcia",
        "email": "jgarcia@fluxem.com",
        "status": "ACTIVE",
        "created_at": "2025-11-20T10:30:00"
      }
    ],
    "total": 156,
    "pagination": {
      "page": 1,
      "limit": 20,
      "total": 156,
      "pages": 8,
      "has_next": true,
      "has_previous": false
    }
  },
  "message": "Búsqueda exitosa",
  "meta": {
    "timestamp": "2025-12-12T15:45:30"
  }
}

🔧 Operadores de Filtrado

Operadores de Texto

  • eq - Igual a
  • neq - Diferente de
  • contains - Contiene (case-insensitive)
  • starts_with - Comienza con
  • ends_with - Termina con
  • in - Está en lista

Operadores Numéricos

  • gt - Mayor que
  • gte - Mayor o igual
  • lt - Menor que
  • lte - Menor o igual
  • between - Entre dos valores

Operadores de Nulos

  • is_null - Es nulo
  • is_not_null - No es nulo

🧪 Testing

# Ejecutar tests
poetry run pytest

# Con cobertura
poetry run pytest --cov=fluxem_core --cov-report=html

# Type checking
poetry run mypy src/fluxem_core

# Linting
poetry run ruff check src/fluxem_core

# Formateo
poetry run black src/fluxem_core

📚 Documentación

Ver la documentación completa en docs/

🔒 Seguridad

  • Prevención de SQL Injection: Uso exclusivo de SQLAlchemy ORM
  • Whitelist de campos: Solo campos explícitamente permitidos
  • Validación de entrada: Pydantic en todos los DTOs
  • Type safety: Type hints completos con MyPy

🤝 Contribuir

Ver CONTRIBUTING.md

📄 Licencia

MIT License - Ver LICENSE

🔗 Links

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

fluxem_core-1.0.0.tar.gz (30.0 kB view details)

Uploaded Source

Built Distribution

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

fluxem_core-1.0.0-py3-none-any.whl (47.0 kB view details)

Uploaded Python 3

File details

Details for the file fluxem_core-1.0.0.tar.gz.

File metadata

  • Download URL: fluxem_core-1.0.0.tar.gz
  • Upload date:
  • Size: 30.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for fluxem_core-1.0.0.tar.gz
Algorithm Hash digest
SHA256 0bbfaa822d6c9522d38a4304aa0ab0c0bafcba4214c7c3a79ad6add44a1e30c2
MD5 6b596897c9df3849eb339c576d26529b
BLAKE2b-256 e52a36d63c907d6b83b3daf1865dd5209161d11c146737336b8099ff1acbfb00

See more details on using hashes here.

File details

Details for the file fluxem_core-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: fluxem_core-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 47.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for fluxem_core-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 671af81ef272071cd5cbc4f84ffcb6e8b0cfe6948ec2e1fc27adf79389cd214f
MD5 15e5201bfb70a7cf6951a7d277a8e3cc
BLAKE2b-256 1db0733910d597872edda63708a3981ed4c99ccf0d47bd758d855a1a478cd99c

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