tempest-fastapi-sdk 0.36.0__tar.gz → 0.37.0__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 (355) hide show
  1. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/CHANGELOG.md +34 -0
  2. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/PKG-INFO +27 -8
  3. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/README.md +20 -7
  4. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/installation.en.md +12 -2
  5. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/installation.md +12 -2
  6. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/admin.en.md +2 -2
  7. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/admin.md +2 -2
  8. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/cli.en.md +15 -3
  9. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/cli.md +15 -3
  10. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/uploads.en.md +1 -1
  11. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/roadmap.en.md +2 -2
  12. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/roadmap.md +2 -2
  13. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/pyproject.toml +12 -1
  14. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/__init__.py +1 -1
  15. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +5 -1
  16. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/docker_compose.py +39 -13
  17. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/generate.py +1 -1
  18. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cli/test_docker_compose.py +31 -3
  19. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cli/test_main.py +17 -0
  20. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/uv.lock +62 -2
  21. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/.github/workflows/ci.yml +0 -0
  22. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/.github/workflows/docs.yml +0 -0
  23. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/.github/workflows/release-pypi.yml +0 -0
  24. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/.gitignore +0 -0
  25. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/.python-version +0 -0
  26. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/CLAUDE.md +0 -0
  27. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/Makefile +0 -0
  28. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/architecture.en.md +0 -0
  29. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/architecture.md +0 -0
  30. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/changelog.en.md +0 -0
  31. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/changelog.md +0 -0
  32. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/contributing.en.md +0 -0
  33. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/contributing.md +0 -0
  34. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/index.en.md +0 -0
  35. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/index.md +0 -0
  36. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/index.en.md +0 -0
  37. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/index.md +0 -0
  38. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/api.en.md +0 -0
  39. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/api.md +0 -0
  40. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/business-rules.en.md +0 -0
  41. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/business-rules.md +0 -0
  42. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/domain.en.md +0 -0
  43. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/domain.md +0 -0
  44. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/flows.en.md +0 -0
  45. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/flows.md +0 -0
  46. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/index.en.md +0 -0
  47. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/learning/marketplace/index.md +0 -0
  48. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/migration.en.md +0 -0
  49. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/migration.md +0 -0
  50. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/auth-flow.en.md +0 -0
  51. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/auth-flow.md +0 -0
  52. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/br-helpers.en.md +0 -0
  53. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/br-helpers.md +0 -0
  54. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/cache.en.md +0 -0
  55. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/cache.md +0 -0
  56. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/database.en.md +0 -0
  57. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/database.md +0 -0
  58. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/http.en.md +0 -0
  59. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/http.md +0 -0
  60. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/idempotency.en.md +0 -0
  61. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/idempotency.md +0 -0
  62. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/index.en.md +0 -0
  63. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/index.md +0 -0
  64. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/logging.en.md +0 -0
  65. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/logging.md +0 -0
  66. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/metrics.en.md +0 -0
  67. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/metrics.md +0 -0
  68. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/mfa.en.md +0 -0
  69. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/mfa.md +0 -0
  70. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/queue-tasks.en.md +0 -0
  71. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/queue-tasks.md +0 -0
  72. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/realtime.en.md +0 -0
  73. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/realtime.md +0 -0
  74. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/security.en.md +0 -0
  75. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/security.md +0 -0
  76. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/sessions.en.md +0 -0
  77. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/sessions.md +0 -0
  78. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/storage.en.md +0 -0
  79. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/storage.md +0 -0
  80. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/testing.en.md +0 -0
  81. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/testing.md +0 -0
  82. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/uploads.md +0 -0
  83. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/websocket.en.md +0 -0
  84. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/recipes/websocket.md +0 -0
  85. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/reference.en.md +0 -0
  86. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/reference.md +0 -0
  87. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/tutorial.en.md +0 -0
  88. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/docs/tutorial.md +0 -0
  89. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/mkdocs.yml +0 -0
  90. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/scripts/extract_recipe.py +0 -0
  91. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
  92. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
  93. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/config.py +0 -0
  94. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
  95. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/router.py +0 -0
  96. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/session.py +0 -0
  97. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/site.py +0 -0
  98. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
  99. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
  100. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
  101. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
  102. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
  103. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
  104. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
  105. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
  106. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
  107. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
  108. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
  109. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
  110. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
  111. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
  112. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
  113. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
  114. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
  115. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
  116. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
  117. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
  118. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
  119. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
  120. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
  121. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
  122. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
  123. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
  124. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/server.py +0 -0
  125. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/static.py +0 -0
  126. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
  127. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
  128. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
  129. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/router.py +0 -0
  130. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
  131. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/service.py +0 -0
  132. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/templates/activation.html +0 -0
  133. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/templates/activation_error.html +0 -0
  134. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/templates/activation_success.html +0 -0
  135. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/templates/password_reset.html +0 -0
  136. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/templates/password_reset_error.html +0 -0
  137. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/templates/password_reset_form.html +0 -0
  138. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/auth/templates/password_reset_success.html +0 -0
  139. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
  140. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
  141. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
  142. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
  143. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
  144. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
  145. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
  146. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
  147. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
  148. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
  149. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
  150. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
  151. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
  152. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
  153. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
  154. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
  155. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
  156. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
  157. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
  158. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
  159. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
  160. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
  161. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
  162. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
  163. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
  164. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
  165. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
  166. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
  167. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/db.py +0 -0
  168. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
  169. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/main.py +0 -0
  170. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/new.py +0 -0
  171. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/cli/user.py +0 -0
  172. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
  173. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
  174. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
  175. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/core/context.py +0 -0
  176. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/core/enums.py +0 -0
  177. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/core/logging.py +0 -0
  178. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
  179. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
  180. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
  181. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
  182. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/connection.py +0 -0
  183. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
  184. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
  185. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/model.py +0 -0
  186. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/repository.py +0 -0
  187. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
  188. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
  189. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
  190. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
  191. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
  192. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
  193. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
  194. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
  195. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
  196. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
  197. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
  198. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
  199. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
  200. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/py.typed +0 -0
  201. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
  202. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
  203. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
  204. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
  205. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
  206. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
  207. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
  208. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
  209. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
  210. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/services/base.py +0 -0
  211. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
  212. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
  213. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
  214. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
  215. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
  216. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
  217. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
  218. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
  219. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/settings/base.py +0 -0
  220. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
  221. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
  222. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
  223. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
  224. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
  225. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
  226. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
  227. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
  228. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
  229. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/testing/database.py +0 -0
  230. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/__init__.py +0 -0
  231. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
  232. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
  233. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
  234. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/download.py +0 -0
  235. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/email.py +0 -0
  236. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
  237. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
  238. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/log.py +0 -0
  239. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
  240. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
  241. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/password.py +0 -0
  242. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
  243. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
  244. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
  245. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
  246. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
  247. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
  248. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
  249. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
  250. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
  251. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
  252. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
  253. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
  254. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/__init__.py +0 -0
  255. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/admin/__init__.py +0 -0
  256. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/admin/test_auth.py +0 -0
  257. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/admin/test_forms.py +0 -0
  258. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/admin/test_mfa.py +0 -0
  259. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/admin/test_router.py +0 -0
  260. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/admin/test_site.py +0 -0
  261. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/admin/test_user_model.py +0 -0
  262. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/__init__.py +0 -0
  263. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_body_size.py +0 -0
  264. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_cookies.py +0 -0
  265. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_cors.py +0 -0
  266. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_csrf.py +0 -0
  267. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_dependencies_auth.py +0 -0
  268. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_handlers.py +0 -0
  269. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_health_router.py +0 -0
  270. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_idempotency.py +0 -0
  271. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_jwt_dependency.py +0 -0
  272. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_logs_router.py +0 -0
  273. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_oauth.py +0 -0
  274. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_prometheus.py +0 -0
  275. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_rate_limit.py +0 -0
  276. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_request_id_middleware.py +0 -0
  277. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_role_dependency.py +0 -0
  278. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_server.py +0 -0
  279. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_static.py +0 -0
  280. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_tool_spec.py +0 -0
  281. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_webhooks.py +0 -0
  282. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/api/test_webhooks_rsa.py +0 -0
  283. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/auth/__init__.py +0 -0
  284. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/auth/test_mfa.py +0 -0
  285. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/auth/test_service.py +0 -0
  286. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cache/__init__.py +0 -0
  287. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cache/test_decorator.py +0 -0
  288. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cache/test_redis_manager.py +0 -0
  289. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cli/__init__.py +0 -0
  290. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cli/test_db.py +0 -0
  291. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cli/test_generate.py +0 -0
  292. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/cli/test_user.py +0 -0
  293. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/conftest.py +0 -0
  294. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/controllers/__init__.py +0 -0
  295. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/controllers/test_base.py +0 -0
  296. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/core/__init__.py +0 -0
  297. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/core/test_context.py +0 -0
  298. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/core/test_enums.py +0 -0
  299. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/core/test_logging.py +0 -0
  300. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/__init__.py +0 -0
  301. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/test_alembic_hooks.py +0 -0
  302. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/test_bulk_ops.py +0 -0
  303. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/test_connection.py +0 -0
  304. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/test_migrations.py +0 -0
  305. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/test_mixins.py +0 -0
  306. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/test_model.py +0 -0
  307. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/db/test_repository.py +0 -0
  308. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/exceptions/__init__.py +0 -0
  309. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/exceptions/test_exceptions.py +0 -0
  310. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/queue/__init__.py +0 -0
  311. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/queue/test_manager.py +0 -0
  312. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/schemas/__init__.py +0 -0
  313. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/schemas/test_base.py +0 -0
  314. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/schemas/test_cursor_pagination.py +0 -0
  315. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/schemas/test_link_headers.py +0 -0
  316. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/schemas/test_pagination.py +0 -0
  317. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/schemas/test_response.py +0 -0
  318. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/services/__init__.py +0 -0
  319. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/services/test_base.py +0 -0
  320. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/sessions/__init__.py +0 -0
  321. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/sessions/test_sessions.py +0 -0
  322. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/settings/__init__.py +0 -0
  323. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/settings/test_base.py +0 -0
  324. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/settings/test_mixins.py +0 -0
  325. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/sse/__init__.py +0 -0
  326. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/sse/test_event_stream.py +0 -0
  327. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/storage/__init__.py +0 -0
  328. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/storage/test_minio_client.py +0 -0
  329. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/tasks/__init__.py +0 -0
  330. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/tasks/test_manager.py +0 -0
  331. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/tasks/test_scheduler.py +0 -0
  332. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/testing/__init__.py +0 -0
  333. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/testing/test_database.py +0 -0
  334. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/__init__.py +0 -0
  335. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_client_ip.py +0 -0
  336. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_datetime.py +0 -0
  337. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_dict.py +0 -0
  338. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_download.py +0 -0
  339. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_email.py +0 -0
  340. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_http_client.py +0 -0
  341. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_jwt.py +0 -0
  342. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_lazy_extras.py +0 -0
  343. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_log.py +0 -0
  344. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_metrics.py +0 -0
  345. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_opaque_token.py +0 -0
  346. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_password.py +0 -0
  347. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_regex.py +0 -0
  348. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_storage_backends.py +0 -0
  349. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_throttle.py +0 -0
  350. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/utils/test_upload.py +0 -0
  351. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/webpush/__init__.py +0 -0
  352. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/webpush/test_dispatcher.py +0 -0
  353. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/webpush/test_schemas.py +0 -0
  354. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/websockets/__init__.py +0 -0
  355. {tempest_fastapi_sdk-0.36.0 → tempest_fastapi_sdk-0.37.0}/tests/websockets/test_hub_and_router.py +0 -0
@@ -5,6 +5,40 @@ All notable changes to **tempest-fastapi-sdk** are listed below.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.37.0] — 2026-06-07
9
+
10
+ ### Added
11
+
12
+ - **`[sqlite]` and `[postgres]` install extras** for the async database
13
+ drivers. The SDK keeps `sqlalchemy[asyncio]` as a core dependency but
14
+ ships **no DBAPI driver by default** — the driver is a deploy choice.
15
+ Install `tempest-fastapi-sdk[sqlite]` (`aiosqlite`, dev default) or
16
+ `[postgres]` (`asyncpg`, production); both are bundled into `[all]`.
17
+ Without one, the engine raised `ModuleNotFoundError` on first
18
+ connection.
19
+
20
+ ### Changed
21
+
22
+ - **`tempest new` scaffold now ships a working DB driver.** The generated
23
+ `pyproject.toml` pins `aiosqlite` as a **runtime** dependency (it was
24
+ previously dev-only, so the default SQLite URL failed under a no-dev
25
+ install) and carries a commented `asyncpg` line next to it, ready to
26
+ uncomment when switching `DATABASE_URL` to PostgreSQL — matching the
27
+ commented Postgres URL already in `.env.example`.
28
+
29
+ - **`tempest new` / `tempest generate --docker`: credentials now resolve
30
+ from `.env`, not hardcoded in the compose.** Every `environment:` block
31
+ in the generated `docker-compose.yaml` now uses the `${VAR:-default}`
32
+ form so Docker Compose reads the value from the `.env` next to the
33
+ compose file, keeping secrets out of a VCS-tracked compose. The
34
+ `:-default` preserves zero-config dev boot before `.env.example` is
35
+ copied to `.env`. Affected variables: `POSTGRES_USER` /
36
+ `POSTGRES_PASSWORD` / `POSTGRES_DB`, `RABBITMQ_DEFAULT_USER` /
37
+ `RABBITMQ_DEFAULT_PASS` / `RABBITMQ_DEFAULT_VHOST`, `MINIO_ROOT_USER` /
38
+ `MINIO_ROOT_PASSWORD` (plus the MinIO bootstrap container's `mc alias`).
39
+ `env_block_for` now emits these credential keys into `.env.example` so
40
+ the generated `.env` carries them with their defaults.
41
+
8
42
  ## [0.36.0] — 2026-06-06
9
43
 
10
44
  Admin panel brought to Django-admin parity: the list view, write CRUD,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tempest-fastapi-sdk
3
- Version: 0.36.0
3
+ Version: 0.37.0
4
4
  Summary: Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects.
5
5
  Project-URL: Homepage, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
6
6
  Project-URL: Repository, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
@@ -32,6 +32,8 @@ Requires-Dist: jinja2>=3.1.0; extra == 'admin'
32
32
  Provides-Extra: all
33
33
  Requires-Dist: aiofiles>=24.1.0; extra == 'all'
34
34
  Requires-Dist: aiosmtplib>=4.0.0; extra == 'all'
35
+ Requires-Dist: aiosqlite>=0.20.0; extra == 'all'
36
+ Requires-Dist: asyncpg>=0.30.0; extra == 'all'
35
37
  Requires-Dist: bcrypt>=5.0.0; extra == 'all'
36
38
  Requires-Dist: cryptography>=42.0.0; extra == 'all'
37
39
  Requires-Dist: email-validator>=2.0.0; extra == 'all'
@@ -68,10 +70,14 @@ Provides-Extra: mfa
68
70
  Requires-Dist: pyotp>=2.9.0; extra == 'mfa'
69
71
  Provides-Extra: minio
70
72
  Requires-Dist: minio>=7.2.0; extra == 'minio'
73
+ Provides-Extra: postgres
74
+ Requires-Dist: asyncpg>=0.30.0; extra == 'postgres'
71
75
  Provides-Extra: prometheus
72
76
  Requires-Dist: prometheus-client>=0.20.0; extra == 'prometheus'
73
77
  Provides-Extra: queue
74
78
  Requires-Dist: faststream[rabbit]>=0.5.30; extra == 'queue'
79
+ Provides-Extra: sqlite
80
+ Requires-Dist: aiosqlite>=0.20.0; extra == 'sqlite'
75
81
  Provides-Extra: tasks
76
82
  Requires-Dist: taskiq-aio-pika>=0.4.0; extra == 'tasks'
77
83
  Requires-Dist: taskiq>=0.11.0; extra == 'tasks'
@@ -174,7 +180,7 @@ Via `pyproject.toml`:
174
180
 
175
181
  ```toml
176
182
  dependencies = [
177
- "tempest-fastapi-sdk>=0.36.0",
183
+ "tempest-fastapi-sdk>=0.37.0",
178
184
  ]
179
185
  ```
180
186
 
@@ -199,13 +205,18 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
199
205
  | `[http]` | `httpx` | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, OAuth2 / OIDC providers |
200
206
  | `[prometheus]` | `prometheus-client` | `PrometheusMiddleware`, `make_prometheus_router`, `make_prometheus_registry` |
201
207
  | `[mfa]` | `pyotp` | `TOTPHelper` + MFA/2FA endpoints on the bundled auth flow |
208
+ | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
209
+ | `[postgres]` | `asyncpg` | PostgreSQL async driver for `postgresql+asyncpg://` URLs (production) |
202
210
  | `[all]` | everything above | every helper |
203
211
 
204
212
  ```bash
205
213
  pip install "tempest-fastapi-sdk[auth,upload]" # only what the service uses
206
- pip install "tempest-fastapi-sdk[all]" # or pull everything
214
+ pip install "tempest-fastapi-sdk[postgres]" # add the async DB driver you deploy with
215
+ pip install "tempest-fastapi-sdk[all]" # or pull everything
207
216
  ```
208
217
 
218
+ > **The SDK ships no database driver by default.** `sqlalchemy[asyncio]` is core, but the async DBAPI is your deploy choice — add `[sqlite]` (`aiosqlite`, dev default) or `[postgres]` (`asyncpg`, production). Without one, the engine raises `ModuleNotFoundError` for the driver on first connection. Services scaffolded with `tempest new` already pin `aiosqlite` and carry a commented `asyncpg` line in `pyproject.toml`.
219
+
209
220
  Since `0.7.1` every optional dependency is imported lazily at first instantiation, so `import tempest_fastapi_sdk` works with any subset of extras — instantiating a helper whose extra is missing raises `ImportError` with a clear hint pointing at the right one.
210
221
 
211
222
  ---
@@ -3403,7 +3414,7 @@ tempest user list --admin # admins only
3403
3414
 
3404
3415
  ### Admin site recipe
3405
3416
 
3406
- Django-style management UI mounted under `/admin`. Operators sign in with a user row from the database (no separate admin password store) and browse every registered model from the browser, so the database port can stay closed on private networks. Phase 1 ships read-only views; create/edit/delete land in 0.14.0 and inline + bulk actions in 0.15.0.
3417
+ Django-style management UI mounted under `/admin`. Operators sign in with a user row from the database (no separate admin password store) and browse every registered model from the browser, so the database port can stay closed on private networks. The panel is feature-complete (Django-admin parity): a list view with search / per-field filters / sortable columns, full CRUD (create / edit / delete), bulk actions, CSV/JSON export, FK-select widgets, a dashboard with live row counts + system metrics, optional TOTP MFA at login, and an audit trail stamping `created_by` / `updated_by`. Still on the roadmap: file upload and inline/related editing.
3407
3418
 
3408
3419
  Requires the `[admin]` extra:
3409
3420
 
@@ -3522,11 +3533,19 @@ app.include_router(
3522
3533
  `make_admin_router` mounts:
3523
3534
 
3524
3535
  - `GET /admin/login`, `POST /admin/login`, `POST /admin/logout` — auth flow.
3525
- - `GET /admin/`dashboard listing every registered admin.
3526
- - `GET /admin/m/{slug}/` — list view with pagination + free-text search (`?q=`) + per-field filters (`?filter_<field>=value`).
3527
- - `GET /admin/m/{slug}/{identity}`read-only detail view.
3536
+ - `GET/POST /admin/mfa`TOTP challenge (second factor) between password and access, for principals with MFA enabled.
3537
+ - `GET /admin/` — dashboard: a card per model with **row count** + Browse/New, plus a **metrics panel** (CPU/RAM/disk via `MetricsUtils`; on by default, omitted without the `[metrics]` extra, disabled with `make_admin_router(show_metrics=False)`).
3538
+ - `GET /admin/m/{slug}/`list view with pagination + free-text search (`?q=`) + per-field filters (`?filter_<field>=value`) + clickable **column sorting** (`?sort=<column>&dir=asc|desc`).
3539
+ - `GET /admin/m/{slug}/export.csv` / `export.json` — **export** the current result set (honoring search/filters/sort) as CSV or JSON (row cap via `make_admin_router(export_max_rows=…)`, default 5000).
3540
+ - `POST /admin/m/{slug}/bulk` — **bulk actions** (delete / activate / deactivate) on selected rows.
3541
+ - `GET/POST /admin/m/{slug}/new` — **create** a record (when `can_create`).
3542
+ - `GET /admin/m/{slug}/{identity}` — detail view with Edit/Delete buttons + an Audit panel.
3543
+ - `GET/POST /admin/m/{slug}/{identity}/edit` — **edit** a record (when `can_edit`).
3544
+ - `POST /admin/m/{slug}/{identity}/delete` — **delete** a record (when `can_delete`).
3528
3545
  - `GET /admin/static/{path}` — bundled CSS/HTMX assets.
3529
3546
 
3547
+ Write operations (create/edit/delete/bulk) are gated by the `AdminModel` flags `can_create` / `can_edit` / `can_delete` (all `True` by default; a disabled view returns `404`), carry a per-session CSRF token validated server-side, derive form widgets from the column type, render an FK-select dropdown for foreign keys whose target has a registered `AdminModel`, and stamp `created_by` / `updated_by` (from `AuditMixin`) with the acting admin's id.
3548
+
3530
3549
  #### 4. Session security defaults
3531
3550
 
3532
3551
  `SignedCookieSessionStore` uses `itsdangerous.TimestampSigner` (HMAC-SHA256) to sign a single cookie:
@@ -3535,7 +3554,7 @@ app.include_router(
3535
3554
  - `Secure` flagged when `cookie_secure=True` (default; flip off in local HTTP dev).
3536
3555
  - `SameSite=Lax` (`"lax"`/`"strict"`/`"none"` accepted).
3537
3556
  - Default lifetime `8h`; expired or tampered cookies are rejected silently.
3538
- - Per-session CSRF token is generated at login and required by every form POST (only `logout` in Phase 1).
3557
+ - Per-session CSRF token is generated at login and required by every form POST (login, logout, create, edit, delete, bulk actions).
3539
3558
  - `secret_key` must be at least 32 bytes — short keys raise `ValueError` at construction time.
3540
3559
 
3541
3560
  #### 5. Plug in a custom auth backend
@@ -89,7 +89,7 @@ Via `pyproject.toml`:
89
89
 
90
90
  ```toml
91
91
  dependencies = [
92
- "tempest-fastapi-sdk>=0.36.0",
92
+ "tempest-fastapi-sdk>=0.37.0",
93
93
  ]
94
94
  ```
95
95
 
@@ -114,13 +114,18 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
114
114
  | `[http]` | `httpx` | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, OAuth2 / OIDC providers |
115
115
  | `[prometheus]` | `prometheus-client` | `PrometheusMiddleware`, `make_prometheus_router`, `make_prometheus_registry` |
116
116
  | `[mfa]` | `pyotp` | `TOTPHelper` + MFA/2FA endpoints on the bundled auth flow |
117
+ | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
118
+ | `[postgres]` | `asyncpg` | PostgreSQL async driver for `postgresql+asyncpg://` URLs (production) |
117
119
  | `[all]` | everything above | every helper |
118
120
 
119
121
  ```bash
120
122
  pip install "tempest-fastapi-sdk[auth,upload]" # only what the service uses
121
- pip install "tempest-fastapi-sdk[all]" # or pull everything
123
+ pip install "tempest-fastapi-sdk[postgres]" # add the async DB driver you deploy with
124
+ pip install "tempest-fastapi-sdk[all]" # or pull everything
122
125
  ```
123
126
 
127
+ > **The SDK ships no database driver by default.** `sqlalchemy[asyncio]` is core, but the async DBAPI is your deploy choice — add `[sqlite]` (`aiosqlite`, dev default) or `[postgres]` (`asyncpg`, production). Without one, the engine raises `ModuleNotFoundError` for the driver on first connection. Services scaffolded with `tempest new` already pin `aiosqlite` and carry a commented `asyncpg` line in `pyproject.toml`.
128
+
124
129
  Since `0.7.1` every optional dependency is imported lazily at first instantiation, so `import tempest_fastapi_sdk` works with any subset of extras — instantiating a helper whose extra is missing raises `ImportError` with a clear hint pointing at the right one.
125
130
 
126
131
  ---
@@ -3318,7 +3323,7 @@ tempest user list --admin # admins only
3318
3323
 
3319
3324
  ### Admin site recipe
3320
3325
 
3321
- Django-style management UI mounted under `/admin`. Operators sign in with a user row from the database (no separate admin password store) and browse every registered model from the browser, so the database port can stay closed on private networks. Phase 1 ships read-only views; create/edit/delete land in 0.14.0 and inline + bulk actions in 0.15.0.
3326
+ Django-style management UI mounted under `/admin`. Operators sign in with a user row from the database (no separate admin password store) and browse every registered model from the browser, so the database port can stay closed on private networks. The panel is feature-complete (Django-admin parity): a list view with search / per-field filters / sortable columns, full CRUD (create / edit / delete), bulk actions, CSV/JSON export, FK-select widgets, a dashboard with live row counts + system metrics, optional TOTP MFA at login, and an audit trail stamping `created_by` / `updated_by`. Still on the roadmap: file upload and inline/related editing.
3322
3327
 
3323
3328
  Requires the `[admin]` extra:
3324
3329
 
@@ -3437,11 +3442,19 @@ app.include_router(
3437
3442
  `make_admin_router` mounts:
3438
3443
 
3439
3444
  - `GET /admin/login`, `POST /admin/login`, `POST /admin/logout` — auth flow.
3440
- - `GET /admin/`dashboard listing every registered admin.
3441
- - `GET /admin/m/{slug}/` — list view with pagination + free-text search (`?q=`) + per-field filters (`?filter_<field>=value`).
3442
- - `GET /admin/m/{slug}/{identity}`read-only detail view.
3445
+ - `GET/POST /admin/mfa`TOTP challenge (second factor) between password and access, for principals with MFA enabled.
3446
+ - `GET /admin/` — dashboard: a card per model with **row count** + Browse/New, plus a **metrics panel** (CPU/RAM/disk via `MetricsUtils`; on by default, omitted without the `[metrics]` extra, disabled with `make_admin_router(show_metrics=False)`).
3447
+ - `GET /admin/m/{slug}/`list view with pagination + free-text search (`?q=`) + per-field filters (`?filter_<field>=value`) + clickable **column sorting** (`?sort=<column>&dir=asc|desc`).
3448
+ - `GET /admin/m/{slug}/export.csv` / `export.json` — **export** the current result set (honoring search/filters/sort) as CSV or JSON (row cap via `make_admin_router(export_max_rows=…)`, default 5000).
3449
+ - `POST /admin/m/{slug}/bulk` — **bulk actions** (delete / activate / deactivate) on selected rows.
3450
+ - `GET/POST /admin/m/{slug}/new` — **create** a record (when `can_create`).
3451
+ - `GET /admin/m/{slug}/{identity}` — detail view with Edit/Delete buttons + an Audit panel.
3452
+ - `GET/POST /admin/m/{slug}/{identity}/edit` — **edit** a record (when `can_edit`).
3453
+ - `POST /admin/m/{slug}/{identity}/delete` — **delete** a record (when `can_delete`).
3443
3454
  - `GET /admin/static/{path}` — bundled CSS/HTMX assets.
3444
3455
 
3456
+ Write operations (create/edit/delete/bulk) are gated by the `AdminModel` flags `can_create` / `can_edit` / `can_delete` (all `True` by default; a disabled view returns `404`), carry a per-session CSRF token validated server-side, derive form widgets from the column type, render an FK-select dropdown for foreign keys whose target has a registered `AdminModel`, and stamp `created_by` / `updated_by` (from `AuditMixin`) with the acting admin's id.
3457
+
3445
3458
  #### 4. Session security defaults
3446
3459
 
3447
3460
  `SignedCookieSessionStore` uses `itsdangerous.TimestampSigner` (HMAC-SHA256) to sign a single cookie:
@@ -3450,7 +3463,7 @@ app.include_router(
3450
3463
  - `Secure` flagged when `cookie_secure=True` (default; flip off in local HTTP dev).
3451
3464
  - `SameSite=Lax` (`"lax"`/`"strict"`/`"none"` accepted).
3452
3465
  - Default lifetime `8h`; expired or tampered cookies are rejected silently.
3453
- - Per-session CSRF token is generated at login and required by every form POST (only `logout` in Phase 1).
3466
+ - Per-session CSRF token is generated at login and required by every form POST (login, logout, create, edit, delete, bulk actions).
3454
3467
  - `secret_key` must be at least 32 bytes — short keys raise `ValueError` at construction time.
3455
3468
 
3456
3469
  #### 5. Plug in a custom auth backend
@@ -30,6 +30,8 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
30
30
  | `[http]` | `httpx` | `HTTPClient` + `RetryPolicy` + circuit-breaker |
31
31
  | `[prometheus]` | `prometheus-client` | `PrometheusMiddleware`, `make_prometheus_router`, `make_prometheus_registry` |
32
32
  | `[mfa]` | `pyotp` | `TOTPHelper` + MFA/2FA (TOTP) endpoints on the bundled auth flow |
33
+ | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
34
+ | `[postgres]` | `asyncpg` | PostgreSQL async driver for `postgresql+asyncpg://` URLs (production) |
33
35
  | `[all]` | everything above | every helper |
34
36
 
35
37
  === "Subset (recommended)"
@@ -47,17 +49,25 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
47
49
  === "uv add"
48
50
 
49
51
  ```bash
50
- uv add "tempest-fastapi-sdk[auth,upload]>=0.32.0"
52
+ uv add "tempest-fastapi-sdk[auth,upload,postgres]>=0.37.0"
51
53
  ```
52
54
 
53
55
  === "pyproject.toml"
54
56
 
55
57
  ```toml
56
58
  dependencies = [
57
- "tempest-fastapi-sdk[auth,upload]>=0.32.0",
59
+ "tempest-fastapi-sdk[auth,upload,postgres]>=0.37.0",
58
60
  ]
59
61
  ```
60
62
 
63
+ !!! warning "The SDK ships no database driver by default"
64
+ `sqlalchemy[asyncio]` is core, but the async DBAPI is your deploy
65
+ choice: install `[sqlite]` (`aiosqlite`, dev default) or `[postgres]`
66
+ (`asyncpg`, production). Without one, the engine raises
67
+ `ModuleNotFoundError` for the driver on first connection. Services
68
+ scaffolded with `tempest new` already pin `aiosqlite` and carry a
69
+ commented `asyncpg` line in `pyproject.toml`.
70
+
61
71
  !!! info "Lazy imports"
62
72
  Since 0.7.1 every optional dependency is imported lazily at first instantiation, so `import tempest_fastapi_sdk` works even when only a subset of extras is installed. Instantiating a helper whose extra is missing raises `ImportError` with a clear hint pointing at the right extra.
63
73
 
@@ -30,6 +30,8 @@ Os helpers mais ricos puxam dependências de terceiros que só são necessárias
30
30
  | `[http]` | `httpx` | `HTTPClient` + `RetryPolicy` + circuit-breaker |
31
31
  | `[prometheus]` | `prometheus-client` | `PrometheusMiddleware`, `make_prometheus_router`, `make_prometheus_registry` |
32
32
  | `[mfa]` | `pyotp` | `TOTPHelper` + endpoints MFA/2FA (TOTP) do fluxo bundled de auth |
33
+ | `[sqlite]` | `aiosqlite` | driver async SQLite para URLs `sqlite+aiosqlite://` (default de dev) |
34
+ | `[postgres]` | `asyncpg` | driver async PostgreSQL para URLs `postgresql+asyncpg://` (produção) |
33
35
  | `[all]` | tudo acima | todos os helpers |
34
36
 
35
37
  === "Subconjunto (recomendado)"
@@ -47,17 +49,25 @@ Os helpers mais ricos puxam dependências de terceiros que só são necessárias
47
49
  === "uv add"
48
50
 
49
51
  ```bash
50
- uv add "tempest-fastapi-sdk[auth,upload]>=0.32.0"
52
+ uv add "tempest-fastapi-sdk[auth,upload,postgres]>=0.37.0"
51
53
  ```
52
54
 
53
55
  === "pyproject.toml"
54
56
 
55
57
  ```toml
56
58
  dependencies = [
57
- "tempest-fastapi-sdk[auth,upload]>=0.32.0",
59
+ "tempest-fastapi-sdk[auth,upload,postgres]>=0.37.0",
58
60
  ]
59
61
  ```
60
62
 
63
+ !!! warning "O SDK não traz driver de banco por padrão"
64
+ `sqlalchemy[asyncio]` é dependência core, mas o DBAPI async é escolha
65
+ do seu deploy: instale `[sqlite]` (`aiosqlite`, default de dev) ou
66
+ `[postgres]` (`asyncpg`, produção). Sem nenhum, o engine levanta
67
+ `ModuleNotFoundError` do driver na primeira conexão. Serviços
68
+ criados com `tempest new` já pinam `aiosqlite` e carregam uma linha
69
+ `asyncpg` comentada no `pyproject.toml`.
70
+
61
71
  !!! info "Imports preguiçosos"
62
72
  Desde a 0.7.1 toda dependência opcional é importada de forma preguiçosa na primeira instanciação, então `import tempest_fastapi_sdk` funciona mesmo quando só um subconjunto de extras está instalado. Instanciar um helper cujo extra está faltando levanta `ImportError` com uma dica clara apontando para o extra certo.
63
73
 
@@ -1,7 +1,7 @@
1
1
  # Admin site
2
2
 
3
3
 
4
- Django-style management UI mounted under `/admin`. Operators sign in with a user row from the database (no separate admin password store) and browse every registered model from the browser, so the database port can stay closed on private networks. Phase 1 ships read-only views; create/edit/delete land in 0.14.0 and inline + bulk actions in 0.15.0.
4
+ Django-style management UI mounted under `/admin`. Operators sign in with a user row from the database (no separate admin password store) and browse every registered model from the browser, so the database port can stay closed on private networks. The panel is feature-complete (Django-admin parity): a list view with search / per-field filters / sortable columns, full CRUD (create / edit / delete), bulk actions, CSV/JSON export, FK-select widgets, a dashboard with live row counts + system metrics, optional TOTP MFA at login, and an audit trail stamping `created_by` / `updated_by`. Still on the roadmap: file upload and inline/related editing.
5
5
 
6
6
  Requires the `[admin]` extra:
7
7
 
@@ -155,7 +155,7 @@ app.include_router(
155
155
  - `Secure` flagged when `cookie_secure=True` (default; flip off in local HTTP dev).
156
156
  - `SameSite=Lax` (`"lax"`/`"strict"`/`"none"` accepted).
157
157
  - Default lifetime `8h`; expired or tampered cookies are rejected silently.
158
- - Per-session CSRF token is generated at login and required by every form POST (only `logout` in Phase 1).
158
+ - Per-session CSRF token is generated at login and required by every form POST (login, logout, create, edit, delete, bulk actions).
159
159
  - `secret_key` must be at least 32 bytes — short keys raise `ValueError` at construction time.
160
160
 
161
161
  #### 5. Plug in a custom auth backend
@@ -1,7 +1,7 @@
1
1
  # Painel admin
2
2
 
3
3
 
4
- UI de gerenciamento no estilo Django montada sob `/admin`. Operadores entram com uma linha de usuário do banco (sem store de senha de admin separado) e navegam por todo modelo registrado pelo navegador, então a porta do banco pode ficar fechada em redes privadas. A Fase 1 entrega views somente leitura; criar/editar/apagar chegam na 0.14.0 e ações inline + em lote na 0.15.0.
4
+ UI de gerenciamento no estilo Django montada sob `/admin`. Operadores entram com uma linha de usuário do banco (sem store de senha de admin separado) e navegam por todo modelo registrado pelo navegador, então a porta do banco pode ficar fechada em redes privadas. O painel é completo (paridade com o Django admin): list view com busca / filtros por campo / colunas ordenáveis, CRUD completo (criar / editar / excluir), ações em massa, export CSV/JSON, widgets FK-select, dashboard com contagens de linhas + métricas de sistema, MFA TOTP opcional no login, e trilha de auditoria carimbando `created_by` / `updated_by`. Ainda no roadmap: upload de arquivo e edição inline/relacionada.
5
5
 
6
6
  Requer o extra `[admin]`:
7
7
 
@@ -155,7 +155,7 @@ app.include_router(
155
155
  - `Secure` marcado quando `cookie_secure=True` (padrão; desligue no dev HTTP local).
156
156
  - `SameSite=Lax` (`"lax"`/`"strict"`/`"none"` aceitos).
157
157
  - Tempo de vida padrão `8h`; cookies expirados ou adulterados são rejeitados silenciosamente.
158
- - Um token CSRF por sessão é gerado no login e exigido por todo POST de formulário (apenas `logout` na Fase 1).
158
+ - Um token CSRF por sessão é gerado no login e exigido por todo POST de formulário (login, logout, criar, editar, excluir, ações em massa).
159
159
  - `secret_key` deve ter ao menos 32 bytes — chaves curtas levantam `ValueError` no momento da construção.
160
160
 
161
161
  #### 5. Plugue um backend de auth customizado
@@ -56,9 +56,9 @@ Since v0.25.0 the scaffold generates a `docker-compose.yaml` carrying **only** t
56
56
 
57
57
  | Extra | Container | Exposed port(s) |
58
58
  |-------|-----------|-----------------|
59
- | (always) | `postgres:16-alpine` | 5432 |
60
- | `[cache]` | `redis:7-alpine` | 6379 |
61
- | `[queue]` / `[tasks]` | `rabbitmq:3-management-alpine` | 5672 (AMQP) + 15672 (UI) |
59
+ | (always) | `postgres:18-alpine` | 5432 |
60
+ | `[cache]` | `redis:8-alpine` | 6379 |
61
+ | `[queue]` / `[tasks]` | `rabbitmq:4-management-alpine` | 5672 (AMQP) + 15672 (UI) |
62
62
  | `[minio]` | `minio/minio` + bootstrap mc | 9000 (API) + 9001 (Console) |
63
63
  | `[email]` | `mailhog/mailhog` | 1025 (SMTP) + 8025 (UI) |
64
64
 
@@ -73,6 +73,18 @@ Generates:
73
73
  - `postgres`, `redis`, `minio` (+ `minio-bootstrap` creating the `uploads` bucket), `mailhog`
74
74
  - `.env.example` with `REDIS_URL`, `MINIO_*`, `EMAIL_HOST=localhost`, `EMAIL_PORT=1025`
75
75
 
76
+ !!! info "Credentials come from `.env`, not hardcoded in the compose"
77
+ As of v0.37.0, no credential is written straight into
78
+ `docker-compose.yaml`. Each `environment:` block uses the
79
+ `${VAR:-default}` form, and Docker Compose resolves `VAR` from the
80
+ `.env` next to the compose file. The `:-default` keeps the stack
81
+ bootable before you copy `.env.example` to `.env` — but set real
82
+ secrets in `.env` for any non-throwaway deploy. Variables read by
83
+ compose: `POSTGRES_USER` / `POSTGRES_PASSWORD` / `POSTGRES_DB`,
84
+ `RABBITMQ_DEFAULT_USER` / `RABBITMQ_DEFAULT_PASS` /
85
+ `RABBITMQ_DEFAULT_VHOST`, `MINIO_ROOT_USER` / `MINIO_ROOT_PASSWORD`
86
+ — all with their defaults already in `.env.example`.
87
+
76
88
  Boot it all:
77
89
 
78
90
  ```bash
@@ -56,9 +56,9 @@ Desde a v0.25.0 o scaffold gera um `docker-compose.yaml` com **apenas** os servi
56
56
 
57
57
  | Extra | Container subido | Porta(s) exposta(s) |
58
58
  |-------|------------------|---------------------|
59
- | (sempre) | `postgres:16-alpine` | 5432 |
60
- | `[cache]` | `redis:7-alpine` | 6379 |
61
- | `[queue]` / `[tasks]` | `rabbitmq:3-management-alpine` | 5672 (AMQP) + 15672 (UI) |
59
+ | (sempre) | `postgres:18-alpine` | 5432 |
60
+ | `[cache]` | `redis:8-alpine` | 6379 |
61
+ | `[queue]` / `[tasks]` | `rabbitmq:4-management-alpine` | 5672 (AMQP) + 15672 (UI) |
62
62
  | `[minio]` | `minio/minio` + bootstrap mc | 9000 (API) + 9001 (Console) |
63
63
  | `[email]` | `mailhog/mailhog` | 1025 (SMTP) + 8025 (UI) |
64
64
 
@@ -73,6 +73,18 @@ Gera:
73
73
  - `postgres`, `redis`, `minio` (+ `minio-bootstrap` que cria o bucket `uploads`), `mailhog`
74
74
  - `.env.example` com `REDIS_URL`, `MINIO_*`, `EMAIL_HOST=localhost`, `EMAIL_PORT=1025`
75
75
 
76
+ !!! info "Credenciais vêm do `.env`, não estão hardcoded no compose"
77
+ A partir da v0.37.0, nenhuma credencial é gravada direto no
78
+ `docker-compose.yaml`. Cada bloco `environment:` usa a forma
79
+ `${VAR:-default}`, e o Docker Compose resolve `VAR` a partir do
80
+ `.env` ao lado do compose. O `:-default` mantém o stack subindo
81
+ antes de você copiar `.env.example` para `.env` — mas defina
82
+ segredos reais no `.env` para qualquer deploy não-descartável.
83
+ Variáveis lidas pelo compose: `POSTGRES_USER` / `POSTGRES_PASSWORD`
84
+ / `POSTGRES_DB`, `RABBITMQ_DEFAULT_USER` / `RABBITMQ_DEFAULT_PASS`
85
+ / `RABBITMQ_DEFAULT_VHOST`, `MINIO_ROOT_USER` /
86
+ `MINIO_ROOT_PASSWORD` — todas com seus padrões já no `.env.example`.
87
+
76
88
  Subir tudo:
77
89
 
78
90
  ```bash
@@ -151,4 +151,4 @@ url = await storage.presigned_url("logo.png", expires=timedelta(hours=1))
151
151
 
152
152
  ## When to use presigned PUT directly
153
153
 
154
- For files > 50 MB, skip the in-memory buffer — have the client `PUT` straight to MinIO via a presigned URL. See [Storage MinIO/S3](storage.md#presigned-url--direct-browser-upload).
154
+ For files > 50 MB, skip the in-memory buffer — have the client `PUT` straight to MinIO via a presigned URL. See [Storage MinIO/S3](storage.md#presigned-url-direct-browser-upload).
@@ -3,7 +3,7 @@
3
3
  What the SDK **doesn't ship yet** + what already landed. Sorted by impact, not implementation order — the current release is pulled by business pressure, not list position.
4
4
 
5
5
  !!! tip "What the SDK already covers"
6
- Full auth (JWT/bearer/role/permission/X-Token + bundled signup/activate/login/reset via `UserAuthService` + `make_auth_router`), OAuth2/OIDC (Google/GitHub + generic), CSRF middleware, DB (`AsyncDatabaseManager` + `BaseRepository` + bulk ops + `AlembicHelper` + `BaseModel` + `BaseUserModel` + `BaseUserTokenModel` + audit/soft-delete mixins + Alembic hook reordering base columns), standardized exceptions, structured logging + per-level files + `/logs` endpoint, metrics (CPU/RAM/GPU/Disk + Prometheus `/metrics` + `PrometheusMiddleware`), rate limiting, idempotency (`IdempotencyMiddleware` + memory/Redis stores), body-size limit, pagination (offset + cursor), settings mixins with `title`/`description`/`examples`, SSE, throttle, local upload/download + pluggable storage (`LocalUploadStorage` + `MinIOUploadStorage`), MinIO/S3 (`AsyncMinIOClient`), WebPush, webhook signatures, BR validators (CPF/CNPJ/CEP/phone), admin panel (Jinja + HTMX), email (SMTP + Jinja2 templates), Redis cache, FastStream queue, TaskIQ tasks, hardened static files, server runner, health, tool-spec router, request-id middleware, CORS, typed HTTP client (`HTTPClient` httpx wrapper with retry/backoff/circuit-breaker), full CLI (`tempest new`, `tempest generate --docker`, `tempest db <subcommand>`, `tempest user <subcommand>`, quality gates).
6
+ Full auth (JWT/bearer/role/permission/X-Token + bundled signup/activate/login/reset via `UserAuthService` + `make_auth_router`), OAuth2/OIDC (Google/GitHub + generic), CSRF middleware, DB (`AsyncDatabaseManager` + `BaseRepository` + bulk ops + `AlembicHelper` + `BaseModel` + `BaseUserModel` + `BaseUserTokenModel` + audit/soft-delete mixins + Alembic hook reordering base columns), standardized exceptions, structured logging + per-level files + `/logs` endpoint, metrics (CPU/RAM/GPU/Disk + Prometheus `/metrics` + `PrometheusMiddleware`), rate limiting, idempotency (`IdempotencyMiddleware` + memory/Redis stores), body-size limit, pagination (offset + cursor), settings mixins with `title`/`description`/`examples`, SSE, throttle, local upload/download + pluggable storage (`LocalUploadStorage` + `MinIOUploadStorage`), MinIO/S3 (`AsyncMinIOClient`), WebPush, webhook signatures, BR validators (CPF/CNPJ/CEP/phone), admin panel (Jinja + HTMX, Django-admin parity — list view with search/filters/sortable columns, full CRUD, bulk actions, CSV/JSON export, FK-select widgets, dashboard with counts + metrics, TOTP MFA at login, `created_by`/`updated_by` audit trail), email (SMTP + Jinja2 templates), Redis cache, FastStream queue, TaskIQ tasks, hardened static files, server runner, health, tool-spec router, request-id middleware, CORS, typed HTTP client (`HTTPClient` httpx wrapper with retry/backoff/circuit-breaker), full CLI (`tempest new`, `tempest generate --docker` — compose credentials resolved from `.env` via `${VAR:-default}`, not hardcoded —, `tempest db <subcommand>`, `tempest user <subcommand>`, quality gates).
7
7
 
8
8
  ## Tier S — every serious API needs these
9
9
 
@@ -32,7 +32,7 @@ What the SDK **doesn't ship yet** + what already landed. Sorted by impact, not i
32
32
  | 2FA / TOTP (`pyotp` wrapper + recovery codes) | ✅ v0.35.0 | `TOTPHelper` + `UserAuthService.mfa_*` + `BaseUserRecoveryCodeModel` |
33
33
  | `tempest db` + `tempest user` CLI | ✅ v0.30.0 | `tempest_fastapi_sdk.cli.db` / `cli.user` |
34
34
  | `BaseRepository.bulk_update` (filters + values) | ✅ pre-existing | `BaseRepository.bulk_update` |
35
- | **Multi-tenant scope** — `TenantScopedRepository(tenant_id)` auto-injecting `WHERE tenant_id = …` on every repository query | ❌ planned v0.37.0 | — |
35
+ | **Multi-tenant scope** — `TenantScopedRepository(tenant_id)` auto-injecting `WHERE tenant_id = …` on every repository query | ❌ pending | — |
36
36
 
37
37
  ## Tier B — when the service grows
38
38
 
@@ -3,7 +3,7 @@
3
3
  Esta página lista o que o SDK **ainda não oferece** + o que já foi entregue. Ordenado por impacto, não por ordem de implementação — a release atual é puxada pela pressão de negócio, não pela posição na lista.
4
4
 
5
5
  !!! tip "O que o SDK já cobre"
6
- Auth completa (JWT/bearer/role/permission/X-Token + bundled signup/activate/login/reset via `UserAuthService` + `make_auth_router`), OAuth2/OIDC (Google/GitHub + genérico), CSRF middleware, DB (`AsyncDatabaseManager` + `BaseRepository` + bulk ops + `AlembicHelper` + `BaseModel` + `BaseUserModel` + `BaseUserTokenModel` + mixins de auditoria/soft-delete + Alembic hook que reordena colunas base), exceções padronizadas, logging estruturado + arquivos por nível + endpoint `/logs`, métricas (CPU/RAM/GPU/Disco + Prometheus `/metrics` + `PrometheusMiddleware`), rate limiting, idempotência (`IdempotencyMiddleware` + memory/Redis stores), body-size limit, paginação (offset + cursor), settings por mixin com `title`/`description`/`examples`, SSE, throttle, upload/download local + storage pluggável (`LocalUploadStorage` + `MinIOUploadStorage`), MinIO/S3 (`AsyncMinIOClient`), WebPush, assinatura de webhook, validadores BR (CPF/CNPJ/CEP/telefone), painel admin (Jinja + HTMX), email (SMTP + Jinja2 templates), cache Redis, fila FastStream, tarefas TaskIQ, hardened static files, runner de servidor, health, tool-spec router, request-id middleware, CORS, HTTP client typed (`HTTPClient` httpx wrapper com retry/backoff/circuit-breaker), CLI completo (`tempest new`, `tempest generate --docker`, `tempest db <subcommand>`, `tempest user <subcommand>`, quality gates).
6
+ Auth completa (JWT/bearer/role/permission/X-Token + bundled signup/activate/login/reset via `UserAuthService` + `make_auth_router`), OAuth2/OIDC (Google/GitHub + genérico), CSRF middleware, DB (`AsyncDatabaseManager` + `BaseRepository` + bulk ops + `AlembicHelper` + `BaseModel` + `BaseUserModel` + `BaseUserTokenModel` + mixins de auditoria/soft-delete + Alembic hook que reordena colunas base), exceções padronizadas, logging estruturado + arquivos por nível + endpoint `/logs`, métricas (CPU/RAM/GPU/Disco + Prometheus `/metrics` + `PrometheusMiddleware`), rate limiting, idempotência (`IdempotencyMiddleware` + memory/Redis stores), body-size limit, paginação (offset + cursor), settings por mixin com `title`/`description`/`examples`, SSE, throttle, upload/download local + storage pluggável (`LocalUploadStorage` + `MinIOUploadStorage`), MinIO/S3 (`AsyncMinIOClient`), WebPush, assinatura de webhook, validadores BR (CPF/CNPJ/CEP/telefone), painel admin (Jinja + HTMX, paridade com Django admin — list view com busca/filtros/colunas ordenáveis, CRUD completo, ações em massa, export CSV/JSON, widgets FK-select, dashboard com contagens + métricas, MFA TOTP no login, trilha de auditoria `created_by`/`updated_by`), email (SMTP + Jinja2 templates), cache Redis, fila FastStream, tarefas TaskIQ, hardened static files, runner de servidor, health, tool-spec router, request-id middleware, CORS, HTTP client typed (`HTTPClient` httpx wrapper com retry/backoff/circuit-breaker), CLI completo (`tempest new`, `tempest generate --docker` — credenciais do compose resolvidas do `.env` via `${VAR:-default}`, não hardcoded —, `tempest db <subcommand>`, `tempest user <subcommand>`, quality gates).
7
7
 
8
8
  ## Tier S — toda API séria precisa
9
9
 
@@ -32,7 +32,7 @@ Esta página lista o que o SDK **ainda não oferece** + o que já foi entregue.
32
32
  | 2FA / TOTP (`pyotp` wrapper + recovery codes) | ✅ v0.35.0 | `TOTPHelper` + `UserAuthService.mfa_*` + `BaseUserRecoveryCodeModel` |
33
33
  | `tempest db` + `tempest user` CLI | ✅ v0.30.0 | `tempest_fastapi_sdk.cli.db` / `cli.user` |
34
34
  | `BaseRepository.bulk_update` (filters + values) | ✅ pré-existente | `BaseRepository.bulk_update` |
35
- | **Escopo multi-tenant** — `TenantScopedRepository(tenant_id)` auto-injetando `WHERE tenant_id = …` em toda query do repository | ❌ planejado v0.37.0 | — |
35
+ | **Escopo multi-tenant** — `TenantScopedRepository(tenant_id)` auto-injetando `WHERE tenant_id = …` em toda query do repository | ❌ pendente | — |
36
36
 
37
37
  ## Tier B — quando o serviço crescer
38
38
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tempest-fastapi-sdk"
3
- version = "0.36.0"
3
+ version = "0.37.0"
4
4
  description = "Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -87,6 +87,12 @@ prometheus = [
87
87
  mfa = [
88
88
  "pyotp>=2.9.0",
89
89
  ]
90
+ sqlite = [
91
+ "aiosqlite>=0.20.0",
92
+ ]
93
+ postgres = [
94
+ "asyncpg>=0.30.0",
95
+ ]
90
96
  all = [
91
97
  "bcrypt>=5.0.0",
92
98
  "pyjwt>=2.12.1",
@@ -108,6 +114,8 @@ all = [
108
114
  "prometheus-client>=0.20.0",
109
115
  "pyotp>=2.9.0",
110
116
  "email-validator>=2.0.0",
117
+ "aiosqlite>=0.20.0",
118
+ "asyncpg>=0.30.0",
111
119
  ]
112
120
 
113
121
  [project.urls]
@@ -203,6 +211,9 @@ ignore = [
203
211
  "tests/*" = ["S101"]
204
212
  "**/__init__.py" = ["F401"]
205
213
  "tempest_fastapi_sdk/db/repository.py" = ["UP006", "UP035"]
214
+ # Renders YAML compose snippets as f-string literals — long lines
215
+ # (healthcheck commands, `mc` entrypoints) are content, not code.
216
+ "tempest_fastapi_sdk/cli/docker_compose.py" = ["E501"]
206
217
 
207
218
  [tool.ruff.format]
208
219
  quote-style = "double"
@@ -242,7 +242,7 @@ from tempest_fastapi_sdk.websockets import (
242
242
  make_websocket_router,
243
243
  )
244
244
 
245
- __version__: str = "0.36.0"
245
+ __version__: str = "0.37.0"
246
246
 
247
247
  __all__: list[str] = [
248
248
  "BASE_COLUMN_ORDER",
@@ -8,6 +8,11 @@ authors = [{ name = "you", email = "you@example.com" }]
8
8
  dependencies = [
9
9
  "__SDK_DEP__",
10
10
  "uvicorn>=0.30.0",
11
+ # SQLite async driver — the default DATABASE_URL uses sqlite+aiosqlite.
12
+ "aiosqlite>=0.20.0",
13
+ # PostgreSQL async driver — docker-compose always ships Postgres.
14
+ # Uncomment when you switch DATABASE_URL to postgresql+asyncpg://...
15
+ # "asyncpg>=0.30.0",
11
16
  ]
12
17
 
13
18
  [dependency-groups]
@@ -18,7 +23,6 @@ dev = [
18
23
  "pytest-cov>=6.0.0",
19
24
  "ruff>=0.8.0",
20
25
  "httpx>=0.28.1",
21
- "aiosqlite>=0.20.0",
22
26
  ]
23
27
 
24
28
  [build-system]