Changelog
Ver el archivo raw en el repo: CHANGELOG.md
0.3.3 — current
Agregado
BaseController.prepare_action(action_name)— lifecycle hook que seteaself.actiony correcheck_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_classesestilo DRF + overrideget_permissions()para dispatch por acción.check_permissions_class()retro-compat alias.
Cambiado
format_responsepermisivo: si eldatano satisface el schema, devuelve el valor crudo en vez de levantarValidationError.
Tests
- 134 passing across Beanie, SQLAlchemy, SQLModel. Suite
test_controller_auto_permissions.pyrescatada de 17 fails crónicos.
0.3.2
Agregado (Beanie)
BaseRepository.build_list_queryset— hook FindMany equivalente al de SQLAlchemy. Default delega abuild_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-$lookuppara nested ordering).BaseRepository.paginate_pipeline(pipeline, page, count, validate)— ejecuta pipeline arbitrario envuelto en$facet(data + total en una sola query).validate=Falsecuando el$projectaplana 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.listahora ramifica entre FindMany y aggregation pipeline segúnuse_aggregationo nested ordering. Backward compatible.BaseRepository.list_with_aggregationse conserva como wrapper que delega abuild_list_pipeline+paginate_pipeline.
0.3.1
Agregado
- Beanie filter alias
<field>_idenBaseRepository.build_filter_query. Filtros tipocustomer_id,user_id,tool_idse traducen automáticamente aModel.<field>.id == ObjectId(v)cuando el campo base esLink[X]. Ver Filtering > Beanie Link alias. - Coerción automática
str→ObjectIdpara queries contraLink.id. El front puede mandar el id crudo del query string sin cast.
Corregido
- Import roto
from bson import ObjectId, Link→from beanie import Link(Linkno existe en bson; vive enbeanie.odm.fields.Link). En 0.3.0 el import explotaba al cargarBaseRepositoryaislado.
Cambiado
- Mínimos de deps:
pydantic>=2.13,pyjwt>=2.12.1, extras[beanie]ahora pidebeanie>=2.0,<3(sinmotor), extras[sqlalchemy]ahora pideSQLAlchemy[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(aliaseslatest,X.Y,dev). Auto-deploy a GitHub Pages. - Workflows GitHub Actions:
publish.yml(tagv*→ PyPI OIDC + docs versionadas) ydocs.yml(push main → preview endevalias). scripts/release.py+ Makefile — comando únicomake release V=X.Y.Zbumpea pyproject + plugin.json + marketplace.json + CHANGELOG, commit + tag + push. Modos:--bump patch|minor|major,--dry-run,--pypi-only,--docs-only.- Skill
fastapi-basekit-crudv2 con secciones nuevas (§22-28): BaseService policy, alembicrender_item, JWTService API real,get_dblean. RELEASING.mddoc 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_itempara tipos custom (GUIDyLowercaseEnum).
Cambiado
get_dblean — solo session lifecycle. Translation de errores en handlers.self.actionautomático en controllers/services. Skill: nunca asignar manual.mkdocs.ymlconpymdownx.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.