tempest-fastapi-sdk 0.167.2__tar.gz → 0.168.1__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.167.2 → tempest_fastapi_sdk-0.168.1}/CHANGELOG.md +85 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/CLAUDE.md +21 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/PKG-INFO +42 -21
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/README.md +41 -20
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/index.en.md +42 -42
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/index.md +46 -46
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/permission-guards.en.md +118 -3
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/permission-guards.md +116 -2
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/reference.md +215 -214
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/roadmap.en.md +11 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/roadmap.md +11 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/mkdocs.yml +100 -21
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/pyproject.toml +1 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/__init__.py +3 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/__init__.py +2 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/requires.py +187 -22
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/permissions.py +187 -11
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/test_requires.py +262 -4
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_permissions.py +112 -1
- tempest_fastapi_sdk-0.168.1/tests/test_nav_ordering.py +279 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/uv.lock +1 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/docs.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/ci.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/docs.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/nightly-model.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.github/workflows/release-pypi.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.gitignore +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/.python-version +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/Makefile +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/admin-showcase.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/admin-showcase.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/architecture.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/architecture.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/changelog.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/changelog.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/contributing.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/contributing.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/fullstack-web.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/fullstack-web.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/genai-examples.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/genai-examples.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/index.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/index.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/installation.en.md +18 -18
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/installation.md +18 -18
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/integrated.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/integrated.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/index.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/index.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/api.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/api.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/business-rules.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/business-rules.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/domain.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/domain.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/flows.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/flows.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/index.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/learning/marketplace/index.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/marketplace-local.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/marketplace-local.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/migration.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/migration.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/admin.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/admin.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/artifact-registry.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/artifact-registry.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/audit-trail.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/audit-trail.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/auth-flow.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/auth-flow.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/authz.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/authz.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/br-helpers.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/br-helpers.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cache.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cache.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/chat.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/chat.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cli.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/cli.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/database.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/database.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/deploy-safety.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/deploy-safety.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/downloads.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/downloads.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/email.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/email.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/feature-flags.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/feature-flags.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/fields.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/fields.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/file-store.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/file-store.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/genai.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/genai.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/geo.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/geo.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http-client.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http-client.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/http.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/idempotency.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/idempotency.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/introspection-auth.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/introspection-auth.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/logging.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/logging.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/management-commands.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/management-commands.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/metrics.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/metrics.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/mfa.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/mfa.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/multi-tenant.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/multi-tenant.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/observability.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/observability.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/offline-sync.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/offline-sync.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-client.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-client.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-errors.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/openapi-errors.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/outbox.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/outbox.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/queue-tasks.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/queue-tasks.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/react-spa.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/react-spa.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/realtime.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/realtime.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/refresh-tokens.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/refresh-tokens.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/reviews.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/reviews.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/security.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/security.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sessions.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sessions.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sse.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/sse.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/storage.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/storage.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/stored-files.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/stored-files.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/system-checks.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/system-checks.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/tempestweb-frontend.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/tempestweb-frontend.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/testing.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/testing.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/typing.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/typing.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/uploads.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/uploads.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/utilities.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/utilities.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/vision.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/vision.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/webpush.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/webpush.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/websocket.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/recipes/websocket.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/reference.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/ssr.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/ssr.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/tutorial.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/docs/tutorial.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/mkdocs_hooks/llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/README.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/manual-validation.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-0.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-1.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-2.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/phase-3.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/planning/genai/validation-strategy.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/scripts/extract_recipe.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/dashboard.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/discovery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/forms.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/permissions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/session.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/site.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/autocomplete.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/import.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/admin/theme.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/cookies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/error_docs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/handlers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/middlewares/response_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/oauth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/health.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/server.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/spa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/static.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/api/webhooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/digest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/artifacts/registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/guards.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/introspection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/locale.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/authz/permissions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/decorator.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/models.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/chat/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/builtins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/messages.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/checks/registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/commands.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/lint.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/main.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/new.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/openapi_errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/openapi_fix.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/secrets.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/cli/user.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/controllers/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/context.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/enums.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/logging.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/core/typed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/audit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/backup.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/connection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/expressions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/migrations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/outbox.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/repository.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/signals.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/slow_query.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/tenant.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/backends.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/flags/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/language.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/stt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/audio/tts.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/batching.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/embeddings.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/generation_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/hardware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/moderation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/ollama.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/onnx_embed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/pipeline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/chroma.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/chunking.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/context.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/extract.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/fusion.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/hybrid.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/pdf.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/rerank.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/retriever.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/search.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/rag/vectorstore.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/structured.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/tokens.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/genai/vision_text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/br.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/distance.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/enums.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/estimate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/geocoding.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/geometry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/polyline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/routing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/geo/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/emit_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/emit_schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/ir.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/loader.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/naming.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/openapi/parse.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/py.typed +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/consumer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/queue/manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/models.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/reviews/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/logs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/schemas/response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/services/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sessions/store.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/settings/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/settings/mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sse/broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/assets.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/attributes.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/page.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/ssr/webapp.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/cron.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/dead_letter.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/observability.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/oop.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/queue.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/testing/database.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/testing/factories.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/datetime.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/dict.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/download.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/email.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/fields.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/file_store.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/http_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/jwt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/locations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/log.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/password.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/regex.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/throttle.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/totp.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/utils/upload.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/mapping.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/vision/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/webpush/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/hub.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_audit_viewer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_autocomplete_fk.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_csv_import.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_dashboard_cards.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_discovery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_forms.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_inlines.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_lenses.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_logs_nav.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_rbac.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_rich_filters.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_site.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_theme.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_upload_field.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_user_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/admin/test_widgets_json_time.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_body_size.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_business_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_cookies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_cors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_csrf.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_dependencies_auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_error_docs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_graceful.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_handlers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_health_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_idempotency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_jwt_dependency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_logs_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_oauth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_outbound_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_prometheus.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_rate_limit_extras.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_request_id_middleware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_response_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_role_dependency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_server.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_spa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_static.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/api/test_webhooks_rsa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/support.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/test_actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/test_digest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/artifacts/test_registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_cookie_delivery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_email_change.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_guards.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_introspection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_locale.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_refresh.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_refresh_db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/auth/test_service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/test_dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/authz/test_permissions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/test_decorator.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/test_invalidation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cache/test_redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/chat/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/chat/test_chat.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/checks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/checks/test_check_config_cli.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/checks/test_checks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_db_seed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_dockerfile_spa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_lint_strictness.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_main.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_management_commands.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_openapi_errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_openapi_fix.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_secrets.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/cli/test_user.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/conftest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/controllers/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/controllers/test_generic_bounds.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_context.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_enums.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_logging.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/core/test_typed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_audit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_backup.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_bulk_ops.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_connection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_eager_load.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_expressions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_migrations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_outbox.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_repository.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_safe_upgrade.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_signals.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_slow_query.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/db/test_tenant.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/test_exceptions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/test_i18n.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/exceptions/test_inherited_code_warning.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/flags/test_flags.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/_eval/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/_eval/corpus.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/audio/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/audio/test_audio.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/audio/test_language.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/conftest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_batching.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_chat_memory.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_embedding_cache_redis.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_embeddings.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_eval_harness.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_genai_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_generation_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_generation_config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_gpu_validation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_hardware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_hybrid.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_moderation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_ollama.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_onnx_embed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_pipeline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_pipeline_integration.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_rag.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_refinements.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_rerank.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_structured.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_textgen_embed_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_tokens.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_vectorstore.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/genai/test_vision_text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_br.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_distance.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_estimate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_geocoding.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_geometry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_polyline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_routing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/geo/test_routing_extra.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/conftest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_loader.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_naming.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/openapi/test_parse.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/test_broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/test_consumer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/queue/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/reviews/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/reviews/test_reviews.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_cursor_pagination.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_link_headers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_pagination.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/schemas/test_response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/services/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/services/test_file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sessions/test_sessions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/settings/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/settings/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sse/test_broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/sse/test_event_stream.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_attributes.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_integration.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_page.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/ssr/test_webapp.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/storage/test_minio_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_cron.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_dead_letter.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_observability.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_oop.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_queue.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/tasks/test_scheduler.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/test_docs_api_guard.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/test_llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/test_reference_coverage.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/testing/test_database.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/testing/test_factories.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_client_ip.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_datetime.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_dict.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_download.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_email.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_fields.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_file_store.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_http_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_jwt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_lazy_extras.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_locations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_log.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_password.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_regex.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_throttle.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/utils/test_upload.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/vision/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/vision/test_vision.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/webpush/test_service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.1}/tests/websockets/test_hub_and_router.py +0 -0
|
@@ -5,6 +5,91 @@ 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.168.1] — 2026-07-26
|
|
9
|
+
|
|
10
|
+
Documentation navigation only — no code change, no API change.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Everything a reader scans to find a page is alphabetical now.** The recipe
|
|
15
|
+
list had grown to 53 entries in insertion order, which turns a lookup into a
|
|
16
|
+
full pass over the list. Sorted, accent- and case-insensitively:
|
|
17
|
+
- the `Receitas` / `Recipes` nav section (including the
|
|
18
|
+
`Exemplos completos` / `Complete examples` sub-section, itself at its
|
|
19
|
+
alphabetical position);
|
|
20
|
+
- both tables on the Recipes landing (`Tema`/`Theme` with all 53 recipes,
|
|
21
|
+
and the complete-examples table), each sorted in its own language;
|
|
22
|
+
- the themed groups of `docs/reference.md`, with
|
|
23
|
+
`## Superfície de topo` pinned first;
|
|
24
|
+
- the module table in `README.md`;
|
|
25
|
+
- the extras table in `docs/installation.md` + `.en.md`, with `[all]` last
|
|
26
|
+
because it is the catch-all, not an entry to look up.
|
|
27
|
+
- **English gets its own nav.** `mkdocs-static-i18n` translates labels but
|
|
28
|
+
cannot reorder a shared nav, so an alphabetical PT nav left the EN sidebar in
|
|
29
|
+
Portuguese order (`File in the service` before `Versioned artifacts` before
|
|
30
|
+
`Audit trail`). The `en` locale now declares a full `nav` of its own, sorted
|
|
31
|
+
in English. `nav_translations` stays for the labels the plugin still resolves.
|
|
32
|
+
|
|
33
|
+
The top-level tabs and the learning-project pages are deliberately **not**
|
|
34
|
+
alphabetical: they follow a reading order (install before tutorial, business
|
|
35
|
+
rules before endpoint map), where sorting would be the regression.
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- **`tests/test_nav_ordering.py`** — guards what the sweep above fixed: the two
|
|
40
|
+
navs cover the same pages (no page reachable in one language only), no page
|
|
41
|
+
is listed twice, the alphabetical sections are alphabetical in both
|
|
42
|
+
languages, and the Recipes landing tables are sorted. Eight tests; a swapped
|
|
43
|
+
entry fails them.
|
|
44
|
+
|
|
45
|
+
## [0.168.0] — 2026-07-26
|
|
46
|
+
|
|
47
|
+
Permission guards gain injected metadata: one generic guard, a specific check
|
|
48
|
+
per call site.
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- **A guard may declare a second parameter `meta: dict[str, Any]`.** That is
|
|
53
|
+
what turns `manager_only` / `auditor_only` / `admin_only` into one
|
|
54
|
+
`has_role(user, meta)` whose call sites declare
|
|
55
|
+
`@requires(has_role, meta={"role": "manager"})`. One-parameter guards are
|
|
56
|
+
untouched — the second argument is passed only to guards that declare it, so
|
|
57
|
+
both shapes mix freely in the same decoration.
|
|
58
|
+
- **`requires(..., meta=...)`** — literal metadata, copied at decoration time,
|
|
59
|
+
so a later mutation of the passed mapping cannot change what the route
|
|
60
|
+
enforces. Must be a `Mapping[str, Any]`; anything else is a
|
|
61
|
+
`TempestPermissionError` at import.
|
|
62
|
+
- **`requires(..., include_args=True)`** — merges the arguments the decorated
|
|
63
|
+
function was called with into the same mapping, so an ownership guard reads
|
|
64
|
+
`meta["order_id"]` without the route handing it over. The user parameter is
|
|
65
|
+
excluded (the guard already receives it), a parameter the caller omitted
|
|
66
|
+
contributes its default so the guard sees the values the body will run with,
|
|
67
|
+
a default that is a framework injection marker (`Depends(...)`) is dropped
|
|
68
|
+
rather than passed as a value, and a `meta=` literal wins a name clash with
|
|
69
|
+
an argument — the decoration is the explicit declaration. The mapping is
|
|
70
|
+
fresh per call and shared by that call's guards, so one guard may write a key
|
|
71
|
+
the next one reads without anything leaking into the next request.
|
|
72
|
+
- **`guard_metadata(fn)`** — reads the `meta=` literals off a decorated
|
|
73
|
+
function, next to `declared_guards` / `guarded_user_param`. Exported from
|
|
74
|
+
`tempest_fastapi_sdk` and `tempest_fastapi_sdk.authz`.
|
|
75
|
+
- **Four static checks in `tempest permissions`:** `meta-unused` (error — the
|
|
76
|
+
decoration passes `meta=` / `include_args=True` but no guard declares a
|
|
77
|
+
second parameter; held back when a guard in that decoration could not be
|
|
78
|
+
resolved, since it may be the consumer), `guard-meta-missing` (warning — a
|
|
79
|
+
two-parameter guard whose decoration supplies no metadata reads an empty
|
|
80
|
+
dict), `guard-meta-annotation` (warning — the metadata parameter is annotated
|
|
81
|
+
as something that cannot hold a `dict[str, Any]`) and `meta-key-collision`
|
|
82
|
+
(warning — a `meta=` key shadows a parameter name under `include_args=True`,
|
|
83
|
+
so that argument never reaches the guard).
|
|
84
|
+
|
|
85
|
+
### Changed
|
|
86
|
+
|
|
87
|
+
- **`guard-arity` accepts one or two required parameters.** A guard taking
|
|
88
|
+
`(user, meta)` used to be rejected at import (`expected 1 (user)`); the
|
|
89
|
+
contract is now one *or* two, and the message reads
|
|
90
|
+
`expected 1 (user) or 2 (user, meta)`. Three or more is still an error. No
|
|
91
|
+
existing single-parameter guard changes behavior.
|
|
92
|
+
|
|
8
93
|
## [0.167.2] — 2026-07-26
|
|
9
94
|
|
|
10
95
|
Documentation layout only — no code change, no API change.
|
|
@@ -92,7 +92,15 @@ The SDK currently covers (Sep 2025+, post-v0.31.x):
|
|
|
92
92
|
`guard-unresolved` (ambiguous or out-of-scope guard reported, never guessed).
|
|
93
93
|
`openapi-errors` follows the guards, so their exceptions land in
|
|
94
94
|
`error_responses(...)`. `declared_guards`/`guarded_user_param` introspect a
|
|
95
|
-
route.
|
|
95
|
+
route. **Metadata (v0.168.0):** a guard may declare a 2nd param
|
|
96
|
+
`meta: dict[str, Any]` — `meta={...}` literals fixed at decoration plus
|
|
97
|
+
`include_args=True` merging the call's args (user excluded, omitted params
|
|
98
|
+
contribute defaults, `Depends(...)` markers dropped, `meta=` wins a name
|
|
99
|
+
clash); one-param guards untouched; `TempestPermissionError` when `meta=`
|
|
100
|
+
isn't a mapping or nothing consumes it; `guard_metadata(fn)` reads the
|
|
101
|
+
literals; new static codes `meta-unused` (error), `guard-meta-missing`/
|
|
102
|
+
`guard-meta-annotation`/`meta-key-collision` (warnings). Recipe:
|
|
103
|
+
`docs/recipes/permission-guards.md`.
|
|
96
104
|
- **DB** — `AsyncDatabaseManager`, `BaseRepository[T]` with
|
|
97
105
|
bulk ops (`bulk_create_values`, `bulk_upsert`, `bulk_update`,
|
|
98
106
|
`add_all`, etc.), `AlembicHelper`, `BaseModel`, audit /
|
|
@@ -483,6 +491,18 @@ business need, not from a stale list. Keep this honest, not aspirational.
|
|
|
483
491
|
the same PR — this drifts easily (it happened for both the admin
|
|
484
492
|
tiers and the genai roadmap). Add `# docs-guard: skip` to a doc block
|
|
485
493
|
only for an intentionally non-parseable fragment.
|
|
494
|
+
- **Navegação e índices em ordem alfabética.** A seção `Receitas` do
|
|
495
|
+
`nav` (e a subseção `Exemplos completos`), as tabelas da landing de
|
|
496
|
+
receitas, os grupos temáticos de `docs/reference.md`, a tabela de
|
|
497
|
+
módulos do README e a de extras da instalação são ordenadas
|
|
498
|
+
alfabeticamente (case/acento-insensível; `[all]` fica por último por
|
|
499
|
+
ser catch-all). O `mkdocs-static-i18n` **não** reordena nav por
|
|
500
|
+
idioma, então o locale `en` declara um `nav` próprio já ordenado em
|
|
501
|
+
inglês — mexer em um nav exige mexer no outro.
|
|
502
|
+
`tests/test_nav_ordering.py` falha se algo sair de ordem, se um nav
|
|
503
|
+
ganhar página que o outro não tem, ou se uma página aparecer duas
|
|
504
|
+
vezes. Abas de topo e páginas de `learning/` seguem ordem didática,
|
|
505
|
+
não alfabética — de propósito.
|
|
486
506
|
- **No emojis in code or docs** unless the user explicitly asks.
|
|
487
507
|
- **Bilingual docs.** Every page lives twice: `docs/<page>.md`
|
|
488
508
|
(PT-BR, default) and `docs/<page>.en.md` (EN-US). The MkDocs
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tempest-fastapi-sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.168.1
|
|
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
|
|
@@ -295,37 +295,37 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
|
|
|
295
295
|
|
|
296
296
|
| Module | Exports |
|
|
297
297
|
| --- | --- |
|
|
298
|
-
| `tempest_fastapi_sdk.
|
|
299
|
-
| `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
|
|
300
|
-
| `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
|
|
301
|
-
| `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
|
|
302
|
-
| `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
|
|
298
|
+
| `tempest_fastapi_sdk.admin` *(extra: `[admin]`)* | `AdminSite`, `AdminModel` (incl. `audit_model=...` for a per-row audit-history timeline, `autocomplete_fields=[...]` for HTMX-searched FK inputs, `inlines=[Inline(...)]` for 1-N children on the detail view, `Inline(editable=True, can_delete=True)` for in-place formset editing of those children), `Inline`, dashboard business-metric cards (`AdminSite(dashboard_cards=[...])`: `MetricCard` + `MetricValue` / `MetricTrend` / `MetricPartition`), CSV import (`AdminModel(can_import=True)`), granular RBAC (`make_admin_router(access_policy=...)` + `AdminPermission`), lenses (`AdminModel(lenses=[Lens(...)])` saved list presets), JSON + time field widgets, `make_admin_router`, `AdminAuthBackend`, `UserModelAuthBackend`, `AdminAuthError` |
|
|
303
299
|
| `tempest_fastapi_sdk.api` | `register_exception_handlers`, `app_exception_handler`, OpenAPI error docs (`error_responses`, `raises`, `TempestAPIRouter`, `RaisesSpec`, `declared_raises`), `apply_cors`, `make_health_router`, `make_logs_router`, `make_prometheus_router`, `make_prometheus_registry`, `PrometheusMiddleware`, `BusinessMetrics`, `LogSource`, `make_tool_spec_router`, `make_token_dependency`, `make_bearer_token_dependency`, `make_jwt_user_dependency`, `make_role_dependency`, `make_permission_dependency`, `require_x_token`, `run_server`, `RequestIDMiddleware`, `RateLimitMiddleware` (+ `RateLimitStore`/`MemoryRateLimitStore`/`RedisRateLimitStore`/`RateLimitResult` and `key_by_ip`/`key_by_jwt_subject`/`key_by_jwt_claim`/`key_by_header`), `IdempotencyMiddleware`, `MemoryIdempotencyStore`, `RedisIdempotencyStore`, `BodySizeLimitMiddleware`, `CSRFMiddleware`, `make_csrf_token_dependency`, `GracefulShutdownMiddleware`, `WebhookSignatureVerifier`, `RSAWebhookSignatureVerifier`, outbound `WebhookSender` (+ `WebhookDelivery`), OAuth2 (`GoogleOAuthClient`, `GitHubOAuthClient`, `OIDCProvider`), `HardenedStaticFiles`, `DEFAULT_STATIC_SECURITY_HEADERS`, `make_spa_router` (serve a compiled React/Vite SPA with a client-side fallback), `set_cookie`, `clear_cookie`, `SameSite`, `HealthCheck`, `setup_tracing` *(extra: `[otel]`)* |
|
|
304
300
|
| `tempest_fastapi_sdk.auth` *(extra: `[auth]`, opcional `[email]`, `[mfa]`)* | `UserAuthService`, `make_auth_router`, `SignupSchema` / `LoginSchema` / `RefreshSchema` / `PasswordResetRequestSchema` / `PasswordResetConfirmSchema` + responses, `ActivationToken`, `PasswordResetToken`, email change/verify/recovery (`EmailChangeRequestSchema` / `EmailChangeConfirmSchema` / `EmailRecoveryRequestSchema` / `EmailChangeToken` / `EmailVerificationToken`, old-email security notice, opt-in `AUTH_EMAIL_RECOVERY_ENABLED`), MFA schemas (`MFAEnrollResponseSchema` / `MFAConfirmSchema` / `MFAVerifySchema` / `MFADisableSchema`), opt-in DB-backed refresh tokens (`BaseUserRefreshTokenModel` / `make_user_refresh_token_model` / `LogoutSchema`) with rotation + reuse detection + `POST /auth/logout`, bilingual emails + backend pages (`AUTH_DEFAULT_LOCALE`, `normalize_locale` / `negotiate_locale`) — signup/activate/login/refresh/logout/reset + email change/recovery + TOTP 2FA out of the box |
|
|
305
|
-
| `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param`, `TempestPermissionError`, `GuardContractWarning` |
|
|
301
|
+
| `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, optional `meta: dict[str, Any]` second parameter via `meta=` / `include_args=`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param` / `guard_metadata`, `TempestPermissionError`, `GuardContractWarning` |
|
|
302
|
+
| `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
|
|
303
|
+
| `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
|
|
306
304
|
| `tempest_fastapi_sdk.checks` | System checks (Django-style config validation): `check` (register decorator), `run_checks` / `run_system_checks` (raises `SystemCheckError` on ERROR+), `CheckMessage` / `CheckLevel` + `debug`/`info`/`warning`/`error`/`critical`, `CheckRegistry` / `default_registry`; built-in settings checks + the `tempest check-config` CLI (auto-detects settings, `--tag` / `--fail-level`) |
|
|
305
|
+
| `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `check-config` (validate settings via the system-check framework), `version` / `--version`; plus project-registered management commands (`tempest <cmd>` from `src/commands.py` or `[tool.tempest] commands`) |
|
|
307
306
|
| `tempest_fastapi_sdk.controllers` | `BaseController` |
|
|
308
|
-
| `tempest_fastapi_sdk.services` | `BaseService` |
|
|
309
307
|
| `tempest_fastapi_sdk.core` | `configure_logging`, `JSONFormatter`, `get_request_id`/`set_request_id`/`clear_request_id`, `request_id_ctx`, `BaseStrEnum`, `BaseIntEnum`, `Locale` (BCP-47 locale enum), `strict_types`/`typed`/`require_annotations` |
|
|
310
|
-
| `tempest_fastapi_sdk.
|
|
311
|
-
| `tempest_fastapi_sdk.
|
|
312
|
-
| `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
|
|
308
|
+
| `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
|
|
309
|
+
| `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
|
|
313
310
|
| `tempest_fastapi_sdk.flags` | `FeatureFlags`, `FeatureFlagBackend`, `MemoryFeatureFlagBackend`, `EnvFeatureFlagBackend`, `RedisFeatureFlagBackend`, `CompositeFeatureFlagBackend`, `make_flag_dependency`, `coerce_flag` |
|
|
314
|
-
| `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
|
|
315
|
-
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
|
|
316
|
-
| `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
|
|
317
|
-
| `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
|
|
318
|
-
| `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
|
|
319
|
-
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
|
|
320
|
-
| `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
|
|
321
311
|
| `tempest_fastapi_sdk.genai` *(extra: `[genai]`; capacity check imports without it)* | Self-hosted GenAI: capacity check (`probe_hardware`/`HardwareInfo`, `can_run`/`recommend`/`CapacityReport`, `estimate_model_bytes`/`fetch_num_params`, `ModelDtype`); local LLM `TextGenerator` (`generate`/`chat`/`stream`, typed `GenerationConfig`, int4/int8 quant, lazy load + idle unload); `Embedder` (+ `EmbeddingCache`/`InMemoryEmbeddingCache`/`RedisEmbeddingCache`/`AsyncEmbeddingCache`, `normalize=`) + `cosine_similarity`, `BatchScheduler` (coalesce concurrent calls), `ModelRegistry` (LRU model sharing); `make_genai_router` (opt-in endpoints — `/generate`+SSE, `/chat`, `/embed`, `/rag`, `/transcribe`, `/tts`); `resolve_device`/`auto_dtype_name`; **tool calling** (`TextGenerator.chat_with_tools` / `OllamaGenerator.chat_with_tools`) + **structured output** (`generate_structured` — Ollama `format=`, transformers `lm-format-enforcer` via `[genai-structured]`; `parse_structured`); **`VisionTextGenerator`** (local VLM, `[genai-vlm]`); **`OnnxEmbedder`** (torch-free embeddings, `[genai-onnx]`); **generation cache** (`InMemoryGenerationCache`/`RedisGenerationCache`, deterministic-only) via `generation_cache=`; **token/context** (`count_tokens`/`count_message_tokens`/`truncate_messages`); **`GenAIMetrics`** (Prometheus request/latency/token metrics, `[prometheus]`); **moderation** (`RuleModerator`/`ClassifierModerator` + `ModerationResult`); Ollama backend (`[genai-ollama]`) — `OllamaGenerator`/`OllamaEmbedder` (HTTP, no torch) behind the `TextBackend` protocol, drop-in for `make_genai_router`/`Retriever`, plus vision (`generate(images=…)`); **`AIChatPipeline`** (memory recall → web-search augment → generate w/ bounded tool-calling loop → TTS → memory index) + `Tool` + `make_ai_chat_router` (`POST /chat` + `/chat/stream` SSE) |
|
|
322
|
-
| `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
|
|
323
|
-
| `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
|
|
324
312
|
| `tempest_fastapi_sdk.genai.rag` *(extra: `[genai-rag]`)* | RAG context for local LLMs: `WebSearch` (`.retrieve` one-shot search→extract→context) / `SearxngBackend` / `WebSearchBackend` + `SearchResult`, `ContentExtractor` (trafilatura, `.extract_many` concurrent), `PdfReader` (PyMuPDF) + `Document`/`Chunk`/`PdfPage`, `chunk_text`, `build_context`; corpus RAG — `Retriever` + `VectorStore`/`InMemoryVectorStore`/`PgVectorStore` (pgvector)/`ChromaVectorStore` (`[genai-chroma]`); **`Reranker`** (cross-encoder second stage) + **`HybridRetriever`** (BM25 + dense, `reciprocal_rank_fusion`, `rank-bm25`); long-term chat memory — `ChatMemory` (recency-aware, per-user, Chroma-backed) + `MemoryHit`; audio (`[genai-audio]`) — `SpeechToText` (faster-whisper, `beam_size`/`vad_filter`/`language_probability`) + `TextToSpeech` (Coqui TTS) + `Transcription` |
|
|
325
313
|
| `tempest_fastapi_sdk.geo` *(extra: `[geo]`; offline layers import without it)* | Geolocation without a paid API: `haversine_km`, `estimate_travel` (offline road distance + per-mode time), offline geometry (`bounding_box`, `within_radius`, `nearest`, `initial_bearing`, `destination_point`, `point_in_polygon`, `polygon_area_km2`, `path_length_km`), DB radius search (`GeoPointMixin` + `GeoRepositoryMixin`/`PostGISRepositoryMixin`, `make_geo_point_model`), routing (`OSRMBackend`/`RoutingBackend` — `route` + `route(with_geometry=True)` + `matrix`, per-mode profiles), geocoding (`NominatimBackend`/`GeocodingBackend`), polyline codec (`encode_polyline`/`decode_polyline`), Brazil (`uf_centroid`/`UF_CENTROIDS`, `cep_to_coordinate`); `Coordinate`/`TravelEstimate`/`TravelMode` (car/motorcycle/bus/bicycle/pedestrian)/`BoundingBox`/`GeocodeResult`/`DistanceMatrix` |
|
|
314
|
+
| `tempest_fastapi_sdk.openapi` | `generate_integration`, `load_spec`, `parse_spec`, `emit_schemas`, `emit_client`, `GenerationResult`, `default_output_dir`, `SpecError`, `SpecIR` / `SchemaIR` / `FieldIR` / `ClientIR` / `OperationIR` / `ParameterIR` — backs `tempest openapi-client`, which generates Pydantic schemas + a typed HTTP client from a third party's OpenAPI spec *(YAML needs the `[openapi]` extra)* |
|
|
315
|
+
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
|
|
316
|
+
| `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
|
|
317
|
+
| `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
|
|
318
|
+
| `tempest_fastapi_sdk.services` | `BaseService` |
|
|
319
|
+
| `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
|
|
320
|
+
| `tempest_fastapi_sdk.sse` | `EventStream` (bounded queue + `overflow` backpressure), `SSEBroker` (multi-worker fan-out via Redis, `.response()` lifecycle helper), `ServerSentEvent`, `sse_response` (`on_disconnect=` cleanup) |
|
|
326
321
|
| `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN); `htmx()` / `aria()` / `data()` (typed builders for the `hx-*` / `aria-*` / `data-*` `attrs` map); `make_web_app_router` (serve a compiled static/wasm `tempestweb build` as a router, SPA history fallback), `build_web_app` (host a server-mode build as a WS/SSE sub-app), `detect_build_mode` |
|
|
322
|
+
| `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
|
|
323
|
+
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
|
|
327
324
|
| `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)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatingField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`, `LocaleField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `PixKeyField` — old names without the suffix kept as deprecated aliases — `PixKeyType`/`detect_pix_key_type`/`is_valid_pix_key`, `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`) |
|
|
328
|
-
| `tempest_fastapi_sdk.
|
|
325
|
+
| `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
|
|
326
|
+
| `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
|
|
327
|
+
| `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
|
|
328
|
+
| `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
|
|
329
329
|
|
|
330
330
|
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`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision`, `tempest_fastapi_sdk.genai` and `tempest_fastapi_sdk.ssr` — plus the domain modules `tempest_fastapi_sdk.chat` and `tempest_fastapi_sdk.reviews` — must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
|
|
331
331
|
|
|
@@ -4169,6 +4169,27 @@ async def delete_order(
|
|
|
4169
4169
|
|
|
4170
4170
|
The user parameter is found by annotation (`user_param=` breaks a tie), and a guard's non-`None` return replaces the user the body sees — which is how `require_active` narrows `UserT | None` to `UserT`.
|
|
4171
4171
|
|
|
4172
|
+
A guard may declare a second parameter to receive a `dict[str, Any]` of metadata, which is what turns one generic guard into a specific check per call site — `meta=` carries literals fixed at decoration, `include_args=True` merges the call's own arguments:
|
|
4173
|
+
|
|
4174
|
+
```python
|
|
4175
|
+
def has_role(user: UserModel, meta: dict[str, Any]) -> UserModel:
|
|
4176
|
+
"""Deny unless the user holds the role the route declared."""
|
|
4177
|
+
if meta["role"] not in user.roles:
|
|
4178
|
+
raise MissingRoleException(role=meta["role"])
|
|
4179
|
+
return user
|
|
4180
|
+
|
|
4181
|
+
|
|
4182
|
+
@requires(has_role, meta={"role": "manager"})
|
|
4183
|
+
async def close_month(user: UserModel = Depends(get_current_user)) -> None: ...
|
|
4184
|
+
|
|
4185
|
+
|
|
4186
|
+
@requires(order_owner, include_args=True) # guard reads meta["order_id"]
|
|
4187
|
+
async def delete_order(
|
|
4188
|
+
order_id: UUID,
|
|
4189
|
+
user: UserModel = Depends(get_current_user),
|
|
4190
|
+
) -> None: ...
|
|
4191
|
+
```
|
|
4192
|
+
|
|
4172
4193
|
Misuse is caught in three places: `TempestPermissionError` at import time (no guard, wrong arity, `async` guard on a sync function, no user parameter), `GuardContractWarning` at call time (a guard raising outside the `AppException` hierarchy, or returning `False` instead of denying), and `tempest permissions --check` in CI, which reads the same contract statically.
|
|
4173
4194
|
|
|
4174
4195
|
```bash
|
|
@@ -149,37 +149,37 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
|
|
|
149
149
|
|
|
150
150
|
| Module | Exports |
|
|
151
151
|
| --- | --- |
|
|
152
|
-
| `tempest_fastapi_sdk.
|
|
153
|
-
| `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
|
|
154
|
-
| `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
|
|
155
|
-
| `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
|
|
156
|
-
| `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
|
|
152
|
+
| `tempest_fastapi_sdk.admin` *(extra: `[admin]`)* | `AdminSite`, `AdminModel` (incl. `audit_model=...` for a per-row audit-history timeline, `autocomplete_fields=[...]` for HTMX-searched FK inputs, `inlines=[Inline(...)]` for 1-N children on the detail view, `Inline(editable=True, can_delete=True)` for in-place formset editing of those children), `Inline`, dashboard business-metric cards (`AdminSite(dashboard_cards=[...])`: `MetricCard` + `MetricValue` / `MetricTrend` / `MetricPartition`), CSV import (`AdminModel(can_import=True)`), granular RBAC (`make_admin_router(access_policy=...)` + `AdminPermission`), lenses (`AdminModel(lenses=[Lens(...)])` saved list presets), JSON + time field widgets, `make_admin_router`, `AdminAuthBackend`, `UserModelAuthBackend`, `AdminAuthError` |
|
|
157
153
|
| `tempest_fastapi_sdk.api` | `register_exception_handlers`, `app_exception_handler`, OpenAPI error docs (`error_responses`, `raises`, `TempestAPIRouter`, `RaisesSpec`, `declared_raises`), `apply_cors`, `make_health_router`, `make_logs_router`, `make_prometheus_router`, `make_prometheus_registry`, `PrometheusMiddleware`, `BusinessMetrics`, `LogSource`, `make_tool_spec_router`, `make_token_dependency`, `make_bearer_token_dependency`, `make_jwt_user_dependency`, `make_role_dependency`, `make_permission_dependency`, `require_x_token`, `run_server`, `RequestIDMiddleware`, `RateLimitMiddleware` (+ `RateLimitStore`/`MemoryRateLimitStore`/`RedisRateLimitStore`/`RateLimitResult` and `key_by_ip`/`key_by_jwt_subject`/`key_by_jwt_claim`/`key_by_header`), `IdempotencyMiddleware`, `MemoryIdempotencyStore`, `RedisIdempotencyStore`, `BodySizeLimitMiddleware`, `CSRFMiddleware`, `make_csrf_token_dependency`, `GracefulShutdownMiddleware`, `WebhookSignatureVerifier`, `RSAWebhookSignatureVerifier`, outbound `WebhookSender` (+ `WebhookDelivery`), OAuth2 (`GoogleOAuthClient`, `GitHubOAuthClient`, `OIDCProvider`), `HardenedStaticFiles`, `DEFAULT_STATIC_SECURITY_HEADERS`, `make_spa_router` (serve a compiled React/Vite SPA with a client-side fallback), `set_cookie`, `clear_cookie`, `SameSite`, `HealthCheck`, `setup_tracing` *(extra: `[otel]`)* |
|
|
158
154
|
| `tempest_fastapi_sdk.auth` *(extra: `[auth]`, opcional `[email]`, `[mfa]`)* | `UserAuthService`, `make_auth_router`, `SignupSchema` / `LoginSchema` / `RefreshSchema` / `PasswordResetRequestSchema` / `PasswordResetConfirmSchema` + responses, `ActivationToken`, `PasswordResetToken`, email change/verify/recovery (`EmailChangeRequestSchema` / `EmailChangeConfirmSchema` / `EmailRecoveryRequestSchema` / `EmailChangeToken` / `EmailVerificationToken`, old-email security notice, opt-in `AUTH_EMAIL_RECOVERY_ENABLED`), MFA schemas (`MFAEnrollResponseSchema` / `MFAConfirmSchema` / `MFAVerifySchema` / `MFADisableSchema`), opt-in DB-backed refresh tokens (`BaseUserRefreshTokenModel` / `make_user_refresh_token_model` / `LogoutSchema`) with rotation + reuse detection + `POST /auth/logout`, bilingual emails + backend pages (`AUTH_DEFAULT_LOCALE`, `normalize_locale` / `negotiate_locale`) — signup/activate/login/refresh/logout/reset + email change/recovery + TOTP 2FA out of the box |
|
|
159
|
-
| `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param`, `TempestPermissionError`, `GuardContractWarning` |
|
|
155
|
+
| `tempest_fastapi_sdk.authz` | Object-level permissions: `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry` (injectable superuser bypass + static-permission fallback, `order.*`/`*` wildcards), `make_permission_checker` (FastAPI route guard), `PermissionMixin` (`await user.has_perm(perm, obj=...)`), `default_registry`, `requires` (guard decorator `(user) -> user | None`, optional `meta: dict[str, Any]` second parameter via `meta=` / `include_args=`, checked at import time + by `tempest permissions`), `declared_guards` / `guarded_user_param` / `guard_metadata`, `TempestPermissionError`, `GuardContractWarning` |
|
|
156
|
+
| `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
|
|
157
|
+
| `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
|
|
160
158
|
| `tempest_fastapi_sdk.checks` | System checks (Django-style config validation): `check` (register decorator), `run_checks` / `run_system_checks` (raises `SystemCheckError` on ERROR+), `CheckMessage` / `CheckLevel` + `debug`/`info`/`warning`/`error`/`critical`, `CheckRegistry` / `default_registry`; built-in settings checks + the `tempest check-config` CLI (auto-detects settings, `--tag` / `--fail-level`) |
|
|
159
|
+
| `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `check-config` (validate settings via the system-check framework), `version` / `--version`; plus project-registered management commands (`tempest <cmd>` from `src/commands.py` or `[tool.tempest] commands`) |
|
|
161
160
|
| `tempest_fastapi_sdk.controllers` | `BaseController` |
|
|
162
|
-
| `tempest_fastapi_sdk.services` | `BaseService` |
|
|
163
161
|
| `tempest_fastapi_sdk.core` | `configure_logging`, `JSONFormatter`, `get_request_id`/`set_request_id`/`clear_request_id`, `request_id_ctx`, `BaseStrEnum`, `BaseIntEnum`, `Locale` (BCP-47 locale enum), `strict_types`/`typed`/`require_annotations` |
|
|
164
|
-
| `tempest_fastapi_sdk.
|
|
165
|
-
| `tempest_fastapi_sdk.
|
|
166
|
-
| `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
|
|
162
|
+
| `tempest_fastapi_sdk.db` | `BaseModel`, `BaseUserModel`, `BaseUserTokenModel`, `BaseUserRecoveryCodeModel`, `make_user_recovery_code_model`, `UserTokenPurpose`, `BaseRepository[ModelType]`, `TenantScopedRepository[ModelType]`, `AsyncDatabaseManager`, `AlembicHelper` (+ `safe_upgrade`), `DestructiveMigrationError`, `NAMING_CONVENTION`, `AuditMixin`, `SoftDeleteMixin`, `MFAMixin`, `LocaleColumnMixin`, `BASE_COLUMN_ORDER`, `reorder_base_columns_first`, `compose_hooks`, `SlowQueryLogger`, `BaseOutboxModel`, `OutboxRelay`, `OutboxStatus`, `BaseRepository.save_with_outbox`, audit trail (`BaseAuditLogModel`, `AuditAction`, `snapshot_model`, `diff_snapshots`, `BaseRepository.add_audited` / `update_audited` / `delete_audited`), eager-loading (`get`/`get_or_none`/`get_by_id`/`first`/`list` accept `with_=[...]`, dotted for nested), lifecycle signals (`RepositorySignal`, `connect` / `on_signal` / `disconnect`, `PRE_SAVE`/`POST_SAVE`/`PRE_DELETE`/`POST_DELETE`), `F` / `Q` expression wrappers (`F("stock") - 1` atomic updates; `Q(...) | Q(...)` OR/NOT via `where=`), `BaseWebPushSubscriptionModel` + `make_web_push_subscription_model` |
|
|
163
|
+
| `tempest_fastapi_sdk.exceptions` | `AppException`, `NotFoundException`, `ConflictException`, `ValidationException`, `UnauthorizedException`, `ForbiddenException`, `InvalidTokenException`, `ExpiredTokenException`, `FileTooLargeException`, `InvalidFileTypeException`, `TooManyRequestsException`, `InheritedErrorCodeWarning`, i18n (`MessageCatalog`, `default_message_catalog`, `parse_accept_language`, `DEFAULT_LOCALE`) |
|
|
167
164
|
| `tempest_fastapi_sdk.flags` | `FeatureFlags`, `FeatureFlagBackend`, `MemoryFeatureFlagBackend`, `EnvFeatureFlagBackend`, `RedisFeatureFlagBackend`, `CompositeFeatureFlagBackend`, `make_flag_dependency`, `coerce_flag` |
|
|
168
|
-
| `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
|
|
169
|
-
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
|
|
170
|
-
| `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
|
|
171
|
-
| `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
|
|
172
|
-
| `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
|
|
173
|
-
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
|
|
174
|
-
| `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
|
|
175
165
|
| `tempest_fastapi_sdk.genai` *(extra: `[genai]`; capacity check imports without it)* | Self-hosted GenAI: capacity check (`probe_hardware`/`HardwareInfo`, `can_run`/`recommend`/`CapacityReport`, `estimate_model_bytes`/`fetch_num_params`, `ModelDtype`); local LLM `TextGenerator` (`generate`/`chat`/`stream`, typed `GenerationConfig`, int4/int8 quant, lazy load + idle unload); `Embedder` (+ `EmbeddingCache`/`InMemoryEmbeddingCache`/`RedisEmbeddingCache`/`AsyncEmbeddingCache`, `normalize=`) + `cosine_similarity`, `BatchScheduler` (coalesce concurrent calls), `ModelRegistry` (LRU model sharing); `make_genai_router` (opt-in endpoints — `/generate`+SSE, `/chat`, `/embed`, `/rag`, `/transcribe`, `/tts`); `resolve_device`/`auto_dtype_name`; **tool calling** (`TextGenerator.chat_with_tools` / `OllamaGenerator.chat_with_tools`) + **structured output** (`generate_structured` — Ollama `format=`, transformers `lm-format-enforcer` via `[genai-structured]`; `parse_structured`); **`VisionTextGenerator`** (local VLM, `[genai-vlm]`); **`OnnxEmbedder`** (torch-free embeddings, `[genai-onnx]`); **generation cache** (`InMemoryGenerationCache`/`RedisGenerationCache`, deterministic-only) via `generation_cache=`; **token/context** (`count_tokens`/`count_message_tokens`/`truncate_messages`); **`GenAIMetrics`** (Prometheus request/latency/token metrics, `[prometheus]`); **moderation** (`RuleModerator`/`ClassifierModerator` + `ModerationResult`); Ollama backend (`[genai-ollama]`) — `OllamaGenerator`/`OllamaEmbedder` (HTTP, no torch) behind the `TextBackend` protocol, drop-in for `make_genai_router`/`Retriever`, plus vision (`generate(images=…)`); **`AIChatPipeline`** (memory recall → web-search augment → generate w/ bounded tool-calling loop → TTS → memory index) + `Tool` + `make_ai_chat_router` (`POST /chat` + `/chat/stream` SSE) |
|
|
176
|
-
| `tempest_fastapi_sdk.chat` | Threaded chat: abstract tables `BaseConversationModel`/`BaseConversationParticipantModel`/`BaseMessageModel` (+ `make_*` factories), `ChatService` (`start_conversation`/`post_message`/`list_messages`/`list_conversations`), `make_chat_router` (opt-in), real-time fan-out via an injected `SSEBroker` |
|
|
177
|
-
| `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
|
|
178
166
|
| `tempest_fastapi_sdk.genai.rag` *(extra: `[genai-rag]`)* | RAG context for local LLMs: `WebSearch` (`.retrieve` one-shot search→extract→context) / `SearxngBackend` / `WebSearchBackend` + `SearchResult`, `ContentExtractor` (trafilatura, `.extract_many` concurrent), `PdfReader` (PyMuPDF) + `Document`/`Chunk`/`PdfPage`, `chunk_text`, `build_context`; corpus RAG — `Retriever` + `VectorStore`/`InMemoryVectorStore`/`PgVectorStore` (pgvector)/`ChromaVectorStore` (`[genai-chroma]`); **`Reranker`** (cross-encoder second stage) + **`HybridRetriever`** (BM25 + dense, `reciprocal_rank_fusion`, `rank-bm25`); long-term chat memory — `ChatMemory` (recency-aware, per-user, Chroma-backed) + `MemoryHit`; audio (`[genai-audio]`) — `SpeechToText` (faster-whisper, `beam_size`/`vad_filter`/`language_probability`) + `TextToSpeech` (Coqui TTS) + `Transcription` |
|
|
179
167
|
| `tempest_fastapi_sdk.geo` *(extra: `[geo]`; offline layers import without it)* | Geolocation without a paid API: `haversine_km`, `estimate_travel` (offline road distance + per-mode time), offline geometry (`bounding_box`, `within_radius`, `nearest`, `initial_bearing`, `destination_point`, `point_in_polygon`, `polygon_area_km2`, `path_length_km`), DB radius search (`GeoPointMixin` + `GeoRepositoryMixin`/`PostGISRepositoryMixin`, `make_geo_point_model`), routing (`OSRMBackend`/`RoutingBackend` — `route` + `route(with_geometry=True)` + `matrix`, per-mode profiles), geocoding (`NominatimBackend`/`GeocodingBackend`), polyline codec (`encode_polyline`/`decode_polyline`), Brazil (`uf_centroid`/`UF_CENTROIDS`, `cep_to_coordinate`); `Coordinate`/`TravelEstimate`/`TravelMode` (car/motorcycle/bus/bicycle/pedestrian)/`BoundingBox`/`GeocodeResult`/`DistanceMatrix` |
|
|
168
|
+
| `tempest_fastapi_sdk.openapi` | `generate_integration`, `load_spec`, `parse_spec`, `emit_schemas`, `emit_client`, `GenerationResult`, `default_output_dir`, `SpecError`, `SpecIR` / `SchemaIR` / `FieldIR` / `ClientIR` / `OperationIR` / `ParameterIR` — backs `tempest openapi-client`, which generates Pydantic schemas + a typed HTTP client from a third party's OpenAPI spec *(YAML needs the `[openapi]` extra)* |
|
|
169
|
+
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); class-based consumers (`Consumer` + `@subscribe` + `MessageBroker.register`); `AsyncQueueManager` (thin lifecycle wrapper, formerly `AsyncBrokerManager`) |
|
|
170
|
+
| `tempest_fastapi_sdk.reviews` | Comments + 0–5 star ratings on any polymorphic target: `BaseCommentModel`/`BaseRatingModel` (+ `make_*`), `ReviewService` (`add_comment`/`list_comments`/`rate` upsert/`get_user_rating`/`aggregate`), `make_reviews_router` (opt-in), `RatingField` |
|
|
171
|
+
| `tempest_fastapi_sdk.schemas` | `BaseSchema`, `BaseResponseSchema`, `ErrorResponseSchema`, `BasePaginationFilterSchema`, `BasePaginationSchema[T]`, `CursorPaginationFilterSchema`, `CursorPaginationSchema`, `LogEntrySchema`, `encode_cursor`, `decode_cursor`, `build_pagination_link_header` |
|
|
172
|
+
| `tempest_fastapi_sdk.services` | `BaseService` |
|
|
173
|
+
| `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
|
|
174
|
+
| `tempest_fastapi_sdk.sse` | `EventStream` (bounded queue + `overflow` backpressure), `SSEBroker` (multi-worker fan-out via Redis, `.response()` lifecycle helper), `ServerSentEvent`, `sse_response` (`on_disconnect=` cleanup) |
|
|
180
175
|
| `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN); `htmx()` / `aria()` / `data()` (typed builders for the `hx-*` / `aria-*` / `data-*` `attrs` map); `make_web_app_router` (serve a compiled static/wasm `tempestweb build` as a router, SPA history fallback), `build_web_app` (host a server-mode build as a WS/SSE sub-app), `detect_build_mode` |
|
|
176
|
+
| `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient` (+ batch `presigned_get_urls` / `put_objects` / `get_objects_bytes`), `ObjectStat`, `PutObjectItem` — async MinIO/S3 facade |
|
|
177
|
+
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; class-based tasks (`TaskDef` + `@task_method` + `TaskQueue.register`); cron helpers (`Cron` / `CronOffset` / `Weekday` + `daily`/`weekdays`/`every_n_minutes`/… builders); `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
|
|
181
178
|
| `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)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatingField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`, `LocaleField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField`, `PixKeyField` — old names without the suffix kept as deprecated aliases — `PixKeyType`/`detect_pix_key_type`/`is_valid_pix_key`, `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`) |
|
|
182
|
-
| `tempest_fastapi_sdk.
|
|
179
|
+
| `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
|
|
180
|
+
| `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
|
|
181
|
+
| `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas`, `make_vision_router` (opt-in `POST /classify` / `/detect` / `/segment`) |
|
|
182
|
+
| `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
|
|
183
183
|
|
|
184
184
|
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`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision`, `tempest_fastapi_sdk.genai` and `tempest_fastapi_sdk.ssr` — plus the domain modules `tempest_fastapi_sdk.chat` and `tempest_fastapi_sdk.reviews` — must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
|
|
185
185
|
|
|
@@ -4023,6 +4023,27 @@ async def delete_order(
|
|
|
4023
4023
|
|
|
4024
4024
|
The user parameter is found by annotation (`user_param=` breaks a tie), and a guard's non-`None` return replaces the user the body sees — which is how `require_active` narrows `UserT | None` to `UserT`.
|
|
4025
4025
|
|
|
4026
|
+
A guard may declare a second parameter to receive a `dict[str, Any]` of metadata, which is what turns one generic guard into a specific check per call site — `meta=` carries literals fixed at decoration, `include_args=True` merges the call's own arguments:
|
|
4027
|
+
|
|
4028
|
+
```python
|
|
4029
|
+
def has_role(user: UserModel, meta: dict[str, Any]) -> UserModel:
|
|
4030
|
+
"""Deny unless the user holds the role the route declared."""
|
|
4031
|
+
if meta["role"] not in user.roles:
|
|
4032
|
+
raise MissingRoleException(role=meta["role"])
|
|
4033
|
+
return user
|
|
4034
|
+
|
|
4035
|
+
|
|
4036
|
+
@requires(has_role, meta={"role": "manager"})
|
|
4037
|
+
async def close_month(user: UserModel = Depends(get_current_user)) -> None: ...
|
|
4038
|
+
|
|
4039
|
+
|
|
4040
|
+
@requires(order_owner, include_args=True) # guard reads meta["order_id"]
|
|
4041
|
+
async def delete_order(
|
|
4042
|
+
order_id: UUID,
|
|
4043
|
+
user: UserModel = Depends(get_current_user),
|
|
4044
|
+
) -> None: ...
|
|
4045
|
+
```
|
|
4046
|
+
|
|
4026
4047
|
Misuse is caught in three places: `TempestPermissionError` at import time (no guard, wrong arity, `async` guard on a sync function, no user parameter), `GuardContractWarning` at call time (a guard raising outside the `AppException` hierarchy, or returning `False` instead of denying), and `tempest permissions --check` in CI, which reads the same contract statically.
|
|
4027
4048
|
|
|
4028
4049
|
```bash
|
|
@@ -279,59 +279,59 @@ come back here to plug in each capability as you need it.
|
|
|
279
279
|
|
|
280
280
|
| Theme | Covers |
|
|
281
281
|
| --- | --- |
|
|
282
|
-
| **[
|
|
283
|
-
| **[Multi-tenant »](multi-tenant.md)** | `TenantScopedRepository` — `tenant_id` isolation on every query |
|
|
282
|
+
| **[Admin site »](admin.md)** | `AdminSite`, `AdminModel`, `make_admin_router`, `BaseUserModel` |
|
|
284
283
|
| **[Audit trail »](audit-trail.md)** | `BaseAuditLogModel`, `add_audited` / `update_audited` / `delete_audited`, `snapshot_model` / `diff_snapshots` |
|
|
285
|
-
| **[Offline-first sync (delta) »](offline-sync.md)** | `BaseRepository.changes_since`, `SyncFilterSchema`, `SyncPaginationSchema`, cursor deltas + soft-delete |
|
|
286
|
-
| **[HTTP layer »](http.md)** | `apply_cors`, `RequestIDMiddleware`, `RateLimitMiddleware`, `make_health_router`, JWT / role / permission dependencies, webhook signature verifier, pagination Link headers, tool-spec router |
|
|
287
|
-
| **[HTTP client (outbound) »](http-client.md)** | `HTTPClient` — typed httpx with retry/backoff, circuit-breaker, X-Request-ID; `RetryPolicy`, `CircuitOpenError` |
|
|
288
|
-
| **[Idempotency »](idempotency.md)** | `IdempotencyMiddleware`, `MemoryIdempotencyStore` / `IdempotencyStore` (Redis) — safe replay of POST/PUT/PATCH/DELETE |
|
|
289
|
-
| **[Cache »](cache.md)** | `AsyncRedisManager`, `@cached` decorator, `CacheInvalidator` (tag/namespace) |
|
|
290
|
-
| **[Feature flags »](feature-flags.md)** | `FeatureFlags`, env/Redis/composite backends, `make_flag_dependency` |
|
|
291
284
|
| **[Auth flow (signup/reset) »](auth-flow.md)** | `UserAuthService`, `make_auth_router` — signup / activation / login / password reset, token delivery (bearer/cookie/both), `BaseUserModel` |
|
|
292
|
-
| **[
|
|
293
|
-
| **[
|
|
294
|
-
| **[Server-side sessions »](sessions.md)** | `SessionMiddleware`, `SessionAuth`, `make_session_router`, `MemorySessionStore` / `RedisSessionStore` |
|
|
295
|
-
| **[Real-time »](realtime.md)** | Overview — when to choose SSE, WebSocket or Web Push |
|
|
296
|
-
| **[Server-Sent Events (SSE) »](sse.md)** | `EventStream`, `sse_response`, `ServerSentEvent`, `SSEBroker` (per-channel fan-out, Redis bridge) |
|
|
297
|
-
| **[WebSocket router »](websocket.md)** | `WebSocketHub`, `make_websocket_router`, `broadcast` / `send_to`, heartbeat, bearer auth |
|
|
298
|
-
| **[tempestweb frontend + SDK »](tempestweb-frontend.md)** | tempestweb frontend calling the SDK backend: `tempestweb.native.http`, `Idempotency-Key` + `IdempotencyMiddleware`, retry, same origin vs CORS |
|
|
299
|
-
| **[Queue & Tasks »](queue-tasks.md)** | FastStream (`AsyncBrokerManager`), TaskIQ (`AsyncTaskBrokerManager`), `AsyncTaskScheduler`, transactional outbox |
|
|
300
|
-
| **[Transactional outbox »](outbox.md)** | `BaseOutboxModel`, `OutboxRelay`, `save_with_outbox` — reliable events |
|
|
301
|
-
| **[Transactional email »](email.md)** | `EmailUtils` — SMTP, text/HTML body, attachments, Jinja2 templates |
|
|
302
|
-
| **[Web Push »](webpush.md)** | `WebPushDispatcher`, VAPID schemas, broadcast with pruning |
|
|
285
|
+
| **[Brazilian helpers »](br-helpers.md)** | CPF / CNPJ / CEP / phone validation + normalization |
|
|
286
|
+
| **[Cache »](cache.md)** | `AsyncRedisManager`, `@cached` decorator, `CacheInvalidator` (tag/namespace) |
|
|
303
287
|
| **[Chat (conversations + messages) »](chat.md)** | `ChatService`, `make_chat_router`, base tables + real-time fan-out via `SSEBroker` |
|
|
288
|
+
| **[CLI »](cli.md)** | `tempest new` / `db` (+ `seed`) / `user` / `secrets rotate` / `lint` / `fix` / `format` / `type` / `test` / `check` |
|
|
304
289
|
| **[Comments + ratings »](reviews.md)** | `ReviewService`, `make_reviews_router`, 0–5 star scores with aggregation, threaded comments |
|
|
305
290
|
| **[Computer vision (ONNX) »](vision.md)** | `Detector` / `Classifier` / `Segmenter` + prediction schemas |
|
|
291
|
+
| **[Database »](database.md)** | `BaseModel`, `AsyncDatabaseManager`, `BaseRepository` (CRUD + filters + bulk), offset/cursor pagination, mixins, `AlembicHelper`, `SlowQueryLogger` |
|
|
292
|
+
| **[Downloads »](downloads.md)** | `DownloadUtils` — `file_response`, `stream`, `build_content_disposition`, path-traversal safe |
|
|
293
|
+
| **[Errors in OpenAPI (Swagger) »](openapi-errors.md)** | `error_responses`, `@raises`, `TempestAPIRouter`, `ErrorResponseSchema`, `tempest openapi-errors --fix` |
|
|
294
|
+
| **[Feature flags »](feature-flags.md)** | `FeatureFlags`, env/Redis/composite backends, `make_flag_dependency` |
|
|
295
|
+
| **[File store (unified) »](file-store.md)** | `FileStoreUtils` — upload + download + presign over a single backend |
|
|
296
|
+
| **[Geolocation (distance + travel time) »](geo.md)** | `haversine_km`, `estimate_travel`, `OSRMBackend`, `NominatimBackend`, `GeoPointMixin` / `GeoRepositoryMixin` |
|
|
297
|
+
| **[HTTP client (outbound) »](http-client.md)** | `HTTPClient` — typed httpx with retry/backoff, circuit-breaker, X-Request-ID; `RetryPolicy`, `CircuitOpenError` |
|
|
298
|
+
| **[HTTP layer »](http.md)** | `apply_cors`, `RequestIDMiddleware`, `RateLimitMiddleware`, `make_health_router`, JWT / role / permission dependencies, webhook signature verifier, pagination Link headers, tool-spec router |
|
|
299
|
+
| **[Idempotency »](idempotency.md)** | `IdempotencyMiddleware`, `MemoryIdempotencyStore` / `IdempotencyStore` (Redis) — safe replay of POST/PUT/PATCH/DELETE |
|
|
300
|
+
| **[Integration client (OpenAPI) »](openapi-client.md)** | `tempest openapi-client` — Pydantic schemas + a typed client from a third party's spec |
|
|
301
|
+
| **[Introspection auth (resource server) »](introspection-auth.md)** | `IntrospectionAuth` — validate an opaque bearer by asking the upstream identity provider |
|
|
306
302
|
| **[Logging »](logging.md)** | `LogUtils`, structured JSON logging, request-ID propagation |
|
|
303
|
+
| **[Management commands (tempest <cmd>) »](management-commands.md)** | register your own commands on the project's `tempest` CLI |
|
|
307
304
|
| **[Metrics »](metrics.md)** | `MetricsUtils` — CPU / RAM / disk / GPU snapshots |
|
|
305
|
+
| **[MFA (TOTP / 2FA) »](mfa.md)** | `MFAMixin`, `TOTPHelper`, enroll/confirm/verify/disable endpoints on `make_auth_router`, recovery codes |
|
|
306
|
+
| **[Multi-tenant »](multi-tenant.md)** | `TenantScopedRepository` — `tenant_id` isolation on every query |
|
|
307
|
+
| **[Object-level permissions »](authz.md)** | `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry`, `make_permission_checker`, `PermissionMixin` |
|
|
308
308
|
| **[Observability (tracing) »](observability.md)** | `setup_tracing` (OpenTelemetry), `SlowQueryLogger` |
|
|
309
|
-
| **[
|
|
310
|
-
| **[
|
|
311
|
-
| **[
|
|
309
|
+
| **[Offline-first sync (delta) »](offline-sync.md)** | `BaseRepository.changes_since`, `SyncFilterSchema`, `SyncPaginationSchema`, cursor deltas + soft-delete |
|
|
310
|
+
| **[Permission guards (@requires) »](permission-guards.md)** | `@requires` plus `(user) -> user` guards (with an optional `meta: dict[str, Any]` via `meta=` / `include_args=`), `TempestPermissionError`, `GuardContractWarning`, `tempest permissions --check` |
|
|
311
|
+
| **[Queue & Tasks »](queue-tasks.md)** | FastStream (`AsyncBrokerManager`), TaskIQ (`AsyncTaskBrokerManager`), `AsyncTaskScheduler`, transactional outbox |
|
|
312
|
+
| **[React SPA on FastAPI »](react-spa.md)** | `make_spa_router` — serve the Vite build from the same process, with history fallback |
|
|
313
|
+
| **[Real-time »](realtime.md)** | Overview — when to choose SSE, WebSocket or Web Push |
|
|
314
|
+
| **[Refresh tokens (rotation/revocation) »](refresh-tokens.md)** | `BaseUserRefreshTokenModel`, `make_user_refresh_token_model`, `issue_token_pair`, rotation + family reuse detection |
|
|
315
|
+
| **[Safe deploys »](deploy-safety.md)** | `AlembicHelper.safe_upgrade` (blocks DROPs), `GracefulShutdownMiddleware` |
|
|
316
|
+
| **[Security »](security.md)** | `AttemptThrottle`, opaque-token helpers, `HardenedStaticFiles`, security headers |
|
|
317
|
+
| **[Self-hosted generative AI »](genai.md)** | `probe_hardware` / `can_run`, `TextGenerator`, `Embedder`, RAG (web + PDF), audio (STT/TTS), `make_genai_router` |
|
|
318
|
+
| **[Server-Sent Events (SSE) »](sse.md)** | `EventStream`, `sse_response`, `ServerSentEvent`, `SSEBroker` (per-channel fan-out, Redis bridge) |
|
|
319
|
+
| **[Server-side sessions »](sessions.md)** | `SessionMiddleware`, `SessionAuth`, `make_session_router`, `MemorySessionStore` / `RedisSessionStore` |
|
|
320
|
+
| **[SSR (typed pages) »](../ssr.md)** | `Page`, `html_response`, `make_htmx_router`, hosting a `tempestweb` build |
|
|
312
321
|
| **[Storage (MinIO/S3) »](storage.md)** | `AsyncMinIOClient`, `MinIOUploadStorage`, `presigned_get_url` / `presigned_put_url`, `list_objects` |
|
|
313
322
|
| **[Stored file (service mixin) »](stored-files.md)** | `StoredFileServiceMixin` — `set_file` / `replace` / `clear_file` over `UploadUtils` |
|
|
314
|
-
| **[
|
|
323
|
+
| **[System checks (check-config) »](system-checks.md)** | `run_system_checks`, `@check`, `CheckMessage`, `tempest check-config` — validate settings before serving |
|
|
324
|
+
| **[tempestweb frontend + SDK »](tempestweb-frontend.md)** | tempestweb frontend calling the SDK backend: `tempestweb.native.http`, `Idempotency-Key` + `IdempotencyMiddleware`, retry, same origin vs CORS |
|
|
325
|
+
| **[Testing »](testing.md)** | `test_session`, `test_database`, in-memory SQLite, pytest fixtures |
|
|
326
|
+
| **[Transactional email »](email.md)** | `EmailUtils` — SMTP, text/HTML body, attachments, Jinja2 templates |
|
|
327
|
+
| **[Transactional outbox »](outbox.md)** | `BaseOutboxModel`, `OutboxRelay`, `save_with_outbox` — reliable events |
|
|
315
328
|
| **[Typing (static + runtime) »](typing.md)** | `strict_types` / `typed` / `require_annotations`, `[tool.tempest] typing_strictness` knob, ruff `ANN` |
|
|
329
|
+
| **[Uploads (backends) »](uploads.md)** | `UploadUtils`, extension/MIME validation (`sniff_mime`), local / MinIO backends |
|
|
330
|
+
| **[Utilities »](utilities.md)** | `utcnow`/`to_utc`, `modify_dict`, `get_client_ip`, opaque tokens (`generate_opaque_token`) |
|
|
316
331
|
| **[Validated fields (ready-made types) »](fields.md)** | Annotated Pydantic types — `PositiveIntField` / `CentsField` / `PriceField` / `SlugField` / `HexColorField` / `CPFField` / `UFField` |
|
|
317
|
-
| **[Testing »](testing.md)** | `test_session`, `test_database`, in-memory SQLite, pytest fixtures |
|
|
318
|
-
| **[Safe deploys »](deploy-safety.md)** | `AlembicHelper.safe_upgrade` (blocks DROPs), `GracefulShutdownMiddleware` |
|
|
319
|
-
| **[CLI »](cli.md)** | `tempest new` / `db` (+ `seed`) / `user` / `secrets rotate` / `lint` / `fix` / `format` / `type` / `test` / `check` |
|
|
320
|
-
| **[Security »](security.md)** | `AttemptThrottle`, opaque-token helpers, `HardenedStaticFiles`, security headers |
|
|
321
|
-
| **[Brazilian helpers »](br-helpers.md)** | CPF / CNPJ / CEP / phone validation + normalization |
|
|
322
|
-
| **[Object-level permissions »](authz.md)** | `permission` (rule decorator), `has_perm` / `check_permission`, `PermissionRegistry`, `make_permission_checker`, `PermissionMixin` |
|
|
323
|
-
| **[Permission guards (@requires) »](permission-guards.md)** | `@requires` plus `(user) -> user` guards, `TempestPermissionError`, `GuardContractWarning`, `tempest permissions --check` |
|
|
324
|
-
| **[Introspection auth (resource server) »](introspection-auth.md)** | `IntrospectionAuth` — validate an opaque bearer by asking the upstream identity provider |
|
|
325
|
-
| **[Geolocation (distance + travel time) »](geo.md)** | `haversine_km`, `estimate_travel`, `OSRMBackend`, `NominatimBackend`, `GeoPointMixin` / `GeoRepositoryMixin` |
|
|
326
|
-
| **[Self-hosted generative AI »](genai.md)** | `probe_hardware` / `can_run`, `TextGenerator`, `Embedder`, RAG (web + PDF), audio (STT/TTS), `make_genai_router` |
|
|
327
|
-
| **[File store (unified) »](file-store.md)** | `FileStoreUtils` — upload + download + presign over a single backend |
|
|
328
332
|
| **[Versioned artifacts (models) »](artifact-registry.md)** | `ArtifactRegistry`, `ArtifactVersionMixin`, `build_manifest_entries`, `file_digest` — swap the active version without a redeploy |
|
|
329
|
-
| **[
|
|
330
|
-
| **[
|
|
331
|
-
| **[System checks (check-config) »](system-checks.md)** | `run_system_checks`, `@check`, `CheckMessage`, `tempest check-config` — validate settings before serving |
|
|
332
|
-
| **[Management commands (tempest <cmd>) »](management-commands.md)** | register your own commands on the project's `tempest` CLI |
|
|
333
|
-
| **[SSR (typed pages) »](../ssr.md)** | `Page`, `html_response`, `make_htmx_router`, hosting a `tempestweb` build |
|
|
334
|
-
| **[React SPA on FastAPI »](react-spa.md)** | `make_spa_router` — serve the Vite build from the same process, with history fallback |
|
|
333
|
+
| **[Web Push »](webpush.md)** | `WebPushDispatcher`, VAPID schemas, broadcast with pruning |
|
|
334
|
+
| **[WebSocket router »](websocket.md)** | `WebSocketHub`, `make_websocket_router`, `broadcast` / `send_to`, heartbeat, bearer auth |
|
|
335
335
|
|
|
336
336
|
## Complete examples
|
|
337
337
|
|
|
@@ -339,11 +339,11 @@ The recipes show one piece at a time. These pages combine **several** into a flo
|
|
|
339
339
|
|
|
340
340
|
| Example | What it combines |
|
|
341
341
|
| --- | --- |
|
|
342
|
-
| **[Pix checkout »](../integrated.md)** | JWT auth + validated fields (`PixKeyField`) + cache + transactional outbox + `MessageBroker` + `TaskQueue` + SSE + Web Push |
|
|
343
|
-
| **[Neighborhood marketplace »](../marketplace-local.md)** | geo (nearby sellers, distance/time) + real-time chat + live notifications + star ratings |
|
|
344
342
|
| **[Full store admin »](../admin-showcase.md)** | audit history + FK autocomplete + inlines + business cards + CSV import + granular RBAC + lenses |
|
|
345
343
|
| **[Fullstack web (SSR, WASM, server) »](../fullstack-web.md)** | the three ways to talk to `tempestweb`: SSR + HTMX, WASM SPA and server-mode |
|
|
346
344
|
| **[GenAI flows »](../genai-examples.md)** | hardware capacity → local LLM → embeddings/RAG → audio, self-hosted end to end |
|
|
345
|
+
| **[Neighborhood marketplace »](../marketplace-local.md)** | geo (nearby sellers, distance/time) + real-time chat + live notifications + star ratings |
|
|
346
|
+
| **[Pix checkout »](../integrated.md)** | JWT auth + validated fields (`PixKeyField`) + cache + transactional outbox + `MessageBroker` + `TaskQueue` + SSE + Web Push |
|
|
347
347
|
|
|
348
348
|
## Anatomy of a recipe
|
|
349
349
|
|