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.
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/CHANGELOG.md +33 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/PKG-INFO +2 -2
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/README.md +1 -1
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/br-helpers.en.md +93 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/br-helpers.md +93 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/reference.md +12 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/pyproject.toml +2 -1
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/__init__.py +29 -1
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/__init__.py +30 -0
- tempest_fastapi_sdk-0.53.0/tempest_fastapi_sdk/utils/data/br_locations.json +5772 -0
- tempest_fastapi_sdk-0.53.0/tempest_fastapi_sdk/utils/locations.py +373 -0
- tempest_fastapi_sdk-0.53.0/tests/utils/test_locations.py +170 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/uv.lock +1 -1
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.github/workflows/ci.yml +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.github/workflows/docs.yml +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.github/workflows/release-pypi.yml +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.gitignore +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/.python-version +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/CLAUDE.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/Makefile +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/architecture.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/architecture.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/changelog.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/changelog.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/contributing.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/contributing.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/index.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/index.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/installation.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/installation.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/index.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/index.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/api.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/api.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/business-rules.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/business-rules.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/domain.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/domain.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/flows.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/flows.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/index.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/learning/marketplace/index.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/migration.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/migration.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/admin.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/admin.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/auth-flow.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/auth-flow.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cache.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cache.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cli.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/cli.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/database.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/database.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/deploy-safety.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/deploy-safety.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/downloads.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/downloads.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/email.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/email.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http-client.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http-client.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/http.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/idempotency.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/idempotency.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/index.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/index.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/logging.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/logging.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/metrics.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/metrics.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/mfa.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/mfa.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/multi-tenant.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/multi-tenant.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/observability.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/observability.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/offline-sync.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/offline-sync.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/outbox.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/outbox.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/queue-tasks.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/queue-tasks.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/realtime.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/realtime.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/security.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/security.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/sessions.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/sessions.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/storage.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/storage.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/testing.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/testing.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/uploads.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/uploads.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/utilities.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/utilities.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/webpush.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/webpush.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/websocket.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/recipes/websocket.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/reference.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/roadmap.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/roadmap.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/tutorial.en.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/docs/tutorial.md +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/mkdocs.yml +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/scripts/extract_recipe.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/config.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/router.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/session.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/site.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/server.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/static.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/router.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/service.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/activation.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/auth/templates/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
- {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
- {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
- {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
- {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
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
- {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
- {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
- {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
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/db.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/main.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/new.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/cli/user.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/context.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/enums.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/core/logging.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/connection.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/model.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/repository.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/py.typed +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/services/base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/settings/base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/testing/database.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/download.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/email.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/log.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/password.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_auth.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_forms.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_logs_nav.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_router.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_site.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/admin/test_user_model.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_body_size.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_cookies.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_cors.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_csrf.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_dependencies_auth.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_graceful.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_handlers.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_health_router.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_idempotency.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_jwt_dependency.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_logs_router.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_oauth.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_prometheus.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_request_id_middleware.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_role_dependency.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_server.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_static.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/api/test_webhooks_rsa.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/test_guards.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/auth/test_service.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cache/test_decorator.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cache/test_redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_db.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_db_seed.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_main.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_secrets.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/cli/test_user.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/conftest.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/controllers/test_base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/test_context.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/test_enums.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/core/test_logging.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_bulk_ops.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_connection.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_migrations.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_model.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_outbox.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_repository.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_safe_upgrade.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_slow_query.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/db/test_tenant.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/exceptions/test_exceptions.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/queue/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_cursor_pagination.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_link_headers.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_pagination.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/schemas/test_response.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/services/test_base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sessions/test_sessions.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/settings/test_base.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/settings/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/sse/test_event_stream.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/storage/test_minio_client.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/tasks/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/tasks/test_scheduler.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/testing/test_database.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_client_ip.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_datetime.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_dict.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_download.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_email.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_http_client.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_jwt.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_lazy_extras.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_log.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_metrics.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_password.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_regex.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_throttle.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/utils/test_upload.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/webpush/test_dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/webpush/test_schemas.py +0 -0
- {tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tests/websockets/__init__.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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",
|
{tempest_fastapi_sdk-0.52.0 → tempest_fastapi_sdk-0.53.0}/tempest_fastapi_sdk/utils/__init__.py
RENAMED
|
@@ -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",
|