tempest-fastapi-sdk 0.76.0__tar.gz → 0.77.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.76.0 → tempest_fastapi_sdk-0.77.0}/CHANGELOG.md +16 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/PKG-INFO +2 -2
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/README.md +1 -1
- tempest_fastapi_sdk-0.77.0/docs/recipes/fields.en.md +88 -0
- tempest_fastapi_sdk-0.77.0/docs/recipes/fields.md +88 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/mkdocs.yml +1 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/pyproject.toml +1 -1
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/__init__.py +29 -1
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/__init__.py +30 -0
- tempest_fastapi_sdk-0.77.0/tempest_fastapi_sdk/utils/fields.py +116 -0
- tempest_fastapi_sdk-0.77.0/tests/utils/test_fields.py +140 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/uv.lock +1 -1
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/.github/workflows/ci.yml +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/.github/workflows/docs.yml +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/.github/workflows/release-pypi.yml +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/.gitignore +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/.python-version +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/CLAUDE.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/Makefile +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/architecture.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/architecture.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/changelog.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/changelog.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/contributing.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/contributing.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/index.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/index.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/installation.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/installation.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/index.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/index.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/api.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/api.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/business-rules.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/business-rules.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/domain.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/domain.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/flows.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/flows.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/index.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/learning/marketplace/index.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/migration.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/migration.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/admin.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/admin.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/audit-trail.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/audit-trail.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/auth-flow.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/auth-flow.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/br-helpers.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/br-helpers.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/cache.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/cache.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/cli.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/cli.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/database.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/database.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/deploy-safety.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/deploy-safety.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/downloads.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/downloads.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/email.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/email.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/feature-flags.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/feature-flags.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/http-client.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/http-client.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/http.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/http.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/idempotency.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/idempotency.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/index.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/index.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/logging.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/logging.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/metrics.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/metrics.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/mfa.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/mfa.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/multi-tenant.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/multi-tenant.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/observability.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/observability.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/offline-sync.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/offline-sync.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/outbox.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/outbox.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/queue-tasks.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/queue-tasks.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/realtime.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/realtime.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/refresh-tokens.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/refresh-tokens.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/security.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/security.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/sessions.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/sessions.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/storage.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/storage.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/stored-files.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/stored-files.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/testing.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/testing.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/typing.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/typing.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/uploads.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/uploads.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/utilities.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/utilities.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/webpush.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/webpush.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/websocket.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/recipes/websocket.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/reference.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/reference.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/roadmap.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/roadmap.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/tutorial.en.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/docs/tutorial.md +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/mkdocs_hooks/llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/scripts/extract_recipe.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/config.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/discovery.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/router.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/session.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/site.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/admin/theme.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/server.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/static.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/locale.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/router.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/service.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/config.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/db.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/main.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/new.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/cli/user.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/core/context.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/core/enums.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/core/logging.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/core/typed.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/audit.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/backup.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/connection.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/model.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/repository.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/flags/backends.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/flags/service.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/py.typed +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/services/base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/settings/base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/testing/database.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/download.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/email.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/locations.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/log.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/password.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_auth.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_discovery.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_forms.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_logs_nav.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_router.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_site.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_theme.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/admin/test_user_model.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_body_size.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_cookies.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_cors.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_csrf.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_dependencies_auth.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_graceful.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_handlers.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_health_router.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_idempotency.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_jwt_dependency.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_logs_router.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_oauth.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_prometheus.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_rate_limit_extras.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_request_id_middleware.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_role_dependency.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_server.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_static.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/api/test_webhooks_rsa.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/auth/test_guards.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/auth/test_locale.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/auth/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/auth/test_refresh.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/auth/test_refresh_db.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/auth/test_service.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cache/test_decorator.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cache/test_invalidation.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cache/test_redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_config.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_db.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_db_seed.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_lint_strictness.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_main.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_secrets.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/cli/test_user.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/conftest.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/controllers/test_base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/core/test_context.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/core/test_enums.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/core/test_logging.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/core/test_typed.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_audit.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_backup.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_bulk_ops.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_connection.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_migrations.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_model.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_outbox.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_repository.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_safe_upgrade.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_slow_query.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/db/test_tenant.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/exceptions/test_exceptions.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/exceptions/test_i18n.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/flags/test_flags.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/queue/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/schemas/test_base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/schemas/test_cursor_pagination.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/schemas/test_link_headers.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/schemas/test_pagination.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/schemas/test_response.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/services/test_base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/services/test_file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/sessions/test_sessions.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/settings/test_base.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/settings/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/sse/test_event_stream.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/storage/test_minio_client.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/tasks/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/tasks/test_scheduler.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/testing/test_database.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_client_ip.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_datetime.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_dict.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_download.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_email.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_http_client.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_jwt.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_lazy_extras.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_locations.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_log.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_metrics.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_password.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_regex.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_throttle.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/utils/test_upload.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/webpush/test_dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/webpush/test_schemas.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tests/websockets/test_hub_and_router.py +0 -0
|
@@ -5,6 +5,22 @@ 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.77.0] — 2026-06-27
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Generic validated field types (`tempest_fastapi_sdk.utils.fields`).**
|
|
13
|
+
A base set of `Annotated` Pydantic types that bake a validation rule
|
|
14
|
+
into the type, following the `*Field` convention (so the schema reads as
|
|
15
|
+
what it is instead of repeating `Field(gt=0, ...)`): integers
|
|
16
|
+
`PositiveIntField`, `NonNegativeIntField`, `CentsField` (money in minor
|
|
17
|
+
units), `PortField`; floats `PositiveFloatField`, `NonNegativeFloatField`,
|
|
18
|
+
`PercentField` (0..100), `RatioField` (0..1), `LatitudeField`,
|
|
19
|
+
`LongitudeField`; `PriceField` (non-negative `Decimal`, 2 places); and
|
|
20
|
+
strings `NonEmptyStrField` (trim + non-empty), `SlugField`,
|
|
21
|
+
`HexColorField`. Exported from `tempest_fastapi_sdk` and
|
|
22
|
+
`tempest_fastapi_sdk.utils`.
|
|
23
|
+
|
|
8
24
|
## [0.76.0] — 2026-06-27
|
|
9
25
|
|
|
10
26
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tempest-fastapi-sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.77.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 (`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`) |
|
|
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]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
|
|
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`).
|
|
@@ -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 (`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`) |
|
|
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]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
|
|
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`).
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Validated fields (ready-made types)
|
|
2
|
+
|
|
3
|
+
Instead of repeating `Field(gt=0, ...)` on every schema, the SDK ships
|
|
4
|
+
`Annotated` types with the validation rule baked in — the field becomes
|
|
5
|
+
**self-describing**. They follow the same `*Field` convention as the BR
|
|
6
|
+
fields (`CPFField`, `UFField`, ...): anything ending in `Field` is a
|
|
7
|
+
ready-to-use schema field type. Invalid values raise `ValidationError` ->
|
|
8
|
+
HTTP 422 via the SDK exception handler.
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
from tempest_fastapi_sdk import BaseSchema
|
|
12
|
+
from tempest_fastapi_sdk.utils import CentsField, PercentField, SlugField
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ProductCreateSchema(BaseSchema):
|
|
16
|
+
slug: SlugField # lowercase kebab-case
|
|
17
|
+
price_cents: CentsField # int >= 0 (money in cents)
|
|
18
|
+
discount: PercentField # float in [0, 100]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Integers
|
|
22
|
+
|
|
23
|
+
| Type | Rule | Use |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| `PositiveIntField` | `> 0` | quantities, counts, 1-based ids |
|
|
26
|
+
| `NonNegativeIntField` | `>= 0` | counters that reset to zero |
|
|
27
|
+
| `CentsField` | `>= 0` | money in minor units (cents) |
|
|
28
|
+
| `PortField` | `1..65535` | TCP/UDP port |
|
|
29
|
+
|
|
30
|
+
!!! tip "Money in cents"
|
|
31
|
+
Store monetary values as an **integer of cents** (`CentsField`) to
|
|
32
|
+
dodge binary float rounding. Divide by 100 only at the presentation
|
|
33
|
+
edge. When the contract requires an exact decimal (e.g. a gateway
|
|
34
|
+
payload), use `PriceField`.
|
|
35
|
+
|
|
36
|
+
## Floats
|
|
37
|
+
|
|
38
|
+
| Type | Rule |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `PositiveFloatField` | `> 0` |
|
|
41
|
+
| `NonNegativeFloatField` | `>= 0` |
|
|
42
|
+
| `PercentField` | `0..100` |
|
|
43
|
+
| `RatioField` | `0..1` (fractions/probabilities) |
|
|
44
|
+
| `LatitudeField` | `-90..90` |
|
|
45
|
+
| `LongitudeField` | `-180..180` |
|
|
46
|
+
|
|
47
|
+
## Decimals
|
|
48
|
+
|
|
49
|
+
`PriceField` is a non-negative `Decimal` with 2 places:
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from tempest_fastapi_sdk import BaseSchema
|
|
53
|
+
from tempest_fastapi_sdk.utils import PriceField
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class InvoiceSchema(BaseSchema):
|
|
57
|
+
total: PriceField # "9.99" -> Decimal("9.99"); "1.999" and "-1" rejected
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Strings
|
|
61
|
+
|
|
62
|
+
| Type | Rule |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| `NonEmptyStrField` | trims whitespace and rejects empty (whitespace-only too) |
|
|
65
|
+
| `SlugField` | lowercase kebab-case (`my-post-1`) |
|
|
66
|
+
| `HexColorField` | CSS hex color (`#fff` or `#abc123`) |
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from tempest_fastapi_sdk import BaseSchema
|
|
70
|
+
from tempest_fastapi_sdk.utils import HexColorField, NonEmptyStrField, SlugField
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class CategorySchema(BaseSchema):
|
|
74
|
+
name: NonEmptyStrField # " Drinks " -> "Drinks"; " " rejected
|
|
75
|
+
slug: SlugField
|
|
76
|
+
color: HexColorField
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Recap
|
|
80
|
+
|
|
81
|
+
- Everything is `Annotated[..., rule]` with a `*Field` suffix —
|
|
82
|
+
self-describing, no repeated `Field(...)` in the schema.
|
|
83
|
+
- Integers: `PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`.
|
|
84
|
+
- Floats: `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`,
|
|
85
|
+
`RatioField`, `LatitudeField`, `LongitudeField`.
|
|
86
|
+
- Decimal: `PriceField` (2 places, `>= 0`).
|
|
87
|
+
- Strings: `NonEmptyStrField`, `SlugField`, `HexColorField`.
|
|
88
|
+
- Money: prefer `CentsField` (integer) for storage; `PriceField` for a decimal contract.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Campos validados (tipos prontos)
|
|
2
|
+
|
|
3
|
+
Em vez de repetir `Field(gt=0, ...)` em cada schema, o SDK traz tipos
|
|
4
|
+
`Annotated` com a regra de validação embutida — o campo passa a se
|
|
5
|
+
**autodescrever**. Seguem a mesma convenção `*Field` dos campos BR
|
|
6
|
+
(`CPFField`, `UFField`, ...): tudo que termina em `Field` é um tipo de
|
|
7
|
+
campo pronto pra schema. Valor inválido vira `ValidationError` → HTTP 422
|
|
8
|
+
pelo handler do SDK.
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
from tempest_fastapi_sdk import BaseSchema
|
|
12
|
+
from tempest_fastapi_sdk.utils import CentsField, PercentField, SlugField
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ProductCreateSchema(BaseSchema):
|
|
16
|
+
slug: SlugField # kebab-case minúsculo
|
|
17
|
+
price_cents: CentsField # int >= 0 (dinheiro em centavos)
|
|
18
|
+
discount: PercentField # float em [0, 100]
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Inteiros
|
|
22
|
+
|
|
23
|
+
| Tipo | Regra | Uso |
|
|
24
|
+
| --- | --- | --- |
|
|
25
|
+
| `PositiveIntField` | `> 0` | quantidades, contagens, ids 1-based |
|
|
26
|
+
| `NonNegativeIntField` | `>= 0` | contadores que zeram |
|
|
27
|
+
| `CentsField` | `>= 0` | dinheiro em unidades menores (centavos) |
|
|
28
|
+
| `PortField` | `1..65535` | porta TCP/UDP |
|
|
29
|
+
|
|
30
|
+
!!! tip "Dinheiro em centavos"
|
|
31
|
+
Guarde valores monetários como **inteiro de centavos** (`CentsField`)
|
|
32
|
+
pra fugir do arredondamento de float binário. Divida por 100 só na
|
|
33
|
+
borda de apresentação. Quando o contrato exige decimal exato (ex.:
|
|
34
|
+
payload de gateway), use `PriceField`.
|
|
35
|
+
|
|
36
|
+
## Floats
|
|
37
|
+
|
|
38
|
+
| Tipo | Regra |
|
|
39
|
+
| --- | --- |
|
|
40
|
+
| `PositiveFloatField` | `> 0` |
|
|
41
|
+
| `NonNegativeFloatField` | `>= 0` |
|
|
42
|
+
| `PercentField` | `0..100` |
|
|
43
|
+
| `RatioField` | `0..1` (frações/probabilidades) |
|
|
44
|
+
| `LatitudeField` | `-90..90` |
|
|
45
|
+
| `LongitudeField` | `-180..180` |
|
|
46
|
+
|
|
47
|
+
## Decimais
|
|
48
|
+
|
|
49
|
+
`PriceField` é um `Decimal` não-negativo com 2 casas:
|
|
50
|
+
|
|
51
|
+
```python
|
|
52
|
+
from tempest_fastapi_sdk import BaseSchema
|
|
53
|
+
from tempest_fastapi_sdk.utils import PriceField
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class InvoiceSchema(BaseSchema):
|
|
57
|
+
total: PriceField # "9.99" -> Decimal("9.99"); "1.999" e "-1" rejeitados
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Strings
|
|
61
|
+
|
|
62
|
+
| Tipo | Regra |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| `NonEmptyStrField` | apara espaços e rejeita vazio (só-espaço também) |
|
|
65
|
+
| `SlugField` | kebab-case minúsculo (`meu-post-1`) |
|
|
66
|
+
| `HexColorField` | cor hex CSS (`#fff` ou `#abc123`) |
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
from tempest_fastapi_sdk import BaseSchema
|
|
70
|
+
from tempest_fastapi_sdk.utils import HexColorField, NonEmptyStrField, SlugField
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class CategorySchema(BaseSchema):
|
|
74
|
+
name: NonEmptyStrField # " Bebidas " -> "Bebidas"; " " rejeitado
|
|
75
|
+
slug: SlugField
|
|
76
|
+
color: HexColorField
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Recap
|
|
80
|
+
|
|
81
|
+
- Tudo `Annotated[..., regra]`, com sufixo `*Field` — autodescritivo,
|
|
82
|
+
sem repetir `Field(...)` no schema.
|
|
83
|
+
- Inteiros: `PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`.
|
|
84
|
+
- Floats: `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`,
|
|
85
|
+
`RatioField`, `LatitudeField`, `LongitudeField`.
|
|
86
|
+
- Decimal: `PriceField` (2 casas, `>= 0`).
|
|
87
|
+
- Strings: `NonEmptyStrField`, `SlugField`, `HexColorField`.
|
|
88
|
+
- Dinheiro: prefira `CentsField` (inteiro) pra guardar; `PriceField` no contrato decimal.
|
|
@@ -219,6 +219,7 @@ nav:
|
|
|
219
219
|
- CLI: recipes/cli.md
|
|
220
220
|
- "Deploy seguro (migrations + shutdown)": recipes/deploy-safety.md
|
|
221
221
|
- Downloads: recipes/downloads.md
|
|
222
|
+
- "Campos validados (tipos prontos)": recipes/fields.md
|
|
222
223
|
- Email transacional: recipes/email.md
|
|
223
224
|
- Feature flags: recipes/feature-flags.md
|
|
224
225
|
- Fila e Tarefas: recipes/queue-tasks.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tempest-fastapi-sdk"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.77.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,6 +245,7 @@ from tempest_fastapi_sdk.utils import (
|
|
|
245
245
|
REQUEST_ID_HEADER,
|
|
246
246
|
UF,
|
|
247
247
|
AttemptThrottle,
|
|
248
|
+
CentsField,
|
|
248
249
|
CEPField,
|
|
249
250
|
ChoiceBR,
|
|
250
251
|
CircuitOpenError,
|
|
@@ -259,18 +260,31 @@ from tempest_fastapi_sdk.utils import (
|
|
|
259
260
|
DownloadUtils,
|
|
260
261
|
EmailUtils,
|
|
261
262
|
GPUMetrics,
|
|
263
|
+
HexColorField,
|
|
262
264
|
HTTPClient,
|
|
263
265
|
JWTUtils,
|
|
266
|
+
LatitudeField,
|
|
264
267
|
LocalUploadStorage,
|
|
265
268
|
LogUtils,
|
|
269
|
+
LongitudeField,
|
|
266
270
|
MemoryMetrics,
|
|
267
271
|
MetricsUtils,
|
|
268
272
|
MinIOUploadStorage,
|
|
273
|
+
NonEmptyStrField,
|
|
274
|
+
NonNegativeFloatField,
|
|
275
|
+
NonNegativeIntField,
|
|
269
276
|
PasswordUtils,
|
|
277
|
+
PercentField,
|
|
270
278
|
PhoneBR,
|
|
271
279
|
PhoneBRField,
|
|
280
|
+
PortField,
|
|
281
|
+
PositiveFloatField,
|
|
282
|
+
PositiveIntField,
|
|
283
|
+
PriceField,
|
|
284
|
+
RatioField,
|
|
272
285
|
Region,
|
|
273
286
|
RetryPolicy,
|
|
287
|
+
SlugField,
|
|
274
288
|
StateBR,
|
|
275
289
|
SystemMetrics,
|
|
276
290
|
ThrottleBackend,
|
|
@@ -328,7 +342,7 @@ from tempest_fastapi_sdk.websockets import (
|
|
|
328
342
|
make_websocket_router,
|
|
329
343
|
)
|
|
330
344
|
|
|
331
|
-
__version__: str = "0.
|
|
345
|
+
__version__: str = "0.77.0"
|
|
332
346
|
|
|
333
347
|
__all__: list[str] = [
|
|
334
348
|
"BASE_COLUMN_ORDER",
|
|
@@ -394,6 +408,7 @@ __all__: list[str] = [
|
|
|
394
408
|
"CPUMetrics",
|
|
395
409
|
"CSRFMiddleware",
|
|
396
410
|
"CachedResponse",
|
|
411
|
+
"CentsField",
|
|
397
412
|
"ChoiceBR",
|
|
398
413
|
"CircuitOpenError",
|
|
399
414
|
"CityBR",
|
|
@@ -424,6 +439,7 @@ __all__: list[str] = [
|
|
|
424
439
|
"HTTPClient",
|
|
425
440
|
"HardenedStaticFiles",
|
|
426
441
|
"HealthCheck",
|
|
442
|
+
"HexColorField",
|
|
427
443
|
"IdempotencyMiddleware",
|
|
428
444
|
"IdempotencyStore",
|
|
429
445
|
"InvalidFileTypeException",
|
|
@@ -431,6 +447,7 @@ __all__: list[str] = [
|
|
|
431
447
|
"JSONFormatter",
|
|
432
448
|
"JWTSettings",
|
|
433
449
|
"JWTUtils",
|
|
450
|
+
"LatitudeField",
|
|
434
451
|
"LocalUploadStorage",
|
|
435
452
|
"LogEntrySchema",
|
|
436
453
|
"LogSettings",
|
|
@@ -439,6 +456,7 @@ __all__: list[str] = [
|
|
|
439
456
|
"LoginResponseSchema",
|
|
440
457
|
"LoginSchema",
|
|
441
458
|
"LogoutSchema",
|
|
459
|
+
"LongitudeField",
|
|
442
460
|
"MFAConfirmSchema",
|
|
443
461
|
"MFADisableSchema",
|
|
444
462
|
"MFAEnrollResponseSchema",
|
|
@@ -453,6 +471,9 @@ __all__: list[str] = [
|
|
|
453
471
|
"MetricsUtils",
|
|
454
472
|
"MinIOSettings",
|
|
455
473
|
"MinIOUploadStorage",
|
|
474
|
+
"NonEmptyStrField",
|
|
475
|
+
"NonNegativeFloatField",
|
|
476
|
+
"NonNegativeIntField",
|
|
456
477
|
"NotFoundException",
|
|
457
478
|
"OAuthError",
|
|
458
479
|
"OAuthTokens",
|
|
@@ -468,14 +489,20 @@ __all__: list[str] = [
|
|
|
468
489
|
"PasswordResetResponseSchema",
|
|
469
490
|
"PasswordResetToken",
|
|
470
491
|
"PasswordUtils",
|
|
492
|
+
"PercentField",
|
|
471
493
|
"PhoneBR",
|
|
472
494
|
"PhoneBRField",
|
|
495
|
+
"PortField",
|
|
496
|
+
"PositiveFloatField",
|
|
497
|
+
"PositiveIntField",
|
|
498
|
+
"PriceField",
|
|
473
499
|
"PrometheusMiddleware",
|
|
474
500
|
"RSAWebhookSignatureVerifier",
|
|
475
501
|
"RabbitMQSettings",
|
|
476
502
|
"RateLimitMiddleware",
|
|
477
503
|
"RateLimitResult",
|
|
478
504
|
"RateLimitStore",
|
|
505
|
+
"RatioField",
|
|
479
506
|
"RedisFeatureFlagBackend",
|
|
480
507
|
"RedisIdempotencyStore",
|
|
481
508
|
"RedisRateLimitStore",
|
|
@@ -499,6 +526,7 @@ __all__: list[str] = [
|
|
|
499
526
|
"SignupResponseSchema",
|
|
500
527
|
"SignupSchema",
|
|
501
528
|
"SlowQueryLogger",
|
|
529
|
+
"SlugField",
|
|
502
530
|
"SoftDeleteMixin",
|
|
503
531
|
"StateBR",
|
|
504
532
|
"StoredFileServiceMixin",
|
{tempest_fastapi_sdk-0.76.0 → tempest_fastapi_sdk-0.77.0}/tempest_fastapi_sdk/utils/__init__.py
RENAMED
|
@@ -21,6 +21,22 @@ from tempest_fastapi_sdk.utils.download import (
|
|
|
21
21
|
build_content_disposition,
|
|
22
22
|
)
|
|
23
23
|
from tempest_fastapi_sdk.utils.email import EmailUtils
|
|
24
|
+
from tempest_fastapi_sdk.utils.fields import (
|
|
25
|
+
CentsField,
|
|
26
|
+
HexColorField,
|
|
27
|
+
LatitudeField,
|
|
28
|
+
LongitudeField,
|
|
29
|
+
NonEmptyStrField,
|
|
30
|
+
NonNegativeFloatField,
|
|
31
|
+
NonNegativeIntField,
|
|
32
|
+
PercentField,
|
|
33
|
+
PortField,
|
|
34
|
+
PositiveFloatField,
|
|
35
|
+
PositiveIntField,
|
|
36
|
+
PriceField,
|
|
37
|
+
RatioField,
|
|
38
|
+
SlugField,
|
|
39
|
+
)
|
|
24
40
|
from tempest_fastapi_sdk.utils.http_client import (
|
|
25
41
|
REQUEST_ID_HEADER,
|
|
26
42
|
CircuitOpenError,
|
|
@@ -123,6 +139,7 @@ __all__: list[str] = [
|
|
|
123
139
|
"CPFOrCNPJ",
|
|
124
140
|
"CPFOrCNPJField",
|
|
125
141
|
"CPUMetrics",
|
|
142
|
+
"CentsField",
|
|
126
143
|
"ChoiceBR",
|
|
127
144
|
"CircuitOpenError",
|
|
128
145
|
"CityBR",
|
|
@@ -132,17 +149,30 @@ __all__: list[str] = [
|
|
|
132
149
|
"EmailUtils",
|
|
133
150
|
"GPUMetrics",
|
|
134
151
|
"HTTPClient",
|
|
152
|
+
"HexColorField",
|
|
135
153
|
"JWTUtils",
|
|
154
|
+
"LatitudeField",
|
|
136
155
|
"LocalUploadStorage",
|
|
137
156
|
"LogUtils",
|
|
157
|
+
"LongitudeField",
|
|
138
158
|
"MemoryMetrics",
|
|
139
159
|
"MetricsUtils",
|
|
140
160
|
"MinIOUploadStorage",
|
|
161
|
+
"NonEmptyStrField",
|
|
162
|
+
"NonNegativeFloatField",
|
|
163
|
+
"NonNegativeIntField",
|
|
141
164
|
"PasswordUtils",
|
|
165
|
+
"PercentField",
|
|
142
166
|
"PhoneBR",
|
|
143
167
|
"PhoneBRField",
|
|
168
|
+
"PortField",
|
|
169
|
+
"PositiveFloatField",
|
|
170
|
+
"PositiveIntField",
|
|
171
|
+
"PriceField",
|
|
172
|
+
"RatioField",
|
|
144
173
|
"Region",
|
|
145
174
|
"RetryPolicy",
|
|
175
|
+
"SlugField",
|
|
146
176
|
"StateBR",
|
|
147
177
|
"SystemMetrics",
|
|
148
178
|
"TOTPHelper",
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Reusable Pydantic field types with built-in validation rules.
|
|
2
|
+
|
|
3
|
+
These are generic ``Annotated`` aliases that bake a validation rule into
|
|
4
|
+
the type itself, so a schema field reads as *what it is* instead of
|
|
5
|
+
repeating ``Field(gt=0, ...)`` at every use site:
|
|
6
|
+
|
|
7
|
+
from tempest_fastapi_sdk.utils import CentsField, PercentField, SlugField
|
|
8
|
+
|
|
9
|
+
class ProductCreateSchema(BaseSchema):
|
|
10
|
+
price_cents: CentsField # int >= 0 (money in minor units)
|
|
11
|
+
discount: PercentField # float in [0, 100]
|
|
12
|
+
slug: SlugField # lower-kebab-case string
|
|
13
|
+
|
|
14
|
+
They follow the same ``*Field`` naming convention as the BR field types
|
|
15
|
+
(``CPFField`` / ``UFField`` / ...), so anything ending in ``Field`` is a
|
|
16
|
+
drop-in schema field type. Invalid values raise ``ValidationError`` ->
|
|
17
|
+
HTTP 422 via the SDK exception handler.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
from decimal import Decimal
|
|
23
|
+
from typing import Annotated
|
|
24
|
+
|
|
25
|
+
from annotated_types import Ge, Gt, Le
|
|
26
|
+
from pydantic import Field, StringConstraints
|
|
27
|
+
|
|
28
|
+
# --- Integers -------------------------------------------------------------
|
|
29
|
+
|
|
30
|
+
PositiveIntField = Annotated[int, Gt(0)]
|
|
31
|
+
"""Integer strictly greater than zero (quantities, counts, 1-based ids)."""
|
|
32
|
+
|
|
33
|
+
NonNegativeIntField = Annotated[int, Ge(0)]
|
|
34
|
+
"""Integer greater than or equal to zero."""
|
|
35
|
+
|
|
36
|
+
CentsField = Annotated[int, Ge(0)]
|
|
37
|
+
"""Monetary amount in minor units (cents): a non-negative integer.
|
|
38
|
+
|
|
39
|
+
Storing money as integer cents avoids binary float rounding. Use this for
|
|
40
|
+
prices/balances and divide by 100 only at the presentation edge.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
PortField = Annotated[int, Ge(1), Le(65535)]
|
|
44
|
+
"""TCP/UDP port number in the valid range ``1..65535``."""
|
|
45
|
+
|
|
46
|
+
# --- Floats ---------------------------------------------------------------
|
|
47
|
+
|
|
48
|
+
PositiveFloatField = Annotated[float, Gt(0)]
|
|
49
|
+
"""Float strictly greater than zero."""
|
|
50
|
+
|
|
51
|
+
NonNegativeFloatField = Annotated[float, Ge(0)]
|
|
52
|
+
"""Float greater than or equal to zero."""
|
|
53
|
+
|
|
54
|
+
PercentField = Annotated[float, Ge(0), Le(100)]
|
|
55
|
+
"""Percentage in the inclusive range ``0..100``."""
|
|
56
|
+
|
|
57
|
+
RatioField = Annotated[float, Ge(0), Le(1)]
|
|
58
|
+
"""Fraction/probability in the inclusive range ``0..1``."""
|
|
59
|
+
|
|
60
|
+
LatitudeField = Annotated[float, Ge(-90), Le(90)]
|
|
61
|
+
"""Geographic latitude in degrees, ``-90..90``."""
|
|
62
|
+
|
|
63
|
+
LongitudeField = Annotated[float, Ge(-180), Le(180)]
|
|
64
|
+
"""Geographic longitude in degrees, ``-180..180``."""
|
|
65
|
+
|
|
66
|
+
# --- Decimals -------------------------------------------------------------
|
|
67
|
+
|
|
68
|
+
PriceField = Annotated[Decimal, Field(ge=0, decimal_places=2)]
|
|
69
|
+
"""Non-negative monetary amount as a :class:`~decimal.Decimal`, 2 places.
|
|
70
|
+
|
|
71
|
+
Prefer :data:`CentsField` (integer cents) for storage; use ``PriceField``
|
|
72
|
+
when an exact decimal with two fractional digits is the contract (e.g. a
|
|
73
|
+
payment gateway payload).
|
|
74
|
+
"""
|
|
75
|
+
|
|
76
|
+
# --- Strings --------------------------------------------------------------
|
|
77
|
+
|
|
78
|
+
NonEmptyStrField = Annotated[
|
|
79
|
+
str,
|
|
80
|
+
StringConstraints(strip_whitespace=True, min_length=1),
|
|
81
|
+
]
|
|
82
|
+
"""String trimmed of surrounding whitespace, rejected when empty.
|
|
83
|
+
|
|
84
|
+
Whitespace-only input fails because it is stripped to ``""`` before the
|
|
85
|
+
``min_length=1`` check.
|
|
86
|
+
"""
|
|
87
|
+
|
|
88
|
+
SlugField = Annotated[
|
|
89
|
+
str,
|
|
90
|
+
StringConstraints(pattern=r"^[a-z0-9]+(?:-[a-z0-9]+)*$"),
|
|
91
|
+
]
|
|
92
|
+
"""URL-safe slug: lowercase alphanumerics in kebab-case (``my-post-1``)."""
|
|
93
|
+
|
|
94
|
+
HexColorField = Annotated[
|
|
95
|
+
str,
|
|
96
|
+
StringConstraints(pattern=r"^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$"),
|
|
97
|
+
]
|
|
98
|
+
"""CSS hex color, 3 or 6 hex digits with a leading ``#`` (``#fff`` / ``#abc123``)."""
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
__all__: list[str] = [
|
|
102
|
+
"CentsField",
|
|
103
|
+
"HexColorField",
|
|
104
|
+
"LatitudeField",
|
|
105
|
+
"LongitudeField",
|
|
106
|
+
"NonEmptyStrField",
|
|
107
|
+
"NonNegativeFloatField",
|
|
108
|
+
"NonNegativeIntField",
|
|
109
|
+
"PercentField",
|
|
110
|
+
"PortField",
|
|
111
|
+
"PositiveFloatField",
|
|
112
|
+
"PositiveIntField",
|
|
113
|
+
"PriceField",
|
|
114
|
+
"RatioField",
|
|
115
|
+
"SlugField",
|
|
116
|
+
]
|