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.2.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.2-py3-none-any.whl (47.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fluxem_core-1.0.2.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.2.tar.gz
Algorithm Hash digest
SHA256 8e13e89bce5321d37342c9f93aec7d3428b5457c494beab7cdbfa1f2e3d4975e
MD5 4dfce3df75e378a71dd2814a5c078f2d
BLAKE2b-256 5563cc89689f53d6887b049b7dffec138dbbf72b322484baacc42cd37e31b9be

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fluxem_core-1.0.2-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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 57b1246bfed8eae8b9453098294f5bc57ef32af86f7b6234274b9992ff5fe536
MD5 76c8dad11b2d1a9844dfdc05545e4b2a
BLAKE2b-256 017c86aebca47a4dd05c0b9bcab55d09e82ca8fc564eb8668e693417bf115559

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