tempest-fastapi-sdk 0.167.2__tar.gz → 0.168.1__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 (767) hide show
  1. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/CHANGELOG.md +85 -0
  2. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/CLAUDE.md +21 -1
  3. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/PKG-INFO +42 -21
  4. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/README.md +41 -20
  5. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/index.en.md +42 -42
  6. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/index.md +46 -46
  7. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/permission-guards.en.md +118 -3
  8. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/permission-guards.md +116 -2
  9. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/reference.md +215 -214
  10. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/roadmap.en.md +11 -0
  11. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/roadmap.md +11 -0
  12. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/mkdocs.yml +100 -21
  13. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/pyproject.toml +1 -1
  14. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/__init__.py +3 -1
  15. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/__init__.py +2 -0
  16. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/requires.py +187 -22
  17. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/permissions.py +187 -11
  18. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/test_requires.py +262 -4
  19. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_permissions.py +112 -1
  20. tempest_fastapi_sdk-0.168.1/tests/test_nav_ordering.py +279 -0
  21. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/uv.lock +1 -1
  22. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  23. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  24. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/docs.yml +0 -0
  25. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  26. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  27. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  28. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/ci.yml +0 -0
  29. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/docs.yml +0 -0
  30. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/nightly-model.yml +0 -0
  31. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/release-pypi.yml +0 -0
  32. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.gitignore +0 -0
  33. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.python-version +0 -0
  34. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/Makefile +0 -0
  35. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/admin-showcase.en.md +0 -0
  36. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/admin-showcase.md +0 -0
  37. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/architecture.en.md +0 -0
  38. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/architecture.md +0 -0
  39. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/changelog.en.md +0 -0
  40. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/changelog.md +0 -0
  41. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/contributing.en.md +0 -0
  42. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/contributing.md +0 -0
  43. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/fullstack-web.en.md +0 -0
  44. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/fullstack-web.md +0 -0
  45. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/genai-examples.en.md +0 -0
  46. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/genai-examples.md +0 -0
  47. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/index.en.md +0 -0
  48. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/index.md +0 -0
  49. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/installation.en.md +18 -18
  50. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/installation.md +18 -18
  51. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/integrated.en.md +0 -0
  52. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/integrated.md +0 -0
  53. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/index.en.md +0 -0
  54. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/index.md +0 -0
  55. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/api.en.md +0 -0
  56. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/api.md +0 -0
  57. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/business-rules.en.md +0 -0
  58. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/business-rules.md +0 -0
  59. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/domain.en.md +0 -0
  60. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/domain.md +0 -0
  61. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/flows.en.md +0 -0
  62. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/flows.md +0 -0
  63. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/index.en.md +0 -0
  64. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/index.md +0 -0
  65. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/marketplace-local.en.md +0 -0
  66. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/marketplace-local.md +0 -0
  67. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/migration.en.md +0 -0
  68. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/migration.md +0 -0
  69. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/admin.en.md +0 -0
  70. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/admin.md +0 -0
  71. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/artifact-registry.en.md +0 -0
  72. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/artifact-registry.md +0 -0
  73. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/audit-trail.en.md +0 -0
  74. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/audit-trail.md +0 -0
  75. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/auth-flow.en.md +0 -0
  76. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/auth-flow.md +0 -0
  77. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/authz.en.md +0 -0
  78. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/authz.md +0 -0
  79. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/br-helpers.en.md +0 -0
  80. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/br-helpers.md +0 -0
  81. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cache.en.md +0 -0
  82. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cache.md +0 -0
  83. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/chat.en.md +0 -0
  84. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/chat.md +0 -0
  85. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cli.en.md +0 -0
  86. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cli.md +0 -0
  87. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/database.en.md +0 -0
  88. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/database.md +0 -0
  89. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/deploy-safety.en.md +0 -0
  90. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/deploy-safety.md +0 -0
  91. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/downloads.en.md +0 -0
  92. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/downloads.md +0 -0
  93. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/email.en.md +0 -0
  94. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/email.md +0 -0
  95. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/feature-flags.en.md +0 -0
  96. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/feature-flags.md +0 -0
  97. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/fields.en.md +0 -0
  98. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/fields.md +0 -0
  99. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/file-store.en.md +0 -0
  100. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/file-store.md +0 -0
  101. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/genai.en.md +0 -0
  102. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/genai.md +0 -0
  103. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/geo.en.md +0 -0
  104. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/geo.md +0 -0
  105. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http-client.en.md +0 -0
  106. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http-client.md +0 -0
  107. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http.en.md +0 -0
  108. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http.md +0 -0
  109. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/idempotency.en.md +0 -0
  110. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/idempotency.md +0 -0
  111. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/introspection-auth.en.md +0 -0
  112. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/introspection-auth.md +0 -0
  113. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/logging.en.md +0 -0
  114. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/logging.md +0 -0
  115. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/management-commands.en.md +0 -0
  116. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/management-commands.md +0 -0
  117. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/metrics.en.md +0 -0
  118. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/metrics.md +0 -0
  119. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/mfa.en.md +0 -0
  120. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/mfa.md +0 -0
  121. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/multi-tenant.en.md +0 -0
  122. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/multi-tenant.md +0 -0
  123. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/observability.en.md +0 -0
  124. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/observability.md +0 -0
  125. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/offline-sync.en.md +0 -0
  126. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/offline-sync.md +0 -0
  127. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-client.en.md +0 -0
  128. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-client.md +0 -0
  129. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-errors.en.md +0 -0
  130. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-errors.md +0 -0
  131. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/outbox.en.md +0 -0
  132. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/outbox.md +0 -0
  133. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/queue-tasks.en.md +0 -0
  134. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/queue-tasks.md +0 -0
  135. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/react-spa.en.md +0 -0
  136. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/react-spa.md +0 -0
  137. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/realtime.en.md +0 -0
  138. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/realtime.md +0 -0
  139. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/refresh-tokens.en.md +0 -0
  140. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/refresh-tokens.md +0 -0
  141. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/reviews.en.md +0 -0
  142. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/reviews.md +0 -0
  143. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/security.en.md +0 -0
  144. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/security.md +0 -0
  145. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sessions.en.md +0 -0
  146. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sessions.md +0 -0
  147. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sse.en.md +0 -0
  148. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sse.md +0 -0
  149. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/storage.en.md +0 -0
  150. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/storage.md +0 -0
  151. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/stored-files.en.md +0 -0
  152. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/stored-files.md +0 -0
  153. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/system-checks.en.md +0 -0
  154. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/system-checks.md +0 -0
  155. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/tempestweb-frontend.en.md +0 -0
  156. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/tempestweb-frontend.md +0 -0
  157. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/testing.en.md +0 -0
  158. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/testing.md +0 -0
  159. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/typing.en.md +0 -0
  160. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/typing.md +0 -0
  161. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/uploads.en.md +0 -0
  162. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/uploads.md +0 -0
  163. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/utilities.en.md +0 -0
  164. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/utilities.md +0 -0
  165. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/vision.en.md +0 -0
  166. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/vision.md +0 -0
  167. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/webpush.en.md +0 -0
  168. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/webpush.md +0 -0
  169. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/websocket.en.md +0 -0
  170. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/websocket.md +0 -0
  171. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/reference.en.md +0 -0
  172. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/ssr.en.md +0 -0
  173. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/ssr.md +0 -0
  174. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/tutorial.en.md +0 -0
  175. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/tutorial.md +0 -0
  176. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/mkdocs_hooks/llmstxt.py +0 -0
  177. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/README.md +0 -0
  178. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/manual-validation.md +0 -0
  179. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-0.md +0 -0
  180. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-1.md +0 -0
  181. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-2.md +0 -0
  182. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-3.md +0 -0
  183. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/validation-strategy.md +0 -0
  184. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/scripts/extract_recipe.py +0 -0
  185. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/__init__.py +0 -0
  186. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/actions.py +0 -0
  187. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/auth.py +0 -0
  188. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/config.py +0 -0
  189. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/dashboard.py +0 -0
  190. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/discovery.py +0 -0
  191. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/forms.py +0 -0
  192. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/permissions.py +0 -0
  193. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/router.py +0 -0
  194. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/session.py +0 -0
  195. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/site.py +0 -0
  196. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
  197. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/autocomplete.html +0 -0
  198. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
  199. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
  200. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
  201. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
  202. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/import.html +0 -0
  203. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
  204. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
  205. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
  206. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
  207. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/theme.py +0 -0
  208. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/__init__.py +0 -0
  209. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/cookies.py +0 -0
  210. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
  211. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
  212. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/error_docs.py +0 -0
  213. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/handlers.py +0 -0
  214. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
  215. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
  216. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
  217. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
  218. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
  219. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
  220. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
  221. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
  222. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/response_cache.py +0 -0
  223. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/oauth.py +0 -0
  224. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
  225. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/health.py +0 -0
  226. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
  227. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
  228. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
  229. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/server.py +0 -0
  230. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/spa.py +0 -0
  231. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/static.py +0 -0
  232. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/tracing.py +0 -0
  233. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/webhooks.py +0 -0
  234. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/__init__.py +0 -0
  235. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/actions.py +0 -0
  236. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/digest.py +0 -0
  237. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/model.py +0 -0
  238. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/registry.py +0 -0
  239. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/__init__.py +0 -0
  240. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/guards.py +0 -0
  241. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/introspection.py +0 -0
  242. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/locale.py +0 -0
  243. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
  244. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/router.py +0 -0
  245. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/schemas.py +0 -0
  246. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/service.py +0 -0
  247. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
  248. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
  249. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
  250. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change.html +0 -0
  251. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change_error.html +0 -0
  252. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change_success.html +0 -0
  253. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_changed_notice.html +0 -0
  254. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification.html +0 -0
  255. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_error.html +0 -0
  256. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_success.html +0 -0
  257. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
  258. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
  259. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
  260. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
  261. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
  262. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
  263. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
  264. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change.html +0 -0
  265. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_error.html +0 -0
  266. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_success.html +0 -0
  267. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_changed_notice.html +0 -0
  268. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification.html +0 -0
  269. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_error.html +0 -0
  270. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_success.html +0 -0
  271. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
  272. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
  273. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
  274. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
  275. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
  276. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/dependencies.py +0 -0
  277. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/permissions.py +0 -0
  278. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/__init__.py +0 -0
  279. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/decorator.py +0 -0
  280. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
  281. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
  282. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/__init__.py +0 -0
  283. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/models.py +0 -0
  284. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/router.py +0 -0
  285. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/schemas.py +0 -0
  286. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/service.py +0 -0
  287. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/__init__.py +0 -0
  288. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/builtins.py +0 -0
  289. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/messages.py +0 -0
  290. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/registry.py +0 -0
  291. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/__init__.py +0 -0
  292. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
  293. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
  294. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
  295. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
  296. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
  297. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
  298. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
  299. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
  300. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
  301. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
  302. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
  303. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
  304. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
  305. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
  306. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
  307. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
  308. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
  309. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
  310. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
  311. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
  312. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
  313. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
  314. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
  315. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
  316. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
  317. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
  318. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
  319. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
  320. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/commands.py +0 -0
  321. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/config.py +0 -0
  322. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/db.py +0 -0
  323. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
  324. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/generate.py +0 -0
  325. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/lint.py +0 -0
  326. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/main.py +0 -0
  327. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/new.py +0 -0
  328. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/openapi_errors.py +0 -0
  329. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/openapi_fix.py +0 -0
  330. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/secrets.py +0 -0
  331. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
  332. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/user.py +0 -0
  333. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
  334. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/controllers/base.py +0 -0
  335. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/__init__.py +0 -0
  336. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/context.py +0 -0
  337. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/enums.py +0 -0
  338. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/logging.py +0 -0
  339. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/typed.py +0 -0
  340. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/__init__.py +0 -0
  341. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
  342. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
  343. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
  344. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/audit.py +0 -0
  345. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/backup.py +0 -0
  346. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/connection.py +0 -0
  347. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/expressions.py +0 -0
  348. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/migrations.py +0 -0
  349. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/mixins.py +0 -0
  350. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/model.py +0 -0
  351. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/outbox.py +0 -0
  352. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/repository.py +0 -0
  353. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/signals.py +0 -0
  354. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/slow_query.py +0 -0
  355. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/tenant.py +0 -0
  356. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_model.py +0 -0
  357. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
  358. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
  359. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
  360. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
  361. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
  362. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/base.py +0 -0
  363. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
  364. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
  365. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
  366. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
  367. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
  368. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
  369. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
  370. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
  371. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
  372. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/__init__.py +0 -0
  373. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/backends.py +0 -0
  374. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
  375. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/service.py +0 -0
  376. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/__init__.py +0 -0
  377. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/__init__.py +0 -0
  378. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/language.py +0 -0
  379. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/schemas.py +0 -0
  380. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/stt.py +0 -0
  381. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/tts.py +0 -0
  382. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/batching.py +0 -0
  383. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/embeddings.py +0 -0
  384. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/generation_cache.py +0 -0
  385. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/hardware.py +0 -0
  386. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/metrics.py +0 -0
  387. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/moderation.py +0 -0
  388. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/ollama.py +0 -0
  389. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/onnx_embed.py +0 -0
  390. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/pipeline.py +0 -0
  391. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/__init__.py +0 -0
  392. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/chroma.py +0 -0
  393. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/chunking.py +0 -0
  394. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/context.py +0 -0
  395. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/extract.py +0 -0
  396. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/fusion.py +0 -0
  397. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/hybrid.py +0 -0
  398. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/pdf.py +0 -0
  399. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/rerank.py +0 -0
  400. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/retriever.py +0 -0
  401. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/schemas.py +0 -0
  402. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/search.py +0 -0
  403. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/vectorstore.py +0 -0
  404. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/registry.py +0 -0
  405. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/router.py +0 -0
  406. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/schemas.py +0 -0
  407. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/structured.py +0 -0
  408. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/text.py +0 -0
  409. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/tokens.py +0 -0
  410. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/tracing.py +0 -0
  411. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/vision_text.py +0 -0
  412. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/__init__.py +0 -0
  413. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/br.py +0 -0
  414. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/db.py +0 -0
  415. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/distance.py +0 -0
  416. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/enums.py +0 -0
  417. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/estimate.py +0 -0
  418. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/geocoding.py +0 -0
  419. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/geometry.py +0 -0
  420. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/polyline.py +0 -0
  421. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/routing.py +0 -0
  422. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/schemas.py +0 -0
  423. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/__init__.py +0 -0
  424. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/emit_client.py +0 -0
  425. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/emit_schemas.py +0 -0
  426. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/generate.py +0 -0
  427. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/ir.py +0 -0
  428. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/loader.py +0 -0
  429. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/naming.py +0 -0
  430. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/parse.py +0 -0
  431. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/py.typed +0 -0
  432. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/__init__.py +0 -0
  433. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/broker.py +0 -0
  434. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/consumer.py +0 -0
  435. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/manager.py +0 -0
  436. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/__init__.py +0 -0
  437. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/models.py +0 -0
  438. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/router.py +0 -0
  439. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/schemas.py +0 -0
  440. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/service.py +0 -0
  441. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
  442. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/base.py +0 -0
  443. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/errors.py +0 -0
  444. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
  445. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/logs.py +0 -0
  446. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
  447. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/response.py +0 -0
  448. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/services/__init__.py +0 -0
  449. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/services/base.py +0 -0
  450. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
  451. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
  452. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
  453. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
  454. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/router.py +0 -0
  455. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
  456. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/service.py +0 -0
  457. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/store.py +0 -0
  458. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/settings/__init__.py +0 -0
  459. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/settings/base.py +0 -0
  460. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/settings/mixins.py +0 -0
  461. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sse/__init__.py +0 -0
  462. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sse/broker.py +0 -0
  463. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
  464. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
  465. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
  466. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/assets.py +0 -0
  467. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/attributes.py +0 -0
  468. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/page.py +0 -0
  469. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/response.py +0 -0
  470. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/webapp.py +0 -0
  471. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/storage/__init__.py +0 -0
  472. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
  473. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
  474. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/cron.py +0 -0
  475. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/dead_letter.py +0 -0
  476. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/manager.py +0 -0
  477. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/observability.py +0 -0
  478. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/oop.py +0 -0
  479. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/queue.py +0 -0
  480. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
  481. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/testing/__init__.py +0 -0
  482. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/testing/database.py +0 -0
  483. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/testing/factories.py +0 -0
  484. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/__init__.py +0 -0
  485. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
  486. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
  487. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/datetime.py +0 -0
  488. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/dict.py +0 -0
  489. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/download.py +0 -0
  490. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/email.py +0 -0
  491. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/fields.py +0 -0
  492. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/file_store.py +0 -0
  493. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/http_client.py +0 -0
  494. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/jwt.py +0 -0
  495. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/locations.py +0 -0
  496. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/log.py +0 -0
  497. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/metrics.py +0 -0
  498. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
  499. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/password.py +0 -0
  500. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/regex.py +0 -0
  501. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
  502. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/throttle.py +0 -0
  503. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/totp.py +0 -0
  504. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/upload.py +0 -0
  505. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/__init__.py +0 -0
  506. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/mapping.py +0 -0
  507. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/router.py +0 -0
  508. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/schemas.py +0 -0
  509. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
  510. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
  511. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/router.py +0 -0
  512. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
  513. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/service.py +0 -0
  514. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
  515. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/hub.py +0 -0
  516. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/router.py +0 -0
  517. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
  518. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/__init__.py +0 -0
  519. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/__init__.py +0 -0
  520. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_actions.py +0 -0
  521. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_audit_viewer.py +0 -0
  522. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_auth.py +0 -0
  523. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_autocomplete_fk.py +0 -0
  524. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_csv_import.py +0 -0
  525. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_dashboard_cards.py +0 -0
  526. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_discovery.py +0 -0
  527. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_forms.py +0 -0
  528. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_inlines.py +0 -0
  529. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_lenses.py +0 -0
  530. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_logs_nav.py +0 -0
  531. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_mfa.py +0 -0
  532. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_rbac.py +0 -0
  533. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_rich_filters.py +0 -0
  534. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_router.py +0 -0
  535. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_site.py +0 -0
  536. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_theme.py +0 -0
  537. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_upload_field.py +0 -0
  538. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_user_model.py +0 -0
  539. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_widgets_json_time.py +0 -0
  540. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/__init__.py +0 -0
  541. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_body_size.py +0 -0
  542. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_business_metrics.py +0 -0
  543. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_cookies.py +0 -0
  544. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_cors.py +0 -0
  545. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_csrf.py +0 -0
  546. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_dependencies_auth.py +0 -0
  547. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_error_docs.py +0 -0
  548. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_graceful.py +0 -0
  549. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_handlers.py +0 -0
  550. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_health_router.py +0 -0
  551. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_idempotency.py +0 -0
  552. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_jwt_dependency.py +0 -0
  553. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_logs_router.py +0 -0
  554. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_oauth.py +0 -0
  555. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_outbound_webhooks.py +0 -0
  556. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_prometheus.py +0 -0
  557. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_rate_limit.py +0 -0
  558. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_rate_limit_extras.py +0 -0
  559. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_request_id_middleware.py +0 -0
  560. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_response_cache.py +0 -0
  561. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_role_dependency.py +0 -0
  562. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_server.py +0 -0
  563. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_spa.py +0 -0
  564. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_static.py +0 -0
  565. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_tool_spec.py +0 -0
  566. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_tracing.py +0 -0
  567. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_webhooks.py +0 -0
  568. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_webhooks_rsa.py +0 -0
  569. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/__init__.py +0 -0
  570. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/support.py +0 -0
  571. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/test_actions.py +0 -0
  572. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/test_digest.py +0 -0
  573. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/test_registry.py +0 -0
  574. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/__init__.py +0 -0
  575. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_cookie_delivery.py +0 -0
  576. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_email_change.py +0 -0
  577. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_guards.py +0 -0
  578. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_introspection.py +0 -0
  579. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_locale.py +0 -0
  580. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_mfa.py +0 -0
  581. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_refresh.py +0 -0
  582. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_refresh_db.py +0 -0
  583. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_service.py +0 -0
  584. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/__init__.py +0 -0
  585. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/test_dependencies.py +0 -0
  586. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/test_permissions.py +0 -0
  587. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/__init__.py +0 -0
  588. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/test_decorator.py +0 -0
  589. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/test_invalidation.py +0 -0
  590. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/test_redis_manager.py +0 -0
  591. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/chat/__init__.py +0 -0
  592. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/chat/test_chat.py +0 -0
  593. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/checks/__init__.py +0 -0
  594. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/checks/test_check_config_cli.py +0 -0
  595. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/checks/test_checks.py +0 -0
  596. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/__init__.py +0 -0
  597. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_config.py +0 -0
  598. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_db.py +0 -0
  599. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_db_seed.py +0 -0
  600. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_docker_compose.py +0 -0
  601. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_dockerfile_spa.py +0 -0
  602. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_generate.py +0 -0
  603. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_lint_strictness.py +0 -0
  604. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_main.py +0 -0
  605. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_management_commands.py +0 -0
  606. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_openapi_errors.py +0 -0
  607. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_openapi_fix.py +0 -0
  608. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_secrets.py +0 -0
  609. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_user.py +0 -0
  610. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/conftest.py +0 -0
  611. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/controllers/__init__.py +0 -0
  612. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/controllers/test_base.py +0 -0
  613. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/controllers/test_generic_bounds.py +0 -0
  614. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/__init__.py +0 -0
  615. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_context.py +0 -0
  616. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_enums.py +0 -0
  617. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_logging.py +0 -0
  618. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_typed.py +0 -0
  619. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/__init__.py +0 -0
  620. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_alembic_hooks.py +0 -0
  621. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_audit.py +0 -0
  622. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_backup.py +0 -0
  623. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_bulk_ops.py +0 -0
  624. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_connection.py +0 -0
  625. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_eager_load.py +0 -0
  626. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_expressions.py +0 -0
  627. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_migrations.py +0 -0
  628. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_mixins.py +0 -0
  629. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_model.py +0 -0
  630. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_outbox.py +0 -0
  631. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_repository.py +0 -0
  632. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_safe_upgrade.py +0 -0
  633. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_signals.py +0 -0
  634. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_slow_query.py +0 -0
  635. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_tenant.py +0 -0
  636. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/__init__.py +0 -0
  637. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/test_exceptions.py +0 -0
  638. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/test_i18n.py +0 -0
  639. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/test_inherited_code_warning.py +0 -0
  640. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/flags/__init__.py +0 -0
  641. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/flags/test_flags.py +0 -0
  642. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/__init__.py +0 -0
  643. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/_eval/__init__.py +0 -0
  644. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/_eval/corpus.py +0 -0
  645. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/audio/__init__.py +0 -0
  646. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/audio/test_audio.py +0 -0
  647. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/audio/test_language.py +0 -0
  648. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/conftest.py +0 -0
  649. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_batching.py +0 -0
  650. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_chat_memory.py +0 -0
  651. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_embedding_cache_redis.py +0 -0
  652. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_embeddings.py +0 -0
  653. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_eval_harness.py +0 -0
  654. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_genai_metrics.py +0 -0
  655. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_generation_cache.py +0 -0
  656. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_generation_config.py +0 -0
  657. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_gpu_validation.py +0 -0
  658. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_hardware.py +0 -0
  659. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_hybrid.py +0 -0
  660. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_moderation.py +0 -0
  661. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_ollama.py +0 -0
  662. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_onnx_embed.py +0 -0
  663. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_pipeline.py +0 -0
  664. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_pipeline_integration.py +0 -0
  665. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_rag.py +0 -0
  666. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_refinements.py +0 -0
  667. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_rerank.py +0 -0
  668. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_router.py +0 -0
  669. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_structured.py +0 -0
  670. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_text.py +0 -0
  671. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_textgen_embed_metrics.py +0 -0
  672. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_tokens.py +0 -0
  673. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_tracing.py +0 -0
  674. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_vectorstore.py +0 -0
  675. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_vision_text.py +0 -0
  676. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/__init__.py +0 -0
  677. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_br.py +0 -0
  678. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_db.py +0 -0
  679. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_distance.py +0 -0
  680. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_estimate.py +0 -0
  681. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_geocoding.py +0 -0
  682. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_geometry.py +0 -0
  683. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_polyline.py +0 -0
  684. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_routing.py +0 -0
  685. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_routing_extra.py +0 -0
  686. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/__init__.py +0 -0
  687. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/conftest.py +0 -0
  688. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_generate.py +0 -0
  689. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_loader.py +0 -0
  690. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_naming.py +0 -0
  691. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_parse.py +0 -0
  692. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/__init__.py +0 -0
  693. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/test_broker.py +0 -0
  694. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/test_consumer.py +0 -0
  695. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/test_manager.py +0 -0
  696. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/reviews/__init__.py +0 -0
  697. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/reviews/test_reviews.py +0 -0
  698. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/__init__.py +0 -0
  699. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_base.py +0 -0
  700. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_cursor_pagination.py +0 -0
  701. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_errors.py +0 -0
  702. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_link_headers.py +0 -0
  703. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_pagination.py +0 -0
  704. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_response.py +0 -0
  705. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/services/__init__.py +0 -0
  706. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/services/test_base.py +0 -0
  707. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/services/test_file_mixin.py +0 -0
  708. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sessions/__init__.py +0 -0
  709. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sessions/test_sessions.py +0 -0
  710. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/settings/__init__.py +0 -0
  711. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/settings/test_base.py +0 -0
  712. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/settings/test_mixins.py +0 -0
  713. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sse/__init__.py +0 -0
  714. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sse/test_broker.py +0 -0
  715. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sse/test_event_stream.py +0 -0
  716. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/__init__.py +0 -0
  717. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_attributes.py +0 -0
  718. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_integration.py +0 -0
  719. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_page.py +0 -0
  720. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_response.py +0 -0
  721. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_webapp.py +0 -0
  722. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/storage/__init__.py +0 -0
  723. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/storage/test_minio_client.py +0 -0
  724. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/__init__.py +0 -0
  725. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_cron.py +0 -0
  726. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_dead_letter.py +0 -0
  727. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_manager.py +0 -0
  728. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_observability.py +0 -0
  729. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_oop.py +0 -0
  730. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_queue.py +0 -0
  731. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_scheduler.py +0 -0
  732. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/test_docs_api_guard.py +0 -0
  733. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/test_llmstxt.py +0 -0
  734. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/test_reference_coverage.py +0 -0
  735. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/testing/__init__.py +0 -0
  736. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/testing/test_database.py +0 -0
  737. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/testing/test_factories.py +0 -0
  738. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/__init__.py +0 -0
  739. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_client_ip.py +0 -0
  740. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_datetime.py +0 -0
  741. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_dict.py +0 -0
  742. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_download.py +0 -0
  743. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_email.py +0 -0
  744. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_fields.py +0 -0
  745. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_file_store.py +0 -0
  746. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_http_client.py +0 -0
  747. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_jwt.py +0 -0
  748. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_lazy_extras.py +0 -0
  749. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_locations.py +0 -0
  750. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_log.py +0 -0
  751. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_metrics.py +0 -0
  752. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_opaque_token.py +0 -0
  753. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_password.py +0 -0
  754. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_regex.py +0 -0
  755. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_storage_backends.py +0 -0
  756. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_throttle.py +0 -0
  757. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_upload.py +0 -0
  758. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/vision/__init__.py +0 -0
  759. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/vision/test_router.py +0 -0
  760. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/vision/test_vision.py +0 -0
  761. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/__init__.py +0 -0
  762. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_dispatcher.py +0 -0
  763. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_router.py +0 -0
  764. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_schemas.py +0 -0
  765. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_service.py +0 -0
  766. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/websockets/__init__.py +0 -0
  767. {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/websockets/test_hub_and_router.py +0 -0
@@ -5,6 +5,91 @@ 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.168.1] — 2026-07-26
9
+
10
+ Documentation navigation only — no code change, no API change.
11
+
12
+ ### Changed
13
+
14
+ - **Everything a reader scans to find a page is alphabetical now.** The recipe
15
+ list had grown to 53 entries in insertion order, which turns a lookup into a
16
+ full pass over the list. Sorted, accent- and case-insensitively:
17
+ - the `Receitas` / `Recipes` nav section (including the
18
+ `Exemplos completos` / `Complete examples` sub-section, itself at its
19
+ alphabetical position);
20
+ - both tables on the Recipes landing (`Tema`/`Theme` with all 53 recipes,
21
+ and the complete-examples table), each sorted in its own language;
22
+ - the themed groups of `docs/reference.md`, with
23
+ `## Superfície de topo` pinned first;
24
+ - the module table in `README.md`;
25
+ - the extras table in `docs/installation.md` + `.en.md`, with `[all]` last
26
+ because it is the catch-all, not an entry to look up.
27
+ - **English gets its own nav.** `mkdocs-static-i18n` translates labels but
28
+ cannot reorder a shared nav, so an alphabetical PT nav left the EN sidebar in
29
+ Portuguese order (`File in the service` before `Versioned artifacts` before
30
+ `Audit trail`). The `en` locale now declares a full `nav` of its own, sorted
31
+ in English. `nav_translations` stays for the labels the plugin still resolves.
32
+
33
+ The top-level tabs and the learning-project pages are deliberately **not**
34
+ alphabetical: they follow a reading order (install before tutorial, business
35
+ rules before endpoint map), where sorting would be the regression.
36
+
37
+ ### Added
38
+
39
+ - **`tests/test_nav_ordering.py`** — guards what the sweep above fixed: the two
40
+ navs cover the same pages (no page reachable in one language only), no page
41
+ is listed twice, the alphabetical sections are alphabetical in both
42
+ languages, and the Recipes landing tables are sorted. Eight tests; a swapped
43
+ entry fails them.
44
+
45
+ ## [0.168.0] — 2026-07-26
46
+
47
+ Permission guards gain injected metadata: one generic guard, a specific check
48
+ per call site.
49
+
50
+ ### Added
51
+
52
+ - **A guard may declare a second parameter `meta: dict[str, Any]`.** That is
53
+ what turns `manager_only` / `auditor_only` / `admin_only` into one
54
+ `has_role(user, meta)` whose call sites declare
55
+ `@requires(has_role, meta={"role": "manager"})`. One-parameter guards are
56
+ untouched — the second argument is passed only to guards that declare it, so
57
+ both shapes mix freely in the same decoration.
58
+ - **`requires(..., meta=...)`** — literal metadata, copied at decoration time,
59
+ so a later mutation of the passed mapping cannot change what the route
60
+ enforces. Must be a `Mapping[str, Any]`; anything else is a
61
+ `TempestPermissionError` at import.
62
+ - **`requires(..., include_args=True)`** — merges the arguments the decorated
63
+ function was called with into the same mapping, so an ownership guard reads
64
+ `meta["order_id"]` without the route handing it over. The user parameter is
65
+ excluded (the guard already receives it), a parameter the caller omitted
66
+ contributes its default so the guard sees the values the body will run with,
67
+ a default that is a framework injection marker (`Depends(...)`) is dropped
68
+ rather than passed as a value, and a `meta=` literal wins a name clash with
69
+ an argument — the decoration is the explicit declaration. The mapping is
70
+ fresh per call and shared by that call's guards, so one guard may write a key
71
+ the next one reads without anything leaking into the next request.
72
+ - **`guard_metadata(fn)`** — reads the `meta=` literals off a decorated
73
+ function, next to `declared_guards` / `guarded_user_param`. Exported from
74
+ `tempest_fastapi_sdk` and `tempest_fastapi_sdk.authz`.
75
+ - **Four static checks in `tempest permissions`:** `meta-unused` (error — the
76
+ decoration passes `meta=` / `include_args=True` but no guard declares a
77
+ second parameter; held back when a guard in that decoration could not be
78
+ resolved, since it may be the consumer), `guard-meta-missing` (warning — a
79
+ two-parameter guard whose decoration supplies no metadata reads an empty
80
+ dict), `guard-meta-annotation` (warning — the metadata parameter is annotated
81
+ as something that cannot hold a `dict[str, Any]`) and `meta-key-collision`
82
+ (warning — a `meta=` key shadows a parameter name under `include_args=True`,
83
+ so that argument never reaches the guard).
84
+
85
+ ### Changed
86
+
87
+ - **`guard-arity` accepts one or two required parameters.** A guard taking
88
+ `(user, meta)` used to be rejected at import (`expected 1 (user)`); the
89
+ contract is now one *or* two, and the message reads
90
+ `expected 1 (user) or 2 (user, meta)`. Three or more is still an error. No
91
+ existing single-parameter guard changes behavior.
92
+
8
93
  ## [0.167.2] — 2026-07-26
9
94
 
10
95
  Documentation layout only — no code change, no API change.
@@ -92,7 +92,15 @@ The SDK currently covers (Sep 2025+, post-v0.31.x):
92
92
  `guard-unresolved` (ambiguous or out-of-scope guard reported, never guessed).
93
93
  `openapi-errors` follows the guards, so their exceptions land in
94
94
  `error_responses(...)`. `declared_guards`/`guarded_user_param` introspect a
95
- route. Recipe: `docs/recipes/permission-guards.md`.
95
+ route. **Metadata (v0.168.0):** a guard may declare a 2nd param
96
+ `meta: dict[str, Any]` — `meta={...}` literals fixed at decoration plus
97
+ `include_args=True` merging the call's args (user excluded, omitted params
98
+ contribute defaults, `Depends(...)` markers dropped, `meta=` wins a name
99
+ clash); one-param guards untouched; `TempestPermissionError` when `meta=`
100
+ isn't a mapping or nothing consumes it; `guard_metadata(fn)` reads the
101
+ literals; new static codes `meta-unused` (error), `guard-meta-missing`/
102
+ `guard-meta-annotation`/`meta-key-collision` (warnings). Recipe:
103
+ `docs/recipes/permission-guards.md`.
96
104
  - **DB** — `AsyncDatabaseManager`, `BaseRepository[T]` with
97
105
  bulk ops (`bulk_create_values`, `bulk_upsert`, `bulk_update`,
98
106
  `add_all`, etc.), `AlembicHelper`, `BaseModel`, audit /
@@ -483,6 +491,18 @@ business need, not from a stale list. Keep this honest, not aspirational.
483
491
  the same PR — this drifts easily (it happened for both the admin
484
492
  tiers and the genai roadmap). Add `# docs-guard: skip` to a doc block
485
493
  only for an intentionally non-parseable fragment.
494
+ - **Navegação e índices em ordem alfabética.** A seção `Receitas` do
495
+ `nav` (e a subseção `Exemplos completos`), as tabelas da landing de
496
+ receitas, os grupos temáticos de `docs/reference.md`, a tabela de
497
+ módulos do README e a de extras da instalação são ordenadas
498
+ alfabeticamente (case/acento-insensível; `[all]` fica por último por
499
+ ser catch-all). O `mkdocs-static-i18n` **não** reordena nav por
500
+ idioma, então o locale `en` declara um `nav` próprio já ordenado em
501
+ inglês — mexer em um nav exige mexer no outro.
502
+ `tests/test_nav_ordering.py` falha se algo sair de ordem, se um nav
503
+ ganhar página que o outro não tem, ou se uma página aparecer duas
504
+ vezes. Abas de topo e páginas de `learning/` seguem ordem didática,
505
+ não alfabética — de propósito.
486
506
  - **No emojis in code or docs** unless the user explicitly asks.
487
507
  - **Bilingual docs.** Every page lives twice: `docs/<page>.md`
488
508
  (PT-BR, default) and `docs/<page>.en.md` (EN-US). The MkDocs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tempest-fastapi-sdk
3
- Version: 0.167.2
3
+ Version: 0.168.1
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
@@ -295,37 +295,37 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
295
295
 
296
296
  | Module | Exports |
297
297
  | --- | --- |
298
- | `tempest_fastapi_sdk.openapi` | `generate_integration`, `load_spec`, `parse_spec`, `emit_schemas`, `emit_client`, `GenerationResult`, `default_output_dir`, `SpecError`, `SpecIR` / `SchemaIR` / `FieldIR` / `ClientIR` / `OperationIR` / `ParameterIR` — backs `tempest openapi-client`, which generates Pydantic schemas + a typed HTTP client from a third party's OpenAPI spec *(YAML needs the `[openapi]` extra)* |
299
- | `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
300
- | `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
301
- | `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
302
- | `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
298
+ | `tempest_fastapi_sdk.admin` *(extra: `[admin]`)* | `AdminSite`, `AdminModel` (incl. `audit_model=...` for a per-row audit-history timeline, `autocomplete_fields=[...]` for HTMX-searched FK inputs, `inlines=[Inline(...)]` for 1-N children on the detail view, `Inline(editable=True, can_delete=True)` for in-place formset editing of those children), `Inline`, dashboard business-metric cards (`AdminSite(dashboard_cards=[...])`: `MetricCard` + `MetricValue` / `MetricTrend` / `MetricPartition`), CSV import (`AdminModel(can_import=True)`), granular RBAC (`make_admin_router(access_policy=...)` + `AdminPermission`), lenses (`AdminModel(lenses=[Lens(...)])` saved list presets), JSON + time field widgets, `make_admin_router`, `AdminAuthBackend`, `UserModelAuthBackend`, `AdminAuthError` |
303
299
  | `tempest_fastapi_sdk.api` | `register_exception_handlers`, `app_exception_handler`, OpenAPI error docs (`error_responses`, `raises`, `TempestAPIRouter`, `RaisesSpec`, `declared_raises`), `apply_cors`, `make_health_router`, `make_logs_router`, `make_prometheus_router`, `make_prometheus_registry`, `PrometheusMiddleware`, `BusinessMetrics`, `LogSource`, `make_tool_spec_router`, `make_token_dependency`, `make_bearer_token_dependency`, `make_jwt_user_dependency`, `make_role_dependency`, `make_permission_dependency`, `require_x_token`, `run_server`, `RequestIDMiddleware`, `RateLimitMiddleware` (+ `RateLimitStore`/`MemoryRateLimitStore`/`RedisRateLimitStore`/`RateLimitResult` and `key_by_ip`/`key_by_jwt_subject`/`key_by_jwt_claim`/`key_by_header`), `IdempotencyMiddleware`, `MemoryIdempotencyStore`, `RedisIdempotencyStore`, `BodySizeLimitMiddleware`, `CSRFMiddleware`, `make_csrf_token_dependency`, `GracefulShutdownMiddleware`, `WebhookSignatureVerifier`, `RSAWebhookSignatureVerifier`, outbound `WebhookSender` (+ `WebhookDelivery`), OAuth2 (`GoogleOAuthClient`, `GitHubOAuthClient`, `OIDCProvider`), `HardenedStaticFiles`, `DEFAULT_STATIC_SECURITY_HEADERS`, `make_spa_router` (serve a compiled React/Vite SPA with a client-side fallback), `set_cookie`, `clear_cookie`, `SameSite`, `HealthCheck`, `setup_tracing` *(extra: `[otel]`)* |
304
300
  | `tempest_fastapi_sdk.auth` *(extra: `[auth]`, opcional `[email]`, `[mfa]`)* | `UserAuthService`, `make_auth_router`, `SignupSchema` / `LoginSchema` / `RefreshSchema` / `PasswordResetRequestSchema` / `PasswordResetConfirmSchema` + responses, `ActivationToken`, `PasswordResetToken`, email change/verify/recovery (`EmailChangeRequestSchema` / `EmailChangeConfirmSchema` / `EmailRecoveryRequestSchema` / `EmailChangeToken` / `EmailVerificationToken`, old-email security notice, opt-in `AUTH_EMAIL_RECOVERY_ENABLED`), MFA schemas (`MFAEnrollResponseSchema` / `MFAConfirmSchema` / `MFAVerifySchema` / `MFADisableSchema`), opt-in DB-backed refresh tokens (`BaseUserRefreshTokenModel` / `make_user_refresh_token_model` / `LogoutSchema`) with rotation + reuse detection + `POST /auth/logout`, bilingual emails + backend pages (`AUTH_DEFAULT_LOCALE`, `normalize_locale` / `negotiate_locale`) — signup/activate/login/refresh/logout/reset + email change/recovery + TOTP 2FA out of the box |
305
- | `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param`, `TempestPermissionError`, `GuardContractWarning` |
301
+ | `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, optional `meta: dict[str, Any]` second parameter via `meta=` / `include_args=`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param` / `guard_metadata`, `TempestPermissionError`, `GuardContractWarning` |
302
+ | `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
303
+ | `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
306
304
  | `tempest_fastapi_sdk.checks` | System checks (Django-style config validation): `check` (register decorator), `run_checks` / `run_system_checks` (raises `SystemCheckError` on ERROR+), `CheckMessage` / `CheckLevel` + `debug`/`info`/`warning`/`error`/`critical`, `CheckRegistry` / `default_registry`; built-in settings checks + the `tempest check-config` CLI (auto-detects settings, `--tag` / `--fail-level`) |
305
+ | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `check-config` (validate settings via the system-check framework), `version` / `--version`; plus project-registered management commands (`tempest <cmd>` from `src/commands.py` or `[tool.tempest] commands`) |
307
306
  | `tempest_fastapi_sdk.controllers` | `BaseController` |
308
- | `tempest_fastapi_sdk.services` | `BaseService` |
309
307
  | `tempest_fastapi_sdk.core` | `configure_logging`, `JSONFormatter`, `get_request_id`/`set_request_id`/`clear_request_id`, `request_id_ctx`, `BaseStrEnum`, `BaseIntEnum`, `Locale` (BCP-47 locale enum), `strict_types`/`typed`/`require_annotations` |
310
- | `tempest_fastapi_sdk.admin` *(extra: `[admin]`)* | `AdminSite`, `AdminModel` (incl. `audit_model=...` for a per-row audit-history timeline, `autocomplete_fields=[...]` for HTMX-searched FK inputs, `inlines=[Inline(...)]` for 1-N children on the detail view, `Inline(editable=True, can_delete=True)` for in-place formset editing of those children), `Inline`, dashboard business-metric cards (`AdminSite(dashboard_cards=[...])`: `MetricCard` + `MetricValue` / `MetricTrend` / `MetricPartition`), CSV import (`AdminModel(can_import=True)`), granular RBAC (`make_admin_router(access_policy=...)` + `AdminPermission`), lenses (`AdminModel(lenses=[Lens(...)])` saved list presets), JSON + time field widgets, `make_admin_router`, `AdminAuthBackend`, `UserModelAuthBackend`, `AdminAuthError` |
311
- | `tempest_fastapi_sdk.sse` | `EventStream` (bounded queue + `overflow` backpressure), `SSEBroker` (multi-worker fan-out via Redis, `.response()` lifecycle helper), `ServerSentEvent`, `sse_response` (`on_disconnect=` cleanup) |
312
- | `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
308
+ | `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
309
+ | `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
313
310
  | `tempest_fastapi_sdk.flags` | `FeatureFlags`, `FeatureFlagBackend`, `MemoryFeatureFlagBackend`, `EnvFeatureFlagBackend`, `RedisFeatureFlagBackend`, `CompositeFeatureFlagBackend`, `make_flag_dependency`, `coerce_flag` |
314
- | `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
315
- | `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
316
- | `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
317
- | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
318
- | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
319
- | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
320
- | `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
321
311
  | `tempest_fastapi_sdk.genai` *(extra: `[genai]`; capacity check imports without it)* | Self-hosted GenAI: capacity check (`probe_hardware`/`HardwareInfo`, `can_run`/`recommend`/`CapacityReport`, `estimate_model_bytes`/`fetch_num_params`, `ModelDtype`); local LLM `TextGenerator` (`generate`/`chat`/`stream`, typed `GenerationConfig`, int4/int8 quant, lazy load + idle unload); `Embedder` (+ `EmbeddingCache`/`InMemoryEmbeddingCache`/`RedisEmbeddingCache`/`AsyncEmbeddingCache`, `normalize=`) + `cosine_similarity`, `BatchScheduler` (coalesce concurrent calls), `ModelRegistry` (LRU model sharing); `make_genai_router` (opt-in endpoints — `/generate`+SSE, `/chat`, `/embed`, `/rag`, `/transcribe`, `/tts`); `resolve_device`/`auto_dtype_name`; **tool calling** (`TextGenerator.chat_with_tools` / `OllamaGenerator.chat_with_tools`) + **structured output** (`generate_structured` — Ollama `format=`, transformers `lm-format-enforcer` via `[genai-structured]`; `parse_structured`); **`VisionTextGenerator`** (local VLM, `[genai-vlm]`); **`OnnxEmbedder`** (torch-free embeddings, `[genai-onnx]`); **generation cache** (`InMemoryGenerationCache`/`RedisGenerationCache`, deterministic-only) via `generation_cache=`; **token/context** (`count_tokens`/`count_message_tokens`/`truncate_messages`); **`GenAIMetrics`** (Prometheus request/latency/token metrics, `[prometheus]`); **moderation** (`RuleModerator`/`ClassifierModerator` + `ModerationResult`); Ollama backend (`[genai-ollama]`) — `OllamaGenerator`/`OllamaEmbedder` (HTTP, no torch) behind the `TextBackend` protocol, drop-in for `make_genai_router`/`Retriever`, plus vision (`generate(images=…)`); **`AIChatPipeline`** (memory recall → web-search augment → generate w/ bounded tool-calling loop → TTS → memory index) + `Tool` + `make_ai_chat_router` (`POST /chat` + `/chat/stream` SSE) |
322
- | `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
323
- | `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
324
312
  | `tempest_fastapi_sdk.genai.rag` *(extra: `[genai-rag]`)* | RAG context for local LLMs: `WebSearch` (`.retrieve` one-shot search→extract→context) / `SearxngBackend` / `WebSearchBackend` + `SearchResult`, `ContentExtractor` (trafilatura, `.extract_many` concurrent), `PdfReader` (PyMuPDF) + `Document`/`Chunk`/`PdfPage`, `chunk_text`, `build_context`; corpus RAG — `Retriever` + `VectorStore`/`InMemoryVectorStore`/`PgVectorStore` (pgvector)/`ChromaVectorStore` (`[genai-chroma]`); **`Reranker`** (cross-encoder second stage) + **`HybridRetriever`** (BM25 + dense, `reciprocal_rank_fusion`, `rank-bm25`); long-term chat memory — `ChatMemory` (recency-aware, per-user, Chroma-backed) + `MemoryHit`; audio (`[genai-audio]`) — `SpeechToText` (faster-whisper, `beam_size`/`vad_filter`/`language_probability`) + `TextToSpeech` (Coqui TTS) + `Transcription` |
325
313
  | `tempest_fastapi_sdk.geo` *(extra: `[geo]`; offline layers import without it)* | Geolocation without a paid API: `haversine_km`, `estimate_travel` (offline road distance + per-mode time), offline geometry (`bounding_box`, `within_radius`, `nearest`, `initial_bearing`, `destination_point`, `point_in_polygon`, `polygon_area_km2`, `path_length_km`), DB radius search (`GeoPointMixin` + `GeoRepositoryMixin`/`PostGISRepositoryMixin`, `make_geo_point_model`), routing (`OSRMBackend`/`RoutingBackend` — `route` + `route(with_geometry=True)` + `matrix`, per-mode profiles), geocoding (`NominatimBackend`/`GeocodingBackend`), polyline codec (`encode_polyline`/`decode_polyline`), Brazil (`uf_centroid`/`UF_CENTROIDS`, `cep_to_coordinate`); `Coordinate`/`TravelEstimate`/`TravelMode` (car/motorcycle/bus/bicycle/pedestrian)/`BoundingBox`/`GeocodeResult`/`DistanceMatrix` |
314
+ | `tempest_fastapi_sdk.openapi` | `generate_integration`, `load_spec`, `parse_spec`, `emit_schemas`, `emit_client`, `GenerationResult`, `default_output_dir`, `SpecError`, `SpecIR` / `SchemaIR` / `FieldIR` / `ClientIR` / `OperationIR` / `ParameterIR` — backs `tempest openapi-client`, which generates Pydantic schemas + a typed HTTP client from a third party's OpenAPI spec *(YAML needs the `[openapi]` extra)* |
315
+ | `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
316
+ | `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
317
+ | `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
318
+ | `tempest_fastapi_sdk.services` | `BaseService` |
319
+ | `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
320
+ | `tempest_fastapi_sdk.sse` | `EventStream` (bounded queue + `overflow` backpressure), `SSEBroker` (multi-worker fan-out via Redis, `.response()` lifecycle helper), `ServerSentEvent`, `sse_response` (`on_disconnect=` cleanup) |
326
321
  | `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN); `htmx()` / `aria()` / `data()` (typed builders for the `hx-*` / `aria-*` / `data-*` `attrs` map); `make_web_app_router` (serve a compiled static/wasm `tempestweb build` as a router, SPA history fallback), `build_web_app` (host a server-mode build as a WS/SSE sub-app), `detect_build_mode` |
322
+ | `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
323
+ | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
327
324
  | `tempest_fastapi_sdk.utils` | `to_utc`, `utcnow`, `modify_dict`, `LogUtils`, `AttemptThrottle`/`ThrottleBackend`/`ThrottleStatus`, `generate_opaque_token`/`hash_opaque_token`/`verify_opaque_token`, `get_client_ip`/`get_client_ip_from_scope`, `PasswordUtils` *(extra: `[auth]`)*, `JWTUtils` *(extra: `[auth]`)*, `TOTPHelper` *(extra: `[mfa]`)*, `EmailUtils` *(extra: `[email]`)*, `UploadUtils`/`sniff_mime` *(extra: `[upload]`)*, `DownloadUtils`/`build_content_disposition` *(no extra)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatingField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`, `LocaleField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `PixKeyField` — old names without the suffix kept as deprecated aliases — `PixKeyType`/`detect_pix_key_type`/`is_valid_pix_key`, `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
328
- | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `check-config` (validate settings via the system-check framework), `version` / `--version`; plus project-registered management commands (`tempest <cmd>` from `src/commands.py` or `[tool.tempest] commands`) |
325
+ | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
326
+ | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
327
+ | `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
328
+ | `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
329
329
 
330
330
  Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision`, `tempest_fastapi_sdk.genai` and `tempest_fastapi_sdk.ssr` — plus the domain modules `tempest_fastapi_sdk.chat` and `tempest_fastapi_sdk.reviews` — must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
331
331
 
@@ -4169,6 +4169,27 @@ async def delete_order(
4169
4169
 
4170
4170
  The user parameter is found by annotation (`user_param=` breaks a tie), and a guard's non-`None` return replaces the user the body sees — which is how `require_active` narrows `UserT | None` to `UserT`.
4171
4171
 
4172
+ A guard may declare a second parameter to receive a `dict[str, Any]` of metadata, which is what turns one generic guard into a specific check per call site — `meta=` carries literals fixed at decoration, `include_args=True` merges the call's own arguments:
4173
+
4174
+ ```python
4175
+ def has_role(user: UserModel, meta: dict[str, Any]) -> UserModel:
4176
+ """Deny unless the user holds the role the route declared."""
4177
+ if meta["role"] not in user.roles:
4178
+ raise MissingRoleException(role=meta["role"])
4179
+ return user
4180
+
4181
+
4182
+ @requires(has_role, meta={"role": "manager"})
4183
+ async def close_month(user: UserModel = Depends(get_current_user)) -> None: ...
4184
+
4185
+
4186
+ @requires(order_owner, include_args=True) # guard reads meta["order_id"]
4187
+ async def delete_order(
4188
+ order_id: UUID,
4189
+ user: UserModel = Depends(get_current_user),
4190
+ ) -> None: ...
4191
+ ```
4192
+
4172
4193
  Misuse is caught in three places: `TempestPermissionError` at import time (no guard, wrong arity, `async` guard on a sync function, no user parameter), `GuardContractWarning` at call time (a guard raising outside the `AppException` hierarchy, or returning `False` instead of denying), and `tempest permissions --check` in CI, which reads the same contract statically.
4173
4194
 
4174
4195
  ```bash
@@ -149,37 +149,37 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
149
149
 
150
150
  | Module | Exports |
151
151
  | --- | --- |
152
- | `tempest_fastapi_sdk.openapi` | `generate_integration`, `load_spec`, `parse_spec`, `emit_schemas`, `emit_client`, `GenerationResult`, `default_output_dir`, `SpecError`, `SpecIR` / `SchemaIR` / `FieldIR` / `ClientIR` / `OperationIR` / `ParameterIR` — backs `tempest openapi-client`, which generates Pydantic schemas + a typed HTTP client from a third party's OpenAPI spec *(YAML needs the `[openapi]` extra)* |
153
- | `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
154
- | `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
155
- | `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
156
- | `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
152
+ | `tempest_fastapi_sdk.admin` *(extra: `[admin]`)* | `AdminSite`, `AdminModel` (incl. `audit_model=...` for a per-row audit-history timeline, `autocomplete_fields=[...]` for HTMX-searched FK inputs, `inlines=[Inline(...)]` for 1-N children on the detail view, `Inline(editable=True, can_delete=True)` for in-place formset editing of those children), `Inline`, dashboard business-metric cards (`AdminSite(dashboard_cards=[...])`: `MetricCard` + `MetricValue` / `MetricTrend` / `MetricPartition`), CSV import (`AdminModel(can_import=True)`), granular RBAC (`make_admin_router(access_policy=...)` + `AdminPermission`), lenses (`AdminModel(lenses=[Lens(...)])` saved list presets), JSON + time field widgets, `make_admin_router`, `AdminAuthBackend`, `UserModelAuthBackend`, `AdminAuthError` |
157
153
  | `tempest_fastapi_sdk.api` | `register_exception_handlers`, `app_exception_handler`, OpenAPI error docs (`error_responses`, `raises`, `TempestAPIRouter`, `RaisesSpec`, `declared_raises`), `apply_cors`, `make_health_router`, `make_logs_router`, `make_prometheus_router`, `make_prometheus_registry`, `PrometheusMiddleware`, `BusinessMetrics`, `LogSource`, `make_tool_spec_router`, `make_token_dependency`, `make_bearer_token_dependency`, `make_jwt_user_dependency`, `make_role_dependency`, `make_permission_dependency`, `require_x_token`, `run_server`, `RequestIDMiddleware`, `RateLimitMiddleware` (+ `RateLimitStore`/`MemoryRateLimitStore`/`RedisRateLimitStore`/`RateLimitResult` and `key_by_ip`/`key_by_jwt_subject`/`key_by_jwt_claim`/`key_by_header`), `IdempotencyMiddleware`, `MemoryIdempotencyStore`, `RedisIdempotencyStore`, `BodySizeLimitMiddleware`, `CSRFMiddleware`, `make_csrf_token_dependency`, `GracefulShutdownMiddleware`, `WebhookSignatureVerifier`, `RSAWebhookSignatureVerifier`, outbound `WebhookSender` (+ `WebhookDelivery`), OAuth2 (`GoogleOAuthClient`, `GitHubOAuthClient`, `OIDCProvider`), `HardenedStaticFiles`, `DEFAULT_STATIC_SECURITY_HEADERS`, `make_spa_router` (serve a compiled React/Vite SPA with a client-side fallback), `set_cookie`, `clear_cookie`, `SameSite`, `HealthCheck`, `setup_tracing` *(extra: `[otel]`)* |
158
154
  | `tempest_fastapi_sdk.auth` *(extra: `[auth]`, opcional `[email]`, `[mfa]`)* | `UserAuthService`, `make_auth_router`, `SignupSchema` / `LoginSchema` / `RefreshSchema` / `PasswordResetRequestSchema` / `PasswordResetConfirmSchema` + responses, `ActivationToken`, `PasswordResetToken`, email change/verify/recovery (`EmailChangeRequestSchema` / `EmailChangeConfirmSchema` / `EmailRecoveryRequestSchema` / `EmailChangeToken` / `EmailVerificationToken`, old-email security notice, opt-in `AUTH_EMAIL_RECOVERY_ENABLED`), MFA schemas (`MFAEnrollResponseSchema` / `MFAConfirmSchema` / `MFAVerifySchema` / `MFADisableSchema`), opt-in DB-backed refresh tokens (`BaseUserRefreshTokenModel` / `make_user_refresh_token_model` / `LogoutSchema`) with rotation + reuse detection + `POST /auth/logout`, bilingual emails + backend pages (`AUTH_DEFAULT_LOCALE`, `normalize_locale` / `negotiate_locale`) — signup/activate/login/refresh/logout/reset + email change/recovery + TOTP 2FA out of the box |
159
- | `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param`, `TempestPermissionError`, `GuardContractWarning` |
155
+ | `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, optional `meta: dict[str, Any]` second parameter via `meta=` / `include_args=`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param` / `guard_metadata`, `TempestPermissionError`, `GuardContractWarning` |
156
+ | `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
157
+ | `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
160
158
  | `tempest_fastapi_sdk.checks` | System checks (Django-style config validation): `check` (register decorator), `run_checks` / `run_system_checks` (raises `SystemCheckError` on ERROR+), `CheckMessage` / `CheckLevel` + `debug`/`info`/`warning`/`error`/`critical`, `CheckRegistry` / `default_registry`; built-in settings checks + the `tempest check-config` CLI (auto-detects settings, `--tag` / `--fail-level`) |
159
+ | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `check-config` (validate settings via the system-check framework), `version` / `--version`; plus project-registered management commands (`tempest <cmd>` from `src/commands.py` or `[tool.tempest] commands`) |
161
160
  | `tempest_fastapi_sdk.controllers` | `BaseController` |
162
- | `tempest_fastapi_sdk.services` | `BaseService` |
163
161
  | `tempest_fastapi_sdk.core` | `configure_logging`, `JSONFormatter`, `get_request_id`/`set_request_id`/`clear_request_id`, `request_id_ctx`, `BaseStrEnum`, `BaseIntEnum`, `Locale` (BCP-47 locale enum), `strict_types`/`typed`/`require_annotations` |
164
- | `tempest_fastapi_sdk.admin` *(extra: `[admin]`)* | `AdminSite`, `AdminModel` (incl. `audit_model=...` for a per-row audit-history timeline, `autocomplete_fields=[...]` for HTMX-searched FK inputs, `inlines=[Inline(...)]` for 1-N children on the detail view, `Inline(editable=True, can_delete=True)` for in-place formset editing of those children), `Inline`, dashboard business-metric cards (`AdminSite(dashboard_cards=[...])`: `MetricCard` + `MetricValue` / `MetricTrend` / `MetricPartition`), CSV import (`AdminModel(can_import=True)`), granular RBAC (`make_admin_router(access_policy=...)` + `AdminPermission`), lenses (`AdminModel(lenses=[Lens(...)])` saved list presets), JSON + time field widgets, `make_admin_router`, `AdminAuthBackend`, `UserModelAuthBackend`, `AdminAuthError` |
165
- | `tempest_fastapi_sdk.sse` | `EventStream` (bounded queue + `overflow` backpressure), `SSEBroker` (multi-worker fan-out via Redis, `.response()` lifecycle helper), `ServerSentEvent`, `sse_response` (`on_disconnect=` cleanup) |
166
- | `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
162
+ | `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
163
+ | `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
167
164
  | `tempest_fastapi_sdk.flags` | `FeatureFlags`, `FeatureFlagBackend`, `MemoryFeatureFlagBackend`, `EnvFeatureFlagBackend`, `RedisFeatureFlagBackend`, `CompositeFeatureFlagBackend`, `make_flag_dependency`, `coerce_flag` |
168
- | `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
169
- | `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
170
- | `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
171
- | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
172
- | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
173
- | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
174
- | `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
175
165
  | `tempest_fastapi_sdk.genai` *(extra: `[genai]`; capacity check imports without it)* | Self-hosted GenAI: capacity check (`probe_hardware`/`HardwareInfo`, `can_run`/`recommend`/`CapacityReport`, `estimate_model_bytes`/`fetch_num_params`, `ModelDtype`); local LLM `TextGenerator` (`generate`/`chat`/`stream`, typed `GenerationConfig`, int4/int8 quant, lazy load + idle unload); `Embedder` (+ `EmbeddingCache`/`InMemoryEmbeddingCache`/`RedisEmbeddingCache`/`AsyncEmbeddingCache`, `normalize=`) + `cosine_similarity`, `BatchScheduler` (coalesce concurrent calls), `ModelRegistry` (LRU model sharing); `make_genai_router` (opt-in endpoints — `/generate`+SSE, `/chat`, `/embed`, `/rag`, `/transcribe`, `/tts`); `resolve_device`/`auto_dtype_name`; **tool calling** (`TextGenerator.chat_with_tools` / `OllamaGenerator.chat_with_tools`) + **structured output** (`generate_structured` — Ollama `format=`, transformers `lm-format-enforcer` via `[genai-structured]`; `parse_structured`); **`VisionTextGenerator`** (local VLM, `[genai-vlm]`); **`OnnxEmbedder`** (torch-free embeddings, `[genai-onnx]`); **generation cache** (`InMemoryGenerationCache`/`RedisGenerationCache`, deterministic-only) via `generation_cache=`; **token/context** (`count_tokens`/`count_message_tokens`/`truncate_messages`); **`GenAIMetrics`** (Prometheus request/latency/token metrics, `[prometheus]`); **moderation** (`RuleModerator`/`ClassifierModerator` + `ModerationResult`); Ollama backend (`[genai-ollama]`) — `OllamaGenerator`/`OllamaEmbedder` (HTTP, no torch) behind the `TextBackend` protocol, drop-in for `make_genai_router`/`Retriever`, plus vision (`generate(images=…)`); **`AIChatPipeline`** (memory recall → web-search augment → generate w/ bounded tool-calling loop → TTS → memory index) + `Tool` + `make_ai_chat_router` (`POST /chat` + `/chat/stream` SSE) |
176
- | `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
177
- | `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
178
166
  | `tempest_fastapi_sdk.genai.rag` *(extra: `[genai-rag]`)* | RAG context for local LLMs: `WebSearch` (`.retrieve` one-shot search→extract→context) / `SearxngBackend` / `WebSearchBackend` + `SearchResult`, `ContentExtractor` (trafilatura, `.extract_many` concurrent), `PdfReader` (PyMuPDF) + `Document`/`Chunk`/`PdfPage`, `chunk_text`, `build_context`; corpus RAG — `Retriever` + `VectorStore`/`InMemoryVectorStore`/`PgVectorStore` (pgvector)/`ChromaVectorStore` (`[genai-chroma]`); **`Reranker`** (cross-encoder second stage) + **`HybridRetriever`** (BM25 + dense, `reciprocal_rank_fusion`, `rank-bm25`); long-term chat memory — `ChatMemory` (recency-aware, per-user, Chroma-backed) + `MemoryHit`; audio (`[genai-audio]`) — `SpeechToText` (faster-whisper, `beam_size`/`vad_filter`/`language_probability`) + `TextToSpeech` (Coqui TTS) + `Transcription` |
179
167
  | `tempest_fastapi_sdk.geo` *(extra: `[geo]`; offline layers import without it)* | Geolocation without a paid API: `haversine_km`, `estimate_travel` (offline road distance + per-mode time), offline geometry (`bounding_box`, `within_radius`, `nearest`, `initial_bearing`, `destination_point`, `point_in_polygon`, `polygon_area_km2`, `path_length_km`), DB radius search (`GeoPointMixin` + `GeoRepositoryMixin`/`PostGISRepositoryMixin`, `make_geo_point_model`), routing (`OSRMBackend`/`RoutingBackend` — `route` + `route(with_geometry=True)` + `matrix`, per-mode profiles), geocoding (`NominatimBackend`/`GeocodingBackend`), polyline codec (`encode_polyline`/`decode_polyline`), Brazil (`uf_centroid`/`UF_CENTROIDS`, `cep_to_coordinate`); `Coordinate`/`TravelEstimate`/`TravelMode` (car/motorcycle/bus/bicycle/pedestrian)/`BoundingBox`/`GeocodeResult`/`DistanceMatrix` |
168
+ | `tempest_fastapi_sdk.openapi` | `generate_integration`, `load_spec`, `parse_spec`, `emit_schemas`, `emit_client`, `GenerationResult`, `default_output_dir`, `SpecError`, `SpecIR` / `SchemaIR` / `FieldIR` / `ClientIR` / `OperationIR` / `ParameterIR` — backs `tempest openapi-client`, which generates Pydantic schemas + a typed HTTP client from a third party's OpenAPI spec *(YAML needs the `[openapi]` extra)* |
169
+ | `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
170
+ | `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
171
+ | `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
172
+ | `tempest_fastapi_sdk.services` | `BaseService` |
173
+ | `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
174
+ | `tempest_fastapi_sdk.sse` | `EventStream` (bounded queue + `overflow` backpressure), `SSEBroker` (multi-worker fan-out via Redis, `.response()` lifecycle helper), `ServerSentEvent`, `sse_response` (`on_disconnect=` cleanup) |
180
175
  | `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN); `htmx()` / `aria()` / `data()` (typed builders for the `hx-*` / `aria-*` / `data-*` `attrs` map); `make_web_app_router` (serve a compiled static/wasm `tempestweb build` as a router, SPA history fallback), `build_web_app` (host a server-mode build as a WS/SSE sub-app), `detect_build_mode` |
176
+ | `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
177
+ | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
181
178
  | `tempest_fastapi_sdk.utils` | `to_utc`, `utcnow`, `modify_dict`, `LogUtils`, `AttemptThrottle`/`ThrottleBackend`/`ThrottleStatus`, `generate_opaque_token`/`hash_opaque_token`/`verify_opaque_token`, `get_client_ip`/`get_client_ip_from_scope`, `PasswordUtils` *(extra: `[auth]`)*, `JWTUtils` *(extra: `[auth]`)*, `TOTPHelper` *(extra: `[mfa]`)*, `EmailUtils` *(extra: `[email]`)*, `UploadUtils`/`sniff_mime` *(extra: `[upload]`)*, `DownloadUtils`/`build_content_disposition` *(no extra)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatingField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`, `LocaleField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `PixKeyField` — old names without the suffix kept as deprecated aliases — `PixKeyType`/`detect_pix_key_type`/`is_valid_pix_key`, `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
182
- | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `check-config` (validate settings via the system-check framework), `version` / `--version`; plus project-registered management commands (`tempest <cmd>` from `src/commands.py` or `[tool.tempest] commands`) |
179
+ | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
180
+ | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
181
+ | `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
182
+ | `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
183
183
 
184
184
  Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision`, `tempest_fastapi_sdk.genai` and `tempest_fastapi_sdk.ssr` — plus the domain modules `tempest_fastapi_sdk.chat` and `tempest_fastapi_sdk.reviews` — must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
185
185
 
@@ -4023,6 +4023,27 @@ async def delete_order(
4023
4023
 
4024
4024
  The user parameter is found by annotation (`user_param=` breaks a tie), and a guard's non-`None` return replaces the user the body sees — which is how `require_active` narrows `UserT | None` to `UserT`.
4025
4025
 
4026
+ A guard may declare a second parameter to receive a `dict[str, Any]` of metadata, which is what turns one generic guard into a specific check per call site — `meta=` carries literals fixed at decoration, `include_args=True` merges the call's own arguments:
4027
+
4028
+ ```python
4029
+ def has_role(user: UserModel, meta: dict[str, Any]) -> UserModel:
4030
+ """Deny unless the user holds the role the route declared."""
4031
+ if meta["role"] not in user.roles:
4032
+ raise MissingRoleException(role=meta["role"])
4033
+ return user
4034
+
4035
+
4036
+ @requires(has_role, meta={"role": "manager"})
4037
+ async def close_month(user: UserModel = Depends(get_current_user)) -> None: ...
4038
+
4039
+
4040
+ @requires(order_owner, include_args=True) # guard reads meta["order_id"]
4041
+ async def delete_order(
4042
+ order_id: UUID,
4043
+ user: UserModel = Depends(get_current_user),
4044
+ ) -> None: ...
4045
+ ```
4046
+
4026
4047
  Misuse is caught in three places: `TempestPermissionError` at import time (no guard, wrong arity, `async` guard on a sync function, no user parameter), `GuardContractWarning` at call time (a guard raising outside the `AppException` hierarchy, or returning `False` instead of denying), and `tempest permissions --check` in CI, which reads the same contract statically.
4027
4048
 
4028
4049
  ```bash
@@ -279,59 +279,59 @@ come back here to plug in each capability as you need it.
279
279
 
280
280
  | Theme | Covers |
281
281
  | --- | --- |
282
- | **[Database »](database.md)** | `BaseModel`, `AsyncDatabaseManager`, `BaseRepository` (CRUD + filters + bulk), offset/cursor pagination, mixins, `AlembicHelper`, `SlowQueryLogger` |
283
- | **[Multi-tenant »](multi-tenant.md)** | `TenantScopedRepository` — `tenant_id` isolation on every query |
282
+ | **[Admin site »](admin.md)** | `AdminSite`, `AdminModel`, `make_admin_router`, `BaseUserModel` |
284
283
  | **[Audit trail »](audit-trail.md)** | `BaseAuditLogModel`, `add_audited` / `update_audited` / `delete_audited`, `snapshot_model` / `diff_snapshots` |
285
- | **[Offline-first sync (delta) »](offline-sync.md)** | `BaseRepository.changes_since`, `SyncFilterSchema`, `SyncPaginationSchema`, cursor deltas + soft-delete |
286
- | **[HTTP layer »](http.md)** | `apply_cors`, `RequestIDMiddleware`, `RateLimitMiddleware`, `make_health_router`, JWT / role / permission dependencies, webhook signature verifier, pagination Link headers, tool-spec router |
287
- | **[HTTP client (outbound) »](http-client.md)** | `HTTPClient` — typed httpx with retry/backoff, circuit-breaker, X-Request-ID; `RetryPolicy`, `CircuitOpenError` |
288
- | **[Idempotency »](idempotency.md)** | `IdempotencyMiddleware`, `MemoryIdempotencyStore` / `IdempotencyStore` (Redis) — safe replay of POST/PUT/PATCH/DELETE |
289
- | **[Cache »](cache.md)** | `AsyncRedisManager`, `@cached` decorator, `CacheInvalidator` (tag/namespace) |
290
- | **[Feature flags »](feature-flags.md)** | `FeatureFlags`, env/Redis/composite backends, `make_flag_dependency` |
291
284
  | **[Auth flow (signup/reset) »](auth-flow.md)** | `UserAuthService`, `make_auth_router` — signup / activation / login / password reset, token delivery (bearer/cookie/both), `BaseUserModel` |
292
- | **[MFA (TOTP / 2FA) »](mfa.md)** | `MFAMixin`, `TOTPHelper`, enroll/confirm/verify/disable endpoints on `make_auth_router`, recovery codes |
293
- | **[Refresh tokens (rotation/revocation) »](refresh-tokens.md)** | `BaseUserRefreshTokenModel`, `make_user_refresh_token_model`, `issue_token_pair`, rotation + family reuse detection |
294
- | **[Server-side sessions »](sessions.md)** | `SessionMiddleware`, `SessionAuth`, `make_session_router`, `MemorySessionStore` / `RedisSessionStore` |
295
- | **[Real-time »](realtime.md)** | Overview — when to choose SSE, WebSocket or Web Push |
296
- | **[Server-Sent Events (SSE) »](sse.md)** | `EventStream`, `sse_response`, `ServerSentEvent`, `SSEBroker` (per-channel fan-out, Redis bridge) |
297
- | **[WebSocket router »](websocket.md)** | `WebSocketHub`, `make_websocket_router`, `broadcast` / `send_to`, heartbeat, bearer auth |
298
- | **[tempestweb frontend + SDK »](tempestweb-frontend.md)** | tempestweb frontend calling the SDK backend: `tempestweb.native.http`, `Idempotency-Key` + `IdempotencyMiddleware`, retry, same origin vs CORS |
299
- | **[Queue & Tasks »](queue-tasks.md)** | FastStream (`AsyncBrokerManager`), TaskIQ (`AsyncTaskBrokerManager`), `AsyncTaskScheduler`, transactional outbox |
300
- | **[Transactional outbox »](outbox.md)** | `BaseOutboxModel`, `OutboxRelay`, `save_with_outbox` — reliable events |
301
- | **[Transactional email »](email.md)** | `EmailUtils` — SMTP, text/HTML body, attachments, Jinja2 templates |
302
- | **[Web Push »](webpush.md)** | `WebPushDispatcher`, VAPID schemas, broadcast with pruning |
285
+ | **[Brazilian helpers »](br-helpers.md)** | CPF / CNPJ / CEP / phone validation + normalization |
286
+ | **[Cache »](cache.md)** | `AsyncRedisManager`, `@cached` decorator, `CacheInvalidator` (tag/namespace) |
303
287
  | **[Chat (conversations + messages) »](chat.md)** | `ChatService`, `make_chat_router`, base tables + real-time fan-out via `SSEBroker` |
288
+ | **[CLI »](cli.md)** | `tempest new` / `db` (+ `seed`) / `user` / `secrets rotate` / `lint` / `fix` / `format` / `type` / `test` / `check` |
304
289
  | **[Comments + ratings »](reviews.md)** | `ReviewService`, `make_reviews_router`, 0–5 star scores with aggregation, threaded comments |
305
290
  | **[Computer vision (ONNX) »](vision.md)** | `Detector` / `Classifier` / `Segmenter` + prediction schemas |
291
+ | **[Database »](database.md)** | `BaseModel`, `AsyncDatabaseManager`, `BaseRepository` (CRUD + filters + bulk), offset/cursor pagination, mixins, `AlembicHelper`, `SlowQueryLogger` |
292
+ | **[Downloads »](downloads.md)** | `DownloadUtils` — `file_response`, `stream`, `build_content_disposition`, path-traversal safe |
293
+ | **[Errors in OpenAPI (Swagger) »](openapi-errors.md)** | `error_responses`, `@raises`, `TempestAPIRouter`, `ErrorResponseSchema`, `tempest openapi-errors --fix` |
294
+ | **[Feature flags »](feature-flags.md)** | `FeatureFlags`, env/Redis/composite backends, `make_flag_dependency` |
295
+ | **[File store (unified) »](file-store.md)** | `FileStoreUtils` — upload + download + presign over a single backend |
296
+ | **[Geolocation (distance + travel time) »](geo.md)** | `haversine_km`, `estimate_travel`, `OSRMBackend`, `NominatimBackend`, `GeoPointMixin` / `GeoRepositoryMixin` |
297
+ | **[HTTP client (outbound) »](http-client.md)** | `HTTPClient` — typed httpx with retry/backoff, circuit-breaker, X-Request-ID; `RetryPolicy`, `CircuitOpenError` |
298
+ | **[HTTP layer »](http.md)** | `apply_cors`, `RequestIDMiddleware`, `RateLimitMiddleware`, `make_health_router`, JWT / role / permission dependencies, webhook signature verifier, pagination Link headers, tool-spec router |
299
+ | **[Idempotency »](idempotency.md)** | `IdempotencyMiddleware`, `MemoryIdempotencyStore` / `IdempotencyStore` (Redis) — safe replay of POST/PUT/PATCH/DELETE |
300
+ | **[Integration client (OpenAPI) »](openapi-client.md)** | `tempest openapi-client` — Pydantic schemas + a typed client from a third party's spec |
301
+ | **[Introspection auth (resource server) »](introspection-auth.md)** | `IntrospectionAuth` — validate an opaque bearer by asking the upstream identity provider |
306
302
  | **[Logging »](logging.md)** | `LogUtils`, structured JSON logging, request-ID propagation |
303
+ | **[Management commands (tempest &lt;cmd&gt;) »](management-commands.md)** | register your own commands on the project's `tempest` CLI |
307
304
  | **[Metrics »](metrics.md)** | `MetricsUtils` — CPU / RAM / disk / GPU snapshots |
305
+ | **[MFA (TOTP / 2FA) »](mfa.md)** | `MFAMixin`, `TOTPHelper`, enroll/confirm/verify/disable endpoints on `make_auth_router`, recovery codes |
306
+ | **[Multi-tenant »](multi-tenant.md)** | `TenantScopedRepository` — `tenant_id` isolation on every query |
307
+ | **[Object-level permissions »](authz.md)** | `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry`, `make_permission_checker`, `PermissionMixin` |
308
308
  | **[Observability (tracing) »](observability.md)** | `setup_tracing` (OpenTelemetry), `SlowQueryLogger` |
309
- | **[Admin site »](admin.md)** | `AdminSite`, `AdminModel`, `make_admin_router`, `BaseUserModel` |
310
- | **[Downloads »](downloads.md)** | `DownloadUtils` — `file_response`, `stream`, `build_content_disposition`, path-traversal safe |
311
- | **[Uploads (backends) »](uploads.md)** | `UploadUtils`, extension/MIME validation (`sniff_mime`), local / MinIO backends |
309
+ | **[Offline-first sync (delta) »](offline-sync.md)** | `BaseRepository.changes_since`, `SyncFilterSchema`, `SyncPaginationSchema`, cursor deltas + soft-delete |
310
+ | **[Permission guards (@requires) »](permission-guards.md)** | `@requires` plus `(user) -> user` guards (with an optional `meta: dict[str, Any]` via `meta=` / `include_args=`), `TempestPermissionError`, `GuardContractWarning`, `tempest permissions --check` |
311
+ | **[Queue & Tasks »](queue-tasks.md)** | FastStream (`AsyncBrokerManager`), TaskIQ (`AsyncTaskBrokerManager`), `AsyncTaskScheduler`, transactional outbox |
312
+ | **[React SPA on FastAPI »](react-spa.md)** | `make_spa_router` — serve the Vite build from the same process, with history fallback |
313
+ | **[Real-time »](realtime.md)** | Overview — when to choose SSE, WebSocket or Web Push |
314
+ | **[Refresh tokens (rotation/revocation) »](refresh-tokens.md)** | `BaseUserRefreshTokenModel`, `make_user_refresh_token_model`, `issue_token_pair`, rotation + family reuse detection |
315
+ | **[Safe deploys »](deploy-safety.md)** | `AlembicHelper.safe_upgrade` (blocks DROPs), `GracefulShutdownMiddleware` |
316
+ | **[Security »](security.md)** | `AttemptThrottle`, opaque-token helpers, `HardenedStaticFiles`, security headers |
317
+ | **[Self-hosted generative AI »](genai.md)** | `probe_hardware` / `can_run`, `TextGenerator`, `Embedder`, RAG (web + PDF), audio (STT/TTS), `make_genai_router` |
318
+ | **[Server-Sent Events (SSE) »](sse.md)** | `EventStream`, `sse_response`, `ServerSentEvent`, `SSEBroker` (per-channel fan-out, Redis bridge) |
319
+ | **[Server-side sessions »](sessions.md)** | `SessionMiddleware`, `SessionAuth`, `make_session_router`, `MemorySessionStore` / `RedisSessionStore` |
320
+ | **[SSR (typed pages) »](../ssr.md)** | `Page`, `html_response`, `make_htmx_router`, hosting a `tempestweb` build |
312
321
  | **[Storage (MinIO/S3) »](storage.md)** | `AsyncMinIOClient`, `MinIOUploadStorage`, `presigned_get_url` / `presigned_put_url`, `list_objects` |
313
322
  | **[Stored file (service mixin) »](stored-files.md)** | `StoredFileServiceMixin` — `set_file` / `replace` / `clear_file` over `UploadUtils` |
314
- | **[Utilities »](utilities.md)** | `utcnow`/`to_utc`, `modify_dict`, `get_client_ip`, opaque tokens (`generate_opaque_token`) |
323
+ | **[System checks (check-config) »](system-checks.md)** | `run_system_checks`, `@check`, `CheckMessage`, `tempest check-config` — validate settings before serving |
324
+ | **[tempestweb frontend + SDK »](tempestweb-frontend.md)** | tempestweb frontend calling the SDK backend: `tempestweb.native.http`, `Idempotency-Key` + `IdempotencyMiddleware`, retry, same origin vs CORS |
325
+ | **[Testing »](testing.md)** | `test_session`, `test_database`, in-memory SQLite, pytest fixtures |
326
+ | **[Transactional email »](email.md)** | `EmailUtils` — SMTP, text/HTML body, attachments, Jinja2 templates |
327
+ | **[Transactional outbox »](outbox.md)** | `BaseOutboxModel`, `OutboxRelay`, `save_with_outbox` — reliable events |
315
328
  | **[Typing (static + runtime) »](typing.md)** | `strict_types` / `typed` / `require_annotations`, `[tool.tempest] typing_strictness` knob, ruff `ANN` |
329
+ | **[Uploads (backends) »](uploads.md)** | `UploadUtils`, extension/MIME validation (`sniff_mime`), local / MinIO backends |
330
+ | **[Utilities »](utilities.md)** | `utcnow`/`to_utc`, `modify_dict`, `get_client_ip`, opaque tokens (`generate_opaque_token`) |
316
331
  | **[Validated fields (ready-made types) »](fields.md)** | Annotated Pydantic types — `PositiveIntField` / `CentsField` / `PriceField` / `SlugField` / `HexColorField` / `CPFField` / `UFField` |
317
- | **[Testing »](testing.md)** | `test_session`, `test_database`, in-memory SQLite, pytest fixtures |
318
- | **[Safe deploys »](deploy-safety.md)** | `AlembicHelper.safe_upgrade` (blocks DROPs), `GracefulShutdownMiddleware` |
319
- | **[CLI »](cli.md)** | `tempest new` / `db` (+ `seed`) / `user` / `secrets rotate` / `lint` / `fix` / `format` / `type` / `test` / `check` |
320
- | **[Security »](security.md)** | `AttemptThrottle`, opaque-token helpers, `HardenedStaticFiles`, security headers |
321
- | **[Brazilian helpers »](br-helpers.md)** | CPF / CNPJ / CEP / phone validation + normalization |
322
- | **[Object-level permissions »](authz.md)** | `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry`, `make_permission_checker`, `PermissionMixin` |
323
- | **[Permission guards (@requires) »](permission-guards.md)** | `@requires` plus `(user) -> user` guards, `TempestPermissionError`, `GuardContractWarning`, `tempest permissions --check` |
324
- | **[Introspection auth (resource server) »](introspection-auth.md)** | `IntrospectionAuth` — validate an opaque bearer by asking the upstream identity provider |
325
- | **[Geolocation (distance + travel time) »](geo.md)** | `haversine_km`, `estimate_travel`, `OSRMBackend`, `NominatimBackend`, `GeoPointMixin` / `GeoRepositoryMixin` |
326
- | **[Self-hosted generative AI »](genai.md)** | `probe_hardware` / `can_run`, `TextGenerator`, `Embedder`, RAG (web + PDF), audio (STT/TTS), `make_genai_router` |
327
- | **[File store (unified) »](file-store.md)** | `FileStoreUtils` — upload + download + presign over a single backend |
328
332
  | **[Versioned artifacts (models) »](artifact-registry.md)** | `ArtifactRegistry`, `ArtifactVersionMixin`, `build_manifest_entries`, `file_digest` — swap the active version without a redeploy |
329
- | **[Errors in OpenAPI (Swagger) »](openapi-errors.md)** | `error_responses`, `@raises`, `TempestAPIRouter`, `ErrorResponseSchema`, `tempest openapi-errors --fix` |
330
- | **[Integration client (OpenAPI) »](openapi-client.md)** | `tempest openapi-client` — Pydantic schemas + a typed client from a third party's spec |
331
- | **[System checks (check-config) »](system-checks.md)** | `run_system_checks`, `@check`, `CheckMessage`, `tempest check-config` — validate settings before serving |
332
- | **[Management commands (tempest &lt;cmd&gt;) »](management-commands.md)** | register your own commands on the project's `tempest` CLI |
333
- | **[SSR (typed pages) »](../ssr.md)** | `Page`, `html_response`, `make_htmx_router`, hosting a `tempestweb` build |
334
- | **[React SPA on FastAPI »](react-spa.md)** | `make_spa_router` — serve the Vite build from the same process, with history fallback |
333
+ | **[Web Push »](webpush.md)** | `WebPushDispatcher`, VAPID schemas, broadcast with pruning |
334
+ | **[WebSocket router »](websocket.md)** | `WebSocketHub`, `make_websocket_router`, `broadcast` / `send_to`, heartbeat, bearer auth |
335
335
 
336
336
  ## Complete examples
337
337
 
@@ -339,11 +339,11 @@ The recipes show one piece at a time. These pages combine **several** into a flo
339
339
 
340
340
  | Example | What it combines |
341
341
  | --- | --- |
342
- | **[Pix checkout »](../integrated.md)** | JWT auth + validated fields (`PixKeyField`) + cache + transactional outbox + `MessageBroker` + `TaskQueue` + SSE + Web Push |
343
- | **[Neighborhood marketplace »](../marketplace-local.md)** | geo (nearby sellers, distance/time) + real-time chat + live notifications + star ratings |
344
342
  | **[Full store admin »](../admin-showcase.md)** | audit history + FK autocomplete + inlines + business cards + CSV import + granular RBAC + lenses |
345
343
  | **[Fullstack web (SSR, WASM, server) »](../fullstack-web.md)** | the three ways to talk to `tempestweb`: SSR + HTMX, WASM SPA and server-mode |
346
344
  | **[GenAI flows »](../genai-examples.md)** | hardware capacity → local LLM → embeddings/RAG → audio, self-hosted end to end |
345
+ | **[Neighborhood marketplace »](../marketplace-local.md)** | geo (nearby sellers, distance/time) + real-time chat + live notifications + star ratings |
346
+ | **[Pix checkout »](../integrated.md)** | JWT auth + validated fields (`PixKeyField`) + cache + transactional outbox + `MessageBroker` + `TaskQueue` + SSE + Web Push |
347
347
 
348
348
  ## Anatomy of a recipe
349
349