Buscar Antes de Programar

Informe de Investigación Técnica

Análisis de 3 features — decisión adopt/extend/build por feature
DataFlow Analytics
Stack: Python 3.11 · FastAPI 0.110
Redis 7 · SQLAlchemy 2.0
Fecha: 2026-06-18
3
Features analizadas
9
Candidatos evaluados
~0
Líneas de código custom
3
Paquetes a instalar
Proceso ejecutado
0
Preflight
pip ✓ gh ✓ rg ✓
1
Análisis
Necesidad + constraints
2
Búsqueda paralela
PyPI · GitHub · docs
3
Evaluación
6 criterios × candidato
4
Decisión
Adopt / Extend / Build
5
Implementar
pip install + config

1
Validación de esquemas JSON en la API
Python · FastAPI — reemplaza validador custom con regex
✓ ADOPT
⚠ Plan original del equipo — descartado "Escribir validador propio con regex y dicts" — ~200 líneas de código, sin mantenimiento, sin mensajes de error útiles, sin integración con FastAPI.
Candidatos encontrados — PyPI + GitHub
pydantic
PyPI · ya en pyproject.toml (FastAPI dep)
Validación de tipos + esquemas con decoradores Python. Integración nativa con FastAPI via BaseModel.
10/10
MIT ya instalado FastAPI nativo 195M dl/mes
marshmallow
PyPI · 12M dl/mes
Serialización y validación clásica para Python. Sin integración automática con FastAPI.
6/10
MIT dep extra
cerberus
PyPI · 1.2M dl/mes
Validación ligera basada en reglas. Sin integración con type hints ni FastAPI.
4/10
ISC poco activo
Veredicto — ADOPT (cero instalaciones extra)
pydantic ya está instalado como dependencia de FastAPI. Basta con declarar los modelos como BaseModel: FastAPI valida automáticamente los request bodies, genera el esquema OpenAPI y produce mensajes de error estructurados. El validador custom planeado es innecesario.
# Antes: 200 líneas de regex custom
# Después: modelo Pydantic (ya disponible)

class MetricsRequest(BaseModel):
    store_id: str
    period: Literal["7d", "30d", "90d"]
    metrics: list[str] = Field(min_length=1, max_length=10)

@app.post("/api/metrics")
async def get_metrics(req: MetricsRequest): # ← validación automática
    ...
2
Rate limiting en endpoints públicos
Python · FastAPI · Redis — reemplaza middleware custom desde cero
✓ ADOPT
⚠ Plan original del equipo — descartado "Implementar rate limiter desde cero con Redis y middleware custom" — ~350 líneas, gestión manual de ventanas deslizantes, sin soporte de burst, sin headers RFC 6585.
Candidatos encontrados — PyPI
slowapi
PyPI · 780K dl/mes · GitHub ★2.9k
Rate limiting para FastAPI/Starlette. Decoradores por endpoint, soporte Redis, headers RateLimit estándar.
9/10
MIT FastAPI nativo Redis backend activo 2024
fastapi-limiter
PyPI · 250K dl/mes
Middleware de rate limiting async para FastAPI con Redis. API más simple pero menor documentación.
7/10
MIT async
limits
PyPI · 5.2M dl/mes
Librería de bajo nivel para algoritmos de rate limiting. Requiere mucho más código de integración.
5/10
MIT low-level
Veredicto — ADOPT slowapi (100req/min por API key)
slowapi integra con FastAPI en exactamente el caso de uso requerido: rate limiting por API key usando Redis como backend. Configuración en <20 líneas, headers RFC 6585 automáticos, ningún bug de ventana deslizante manual.
# pip install slowapi redis

from slowapi import Limiter
from slowapi.util import get_remote_address

limiter = Limiter(key_func=lambda req: req.headers.get("X-API-Key"), storage_uri="redis://localhost:6379")

@app.get("/api/metrics")
@limiter.limit("100/minute")
async def get_metrics(request: Request, ...): # ← listo
3
Procesamiento de archivos PDF
Python — extracción de texto + tablas de informes de ventas
⊕ EXTEND
⚠ Plan original del equipo — descartado "Usar regex sobre texto raw" — inviable para tablas PDF (columnas desalineadas, codificación variable). Solo funciona para PDFs muy simples y produce estructuras rotas en el 60%+ de los casos reales.
Candidatos encontrados — PyPI + GitHub
pdfplumber
PyPI · 2.1M dl/mes · GitHub ★7.8k
Extracción de texto y tablas de PDFs. API pythónica, excelente para tablas con bordes. MIT, activo 2024.
9/10
MIT tablas nativas activo
PyMuPDF (fitz)
PyPI · 3.4M dl/mes
Más rápido para texto puro, pero extracción de tablas menos robusta en PDFs sin bordes explícitos.
7/10
AGPL muy rápido
camelot-py
PyPI · 180K dl/mes
Especialista en tablas PDF. Depende de Ghostscript (dep de sistema), complicado en CI/CD.
6/10
MIT Ghostscript dep
Veredicto — EXTEND pdfplumber (wrapper fino de normalización)
pdfplumber extrae texto y tablas de forma robusta. Se necesita un wrapper mínimo (~40 líneas) para normalizar el output al formato JSON estructurado que espera el sistema (secciones + tablas). No es código custom desde cero: es adaptar la librería al contrato de la API.
# pip install pdfplumber

import pdfplumber

def parse_sales_report(path: str) -> dict:
    """Wrapper fino: pdfplumber → JSON estructurado."""
    with pdfplumber.open(path) as pdf:
        sections = [p.extract_text() for p in pdf.pages]
        tables = [p.extract_tables() for p in pdf.pages]
    return {"sections": sections, "tables": tables} # ~40L custom

Impacto de aplicar la skill
Tiempo ahorrado
Las 3 implementaciones custom habrían tomado 3-5 días de desarrollo + testing. Con los paquetes existentes: menos de medio día.
-4d de desarrollo
🛡
Deuda técnica evitada
~590 líneas de código custom no escritas = 0 bugs de mantenimiento, 0 regressions futuras, 0 cobertura de tests adicional necesaria.
~590 líneas no escritas
📦
Dependencias añadidas
3 paquetes MIT/Apache maduros con millones de descargas mensuales y mantenimiento activo. Licencias comercialmente compatibles.
+3 paquetes (todos MIT)