tempest-fastapi-sdk 0.89.0__tar.gz → 0.90.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (490) hide show
  1. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/CHANGELOG.md +35 -0
  2. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/CLAUDE.md +5 -2
  3. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/PKG-INFO +5 -8
  4. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/README.md +4 -7
  5. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/architecture.en.md +1 -1
  6. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/architecture.md +1 -1
  7. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/installation.en.md +5 -3
  8. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/installation.md +5 -3
  9. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/api.en.md +1 -0
  10. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/api.md +1 -0
  11. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/business-rules.en.md +0 -1
  12. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/business-rules.md +0 -1
  13. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/domain.en.md +2 -2
  14. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/domain.md +2 -2
  15. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/flows.en.md +12 -5
  16. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/flows.md +12 -5
  17. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/index.en.md +3 -0
  18. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/marketplace/index.md +3 -0
  19. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/migration.en.md +1 -1
  20. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/migration.md +1 -1
  21. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/admin.en.md +13 -1
  22. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/admin.md +13 -1
  23. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/audit-trail.en.md +8 -2
  24. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/audit-trail.md +8 -2
  25. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/auth-flow.en.md +3 -3
  26. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/auth-flow.md +3 -3
  27. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/br-helpers.en.md +19 -9
  28. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/br-helpers.md +19 -9
  29. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/cache.en.md +12 -1
  30. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/cache.md +12 -1
  31. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/cli.en.md +22 -4
  32. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/cli.md +21 -4
  33. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/downloads.md +2 -2
  34. tempest_fastapi_sdk-0.90.0/docs/recipes/file-store.en.md +138 -0
  35. tempest_fastapi_sdk-0.90.0/docs/recipes/file-store.md +135 -0
  36. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/http-client.en.md +23 -5
  37. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/http-client.md +23 -5
  38. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/http.en.md +33 -1
  39. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/http.md +33 -1
  40. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/idempotency.en.md +17 -1
  41. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/idempotency.md +17 -1
  42. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/index.en.md +14 -1
  43. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/index.md +14 -1
  44. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/logging.en.md +1 -30
  45. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/logging.md +1 -30
  46. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/metrics.en.md +14 -4
  47. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/metrics.md +14 -4
  48. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/mfa.en.md +1 -1
  49. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/mfa.md +1 -1
  50. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/multi-tenant.en.md +1 -1
  51. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/multi-tenant.md +1 -1
  52. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/offline-sync.en.md +9 -0
  53. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/offline-sync.md +9 -0
  54. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/queue-tasks.en.md +20 -2
  55. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/queue-tasks.md +20 -2
  56. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/security.en.md +23 -8
  57. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/security.md +23 -8
  58. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/sessions.en.md +18 -1
  59. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/sessions.md +18 -1
  60. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/sse.en.md +2 -1
  61. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/sse.md +2 -1
  62. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/storage.en.md +1 -1
  63. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/storage.md +1 -1
  64. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/testing.en.md +14 -4
  65. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/testing.md +14 -4
  66. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/typing.en.md +29 -0
  67. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/typing.md +29 -0
  68. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/utilities.en.md +3 -1
  69. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/utilities.md +3 -1
  70. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/webpush.en.md +32 -2
  71. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/webpush.md +32 -2
  72. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/websocket.en.md +15 -8
  73. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/websocket.md +15 -8
  74. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/reference.md +2 -0
  75. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/roadmap.en.md +22 -86
  76. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/roadmap.md +22 -86
  77. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/tutorial.en.md +22 -1
  78. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/tutorial.md +22 -1
  79. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/mkdocs.yml +2 -0
  80. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/pyproject.toml +1 -1
  81. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/__init__.py +3 -1
  82. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/__init__.py +2 -0
  83. tempest_fastapi_sdk-0.90.0/tempest_fastapi_sdk/utils/file_store.py +440 -0
  84. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/upload.py +33 -15
  85. tempest_fastapi_sdk-0.90.0/tests/utils/test_file_store.py +272 -0
  86. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/uv.lock +1 -1
  87. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/.github/workflows/ci.yml +0 -0
  88. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/.github/workflows/docs.yml +0 -0
  89. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/.github/workflows/release-pypi.yml +0 -0
  90. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/.gitignore +0 -0
  91. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/.python-version +0 -0
  92. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/Makefile +0 -0
  93. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/changelog.en.md +0 -0
  94. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/changelog.md +0 -0
  95. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/contributing.en.md +0 -0
  96. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/contributing.md +0 -0
  97. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/index.en.md +0 -0
  98. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/index.md +0 -0
  99. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/index.en.md +0 -0
  100. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/learning/index.md +0 -0
  101. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/database.en.md +0 -0
  102. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/database.md +0 -0
  103. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/deploy-safety.en.md +0 -0
  104. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/deploy-safety.md +0 -0
  105. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/downloads.en.md +0 -0
  106. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/email.en.md +0 -0
  107. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/email.md +0 -0
  108. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/feature-flags.en.md +0 -0
  109. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/feature-flags.md +0 -0
  110. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/fields.en.md +0 -0
  111. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/fields.md +0 -0
  112. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/observability.en.md +0 -0
  113. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/observability.md +0 -0
  114. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/outbox.en.md +0 -0
  115. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/outbox.md +0 -0
  116. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/realtime.en.md +0 -0
  117. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/realtime.md +0 -0
  118. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/refresh-tokens.en.md +0 -0
  119. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/refresh-tokens.md +0 -0
  120. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/stored-files.en.md +0 -0
  121. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/stored-files.md +0 -0
  122. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/uploads.en.md +0 -0
  123. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/uploads.md +0 -0
  124. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/vision.en.md +0 -0
  125. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/recipes/vision.md +0 -0
  126. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/reference.en.md +0 -0
  127. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/ssr.en.md +0 -0
  128. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/docs/ssr.md +0 -0
  129. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/mkdocs_hooks/llmstxt.py +0 -0
  130. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/scripts/extract_recipe.py +0 -0
  131. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
  132. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/actions.py +0 -0
  133. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
  134. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/config.py +0 -0
  135. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/discovery.py +0 -0
  136. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
  137. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/router.py +0 -0
  138. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/session.py +0 -0
  139. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/site.py +0 -0
  140. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
  141. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
  142. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
  143. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
  144. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
  145. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
  146. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
  147. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
  148. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
  149. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/admin/theme.py +0 -0
  150. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
  151. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
  152. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
  153. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
  154. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
  155. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
  156. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
  157. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
  158. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
  159. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
  160. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
  161. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
  162. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
  163. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
  164. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
  165. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
  166. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
  167. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
  168. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
  169. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/server.py +0 -0
  170. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/static.py +0 -0
  171. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
  172. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
  173. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
  174. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
  175. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/locale.py +0 -0
  176. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
  177. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/router.py +0 -0
  178. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
  179. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/service.py +0 -0
  180. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
  181. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
  182. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
  183. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
  184. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
  185. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
  186. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
  187. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
  188. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
  189. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
  190. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
  191. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
  192. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
  193. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
  194. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
  195. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
  196. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
  197. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
  198. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
  199. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
  200. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
  201. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
  202. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
  203. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
  204. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
  205. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
  206. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
  207. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
  208. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
  209. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
  210. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
  211. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
  212. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
  213. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
  214. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
  215. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
  216. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
  217. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
  218. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
  219. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
  220. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
  221. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
  222. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
  223. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
  224. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
  225. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
  226. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
  227. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
  228. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/config.py +0 -0
  229. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/db.py +0 -0
  230. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
  231. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
  232. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
  233. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/main.py +0 -0
  234. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/new.py +0 -0
  235. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
  236. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
  237. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/cli/user.py +0 -0
  238. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
  239. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
  240. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
  241. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/core/context.py +0 -0
  242. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/core/enums.py +0 -0
  243. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/core/logging.py +0 -0
  244. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/core/typed.py +0 -0
  245. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
  246. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
  247. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
  248. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
  249. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/audit.py +0 -0
  250. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/backup.py +0 -0
  251. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/connection.py +0 -0
  252. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
  253. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
  254. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/model.py +0 -0
  255. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
  256. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/repository.py +0 -0
  257. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
  258. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
  259. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
  260. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
  261. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
  262. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
  263. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
  264. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
  265. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
  266. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
  267. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
  268. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
  269. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
  270. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
  271. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
  272. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
  273. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
  274. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
  275. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/flags/__init__.py +0 -0
  276. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/flags/backends.py +0 -0
  277. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
  278. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/flags/service.py +0 -0
  279. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/py.typed +0 -0
  280. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
  281. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
  282. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
  283. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
  284. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
  285. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
  286. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
  287. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
  288. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
  289. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/services/base.py +0 -0
  290. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
  291. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
  292. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
  293. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
  294. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
  295. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
  296. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
  297. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
  298. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
  299. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/settings/base.py +0 -0
  300. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
  301. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
  302. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sse/broker.py +0 -0
  303. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
  304. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
  305. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
  306. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/ssr/assets.py +0 -0
  307. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/ssr/page.py +0 -0
  308. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/ssr/response.py +0 -0
  309. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
  310. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
  311. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
  312. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
  313. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
  314. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
  315. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/testing/database.py +0 -0
  316. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
  317. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
  318. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
  319. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
  320. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/download.py +0 -0
  321. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/email.py +0 -0
  322. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/fields.py +0 -0
  323. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
  324. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
  325. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/locations.py +0 -0
  326. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/log.py +0 -0
  327. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
  328. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
  329. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/password.py +0 -0
  330. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
  331. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
  332. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
  333. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
  334. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/vision/__init__.py +0 -0
  335. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/vision/mapping.py +0 -0
  336. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/vision/schemas.py +0 -0
  337. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
  338. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
  339. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/webpush/router.py +0 -0
  340. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
  341. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/webpush/service.py +0 -0
  342. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
  343. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
  344. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
  345. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
  346. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/__init__.py +0 -0
  347. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/__init__.py +0 -0
  348. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_actions.py +0 -0
  349. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_auth.py +0 -0
  350. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_discovery.py +0 -0
  351. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_forms.py +0 -0
  352. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_logs_nav.py +0 -0
  353. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_mfa.py +0 -0
  354. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_rich_filters.py +0 -0
  355. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_router.py +0 -0
  356. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_site.py +0 -0
  357. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_theme.py +0 -0
  358. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_upload_field.py +0 -0
  359. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/admin/test_user_model.py +0 -0
  360. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/__init__.py +0 -0
  361. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_body_size.py +0 -0
  362. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_cookies.py +0 -0
  363. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_cors.py +0 -0
  364. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_csrf.py +0 -0
  365. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_dependencies_auth.py +0 -0
  366. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_graceful.py +0 -0
  367. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_handlers.py +0 -0
  368. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_health_router.py +0 -0
  369. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_idempotency.py +0 -0
  370. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_jwt_dependency.py +0 -0
  371. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_logs_router.py +0 -0
  372. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_oauth.py +0 -0
  373. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_prometheus.py +0 -0
  374. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_rate_limit.py +0 -0
  375. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_rate_limit_extras.py +0 -0
  376. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_request_id_middleware.py +0 -0
  377. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_role_dependency.py +0 -0
  378. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_server.py +0 -0
  379. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_static.py +0 -0
  380. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_tool_spec.py +0 -0
  381. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_tracing.py +0 -0
  382. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_webhooks.py +0 -0
  383. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/api/test_webhooks_rsa.py +0 -0
  384. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/__init__.py +0 -0
  385. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/test_cookie_delivery.py +0 -0
  386. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/test_guards.py +0 -0
  387. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/test_locale.py +0 -0
  388. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/test_mfa.py +0 -0
  389. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/test_refresh.py +0 -0
  390. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/test_refresh_db.py +0 -0
  391. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/auth/test_service.py +0 -0
  392. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cache/__init__.py +0 -0
  393. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cache/test_decorator.py +0 -0
  394. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cache/test_invalidation.py +0 -0
  395. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cache/test_redis_manager.py +0 -0
  396. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/__init__.py +0 -0
  397. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_config.py +0 -0
  398. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_db.py +0 -0
  399. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_db_seed.py +0 -0
  400. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_docker_compose.py +0 -0
  401. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_generate.py +0 -0
  402. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_lint_strictness.py +0 -0
  403. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_main.py +0 -0
  404. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_secrets.py +0 -0
  405. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/cli/test_user.py +0 -0
  406. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/conftest.py +0 -0
  407. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/controllers/__init__.py +0 -0
  408. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/controllers/test_base.py +0 -0
  409. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/core/__init__.py +0 -0
  410. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/core/test_context.py +0 -0
  411. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/core/test_enums.py +0 -0
  412. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/core/test_logging.py +0 -0
  413. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/core/test_typed.py +0 -0
  414. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/__init__.py +0 -0
  415. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_alembic_hooks.py +0 -0
  416. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_audit.py +0 -0
  417. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_backup.py +0 -0
  418. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_bulk_ops.py +0 -0
  419. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_connection.py +0 -0
  420. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_migrations.py +0 -0
  421. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_mixins.py +0 -0
  422. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_model.py +0 -0
  423. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_outbox.py +0 -0
  424. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_repository.py +0 -0
  425. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_safe_upgrade.py +0 -0
  426. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_slow_query.py +0 -0
  427. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/db/test_tenant.py +0 -0
  428. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/exceptions/__init__.py +0 -0
  429. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/exceptions/test_exceptions.py +0 -0
  430. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/exceptions/test_i18n.py +0 -0
  431. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/flags/__init__.py +0 -0
  432. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/flags/test_flags.py +0 -0
  433. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/queue/__init__.py +0 -0
  434. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/queue/test_manager.py +0 -0
  435. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/schemas/__init__.py +0 -0
  436. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/schemas/test_base.py +0 -0
  437. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/schemas/test_cursor_pagination.py +0 -0
  438. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/schemas/test_link_headers.py +0 -0
  439. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/schemas/test_pagination.py +0 -0
  440. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/schemas/test_response.py +0 -0
  441. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/services/__init__.py +0 -0
  442. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/services/test_base.py +0 -0
  443. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/services/test_file_mixin.py +0 -0
  444. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/sessions/__init__.py +0 -0
  445. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/sessions/test_sessions.py +0 -0
  446. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/settings/__init__.py +0 -0
  447. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/settings/test_base.py +0 -0
  448. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/settings/test_mixins.py +0 -0
  449. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/sse/__init__.py +0 -0
  450. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/sse/test_broker.py +0 -0
  451. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/sse/test_event_stream.py +0 -0
  452. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/ssr/__init__.py +0 -0
  453. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/ssr/test_integration.py +0 -0
  454. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/ssr/test_page.py +0 -0
  455. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/ssr/test_response.py +0 -0
  456. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/storage/__init__.py +0 -0
  457. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/storage/test_minio_client.py +0 -0
  458. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/tasks/__init__.py +0 -0
  459. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/tasks/test_manager.py +0 -0
  460. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/tasks/test_scheduler.py +0 -0
  461. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/testing/__init__.py +0 -0
  462. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/testing/test_database.py +0 -0
  463. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/__init__.py +0 -0
  464. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_client_ip.py +0 -0
  465. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_datetime.py +0 -0
  466. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_dict.py +0 -0
  467. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_download.py +0 -0
  468. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_email.py +0 -0
  469. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_fields.py +0 -0
  470. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_http_client.py +0 -0
  471. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_jwt.py +0 -0
  472. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_lazy_extras.py +0 -0
  473. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_locations.py +0 -0
  474. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_log.py +0 -0
  475. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_metrics.py +0 -0
  476. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_opaque_token.py +0 -0
  477. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_password.py +0 -0
  478. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_regex.py +0 -0
  479. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_storage_backends.py +0 -0
  480. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_throttle.py +0 -0
  481. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/utils/test_upload.py +0 -0
  482. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/vision/__init__.py +0 -0
  483. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/vision/test_vision.py +0 -0
  484. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/webpush/__init__.py +0 -0
  485. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/webpush/test_dispatcher.py +0 -0
  486. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/webpush/test_router.py +0 -0
  487. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/webpush/test_schemas.py +0 -0
  488. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/webpush/test_service.py +0 -0
  489. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/websockets/__init__.py +0 -0
  490. {tempest_fastapi_sdk-0.89.0 → tempest_fastapi_sdk-0.90.0}/tests/websockets/test_hub_and_router.py +0 -0
@@ -5,6 +5,41 @@ 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.90.0] — 2026-07-04
9
+
10
+ ### Added
11
+
12
+ - **Unified file store (`FileStoreUtils`).** A single facade over the
13
+ three pieces a service usually wires by hand — `UploadUtils`
14
+ (validate + persist), `DownloadUtils` (serve bytes through the API)
15
+ and the presigned-URL helpers of `AsyncMinIOClient` — behind one
16
+ object with one configuration, targeting one storage backend.
17
+ - The backend is picked once from `source`: a directory path for
18
+ local disk (`[upload]` extra), or an `AsyncMinIOClient` for
19
+ MinIO/S3 (`[minio]` extra).
20
+ - Convenience surface: `save` / `replace` / `delete` / `exists`,
21
+ `download` / `file_response` / `stream` / `resolve`, `validate`,
22
+ and `presigned_get_url` / `presigned_put_url` (the latter return
23
+ `None` on the local backend, keeping the call site uniform).
24
+ - Escape hatches for the internal pieces: `uploader`, `downloader`,
25
+ `backend` and `client`.
26
+ - A single `UploadStorage` backend is built and shared with the
27
+ upload half; on MinIO the same client instance is reused by the
28
+ download half, so the connection pool is shared, not duplicated.
29
+ - **`UploadUtils` accepts an injected backend.** New keyword-only
30
+ `backend: UploadStorage | None` bypasses the `source`-based backend
31
+ selection, letting `FileStoreUtils` build one backend and share it.
32
+ `source` is now optional when `backend` is given; passing neither
33
+ raises `ValueError`. The `[upload]` extra is only required when the
34
+ local backend is actually selected (MinIO-only use no longer needs
35
+ `aiofiles`).
36
+
37
+ ### Docs
38
+
39
+ - New bilingual recipe **File store (unificado) / Unified file store**
40
+ (`docs/recipes/file-store.md` + `.en.md`) and an API-reference stub
41
+ for `FileStoreUtils` (plus `DownloadUtils`).
42
+
8
43
  ## [0.89.0] — 2026-07-04
9
44
 
10
45
  ### Added
@@ -123,8 +123,11 @@ The SDK currently covers (Sep 2025+, post-v0.31.x):
123
123
  `tempestweb` imported lazily so `import tempest_fastapi_sdk` never
124
124
  needs the extra.
125
125
  - **Upload** — `UploadUtils` with pluggable backends
126
- (`LocalUploadStorage`, `MinIOUploadStorage`), download helpers,
127
- presigned URLs.
126
+ (`LocalUploadStorage`, `MinIOUploadStorage`, opt-in injected via
127
+ `backend=`), download helpers, presigned URLs, plus `FileStoreUtils`
128
+ — a unified facade bundling upload + download + presign over one
129
+ shared backend (`uploader`/`downloader`/`backend`/`client` escape
130
+ hatches).
128
131
  - **MinIO / S3** — `AsyncMinIOClient` via `[minio]` extra
129
132
  (bucket lifecycle, object I/O, streaming download, presigned
130
133
  URLs).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tempest-fastapi-sdk
3
- Version: 0.89.0
3
+ Version: 0.90.0
4
4
  Summary: Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects.
5
5
  Project-URL: Homepage, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
6
6
  Project-URL: Repository, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
@@ -119,7 +119,7 @@ Description-Content-Type: text/markdown
119
119
 
120
120
  > 💡 `uv run mkdocs serve` (ou `make docs-serve`) é só para preview local — em produção use as URLs do GitHub Pages acima. / For local preview only — in production use the GitHub Pages URLs above.
121
121
 
122
- Shared FastAPI/SQLAlchemy/Pydantic building blocks used across Tempest projects: base schemas, ORM model, async repository, pagination, settings, exceptions, Alembic helper, FastStream/TaskIQ broker managers, Redis cache, Server-Sent Events, Web Push, a Django-style **admin site** (`AdminSite` + `AdminModel`), **typed SSR pages** (`Page` + `html_response`, HTMX-ready), and the utility classes (`PasswordUtils`, `JWTUtils`, `EmailUtils`, `UploadUtils`, `DownloadUtils`, `MetricsUtils`, `LogUtils`).
122
+ Shared FastAPI/SQLAlchemy/Pydantic building blocks used across Tempest projects: base schemas, ORM model, async repository, pagination, settings, exceptions, Alembic helper, FastStream/TaskIQ broker managers, Redis cache, Server-Sent Events, Web Push, a Django-style **admin site** (`AdminSite` + `AdminModel`), **typed SSR pages** (`Page` + `html_response`, HTMX-ready), and the utility classes (`PasswordUtils`, `JWTUtils`, `EmailUtils`, `UploadUtils`, `DownloadUtils`, `FileStoreUtils`, `MetricsUtils`, `LogUtils`).
123
123
 
124
124
  The goal is to start every new backend with the same opinionated foundation already in place — no copy-pasting `BaseModel`, no rewriting the same CRUD repository, no re-inventing the exception envelope.
125
125
 
@@ -200,7 +200,7 @@ Via `pyproject.toml`:
200
200
 
201
201
  ```toml
202
202
  dependencies = [
203
- "tempest-fastapi-sdk>=0.41.0",
203
+ "tempest-fastapi-sdk>=0.90.0",
204
204
  ]
205
205
  ```
206
206
 
@@ -269,7 +269,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
269
269
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `AsyncTaskBrokerManager` (TaskIQ lifecycle wrapper), `AsyncTaskScheduler` (periodic / cron tasks) |
270
270
  | `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` |
271
271
  | `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) |
272
- | `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)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `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`) |
272
+ | `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`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `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`) |
273
273
  | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `version` / `--version` |
274
274
 
275
275
  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` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import AsyncBrokerManager`).
@@ -1050,7 +1050,7 @@ tokens = JWTUtils(
1050
1050
 
1051
1051
  #### Signup
1052
1052
 
1053
- Reuse the `UserService.create` defined in the tutorial — it already hashes the password.
1053
+ Reuse the `UserService.signup` defined in the tutorial — it already hashes the password.
1054
1054
 
1055
1055
  #### Login
1056
1056
 
@@ -4187,9 +4187,6 @@ Short version — recently shipped and what's next:
4187
4187
  - **v0.31.2** — `UserAuthService` methods type `session` as
4188
4188
  `AsyncSession` everywhere (no more `Any`).
4189
4189
 
4190
- Still on the roadmap: OpenTelemetry tracing + outbox pattern
4191
- for transactional events. Tracked on the docs page.
4192
-
4193
4190
  ---
4194
4191
 
4195
4192
  ## License
@@ -10,7 +10,7 @@
10
10
 
11
11
  > 💡 `uv run mkdocs serve` (ou `make docs-serve`) é só para preview local — em produção use as URLs do GitHub Pages acima. / For local preview only — in production use the GitHub Pages URLs above.
12
12
 
13
- Shared FastAPI/SQLAlchemy/Pydantic building blocks used across Tempest projects: base schemas, ORM model, async repository, pagination, settings, exceptions, Alembic helper, FastStream/TaskIQ broker managers, Redis cache, Server-Sent Events, Web Push, a Django-style **admin site** (`AdminSite` + `AdminModel`), **typed SSR pages** (`Page` + `html_response`, HTMX-ready), and the utility classes (`PasswordUtils`, `JWTUtils`, `EmailUtils`, `UploadUtils`, `DownloadUtils`, `MetricsUtils`, `LogUtils`).
13
+ Shared FastAPI/SQLAlchemy/Pydantic building blocks used across Tempest projects: base schemas, ORM model, async repository, pagination, settings, exceptions, Alembic helper, FastStream/TaskIQ broker managers, Redis cache, Server-Sent Events, Web Push, a Django-style **admin site** (`AdminSite` + `AdminModel`), **typed SSR pages** (`Page` + `html_response`, HTMX-ready), and the utility classes (`PasswordUtils`, `JWTUtils`, `EmailUtils`, `UploadUtils`, `DownloadUtils`, `FileStoreUtils`, `MetricsUtils`, `LogUtils`).
14
14
 
15
15
  The goal is to start every new backend with the same opinionated foundation already in place — no copy-pasting `BaseModel`, no rewriting the same CRUD repository, no re-inventing the exception envelope.
16
16
 
@@ -91,7 +91,7 @@ Via `pyproject.toml`:
91
91
 
92
92
  ```toml
93
93
  dependencies = [
94
- "tempest-fastapi-sdk>=0.41.0",
94
+ "tempest-fastapi-sdk>=0.90.0",
95
95
  ]
96
96
  ```
97
97
 
@@ -160,7 +160,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
160
160
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `AsyncTaskBrokerManager` (TaskIQ lifecycle wrapper), `AsyncTaskScheduler` (periodic / cron tasks) |
161
161
  | `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` |
162
162
  | `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) |
163
- | `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)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `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`) |
163
+ | `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`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `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`) |
164
164
  | `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `version` / `--version` |
165
165
 
166
166
  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` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import AsyncBrokerManager`).
@@ -941,7 +941,7 @@ tokens = JWTUtils(
941
941
 
942
942
  #### Signup
943
943
 
944
- Reuse the `UserService.create` defined in the tutorial — it already hashes the password.
944
+ Reuse the `UserService.signup` defined in the tutorial — it already hashes the password.
945
945
 
946
946
  #### Login
947
947
 
@@ -4078,9 +4078,6 @@ Short version — recently shipped and what's next:
4078
4078
  - **v0.31.2** — `UserAuthService` methods type `session` as
4079
4079
  `AsyncSession` everywhere (no more `Any`).
4080
4080
 
4081
- Still on the roadmap: OpenTelemetry tracing + outbox pattern
4082
- for transactional events. Tracked on the docs page.
4083
-
4084
4081
  ---
4085
4082
 
4086
4083
  ## License
@@ -213,7 +213,7 @@ class UserController(BaseController[UserService, UserResponse]):
213
213
  from fastapi import Depends
214
214
  from sqlalchemy.ext.asyncio import AsyncSession
215
215
 
216
- from src.api.app import db
216
+ from src.api.dependencies.resources import db
217
217
  from src.controllers.user_controller import UserController
218
218
  from src.db.repositories import UserRepository
219
219
  from src.services.user_service import UserService
@@ -213,7 +213,7 @@ class UserController(BaseController[UserService, UserResponse]):
213
213
  from fastapi import Depends
214
214
  from sqlalchemy.ext.asyncio import AsyncSession
215
215
 
216
- from src.api.app import db
216
+ from src.api.dependencies.resources import db
217
217
  from src.controllers.user_controller import UserController
218
218
  from src.db.repositories import UserRepository
219
219
  from src.services.user_service import UserService
@@ -32,7 +32,9 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
32
32
  | `[mfa]` | `pyotp` | `TOTPHelper` + MFA/2FA (TOTP) endpoints on the bundled auth flow |
33
33
  | `[sqlite]` | `aiosqlite` | SQLite async driver for `sqlite+aiosqlite://` URLs (dev default) |
34
34
  | `[postgres]` | `asyncpg` | PostgreSQL async driver for `postgresql+asyncpg://` URLs (production) |
35
- | `[all]` | everything above | every helper |
35
+ | `[vision]` | `ort-vision-sdk` | vision helpers (`Detector`, `Classifier`, `Segmenter` + `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`) |
36
+ | `[otel]` | `opentelemetry-sdk`, OTLP exporter + FastAPI/SQLAlchemy/httpx instrumentations | OpenTelemetry instrumentation via `setup_tracing` |
37
+ | `[all]` | everything above (includes `[vision]` and `[otel]`) | every helper |
36
38
 
37
39
  === "Subset (recommended)"
38
40
 
@@ -49,14 +51,14 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
49
51
  === "uv add"
50
52
 
51
53
  ```bash
52
- uv add "tempest-fastapi-sdk[auth,upload,postgres]>=0.41.0"
54
+ uv add "tempest-fastapi-sdk[auth,upload,postgres]>=0.89.0"
53
55
  ```
54
56
 
55
57
  === "pyproject.toml"
56
58
 
57
59
  ```toml
58
60
  dependencies = [
59
- "tempest-fastapi-sdk[auth,upload,postgres]>=0.41.0",
61
+ "tempest-fastapi-sdk[auth,upload,postgres]>=0.89.0",
60
62
  ]
61
63
  ```
62
64
 
@@ -32,7 +32,9 @@ Os helpers mais ricos puxam dependências de terceiros que só são necessárias
32
32
  | `[mfa]` | `pyotp` | `TOTPHelper` + endpoints MFA/2FA (TOTP) do fluxo bundled de auth |
33
33
  | `[sqlite]` | `aiosqlite` | driver async SQLite para URLs `sqlite+aiosqlite://` (default de dev) |
34
34
  | `[postgres]` | `asyncpg` | driver async PostgreSQL para URLs `postgresql+asyncpg://` (produção) |
35
- | `[all]` | tudo acima | todos os helpers |
35
+ | `[vision]` | `ort-vision-sdk` | helpers de visão (`Detector`, `Classifier`, `Segmenter` + `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`) |
36
+ | `[otel]` | `opentelemetry-sdk`, exporter OTLP + instrumentações FastAPI/SQLAlchemy/httpx | instrumentação OpenTelemetry via `setup_tracing` |
37
+ | `[all]` | tudo acima (inclui `[vision]` e `[otel]`) | todos os helpers |
36
38
 
37
39
  === "Subconjunto (recomendado)"
38
40
 
@@ -49,14 +51,14 @@ Os helpers mais ricos puxam dependências de terceiros que só são necessárias
49
51
  === "uv add"
50
52
 
51
53
  ```bash
52
- uv add "tempest-fastapi-sdk[auth,upload,postgres]>=0.41.0"
54
+ uv add "tempest-fastapi-sdk[auth,upload,postgres]>=0.89.0"
53
55
  ```
54
56
 
55
57
  === "pyproject.toml"
56
58
 
57
59
  ```toml
58
60
  dependencies = [
59
- "tempest-fastapi-sdk[auth,upload,postgres]>=0.41.0",
61
+ "tempest-fastapi-sdk[auth,upload,postgres]>=0.89.0",
60
62
  ]
61
63
  ```
62
64
 
@@ -7,6 +7,7 @@ The full REST API of the marketplace in a single table, ready to paste into the
7
7
  - **Idem**: ✅ = accepts `Idempotency-Key` (cached by `IdempotencyMiddleware`).
8
8
  - **Pagination**: cursor by default; offset where explicitly noted.
9
9
  - **Errors**: every error follows the SDK envelope `{detail, code, details}`.
10
+ - **`X-NN` rules**: the codes cited in the descriptions (e.g. `rule O-02`, `rule D-01`) refer to the [business rules](business-rules.en.md) page, where each rule is detailed.
10
11
 
11
12
  ## Auth
12
13
 
@@ -7,6 +7,7 @@ Toda a API REST do marketplace numa tabela só, pronta pra colar no contrato do
7
7
  - **Idem**: ✅ = aceita `Idempotency-Key` (cacheado pelo `IdempotencyMiddleware`).
8
8
  - **Paginação**: cursor por padrão; offset onde explícito.
9
9
  - **Erros**: todo erro vem no envelope SDK `{detail, code, details}`.
10
+ - **Regras `X-NN`**: os códigos citados nas descrições (ex.: `regra O-02`, `regra D-01`) remetem à página de [regras de negócio](business-rules.md), onde cada regra está detalhada.
10
11
 
11
12
  ## Auth
12
13
 
@@ -4,7 +4,6 @@ This page is the **domain contract**. Every modeling, endpoint, or test decision
4
4
 
5
5
  !!! warning "Severity convention"
6
6
  **MUST** = domain invariant, violation is a bug.
7
- **SHOULD** = default behavior, override requires justification.
8
7
  **MAY** = intentional opening, decided case by case.
9
8
 
10
9
  ## 1. Users
@@ -4,7 +4,6 @@ Esta página é o **contrato do domínio**. Toda decisão de modelagem, endpoint
4
4
 
5
5
  !!! warning "Convenção de severidade"
6
6
  **MUST** = invariante de domínio, violação é bug.
7
- **SHOULD** = comportamento padrão, override exige justificativa.
8
7
  **MAY** = abertura intencional, decidir caso a caso.
9
8
 
10
9
  ## 1. Usuários
@@ -359,12 +359,12 @@ classDiagram
359
359
  | `Product` | `BaseModel + AuditMixin + SoftDeleteMixin` | custom (JOINs variant+price) | `BaseService` |
360
360
  | `ProductVariant` | `BaseModel + AuditMixin` | custom | `BaseService` |
361
361
  | `PriceHistory` | `BaseModel` (no updated_at) | append-only | `BaseService` |
362
- | `StockMovement` | `BaseModel` (no updated_at) | append-only via `bulk_create` when batching | `BaseService` |
362
+ | `StockMovement` | `BaseModel` (no updated_at) | append-only via `bulk_create_values` when batching | `BaseService` |
363
363
  | `Cart`/`CartItem` | `BaseModel + AuditMixin` | `BaseRepository[CartModel]` | `BaseService` |
364
364
  | `Order`/`OrderItem` | `BaseModel + AuditMixin` | custom | `BaseService` |
365
365
  | `Review` | `BaseModel + AuditMixin` | `BaseRepository[ReviewModel]` | `BaseService` |
366
366
 
367
- `PriceHistory` and `StockMovement` are append-only, so their repository **doesn't expose `update` or `delete`** — only `create`/`list`/`get`. That prevents accidental ALTER on history.
367
+ `PriceHistory` and `StockMovement` are append-only, so their repository **doesn't expose `update` or `delete`** — only `add`/`list`/`get`. That prevents accidental ALTER on history.
368
368
 
369
369
  ## Next step
370
370
 
@@ -359,12 +359,12 @@ classDiagram
359
359
  | `Product` | `BaseModel + AuditMixin + SoftDeleteMixin` | custom (com JOINs em variant+price) | `BaseService` |
360
360
  | `ProductVariant` | `BaseModel + AuditMixin` | custom | `BaseService` |
361
361
  | `PriceHistory` | `BaseModel` (sem updated_at) | append-only | `BaseService` |
362
- | `StockMovement` | `BaseModel` (sem updated_at) | append-only via `bulk_create` quando lote | `BaseService` |
362
+ | `StockMovement` | `BaseModel` (sem updated_at) | append-only via `bulk_create_values` quando lote | `BaseService` |
363
363
  | `Cart`/`CartItem` | `BaseModel + AuditMixin` | `BaseRepository[CartModel]` | `BaseService` |
364
364
  | `Order`/`OrderItem` | `BaseModel + AuditMixin` | custom | `BaseService` |
365
365
  | `Review` | `BaseModel + AuditMixin` | `BaseRepository[ReviewModel]` | `BaseService` |
366
366
 
367
- `PriceHistory` e `StockMovement` são append-only, então o repositório deles **não expõe `update` nem `delete`** — só `create`/`list`/`get`. Isso impede ALTER acidental no histórico.
367
+ `PriceHistory` e `StockMovement` são append-only, então o repositório deles **não expõe `update` nem `delete`** — só `add`/`list`/`get`. Isso impede ALTER acidental no histórico.
368
368
 
369
369
  ## Próximo passo
370
370
 
@@ -76,11 +76,14 @@ sequenceDiagram
76
76
 
77
77
  **SDK touchpoints:**
78
78
 
79
- - `generate_opaque_token(48)` returns `(plain, hash)`. Database stores only the hash.
79
+ - `generate_opaque_token(48)` returns `(plain, hash)`.
80
80
  - `EmailUtils.render_template("invitation.html", ctx)` (v0.24+).
81
81
  - Send is async (TaskIQ) — endpoint returns `201` without waiting on SMTP.
82
82
  - The acceptance is **one single transaction** — membership + invitation status are atomic.
83
83
 
84
+ !!! warning "The database stores only the hash"
85
+ `generate_opaque_token(48)` returns `(plain, hash)`: the `plain` value only ever lives in the email sent to the invitee, and the database persists just `hash`. On acceptance the service calls `hash_opaque_token(plain)` and looks the row up by hash — a leak of the `invitations` table exposes no usable tokens.
86
+
84
87
  ## 3. Create product + variant + images
85
88
 
86
89
  ```mermaid
@@ -91,7 +94,7 @@ sequenceDiagram
91
94
  participant CT as ProductController
92
95
  participant PS as ProductService
93
96
  participant VS as VariantService
94
- participant ST as MinIOUploadStorage
97
+ participant ST as AsyncMinIOClient
95
98
  participant DB as Postgres
96
99
 
97
100
  M->>R: POST /products {title, description, variants:[{sku, attrs, price_cents}]}
@@ -123,7 +126,7 @@ sequenceDiagram
123
126
  **SDK touchpoints:**
124
127
 
125
128
  - Product creation is a single transaction — product + variants + first `PriceHistory` row.
126
- - Images **never flow through the API** — the client `PUT`s directly to MinIO via a presigned URL (`MinIOUploadStorage.presigned_url` or `AsyncMinIOClient.presigned_put_url` directly).
129
+ - Images **never flow through the API** — the client `PUT`s directly to MinIO via a presigned URL minted by `AsyncMinIOClient.presigned_put_url` (`MinIOUploadStorage.presigned_url` is GET/read-only and cannot be used for upload).
127
130
  - The public catalog reads `image_keys` and mints presigned read URLs (1h TTL).
128
131
 
129
132
  ## 4. Idempotent checkout
@@ -172,11 +175,14 @@ sequenceDiagram
172
175
 
173
176
  **SDK touchpoints:**
174
177
 
175
- - `IdempotencyMiddleware` covers the endpoint without the handler having to care. If the buyer retries with the same `Idempotency-Key`, the middleware replays the original response — the handler does not run twice, stock is not decremented twice.
178
+ - `IdempotencyMiddleware` covers the endpoint without the handler having to care.
176
179
  - Stock reservation lives **inside the same transaction** as the order `INSERT`. A failure on any item rolls everything back.
177
180
  - The `SSE` notifies the stream (the buyer's client listening on `/orders/{id}/events`).
178
181
  - `notify_seller` is queued — does not block the checkout response.
179
182
 
183
+ !!! note "Idempotency prevents double stock decrement"
184
+ If the buyer retries with the same `Idempotency-Key` (reload, network timeout, double-tap), the middleware replays the original response — the handler **does not run twice**, so stock is **not decremented twice** and no duplicate order is created.
185
+
180
186
  ## 5. Shipping + real-time updates
181
187
 
182
188
  ```mermaid
@@ -234,7 +240,8 @@ stateDiagram-v2
234
240
  RETURNED --> [*]
235
241
  ```
236
242
 
237
- Forbidden transitions (any other arrow) **MUST** fail with `ConflictException("invalid state transition")`. Typical implementation is an enum + `dict[from, set[to]]` in the service.
243
+ !!! warning "Invalid transitions must fail with ConflictException"
244
+ Forbidden transitions (any other arrow) **MUST** fail with `ConflictException("invalid state transition")`. Typical implementation is an enum + `dict[from, set[to]]` in the service.
238
245
 
239
246
  ## State machine — Invitation
240
247
 
@@ -76,11 +76,14 @@ sequenceDiagram
76
76
 
77
77
  **Pontos do SDK:**
78
78
 
79
- - `generate_opaque_token(48)` retorna par `(plain, hash)`. Banco guarda só o hash.
79
+ - `generate_opaque_token(48)` retorna par `(plain, hash)`.
80
80
  - `EmailUtils.render_template("invitation.html", ctx)` (v0.24+).
81
81
  - O envio é assíncrono (TaskIQ) — endpoint retorna `201` sem esperar SMTP.
82
82
  - Toda a aceitação é **uma única transação** — membership + status do convite são atomic.
83
83
 
84
+ !!! warning "O banco guarda só o hash"
85
+ `generate_opaque_token(48)` devolve `(plain, hash)`: o valor `plain` só existe no email enviado ao convidado, e o banco persiste apenas `hash`. Na aceitação, o service faz `hash_opaque_token(plain)` e busca pelo hash — um vazamento da tabela `invitations` não expõe tokens utilizáveis.
86
+
84
87
  ## 3. Criar produto com variante + imagens
85
88
 
86
89
  ```mermaid
@@ -91,7 +94,7 @@ sequenceDiagram
91
94
  participant CT as ProductController
92
95
  participant PS as ProductService
93
96
  participant VS as VariantService
94
- participant ST as MinIOUploadStorage
97
+ participant ST as AsyncMinIOClient
95
98
  participant DB as Postgres
96
99
 
97
100
  M->>R: POST /products {title, description, variants:[{sku, attrs, price_cents}]}
@@ -123,7 +126,7 @@ sequenceDiagram
123
126
  **Pontos do SDK:**
124
127
 
125
128
  - Criação de produto é transação única — produto + variantes + primeira linha de `PriceHistory`.
126
- - Imagens **não trafegam pela API** — cliente faz `PUT` direto no MinIO via URL presigned (`MinIOUploadStorage.presigned_url` ou direto `AsyncMinIOClient.presigned_put_url`).
129
+ - Imagens **não trafegam pela API** — cliente faz `PUT` direto no MinIO via URL presigned gerada por `AsyncMinIOClient.presigned_put_url` (o `MinIOUploadStorage.presigned_url` é GET/leitura, não serve pra upload).
127
130
  - Catálogo público lê `image_keys` e gera URLs presigned de leitura (TTL 1h).
128
131
 
129
132
  ## 4. Checkout idempotente
@@ -172,11 +175,14 @@ sequenceDiagram
172
175
 
173
176
  **Pontos do SDK:**
174
177
 
175
- - `IdempotencyMiddleware` cobre o endpoint sem o handler precisar saber. Se o comprador retentar com a mesma `Idempotency-Key`, o middleware devolve a resposta original — handler não roda 2x, estoque não é decrementado 2x.
178
+ - `IdempotencyMiddleware` cobre o endpoint sem o handler precisar saber.
176
179
  - Reserva de estoque é **dentro da mesma transação** do `INSERT` do pedido. Falha em qualquer item aborta tudo.
177
180
  - A `SSE` notifica o stream (cliente do comprador escutando em `/orders/{id}/events`).
178
181
  - O notify_seller vai pra fila — não bloqueia a resposta do checkout.
179
182
 
183
+ !!! note "Idempotência evita decremento duplo de estoque"
184
+ Se o comprador retentar com a mesma `Idempotency-Key` (reload, timeout de rede, double-tap), o middleware devolve a resposta original — o handler **não roda 2x**, então o estoque **não é decrementado 2x** e nenhum pedido duplicado é criado.
185
+
180
186
  ## 5. Expedição + atualização em tempo real
181
187
 
182
188
  ```mermaid
@@ -234,7 +240,8 @@ stateDiagram-v2
234
240
  RETURNED --> [*]
235
241
  ```
236
242
 
237
- Transições proibidas (qualquer outra setinha) **MUST** falhar com `ConflictException("invalid state transition")`. Implementação típica num enum + `dict[from, set[to]]` no service.
243
+ !!! warning "Transições inválidas devem falhar com ConflictException"
244
+ Transições proibidas (qualquer outra setinha) **MUST** falhar com `ConflictException("invalid state transition")`. Implementação típica num enum + `dict[from, set[to]]` no service.
238
245
 
239
246
  ## Máquina de estados — Invitation
240
247
 
@@ -45,6 +45,9 @@ When the service boots you have:
45
45
  - **RabbitMQ UI** at `http://localhost:15672` (`guest/guest`)
46
46
  - **MailHog UI** at `http://localhost:8025`
47
47
 
48
+ !!! warning "Local-development credentials only"
49
+ The logins and passwords above (`minioadmin/minioadmin`, `guest/guest`, the `admin-pass-12` admin) are local-development defaults. Never deploy with them: rotate or replace every one with strong secrets before any shared or production environment.
50
+
48
51
  ## SDK stack exercised
49
52
 
50
53
  | Need | SDK primitive |
@@ -45,6 +45,9 @@ Quando o serviço subir você terá:
45
45
  - **RabbitMQ UI** em `http://localhost:15672` (`guest/guest`)
46
46
  - **MailHog UI** em `http://localhost:8025`
47
47
 
48
+ !!! warning "Credenciais só de desenvolvimento local"
49
+ Os logins e senhas acima (`minioadmin/minioadmin`, `guest/guest`, o admin `admin-pass-12`) são padrões de desenvolvimento local. Nunca faça deploy com eles: rotacione ou substitua todos por segredos fortes antes de qualquer ambiente compartilhado ou de produção.
50
+
48
51
  ## Stack do SDK exercitada
49
52
 
50
53
  | Necessidade | Primitivo do SDK |
@@ -1,6 +1,6 @@
1
1
  # Migration guide
2
2
 
3
- Breaking-change walkthroughs grouped by minor release. Stick to the version that matches what you're upgrading **from**.
3
+ Breaking-change walkthroughs grouped by minor release. Stick to the version that matches what you're upgrading **from**. The release sections are listed newest-first, so on a multi-version jump read and apply them bottom-up.
4
4
 
5
5
  ## 0.63.0 — authenticated user loaded on the request session
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Guia de migração
2
2
 
3
- Passo a passo das mudanças que quebram compatibilidade, agrupadas por release minor. Siga a versão que casa com aquela **de onde** você está atualizando.
3
+ Passo a passo das mudanças que quebram compatibilidade, agrupadas por release minor. Siga a versão que casa com aquela **de onde** você está atualizando. As seções estão listadas da mais nova para a mais antiga, então num salto de várias versões leia e aplique-as de baixo para cima.
4
4
 
5
5
  ## 0.63.0 — usuário autenticado carregado na sessão de request
6
6
 
@@ -1,7 +1,19 @@
1
1
  # Admin site
2
2
 
3
3
 
4
- Django-style management UI mounted under `/admin`. Operators sign in with a user row from the database (no separate admin password store) and browse every registered model from the browser, so the database port can stay closed on private networks. The panel is feature-complete (Django-admin parity): a list view with search / rich per-field filters (enum / FK / date-range) / sortable columns, full CRUD (create / edit / delete), bulk actions, CSV/JSON export, FK-select widgets, a dashboard with live row counts + system metrics, optional TOTP MFA at login, file/image upload fields, and an audit trail stamping `created_by` / `updated_by`. Still on the roadmap: inline/related editing.
4
+ Django-style management UI mounted under `/admin`. Operators sign in with a user row from your own database — there is no separate admin password store. Every registered model becomes browsable from the browser, so the database port can stay closed on private networks.
5
+
6
+ **What you get** (Django-admin parity):
7
+
8
+ - List view with search, rich per-field filters (enum / FK / date-range) and sortable columns.
9
+ - Full CRUD (create / edit / delete) and bulk actions.
10
+ - CSV/JSON export and FK-select widgets.
11
+ - Dashboard with live row counts + system metrics.
12
+ - Optional TOTP MFA at login.
13
+ - File/image upload fields.
14
+ - Audit trail stamping `created_by` / `updated_by`.
15
+
16
+ Still on the roadmap: inline/related editing.
5
17
 
6
18
  Requires the `[admin]` extra:
7
19
 
@@ -1,7 +1,19 @@
1
1
  # Painel admin
2
2
 
3
3
 
4
- UI de gerenciamento no estilo Django montada sob `/admin`. Operadores entram com uma linha de usuário do banco (sem store de senha de admin separado) e navegam por todo modelo registrado pelo navegador, então a porta do banco pode ficar fechada em redes privadas. O painel é completo (paridade com o Django admin): list view com busca / filtros ricos por campo (enum / FK / range de data) / colunas ordenáveis, CRUD completo (criar / editar / excluir), ações em massa, export CSV/JSON, widgets FK-select, dashboard com contagens de linhas + métricas de sistema, MFA TOTP opcional no login, campos de upload de arquivo/imagem, e trilha de auditoria carimbando `created_by` / `updated_by`. Ainda no roadmap: edição inline/relacionada.
4
+ UI de gerenciamento no estilo Django montada sob `/admin`. Operadores entram com uma linha de usuário do próprio banco não há store de senha de admin separado. Cada modelo registrado passa a ser navegável pelo navegador, então a porta do banco pode ficar fechada em redes privadas.
5
+
6
+ **O que você ganha** (paridade com o Django admin):
7
+
8
+ - List view com busca, filtros ricos por campo (enum / FK / range de data) e colunas ordenáveis.
9
+ - CRUD completo (criar / editar / excluir) e ações em massa.
10
+ - Export CSV/JSON e widgets FK-select.
11
+ - Dashboard com contagens de linhas + métricas de sistema.
12
+ - MFA TOTP opcional no login.
13
+ - Campos de upload de arquivo/imagem.
14
+ - Trilha de auditoria carimbando `created_by` / `updated_by`.
15
+
16
+ Ainda no roadmap: edição inline/relacionada.
5
17
 
6
18
  Requer o extra `[admin]`:
7
19
 
@@ -69,13 +69,19 @@ product = await repo.add_audited(ProductModel(name="Widget"), actor=str(user.id)
69
69
  the snapshot with `repo.snapshot(...)` before mutating the instance:
70
70
 
71
71
  ```python
72
- async def rename_product(repo: ProductRepository, product_id: UUID, name: str) -> None:
72
+ from uuid import UUID
73
+
74
+
75
+ async def rename_product(
76
+ repo: ProductRepository, product_id: UUID, name: str, actor: str
77
+ ) -> None:
73
78
  """Rename a product, recording the diff in the audit trail.
74
79
 
75
80
  Args:
76
81
  repo (ProductRepository): The product repository.
77
82
  product_id (UUID): The product id.
78
83
  name (str): The new name.
84
+ actor (str): Who performed the change.
79
85
 
80
86
  Raises:
81
87
  NotFoundException: If the product does not exist.
@@ -83,7 +89,7 @@ async def rename_product(repo: ProductRepository, product_id: UUID, name: str) -
83
89
  product = await repo.get_by_id(product_id)
84
90
  before = repo.snapshot(product) # ← before mutating
85
91
  product.name = name
86
- await repo.update_audited(product, before, actor=str(user.id))
92
+ await repo.update_audited(product, before, actor=actor)
87
93
  # writes an UPDATE entry with {"name": {"before": "...", "after": "..."}}
88
94
  ```
89
95
 
@@ -58,13 +58,19 @@ product = await repo.add_audited(ProductModel(name="Widget"), actor=str(user.id)
58
58
  `update_audited` precisa do estado **anterior** para calcular o diff. Tire o snapshot com `repo.snapshot(...)` antes de alterar a instância:
59
59
 
60
60
  ```python
61
- async def rename_product(repo: ProductRepository, product_id: UUID, name: str) -> None:
61
+ from uuid import UUID
62
+
63
+
64
+ async def rename_product(
65
+ repo: ProductRepository, product_id: UUID, name: str, actor: str
66
+ ) -> None:
62
67
  """Renomeia um produto registrando o diff na auditoria.
63
68
 
64
69
  Args:
65
70
  repo (ProductRepository): O repository de produtos.
66
71
  product_id (UUID): O id do produto.
67
72
  name (str): O novo nome.
73
+ actor (str): Quem realizou a alteração.
68
74
 
69
75
  Raises:
70
76
  NotFoundException: Se o produto não existe.
@@ -72,7 +78,7 @@ async def rename_product(repo: ProductRepository, product_id: UUID, name: str) -
72
78
  product = await repo.get_by_id(product_id)
73
79
  before = repo.snapshot(product) # ← antes de mutar
74
80
  product.name = name
75
- await repo.update_audited(product, before, actor=str(user.id))
81
+ await repo.update_audited(product, before, actor=actor)
76
82
  # grava uma entrada UPDATE com {"name": {"before": "...", "after": "..."}}
77
83
  ```
78
84
 
@@ -25,7 +25,7 @@ Requires:
25
25
  - `[email]` (aiosmtplib + Jinja2 + email-validator) — optional; when missing, the link lands in the response body instead of an email.
26
26
 
27
27
  ```bash
28
- uv add "tempest-fastapi-sdk[auth,email]>=0.31.0"
28
+ uv add "tempest-fastapi-sdk[auth,email]>=0.89.0"
29
29
  ```
30
30
 
31
31
  ```python
@@ -824,8 +824,8 @@ services:
824
824
 
825
825
  `SMTP_PORT=2525`, open `http://localhost:5000`.
826
826
 
827
- !!! tip "Already on `tempest generate --docker`?"
828
- In v0.32+ the docker-compose generator will accept `--with mailhog` as a shortcut. For now (v0.31.x) drop one of the blocks above into the `docker-compose.yaml` the CLI generates.
827
+ !!! tip "`tempest generate --docker` already includes Mailhog"
828
+ When the project pins the `[email]` extra, `tempest generate --docker` **auto-appends** a Mailhog service to the `docker-compose.yaml` no manual paste and no `--with mailhog` flag. The blocks above are just a reference, or for when you prefer smtp4dev.
829
829
 
830
830
  ---
831
831
 
@@ -25,7 +25,7 @@ Requer:
25
25
  - `[email]` (aiosmtplib + Jinja2 + email-validator) — opcional; quando ausente, os links vão no body da resposta em vez de e-mail.
26
26
 
27
27
  ```bash
28
- uv add "tempest-fastapi-sdk[auth,email]>=0.31.0"
28
+ uv add "tempest-fastapi-sdk[auth,email]>=0.89.0"
29
29
  ```
30
30
 
31
31
  ```python
@@ -818,8 +818,8 @@ services:
818
818
 
819
819
  `SMTP_PORT=2525`, abra `http://localhost:5000`.
820
820
 
821
- !!! tip "Já tem `tempest generate --docker`?"
822
- Em v0.32+ o gerador de docker-compose vai aceitar `--with mailhog` como atalho. Hoje (v0.31.x) você cola um dos blocos acima no `docker-compose.yaml` gerado pela CLI.
821
+ !!! tip "`tempest generate --docker` já inclui o Mailhog"
822
+ Quando o projeto fixa o extra `[email]`, o `tempest generate --docker` **anexa automaticamente** um serviço Mailhog ao `docker-compose.yaml` sem colar bloco na mão e sem flag `--with mailhog`. Os blocos acima ficam só como referência, ou para quem prefere smtp4dev.
823
823
 
824
824
  ---
825
825