tempest-fastapi-sdk 0.167.2__tar.gz → 0.168.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/CHANGELOG.md +48 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/CLAUDE.md +9 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/PKG-INFO +23 -2
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/README.md +22 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/index.en.md +1 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/index.md +1 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/permission-guards.en.md +118 -3
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/permission-guards.md +116 -2
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/reference.md +1 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/roadmap.en.md +11 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/roadmap.md +11 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/pyproject.toml +1 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/__init__.py +3 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/authz/__init__.py +2 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/authz/requires.py +187 -22
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/permissions.py +187 -11
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/authz/test_requires.py +262 -4
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_permissions.py +112 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/uv.lock +1 -1
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/ISSUE_TEMPLATE/docs.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/workflows/ci.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/workflows/docs.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/workflows/nightly-model.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.github/workflows/release-pypi.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.gitignore +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/.python-version +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/Makefile +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/admin-showcase.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/admin-showcase.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/architecture.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/architecture.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/changelog.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/changelog.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/contributing.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/contributing.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/fullstack-web.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/fullstack-web.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/genai-examples.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/genai-examples.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/index.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/index.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/installation.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/installation.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/integrated.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/integrated.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/index.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/index.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/api.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/api.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/business-rules.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/business-rules.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/domain.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/domain.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/flows.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/flows.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/index.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/learning/marketplace/index.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/marketplace-local.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/marketplace-local.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/migration.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/migration.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/admin.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/admin.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/artifact-registry.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/artifact-registry.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/audit-trail.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/audit-trail.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/auth-flow.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/auth-flow.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/authz.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/authz.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/br-helpers.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/br-helpers.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/cache.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/cache.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/chat.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/chat.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/cli.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/cli.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/database.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/database.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/deploy-safety.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/deploy-safety.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/downloads.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/downloads.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/email.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/email.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/feature-flags.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/feature-flags.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/fields.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/fields.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/file-store.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/file-store.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/genai.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/genai.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/geo.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/geo.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/http-client.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/http-client.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/http.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/http.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/idempotency.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/idempotency.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/introspection-auth.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/introspection-auth.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/logging.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/logging.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/management-commands.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/management-commands.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/metrics.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/metrics.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/mfa.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/mfa.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/multi-tenant.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/multi-tenant.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/observability.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/observability.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/offline-sync.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/offline-sync.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/openapi-client.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/openapi-client.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/openapi-errors.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/openapi-errors.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/outbox.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/outbox.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/queue-tasks.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/queue-tasks.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/react-spa.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/react-spa.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/realtime.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/realtime.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/refresh-tokens.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/refresh-tokens.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/reviews.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/reviews.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/security.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/security.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/sessions.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/sessions.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/sse.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/sse.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/storage.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/storage.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/stored-files.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/stored-files.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/system-checks.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/system-checks.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/tempestweb-frontend.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/tempestweb-frontend.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/testing.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/testing.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/typing.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/typing.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/uploads.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/uploads.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/utilities.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/utilities.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/vision.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/vision.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/webpush.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/webpush.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/websocket.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/websocket.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/reference.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/ssr.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/ssr.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/tutorial.en.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/tutorial.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/mkdocs.yml +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/mkdocs_hooks/llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/planning/genai/README.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/planning/genai/manual-validation.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/planning/genai/phase-0.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/planning/genai/phase-1.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/planning/genai/phase-2.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/planning/genai/phase-3.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/planning/genai/validation-strategy.md +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/scripts/extract_recipe.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/dashboard.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/discovery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/permissions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/session.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/site.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/autocomplete.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/import.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/admin/theme.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/error_docs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/middlewares/response_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/server.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/spa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/static.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/artifacts/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/artifacts/actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/artifacts/digest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/artifacts/model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/artifacts/registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/introspection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/locale.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/authz/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/authz/permissions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/chat/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/chat/models.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/chat/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/chat/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/chat/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/checks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/checks/builtins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/checks/messages.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/checks/registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/commands.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/main.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/new.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/openapi_errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/openapi_fix.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/cli/user.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/core/context.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/core/enums.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/core/logging.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/core/typed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/audit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/backup.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/connection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/expressions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/repository.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/signals.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/flags/backends.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/flags/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/audio/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/audio/language.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/audio/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/audio/stt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/audio/tts.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/batching.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/embeddings.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/generation_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/hardware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/moderation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/ollama.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/onnx_embed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/pipeline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/chroma.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/chunking.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/context.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/extract.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/fusion.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/hybrid.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/pdf.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/rerank.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/retriever.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/search.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/rag/vectorstore.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/structured.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/tokens.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/genai/vision_text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/br.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/distance.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/enums.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/estimate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/geocoding.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/geometry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/polyline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/routing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/geo/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/emit_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/emit_schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/ir.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/loader.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/naming.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/openapi/parse.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/py.typed +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/queue/broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/queue/consumer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/reviews/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/reviews/models.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/reviews/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/reviews/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/reviews/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/schemas/errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/services/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/settings/base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sse/broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/ssr/assets.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/ssr/attributes.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/ssr/page.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/ssr/response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/ssr/webapp.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/cron.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/dead_letter.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/observability.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/oop.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/queue.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/testing/database.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/testing/factories.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/download.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/email.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/fields.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/file_store.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/locations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/log.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/password.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/vision/mapping.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/vision/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/vision/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/webpush/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/webpush/service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_audit_viewer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_autocomplete_fk.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_csv_import.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_dashboard_cards.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_discovery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_forms.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_inlines.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_lenses.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_logs_nav.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_rbac.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_rich_filters.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_site.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_theme.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_upload_field.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_user_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/admin/test_widgets_json_time.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_body_size.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_business_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_cookies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_cors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_csrf.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_dependencies_auth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_error_docs.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_graceful.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_handlers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_health_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_idempotency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_jwt_dependency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_logs_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_oauth.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_outbound_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_prometheus.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_rate_limit_extras.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_request_id_middleware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_response_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_role_dependency.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_server.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_spa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_static.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/api/test_webhooks_rsa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/artifacts/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/artifacts/support.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/artifacts/test_actions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/artifacts/test_digest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/artifacts/test_registry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_cookie_delivery.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_email_change.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_guards.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_introspection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_locale.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_refresh.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_refresh_db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/auth/test_service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/authz/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/authz/test_dependencies.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/authz/test_permissions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cache/test_decorator.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cache/test_invalidation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cache/test_redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/chat/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/chat/test_chat.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/checks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/checks/test_check_config_cli.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/checks/test_checks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_db_seed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_dockerfile_spa.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_lint_strictness.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_main.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_management_commands.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_openapi_errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_openapi_fix.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_secrets.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/cli/test_user.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/conftest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/controllers/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/controllers/test_generic_bounds.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/core/test_context.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/core/test_enums.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/core/test_logging.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/core/test_typed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_audit.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_backup.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_bulk_ops.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_connection.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_eager_load.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_expressions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_migrations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_model.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_outbox.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_repository.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_safe_upgrade.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_signals.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_slow_query.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/db/test_tenant.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/exceptions/test_exceptions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/exceptions/test_i18n.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/exceptions/test_inherited_code_warning.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/flags/test_flags.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/_eval/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/_eval/corpus.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/audio/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/audio/test_audio.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/audio/test_language.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/conftest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_batching.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_chat_memory.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_embedding_cache_redis.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_embeddings.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_eval_harness.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_genai_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_generation_cache.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_generation_config.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_gpu_validation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_hardware.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_hybrid.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_moderation.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_ollama.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_onnx_embed.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_pipeline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_pipeline_integration.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_rag.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_refinements.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_rerank.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_structured.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_textgen_embed_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_tokens.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_vectorstore.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/genai/test_vision_text.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_br.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_db.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_distance.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_estimate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_geocoding.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_geometry.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_polyline.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_routing.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/geo/test_routing_extra.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/openapi/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/openapi/conftest.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/openapi/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/openapi/test_loader.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/openapi/test_naming.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/openapi/test_parse.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/queue/test_broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/queue/test_consumer.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/queue/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/reviews/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/reviews/test_reviews.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/schemas/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/schemas/test_cursor_pagination.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/schemas/test_errors.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/schemas/test_link_headers.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/schemas/test_pagination.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/schemas/test_response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/services/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/services/test_file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/sessions/test_sessions.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/settings/test_base.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/settings/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/sse/test_broker.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/sse/test_event_stream.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/ssr/test_attributes.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/ssr/test_integration.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/ssr/test_page.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/ssr/test_response.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/ssr/test_webapp.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/storage/test_minio_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/test_cron.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/test_dead_letter.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/test_observability.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/test_oop.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/test_queue.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/tasks/test_scheduler.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/test_docs_api_guard.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/test_llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/test_reference_coverage.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/testing/test_database.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/testing/test_factories.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_client_ip.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_datetime.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_dict.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_download.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_email.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_fields.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_file_store.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_http_client.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_jwt.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_lazy_extras.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_locations.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_log.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_metrics.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_password.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_regex.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_throttle.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/utils/test_upload.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/vision/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/vision/test_vision.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/webpush/test_dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/webpush/test_router.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/webpush/test_schemas.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/webpush/test_service.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tests/websockets/test_hub_and_router.py +0 -0
|
@@ -5,6 +5,54 @@ 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.0] — 2026-07-26
|
|
9
|
+
|
|
10
|
+
Permission guards gain injected metadata: one generic guard, a specific check
|
|
11
|
+
per call site.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **A guard may declare a second parameter `meta: dict[str, Any]`.** That is
|
|
16
|
+
what turns `manager_only` / `auditor_only` / `admin_only` into one
|
|
17
|
+
`has_role(user, meta)` whose call sites declare
|
|
18
|
+
`@requires(has_role, meta={"role": "manager"})`. One-parameter guards are
|
|
19
|
+
untouched — the second argument is passed only to guards that declare it, so
|
|
20
|
+
both shapes mix freely in the same decoration.
|
|
21
|
+
- **`requires(..., meta=...)`** — literal metadata, copied at decoration time,
|
|
22
|
+
so a later mutation of the passed mapping cannot change what the route
|
|
23
|
+
enforces. Must be a `Mapping[str, Any]`; anything else is a
|
|
24
|
+
`TempestPermissionError` at import.
|
|
25
|
+
- **`requires(..., include_args=True)`** — merges the arguments the decorated
|
|
26
|
+
function was called with into the same mapping, so an ownership guard reads
|
|
27
|
+
`meta["order_id"]` without the route handing it over. The user parameter is
|
|
28
|
+
excluded (the guard already receives it), a parameter the caller omitted
|
|
29
|
+
contributes its default so the guard sees the values the body will run with,
|
|
30
|
+
a default that is a framework injection marker (`Depends(...)`) is dropped
|
|
31
|
+
rather than passed as a value, and a `meta=` literal wins a name clash with
|
|
32
|
+
an argument — the decoration is the explicit declaration. The mapping is
|
|
33
|
+
fresh per call and shared by that call's guards, so one guard may write a key
|
|
34
|
+
the next one reads without anything leaking into the next request.
|
|
35
|
+
- **`guard_metadata(fn)`** — reads the `meta=` literals off a decorated
|
|
36
|
+
function, next to `declared_guards` / `guarded_user_param`. Exported from
|
|
37
|
+
`tempest_fastapi_sdk` and `tempest_fastapi_sdk.authz`.
|
|
38
|
+
- **Four static checks in `tempest permissions`:** `meta-unused` (error — the
|
|
39
|
+
decoration passes `meta=` / `include_args=True` but no guard declares a
|
|
40
|
+
second parameter; held back when a guard in that decoration could not be
|
|
41
|
+
resolved, since it may be the consumer), `guard-meta-missing` (warning — a
|
|
42
|
+
two-parameter guard whose decoration supplies no metadata reads an empty
|
|
43
|
+
dict), `guard-meta-annotation` (warning — the metadata parameter is annotated
|
|
44
|
+
as something that cannot hold a `dict[str, Any]`) and `meta-key-collision`
|
|
45
|
+
(warning — a `meta=` key shadows a parameter name under `include_args=True`,
|
|
46
|
+
so that argument never reaches the guard).
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- **`guard-arity` accepts one or two required parameters.** A guard taking
|
|
51
|
+
`(user, meta)` used to be rejected at import (`expected 1 (user)`); the
|
|
52
|
+
contract is now one *or* two, and the message reads
|
|
53
|
+
`expected 1 (user) or 2 (user, meta)`. Three or more is still an error. No
|
|
54
|
+
existing single-parameter guard changes behavior.
|
|
55
|
+
|
|
8
56
|
## [0.167.2] — 2026-07-26
|
|
9
57
|
|
|
10
58
|
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 /
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tempest-fastapi-sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.168.0
|
|
4
4
|
Summary: Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects.
|
|
5
5
|
Project-URL: Homepage, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
|
|
@@ -302,7 +302,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
|
|
|
302
302
|
| `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
|
|
303
303
|
| `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
304
|
| `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` |
|
|
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`, 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` |
|
|
306
306
|
| `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`) |
|
|
307
307
|
| `tempest_fastapi_sdk.controllers` | `BaseController` |
|
|
308
308
|
| `tempest_fastapi_sdk.services` | `BaseService` |
|
|
@@ -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
|
|
@@ -156,7 +156,7 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
|
|
|
156
156
|
| `tempest_fastapi_sdk.settings` | `BaseAppSettings` (+ `AppSettingsMeta`), `ServerSettings`, `LogSettings`, `DatabaseSettings`, `RedisSettings`, `RabbitMQSettings`, `JWTSettings`, `CORSSettings`, `EmailSettings`, `UploadSettings`, `TokenSettings`, `WebPushSettings`, `TaskIQSettings`, `MinIOSettings`, `AuthSettings` |
|
|
157
157
|
| `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
158
|
| `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` |
|
|
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`, 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` |
|
|
160
160
|
| `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`) |
|
|
161
161
|
| `tempest_fastapi_sdk.controllers` | `BaseController` |
|
|
162
162
|
| `tempest_fastapi_sdk.services` | `BaseService` |
|
|
@@ -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
|
|
@@ -320,7 +320,7 @@ come back here to plug in each capability as you need it.
|
|
|
320
320
|
| **[Security »](security.md)** | `AttemptThrottle`, opaque-token helpers, `HardenedStaticFiles`, security headers |
|
|
321
321
|
| **[Brazilian helpers »](br-helpers.md)** | CPF / CNPJ / CEP / phone validation + normalization |
|
|
322
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` |
|
|
323
|
+
| **[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` |
|
|
324
324
|
| **[Introspection auth (resource server) »](introspection-auth.md)** | `IntrospectionAuth` — validate an opaque bearer by asking the upstream identity provider |
|
|
325
325
|
| **[Geolocation (distance + travel time) »](geo.md)** | `haversine_km`, `estimate_travel`, `OSRMBackend`, `NominatimBackend`, `GeoPointMixin` / `GeoRepositoryMixin` |
|
|
326
326
|
| **[Self-hosted generative AI »](genai.md)** | `probe_hardware` / `can_run`, `TextGenerator`, `Embedder`, RAG (web + PDF), audio (STT/TTS), `make_genai_router` |
|
|
@@ -319,7 +319,7 @@ aqui pra plugar cada capacidade conforme precisar.
|
|
|
319
319
|
| **[Segurança »](security.md)** | `AttemptThrottle`, helpers de token opaco, `HardenedStaticFiles`, headers de segurança |
|
|
320
320
|
| **[Helpers brasileiros »](br-helpers.md)** | validação + normalização de CPF / CNPJ / CEP / telefone |
|
|
321
321
|
| **[Permissões object-level »](authz.md)** | `permission` (decorator de regra), `has_perm` / `check_permission`, `PermissionRegistry`, `make_permission_checker`, `PermissionMixin` |
|
|
322
|
-
| **[Guards de permissão (@requires) »](permission-guards.md)** | `@requires` + guards `(user) -> user
|
|
322
|
+
| **[Guards de permissão (@requires) »](permission-guards.md)** | `@requires` + guards `(user) -> user` (com `meta: dict[str, Any]` opcional via `meta=` / `include_args=`), `TempestPermissionError`, `GuardContractWarning`, `tempest permissions --check` |
|
|
323
323
|
| **[Auth por introspecção (resource server) »](introspection-auth.md)** | `IntrospectionAuth` — validar bearer opaco perguntando ao provedor de identidade upstream |
|
|
324
324
|
| **[Geolocalização (distância + tempo) »](geo.md)** | `haversine_km`, `estimate_travel`, `OSRMBackend`, `NominatimBackend`, `GeoPointMixin` / `GeoRepositoryMixin` |
|
|
325
325
|
| **[IA generativa self-hosted »](genai.md)** | `probe_hardware` / `can_run`, `TextGenerator`, `Embedder`, RAG (web + PDF), áudio (STT/TTS), `make_genai_router` |
|
{tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/permission-guards.en.md
RENAMED
|
@@ -162,6 +162,114 @@ async def me(user: UserModel | None = Depends(get_current_user_soft)) -> UserMod
|
|
|
162
162
|
|
|
163
163
|
Returning `None` is allowed and means "I did not touch the user".
|
|
164
164
|
|
|
165
|
+
## Metadata: one generic guard, many call sites
|
|
166
|
+
|
|
167
|
+
A guard may declare a **second parameter** `meta: dict[str, Any]`. That is what turns a generic guard into a specific check per route — instead of writing `manager_only`, `auditor_only`, `admin_only`, you write `has_role` once and each call site says which role it requires.
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from typing import Any
|
|
171
|
+
|
|
172
|
+
from tempest_fastapi_sdk import ForbiddenException, requires
|
|
173
|
+
|
|
174
|
+
from src.db.models import UserModel
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def has_role(user: UserModel, meta: dict[str, Any]) -> UserModel:
|
|
178
|
+
"""Assert the user holds the role the route declared.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
user (UserModel): The authenticated user.
|
|
182
|
+
meta (dict[str, Any]): Metadata injected by ``@requires``.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
UserModel: The same user.
|
|
186
|
+
|
|
187
|
+
Raises:
|
|
188
|
+
MissingRoleException: When the declared role is missing.
|
|
189
|
+
"""
|
|
190
|
+
if meta["role"] not in user.roles:
|
|
191
|
+
raise MissingRoleException(role=meta["role"])
|
|
192
|
+
return user
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
@router.post("/reports/close-month")
|
|
196
|
+
@requires(has_role, meta={"role": "manager"})
|
|
197
|
+
async def close_month(user: UserModel = Depends(get_current_user)) -> None:
|
|
198
|
+
"""Close the accounting month.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
user (UserModel): The authenticated manager.
|
|
202
|
+
"""
|
|
203
|
+
...
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
One-parameter guards behave exactly as before — the second argument only goes to guards that declare it. You can mix both in the same decoration.
|
|
207
|
+
|
|
208
|
+
### `include_args=True`: the guard sees the call's arguments
|
|
209
|
+
|
|
210
|
+
`meta=` carries literals fixed at decoration. When the check depends on the **resource** of the request, turn on `include_args=True` and the call's arguments (path params, body, other dependencies) join the same dict:
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
def order_owner(user: UserModel, meta: dict[str, Any]) -> UserModel:
|
|
214
|
+
"""Assert the user owns the order named by the metadata.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
user (UserModel): The authenticated user.
|
|
218
|
+
meta (dict[str, Any]): Metadata injected by ``@requires``.
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
UserModel: The same user.
|
|
222
|
+
|
|
223
|
+
Raises:
|
|
224
|
+
NotOrderOwnerException: When the user does not own the order.
|
|
225
|
+
"""
|
|
226
|
+
if meta["order_id"] not in user.order_ids:
|
|
227
|
+
raise NotOrderOwnerException()
|
|
228
|
+
return user
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
@router.delete("/orders/{order_id}")
|
|
232
|
+
@requires(require_active, order_owner, include_args=True)
|
|
233
|
+
async def delete_order(
|
|
234
|
+
order_id: UUID,
|
|
235
|
+
user: UserModel = Depends(get_current_user),
|
|
236
|
+
) -> None:
|
|
237
|
+
"""Delete an order the caller owns.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
order_id (UUID): The order to delete.
|
|
241
|
+
user (UserModel): The authenticated, active, owning user.
|
|
242
|
+
"""
|
|
243
|
+
...
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
The guard receives `{"order_id": UUID(...)}` without the route handing anything over.
|
|
247
|
+
|
|
248
|
+
!!! info "Merge rules"
|
|
249
|
+
- The **user is excluded** — the guard already receives it as the first parameter.
|
|
250
|
+
- A parameter the caller left out contributes its **default**, so the guard sees the values the body will run with. A default that is an injection marker (`Depends(...)`) is **dropped**, never handed over as a value.
|
|
251
|
+
- A key declared in `meta=` **wins** over an argument of the same name: the decoration is the explicit declaration, the argument is ambient data. `tempest permissions` reports it (`meta-key-collision`), because that argument never reaches the guard.
|
|
252
|
+
- The dict is **fresh per call** and shared by that call's guards — one guard may write a key the next one reads, and nothing leaks into the next request.
|
|
253
|
+
|
|
254
|
+
### Configuration errors
|
|
255
|
+
|
|
256
|
+
| Situation | What happens |
|
|
257
|
+
| --- | --- |
|
|
258
|
+
| `meta=` is not a mapping | `TempestPermissionError` at import |
|
|
259
|
+
| `meta=` / `include_args=True` with no two-parameter guard | `TempestPermissionError` at import — the configuration would do nothing |
|
|
260
|
+
| a two-parameter guard and a decoration with no `meta=`/`include_args=` | runs with `{}`; `tempest permissions` reports `guard-meta-missing` |
|
|
261
|
+
| a guard with 3+ required parameters | `TempestPermissionError` at import (`expected 1 (user) or 2 (user, meta)`) |
|
|
262
|
+
|
|
263
|
+
To audit what a route declared:
|
|
264
|
+
|
|
265
|
+
```python
|
|
266
|
+
from tempest_fastapi_sdk import guard_metadata
|
|
267
|
+
|
|
268
|
+
assert guard_metadata(close_month) == {"role": "manager"}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
`guard_metadata` returns only the `meta=` literals — whatever `include_args=True` merges exists per call and cannot be read off the function object.
|
|
272
|
+
|
|
165
273
|
## Works at any layer
|
|
166
274
|
|
|
167
275
|
Nothing here depends on FastAPI. The same decorator works on a controller or a
|
|
@@ -208,6 +316,7 @@ start** with:
|
|
|
208
316
|
| `async` guard on a sync function | `is async but ... is not` |
|
|
209
317
|
| no user parameter | `no parameter annotated with a user model` |
|
|
210
318
|
| two user parameters | `several parameters are user models` |
|
|
319
|
+
| `meta=`/`include_args=` with no consumer | `no guard declares a second parameter` |
|
|
211
320
|
|
|
212
321
|
### At call time — `GuardContractWarning`
|
|
213
322
|
|
|
@@ -251,13 +360,17 @@ The codes it reports:
|
|
|
251
360
|
| `no-guards` | error | `@requires()` with no guard: everything passes |
|
|
252
361
|
| `user-param-missing` | error | no parameter is a user model |
|
|
253
362
|
| `user-param-ambiguous` | error | several candidates, no `user_param=` |
|
|
254
|
-
| `guard-arity` | error | the guard
|
|
363
|
+
| `guard-arity` | error | the guard takes neither 1 parameter (user) nor 2 (user, meta) |
|
|
364
|
+
| `meta-unused` | error | `meta=`/`include_args=` with no guard to receive it |
|
|
255
365
|
| `guard-async-in-sync` | error | `async` guard on a sync function |
|
|
256
366
|
| `guard-returns-bool` | error | predicate-style guard: its `False` is ignored |
|
|
257
367
|
| `guard-foreign-exception` | error | raises outside the `AppException` hierarchy |
|
|
258
368
|
| `guard-never-denies` | warning | nothing in the call graph raises |
|
|
259
369
|
| `guard-missing-annotation` | warning | parameter or return unannotated |
|
|
260
370
|
| `guard-return-type` | warning | return is neither the user, `None`, nor their union |
|
|
371
|
+
| `guard-meta-missing` | warning | the guard asks for metadata and the decoration supplies none |
|
|
372
|
+
| `guard-meta-annotation` | warning | the 2nd parameter is annotated as something that cannot hold `dict[str, Any]` |
|
|
373
|
+
| `meta-key-collision` | warning | a `meta=` key shadows a parameter under `include_args=True` |
|
|
261
374
|
| `guard-unresolved` | warning | the guard is a lambda, lives outside the scanned paths, or its name maps to several definitions |
|
|
262
375
|
|
|
263
376
|
!!! note "Reports instead of guessing"
|
|
@@ -308,10 +421,12 @@ obj=order)` and pull the whole registry inside `@requires`.
|
|
|
308
421
|
|
|
309
422
|
## Recap
|
|
310
423
|
|
|
311
|
-
- A **guard** is `(user) -> user | None`
|
|
312
|
-
`AppException`.
|
|
424
|
+
- A **guard** is `(user) -> user | None` — or `(user, meta) -> user | None` —
|
|
425
|
+
that denies by raising an `AppException`.
|
|
313
426
|
- `@requires(g1, g2)` runs the guards in order, below the route decorator.
|
|
314
427
|
- The user parameter comes from the annotation; `user_param=` breaks ties.
|
|
428
|
+
- `meta={...}` parameterizes a generic guard; `include_args=True` hands the
|
|
429
|
+
call's arguments to it.
|
|
315
430
|
- A non-`None` return replaces the user — that is how the type narrows.
|
|
316
431
|
- Works on routers, controllers and services, sync or `async`.
|
|
317
432
|
- Misuse: `TempestPermissionError` at import, `GuardContractWarning` at call
|
{tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/docs/recipes/permission-guards.md
RENAMED
|
@@ -163,6 +163,114 @@ async def me(user: UserModel | None = Depends(get_current_user_soft)) -> UserMod
|
|
|
163
163
|
|
|
164
164
|
Devolver `None` é permitido e significa "não mexi no usuário".
|
|
165
165
|
|
|
166
|
+
## Metadata: um guard genérico, vários call sites
|
|
167
|
+
|
|
168
|
+
Um guard pode declarar um **segundo parâmetro** `meta: dict[str, Any]`. É isso que transforma um guard genérico numa checagem específica por rota — em vez de escrever `manager_only`, `auditor_only`, `admin_only`, você escreve `has_role` uma vez e cada call site diz qual papel exige.
|
|
169
|
+
|
|
170
|
+
```python
|
|
171
|
+
from typing import Any
|
|
172
|
+
|
|
173
|
+
from tempest_fastapi_sdk import ForbiddenException, requires
|
|
174
|
+
|
|
175
|
+
from src.db.models import UserModel
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def has_role(user: UserModel, meta: dict[str, Any]) -> UserModel:
|
|
179
|
+
"""Assert the user holds the role the route declared.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
user (UserModel): The authenticated user.
|
|
183
|
+
meta (dict[str, Any]): Metadata injected by ``@requires``.
|
|
184
|
+
|
|
185
|
+
Returns:
|
|
186
|
+
UserModel: The same user.
|
|
187
|
+
|
|
188
|
+
Raises:
|
|
189
|
+
MissingRoleException: When the declared role is missing.
|
|
190
|
+
"""
|
|
191
|
+
if meta["role"] not in user.roles:
|
|
192
|
+
raise MissingRoleException(role=meta["role"])
|
|
193
|
+
return user
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
@router.post("/reports/close-month")
|
|
197
|
+
@requires(has_role, meta={"role": "manager"})
|
|
198
|
+
async def close_month(user: UserModel = Depends(get_current_user)) -> None:
|
|
199
|
+
"""Close the accounting month.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
user (UserModel): The authenticated manager.
|
|
203
|
+
"""
|
|
204
|
+
...
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
Guards de **um** parâmetro continuam exatamente como antes — o segundo argumento só vai para quem o declara. Você pode misturar os dois numa mesma decoração.
|
|
208
|
+
|
|
209
|
+
### `include_args=True`: o guard vê os argumentos da chamada
|
|
210
|
+
|
|
211
|
+
`meta=` carrega literais fixados na decoração. Quando a checagem depende do **recurso** da requisição, ligue `include_args=True` e os argumentos da chamada (path params, body, outras dependências) entram no mesmo dicionário:
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
def order_owner(user: UserModel, meta: dict[str, Any]) -> UserModel:
|
|
215
|
+
"""Assert the user owns the order named by the metadata.
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
user (UserModel): The authenticated user.
|
|
219
|
+
meta (dict[str, Any]): Metadata injected by ``@requires``.
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
UserModel: The same user.
|
|
223
|
+
|
|
224
|
+
Raises:
|
|
225
|
+
NotOrderOwnerException: When the user does not own the order.
|
|
226
|
+
"""
|
|
227
|
+
if meta["order_id"] not in user.order_ids:
|
|
228
|
+
raise NotOrderOwnerException()
|
|
229
|
+
return user
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
@router.delete("/orders/{order_id}")
|
|
233
|
+
@requires(require_active, order_owner, include_args=True)
|
|
234
|
+
async def delete_order(
|
|
235
|
+
order_id: UUID,
|
|
236
|
+
user: UserModel = Depends(get_current_user),
|
|
237
|
+
) -> None:
|
|
238
|
+
"""Delete an order the caller owns.
|
|
239
|
+
|
|
240
|
+
Args:
|
|
241
|
+
order_id (UUID): The order to delete.
|
|
242
|
+
user (UserModel): The authenticated, active, owning user.
|
|
243
|
+
"""
|
|
244
|
+
...
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
O guard recebe `{"order_id": UUID(...)}` sem a rota precisar repassar nada.
|
|
248
|
+
|
|
249
|
+
!!! info "Regras da mesclagem"
|
|
250
|
+
- O **usuário sai** do dicionário — o guard já o recebe no primeiro parâmetro.
|
|
251
|
+
- Parâmetro que o chamador omitiu contribui com o **default**, então o guard vê os valores com que o corpo vai rodar. Default que é marcador de injeção (`Depends(...)`) é **descartado**, nunca entregue como valor.
|
|
252
|
+
- Chave declarada em `meta=` **ganha** de um argumento com o mesmo nome: a decoração é a declaração explícita, o argumento é dado ambiente. O `tempest permissions` avisa (`meta-key-collision`) quando isso acontece, porque o argumento nunca chega ao guard.
|
|
253
|
+
- O dicionário é **novo em cada chamada** e compartilhado pelos guards daquela chamada — um guard pode gravar uma chave que o próximo lê, e nada vaza para a próxima requisição.
|
|
254
|
+
|
|
255
|
+
### Erros de configuração
|
|
256
|
+
|
|
257
|
+
| Situação | O que acontece |
|
|
258
|
+
| --- | --- |
|
|
259
|
+
| `meta=` não é um mapping | `TempestPermissionError` no import |
|
|
260
|
+
| `meta=` / `include_args=True` sem nenhum guard de 2 parâmetros | `TempestPermissionError` no import — a configuração não faria nada |
|
|
261
|
+
| guard de 2 parâmetros e decoração sem `meta=`/`include_args=` | roda com `{}`; `tempest permissions` avisa `guard-meta-missing` |
|
|
262
|
+
| guard com 3+ parâmetros obrigatórios | `TempestPermissionError` no import (`expected 1 (user) or 2 (user, meta)`) |
|
|
263
|
+
|
|
264
|
+
Para auditar o que uma rota declarou:
|
|
265
|
+
|
|
266
|
+
```python
|
|
267
|
+
from tempest_fastapi_sdk import guard_metadata
|
|
268
|
+
|
|
269
|
+
assert guard_metadata(close_month) == {"role": "manager"}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
`guard_metadata` devolve só os literais de `meta=` — o que `include_args=True` mescla existe por chamada e não dá para ler do objeto função.
|
|
273
|
+
|
|
166
274
|
## Funciona em qualquer camada
|
|
167
275
|
|
|
168
276
|
Nada aqui depende do FastAPI. O mesmo decorator vale para controller e service,
|
|
@@ -209,6 +317,7 @@ com:
|
|
|
209
317
|
| guard `async` em função sync | `is async but ... is not` |
|
|
210
318
|
| nenhum parâmetro de usuário | `no parameter annotated with a user model` |
|
|
211
319
|
| dois parâmetros de usuário | `several parameters are user models` |
|
|
320
|
+
| `meta=`/`include_args=` sem consumidor | `no guard declares a second parameter` |
|
|
212
321
|
|
|
213
322
|
### Em tempo de chamada — `GuardContractWarning`
|
|
214
323
|
|
|
@@ -251,13 +360,17 @@ Códigos reportados:
|
|
|
251
360
|
| `no-guards` | erro | `@requires()` sem guard: tudo passa |
|
|
252
361
|
| `user-param-missing` | erro | nenhum parâmetro é modelo de usuário |
|
|
253
362
|
| `user-param-ambiguous` | erro | vários candidatos, sem `user_param=` |
|
|
254
|
-
| `guard-arity` | erro | guard não recebe
|
|
363
|
+
| `guard-arity` | erro | guard não recebe 1 parâmetro (user) nem 2 (user, meta) |
|
|
364
|
+
| `meta-unused` | erro | `meta=`/`include_args=` sem nenhum guard que receba |
|
|
255
365
|
| `guard-async-in-sync` | erro | guard `async` em função sync |
|
|
256
366
|
| `guard-returns-bool` | erro | guard-predicado: o `False` é ignorado |
|
|
257
367
|
| `guard-foreign-exception` | erro | levanta fora da hierarquia `AppException` |
|
|
258
368
|
| `guard-never-denies` | warning | nada no grafo de chamadas levanta |
|
|
259
369
|
| `guard-missing-annotation` | warning | parâmetro ou retorno sem anotação |
|
|
260
370
|
| `guard-return-type` | warning | retorno não é o usuário, `None` ou a união |
|
|
371
|
+
| `guard-meta-missing` | warning | guard pede metadata e a decoração não passa nenhuma |
|
|
372
|
+
| `guard-meta-annotation` | warning | 2º parâmetro anotado como algo que não recebe `dict[str, Any]` |
|
|
373
|
+
| `meta-key-collision` | warning | chave de `meta=` encobre um parâmetro sob `include_args=True` |
|
|
261
374
|
| `guard-unresolved` | warning | guard é lambda, está fora do escopo ou o nome bate com várias definições |
|
|
262
375
|
|
|
263
376
|
!!! note "Reporta em vez de adivinhar"
|
|
@@ -308,9 +421,10 @@ obj=order)` e ganhar o registry inteiro dentro do `@requires`.
|
|
|
308
421
|
|
|
309
422
|
## Recap
|
|
310
423
|
|
|
311
|
-
- **Guard** = `(user) -> user | None` que nega levantando `AppException`.
|
|
424
|
+
- **Guard** = `(user) -> user | None` — ou `(user, meta) -> user | None` — que nega levantando `AppException`.
|
|
312
425
|
- `@requires(g1, g2)` roda os guards na ordem, abaixo do decorator de rota.
|
|
313
426
|
- O parâmetro do usuário sai da anotação; `user_param=` desempata.
|
|
427
|
+
- `meta={...}` parametriza um guard genérico; `include_args=True` entrega os argumentos da chamada ao guard.
|
|
314
428
|
- Retorno não-`None` substitui o usuário — é assim que o tipo estreita.
|
|
315
429
|
- Funciona em router, controller e service, sync ou `async`.
|
|
316
430
|
- Erro de uso: `TempestPermissionError` no import, `GuardContractWarning` na
|
|
@@ -235,6 +235,7 @@ Gerada automaticamente a partir das docstrings do SDK via [`mkdocstrings`](https
|
|
|
235
235
|
::: tempest_fastapi_sdk.authz.requires.requires
|
|
236
236
|
::: tempest_fastapi_sdk.authz.requires.Guard
|
|
237
237
|
::: tempest_fastapi_sdk.authz.requires.declared_guards
|
|
238
|
+
::: tempest_fastapi_sdk.authz.requires.guard_metadata
|
|
238
239
|
::: tempest_fastapi_sdk.authz.requires.guarded_user_param
|
|
239
240
|
::: tempest_fastapi_sdk.authz.requires.TempestPermissionError
|
|
240
241
|
::: tempest_fastapi_sdk.authz.requires.GuardContractWarning
|
|
@@ -131,6 +131,17 @@ GraphQL/gRPC (REST by decision).
|
|
|
131
131
|
!!! note "This roadmap is honest, not aspirational"
|
|
132
132
|
Items past the next cuts only land on the changelog when business pressure pulls them. This page is refreshed on every release — if something belongs here and isn't, open an issue.
|
|
133
133
|
|
|
134
|
+
## Shipped in v0.168.0
|
|
135
|
+
|
|
136
|
+
Permission guards with metadata:
|
|
137
|
+
|
|
138
|
+
| Feature | Status | Where |
|
|
139
|
+
|---------|--------|-------|
|
|
140
|
+
| **Second parameter `meta: dict[str, Any]`** | ✅ v0.168 | A guard may declare a second parameter and receive metadata, which turns a generic guard into a route-specific check: write `has_role` once and let each call site declare `meta={"role": "manager"}`. One-parameter guards are untouched — the second argument only goes to guards that declare it. [Reference »](recipes/permission-guards.md) |
|
|
141
|
+
| **`include_args=True`** | ✅ v0.168 | Merges the call's arguments (path params, body, other dependencies) into the same dict, so an ownership guard reads `meta["order_id"]` without the route handing anything over. User excluded, omitted parameters contribute their default, `Depends(...)` markers dropped, `meta=` literals winning over same-named arguments. |
|
|
142
|
+
| **Misuse still caught at import** | ✅ v0.168 | `TempestPermissionError` when `meta=` is not a mapping, when `meta=`/`include_args=` have no guard to receive them, and when a guard asks for 3+ parameters. `guard_metadata(fn)` exposes the declared literals. |
|
|
143
|
+
| **New static checks** | ✅ v0.168 | `tempest permissions` gained `meta-unused` (error), `guard-meta-missing`, `guard-meta-annotation` and `meta-key-collision` (warnings); `guard-arity` now accepts 1 or 2 parameters. The `meta-unused` verdict is held back when a guard in the decoration could not be resolved. |
|
|
144
|
+
|
|
134
145
|
## Shipped in v0.167.0
|
|
135
146
|
|
|
136
147
|
Permission guards — decorator plus a two-layer linter:
|
|
@@ -131,6 +131,17 @@ GraphQL/gRPC (REST por decisão).
|
|
|
131
131
|
!!! note "O roadmap é honesto, não aspiracional"
|
|
132
132
|
Itens fora dos próximos cuts só vão pro changelog quando a pressão de negócio puxar. Esta página é atualizada a cada release — se algo deveria estar aqui e não está, abra uma issue.
|
|
133
133
|
|
|
134
|
+
## Entregue na v0.168.0
|
|
135
|
+
|
|
136
|
+
Guards de permissão com metadata:
|
|
137
|
+
|
|
138
|
+
| Feature | Status | Onde |
|
|
139
|
+
|---------|--------|------|
|
|
140
|
+
| **Segundo parâmetro `meta: dict[str, Any]`** | ✅ v0.168 | Um guard pode declarar um segundo parâmetro e receber metadata, o que transforma um guard genérico em checagem específica por rota: escreve-se `has_role` uma vez e cada call site declara `meta={"role": "manager"}`. Guards de um parâmetro seguem intactos — o segundo argumento só vai para quem o declara. [Referência »](recipes/permission-guards.md) |
|
|
141
|
+
| **`include_args=True`** | ✅ v0.168 | Mescla os argumentos da chamada (path params, body, outras dependências) no mesmo dicionário, então um guard de posse lê `meta["order_id"]` sem a rota repassar nada. Usuário fora, default de parâmetro omitido incluído, marcador `Depends(...)` descartado, literal de `meta=` ganhando de argumento homônimo. |
|
|
142
|
+
| **Erro de uso ainda no import** | ✅ v0.168 | `TempestPermissionError` quando `meta=` não é mapping, quando `meta=`/`include_args=` não têm nenhum guard que receba, e quando o guard pede 3+ parâmetros. `guard_metadata(fn)` expõe os literais declarados. |
|
|
143
|
+
| **Checagem estática nova** | ✅ v0.168 | `tempest permissions` ganhou `meta-unused` (erro), `guard-meta-missing`, `guard-meta-annotation` e `meta-key-collision` (warnings); `guard-arity` passou a aceitar 1 ou 2 parâmetros. O veredito `meta-unused` é retido quando algum guard da decoração não pôde ser resolvido. |
|
|
144
|
+
|
|
134
145
|
## Entregue na v0.167.0
|
|
135
146
|
|
|
136
147
|
Guards de permissão — decorator + linter em duas camadas:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tempest-fastapi-sdk"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.168.0"
|
|
4
4
|
description = "Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -161,6 +161,7 @@ from tempest_fastapi_sdk.authz import (
|
|
|
161
161
|
check_permission,
|
|
162
162
|
declared_guards,
|
|
163
163
|
default_registry,
|
|
164
|
+
guard_metadata,
|
|
164
165
|
guarded_user_param,
|
|
165
166
|
has_perm,
|
|
166
167
|
make_permission_checker,
|
|
@@ -444,7 +445,7 @@ from tempest_fastapi_sdk.websockets import (
|
|
|
444
445
|
make_websocket_router,
|
|
445
446
|
)
|
|
446
447
|
|
|
447
|
-
__version__: str = "0.
|
|
448
|
+
__version__: str = "0.168.0"
|
|
448
449
|
|
|
449
450
|
__all__: list[str] = [
|
|
450
451
|
"BASE_COLUMN_ORDER",
|
|
@@ -768,6 +769,7 @@ __all__: list[str] = [
|
|
|
768
769
|
"get_client_ip_from_scope",
|
|
769
770
|
"get_request_id",
|
|
770
771
|
"get_state",
|
|
772
|
+
"guard_metadata",
|
|
771
773
|
"guarded_user_param",
|
|
772
774
|
"has_perm",
|
|
773
775
|
"hash_opaque_token",
|
{tempest_fastapi_sdk-0.167.2 → tempest_fastapi_sdk-0.168.0}/tempest_fastapi_sdk/authz/__init__.py
RENAMED
|
@@ -32,6 +32,7 @@ from tempest_fastapi_sdk.authz.requires import (
|
|
|
32
32
|
TempestPermissionError as TempestPermissionError,
|
|
33
33
|
)
|
|
34
34
|
from tempest_fastapi_sdk.authz.requires import declared_guards as declared_guards
|
|
35
|
+
from tempest_fastapi_sdk.authz.requires import guard_metadata as guard_metadata
|
|
35
36
|
from tempest_fastapi_sdk.authz.requires import guarded_user_param as guarded_user_param
|
|
36
37
|
from tempest_fastapi_sdk.authz.requires import requires as requires
|
|
37
38
|
|
|
@@ -48,6 +49,7 @@ __all__: list[str] = [
|
|
|
48
49
|
"check_permission",
|
|
49
50
|
"declared_guards",
|
|
50
51
|
"default_registry",
|
|
52
|
+
"guard_metadata",
|
|
51
53
|
"guarded_user_param",
|
|
52
54
|
"has_perm",
|
|
53
55
|
"make_permission_checker",
|