tempest-fastapi-sdk 0.52.0__tar.gz → 0.53.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 (398) hide show
  1. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/CHANGELOG.md +33 -0
  2. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/PKG-INFO +2 -2
  3. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/README.md +1 -1
  4. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/br-helpers.en.md +93 -0
  5. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/br-helpers.md +93 -0
  6. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/reference.md +12 -0
  7. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/pyproject.toml +2 -1
  8. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/__init__.py +29 -1
  9. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/__init__.py +30 -0
  10. tempest_fastapi_sdk-0.53.0/tempest_fastapi_sdk/utils/data/br_locations.json +5772 -0
  11. tempest_fastapi_sdk-0.53.0/tempest_fastapi_sdk/utils/locations.py +373 -0
  12. tempest_fastapi_sdk-0.53.0/tests/utils/test_locations.py +170 -0
  13. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/uv.lock +1 -1
  14. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.github/workflows/ci.yml +0 -0
  15. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.github/workflows/docs.yml +0 -0
  16. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.github/workflows/release-pypi.yml +0 -0
  17. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.gitignore +0 -0
  18. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.python-version +0 -0
  19. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/CLAUDE.md +0 -0
  20. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/Makefile +0 -0
  21. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/architecture.en.md +0 -0
  22. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/architecture.md +0 -0
  23. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/changelog.en.md +0 -0
  24. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/changelog.md +0 -0
  25. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/contributing.en.md +0 -0
  26. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/contributing.md +0 -0
  27. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/index.en.md +0 -0
  28. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/index.md +0 -0
  29. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/installation.en.md +0 -0
  30. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/installation.md +0 -0
  31. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/index.en.md +0 -0
  32. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/index.md +0 -0
  33. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/api.en.md +0 -0
  34. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/api.md +0 -0
  35. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/business-rules.en.md +0 -0
  36. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/business-rules.md +0 -0
  37. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/domain.en.md +0 -0
  38. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/domain.md +0 -0
  39. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/flows.en.md +0 -0
  40. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/flows.md +0 -0
  41. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/index.en.md +0 -0
  42. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/index.md +0 -0
  43. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/migration.en.md +0 -0
  44. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/migration.md +0 -0
  45. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/admin.en.md +0 -0
  46. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/admin.md +0 -0
  47. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/auth-flow.en.md +0 -0
  48. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/auth-flow.md +0 -0
  49. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cache.en.md +0 -0
  50. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cache.md +0 -0
  51. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cli.en.md +0 -0
  52. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cli.md +0 -0
  53. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/database.en.md +0 -0
  54. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/database.md +0 -0
  55. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/deploy-safety.en.md +0 -0
  56. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/deploy-safety.md +0 -0
  57. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/downloads.en.md +0 -0
  58. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/downloads.md +0 -0
  59. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/email.en.md +0 -0
  60. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/email.md +0 -0
  61. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http-client.en.md +0 -0
  62. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http-client.md +0 -0
  63. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http.en.md +0 -0
  64. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http.md +0 -0
  65. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/idempotency.en.md +0 -0
  66. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/idempotency.md +0 -0
  67. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/index.en.md +0 -0
  68. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/index.md +0 -0
  69. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/logging.en.md +0 -0
  70. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/logging.md +0 -0
  71. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/metrics.en.md +0 -0
  72. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/metrics.md +0 -0
  73. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/mfa.en.md +0 -0
  74. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/mfa.md +0 -0
  75. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/multi-tenant.en.md +0 -0
  76. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/multi-tenant.md +0 -0
  77. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/observability.en.md +0 -0
  78. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/observability.md +0 -0
  79. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/offline-sync.en.md +0 -0
  80. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/offline-sync.md +0 -0
  81. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/outbox.en.md +0 -0
  82. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/outbox.md +0 -0
  83. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/queue-tasks.en.md +0 -0
  84. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/queue-tasks.md +0 -0
  85. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/realtime.en.md +0 -0
  86. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/realtime.md +0 -0
  87. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/security.en.md +0 -0
  88. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/security.md +0 -0
  89. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/sessions.en.md +0 -0
  90. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/sessions.md +0 -0
  91. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/storage.en.md +0 -0
  92. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/storage.md +0 -0
  93. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/testing.en.md +0 -0
  94. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/testing.md +0 -0
  95. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/uploads.en.md +0 -0
  96. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/uploads.md +0 -0
  97. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/utilities.en.md +0 -0
  98. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/utilities.md +0 -0
  99. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/webpush.en.md +0 -0
  100. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/webpush.md +0 -0
  101. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/websocket.en.md +0 -0
  102. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/websocket.md +0 -0
  103. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/reference.en.md +0 -0
  104. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/roadmap.en.md +0 -0
  105. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/roadmap.md +0 -0
  106. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/tutorial.en.md +0 -0
  107. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/tutorial.md +0 -0
  108. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/mkdocs.yml +0 -0
  109. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/scripts/extract_recipe.py +0 -0
  110. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
  111. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
  112. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/config.py +0 -0
  113. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
  114. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/router.py +0 -0
  115. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/session.py +0 -0
  116. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/site.py +0 -0
  117. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
  118. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
  119. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
  120. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
  121. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
  122. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
  123. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
  124. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
  125. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
  126. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
  127. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
  128. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
  129. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
  130. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
  131. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
  132. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
  133. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
  134. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
  135. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
  136. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
  137. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
  138. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
  139. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
  140. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
  141. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
  142. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
  143. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
  144. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
  145. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/server.py +0 -0
  146. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/static.py +0 -0
  147. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
  148. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
  149. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
  150. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
  151. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
  152. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/router.py +0 -0
  153. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
  154. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/service.py +0 -0
  155. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/activation.html +0 -0
  156. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/activation_error.html +0 -0
  157. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/activation_success.html +0 -0
  158. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset.html +0 -0
  159. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset_error.html +0 -0
  160. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset_form.html +0 -0
  161. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset_success.html +0 -0
  162. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
  163. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
  164. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
  165. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
  166. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
  167. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
  168. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
  169. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
  170. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
  171. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
  172. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
  173. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
  174. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
  175. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
  176. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
  177. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
  178. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
  179. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
  180. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
  181. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
  182. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
  183. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
  184. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
  185. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
  186. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
  187. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
  188. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
  189. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
  190. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
  191. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
  192. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/db.py +0 -0
  193. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
  194. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
  195. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
  196. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/main.py +0 -0
  197. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/new.py +0 -0
  198. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
  199. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
  200. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/user.py +0 -0
  201. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
  202. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
  203. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
  204. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/context.py +0 -0
  205. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/enums.py +0 -0
  206. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/logging.py +0 -0
  207. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
  208. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
  209. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
  210. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
  211. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/connection.py +0 -0
  212. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
  213. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
  214. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/model.py +0 -0
  215. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
  216. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/repository.py +0 -0
  217. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
  218. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
  219. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
  220. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
  221. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
  222. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
  223. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
  224. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
  225. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
  226. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
  227. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
  228. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
  229. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
  230. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
  231. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
  232. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/py.typed +0 -0
  233. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
  234. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
  235. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
  236. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
  237. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
  238. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
  239. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
  240. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
  241. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
  242. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/services/base.py +0 -0
  243. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
  244. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
  245. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
  246. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
  247. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
  248. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
  249. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
  250. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
  251. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/settings/base.py +0 -0
  252. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
  253. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
  254. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
  255. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
  256. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
  257. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
  258. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
  259. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
  260. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
  261. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/testing/database.py +0 -0
  262. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
  263. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
  264. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
  265. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/download.py +0 -0
  266. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/email.py +0 -0
  267. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
  268. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
  269. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/log.py +0 -0
  270. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
  271. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
  272. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/password.py +0 -0
  273. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
  274. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
  275. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
  276. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
  277. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
  278. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
  279. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
  280. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
  281. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
  282. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
  283. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
  284. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
  285. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/__init__.py +0 -0
  286. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/__init__.py +0 -0
  287. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_auth.py +0 -0
  288. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_forms.py +0 -0
  289. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_logs_nav.py +0 -0
  290. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_mfa.py +0 -0
  291. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_router.py +0 -0
  292. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_site.py +0 -0
  293. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_user_model.py +0 -0
  294. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/__init__.py +0 -0
  295. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_body_size.py +0 -0
  296. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_cookies.py +0 -0
  297. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_cors.py +0 -0
  298. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_csrf.py +0 -0
  299. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_dependencies_auth.py +0 -0
  300. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_graceful.py +0 -0
  301. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_handlers.py +0 -0
  302. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_health_router.py +0 -0
  303. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_idempotency.py +0 -0
  304. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_jwt_dependency.py +0 -0
  305. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_logs_router.py +0 -0
  306. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_oauth.py +0 -0
  307. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_prometheus.py +0 -0
  308. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_rate_limit.py +0 -0
  309. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_request_id_middleware.py +0 -0
  310. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_role_dependency.py +0 -0
  311. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_server.py +0 -0
  312. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_static.py +0 -0
  313. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_tool_spec.py +0 -0
  314. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_tracing.py +0 -0
  315. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_webhooks.py +0 -0
  316. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_webhooks_rsa.py +0 -0
  317. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/__init__.py +0 -0
  318. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/test_guards.py +0 -0
  319. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/test_mfa.py +0 -0
  320. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/test_service.py +0 -0
  321. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cache/__init__.py +0 -0
  322. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cache/test_decorator.py +0 -0
  323. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cache/test_redis_manager.py +0 -0
  324. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/__init__.py +0 -0
  325. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_db.py +0 -0
  326. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_db_seed.py +0 -0
  327. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_docker_compose.py +0 -0
  328. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_generate.py +0 -0
  329. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_main.py +0 -0
  330. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_secrets.py +0 -0
  331. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_user.py +0 -0
  332. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/conftest.py +0 -0
  333. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/controllers/__init__.py +0 -0
  334. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/controllers/test_base.py +0 -0
  335. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/__init__.py +0 -0
  336. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/test_context.py +0 -0
  337. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/test_enums.py +0 -0
  338. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/test_logging.py +0 -0
  339. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/__init__.py +0 -0
  340. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_alembic_hooks.py +0 -0
  341. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_bulk_ops.py +0 -0
  342. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_connection.py +0 -0
  343. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_migrations.py +0 -0
  344. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_mixins.py +0 -0
  345. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_model.py +0 -0
  346. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_outbox.py +0 -0
  347. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_repository.py +0 -0
  348. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_safe_upgrade.py +0 -0
  349. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_slow_query.py +0 -0
  350. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_tenant.py +0 -0
  351. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/exceptions/__init__.py +0 -0
  352. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/exceptions/test_exceptions.py +0 -0
  353. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/queue/__init__.py +0 -0
  354. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/queue/test_manager.py +0 -0
  355. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/__init__.py +0 -0
  356. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_base.py +0 -0
  357. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_cursor_pagination.py +0 -0
  358. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_link_headers.py +0 -0
  359. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_pagination.py +0 -0
  360. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_response.py +0 -0
  361. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/services/__init__.py +0 -0
  362. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/services/test_base.py +0 -0
  363. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sessions/__init__.py +0 -0
  364. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sessions/test_sessions.py +0 -0
  365. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/settings/__init__.py +0 -0
  366. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/settings/test_base.py +0 -0
  367. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/settings/test_mixins.py +0 -0
  368. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sse/__init__.py +0 -0
  369. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sse/test_event_stream.py +0 -0
  370. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/storage/__init__.py +0 -0
  371. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/storage/test_minio_client.py +0 -0
  372. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/tasks/__init__.py +0 -0
  373. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/tasks/test_manager.py +0 -0
  374. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/tasks/test_scheduler.py +0 -0
  375. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/testing/__init__.py +0 -0
  376. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/testing/test_database.py +0 -0
  377. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/__init__.py +0 -0
  378. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_client_ip.py +0 -0
  379. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_datetime.py +0 -0
  380. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_dict.py +0 -0
  381. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_download.py +0 -0
  382. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_email.py +0 -0
  383. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_http_client.py +0 -0
  384. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_jwt.py +0 -0
  385. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_lazy_extras.py +0 -0
  386. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_log.py +0 -0
  387. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_metrics.py +0 -0
  388. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_opaque_token.py +0 -0
  389. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_password.py +0 -0
  390. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_regex.py +0 -0
  391. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_storage_backends.py +0 -0
  392. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_throttle.py +0 -0
  393. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_upload.py +0 -0
  394. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/webpush/__init__.py +0 -0
  395. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/webpush/test_dispatcher.py +0 -0
  396. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/webpush/test_schemas.py +0 -0
  397. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/websockets/__init__.py +0 -0
  398. {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/websockets/test_hub_and_router.py +0 -0
@@ -5,6 +5,39 @@ 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.53.0] — 2026-06-13
9
+
10
+ ### Added
11
+
12
+ - **Brazilian states & municipalities dataset** — an offline,
13
+ dependency-free table of every federative unit and its cities, plus
14
+ Pydantic building blocks. No network calls, no external API.
15
+ - **`UF`** — a `StrEnum` with the 27 federative unit acronyms
16
+ (`UF.SP`, `UF.RJ`, …).
17
+ - **`Region`** — the five official IBGE macro-regions
18
+ (`Norte`, `Nordeste`, `Centro-Oeste`, `Sudeste`, `Sul`).
19
+ Every UF is statically mapped to its region.
20
+ - **`StateBR`** / **`CityBR`** — schemas for a state (acronym +
21
+ full name + region + alphabetically sorted municipalities) and a
22
+ single city (name + UF).
23
+ - **Query helpers** — `list_states()`, `get_state(uf)`,
24
+ `cities_by_uf(uf)`, `states_by_region(region)`. The single-UF
25
+ lookups accept any-case acronyms or a `UF` member.
26
+ - **Validators/normalizers** — `is_valid_uf` / `normalize_uf`
27
+ (case- and whitespace-insensitive), `is_valid_city` /
28
+ `normalize_city` (also accent-insensitive, returning the
29
+ canonical proper-case name).
30
+ - **Annotated types** — `UFField` (coerces any-case acronyms to a
31
+ `UF`) and `CityNameField` (trims a city name) ready to drop into
32
+ schema fields.
33
+ - Dataset bundled as `utils/data/br_locations.json` (27 states,
34
+ 5606 entries) and loaded lazily on first access. Municipality
35
+ names come from the official IBGE list (current spellings,
36
+ including post-2005 municipalities); the Distrito Federal is
37
+ represented by its 36 administrative regions rather than a single
38
+ Brasília row, for address-form use. All symbols are exported at
39
+ the package top level.
40
+
8
41
  ## [0.52.0] — 2026-06-12
9
42
 
10
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tempest-fastapi-sdk
3
- Version: 0.52.0
3
+ Version: 0.53.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
@@ -255,7 +255,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
255
255
  | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
256
256
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
257
257
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `AsyncTaskBrokerManager` (TaskIQ lifecycle wrapper), `AsyncTaskScheduler` (periodic / cron tasks) |
258
- | `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`) |
258
+ | `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`) |
259
259
  | `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` |
260
260
 
261
261
  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`).
@@ -153,7 +153,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
153
153
  | `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
154
154
  | `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
155
155
  | `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `AsyncTaskBrokerManager` (TaskIQ lifecycle wrapper), `AsyncTaskScheduler` (periodic / cron tasks) |
156
- | `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`) |
156
+ | `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`) |
157
157
  | `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` |
158
158
 
159
159
  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`).
@@ -103,6 +103,98 @@ class AddressCreateSchema(BaseSchema):
103
103
  Imperative variants: `is_valid_cep(value)`, `normalize_cep(value)`, plus `CEP_PATTERN` for raw regex use. Use them inside services / queue handlers where you don't want a Pydantic round-trip.
104
104
 
105
105
 
106
+ ## States and municipalities
107
+
108
+ Every Brazilian app eventually needs a state/city `<select>`, or to validate that the UF and municipality in a payload actually exist. The SDK bundles that table — **27 states and 5606 municipalities** — so you don't have to call the IBGE API or version a JSON per service.
109
+
110
+ !!! info "Offline and dependency-free"
111
+ The data lives in `tempest_fastapi_sdk/utils/data/br_locations.json` and is loaded on first use, then cached for the whole process. Zero network, nothing extra to install.
112
+
113
+ The UF is a `StrEnum`, and every state knows its official IBGE macro-region:
114
+
115
+ ```python
116
+ from tempest_fastapi_sdk import UF, Region, list_states, get_state, states_by_region
117
+
118
+
119
+ # All 27 states, ordered by acronym.
120
+ states = list_states()
121
+ print(len(states)) # 27
122
+
123
+ # A single state (acronym in any case, or a UF member).
124
+ sp = get_state("sp")
125
+ print(sp.uf, sp.name, sp.region) # UF.SP São Paulo Region.SOUTHEAST
126
+ print(len(sp.cities), sp.cities[:2]) # 645 ['Adamantina', 'Adolfo']
127
+
128
+ # Grouping by region.
129
+ southeast = states_by_region(Region.SOUTHEAST)
130
+ print([state.uf.value for state in southeast]) # ['ES', 'MG', 'RJ', 'SP']
131
+ ```
132
+
133
+ Each item is a `StateBR` (`uf: UF`, `name: str`, `region: Region`, `cities: list[str]`), ready to return straight from an endpoint.
134
+
135
+ ### Validating UF and city in a schema
136
+
137
+ `UFField` accepts the acronym in any case (`"sp"`, `" RJ "`) and yields a `UF` member. `CityNameField` only trims whitespace — the cross-field "does this city exist in this UF" check is business logic, so it runs in the service with `is_valid_city` / `normalize_city`:
138
+
139
+ ```python
140
+ from tempest_fastapi_sdk import BaseSchema
141
+ from tempest_fastapi_sdk.utils import UFField, CityNameField
142
+
143
+
144
+ class AddressCreateSchema(BaseSchema):
145
+ uf: UFField
146
+ city: CityNameField
147
+ street: str
148
+ number: str
149
+ ```
150
+
151
+ ```python
152
+ from tempest_fastapi_sdk import UF, is_valid_city, normalize_city
153
+ from tempest_fastapi_sdk.exceptions import ValidationException
154
+
155
+
156
+ def validate_address(uf: UF, city: str) -> str:
157
+ """Ensure the city belongs to the UF and return its canonical name.
158
+
159
+ Args:
160
+ uf (UF): The federative unit of the address.
161
+ city (str): The city name coming from the payload.
162
+
163
+ Returns:
164
+ str: The municipality name in canonical case (e.g. "São Paulo").
165
+
166
+ Raises:
167
+ ValidationException: If the city does not exist in the given UF.
168
+ """
169
+ if not is_valid_city(uf, city):
170
+ raise ValidationException(f"city {city!r} not found in {uf.value}")
171
+ return normalize_city(uf, city)
172
+ ```
173
+
174
+ !!! tip "City lookup ignores accents and case"
175
+ `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
+
177
+ ### Imperative variants
178
+
179
+ | Function | What it does |
180
+ | --- | --- |
181
+ | `is_valid_uf(value)` | `True` when the acronym exists (any case/whitespace). |
182
+ | `normalize_uf(value)` | Returns the `UF`; raises `ValueError` when invalid. |
183
+ | `cities_by_uf(uf)` | Sorted list of the state's municipalities. |
184
+ | `is_valid_city(uf, city)` | `True` when the city belongs to the UF (accent/case-insensitive). |
185
+ | `normalize_city(uf, city)` | Canonical municipality name; raises `ValueError` when unknown. |
186
+
187
+ !!! 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.
189
+
190
+ #### Recap
191
+
192
+ - `UF` (StrEnum, 27 acronyms) + `Region` (5 IBGE macro-regions).
193
+ - `StateBR` / `CityBR` for typed responses.
194
+ - `list_states`, `get_state`, `cities_by_uf`, `states_by_region` to query the bundled table.
195
+ - `UFField` / `CityNameField` for schema fields; `is_valid_*` / `normalize_*` for imperative validation in the service.
196
+
197
+
106
198
  ## Utility helpers (utcnow, to_utc, modify_dict)
107
199
 
108
200
 
@@ -176,4 +268,5 @@ Every helper has its own recipe — this section is the quick map:
176
268
  | `LogUtils` + `configure_logging` | [Structured logging & request IDs recipe](logging.md) |
177
269
  | `MetricsUtils` (CPU/memory/disk/GPU) | [System metrics recipe](metrics.md) |
178
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) |
179
272
 
@@ -103,6 +103,98 @@ class AddressCreateSchema(BaseSchema):
103
103
  Variantes imperativas: `is_valid_cep(value)`, `normalize_cep(value)`, mais `CEP_PATTERN` para uso de regex cru. Use-os dentro de services / handlers de fila onde você não quer um round-trip Pydantic.
104
104
 
105
105
 
106
+ ## Estados e municípios
107
+
108
+ Toda aplicação brasileira acaba precisando de um `<select>` de estado e cidade, ou de validar que a UF e o município que chegaram no payload existem de verdade. O SDK embute essa tabela — **27 estados e 5606 municípios** — então você não precisa chamar a API do IBGE nem versionar um JSON por serviço.
109
+
110
+ !!! info "Offline e sem dependências"
111
+ Os dados moram em `tempest_fastapi_sdk/utils/data/br_locations.json` e são carregados sob demanda na primeira chamada, depois ficam em cache pelo processo todo. Zero rede, zero extra a instalar.
112
+
113
+ A UF é uma `StrEnum` e cada estado conhece sua macro-região oficial do IBGE:
114
+
115
+ ```python
116
+ from tempest_fastapi_sdk import UF, Region, list_states, get_state, states_by_region
117
+
118
+
119
+ # Todos os 27 estados, ordenados pela sigla.
120
+ states = list_states()
121
+ print(len(states)) # 27
122
+
123
+ # Um estado específico (sigla em qualquer caixa, ou um membro de UF).
124
+ sp = get_state("sp")
125
+ print(sp.uf, sp.name, sp.region) # UF.SP São Paulo Region.SOUTHEAST
126
+ print(len(sp.cities), sp.cities[:2]) # 645 ['Adamantina', 'Adolfo']
127
+
128
+ # Agrupando por região.
129
+ sudeste = states_by_region(Region.SOUTHEAST)
130
+ print([state.uf.value for state in sudeste]) # ['ES', 'MG', 'RJ', 'SP']
131
+ ```
132
+
133
+ Cada item é um `StateBR` (`uf: UF`, `name: str`, `region: Region`, `cities: list[str]`), pronto pra retornar direto de um endpoint.
134
+
135
+ ### Validando UF e cidade em um schema
136
+
137
+ `UFField` aceita a sigla em qualquer caixa (`"sp"`, `" RJ "`) e devolve um membro de `UF`. `CityNameField` só apara espaços — a validação cruzada "esta cidade existe nesta UF" é regra de negócio, então roda no service com `is_valid_city` / `normalize_city`:
138
+
139
+ ```python
140
+ from tempest_fastapi_sdk import BaseSchema
141
+ from tempest_fastapi_sdk.utils import UFField, CityNameField
142
+
143
+
144
+ class AddressCreateSchema(BaseSchema):
145
+ uf: UFField
146
+ city: CityNameField
147
+ street: str
148
+ number: str
149
+ ```
150
+
151
+ ```python
152
+ from tempest_fastapi_sdk import UF, is_valid_city, normalize_city
153
+ from tempest_fastapi_sdk.exceptions import ValidationException
154
+
155
+
156
+ def validate_address(uf: UF, city: str) -> str:
157
+ """Garante que a cidade pertence à UF e devolve o nome canônico.
158
+
159
+ Args:
160
+ uf (UF): A unidade federativa do endereço.
161
+ city (str): O nome da cidade vindo do payload.
162
+
163
+ Returns:
164
+ str: O nome do município em caixa canônica (ex.: "São Paulo").
165
+
166
+ Raises:
167
+ ValidationException: Se a cidade não existe na UF informada.
168
+ """
169
+ if not is_valid_city(uf, city):
170
+ raise ValidationException(f"city {city!r} not found in {uf.value}")
171
+ return normalize_city(uf, city)
172
+ ```
173
+
174
+ !!! tip "A busca de cidade ignora acentos e caixa"
175
+ `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
+
177
+ ### Variantes imperativas
178
+
179
+ | Função | O que faz |
180
+ | --- | --- |
181
+ | `is_valid_uf(value)` | `True` se a sigla existe (qualquer caixa/espaço). |
182
+ | `normalize_uf(value)` | Devolve o `UF`; levanta `ValueError` se inválido. |
183
+ | `cities_by_uf(uf)` | Lista de municípios da UF, ordenada. |
184
+ | `is_valid_city(uf, city)` | `True` se a cidade pertence à UF (ignora acentos/caixa). |
185
+ | `normalize_city(uf, city)` | Nome canônico do município; levanta `ValueError` se não existe. |
186
+
187
+ !!! note "Endpoint de estados/cidades para o frontend"
188
+ Para popular `<select>` de estado e cidade, devolva `list_states()` direto (cada `StateBR` já 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.
189
+
190
+ #### Recapitulando
191
+
192
+ - `UF` (StrEnum, 27 siglas) + `Region` (5 macro-regiões do IBGE).
193
+ - `StateBR` / `CityBR` para respostas tipadas.
194
+ - `list_states`, `get_state`, `cities_by_uf`, `states_by_region` para consultar a tabela embutida.
195
+ - `UFField` / `CityNameField` para campos de schema; `is_valid_*` / `normalize_*` para validação imperativa no service.
196
+
197
+
106
198
  ## Helpers utilitários (utcnow, to_utc, modify_dict)
107
199
 
108
200
 
@@ -176,3 +268,4 @@ Todo helper tem sua própria receita — esta seção é o mapa rápido:
176
268
  | `LogUtils` + `configure_logging` | [Receita de logging estruturado & request IDs](logging.md) |
177
269
  | `MetricsUtils` (CPU/memória/disco/GPU) | [Receita de métricas do sistema](metrics.md) |
178
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) |
@@ -236,3 +236,15 @@ Gerada automaticamente a partir das docstrings do SDK via [`mkdocstrings`](https
236
236
  ::: tempest_fastapi_sdk.utils.metrics.MetricsUtils
237
237
  ::: tempest_fastapi_sdk.utils.log.LogUtils
238
238
  ::: tempest_fastapi_sdk.utils.throttle.AttemptThrottle
239
+ ::: tempest_fastapi_sdk.utils.locations.UF
240
+ ::: tempest_fastapi_sdk.utils.locations.Region
241
+ ::: tempest_fastapi_sdk.utils.locations.StateBR
242
+ ::: tempest_fastapi_sdk.utils.locations.CityBR
243
+ ::: tempest_fastapi_sdk.utils.locations.list_states
244
+ ::: tempest_fastapi_sdk.utils.locations.get_state
245
+ ::: tempest_fastapi_sdk.utils.locations.cities_by_uf
246
+ ::: tempest_fastapi_sdk.utils.locations.states_by_region
247
+ ::: tempest_fastapi_sdk.utils.locations.is_valid_uf
248
+ ::: tempest_fastapi_sdk.utils.locations.normalize_uf
249
+ ::: tempest_fastapi_sdk.utils.locations.is_valid_city
250
+ ::: tempest_fastapi_sdk.utils.locations.normalize_city
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tempest-fastapi-sdk"
3
- version = "0.52.0"
3
+ version = "0.53.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"
@@ -154,6 +154,7 @@ packages = ["tempest_fastapi_sdk"]
154
154
  "tempest_fastapi_sdk/auth/templates/password_reset_form.html" = "tempest_fastapi_sdk/auth/templates/password_reset_form.html"
155
155
  "tempest_fastapi_sdk/auth/templates/password_reset_success.html" = "tempest_fastapi_sdk/auth/templates/password_reset_success.html"
156
156
  "tempest_fastapi_sdk/auth/templates/password_reset_error.html" = "tempest_fastapi_sdk/auth/templates/password_reset_error.html"
157
+ "tempest_fastapi_sdk/utils/data/br_locations.json" = "tempest_fastapi_sdk/utils/data/br_locations.json"
157
158
 
158
159
  [dependency-groups]
159
160
  dev = [
@@ -193,8 +193,11 @@ from tempest_fastapi_sdk.utils import (
193
193
  CPF_PATTERN,
194
194
  PHONE_BR_PATTERN,
195
195
  REQUEST_ID_HEADER,
196
+ UF,
196
197
  AttemptThrottle,
197
198
  CircuitOpenError,
199
+ CityBR,
200
+ CityNameField,
198
201
  CPFOrCNPJ,
199
202
  CPUMetrics,
200
203
  DiskMetrics,
@@ -210,32 +213,43 @@ from tempest_fastapi_sdk.utils import (
210
213
  MinIOUploadStorage,
211
214
  PasswordUtils,
212
215
  PhoneBR,
216
+ Region,
213
217
  RetryPolicy,
218
+ StateBR,
214
219
  SystemMetrics,
215
220
  ThrottleBackend,
216
221
  ThrottleStatus,
217
222
  TOTPHelper,
223
+ UFField,
218
224
  UploadResult,
219
225
  UploadStorage,
220
226
  UploadUtils,
221
227
  build_content_disposition,
228
+ cities_by_uf,
222
229
  generate_opaque_token,
223
230
  get_client_ip,
224
231
  get_client_ip_from_scope,
232
+ get_state,
225
233
  hash_opaque_token,
226
234
  is_valid_cep,
235
+ is_valid_city,
227
236
  is_valid_cnpj,
228
237
  is_valid_cpf,
229
238
  is_valid_cpf_cnpj,
230
239
  is_valid_phone_br,
240
+ is_valid_uf,
241
+ list_states,
231
242
  modify_dict,
232
243
  normalize_cep,
244
+ normalize_city,
233
245
  normalize_cnpj,
234
246
  normalize_cpf,
235
247
  normalize_cpf_cnpj,
236
248
  normalize_phone_br,
249
+ normalize_uf,
237
250
  only_digits,
238
251
  sniff_mime,
252
+ states_by_region,
239
253
  to_utc,
240
254
  utcnow,
241
255
  verify_opaque_token,
@@ -255,7 +269,7 @@ from tempest_fastapi_sdk.websockets import (
255
269
  make_websocket_router,
256
270
  )
257
271
 
258
- __version__: str = "0.52.0"
272
+ __version__: str = "0.53.0"
259
273
 
260
274
  __all__: list[str] = [
261
275
  "BASE_COLUMN_ORDER",
@@ -274,6 +288,7 @@ __all__: list[str] = [
274
288
  "NAMING_CONVENTION",
275
289
  "PHONE_BR_PATTERN",
276
290
  "REQUEST_ID_HEADER",
291
+ "UF",
277
292
  "ActivationResponseSchema",
278
293
  "ActivationToken",
279
294
  "AdminAuthBackend",
@@ -309,6 +324,8 @@ __all__: list[str] = [
309
324
  "CSRFMiddleware",
310
325
  "CachedResponse",
311
326
  "CircuitOpenError",
327
+ "CityBR",
328
+ "CityNameField",
312
329
  "ConflictException",
313
330
  "CursorPaginationFilterSchema",
314
331
  "CursorPaginationSchema",
@@ -377,6 +394,7 @@ __all__: list[str] = [
377
394
  "RedisIdempotencyStore",
378
395
  "RedisSessionStore",
379
396
  "RedisSettings",
397
+ "Region",
380
398
  "RequestIDMiddleware",
381
399
  "RetryPolicy",
382
400
  "SameSite",
@@ -394,6 +412,7 @@ __all__: list[str] = [
394
412
  "SignupSchema",
395
413
  "SlowQueryLogger",
396
414
  "SoftDeleteMixin",
415
+ "StateBR",
397
416
  "SyncFilterSchema",
398
417
  "SyncPaginationSchema",
399
418
  "SystemMetrics",
@@ -404,6 +423,7 @@ __all__: list[str] = [
404
423
  "ThrottleStatus",
405
424
  "TokenSettings",
406
425
  "TooManyRequestsException",
426
+ "UFField",
407
427
  "UnauthorizedException",
408
428
  "UploadResult",
409
429
  "UploadSettings",
@@ -430,6 +450,7 @@ __all__: list[str] = [
430
450
  "apply_cors",
431
451
  "build_content_disposition",
432
452
  "build_pagination_link_header",
453
+ "cities_by_uf",
433
454
  "clear_cookie",
434
455
  "clear_request_id",
435
456
  "compose_hooks",
@@ -442,12 +463,16 @@ __all__: list[str] = [
442
463
  "get_client_ip",
443
464
  "get_client_ip_from_scope",
444
465
  "get_request_id",
466
+ "get_state",
445
467
  "hash_opaque_token",
446
468
  "is_valid_cep",
469
+ "is_valid_city",
447
470
  "is_valid_cnpj",
448
471
  "is_valid_cpf",
449
472
  "is_valid_cpf_cnpj",
450
473
  "is_valid_phone_br",
474
+ "is_valid_uf",
475
+ "list_states",
451
476
  "make_admin_router",
452
477
  "make_app_exception_handler",
453
478
  "make_auth_router",
@@ -471,10 +496,12 @@ __all__: list[str] = [
471
496
  "make_websocket_router",
472
497
  "modify_dict",
473
498
  "normalize_cep",
499
+ "normalize_city",
474
500
  "normalize_cnpj",
475
501
  "normalize_cpf",
476
502
  "normalize_cpf_cnpj",
477
503
  "normalize_phone_br",
504
+ "normalize_uf",
478
505
  "only_digits",
479
506
  "register_exception_handlers",
480
507
  "reorder_base_columns_first",
@@ -489,6 +516,7 @@ __all__: list[str] = [
489
516
  "setup_tracing",
490
517
  "sniff_mime",
491
518
  "sse_response",
519
+ "states_by_region",
492
520
  "to_utc",
493
521
  "utcnow",
494
522
  "verify_opaque_token",
@@ -28,6 +28,22 @@ from tempest_fastapi_sdk.utils.http_client import (
28
28
  RetryPolicy,
29
29
  )
30
30
  from tempest_fastapi_sdk.utils.jwt import JWTUtils
31
+ from tempest_fastapi_sdk.utils.locations import (
32
+ UF,
33
+ CityBR,
34
+ CityNameField,
35
+ Region,
36
+ StateBR,
37
+ UFField,
38
+ cities_by_uf,
39
+ get_state,
40
+ is_valid_city,
41
+ is_valid_uf,
42
+ list_states,
43
+ normalize_city,
44
+ normalize_uf,
45
+ states_by_region,
46
+ )
31
47
  from tempest_fastapi_sdk.utils.log import LogUtils
32
48
  from tempest_fastapi_sdk.utils.metrics import (
33
49
  CPUMetrics,
@@ -90,10 +106,13 @@ __all__: list[str] = [
90
106
  "CPF_PATTERN",
91
107
  "PHONE_BR_PATTERN",
92
108
  "REQUEST_ID_HEADER",
109
+ "UF",
93
110
  "AttemptThrottle",
94
111
  "CPFOrCNPJ",
95
112
  "CPUMetrics",
96
113
  "CircuitOpenError",
114
+ "CityBR",
115
+ "CityNameField",
97
116
  "DiskMetrics",
98
117
  "DownloadUtils",
99
118
  "EmailUtils",
@@ -107,32 +126,43 @@ __all__: list[str] = [
107
126
  "MinIOUploadStorage",
108
127
  "PasswordUtils",
109
128
  "PhoneBR",
129
+ "Region",
110
130
  "RetryPolicy",
131
+ "StateBR",
111
132
  "SystemMetrics",
112
133
  "TOTPHelper",
113
134
  "ThrottleBackend",
114
135
  "ThrottleStatus",
136
+ "UFField",
115
137
  "UploadResult",
116
138
  "UploadStorage",
117
139
  "UploadUtils",
118
140
  "build_content_disposition",
141
+ "cities_by_uf",
119
142
  "generate_opaque_token",
120
143
  "get_client_ip",
121
144
  "get_client_ip_from_scope",
145
+ "get_state",
122
146
  "hash_opaque_token",
123
147
  "is_valid_cep",
148
+ "is_valid_city",
124
149
  "is_valid_cnpj",
125
150
  "is_valid_cpf",
126
151
  "is_valid_cpf_cnpj",
127
152
  "is_valid_phone_br",
153
+ "is_valid_uf",
154
+ "list_states",
128
155
  "modify_dict",
129
156
  "normalize_cep",
157
+ "normalize_city",
130
158
  "normalize_cnpj",
131
159
  "normalize_cpf",
132
160
  "normalize_cpf_cnpj",
133
161
  "normalize_phone_br",
162
+ "normalize_uf",
134
163
  "only_digits",
135
164
  "sniff_mime",
165
+ "states_by_region",
136
166
  "to_utc",
137
167
  "utcnow",
138
168
  "verify_opaque_token",