cello-framework 1.2.2__tar.gz → 1.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cello_framework-1.2.2 → cello_framework-1.2.4}/CLAUDE.md +3 -1
- {cello_framework-1.2.2 → cello_framework-1.2.4}/Cargo.lock +1 -1
- {cello_framework-1.2.2 → cello_framework-1.2.4}/Cargo.toml +1 -1
- {cello_framework-1.2.2 → cello_framework-1.2.4}/PKG-INFO +1 -1
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/core/async.md +1 -2
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/core/blueprints.md +1 -2
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/middleware/overview.md +1 -2
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/security/overview.md +1 -1
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/index.md +9 -10
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/overrides/main.html +2 -2
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/api/app.md +2 -2
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/index.md +4 -5
- cello_framework-1.2.4/docs/releases/index.md +303 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.5.0.md +12 -8
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.6.0.md +10 -23
- cello_framework-1.2.4/docs/releases/v1.2.3.md +121 -0
- cello_framework-1.2.4/docs/releases/v1.2.4.md +107 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/mkdocs.yml +2 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/pyproject.toml +1 -1
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/__init__.py +97 -1
- cello_framework-1.2.4/python/cello/middleware.py +166 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/handler.rs +24 -12
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/lib.rs +91 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/test_cello.py +3 -3
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/test_minijinja.py +1 -1
- cello_framework-1.2.4/tests/verify_async_client.py +250 -0
- cello_framework-1.2.2/docs/releases/index.md +0 -241
- {cello_framework-1.2.2 → cello_framework-1.2.4}/.github/workflows/ci.yml +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/.github/workflows/docs.yml +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/.github/workflows/publish.yml +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/.gitignore +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/CONTRIBUTING.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/ENTERPRISE_ROADMAP.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/LICENSE +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/PUBLISHING.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/README.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/README.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/benchmark.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/README.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/apps/__init__.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/apps/blacksheep_app.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/apps/cello_app.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/apps/fastapi_app.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/apps/robyn_app.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/requirements.txt +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/compare/run_benchmarks.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/benchmarks/quick_bench.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/cello.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/community/code-of-conduct.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/community/contributing.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/community/index.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/community/support.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/deployment/docker.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/deployment/kubernetes.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/deployment/service-mesh.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/index.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/integration/database.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/integration/graphql.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/integration/grpc.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/integration/message-queues.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/observability/health-checks.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/observability/metrics.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/observability/opentelemetry.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/observability/tracing.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/enterprise/roadmap.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/advanced/background-tasks.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/advanced/file-storage.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/advanced/fullstack.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/advanced/graphql.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/advanced/microservices.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/advanced/realtime-dashboard.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/advanced/redis-caching.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/basic/database.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/basic/forms.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/basic/hello-world.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/basic/jwt-auth.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/basic/query-params.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/basic/rest-api.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/enterprise/api-gateway.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/enterprise/event-sourcing.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/enterprise/health-checks.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/enterprise/multi-tenant.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/enterprise/oauth2.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/enterprise/rate-limiting.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/index.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/adaptive-rate-limiting.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/advanced-middleware.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/advanced-patterns.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/all-features.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/api-protocols.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/async-handlers.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/auto-openapi.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/blueprints-advanced.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/circuit-breaker.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/cluster-demo.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/complete-showcase.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/comprehensive-demo.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/database-demo.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/dto-validation.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/enterprise-config.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/guards.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/hello-world.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/lifecycle-hooks.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/middleware-demo.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/minijinja-advanced.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/minijinja-basic.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/minijinja-blog.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/minijinja-emails.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/minijinja-forms.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/minijinja-macros.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/security.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/simple-api.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/smart-caching.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/examples/real/streaming-sse.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/advanced/background-tasks.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/advanced/dependency-injection.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/advanced/dto-validation.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/advanced/file-uploads.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/advanced/static-files.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/advanced/templates.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/core/requests.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/core/responses.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/core/routing.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/index.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/middleware/caching.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/middleware/circuit-breaker.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/middleware/compression.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/middleware/cors.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/middleware/logging.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/middleware/rate-limiting.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/minijinja-templates.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/realtime/sse.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/realtime/websocket.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/security/authentication.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/security/csrf.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/security/guards.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/security/headers.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/security/jwt.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/security/sessions.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/features/templates.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/getting-started/configuration.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/getting-started/first-app.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/getting-started/index.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/getting-started/installation.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/getting-started/project-structure.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/getting-started/quickstart.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/includes/abbreviations.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/javascripts/extra.js +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/guides/best-practices.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/guides/deployment.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/guides/error-handling.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/guides/performance.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/guides/testing.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/index.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/patterns/cqrs.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/patterns/event-driven.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/patterns/repository.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/patterns/service-layer.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/tutorials/auth-system.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/tutorials/chat-app.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/tutorials/microservices.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/learn/tutorials/rest-api.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/logo-full.png +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/logo-icon.svg +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/logo.jpg +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/logo.svg +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/api/blueprint.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/api/context.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/api/guards.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/api/middleware.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/api/request.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/api/response.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/cli.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/config/middleware.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/config/security.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/config/server.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/reference/errors.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/changelog.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/migration.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.10.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.3.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.4.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.7.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.8.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v0.9.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v1.0.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v1.0.1.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v1.1.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v1.2.0.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v1.2.1.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/releases/v1.2.2.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/requirements.txt +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/stylesheets/extra.css +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/docs/tags.md +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/adaptive_rate_limit.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/advanced.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/advanced_middleware.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/advanced_patterns_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/all_features_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/api_protocols_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/async_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/auto_openapi_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/circuit_breaker.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/cluster_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/complete_showcase.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/comprehensive_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/database_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/dto_validation.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/enterprise.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/guards.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/hello.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/lifecycle_hooks.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/middleware_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/minijinja_advanced.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/minijinja_basic.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/minijinja_blog.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/minijinja_emails.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/minijinja_forms.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/minijinja_macros.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/security.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/simple_api.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/smart_caching.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/examples/streaming_demo.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/cqrs.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/database.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/eventsourcing.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/graphql.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/grpc.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/guards.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/messaging.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/saga.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/python/cello/validation.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/arena.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/background.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/blueprint.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/context.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/dependency.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/dto.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/error.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/http_client.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/json.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/lifecycle.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/auth.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/body_limit.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/cache.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/circuit_breaker.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/cors.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/cqrs.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/csrf.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/database.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/etag.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/eventsourcing.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/exception_handler.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/graphql.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/grpc.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/guards.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/health.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/messaging.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/mod.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/prometheus.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/rate_limit.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/redis.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/request_id.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/saga.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/security.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/session.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/static_files.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/middleware/telemetry.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/minijinja_engine.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/multipart.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/openapi.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/request/mod.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/request/multipart_streaming.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/request/parsing.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/response/mod.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/response/streaming.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/response/xml.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/router.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/routing/constraints.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/routing/mod.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/server/cluster.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/server/mod.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/server/protocols.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/sse.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/template.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/timeout.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/src/websocket.rs +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/verify_adaptive.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/verify_caching.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/verify_circuit_breaker.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/verify_dto.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/verify_guards_impl.py +0 -0
- {cello_framework-1.2.2 → cello_framework-1.2.4}/tests/verify_lifecycle.py +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Cello** is an ultra-fast, Rust-powered Python async web framework designed to achieve C-level performance on the hot path while maintaining Python's developer experience. It's the successor to frameworks like FastAPI, Robyn, and Litestar, combining their best features with pure Rust implementation for maximum performance.
|
|
6
6
|
|
|
7
|
-
**Version:** 1.2.
|
|
7
|
+
**Version:** 1.2.4
|
|
8
8
|
**License:** MIT
|
|
9
9
|
**Python Requirement:** 3.12+
|
|
10
10
|
**Author:** Jagadeesh Katla
|
|
@@ -346,6 +346,8 @@ def handle_value_error(request, exc):
|
|
|
346
346
|
|
|
347
347
|
## Version History
|
|
348
348
|
|
|
349
|
+
- **v1.2.4**: Critical fix — async handlers broken since v1.2.1; `pyo3_asyncio::tokio::into_future` failed silently after server startup switched to `py.allow_threads + block_on` (v1.2.1), causing all `async def` handlers to return 500; fixed by driving coroutines via `tokio::task::spawn_blocking + asyncio.run()` (`handler.rs`)
|
|
350
|
+
- **v1.2.3**: Full middleware Python API — `cello.middleware` module with `JwtAuth`, `BasicAuth`, `ApiKeyAuth`, `CsrfConfig`, `AdaptiveRateLimitConfig`; `app.use()` dispatcher; 6 new `enable_*` methods on App (`enable_jwt`, `enable_session`, `enable_security_headers`, `enable_csrf`, `enable_basic_auth`, `enable_api_key`); all docs import paths corrected (`from cello import RoleGuard` not `cello.guards`)
|
|
349
351
|
- **v1.2.2**: Security & bug fixes — CSRF `HttpOnly` on double-submit cookie (critical, broke all AJAX CSRF); all middleware `skip_path` prefix bypass fixed via `path_matches_skip()` helper; `FixedWindowStore` window_start never updated after reset; unused `mut` cleaned in minijinja tests
|
|
350
352
|
- **v1.2.1**: Bug fixes — server port never bound (`pyo3_asyncio` replaced with native `py.allow_threads` + `tokio::block_on`); `ProblemDetails` was missing from Python module export; `And`/`Or` guards now accept both `*args` and list styles; CSRF `HttpOnly` removed from double-submit cookie (JS must read it); `FixedWindowStore` window_start never updated after reset; all middleware `skip_path` used raw `starts_with` allowing prefix bypass; doc corrections (`type_uri` not `type_url`)
|
|
351
353
|
- **v1.2.0**: Bug fixes (shutdown coroutine never awaited, KeyboardInterrupt in shutdown handler, `request.redis` AttributeError); Redis Lua scripting (`eval`, `evalsha`, `script_load`); Rust-native `AsyncClient` backed by `reqwest + Tokio` — GIL never held during HTTP I/O, HTTP/2, gzip, rustls
|
|
@@ -254,8 +254,7 @@ All Python-side decorators and wrappers in Cello automatically detect whether a
|
|
|
254
254
|
| Pydantic validation | Yes | Validates the request body, then awaits the handler |
|
|
255
255
|
|
|
256
256
|
```python
|
|
257
|
-
from cello import App, cache
|
|
258
|
-
from cello.guards import RoleGuard
|
|
257
|
+
from cello import App, cache, RoleGuard
|
|
259
258
|
from pydantic import BaseModel
|
|
260
259
|
|
|
261
260
|
app = App()
|
|
@@ -183,8 +183,7 @@ app.register_blueprint(v2)
|
|
|
183
183
|
Apply middleware to all routes within a blueprint. Async handlers work seamlessly with blueprint-level middleware and per-route guards:
|
|
184
184
|
|
|
185
185
|
```python
|
|
186
|
-
from cello import App, Blueprint
|
|
187
|
-
from cello.guards import RoleGuard, Authenticated
|
|
186
|
+
from cello import App, Blueprint, RoleGuard, Authenticated
|
|
188
187
|
|
|
189
188
|
# Public blueprint -- no auth required
|
|
190
189
|
public_bp = Blueprint("/public")
|
|
@@ -172,8 +172,7 @@ app.use(ApiKeyAuth(keys={"key1": "service-a"}, header="X-API-Key"))
|
|
|
172
172
|
All Python-side middleware wrappers -- including the `@cache` decorator, guard wrappers, and Pydantic validation -- fully support async handlers. Each wrapper uses `inspect.iscoroutinefunction()` to detect async handlers at decoration time and generates the appropriate sync or async wrapper. This means you can freely use `async def` handlers with any combination of caching, guards, and validation without encountering unawaited coroutine issues.
|
|
173
173
|
|
|
174
174
|
```python
|
|
175
|
-
from cello import App, cache
|
|
176
|
-
from cello.guards import RoleGuard
|
|
175
|
+
from cello import App, cache, RoleGuard
|
|
177
176
|
from pydantic import BaseModel
|
|
178
177
|
|
|
179
178
|
class Item(BaseModel):
|
|
@@ -261,7 +261,7 @@ app.use(api_auth)
|
|
|
261
261
|
Control access with composable guards:
|
|
262
262
|
|
|
263
263
|
```python
|
|
264
|
-
from cello
|
|
264
|
+
from cello import RoleGuard, PermissionGuard, And, Or
|
|
265
265
|
|
|
266
266
|
# Simple role check
|
|
267
267
|
admin_only = RoleGuard(["admin"])
|
|
@@ -37,7 +37,7 @@ hide:
|
|
|
37
37
|
[:material-package-variant: PyPI](https://pypi.org/project/cello-framework/){ .md-button }
|
|
38
38
|
|
|
39
39
|
<div class="hero-badges">
|
|
40
|
-
<code class="badge-version">v1.2.
|
|
40
|
+
<code class="badge-version">v1.2.4</code>
|
|
41
41
|
<code class="badge-tests">441 tests passing</code>
|
|
42
42
|
<code class="badge-license">MIT License</code>
|
|
43
43
|
<code class="badge-python">Python 3.12+</code>
|
|
@@ -178,8 +178,7 @@ hide:
|
|
|
178
178
|
=== ":material-api: REST API"
|
|
179
179
|
|
|
180
180
|
```python
|
|
181
|
-
from cello import App, Response, Blueprint
|
|
182
|
-
from cello.guards import RoleGuard
|
|
181
|
+
from cello import App, Response, Blueprint, RoleGuard
|
|
183
182
|
|
|
184
183
|
app = App()
|
|
185
184
|
api = Blueprint("api", url_prefix="/api/v1")
|
|
@@ -371,21 +370,21 @@ How Cello stacks up against popular Python web frameworks (4 workers, 5 processe
|
|
|
371
370
|
|
|
372
371
|
<!-- ===== WHAT'S NEW ===== -->
|
|
373
372
|
|
|
374
|
-
## :material-creation: What's New in v1.2.
|
|
373
|
+
## :material-creation: What's New in v1.2.4
|
|
375
374
|
|
|
376
375
|
<div class="whats-new-box" markdown>
|
|
377
376
|
|
|
378
|
-
!!! tip "v1.2.
|
|
377
|
+
!!! tip "v1.2.4 — Critical Fix: async def Handlers Now Work Correctly"
|
|
379
378
|
|
|
380
|
-
Cello v1.2.
|
|
379
|
+
Cello v1.2.4 fixes a critical regression introduced in v1.2.1 where all `async def` route handlers silently returned 500 errors.
|
|
381
380
|
|
|
382
|
-
- :material-bug-check: **
|
|
381
|
+
- :material-bug-check: **Async handlers fixed** — `async def` handlers now execute correctly; `pyo3_asyncio::tokio::into_future` was failing silently after the v1.2.1 server startup change.
|
|
383
382
|
|
|
384
|
-
- :material-language-rust:
|
|
383
|
+
- :material-language-rust: **`spawn_blocking + asyncio.run()`** — coroutines are now driven via Tokio's blocking thread pool, releasing the main Tokio thread during Python I/O waits.
|
|
385
384
|
|
|
386
|
-
- :material-
|
|
385
|
+
- :material-test-tube: **New async client test suite** — `tests/verify_async_client.py` covers all HTTP methods with a self-contained local echo server.
|
|
387
386
|
|
|
388
|
-
[:material-tag: Full Release Notes](releases/v1.2.
|
|
387
|
+
[:material-tag: Full Release Notes](releases/v1.2.4.md){ .md-button .md-button--primary }
|
|
389
388
|
[:material-book-open-variant: Migration Guide](releases/migration.md){ .md-button }
|
|
390
389
|
|
|
391
390
|
</div>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
{% block announce %}
|
|
4
4
|
<span class="cello-announce">
|
|
5
|
-
Cello v1.2.
|
|
5
|
+
Cello v1.2.4 — Critical fix: async handlers now work correctly
|
|
6
6
|
<a href="{{ base_url }}/releases/" class="cello-announce-link">
|
|
7
7
|
Release notes →
|
|
8
8
|
</a>
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"operatingSystem": "Linux, macOS, Windows",
|
|
38
38
|
"programmingLanguage": ["Python", "Rust"],
|
|
39
39
|
"license": "https://opensource.org/licenses/MIT",
|
|
40
|
-
"softwareVersion": "1.2.
|
|
40
|
+
"softwareVersion": "1.2.4",
|
|
41
41
|
"author": {
|
|
42
42
|
"@type": "Person",
|
|
43
43
|
"name": "Jagadeesh Katla",
|
|
@@ -728,9 +728,9 @@ Add a global guard to all routes.
|
|
|
728
728
|
> *Since v0.5.0*
|
|
729
729
|
|
|
730
730
|
```python
|
|
731
|
-
from cello
|
|
731
|
+
from cello import Authenticated
|
|
732
732
|
|
|
733
|
-
app.add_guard(
|
|
733
|
+
app.add_guard(Authenticated())
|
|
734
734
|
```
|
|
735
735
|
|
|
736
736
|
| Parameter | Type | Description |
|
|
@@ -78,7 +78,7 @@ The building blocks of every Cello application -- from creating your app to hand
|
|
|
78
78
|
|
|
79
79
|
Role-based and permission-based access control. Composable guards that protect routes and blueprints.
|
|
80
80
|
|
|
81
|
-
**Key classes:** `RoleGuard` `PermissionGuard` `
|
|
81
|
+
**Key classes:** `RoleGuard` `PermissionGuard` `Authenticated` `And` `Or` `Not`
|
|
82
82
|
|
|
83
83
|
[:octicons-arrow-right-24: Guards Reference](api/guards.md)
|
|
84
84
|
|
|
@@ -166,8 +166,8 @@ The most commonly used classes and functions at a glance.
|
|
|
166
166
|
| [`Response`](api/response.md) | `cello` | HTTP response builder |
|
|
167
167
|
| [`Blueprint`](api/blueprint.md) | `cello` | Route grouping |
|
|
168
168
|
| [`Depends`](api/context.md) | `cello` | Dependency injection marker |
|
|
169
|
-
| [`RoleGuard`](api/guards.md) | `cello
|
|
170
|
-
| [`PermissionGuard`](api/guards.md) | `cello
|
|
169
|
+
| [`RoleGuard`](api/guards.md) | `cello` | Role-based access guard |
|
|
170
|
+
| [`PermissionGuard`](api/guards.md) | `cello` | Permission-based access guard |
|
|
171
171
|
| [`JwtConfig`](config/security.md) | `cello.middleware` | JWT authentication config |
|
|
172
172
|
| [`RateLimitConfig`](config/middleware.md) | `cello.middleware` | Rate limiting config |
|
|
173
173
|
| [`SessionConfig`](config/security.md) | `cello.middleware` | Session management config |
|
|
@@ -219,8 +219,7 @@ The most commonly used classes and functions at a glance.
|
|
|
219
219
|
=== "Guards & Auth"
|
|
220
220
|
|
|
221
221
|
```python
|
|
222
|
-
from cello import App
|
|
223
|
-
from cello.guards import RoleGuard, PermissionGuard
|
|
222
|
+
from cello import App, RoleGuard, PermissionGuard
|
|
224
223
|
from cello.middleware import JwtConfig, JwtAuth
|
|
225
224
|
|
|
226
225
|
app = App()
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Release Notes
|
|
3
|
+
description: Version history, changelogs, and migration guides for every Cello Framework release
|
|
4
|
+
icon: material/tag-multiple
|
|
5
|
+
tags:
|
|
6
|
+
- Release Notes
|
|
7
|
+
- Changelog
|
|
8
|
+
- v1.2.4
|
|
9
|
+
- Migration
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# :material-tag-multiple: Release Notes
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## :material-new-box: Latest Release — v1.2.4
|
|
17
|
+
|
|
18
|
+
!!! success "Cello v1.2.4 — Critical Fix: async def Handlers (June 2026)"
|
|
19
|
+
|
|
20
|
+
Fixes a critical regression introduced in v1.2.1 where all `async def` route handlers silently returned 500 errors due to `pyo3_asyncio` not being initialised after the server startup change.
|
|
21
|
+
|
|
22
|
+
**Highlights:**
|
|
23
|
+
|
|
24
|
+
- :material-bug-check: **All `async def` handlers now work** — coroutines are driven via `tokio::task::spawn_blocking + asyncio.run()`
|
|
25
|
+
- :material-test-tube: **New test suite** — `tests/verify_async_client.py` covers all HTTP methods with a local echo server
|
|
26
|
+
- :material-arrow-up: **Drop-in upgrade** from v1.2.3 — no API changes
|
|
27
|
+
|
|
28
|
+
[:octicons-arrow-right-24: Full v1.2.4 Release Notes](v1.2.4.md){ .md-button .md-button--primary }
|
|
29
|
+
[:octicons-arrow-right-24: Migration Guide](migration.md){ .md-button }
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## :material-timeline: Version Timeline
|
|
34
|
+
|
|
35
|
+
```mermaid
|
|
36
|
+
timeline
|
|
37
|
+
title Cello Framework Releases
|
|
38
|
+
2026-06 : v1.2.4 - Critical Fix: async def Handlers
|
|
39
|
+
: v1.2.3 - Full Middleware Python API & Docs Fixes
|
|
40
|
+
: v1.2.2 - Security & Bug Fixes (CSRF, skip_path, rate limiter)
|
|
41
|
+
: v1.2.1 - Critical Bug Fixes (server bind, ProblemDetails export)
|
|
42
|
+
: v1.2.0 - Redis Lua Scripting & Rust-Native AsyncClient
|
|
43
|
+
: v1.1.0 - MiniJinja Jinja2-Compatible Templates
|
|
44
|
+
2026-02 : v1.0.1 - Cross-Platform & Compatibility Patch
|
|
45
|
+
: v1.0.0 - Production Ready (Stable)
|
|
46
|
+
: v0.10.0 - Event Sourcing, CQRS, Saga
|
|
47
|
+
: v0.9.0 - GraphQL, gRPC, Message Queues
|
|
48
|
+
: v0.8.0 - Database Pooling, Redis, Transactions
|
|
49
|
+
2026-01 : v0.7.0 - OpenTelemetry, Health Checks
|
|
50
|
+
2025-12 : v0.6.0 - Smart Caching, Adaptive Rate Limiting
|
|
51
|
+
2025-10 : v0.5.0 - DI, Guards (RBAC), Prometheus
|
|
52
|
+
2025-08 : v0.4.0 - JWT, Sessions, Cluster Mode
|
|
53
|
+
2025-06 : v0.3.0 - WebSocket, SSE, Blueprints
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## :material-history: All Releases
|
|
59
|
+
|
|
60
|
+
<div class="grid cards" markdown>
|
|
61
|
+
|
|
62
|
+
- :material-bug-check:{ .lg .middle } **v1.2.4** — Critical Async Fix
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
Fixes all `async def` handlers returning 500 since v1.2.1. Coroutines now driven via `spawn_blocking + asyncio.run()`.
|
|
67
|
+
|
|
68
|
+
:material-calendar: June 2026
|
|
69
|
+
|
|
70
|
+
[:octicons-arrow-right-24: Release Notes](v1.2.4.md)
|
|
71
|
+
|
|
72
|
+
- :material-api:{ .lg .middle } **v1.2.3** — Full Middleware Python API
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
`cello.middleware` module, `app.use()` dispatcher, 6 new `enable_*` methods, all doc import paths corrected.
|
|
77
|
+
|
|
78
|
+
:material-calendar: June 2026
|
|
79
|
+
|
|
80
|
+
[:octicons-arrow-right-24: Release Notes](v1.2.3.md)
|
|
81
|
+
|
|
82
|
+
- :material-shield-bug:{ .lg .middle } **v1.2.2** — Security & Bug Fixes
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
Critical CSRF `HttpOnly` fix (broke all AJAX apps), auth `skip_path` prefix bypass fix, rate limiter fixed-window reset bug.
|
|
87
|
+
|
|
88
|
+
:material-calendar: June 2026
|
|
89
|
+
|
|
90
|
+
[:octicons-arrow-right-24: Release Notes](v1.2.2.md)
|
|
91
|
+
|
|
92
|
+
- :material-bug-check:{ .lg .middle } **v1.2.1** — Critical Bug Fixes
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
Server port never bound, `ProblemDetails` missing from Python export, `And`/`Or` guard `*args` style, `HttpOnly` removed from CSRF cookie.
|
|
97
|
+
|
|
98
|
+
:material-calendar: June 2026
|
|
99
|
+
|
|
100
|
+
[:octicons-arrow-right-24: Release Notes](v1.2.1.md)
|
|
101
|
+
|
|
102
|
+
- :material-database-sync:{ .lg .middle } **v1.2.0** — Redis Lua & AsyncClient
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
Redis Lua scripting (`eval`, `evalsha`, `script_load`), Rust-native `AsyncClient` backed by `reqwest + Tokio` — GIL never held during HTTP I/O.
|
|
107
|
+
|
|
108
|
+
:material-calendar: June 2026
|
|
109
|
+
|
|
110
|
+
[:octicons-arrow-right-24: Release Notes](v1.2.0.md)
|
|
111
|
+
|
|
112
|
+
- :material-file-code:{ .lg .middle } **v1.1.0** — MiniJinja Templates
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
Jinja2-compatible template engine via `minijinja` Rust crate. `app.enable_templates()`, `app.render()`, globals, auto HTML-escaping.
|
|
117
|
+
|
|
118
|
+
:material-calendar: June 2026
|
|
119
|
+
|
|
120
|
+
[:octicons-arrow-right-24: Release Notes](v1.1.0.md)
|
|
121
|
+
|
|
122
|
+
- :material-wrench:{ .lg .middle } **v1.0.1** — Cross-Platform & Compatibility Patch
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
Windows multi-worker subprocess mode, ARM JSON fallback, async guard/cache/blueprint compatibility, export completeness.
|
|
127
|
+
|
|
128
|
+
:material-calendar: February 2026
|
|
129
|
+
|
|
130
|
+
[:octicons-arrow-right-24: Release Notes](v1.0.1.md)
|
|
131
|
+
|
|
132
|
+
- :material-check-decagram:{ .lg .middle } **v1.0.0** — Production Ready
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
Stable release with performance optimizations, API stability guarantees, and the complete feature set.
|
|
137
|
+
|
|
138
|
+
:material-calendar: February 2026
|
|
139
|
+
|
|
140
|
+
[:octicons-arrow-right-24: Release Notes](v1.0.0.md)
|
|
141
|
+
|
|
142
|
+
- :material-star-shooting:{ .lg .middle } **v0.10.0** — Advanced Patterns
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
Event Sourcing, CQRS, and the Saga Pattern for distributed transaction coordination.
|
|
147
|
+
|
|
148
|
+
:material-calendar: February 2026
|
|
149
|
+
|
|
150
|
+
[:octicons-arrow-right-24: Release Notes](v0.10.0.md)
|
|
151
|
+
|
|
152
|
+
- :material-api:{ .lg .middle } **v0.9.0** — API Protocols
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
GraphQL support, gRPC integration, and message queue adapters for Kafka and RabbitMQ.
|
|
157
|
+
|
|
158
|
+
:material-calendar: February 2026
|
|
159
|
+
|
|
160
|
+
[:octicons-arrow-right-24: Release Notes](v0.9.0.md)
|
|
161
|
+
|
|
162
|
+
- :material-database:{ .lg .middle } **v0.8.0** — Data Layer
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
Database connection pooling, Redis integration, and transaction support with automatic rollback.
|
|
167
|
+
|
|
168
|
+
:material-calendar: February 2026
|
|
169
|
+
|
|
170
|
+
[:octicons-arrow-right-24: Release Notes](v0.8.0.md)
|
|
171
|
+
|
|
172
|
+
- :material-eye:{ .lg .middle } **v0.7.0** — Enterprise Observability
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
OpenTelemetry distributed tracing, structured health check endpoints, and GraphQL support.
|
|
177
|
+
|
|
178
|
+
:material-calendar: January 2026
|
|
179
|
+
|
|
180
|
+
[:octicons-arrow-right-24: Release Notes](v0.7.0.md)
|
|
181
|
+
|
|
182
|
+
- :material-speedometer:{ .lg .middle } **v0.6.0** — Smart Middleware
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
Intelligent caching with TTL, adaptive rate limiting based on system load, DTO validation, and circuit breaker.
|
|
187
|
+
|
|
188
|
+
:material-calendar: December 2025
|
|
189
|
+
|
|
190
|
+
[:octicons-arrow-right-24: Release Notes](v0.6.0.md)
|
|
191
|
+
|
|
192
|
+
- :material-shield-check:{ .lg .middle } **v0.5.0** — Security & DI
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
Dependency injection, composable RBAC guards, Prometheus metrics, and OpenAPI generation.
|
|
197
|
+
|
|
198
|
+
:material-calendar: October 2025
|
|
199
|
+
|
|
200
|
+
[:octicons-arrow-right-24: Release Notes](v0.5.0.md)
|
|
201
|
+
|
|
202
|
+
- :material-lock:{ .lg .middle } **v0.4.0** — Auth & Sessions
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
JWT authentication, token-bucket rate limiting, secure cookie sessions, security headers, and cluster mode.
|
|
207
|
+
|
|
208
|
+
:material-calendar: August 2025
|
|
209
|
+
|
|
210
|
+
[:octicons-arrow-right-24: Release Notes](v0.4.0.md)
|
|
211
|
+
|
|
212
|
+
- :material-access-point:{ .lg .middle } **v0.3.0** — Real-time
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
WebSocket support, Server-Sent Events, multipart form handling, and Flask-inspired blueprints.
|
|
217
|
+
|
|
218
|
+
:material-calendar: June 2025
|
|
219
|
+
|
|
220
|
+
[:octicons-arrow-right-24: Release Notes](v0.3.0.md)
|
|
221
|
+
|
|
222
|
+
</div>
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## :material-shield-half-full: Support Policy
|
|
227
|
+
|
|
228
|
+
| Version | Status | Support Until |
|
|
229
|
+
|:--------|:-------|:--------------|
|
|
230
|
+
| **1.2.x** | :material-check-circle:{ style="color: #4caf50" } **Active** | Current |
|
|
231
|
+
| 1.1.x | :material-wrench:{ style="color: #ffab40" } Maintenance | December 2026 |
|
|
232
|
+
| 1.0.x | :material-wrench:{ style="color: #ffab40" } Maintenance | October 2026 |
|
|
233
|
+
| 0.10.x | :material-shield-alert:{ style="color: #ff9800" } Security Only | August 2026 |
|
|
234
|
+
| < 0.10 | :material-close-circle:{ style="color: #f44336" } End of Life | — |
|
|
235
|
+
|
|
236
|
+
!!! info "Version policy"
|
|
237
|
+
|
|
238
|
+
Cello follows [Semantic Versioning](https://semver.org/). Starting with **v1.0.0**, the public API is stable — no breaking changes until v2.0. **Maintenance** releases receive bug fixes. **Security Only** releases receive critical security patches only.
|
|
239
|
+
|
|
240
|
+
---
|
|
241
|
+
|
|
242
|
+
## :material-arrow-up-bold-circle: Upgrading
|
|
243
|
+
|
|
244
|
+
=== "pip"
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# Upgrade to the latest stable release
|
|
248
|
+
pip install --upgrade cello-framework
|
|
249
|
+
|
|
250
|
+
# Pin to a specific version
|
|
251
|
+
pip install cello-framework==1.2.4
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
=== "requirements.txt"
|
|
255
|
+
|
|
256
|
+
```text
|
|
257
|
+
cello-framework>=1.2.4,<2.0.0
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
=== "pyproject.toml"
|
|
261
|
+
|
|
262
|
+
```toml
|
|
263
|
+
[project]
|
|
264
|
+
dependencies = [
|
|
265
|
+
"cello-framework>=1.2.4,<2.0.0",
|
|
266
|
+
]
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
!!! warning "Read the migration guide before upgrading"
|
|
270
|
+
|
|
271
|
+
Breaking changes are documented in the [Migration Guide](migration.md). Always review it before bumping a minor version.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## :material-file-document-multiple: Additional Resources
|
|
276
|
+
|
|
277
|
+
<div class="grid cards" markdown>
|
|
278
|
+
|
|
279
|
+
- :material-format-list-bulleted:{ .lg .middle } **Full Changelog**
|
|
280
|
+
|
|
281
|
+
---
|
|
282
|
+
|
|
283
|
+
Every commit, bug fix, and improvement in one place.
|
|
284
|
+
|
|
285
|
+
[:octicons-arrow-right-24: Changelog](changelog.md)
|
|
286
|
+
|
|
287
|
+
- :material-directions-fork:{ .lg .middle } **Migration Guide**
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
Step-by-step instructions for upgrading between versions.
|
|
292
|
+
|
|
293
|
+
[:octicons-arrow-right-24: Migration Guide](migration.md)
|
|
294
|
+
|
|
295
|
+
</div>
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## :material-bell-ring: Stay Updated
|
|
300
|
+
|
|
301
|
+
- :material-star: [Star the repo on GitHub](https://github.com/jagadeesh32/cello) to show support and get notified
|
|
302
|
+
- :material-rss: [Releases RSS Feed](https://github.com/jagadeesh32/cello/releases.atom) for automated notifications
|
|
303
|
+
- :fontawesome-brands-discord: [Join Discord](https://discord.gg/cello) for release announcements and discussion
|
|
@@ -65,14 +65,18 @@ def profile(request, user=Depends(get_current_user)):
|
|
|
65
65
|
|
|
66
66
|
Composable access control guards that run before the handler. Guards inspect the request context and either allow or deny access.
|
|
67
67
|
|
|
68
|
+
!!! note "API names updated in v1.x"
|
|
69
|
+
`RoleGuard`, `PermissionGuard`, `AuthenticatedGuard`, `AndGuard`, `OrGuard`, `NotGuard` were the original v0.5.0 names.
|
|
70
|
+
Current names: `RoleGuard` → still `RoleGuard` (from `cello`), `PermissionGuard` → still `PermissionGuard` (from `cello`),
|
|
71
|
+
`AuthenticatedGuard` → `Authenticated`, `AndGuard` → `And`, `OrGuard` → `Or`, `NotGuard` → `Not`.
|
|
72
|
+
|
|
68
73
|
```python
|
|
69
|
-
from cello import App
|
|
70
|
-
from cello.guards import RoleGuard, PermissionGuard, AuthenticatedGuard
|
|
74
|
+
from cello import App, RoleGuard, PermissionGuard, Authenticated
|
|
71
75
|
|
|
72
76
|
app = App()
|
|
73
77
|
|
|
74
78
|
# Require authentication
|
|
75
|
-
@app.get("/dashboard", guards=[
|
|
79
|
+
@app.get("/dashboard", guards=[Authenticated()])
|
|
76
80
|
def dashboard(request):
|
|
77
81
|
return {"welcome": request.context.get("user_id")}
|
|
78
82
|
|
|
@@ -90,18 +94,18 @@ def delete_user(request):
|
|
|
90
94
|
**Composable logic with And, Or, Not:**
|
|
91
95
|
|
|
92
96
|
```python
|
|
93
|
-
from cello
|
|
97
|
+
from cello import And, Or, Not, RoleGuard, PermissionGuard, Authenticated
|
|
94
98
|
|
|
95
99
|
# Admin OR has special permission
|
|
96
|
-
flexible =
|
|
100
|
+
flexible = Or([
|
|
97
101
|
RoleGuard(["admin"]),
|
|
98
102
|
PermissionGuard(["elevated:access"]),
|
|
99
103
|
])
|
|
100
104
|
|
|
101
105
|
# Authenticated AND not banned
|
|
102
|
-
safe =
|
|
103
|
-
|
|
104
|
-
|
|
106
|
+
safe = And([
|
|
107
|
+
Authenticated(),
|
|
108
|
+
Not(RoleGuard(["banned"])),
|
|
105
109
|
])
|
|
106
110
|
|
|
107
111
|
@app.get("/resource", guards=[flexible])
|
|
@@ -56,17 +56,10 @@ def create_user(request):
|
|
|
56
56
|
Rate limits now adjust based on server health:
|
|
57
57
|
|
|
58
58
|
```python
|
|
59
|
-
from cello
|
|
60
|
-
|
|
61
|
-
config = AdaptiveRateLimitConfig(
|
|
62
|
-
base_requests=100,
|
|
63
|
-
window=60,
|
|
64
|
-
cpu_threshold=0.8, # Reduce limits at 80% CPU
|
|
65
|
-
memory_threshold=0.9, # Reduce limits at 90% memory
|
|
66
|
-
latency_threshold=100, # Reduce limits if latency > 100ms
|
|
67
|
-
min_requests=10 # Never go below 10 req/min
|
|
68
|
-
)
|
|
59
|
+
from cello import App, RateLimitConfig
|
|
69
60
|
|
|
61
|
+
# Adaptive rate limiting (adjusts based on server load)
|
|
62
|
+
config = RateLimitConfig.adaptive(capacity=100, refill_rate=10)
|
|
70
63
|
app.enable_rate_limit(config)
|
|
71
64
|
```
|
|
72
65
|
|
|
@@ -109,18 +102,15 @@ Invalid requests return RFC 7807 Problem Details:
|
|
|
109
102
|
Protect against cascading failures:
|
|
110
103
|
|
|
111
104
|
```python
|
|
112
|
-
from cello
|
|
105
|
+
from cello import App
|
|
113
106
|
|
|
114
|
-
|
|
115
|
-
failure_threshold=5,
|
|
116
|
-
|
|
117
|
-
|
|
107
|
+
app.enable_circuit_breaker(
|
|
108
|
+
failure_threshold=5, # Open after 5 failures
|
|
109
|
+
reset_timeout=30, # Try again after 30 seconds
|
|
110
|
+
half_open_target=3, # Allow 3 test requests in half-open state
|
|
118
111
|
)
|
|
119
112
|
|
|
120
|
-
circuit = CircuitBreaker(config)
|
|
121
|
-
|
|
122
113
|
@app.get("/external-api")
|
|
123
|
-
@circuit.protect
|
|
124
114
|
async def call_external(request):
|
|
125
115
|
return await external_service.fetch()
|
|
126
116
|
```
|
|
@@ -130,8 +120,7 @@ async def call_external(request):
|
|
|
130
120
|
Guards can now be applied at multiple levels:
|
|
131
121
|
|
|
132
122
|
```python
|
|
133
|
-
from cello import App, Blueprint
|
|
134
|
-
from cello.guards import RoleGuard, PermissionGuard
|
|
123
|
+
from cello import App, Blueprint, RoleGuard, PermissionGuard
|
|
135
124
|
|
|
136
125
|
# Controller-level guard
|
|
137
126
|
admin_bp = Blueprint("/admin", guards=[RoleGuard(["admin"])])
|
|
@@ -181,9 +170,7 @@ The cache middleware configuration has changed:
|
|
|
181
170
|
app.enable_cache(max_age=300)
|
|
182
171
|
|
|
183
172
|
# After (v0.6.0)
|
|
184
|
-
|
|
185
|
-
config = CacheConfig(default_ttl=300, max_size=1000)
|
|
186
|
-
app.enable_cache(config)
|
|
173
|
+
app.enable_caching(ttl=300)
|
|
187
174
|
```
|
|
188
175
|
|
|
189
176
|
### Rate Limit Response
|