Saltar a contenido

Changelog

Ver el archivo raw en el repo: CHANGELOG.md

0.3.3 — current

Agregado

  • BaseController.prepare_action(action_name) — lifecycle hook que setea self.action y corre check_permissions(). Auto-invocado por cada CRUD estándar (list, retrieve, create, update, delete) en BaseController + variantes SQLAlchemy / SQLModel / Beanie. Idempotente: re-invocaciones con el mismo action_name son no-ops.
  • permission_classes estilo DRF + override get_permissions() para dispatch por acción.
  • check_permissions_class() retro-compat alias.

Cambiado

  • format_response permisivo: si el data no satisface el schema, devuelve el valor crudo en vez de levantar ValidationError.

Tests

  • 134 passing across Beanie, SQLAlchemy, SQLModel. Suite test_controller_auto_permissions.py rescatada de 17 fails crónicos.

0.3.2

Agregado (Beanie)

  • BaseRepository.build_list_queryset — hook FindMany equivalente al de SQLAlchemy. Default delega a build_filter_query. Override en repo o servicio para customizar filtros/proyección antes de paginar.
  • BaseRepository.build_list_pipeline — hook aggregation pipeline para componer subqueries ($lookup, $project, $group). Default emite $match + $sort (con auto-$lookup para nested ordering).
  • BaseRepository.paginate_pipeline(pipeline, page, count, validate) — ejecuta pipeline arbitrario envuelto en $facet (data + total en una sola query). validate=False cuando el $project aplana columnas joined.
  • BaseService.use_aggregation: bool + aggregation_validate: bool. Forza ruta de pipeline sin depender de nested ordering.
  • BaseService.build_list_queryset / build_list_pipeline — hooks delegando al repo, override-ables a nivel servicio.

Patrón de uso (subquery cross-collection)

class AdminUserService(BaseService):
    repository: UserRepository
    use_aggregation = True
    aggregation_validate = False

    def build_list_pipeline(self, search=None, search_fields=None,
                            filters=None, order_by=None, **kwargs):
        pipeline = self.repository.build_list_pipeline(
            search=search, search_fields=search_fields,
            filters=filters, order_by=order_by or "-created_at",
        )
        pipeline.extend([
            {"$lookup": {"from": "wallets", "localField": "_id",
                         "foreignField": "user.$id", "as": "wallet_data"}},
            {"$unwind": {"path": "$wallet_data",
                         "preserveNullAndEmptyArrays": True}},
            {"$project": {
                "id": {"$toString": "$_id"},
                "wallet_balance": {"$convert": {
                    "input": "$wallet_data.balance",
                    "to": "string", "onNull": None,
                }},
            }},
        ])
        return pipeline

Controlador solo expone await super().list() — composición vive en el pipeline declarativo del servicio.

Cambiado (Beanie)

  • BaseService.list ahora ramifica entre FindMany y aggregation pipeline según use_aggregation o nested ordering. Backward compatible.
  • BaseRepository.list_with_aggregation se conserva como wrapper que delega a build_list_pipeline + paginate_pipeline.

0.3.1

Agregado

  • Beanie filter alias <field>_id en BaseRepository.build_filter_query. Filtros tipo customer_id, user_id, tool_id se traducen automáticamente a Model.<field>.id == ObjectId(v) cuando el campo base es Link[X]. Ver Filtering > Beanie Link alias.
  • Coerción automática strObjectId para queries contra Link.id. El front puede mandar el id crudo del query string sin cast.

Corregido

  • Import roto from bson import ObjectId, Linkfrom beanie import Link (Link no existe en bson; vive en beanie.odm.fields.Link). En 0.3.0 el import explotaba al cargar BaseRepository aislado.

Cambiado

  • Mínimos de deps: pydantic>=2.13, pyjwt>=2.12.1, extras [beanie] ahora pide beanie>=2.0,<3 (sin motor), extras [sqlalchemy] ahora pide SQLAlchemy[asyncio]>=2.0.30,<3.

0.3.0

Agregado

  • basekit init — scaffolder cookiecutter con multi-ORM (sqlalchemy/beanie), multi-DB (postgres/mariadb/sqlite/mongodb), opcional redis/s3/arq, license picker. Genera proyecto completo: app/, alembic/, docker-compose.yml, Dockerfile, Makefile, .env.example, tests scaffold. pip install fastapi-basekit[init].
  • Sitio docs MkDocs Material versionado con mike (aliases latest, X.Y, dev). Auto-deploy a GitHub Pages.
  • Workflows GitHub Actions: publish.yml (tag v* → PyPI OIDC + docs versionadas) y docs.yml (push main → preview en dev alias).
  • scripts/release.py + Makefile — comando único make release V=X.Y.Z bumpea pyproject + plugin.json + marketplace.json + CHANGELOG, commit + tag + push. Modos: --bump patch|minor|major, --dry-run, --pypi-only, --docs-only.
  • Skill fastapi-basekit-crud v2 con secciones nuevas (§22-28): BaseService policy, alembic render_item, JWTService API real, get_db lean.
  • RELEASING.md doc interna de mantenimiento.

Corregido

  • BasePaginationResponse[Schema] (era [List[Schema]] doble-anidado, rompía 8 errores per row).
  • Mermaid runtime en docs (Material 9.7+ no auto-bootstrap).
  • Alembic render_item para tipos custom (GUID y LowercaseEnum).

Cambiado

  • get_db lean — solo session lifecycle. Translation de errores en handlers.
  • self.action automático en controllers/services. Skill: nunca asignar manual.
  • mkdocs.yml con pymdownx.emoji, palette teal/deep-orange, font Inter + JetBrains Mono.

Empaquetado

  • Optional extras nuevos: [init] (cookiecutter), [docs] (mkdocs-material).
  • [project.scripts]: basekit = "fastapi_basekit.cli:main".

0.2.1

  • Plugin Claude Code estable.
  • Skill expandida con real-world fixes.

0.2.0

  • Soporte SQLModel ORM (fastapi_basekit.aio.sqlmodel).
  • BaseRepository / BaseService / SQLModelBaseController.

0.1.x

  • Versiones iniciales con SQLAlchemy + Beanie.
  • BaseRepository, BaseService, BaseController genérico.
  • Sistema de permisos basado en clases.
  • Paginación, búsqueda multi-campo, extracción automática de parámetros.