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.
Files changed (293) hide show
  1. {cello_framework-1.2.3 → cello_framework-1.2.4}/CLAUDE.md +2 -1
  2. {cello_framework-1.2.3 → cello_framework-1.2.4}/Cargo.lock +1 -1
  3. {cello_framework-1.2.3 → cello_framework-1.2.4}/Cargo.toml +1 -1
  4. {cello_framework-1.2.3 → cello_framework-1.2.4}/PKG-INFO +1 -1
  5. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/index.md +8 -10
  6. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/overrides/main.html +2 -2
  7. cello_framework-1.2.4/docs/releases/index.md +303 -0
  8. cello_framework-1.2.4/docs/releases/v1.2.4.md +107 -0
  9. {cello_framework-1.2.3 → cello_framework-1.2.4}/mkdocs.yml +1 -0
  10. {cello_framework-1.2.3 → cello_framework-1.2.4}/pyproject.toml +1 -1
  11. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/__init__.py +1 -1
  12. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/handler.rs +24 -12
  13. {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/test_cello.py +3 -3
  14. {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/test_minijinja.py +1 -1
  15. cello_framework-1.2.4/tests/verify_async_client.py +250 -0
  16. cello_framework-1.2.3/docs/releases/index.md +0 -241
  17. {cello_framework-1.2.3 → cello_framework-1.2.4}/.github/workflows/ci.yml +0 -0
  18. {cello_framework-1.2.3 → cello_framework-1.2.4}/.github/workflows/docs.yml +0 -0
  19. {cello_framework-1.2.3 → cello_framework-1.2.4}/.github/workflows/publish.yml +0 -0
  20. {cello_framework-1.2.3 → cello_framework-1.2.4}/.gitignore +0 -0
  21. {cello_framework-1.2.3 → cello_framework-1.2.4}/CONTRIBUTING.md +0 -0
  22. {cello_framework-1.2.3 → cello_framework-1.2.4}/ENTERPRISE_ROADMAP.md +0 -0
  23. {cello_framework-1.2.3 → cello_framework-1.2.4}/LICENSE +0 -0
  24. {cello_framework-1.2.3 → cello_framework-1.2.4}/PUBLISHING.md +0 -0
  25. {cello_framework-1.2.3 → cello_framework-1.2.4}/README.md +0 -0
  26. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/README.md +0 -0
  27. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/benchmark.py +0 -0
  28. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/README.md +0 -0
  29. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/__init__.py +0 -0
  30. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/blacksheep_app.py +0 -0
  31. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/cello_app.py +0 -0
  32. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/fastapi_app.py +0 -0
  33. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/apps/robyn_app.py +0 -0
  34. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/requirements.txt +0 -0
  35. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/compare/run_benchmarks.py +0 -0
  36. {cello_framework-1.2.3 → cello_framework-1.2.4}/benchmarks/quick_bench.py +0 -0
  37. {cello_framework-1.2.3 → cello_framework-1.2.4}/cello.md +0 -0
  38. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/code-of-conduct.md +0 -0
  39. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/contributing.md +0 -0
  40. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/index.md +0 -0
  41. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/community/support.md +0 -0
  42. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/deployment/docker.md +0 -0
  43. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/deployment/kubernetes.md +0 -0
  44. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/deployment/service-mesh.md +0 -0
  45. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/index.md +0 -0
  46. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/database.md +0 -0
  47. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/graphql.md +0 -0
  48. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/grpc.md +0 -0
  49. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/integration/message-queues.md +0 -0
  50. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/health-checks.md +0 -0
  51. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/metrics.md +0 -0
  52. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/opentelemetry.md +0 -0
  53. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/observability/tracing.md +0 -0
  54. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/enterprise/roadmap.md +0 -0
  55. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/background-tasks.md +0 -0
  56. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/file-storage.md +0 -0
  57. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/fullstack.md +0 -0
  58. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/graphql.md +0 -0
  59. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/microservices.md +0 -0
  60. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/realtime-dashboard.md +0 -0
  61. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/advanced/redis-caching.md +0 -0
  62. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/database.md +0 -0
  63. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/forms.md +0 -0
  64. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/hello-world.md +0 -0
  65. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/jwt-auth.md +0 -0
  66. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/query-params.md +0 -0
  67. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/basic/rest-api.md +0 -0
  68. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/api-gateway.md +0 -0
  69. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/event-sourcing.md +0 -0
  70. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/health-checks.md +0 -0
  71. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/multi-tenant.md +0 -0
  72. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/oauth2.md +0 -0
  73. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/enterprise/rate-limiting.md +0 -0
  74. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/index.md +0 -0
  75. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/adaptive-rate-limiting.md +0 -0
  76. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/advanced-middleware.md +0 -0
  77. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/advanced-patterns.md +0 -0
  78. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/all-features.md +0 -0
  79. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/api-protocols.md +0 -0
  80. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/async-handlers.md +0 -0
  81. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/auto-openapi.md +0 -0
  82. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/blueprints-advanced.md +0 -0
  83. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/circuit-breaker.md +0 -0
  84. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/cluster-demo.md +0 -0
  85. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/complete-showcase.md +0 -0
  86. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/comprehensive-demo.md +0 -0
  87. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/database-demo.md +0 -0
  88. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/dto-validation.md +0 -0
  89. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/enterprise-config.md +0 -0
  90. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/guards.md +0 -0
  91. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/hello-world.md +0 -0
  92. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/lifecycle-hooks.md +0 -0
  93. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/middleware-demo.md +0 -0
  94. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-advanced.md +0 -0
  95. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-basic.md +0 -0
  96. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-blog.md +0 -0
  97. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-emails.md +0 -0
  98. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-forms.md +0 -0
  99. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/minijinja-macros.md +0 -0
  100. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/security.md +0 -0
  101. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/simple-api.md +0 -0
  102. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/smart-caching.md +0 -0
  103. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/examples/real/streaming-sse.md +0 -0
  104. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/background-tasks.md +0 -0
  105. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/dependency-injection.md +0 -0
  106. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/dto-validation.md +0 -0
  107. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/file-uploads.md +0 -0
  108. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/static-files.md +0 -0
  109. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/advanced/templates.md +0 -0
  110. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/async.md +0 -0
  111. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/blueprints.md +0 -0
  112. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/requests.md +0 -0
  113. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/responses.md +0 -0
  114. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/core/routing.md +0 -0
  115. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/index.md +0 -0
  116. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/caching.md +0 -0
  117. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/circuit-breaker.md +0 -0
  118. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/compression.md +0 -0
  119. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/cors.md +0 -0
  120. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/logging.md +0 -0
  121. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/overview.md +0 -0
  122. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/middleware/rate-limiting.md +0 -0
  123. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/minijinja-templates.md +0 -0
  124. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/realtime/sse.md +0 -0
  125. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/realtime/websocket.md +0 -0
  126. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/authentication.md +0 -0
  127. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/csrf.md +0 -0
  128. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/guards.md +0 -0
  129. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/headers.md +0 -0
  130. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/jwt.md +0 -0
  131. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/overview.md +0 -0
  132. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/security/sessions.md +0 -0
  133. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/features/templates.md +0 -0
  134. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/configuration.md +0 -0
  135. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/first-app.md +0 -0
  136. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/index.md +0 -0
  137. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/installation.md +0 -0
  138. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/project-structure.md +0 -0
  139. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/getting-started/quickstart.md +0 -0
  140. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/includes/abbreviations.md +0 -0
  141. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/javascripts/extra.js +0 -0
  142. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/best-practices.md +0 -0
  143. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/deployment.md +0 -0
  144. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/error-handling.md +0 -0
  145. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/performance.md +0 -0
  146. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/guides/testing.md +0 -0
  147. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/index.md +0 -0
  148. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/cqrs.md +0 -0
  149. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/event-driven.md +0 -0
  150. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/repository.md +0 -0
  151. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/patterns/service-layer.md +0 -0
  152. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/auth-system.md +0 -0
  153. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/chat-app.md +0 -0
  154. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/microservices.md +0 -0
  155. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/learn/tutorials/rest-api.md +0 -0
  156. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo-full.png +0 -0
  157. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo-icon.svg +0 -0
  158. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo.jpg +0 -0
  159. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/logo.svg +0 -0
  160. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/app.md +0 -0
  161. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/blueprint.md +0 -0
  162. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/context.md +0 -0
  163. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/guards.md +0 -0
  164. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/middleware.md +0 -0
  165. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/request.md +0 -0
  166. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/api/response.md +0 -0
  167. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/cli.md +0 -0
  168. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/config/middleware.md +0 -0
  169. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/config/security.md +0 -0
  170. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/config/server.md +0 -0
  171. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/errors.md +0 -0
  172. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/reference/index.md +0 -0
  173. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/changelog.md +0 -0
  174. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/migration.md +0 -0
  175. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.10.0.md +0 -0
  176. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.3.0.md +0 -0
  177. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.4.0.md +0 -0
  178. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.5.0.md +0 -0
  179. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.6.0.md +0 -0
  180. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.7.0.md +0 -0
  181. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.8.0.md +0 -0
  182. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v0.9.0.md +0 -0
  183. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.0.0.md +0 -0
  184. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.0.1.md +0 -0
  185. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.1.0.md +0 -0
  186. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.0.md +0 -0
  187. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.1.md +0 -0
  188. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.2.md +0 -0
  189. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/releases/v1.2.3.md +0 -0
  190. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/requirements.txt +0 -0
  191. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/stylesheets/extra.css +0 -0
  192. {cello_framework-1.2.3 → cello_framework-1.2.4}/docs/tags.md +0 -0
  193. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/adaptive_rate_limit.py +0 -0
  194. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/advanced.py +0 -0
  195. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/advanced_middleware.py +0 -0
  196. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/advanced_patterns_demo.py +0 -0
  197. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/all_features_demo.py +0 -0
  198. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/api_protocols_demo.py +0 -0
  199. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/async_demo.py +0 -0
  200. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/auto_openapi_demo.py +0 -0
  201. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/circuit_breaker.py +0 -0
  202. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/cluster_demo.py +0 -0
  203. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/complete_showcase.py +0 -0
  204. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/comprehensive_demo.py +0 -0
  205. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/database_demo.py +0 -0
  206. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/dto_validation.py +0 -0
  207. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/enterprise.py +0 -0
  208. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/guards.py +0 -0
  209. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/hello.py +0 -0
  210. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/lifecycle_hooks.py +0 -0
  211. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/middleware_demo.py +0 -0
  212. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_advanced.py +0 -0
  213. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_basic.py +0 -0
  214. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_blog.py +0 -0
  215. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_emails.py +0 -0
  216. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_forms.py +0 -0
  217. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/minijinja_macros.py +0 -0
  218. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/security.py +0 -0
  219. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/simple_api.py +0 -0
  220. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/smart_caching.py +0 -0
  221. {cello_framework-1.2.3 → cello_framework-1.2.4}/examples/streaming_demo.py +0 -0
  222. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/cqrs.py +0 -0
  223. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/database.py +0 -0
  224. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/eventsourcing.py +0 -0
  225. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/graphql.py +0 -0
  226. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/grpc.py +0 -0
  227. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/guards.py +0 -0
  228. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/messaging.py +0 -0
  229. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/middleware.py +0 -0
  230. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/saga.py +0 -0
  231. {cello_framework-1.2.3 → cello_framework-1.2.4}/python/cello/validation.py +0 -0
  232. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/arena.rs +0 -0
  233. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/background.rs +0 -0
  234. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/blueprint.rs +0 -0
  235. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/context.rs +0 -0
  236. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/dependency.rs +0 -0
  237. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/dto.rs +0 -0
  238. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/error.rs +0 -0
  239. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/http_client.rs +0 -0
  240. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/json.rs +0 -0
  241. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/lib.rs +0 -0
  242. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/lifecycle.rs +0 -0
  243. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/auth.rs +0 -0
  244. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/body_limit.rs +0 -0
  245. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/cache.rs +0 -0
  246. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/circuit_breaker.rs +0 -0
  247. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/cors.rs +0 -0
  248. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/cqrs.rs +0 -0
  249. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/csrf.rs +0 -0
  250. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/database.rs +0 -0
  251. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/etag.rs +0 -0
  252. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/eventsourcing.rs +0 -0
  253. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/exception_handler.rs +0 -0
  254. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/graphql.rs +0 -0
  255. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/grpc.rs +0 -0
  256. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/guards.rs +0 -0
  257. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/health.rs +0 -0
  258. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/messaging.rs +0 -0
  259. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/mod.rs +0 -0
  260. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/prometheus.rs +0 -0
  261. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/rate_limit.rs +0 -0
  262. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/redis.rs +0 -0
  263. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/request_id.rs +0 -0
  264. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/saga.rs +0 -0
  265. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/security.rs +0 -0
  266. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/session.rs +0 -0
  267. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/static_files.rs +0 -0
  268. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/middleware/telemetry.rs +0 -0
  269. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/minijinja_engine.rs +0 -0
  270. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/multipart.rs +0 -0
  271. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/openapi.rs +0 -0
  272. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/request/mod.rs +0 -0
  273. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/request/multipart_streaming.rs +0 -0
  274. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/request/parsing.rs +0 -0
  275. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/response/mod.rs +0 -0
  276. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/response/streaming.rs +0 -0
  277. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/response/xml.rs +0 -0
  278. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/router.rs +0 -0
  279. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/routing/constraints.rs +0 -0
  280. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/routing/mod.rs +0 -0
  281. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/server/cluster.rs +0 -0
  282. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/server/mod.rs +0 -0
  283. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/server/protocols.rs +0 -0
  284. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/sse.rs +0 -0
  285. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/template.rs +0 -0
  286. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/timeout.rs +0 -0
  287. {cello_framework-1.2.3 → cello_framework-1.2.4}/src/websocket.rs +0 -0
  288. {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_adaptive.py +0 -0
  289. {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_caching.py +0 -0
  290. {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_circuit_breaker.py +0 -0
  291. {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_dto.py +0 -0
  292. {cello_framework-1.2.3 → cello_framework-1.2.4}/tests/verify_guards_impl.py +0 -0
  293. {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.3
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`)
@@ -341,7 +341,7 @@ dependencies = [
341
341
 
342
342
  [[package]]
343
343
  name = "cello-framework"
344
- version = "1.2.3"
344
+ version = "1.2.4"
345
345
  dependencies = [
346
346
  "async-graphql",
347
347
  "async-graphql-value",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "cello-framework"
3
- version = "1.2.3"
3
+ version = "1.2.4"
4
4
  edition = "2021"
5
5
  description = "Ultra-fast Rust-powered Python async web framework"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cello-framework
3
- Version: 1.2.3
3
+ Version: 1.2.4
4
4
  Classifier: Development Status :: 5 - Production/Stable
5
5
  Classifier: Intended Audience :: Developers
6
6
  Classifier: License :: OSI Approved :: MIT License
@@ -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.3</code>
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.3
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.3 -- Full Middleware Python API & Correct Import Paths"
377
+ !!! tip "v1.2.4 Critical Fix: async def Handlers Now Work Correctly"
378
378
 
379
- Cello v1.2.3 exposes the complete auth & security middleware suite to Python, and fixes all doc import errors.
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-api: **`app.use(middleware)`** -- New universal dispatcher: `app.use(JwtAuth(...))`, `app.use(BasicAuth(...))`, `app.use(ApiKeyAuth(...))`, `app.use(CsrfConfig())`.
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-package: **`cello.middleware` module** -- `from cello.middleware import JwtAuth, BasicAuth, ApiKeyAuth, CsrfConfig` now works.
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-language-rust: **6 new Rust-backed methods** -- `enable_jwt()`, `enable_session()`, `enable_security_headers()`, `enable_csrf()`, `enable_basic_auth()`, `enable_api_key()` added to App.
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
- - :material-import: **All import paths corrected** -- `from cello import RoleGuard` (not `from cello.guards`). All 9 affected doc pages fixed.
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.3Full middleware Python API (JwtAuth, BasicAuth, ApiKeyAuth, app.use())
5
+ Cello v1.2.4Critical 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.3",
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.
@@ -364,6 +364,7 @@ nav:
364
364
 
365
365
  - Release Notes:
366
366
  - releases/index.md
367
+ - v1.2.4: releases/v1.2.4.md
367
368
  - v1.2.3: releases/v1.2.3.md
368
369
  - v1.2.2: releases/v1.2.2.md
369
370
  - v1.2.1: releases/v1.2.1.md
@@ -4,7 +4,7 @@ build-backend = "maturin"
4
4
 
5
5
  [project]
6
6
  name = "cello-framework"
7
- version = "1.2.3"
7
+ version = "1.2.4"
8
8
  description = "Ultra-fast Rust-powered Python async web framework"
9
9
  readme = "README.md"
10
10
  license = { text = "MIT" }
@@ -296,7 +296,7 @@ __all__ = [
296
296
  "validate_rate_limit_config",
297
297
  "validate_tls_config",
298
298
  ]
299
- __version__ = "1.2.3"
299
+ __version__ = "1.2.4"
300
300
 
301
301
 
302
302
  class Blueprint:
@@ -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 via Tokio ─
232
+ // ── Phase 2 (GIL released during I/O waits): drive coroutine ────────────
233
233
  //
234
- // pyo3_asyncio::tokio::into_future wraps the Python coroutine as a Rust
235
- // Future that Tokio can poll. The GIL is acquired only when the coroutine
236
- // has work to do (Python bytecode execution) and released between steps,
237
- // so other Tokio tasks can make progress during I/O waits.
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 future = Python::with_gil(|py| {
240
- pyo3_asyncio::tokio::into_future(raw_result.as_ref(py))
241
- .map_err(|e| format!("Async setup error: {e}"))
242
- })?;
243
- // GIL is fully released here while Tokio drives the coroutine
244
- future
245
- .await
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.3"
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.3"
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.3"
3992
+ assert cello.__version__ == "1.2.4"
3993
3993
 
3994
3994
 
3995
3995
  def test_v0100_exports_in_all():
@@ -480,4 +480,4 @@ class TestComplexContextTypes:
480
480
  def test_version_is_1_2_0():
481
481
  import cello
482
482
 
483
- assert cello.__version__ == "1.2.3"
483
+ assert cello.__version__ == "1.2.4"