tempest-fastapi-sdk 0.74.0__tar.gz → 0.76.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 (449) hide show
  1. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/CHANGELOG.md +29 -0
  2. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/PKG-INFO +10 -10
  3. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/README.md +9 -9
  4. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/br-helpers.en.md +66 -11
  5. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/br-helpers.md +58 -11
  6. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/pyproject.toml +1 -1
  7. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/__init__.py +19 -1
  8. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/__init__.py +18 -0
  9. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/locations.py +69 -0
  10. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/regex.py +24 -10
  11. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_locations.py +33 -0
  12. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_regex.py +26 -4
  13. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/uv.lock +1 -1
  14. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/.github/workflows/ci.yml +0 -0
  15. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/.github/workflows/docs.yml +0 -0
  16. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/.github/workflows/release-pypi.yml +0 -0
  17. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/.gitignore +0 -0
  18. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/.python-version +0 -0
  19. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/CLAUDE.md +0 -0
  20. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/Makefile +0 -0
  21. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/architecture.en.md +0 -0
  22. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/architecture.md +0 -0
  23. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/changelog.en.md +0 -0
  24. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/changelog.md +0 -0
  25. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/contributing.en.md +0 -0
  26. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/contributing.md +0 -0
  27. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/index.en.md +0 -0
  28. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/index.md +0 -0
  29. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/installation.en.md +0 -0
  30. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/installation.md +0 -0
  31. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/index.en.md +0 -0
  32. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/index.md +0 -0
  33. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/api.en.md +0 -0
  34. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/api.md +0 -0
  35. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/business-rules.en.md +0 -0
  36. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/business-rules.md +0 -0
  37. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/domain.en.md +0 -0
  38. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/domain.md +0 -0
  39. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/flows.en.md +0 -0
  40. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/flows.md +0 -0
  41. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/index.en.md +0 -0
  42. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/learning/marketplace/index.md +0 -0
  43. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/migration.en.md +0 -0
  44. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/migration.md +0 -0
  45. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/admin.en.md +0 -0
  46. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/admin.md +0 -0
  47. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/audit-trail.en.md +0 -0
  48. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/audit-trail.md +0 -0
  49. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/auth-flow.en.md +0 -0
  50. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/auth-flow.md +0 -0
  51. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/cache.en.md +0 -0
  52. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/cache.md +0 -0
  53. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/cli.en.md +0 -0
  54. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/cli.md +0 -0
  55. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/database.en.md +0 -0
  56. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/database.md +0 -0
  57. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/deploy-safety.en.md +0 -0
  58. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/deploy-safety.md +0 -0
  59. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/downloads.en.md +0 -0
  60. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/downloads.md +0 -0
  61. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/email.en.md +0 -0
  62. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/email.md +0 -0
  63. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/feature-flags.en.md +0 -0
  64. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/feature-flags.md +0 -0
  65. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/http-client.en.md +0 -0
  66. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/http-client.md +0 -0
  67. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/http.en.md +0 -0
  68. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/http.md +0 -0
  69. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/idempotency.en.md +0 -0
  70. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/idempotency.md +0 -0
  71. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/index.en.md +0 -0
  72. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/index.md +0 -0
  73. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/logging.en.md +0 -0
  74. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/logging.md +0 -0
  75. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/metrics.en.md +0 -0
  76. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/metrics.md +0 -0
  77. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/mfa.en.md +0 -0
  78. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/mfa.md +0 -0
  79. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/multi-tenant.en.md +0 -0
  80. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/multi-tenant.md +0 -0
  81. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/observability.en.md +0 -0
  82. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/observability.md +0 -0
  83. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/offline-sync.en.md +0 -0
  84. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/offline-sync.md +0 -0
  85. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/outbox.en.md +0 -0
  86. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/outbox.md +0 -0
  87. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/queue-tasks.en.md +0 -0
  88. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/queue-tasks.md +0 -0
  89. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/realtime.en.md +0 -0
  90. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/realtime.md +0 -0
  91. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/refresh-tokens.en.md +0 -0
  92. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/refresh-tokens.md +0 -0
  93. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/security.en.md +0 -0
  94. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/security.md +0 -0
  95. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/sessions.en.md +0 -0
  96. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/sessions.md +0 -0
  97. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/storage.en.md +0 -0
  98. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/storage.md +0 -0
  99. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/stored-files.en.md +0 -0
  100. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/stored-files.md +0 -0
  101. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/testing.en.md +0 -0
  102. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/testing.md +0 -0
  103. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/typing.en.md +0 -0
  104. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/typing.md +0 -0
  105. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/uploads.en.md +0 -0
  106. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/uploads.md +0 -0
  107. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/utilities.en.md +0 -0
  108. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/utilities.md +0 -0
  109. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/webpush.en.md +0 -0
  110. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/webpush.md +0 -0
  111. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/websocket.en.md +0 -0
  112. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/recipes/websocket.md +0 -0
  113. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/reference.en.md +0 -0
  114. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/reference.md +0 -0
  115. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/roadmap.en.md +0 -0
  116. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/roadmap.md +0 -0
  117. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/tutorial.en.md +0 -0
  118. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/docs/tutorial.md +0 -0
  119. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/mkdocs.yml +0 -0
  120. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/mkdocs_hooks/llmstxt.py +0 -0
  121. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/scripts/extract_recipe.py +0 -0
  122. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
  123. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
  124. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/config.py +0 -0
  125. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/discovery.py +0 -0
  126. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
  127. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/router.py +0 -0
  128. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/session.py +0 -0
  129. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/site.py +0 -0
  130. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
  131. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
  132. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
  133. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
  134. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
  135. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
  136. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
  137. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
  138. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
  139. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/admin/theme.py +0 -0
  140. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
  141. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
  142. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
  143. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
  144. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
  145. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
  146. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
  147. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
  148. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
  149. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
  150. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
  151. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
  152. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
  153. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
  154. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
  155. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
  156. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
  157. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
  158. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
  159. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/server.py +0 -0
  160. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/static.py +0 -0
  161. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
  162. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
  163. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
  164. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
  165. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/locale.py +0 -0
  166. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
  167. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/router.py +0 -0
  168. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
  169. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/service.py +0 -0
  170. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
  171. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
  172. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
  173. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
  174. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
  175. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
  176. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
  177. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
  178. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
  179. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
  180. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
  181. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
  182. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
  183. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
  184. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
  185. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
  186. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
  187. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
  188. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
  189. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
  190. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
  191. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
  192. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
  193. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
  194. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
  195. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
  196. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
  197. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
  198. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
  199. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
  200. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
  201. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
  202. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
  203. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
  204. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
  205. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
  206. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
  207. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
  208. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
  209. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
  210. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
  211. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
  212. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
  213. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
  214. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
  215. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
  216. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
  217. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/config.py +0 -0
  218. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/db.py +0 -0
  219. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
  220. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
  221. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
  222. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/main.py +0 -0
  223. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/new.py +0 -0
  224. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
  225. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
  226. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/cli/user.py +0 -0
  227. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
  228. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
  229. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
  230. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/core/context.py +0 -0
  231. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/core/enums.py +0 -0
  232. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/core/logging.py +0 -0
  233. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/core/typed.py +0 -0
  234. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
  235. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
  236. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
  237. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
  238. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/audit.py +0 -0
  239. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/backup.py +0 -0
  240. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/connection.py +0 -0
  241. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
  242. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
  243. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/model.py +0 -0
  244. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
  245. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/repository.py +0 -0
  246. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
  247. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
  248. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
  249. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
  250. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
  251. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
  252. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
  253. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
  254. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
  255. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
  256. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
  257. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
  258. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
  259. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
  260. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
  261. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
  262. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
  263. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/flags/__init__.py +0 -0
  264. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/flags/backends.py +0 -0
  265. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
  266. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/flags/service.py +0 -0
  267. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/py.typed +0 -0
  268. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
  269. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
  270. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
  271. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
  272. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
  273. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
  274. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
  275. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
  276. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
  277. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/services/base.py +0 -0
  278. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
  279. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
  280. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
  281. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
  282. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
  283. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
  284. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
  285. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
  286. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
  287. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/settings/base.py +0 -0
  288. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
  289. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
  290. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
  291. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
  292. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
  293. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
  294. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
  295. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
  296. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
  297. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/testing/database.py +0 -0
  298. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
  299. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
  300. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
  301. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
  302. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/download.py +0 -0
  303. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/email.py +0 -0
  304. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
  305. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
  306. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/log.py +0 -0
  307. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
  308. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
  309. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/password.py +0 -0
  310. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
  311. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
  312. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
  313. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
  314. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
  315. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
  316. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
  317. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
  318. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
  319. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
  320. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
  321. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/__init__.py +0 -0
  322. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/__init__.py +0 -0
  323. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_auth.py +0 -0
  324. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_discovery.py +0 -0
  325. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_forms.py +0 -0
  326. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_logs_nav.py +0 -0
  327. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_mfa.py +0 -0
  328. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_router.py +0 -0
  329. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_site.py +0 -0
  330. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_theme.py +0 -0
  331. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/admin/test_user_model.py +0 -0
  332. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/__init__.py +0 -0
  333. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_body_size.py +0 -0
  334. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_cookies.py +0 -0
  335. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_cors.py +0 -0
  336. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_csrf.py +0 -0
  337. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_dependencies_auth.py +0 -0
  338. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_graceful.py +0 -0
  339. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_handlers.py +0 -0
  340. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_health_router.py +0 -0
  341. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_idempotency.py +0 -0
  342. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_jwt_dependency.py +0 -0
  343. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_logs_router.py +0 -0
  344. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_oauth.py +0 -0
  345. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_prometheus.py +0 -0
  346. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_rate_limit.py +0 -0
  347. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_rate_limit_extras.py +0 -0
  348. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_request_id_middleware.py +0 -0
  349. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_role_dependency.py +0 -0
  350. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_server.py +0 -0
  351. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_static.py +0 -0
  352. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_tool_spec.py +0 -0
  353. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_tracing.py +0 -0
  354. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_webhooks.py +0 -0
  355. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/api/test_webhooks_rsa.py +0 -0
  356. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/auth/__init__.py +0 -0
  357. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/auth/test_guards.py +0 -0
  358. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/auth/test_locale.py +0 -0
  359. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/auth/test_mfa.py +0 -0
  360. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/auth/test_refresh.py +0 -0
  361. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/auth/test_refresh_db.py +0 -0
  362. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/auth/test_service.py +0 -0
  363. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cache/__init__.py +0 -0
  364. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cache/test_decorator.py +0 -0
  365. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cache/test_invalidation.py +0 -0
  366. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cache/test_redis_manager.py +0 -0
  367. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/__init__.py +0 -0
  368. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_config.py +0 -0
  369. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_db.py +0 -0
  370. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_db_seed.py +0 -0
  371. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_docker_compose.py +0 -0
  372. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_generate.py +0 -0
  373. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_lint_strictness.py +0 -0
  374. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_main.py +0 -0
  375. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_secrets.py +0 -0
  376. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/cli/test_user.py +0 -0
  377. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/conftest.py +0 -0
  378. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/controllers/__init__.py +0 -0
  379. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/controllers/test_base.py +0 -0
  380. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/core/__init__.py +0 -0
  381. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/core/test_context.py +0 -0
  382. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/core/test_enums.py +0 -0
  383. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/core/test_logging.py +0 -0
  384. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/core/test_typed.py +0 -0
  385. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/__init__.py +0 -0
  386. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_alembic_hooks.py +0 -0
  387. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_audit.py +0 -0
  388. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_backup.py +0 -0
  389. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_bulk_ops.py +0 -0
  390. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_connection.py +0 -0
  391. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_migrations.py +0 -0
  392. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_mixins.py +0 -0
  393. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_model.py +0 -0
  394. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_outbox.py +0 -0
  395. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_repository.py +0 -0
  396. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_safe_upgrade.py +0 -0
  397. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_slow_query.py +0 -0
  398. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/db/test_tenant.py +0 -0
  399. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/exceptions/__init__.py +0 -0
  400. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/exceptions/test_exceptions.py +0 -0
  401. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/exceptions/test_i18n.py +0 -0
  402. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/flags/__init__.py +0 -0
  403. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/flags/test_flags.py +0 -0
  404. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/queue/__init__.py +0 -0
  405. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/queue/test_manager.py +0 -0
  406. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/schemas/__init__.py +0 -0
  407. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/schemas/test_base.py +0 -0
  408. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/schemas/test_cursor_pagination.py +0 -0
  409. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/schemas/test_link_headers.py +0 -0
  410. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/schemas/test_pagination.py +0 -0
  411. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/schemas/test_response.py +0 -0
  412. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/services/__init__.py +0 -0
  413. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/services/test_base.py +0 -0
  414. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/services/test_file_mixin.py +0 -0
  415. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/sessions/__init__.py +0 -0
  416. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/sessions/test_sessions.py +0 -0
  417. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/settings/__init__.py +0 -0
  418. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/settings/test_base.py +0 -0
  419. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/settings/test_mixins.py +0 -0
  420. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/sse/__init__.py +0 -0
  421. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/sse/test_event_stream.py +0 -0
  422. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/storage/__init__.py +0 -0
  423. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/storage/test_minio_client.py +0 -0
  424. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/tasks/__init__.py +0 -0
  425. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/tasks/test_manager.py +0 -0
  426. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/tasks/test_scheduler.py +0 -0
  427. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/testing/__init__.py +0 -0
  428. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/testing/test_database.py +0 -0
  429. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/__init__.py +0 -0
  430. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_client_ip.py +0 -0
  431. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_datetime.py +0 -0
  432. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_dict.py +0 -0
  433. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_download.py +0 -0
  434. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_email.py +0 -0
  435. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_http_client.py +0 -0
  436. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_jwt.py +0 -0
  437. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_lazy_extras.py +0 -0
  438. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_log.py +0 -0
  439. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_metrics.py +0 -0
  440. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_opaque_token.py +0 -0
  441. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_password.py +0 -0
  442. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_storage_backends.py +0 -0
  443. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_throttle.py +0 -0
  444. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/utils/test_upload.py +0 -0
  445. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/webpush/__init__.py +0 -0
  446. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/webpush/test_dispatcher.py +0 -0
  447. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/webpush/test_schemas.py +0 -0
  448. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/websockets/__init__.py +0 -0
  449. {tempest_fastapi_sdk-0.74.0 → tempest_fastapi_sdk-0.76.0}/tests/websockets/test_hub_and_router.py +0 -0
@@ -5,6 +5,35 @@ 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.76.0] — 2026-06-27
9
+
10
+ ### Changed
11
+
12
+ - **BR field types now carry a `Field` suffix.** The Pydantic
13
+ annotated-type aliases were renamed to make their role obvious at the
14
+ import site, matching `UFField` / `CityNameField`: `CPF` -> `CPFField`,
15
+ `CNPJ` -> `CNPJField`, `CPFOrCNPJ` -> `CPFOrCNPJField`,
16
+ `PhoneBR` -> `PhoneBRField`, `CEP` -> `CEPField`. The old names remain
17
+ exported as **deprecated aliases** (identical types), so existing
18
+ imports keep working; prefer the `*Field` names. Slated for removal in
19
+ a future major.
20
+
21
+ ## [0.75.0] — 2026-06-27
22
+
23
+ ### Added
24
+
25
+ - **Frontend `<select>` choices for BR localities (`ChoiceBR`,
26
+ `uf_choices`, `region_choices`, `city_choices`).** The bundled
27
+ states/cities dataset already backed the `UFField` / `CityNameField`
28
+ validation fields; these helpers make the *other* role first-class —
29
+ feeding dropdowns. Each returns `list[ChoiceBR]`, a typed Pydantic
30
+ schema (`value`/`label`) that serializes as
31
+ `{"value": ..., "label": ...}` and shows up typed in OpenAPI:
32
+ `uf_choices()` pairs each acronym (the same value `UFField` validates)
33
+ with the full state name, `region_choices()` lists the 5 IBGE
34
+ macro-regions, and `city_choices(uf)` lists a state's municipalities.
35
+ Exported from `tempest_fastapi_sdk` and `tempest_fastapi_sdk.utils`.
36
+
8
37
  ## [0.74.0] — 2026-06-27
9
38
 
10
39
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tempest-fastapi-sdk
3
- Version: 0.74.0
3
+ Version: 0.76.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
@@ -259,7 +259,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
259
259
  | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
260
260
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
261
261
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `AsyncTaskBrokerManager` (TaskIQ lifecycle wrapper), `AsyncTaskScheduler` (periodic / cron tasks) |
262
- | `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]`)*, BR regex helpers (`CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `CEP`, `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
262
+ | `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]`)*, 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`) |
263
263
  | `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` |
264
264
 
265
265
  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` and `tempest_fastapi_sdk.tasks` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import AsyncBrokerManager`).
@@ -1609,7 +1609,7 @@ Every helper has its own recipe — this section is the quick map:
1609
1609
  | `DownloadUtils`, `build_content_disposition` | [Serving private files through the API](#serving-private-files-through-the-api-downloadutils) |
1610
1610
  | `LogUtils` + `configure_logging` | [Structured logging & request IDs recipe](#structured-logging--request-ids-recipe) |
1611
1611
  | `MetricsUtils` (CPU/memory/disk/GPU) | [System metrics recipe](#system-metrics-recipe) |
1612
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `is_valid_*`, `normalize_*`, `only_digits` | [BR document & phone validation recipe](#br-document--phone-validation-recipe) |
1612
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `is_valid_*`, `normalize_*`, `only_digits` | [BR document & phone validation recipe](#br-document--phone-validation-recipe) |
1613
1613
 
1614
1614
  ### BR document & phone validation recipe
1615
1615
 
@@ -1622,7 +1622,7 @@ Every helper has its own recipe — this section is the quick map:
1622
1622
  | `is_valid_phone_br` | `(str) -> bool` | BR phone shape: optional `+55`, optional DDD, optional 9th digit. |
1623
1623
  | `normalize_cpf`, `normalize_cnpj`, `normalize_cpf_cnpj`, `normalize_phone_br` | `(str) -> str` | Strip mask to digits-only; raise `ValueError` if invalid. |
1624
1624
  | `only_digits` | `(str) -> str` | Strip every non-digit character. |
1625
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR` | `Annotated[str, AfterValidator(...)]` | Drop-in Pydantic field types — validate + normalize automatically. |
1625
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` | `Annotated[str, AfterValidator(...)]` | Drop-in Pydantic field types — validate + normalize automatically. The old names without the `Field` suffix (`CPF`, `CNPJ`, …) remain as deprecated aliases since v0.76. |
1626
1626
 
1627
1627
  #### Schema usage
1628
1628
 
@@ -1630,7 +1630,7 @@ Every helper has its own recipe — this section is the quick map:
1630
1630
  from pydantic import EmailStr, Field
1631
1631
 
1632
1632
  from tempest_fastapi_sdk import BaseSchema
1633
- from tempest_fastapi_sdk.utils import CPF, CPFOrCNPJ, PhoneBR
1633
+ from tempest_fastapi_sdk.utils import CPFOrCNPJField, PhoneBRField
1634
1634
 
1635
1635
 
1636
1636
  class CustomerCreateSchema(BaseSchema):
@@ -1644,8 +1644,8 @@ class CustomerCreateSchema(BaseSchema):
1644
1644
 
1645
1645
  name: str = Field(min_length=1, max_length=128)
1646
1646
  email: EmailStr
1647
- document: CPFOrCNPJ
1648
- phone: PhoneBR
1647
+ document: CPFOrCNPJField
1648
+ phone: PhoneBRField
1649
1649
  ```
1650
1650
 
1651
1651
  Valid input:
@@ -2830,15 +2830,15 @@ async def update_perms(user_id: UUID) -> None:
2830
2830
 
2831
2831
  ### CEP (Brazilian zipcode) recipe
2832
2832
 
2833
- `CEP` is an `Annotated[str, AfterValidator(normalize_cep)]` type — drop it into a Pydantic schema and inbound values are accepted as `"01310-100"` or `"01310100"`, normalized to 8 digits, and rejected (`ValidationError` → HTTP 422 envelope) when they don't match the shape. CEPs have no check digits, so validation is format-only.
2833
+ `CEPField` is an `Annotated[str, AfterValidator(normalize_cep)]` type — drop it into a Pydantic schema and inbound values are accepted as `"01310-100"` or `"01310100"`, normalized to 8 digits, and rejected (`ValidationError` → HTTP 422 envelope) when they don't match the shape. CEPs have no check digits, so validation is format-only.
2834
2834
 
2835
2835
  ```python
2836
2836
  from tempest_fastapi_sdk import BaseSchema
2837
- from tempest_fastapi_sdk.utils import CEP
2837
+ from tempest_fastapi_sdk.utils import CEPField
2838
2838
 
2839
2839
 
2840
2840
  class AddressCreateSchema(BaseSchema):
2841
- cep: CEP
2841
+ cep: CEPField
2842
2842
  street: str
2843
2843
  number: str
2844
2844
  ```
@@ -156,7 +156,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
156
156
  | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
157
157
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
158
158
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `AsyncTaskBrokerManager` (TaskIQ lifecycle wrapper), `AsyncTaskScheduler` (periodic / cron tasks) |
159
- | `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]`)*, BR regex helpers (`CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `CEP`, `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
159
+ | `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]`)*, 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`) |
160
160
  | `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` |
161
161
 
162
162
  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` and `tempest_fastapi_sdk.tasks` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import AsyncBrokerManager`).
@@ -1506,7 +1506,7 @@ Every helper has its own recipe — this section is the quick map:
1506
1506
  | `DownloadUtils`, `build_content_disposition` | [Serving private files through the API](#serving-private-files-through-the-api-downloadutils) |
1507
1507
  | `LogUtils` + `configure_logging` | [Structured logging & request IDs recipe](#structured-logging--request-ids-recipe) |
1508
1508
  | `MetricsUtils` (CPU/memory/disk/GPU) | [System metrics recipe](#system-metrics-recipe) |
1509
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `is_valid_*`, `normalize_*`, `only_digits` | [BR document & phone validation recipe](#br-document--phone-validation-recipe) |
1509
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `is_valid_*`, `normalize_*`, `only_digits` | [BR document & phone validation recipe](#br-document--phone-validation-recipe) |
1510
1510
 
1511
1511
  ### BR document & phone validation recipe
1512
1512
 
@@ -1519,7 +1519,7 @@ Every helper has its own recipe — this section is the quick map:
1519
1519
  | `is_valid_phone_br` | `(str) -> bool` | BR phone shape: optional `+55`, optional DDD, optional 9th digit. |
1520
1520
  | `normalize_cpf`, `normalize_cnpj`, `normalize_cpf_cnpj`, `normalize_phone_br` | `(str) -> str` | Strip mask to digits-only; raise `ValueError` if invalid. |
1521
1521
  | `only_digits` | `(str) -> str` | Strip every non-digit character. |
1522
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR` | `Annotated[str, AfterValidator(...)]` | Drop-in Pydantic field types — validate + normalize automatically. |
1522
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` | `Annotated[str, AfterValidator(...)]` | Drop-in Pydantic field types — validate + normalize automatically. The old names without the `Field` suffix (`CPF`, `CNPJ`, …) remain as deprecated aliases since v0.76. |
1523
1523
 
1524
1524
  #### Schema usage
1525
1525
 
@@ -1527,7 +1527,7 @@ Every helper has its own recipe — this section is the quick map:
1527
1527
  from pydantic import EmailStr, Field
1528
1528
 
1529
1529
  from tempest_fastapi_sdk import BaseSchema
1530
- from tempest_fastapi_sdk.utils import CPF, CPFOrCNPJ, PhoneBR
1530
+ from tempest_fastapi_sdk.utils import CPFOrCNPJField, PhoneBRField
1531
1531
 
1532
1532
 
1533
1533
  class CustomerCreateSchema(BaseSchema):
@@ -1541,8 +1541,8 @@ class CustomerCreateSchema(BaseSchema):
1541
1541
 
1542
1542
  name: str = Field(min_length=1, max_length=128)
1543
1543
  email: EmailStr
1544
- document: CPFOrCNPJ
1545
- phone: PhoneBR
1544
+ document: CPFOrCNPJField
1545
+ phone: PhoneBRField
1546
1546
  ```
1547
1547
 
1548
1548
  Valid input:
@@ -2727,15 +2727,15 @@ async def update_perms(user_id: UUID) -> None:
2727
2727
 
2728
2728
  ### CEP (Brazilian zipcode) recipe
2729
2729
 
2730
- `CEP` is an `Annotated[str, AfterValidator(normalize_cep)]` type — drop it into a Pydantic schema and inbound values are accepted as `"01310-100"` or `"01310100"`, normalized to 8 digits, and rejected (`ValidationError` → HTTP 422 envelope) when they don't match the shape. CEPs have no check digits, so validation is format-only.
2730
+ `CEPField` is an `Annotated[str, AfterValidator(normalize_cep)]` type — drop it into a Pydantic schema and inbound values are accepted as `"01310-100"` or `"01310100"`, normalized to 8 digits, and rejected (`ValidationError` → HTTP 422 envelope) when they don't match the shape. CEPs have no check digits, so validation is format-only.
2731
2731
 
2732
2732
  ```python
2733
2733
  from tempest_fastapi_sdk import BaseSchema
2734
- from tempest_fastapi_sdk.utils import CEP
2734
+ from tempest_fastapi_sdk.utils import CEPField
2735
2735
 
2736
2736
 
2737
2737
  class AddressCreateSchema(BaseSchema):
2738
- cep: CEP
2738
+ cep: CEPField
2739
2739
  street: str
2740
2740
  number: str
2741
2741
  ```
@@ -14,7 +14,10 @@ Document validators (CPF, CNPJ, CEP) and phone number normalizer/validator for B
14
14
  | `is_valid_phone_br` | `(str) -> bool` | BR phone shape: optional `+55`, optional DDD, optional 9th digit. |
15
15
  | `normalize_cpf`, `normalize_cnpj`, `normalize_cpf_cnpj`, `normalize_phone_br` | `(str) -> str` | Strip mask to digits-only; raise `ValueError` if invalid. |
16
16
  | `only_digits` | `(str) -> str` | Strip every non-digit character. |
17
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR` | `Annotated[str, AfterValidator(...)]` | Drop-in Pydantic field types — validate + normalize automatically. |
17
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField` | `Annotated[str, AfterValidator(...)]` | Drop-in Pydantic field types — validate + normalize automatically. |
18
+
19
+ !!! info "`Field` suffix (since v0.76)"
20
+ The field types now carry a `Field` suffix (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`) to make it obvious they are schema field types — like `UFField` / `CityNameField`. The old names (`CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `CEP`) still work as **deprecated aliases**; prefer the new ones.
18
21
 
19
22
  #### Schema usage
20
23
 
@@ -22,7 +25,7 @@ Document validators (CPF, CNPJ, CEP) and phone number normalizer/validator for B
22
25
  from pydantic import EmailStr, Field
23
26
 
24
27
  from tempest_fastapi_sdk import BaseSchema
25
- from tempest_fastapi_sdk.utils import CPF, CPFOrCNPJ, PhoneBR
28
+ from tempest_fastapi_sdk.utils import CPFOrCNPJField, PhoneBRField
26
29
 
27
30
 
28
31
  class CustomerCreateSchema(BaseSchema):
@@ -36,8 +39,8 @@ class CustomerCreateSchema(BaseSchema):
36
39
 
37
40
  name: str = Field(min_length=1, max_length=128)
38
41
  email: EmailStr
39
- document: CPFOrCNPJ
40
- phone: PhoneBR
42
+ document: CPFOrCNPJField
43
+ phone: PhoneBRField
41
44
  ```
42
45
 
43
46
  Valid input:
@@ -87,15 +90,15 @@ await repo.get({"document": normalize_cpf_cnpj(query)})
87
90
  ## CEP (zipcode)
88
91
 
89
92
 
90
- `CEP` is an `Annotated[str, AfterValidator(normalize_cep)]` type — drop it into a Pydantic schema and inbound values are accepted as `"01310-100"` or `"01310100"`, normalized to 8 digits, and rejected (`ValidationError` → HTTP 422 envelope) when they don't match the shape. CEPs have no check digits, so validation is format-only.
93
+ `CEPField` is an `Annotated[str, AfterValidator(normalize_cep)]` type — drop it into a Pydantic schema and inbound values are accepted as `"01310-100"` or `"01310100"`, normalized to 8 digits, and rejected (`ValidationError` → HTTP 422 envelope) when they don't match the shape. CEPs have no check digits, so validation is format-only.
91
94
 
92
95
  ```python
93
96
  from tempest_fastapi_sdk import BaseSchema
94
- from tempest_fastapi_sdk.utils import CEP
97
+ from tempest_fastapi_sdk.utils import CEPField
95
98
 
96
99
 
97
100
  class AddressCreateSchema(BaseSchema):
98
- cep: CEP
101
+ cep: CEPField
99
102
  street: str
100
103
  number: str
101
104
  ```
@@ -174,6 +177,57 @@ def validate_address(uf: UF, city: str) -> str:
174
177
  !!! tip "City lookup ignores accents and case"
175
178
  `is_valid_city("SP", "sao paulo")` and `normalize_city("rj", "RIO DE JANEIRO")` both work — the comparison strips accents, case and surrounding whitespace. `normalize_city` always returns the canonical proper-case name (`"São Paulo"`, `"Rio de Janeiro"`).
176
179
 
180
+ ### Choices ready for a frontend `<select>`
181
+
182
+ The same data serves **two roles**: validating input (the `UFField` /
183
+ `CityNameField` fields above) **and** feeding the frontend dropdowns. For
184
+ the latter, `uf_choices`, `region_choices` and `city_choices` return
185
+ `list[ChoiceBR]` — each item a `value` (what you store/submit) + `label`
186
+ (what the user sees), exactly the shape an `<option>` wants:
187
+
188
+ ```python
189
+ from fastapi import APIRouter
190
+
191
+ from tempest_fastapi_sdk.utils import ChoiceBR, city_choices, region_choices, uf_choices
192
+
193
+ router = APIRouter(prefix="/api/locations", tags=["locations"])
194
+
195
+
196
+ @router.get("/states")
197
+ def list_uf_choices() -> list[ChoiceBR]:
198
+ """UF choices: value = acronym, label = state name."""
199
+ return uf_choices()
200
+
201
+
202
+ @router.get("/regions")
203
+ def list_region_choices() -> list[ChoiceBR]:
204
+ """Choices for the 5 IBGE macro-regions."""
205
+ return region_choices()
206
+
207
+
208
+ @router.get("/states/{uf}/cities")
209
+ def list_city_choices(uf: str) -> list[ChoiceBR]:
210
+ """City choices for a UF: value = label = municipality name."""
211
+ return city_choices(uf)
212
+ ```
213
+
214
+ The `value` of `uf_choices()` is the acronym — the same value `UFField`
215
+ validates on the way back, so whatever the `<select>` submits drops
216
+ straight into your schema:
217
+
218
+ ```python
219
+ uf_choices()[0] # ChoiceBR(value="AC", label="Acre")
220
+ region_choices()[0] # ChoiceBR(value="Norte", label="Norte")
221
+ city_choices("sp")[0] # ChoiceBR(value="Adamantina", label="Adamantina")
222
+ ```
223
+
224
+ !!! info "Why `ChoiceBR` instead of a tuple?"
225
+ `ChoiceBR` is a Pydantic schema (`value: str`, `label: str`), so it
226
+ serializes as `{"value": ..., "label": ...}` in JSON and shows up
227
+ typed in OpenAPI/Swagger — no untyped "magic field". For the classic
228
+ state→city case, the frontend calls `/states`, then `/states/{uf}/cities`
229
+ once a UF is picked.
230
+
177
231
  ### Imperative variants
178
232
 
179
233
  | Function | What it does |
@@ -185,13 +239,14 @@ def validate_address(uf: UF, city: str) -> str:
185
239
  | `normalize_city(uf, city)` | Canonical municipality name; raises `ValueError` when unknown. |
186
240
 
187
241
  !!! note "A states/cities endpoint for the frontend"
188
- To populate state and city `<select>`s, return `list_states()` directly (each `StateBR` already carries `cities`), or a lean `GET /states/{uf}/cities` endpoint returning `cities_by_uf(uf)`. Since it's in-memory data, it never touches the database.
242
+ For `<select>`s, prefer `uf_choices()` / `region_choices()` / `city_choices(uf)` (value/label shape). If you need the whole state with its city list, `list_states()` returns each `StateBR` with its `cities`. Since it's all in-memory, it never touches the database.
189
243
 
190
244
  #### Recap
191
245
 
192
246
  - `UF` (StrEnum, 27 acronyms) + `Region` (5 IBGE macro-regions).
193
- - `StateBR` / `CityBR` for typed responses.
247
+ - `StateBR` / `CityBR` for typed responses; `ChoiceBR` (`value`/`label`) for dropdowns.
194
248
  - `list_states`, `get_state`, `cities_by_uf`, `states_by_region` to query the bundled table.
249
+ - `uf_choices`, `region_choices`, `city_choices` for frontend `<select>`s.
195
250
  - `UFField` / `CityNameField` for schema fields; `is_valid_*` / `normalize_*` for imperative validation in the service.
196
251
 
197
252
 
@@ -267,6 +322,6 @@ Every helper has its own recipe — this section is the quick map:
267
322
  | `DownloadUtils`, `build_content_disposition` | [Serving private files through the API](http.md#serving-private-files-through-the-api-downloadutils) |
268
323
  | `LogUtils` + `configure_logging` | [Structured logging & request IDs recipe](logging.md) |
269
324
  | `MetricsUtils` (CPU/memory/disk/GPU) | [System metrics recipe](metrics.md) |
270
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `is_valid_*`, `normalize_*`, `only_digits` | [CPF / CNPJ / phone](#cpf-cnpj-phone) |
271
- | `UF`, `Region`, `StateBR`, `CityBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `is_valid_uf`, `normalize_uf`, `is_valid_city`, `normalize_city` | [States and municipalities](#states-and-municipalities) |
325
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `is_valid_*`, `normalize_*`, `only_digits` | [CPF / CNPJ / phone](#cpf-cnpj-phone) |
326
+ | `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` | [States and municipalities](#states-and-municipalities) |
272
327
 
@@ -14,7 +14,10 @@ Validadores de documentos (CPF, CNPJ, CEP) e normalizador/validador de telefone
14
14
  | `is_valid_phone_br` | `(str) -> bool` | Formato de telefone BR: `+55` opcional, DDD opcional, nono dígito opcional. |
15
15
  | `normalize_cpf`, `normalize_cnpj`, `normalize_cpf_cnpj`, `normalize_phone_br` | `(str) -> str` | Remove a máscara deixando só dígitos; levanta `ValueError` se inválido. |
16
16
  | `only_digits` | `(str) -> str` | Remove todo caractere que não é dígito. |
17
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR` | `Annotated[str, AfterValidator(...)]` | Tipos de campo Pydantic plug-and-play — validam + normalizam automaticamente. |
17
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField` | `Annotated[str, AfterValidator(...)]` | Tipos de campo Pydantic plug-and-play — validam + normalizam automaticamente. |
18
+
19
+ !!! info "Sufixo `Field` (a partir da v0.76)"
20
+ Os tipos de campo passaram a usar o sufixo `Field` (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`) pra deixar claro que são campos de schema — igual `UFField` / `CityNameField`. Os nomes antigos (`CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `CEP`) continuam funcionando como **alias deprecado**; prefira os novos.
18
21
 
19
22
  #### Uso em schema
20
23
 
@@ -22,7 +25,7 @@ Validadores de documentos (CPF, CNPJ, CEP) e normalizador/validador de telefone
22
25
  from pydantic import EmailStr, Field
23
26
 
24
27
  from tempest_fastapi_sdk import BaseSchema
25
- from tempest_fastapi_sdk.utils import CPF, CPFOrCNPJ, PhoneBR
28
+ from tempest_fastapi_sdk.utils import CPFOrCNPJField, PhoneBRField
26
29
 
27
30
 
28
31
  class CustomerCreateSchema(BaseSchema):
@@ -36,8 +39,8 @@ class CustomerCreateSchema(BaseSchema):
36
39
 
37
40
  name: str = Field(min_length=1, max_length=128)
38
41
  email: EmailStr
39
- document: CPFOrCNPJ
40
- phone: PhoneBR
42
+ document: CPFOrCNPJField
43
+ phone: PhoneBRField
41
44
  ```
42
45
 
43
46
  Entrada válida:
@@ -87,15 +90,15 @@ await repo.get({"document": normalize_cpf_cnpj(query)})
87
90
  ## CEP
88
91
 
89
92
 
90
- `CEP` é um tipo `Annotated[str, AfterValidator(normalize_cep)]` — coloque-o em um schema Pydantic e os valores de entrada são aceitos como `"01310-100"` ou `"01310100"`, normalizados para 8 dígitos, e rejeitados (`ValidationError` → envelope HTTP 422) quando não casam com o formato. CEPs não têm dígitos verificadores, então a validação é só de formato.
93
+ `CEPField` é um tipo `Annotated[str, AfterValidator(normalize_cep)]` — coloque-o em um schema Pydantic e os valores de entrada são aceitos como `"01310-100"` ou `"01310100"`, normalizados para 8 dígitos, e rejeitados (`ValidationError` → envelope HTTP 422) quando não casam com o formato. CEPs não têm dígitos verificadores, então a validação é só de formato.
91
94
 
92
95
  ```python
93
96
  from tempest_fastapi_sdk import BaseSchema
94
- from tempest_fastapi_sdk.utils import CEP
97
+ from tempest_fastapi_sdk.utils import CEPField
95
98
 
96
99
 
97
100
  class AddressCreateSchema(BaseSchema):
98
- cep: CEP
101
+ cep: CEPField
99
102
  street: str
100
103
  number: str
101
104
  ```
@@ -174,6 +177,49 @@ def validate_address(uf: UF, city: str) -> str:
174
177
  !!! tip "A busca de cidade ignora acentos e caixa"
175
178
  `is_valid_city("SP", "sao paulo")` e `normalize_city("rj", "RIO DE JANEIRO")` funcionam — a comparação derruba acentos, caixa e espaços nas pontas. `normalize_city` sempre devolve o nome canônico em caixa correta (`"São Paulo"`, `"Rio de Janeiro"`).
176
179
 
180
+ ### Choices prontas para o `<select>` do frontend
181
+
182
+ Os mesmos dados servem para **dois papéis**: validar a entrada (os campos `UFField` / `CityNameField` acima) **e** alimentar os dropdowns do frontend. Para o segundo, `uf_choices`, `region_choices` e `city_choices` devolvem `list[ChoiceBR]` — cada item é um `value` (o que você guarda/envia) + `label` (o que o usuário vê), exatamente o formato que um `<option>` quer:
183
+
184
+ ```python
185
+ from uuid import UUID
186
+
187
+ from fastapi import APIRouter
188
+
189
+ from tempest_fastapi_sdk.utils import ChoiceBR, city_choices, region_choices, uf_choices
190
+
191
+ router = APIRouter(prefix="/api/localidades", tags=["localidades"])
192
+
193
+
194
+ @router.get("/ufs")
195
+ def list_uf_choices() -> list[ChoiceBR]:
196
+ """Choices de UF: value = sigla, label = nome do estado."""
197
+ return uf_choices()
198
+
199
+
200
+ @router.get("/regioes")
201
+ def list_region_choices() -> list[ChoiceBR]:
202
+ """Choices das 5 macro-regiões do IBGE."""
203
+ return region_choices()
204
+
205
+
206
+ @router.get("/ufs/{uf}/cidades")
207
+ def list_city_choices(uf: str) -> list[ChoiceBR]:
208
+ """Choices de cidade de uma UF: value = label = nome do município."""
209
+ return city_choices(uf)
210
+ ```
211
+
212
+ O `value` de `uf_choices()` é a sigla — o mesmo valor que `UFField` valida na volta, então o que o `<select>` envia já entra direto no seu schema:
213
+
214
+ ```python
215
+ uf_choices()[0] # ChoiceBR(value="AC", label="Acre")
216
+ region_choices()[0] # ChoiceBR(value="Norte", label="Norte")
217
+ city_choices("sp")[0] # ChoiceBR(value="Adamantina", label="Adamantina")
218
+ ```
219
+
220
+ !!! info "Por que `ChoiceBR` e não uma tupla?"
221
+ `ChoiceBR` é um schema Pydantic (`value: str`, `label: str`), então serializa como `{"value": ..., "label": ...}` no JSON e aparece tipado no OpenAPI/Swagger — sem o "campo mágico sem tipo". Para o caso clássico estado→cidade, o front chama `/ufs`, e ao escolher uma UF chama `/ufs/{uf}/cidades`.
222
+
177
223
  ### Variantes imperativas
178
224
 
179
225
  | Função | O que faz |
@@ -185,13 +231,14 @@ def validate_address(uf: UF, city: str) -> str:
185
231
  | `normalize_city(uf, city)` | Nome canônico do município; levanta `ValueError` se não existe. |
186
232
 
187
233
  !!! note "Endpoint de estados/cidades para o frontend"
188
- Para popular `<select>` de estado e cidade, devolva `list_states()` direto (cada `StateBR` traz `cities`), ou um endpoint enxuto `GET /estados/{uf}/cidades` que retorna `cities_by_uf(uf)`. Como é dado em memória, não precisa tocar o banco.
234
+ Para `<select>`, prefira `uf_choices()` / `region_choices()` / `city_choices(uf)` (formato `value`/`label`). Se precisar do estado inteiro com a lista de cidades junto, `list_states()` devolve cada `StateBR` com seu `cities`. Como é tudo em memória, não toca o banco.
189
235
 
190
236
  #### Recapitulando
191
237
 
192
238
  - `UF` (StrEnum, 27 siglas) + `Region` (5 macro-regiões do IBGE).
193
- - `StateBR` / `CityBR` para respostas tipadas.
239
+ - `StateBR` / `CityBR` para respostas tipadas; `ChoiceBR` (`value`/`label`) para dropdowns.
194
240
  - `list_states`, `get_state`, `cities_by_uf`, `states_by_region` para consultar a tabela embutida.
241
+ - `uf_choices`, `region_choices`, `city_choices` para `<select>` do frontend.
195
242
  - `UFField` / `CityNameField` para campos de schema; `is_valid_*` / `normalize_*` para validação imperativa no service.
196
243
 
197
244
 
@@ -267,5 +314,5 @@ Todo helper tem sua própria receita — esta seção é o mapa rápido:
267
314
  | `DownloadUtils`, `build_content_disposition` | [Servindo arquivos privados pela API](http.md#servindo-arquivos-privados-pela-api-downloadutils) |
268
315
  | `LogUtils` + `configure_logging` | [Receita de logging estruturado & request IDs](logging.md) |
269
316
  | `MetricsUtils` (CPU/memória/disco/GPU) | [Receita de métricas do sistema](metrics.md) |
270
- | `CPF`, `CNPJ`, `CPFOrCNPJ`, `PhoneBR`, `is_valid_*`, `normalize_*`, `only_digits` | [CPF / CNPJ / telefone](#cpf-cnpj-telefone) |
271
- | `UF`, `Region`, `StateBR`, `CityBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `is_valid_uf`, `normalize_uf`, `is_valid_city`, `normalize_city` | [Estados e municípios](#estados-e-municipios) |
317
+ | `CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `is_valid_*`, `normalize_*`, `only_digits` | [CPF / CNPJ / telefone](#cpf-cnpj-telefone) |
318
+ | `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` | [Estados e municípios](#estados-e-municipios) |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tempest-fastapi-sdk"
3
- version = "0.74.0"
3
+ version = "0.76.0"
4
4
  description = "Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -245,10 +245,15 @@ from tempest_fastapi_sdk.utils import (
245
245
  REQUEST_ID_HEADER,
246
246
  UF,
247
247
  AttemptThrottle,
248
+ CEPField,
249
+ ChoiceBR,
248
250
  CircuitOpenError,
249
251
  CityBR,
250
252
  CityNameField,
253
+ CNPJField,
254
+ CPFField,
251
255
  CPFOrCNPJ,
256
+ CPFOrCNPJField,
252
257
  CPUMetrics,
253
258
  DiskMetrics,
254
259
  DownloadUtils,
@@ -263,6 +268,7 @@ from tempest_fastapi_sdk.utils import (
263
268
  MinIOUploadStorage,
264
269
  PasswordUtils,
265
270
  PhoneBR,
271
+ PhoneBRField,
266
272
  Region,
267
273
  RetryPolicy,
268
274
  StateBR,
@@ -276,6 +282,7 @@ from tempest_fastapi_sdk.utils import (
276
282
  UploadUtils,
277
283
  build_content_disposition,
278
284
  cities_by_uf,
285
+ city_choices,
279
286
  generate_opaque_token,
280
287
  get_client_ip,
281
288
  get_client_ip_from_scope,
@@ -298,9 +305,11 @@ from tempest_fastapi_sdk.utils import (
298
305
  normalize_phone_br,
299
306
  normalize_uf,
300
307
  only_digits,
308
+ region_choices,
301
309
  sniff_mime,
302
310
  states_by_region,
303
311
  to_utc,
312
+ uf_choices,
304
313
  utcnow,
305
314
  verify_opaque_token,
306
315
  )
@@ -319,7 +328,7 @@ from tempest_fastapi_sdk.websockets import (
319
328
  make_websocket_router,
320
329
  )
321
330
 
322
- __version__: str = "0.74.0"
331
+ __version__: str = "0.76.0"
323
332
 
324
333
  __all__: list[str] = [
325
334
  "BASE_COLUMN_ORDER",
@@ -376,11 +385,16 @@ __all__: list[str] = [
376
385
  "BaseUserRefreshTokenModel",
377
386
  "BaseUserTokenModel",
378
387
  "BodySizeLimitMiddleware",
388
+ "CEPField",
389
+ "CNPJField",
379
390
  "CORSSettings",
391
+ "CPFField",
380
392
  "CPFOrCNPJ",
393
+ "CPFOrCNPJField",
381
394
  "CPUMetrics",
382
395
  "CSRFMiddleware",
383
396
  "CachedResponse",
397
+ "ChoiceBR",
384
398
  "CircuitOpenError",
385
399
  "CityBR",
386
400
  "CityNameField",
@@ -455,6 +469,7 @@ __all__: list[str] = [
455
469
  "PasswordResetToken",
456
470
  "PasswordUtils",
457
471
  "PhoneBR",
472
+ "PhoneBRField",
458
473
  "PrometheusMiddleware",
459
474
  "RSAWebhookSignatureVerifier",
460
475
  "RabbitMQSettings",
@@ -529,6 +544,7 @@ __all__: list[str] = [
529
544
  "build_content_disposition",
530
545
  "build_pagination_link_header",
531
546
  "cities_by_uf",
547
+ "city_choices",
532
548
  "clear_cookie",
533
549
  "clear_request_id",
534
550
  "coerce_flag",
@@ -595,6 +611,7 @@ __all__: list[str] = [
595
611
  "normalize_uf",
596
612
  "only_digits",
597
613
  "parse_accept_language",
614
+ "region_choices",
598
615
  "register_exception_handlers",
599
616
  "reorder_base_columns_first",
600
617
  "request_id_ctx",
@@ -614,6 +631,7 @@ __all__: list[str] = [
614
631
  "strict_types",
615
632
  "to_utc",
616
633
  "typed",
634
+ "uf_choices",
617
635
  "utcnow",
618
636
  "verify_opaque_token",
619
637
  ]
@@ -30,19 +30,23 @@ from tempest_fastapi_sdk.utils.http_client import (
30
30
  from tempest_fastapi_sdk.utils.jwt import JWTUtils
31
31
  from tempest_fastapi_sdk.utils.locations import (
32
32
  UF,
33
+ ChoiceBR,
33
34
  CityBR,
34
35
  CityNameField,
35
36
  Region,
36
37
  StateBR,
37
38
  UFField,
38
39
  cities_by_uf,
40
+ city_choices,
39
41
  get_state,
40
42
  is_valid_city,
41
43
  is_valid_uf,
42
44
  list_states,
43
45
  normalize_city,
44
46
  normalize_uf,
47
+ region_choices,
45
48
  states_by_region,
49
+ uf_choices,
46
50
  )
47
51
  from tempest_fastapi_sdk.utils.log import LogUtils
48
52
  from tempest_fastapi_sdk.utils.metrics import (
@@ -68,8 +72,13 @@ from tempest_fastapi_sdk.utils.regex import (
68
72
  CPF_CNPJ_PATTERN,
69
73
  CPF_PATTERN,
70
74
  PHONE_BR_PATTERN,
75
+ CEPField,
76
+ CNPJField,
77
+ CPFField,
71
78
  CPFOrCNPJ,
79
+ CPFOrCNPJField,
72
80
  PhoneBR,
81
+ PhoneBRField,
73
82
  is_valid_cep,
74
83
  is_valid_cnpj,
75
84
  is_valid_cpf,
@@ -108,8 +117,13 @@ __all__: list[str] = [
108
117
  "REQUEST_ID_HEADER",
109
118
  "UF",
110
119
  "AttemptThrottle",
120
+ "CEPField",
121
+ "CNPJField",
122
+ "CPFField",
111
123
  "CPFOrCNPJ",
124
+ "CPFOrCNPJField",
112
125
  "CPUMetrics",
126
+ "ChoiceBR",
113
127
  "CircuitOpenError",
114
128
  "CityBR",
115
129
  "CityNameField",
@@ -126,6 +140,7 @@ __all__: list[str] = [
126
140
  "MinIOUploadStorage",
127
141
  "PasswordUtils",
128
142
  "PhoneBR",
143
+ "PhoneBRField",
129
144
  "Region",
130
145
  "RetryPolicy",
131
146
  "StateBR",
@@ -139,6 +154,7 @@ __all__: list[str] = [
139
154
  "UploadUtils",
140
155
  "build_content_disposition",
141
156
  "cities_by_uf",
157
+ "city_choices",
142
158
  "generate_opaque_token",
143
159
  "get_client_ip",
144
160
  "get_client_ip_from_scope",
@@ -161,9 +177,11 @@ __all__: list[str] = [
161
177
  "normalize_phone_br",
162
178
  "normalize_uf",
163
179
  "only_digits",
180
+ "region_choices",
164
181
  "sniff_mime",
165
182
  "states_by_region",
166
183
  "to_utc",
184
+ "uf_choices",
167
185
  "utcnow",
168
186
  "verify_opaque_token",
169
187
  ]