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