cello-framework 1.2.3__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.3 → cello_framework-1.2.4}/CLAUDE.md +2 -1
- {cello_framework-1.2.3 → cello_framework-1.2.4}/Cargo.lock +1 -1
- {cello_framework-1.2.3 → cello_framework-1.2.4}/Cargo.toml +1 -1
- {cello_framework-1.2.3 → cello_framework-1.2.4}/PKG-INFO +1 -1
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/index.md +8 -10
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/overrides/main.html +2 -2
- cello_framework-1.2.4/docs/releases/index.md +303 -0
- cello_framework-1.2.4/docs/releases/v1.2.4.md +107 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/mkdocs.yml +1 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/pyproject.toml +1 -1
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/__init__.py +1 -1
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/handler.rs +24 -12
- {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/test_cello.py +3 -3
- {cello_framework-1.2.3 → 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.3/docs/releases/index.md +0 -241
- {cello_framework-1.2.3 → cello_framework-1.2.4}/.github/workflows/ci.yml +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/.github/workflows/docs.yml +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/.github/workflows/publish.yml +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/.gitignore +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/CONTRIBUTING.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/ENTERPRISE_ROADMAP.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/LICENSE +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/PUBLISHING.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/README.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/README.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/benchmark.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/README.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/__init__.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/blacksheep_app.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/cello_app.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/fastapi_app.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/robyn_app.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/requirements.txt +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/run_benchmarks.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/quick_bench.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/cello.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/code-of-conduct.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/contributing.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/index.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/support.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/deployment/docker.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/deployment/kubernetes.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/deployment/service-mesh.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/index.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/database.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/graphql.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/grpc.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/message-queues.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/health-checks.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/metrics.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/opentelemetry.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/tracing.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/roadmap.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/background-tasks.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/file-storage.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/fullstack.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/graphql.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/microservices.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/realtime-dashboard.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/redis-caching.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/database.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/forms.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/hello-world.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/jwt-auth.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/query-params.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/rest-api.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/api-gateway.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/event-sourcing.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/health-checks.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/multi-tenant.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/oauth2.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/rate-limiting.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/index.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/adaptive-rate-limiting.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/advanced-middleware.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/advanced-patterns.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/all-features.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/api-protocols.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/async-handlers.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/auto-openapi.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/blueprints-advanced.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/circuit-breaker.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/cluster-demo.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/complete-showcase.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/comprehensive-demo.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/database-demo.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/dto-validation.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/enterprise-config.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/guards.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/hello-world.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/lifecycle-hooks.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/middleware-demo.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-advanced.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-basic.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-blog.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-emails.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-forms.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-macros.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/security.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/simple-api.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/smart-caching.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/streaming-sse.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/background-tasks.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/dependency-injection.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/dto-validation.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/file-uploads.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/static-files.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/templates.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/async.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/blueprints.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/requests.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/responses.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/routing.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/index.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/caching.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/circuit-breaker.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/compression.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/cors.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/logging.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/overview.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/rate-limiting.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/minijinja-templates.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/realtime/sse.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/realtime/websocket.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/authentication.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/csrf.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/guards.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/headers.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/jwt.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/overview.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/sessions.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/templates.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/configuration.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/first-app.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/index.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/installation.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/project-structure.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/quickstart.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/includes/abbreviations.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/javascripts/extra.js +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/best-practices.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/deployment.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/error-handling.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/performance.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/testing.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/index.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/cqrs.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/event-driven.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/repository.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/service-layer.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/auth-system.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/chat-app.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/microservices.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/rest-api.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo-full.png +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo-icon.svg +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo.jpg +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo.svg +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/app.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/blueprint.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/context.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/guards.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/middleware.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/request.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/response.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/cli.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/config/middleware.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/config/security.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/config/server.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/errors.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/index.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/changelog.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/migration.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.10.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.3.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.4.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.5.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.6.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.7.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.8.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.9.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.0.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.0.1.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.1.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.0.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.1.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.2.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.3.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/requirements.txt +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/stylesheets/extra.css +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/tags.md +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/adaptive_rate_limit.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/advanced.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/advanced_middleware.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/advanced_patterns_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/all_features_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/api_protocols_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/async_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/auto_openapi_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/circuit_breaker.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/cluster_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/complete_showcase.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/comprehensive_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/database_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/dto_validation.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/enterprise.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/guards.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/hello.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/lifecycle_hooks.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/middleware_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_advanced.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_basic.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_blog.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_emails.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_forms.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_macros.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/security.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/simple_api.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/smart_caching.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/streaming_demo.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/cqrs.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/database.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/eventsourcing.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/graphql.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/grpc.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/guards.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/messaging.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/middleware.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/saga.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/validation.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/arena.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/background.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/blueprint.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/context.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/dependency.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/dto.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/error.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/http_client.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/json.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/lib.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/lifecycle.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/auth.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/body_limit.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/cache.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/circuit_breaker.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/cors.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/cqrs.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/csrf.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/database.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/etag.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/eventsourcing.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/exception_handler.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/graphql.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/grpc.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/guards.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/health.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/messaging.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/mod.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/prometheus.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/rate_limit.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/redis.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/request_id.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/saga.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/security.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/session.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/static_files.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/telemetry.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/minijinja_engine.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/multipart.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/openapi.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/request/mod.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/request/multipart_streaming.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/request/parsing.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/response/mod.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/response/streaming.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/response/xml.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/router.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/routing/constraints.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/routing/mod.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/server/cluster.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/server/mod.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/server/protocols.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/sse.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/template.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/timeout.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/src/websocket.rs +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_adaptive.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_caching.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_circuit_breaker.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_dto.py +0 -0
- {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_guards_impl.py +0 -0
- {cello_framework-1.2.3 → 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,7 @@ 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`)
|
|
349
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`)
|
|
350
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
|
|
351
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`)
|
|
@@ -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>
|
|
@@ -370,23 +370,21 @@ How Cello stacks up against popular Python web frameworks (4 workers, 5 processe
|
|
|
370
370
|
|
|
371
371
|
<!-- ===== WHAT'S NEW ===== -->
|
|
372
372
|
|
|
373
|
-
## :material-creation: What's New in v1.2.
|
|
373
|
+
## :material-creation: What's New in v1.2.4
|
|
374
374
|
|
|
375
375
|
<div class="whats-new-box" markdown>
|
|
376
376
|
|
|
377
|
-
!!! tip "v1.2.
|
|
377
|
+
!!! tip "v1.2.4 — Critical Fix: async def Handlers Now Work Correctly"
|
|
378
378
|
|
|
379
|
-
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.
|
|
380
380
|
|
|
381
|
-
- :material-
|
|
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.
|
|
382
382
|
|
|
383
|
-
- :material-
|
|
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.
|
|
384
384
|
|
|
385
|
-
- :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.
|
|
386
386
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
[:material-tag: Full Release Notes](releases/v1.2.3.md){ .md-button .md-button--primary }
|
|
387
|
+
[:material-tag: Full Release Notes](releases/v1.2.4.md){ .md-button .md-button--primary }
|
|
390
388
|
[:material-book-open-variant: Migration Guide](releases/migration.md){ .md-button }
|
|
391
389
|
|
|
392
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",
|
|
@@ -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
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: v1.2.4 Release Notes
|
|
3
|
+
description: Cello Framework v1.2.4 — Critical fix for async def handlers broken since v1.2.1
|
|
4
|
+
tags:
|
|
5
|
+
- v1.2.4
|
|
6
|
+
- Release Notes
|
|
7
|
+
- Bug Fixes
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# Cello v1.2.4 — Critical Async Handler Fix
|
|
11
|
+
|
|
12
|
+
**Release Date:** June 14, 2026
|
|
13
|
+
**License:** MIT
|
|
14
|
+
**Python:** 3.12+
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Overview
|
|
19
|
+
|
|
20
|
+
Cello v1.2.4 fixes a critical regression introduced in v1.2.1 where **all `async def`
|
|
21
|
+
route handlers silently returned HTTP 500** and emitted:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
RuntimeWarning: coroutine 'handler_name' was never awaited
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Drop-in upgrade from v1.2.3. No API changes.
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Root Cause
|
|
32
|
+
|
|
33
|
+
In v1.2.1 the server startup was changed from `pyo3_asyncio::tokio::run` to
|
|
34
|
+
`py.allow_threads + tokio::block_on` to fix port binding on Python 3.12+. That fix
|
|
35
|
+
was correct, but it had an unintended side effect: `pyo3_asyncio` was no longer
|
|
36
|
+
initialised, so `pyo3_asyncio::tokio::into_future` (used in `handler.rs` to drive
|
|
37
|
+
async handlers) failed silently on every request — returning 500 and dropping the
|
|
38
|
+
unawaited coroutine.
|
|
39
|
+
|
|
40
|
+
```
|
|
41
|
+
v1.2.1 change (lib.rs):
|
|
42
|
+
- pyo3_asyncio::tokio::run(py, server_future) ← initialises pyo3_asyncio
|
|
43
|
+
+ py.allow_threads(|| rt.block_on(server_future)) ← does NOT initialise it
|
|
44
|
+
|
|
45
|
+
handler.rs (unchanged):
|
|
46
|
+
pyo3_asyncio::tokio::into_future(coro) ← fails: pyo3_asyncio not ready → 500
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Fix
|
|
52
|
+
|
|
53
|
+
`handler.rs` Phase 2 now drives coroutines via `tokio::task::spawn_blocking +
|
|
54
|
+
asyncio.run()` instead of `pyo3_asyncio::tokio::into_future`:
|
|
55
|
+
|
|
56
|
+
```rust
|
|
57
|
+
// Before (broken since v1.2.1):
|
|
58
|
+
let future = Python::with_gil(|py| {
|
|
59
|
+
pyo3_asyncio::tokio::into_future(raw_result.as_ref(py)) // ← failed silently
|
|
60
|
+
})?;
|
|
61
|
+
future.await?
|
|
62
|
+
|
|
63
|
+
// After (v1.2.4):
|
|
64
|
+
let (tx, rx) = tokio::sync::oneshot::channel();
|
|
65
|
+
let coro = raw_result;
|
|
66
|
+
tokio::task::spawn_blocking(move || {
|
|
67
|
+
let result = Python::with_gil(|py| {
|
|
68
|
+
let asyncio = py.import("asyncio")?;
|
|
69
|
+
asyncio.call_method1("run", (coro.as_ref(py),))
|
|
70
|
+
.map(|r| r.into_py(py))
|
|
71
|
+
});
|
|
72
|
+
let _ = tx.send(result);
|
|
73
|
+
});
|
|
74
|
+
rx.await??
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The Tokio thread is released during `spawn_blocking`, so other requests can be
|
|
78
|
+
served while the coroutine runs. `asyncio.run()` creates a fresh event loop per
|
|
79
|
+
call (~0.1 ms overhead).
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Files Changed
|
|
84
|
+
|
|
85
|
+
| File | Change |
|
|
86
|
+
|------|--------|
|
|
87
|
+
| `src/handler.rs` | Replace `pyo3_asyncio::tokio::into_future` with `spawn_blocking + asyncio.run()` |
|
|
88
|
+
| `tests/verify_async_client.py` | New test — all HTTP methods via local echo server |
|
|
89
|
+
| `Cargo.toml`, `pyproject.toml`, `python/cello/__init__.py` | Version → 1.2.4 |
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## Upgrade
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
pip install --upgrade cello-framework==1.2.4
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
No code changes required — all `async def` handlers that were silently returning
|
|
100
|
+
500 will now work correctly after upgrading.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Impact
|
|
105
|
+
|
|
106
|
+
Any application using `async def` handlers on Cello v1.2.1, v1.2.2, or v1.2.3
|
|
107
|
+
was affected. Sync (`def`) handlers were not impacted.
|
|
@@ -229,20 +229,32 @@ impl HandlerRegistry {
|
|
|
229
229
|
Ok((call_result, is_coro))
|
|
230
230
|
})?;
|
|
231
231
|
|
|
232
|
-
// ── Phase 2 (GIL released during I/O waits): drive coroutine
|
|
232
|
+
// ── Phase 2 (GIL released during I/O waits): drive coroutine ────────────
|
|
233
233
|
//
|
|
234
|
-
// pyo3_asyncio::tokio::into_future
|
|
235
|
-
//
|
|
236
|
-
//
|
|
237
|
-
// so
|
|
234
|
+
// pyo3_asyncio::tokio::into_future requires pyo3_asyncio to be initialised
|
|
235
|
+
// via its own `run()` entry point. Since v1.2.1 the server uses native
|
|
236
|
+
// `py.allow_threads + tokio::block_on` (fixing port binding on Python 3.12+),
|
|
237
|
+
// so pyo3_asyncio is never initialised and into_future fails at runtime.
|
|
238
|
+
//
|
|
239
|
+
// Fix: offload to a blocking thread via spawn_blocking so the Tokio thread
|
|
240
|
+
// is released while asyncio.run() drives the coroutine to completion.
|
|
241
|
+
// asyncio.run() creates a fresh event loop per call; the overhead is small
|
|
242
|
+
// (~0.1 ms) compared to typical handler I/O.
|
|
238
243
|
let final_result: PyObject = if is_coroutine {
|
|
239
|
-
let
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
244
|
+
let (tx, rx) = tokio::sync::oneshot::channel::<Result<PyObject, String>>();
|
|
245
|
+
let coro = raw_result;
|
|
246
|
+
tokio::task::spawn_blocking(move || {
|
|
247
|
+
let result = Python::with_gil(|py| -> Result<PyObject, String> {
|
|
248
|
+
let asyncio = py.import("asyncio").map_err(|e| e.to_string())?;
|
|
249
|
+
asyncio
|
|
250
|
+
.call_method1("run", (coro.as_ref(py),))
|
|
251
|
+
.map(|r| r.into_py(py))
|
|
252
|
+
.map_err(|e| e.to_string())
|
|
253
|
+
});
|
|
254
|
+
let _ = tx.send(result);
|
|
255
|
+
});
|
|
256
|
+
rx.await
|
|
257
|
+
.map_err(|e| format!("Handler channel error: {e}"))?
|
|
246
258
|
.map_err(|e| format!("Async handler error: {e}"))?
|
|
247
259
|
} else {
|
|
248
260
|
raw_result
|
|
@@ -1042,7 +1042,7 @@ def test_version():
|
|
|
1042
1042
|
"""Test that version is 1.2.0."""
|
|
1043
1043
|
import cello
|
|
1044
1044
|
|
|
1045
|
-
assert cello.__version__ == "1.2.
|
|
1045
|
+
assert cello.__version__ == "1.2.4"
|
|
1046
1046
|
|
|
1047
1047
|
|
|
1048
1048
|
def test_all_exports():
|
|
@@ -2203,7 +2203,7 @@ def test_version_v090():
|
|
|
2203
2203
|
"""Test that version is 1.2.0 (updated from 0.9.0)."""
|
|
2204
2204
|
import cello
|
|
2205
2205
|
|
|
2206
|
-
assert cello.__version__ == "1.2.
|
|
2206
|
+
assert cello.__version__ == "1.2.4"
|
|
2207
2207
|
|
|
2208
2208
|
|
|
2209
2209
|
def test_v090_exports_in_all():
|
|
@@ -3989,7 +3989,7 @@ def test_version_v0100():
|
|
|
3989
3989
|
"""Test that version is 1.2.0."""
|
|
3990
3990
|
import cello
|
|
3991
3991
|
|
|
3992
|
-
assert cello.__version__ == "1.2.
|
|
3992
|
+
assert cello.__version__ == "1.2.4"
|
|
3993
3993
|
|
|
3994
3994
|
|
|
3995
3995
|
def test_v0100_exports_in_all():
|