tempest-fastapi-sdk 0.166.1__tar.gz → 0.167.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/CHANGELOG.md +83 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/CLAUDE.md +19 -1
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/PKG-INFO +36 -3
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/README.md +35 -2
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/architecture.en.md +25 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/architecture.md +25 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/authz.en.md +7 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/authz.md +7 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/cli.en.md +31 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/cli.md +30 -0
- tempest_fastapi_sdk-0.167.1/docs/recipes/permission-guards.en.md +320 -0
- tempest_fastapi_sdk-0.167.1/docs/recipes/permission-guards.md +319 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/reference.md +6 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/roadmap.en.md +12 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/roadmap.md +12 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/mkdocs.yml +2 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/pyproject.toml +1 -1
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/__init__.py +13 -1
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/authz/__init__.py +18 -0
- tempest_fastapi_sdk-0.167.1/tempest_fastapi_sdk/authz/requires.py +739 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/main.py +91 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/openapi_errors.py +12 -0
- tempest_fastapi_sdk-0.167.1/tempest_fastapi_sdk/cli/permissions.py +724 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/controllers/base.py +7 -1
- tempest_fastapi_sdk-0.167.1/tests/authz/test_requires.py +554 -0
- tempest_fastapi_sdk-0.167.1/tests/cli/test_permissions.py +389 -0
- tempest_fastapi_sdk-0.167.1/tests/controllers/test_generic_bounds.py +121 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/uv.lock +1 -1
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/.github/workflows/ci.yml +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/.github/workflows/docs.yml +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/.github/workflows/nightly-model.yml +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/.github/workflows/release-pypi.yml +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/.gitignore +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/.python-version +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/Makefile +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/admin-showcase.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/admin-showcase.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/changelog.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/changelog.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/contributing.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/contributing.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/fullstack-web.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/fullstack-web.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/genai-examples.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/genai-examples.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/index.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/index.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/installation.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/installation.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/integrated.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/integrated.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/index.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/index.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/api.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/api.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/business-rules.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/business-rules.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/domain.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/domain.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/flows.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/flows.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/index.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/learning/marketplace/index.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/marketplace-local.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/marketplace-local.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/migration.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/migration.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/admin.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/admin.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/artifact-registry.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/artifact-registry.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/audit-trail.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/audit-trail.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/auth-flow.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/auth-flow.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/br-helpers.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/br-helpers.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/cache.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/cache.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/chat.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/chat.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/database.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/database.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/deploy-safety.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/deploy-safety.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/downloads.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/downloads.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/email.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/email.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/feature-flags.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/feature-flags.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/fields.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/fields.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/file-store.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/file-store.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/genai.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/genai.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/geo.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/geo.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/http-client.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/http-client.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/http.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/http.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/idempotency.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/idempotency.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/index.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/index.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/introspection-auth.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/introspection-auth.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/logging.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/logging.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/management-commands.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/management-commands.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/metrics.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/metrics.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/mfa.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/mfa.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/multi-tenant.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/multi-tenant.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/observability.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/observability.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/offline-sync.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/offline-sync.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/openapi-client.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/openapi-client.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/openapi-errors.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/openapi-errors.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/outbox.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/outbox.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/queue-tasks.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/queue-tasks.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/react-spa.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/react-spa.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/realtime.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/realtime.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/refresh-tokens.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/refresh-tokens.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/reviews.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/reviews.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/security.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/security.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/sessions.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/sessions.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/sse.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/sse.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/storage.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/storage.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/stored-files.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/stored-files.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/system-checks.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/system-checks.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/tempestweb-frontend.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/tempestweb-frontend.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/testing.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/testing.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/typing.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/typing.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/uploads.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/uploads.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/utilities.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/utilities.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/vision.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/vision.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/webpush.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/webpush.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/websocket.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/recipes/websocket.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/reference.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/ssr.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/ssr.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/tour.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/tour.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/tutorial.en.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/docs/tutorial.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/mkdocs_hooks/llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/planning/genai/README.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/planning/genai/manual-validation.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/planning/genai/phase-0.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/planning/genai/phase-1.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/planning/genai/phase-2.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/planning/genai/phase-3.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/planning/genai/validation-strategy.md +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/scripts/extract_recipe.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/actions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/auth.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/config.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/dashboard.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/discovery.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/forms.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/permissions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/session.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/site.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/autocomplete.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/import.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/admin/theme.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/cookies.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/error_docs.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/handlers.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/middlewares/response_cache.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/oauth.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/routers/health.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/server.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/spa.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/static.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/tracing.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/api/webhooks.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/artifacts/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/artifacts/actions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/artifacts/digest.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/artifacts/model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/artifacts/registry.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/guards.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/introspection.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/locale.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/authz/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/authz/permissions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cache/decorator.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/chat/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/chat/models.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/chat/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/chat/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/chat/service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/checks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/checks/builtins.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/checks/messages.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/checks/registry.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/commands.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/config.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/db.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/generate.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/lint.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/new.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/openapi_fix.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/secrets.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/cli/user.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/core/context.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/core/enums.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/core/logging.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/core/typed.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/audit.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/backup.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/connection.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/expressions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/migrations.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/mixins.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/outbox.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/repository.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/signals.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/slow_query.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/tenant.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/user_model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/flags/backends.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/flags/service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/audio/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/audio/language.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/audio/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/audio/stt.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/audio/tts.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/batching.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/embeddings.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/generation_cache.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/hardware.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/metrics.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/moderation.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/ollama.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/onnx_embed.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/pipeline.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/chroma.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/chunking.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/context.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/extract.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/fusion.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/hybrid.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/pdf.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/rerank.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/retriever.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/search.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/rag/vectorstore.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/registry.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/structured.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/text.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/tokens.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/tracing.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/genai/vision_text.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/br.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/db.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/distance.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/enums.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/estimate.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/geocoding.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/geometry.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/polyline.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/routing.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/geo/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/emit_client.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/emit_schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/generate.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/ir.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/loader.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/naming.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/openapi/parse.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/py.typed +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/queue/broker.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/queue/consumer.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/queue/manager.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/reviews/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/reviews/models.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/reviews/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/reviews/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/reviews/service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/schemas/base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/schemas/errors.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/schemas/logs.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/schemas/response.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/services/base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sessions/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sessions/service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sessions/store.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/settings/base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/settings/mixins.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sse/broker.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/ssr/assets.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/ssr/attributes.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/ssr/page.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/ssr/response.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/ssr/webapp.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/cron.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/dead_letter.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/manager.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/observability.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/oop.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/queue.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/testing/database.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/testing/factories.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/datetime.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/dict.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/download.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/email.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/fields.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/file_store.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/http_client.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/jwt.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/locations.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/log.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/metrics.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/password.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/regex.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/throttle.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/totp.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/utils/upload.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/vision/mapping.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/vision/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/vision/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/webpush/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/webpush/service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/websockets/hub.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/websockets/router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_actions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_audit_viewer.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_auth.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_autocomplete_fk.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_csv_import.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_dashboard_cards.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_discovery.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_forms.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_inlines.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_lenses.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_logs_nav.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_rbac.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_rich_filters.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_site.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_theme.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_upload_field.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_user_model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/admin/test_widgets_json_time.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_body_size.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_business_metrics.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_cookies.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_cors.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_csrf.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_dependencies_auth.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_error_docs.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_graceful.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_handlers.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_health_router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_idempotency.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_jwt_dependency.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_logs_router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_oauth.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_outbound_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_prometheus.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_rate_limit_extras.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_request_id_middleware.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_response_cache.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_role_dependency.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_server.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_spa.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_static.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/api/test_webhooks_rsa.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/artifacts/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/artifacts/support.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/artifacts/test_actions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/artifacts/test_digest.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/artifacts/test_registry.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_cookie_delivery.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_email_change.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_guards.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_introspection.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_locale.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_refresh.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_refresh_db.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/auth/test_service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/authz/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/authz/test_dependencies.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/authz/test_permissions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cache/test_decorator.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cache/test_invalidation.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cache/test_redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/chat/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/chat/test_chat.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/checks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/checks/test_check_config_cli.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/checks/test_checks.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_config.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_db.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_db_seed.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_dockerfile_spa.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_lint_strictness.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_main.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_management_commands.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_openapi_errors.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_openapi_fix.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_secrets.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/cli/test_user.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/conftest.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/controllers/test_base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/core/test_context.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/core/test_enums.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/core/test_logging.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/core/test_typed.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_audit.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_backup.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_bulk_ops.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_connection.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_eager_load.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_expressions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_migrations.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_model.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_outbox.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_repository.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_safe_upgrade.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_signals.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_slow_query.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/db/test_tenant.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/exceptions/test_exceptions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/exceptions/test_i18n.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/exceptions/test_inherited_code_warning.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/flags/test_flags.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/_eval/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/_eval/corpus.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/audio/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/audio/test_audio.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/audio/test_language.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/conftest.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_batching.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_chat_memory.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_embedding_cache_redis.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_embeddings.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_eval_harness.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_genai_metrics.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_generation_cache.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_generation_config.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_gpu_validation.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_hardware.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_hybrid.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_moderation.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_ollama.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_onnx_embed.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_pipeline.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_pipeline_integration.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_rag.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_refinements.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_rerank.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_structured.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_text.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_textgen_embed_metrics.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_tokens.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_vectorstore.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/genai/test_vision_text.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_br.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_db.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_distance.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_estimate.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_geocoding.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_geometry.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_polyline.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_routing.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/geo/test_routing_extra.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/openapi/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/openapi/conftest.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/openapi/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/openapi/test_loader.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/openapi/test_naming.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/openapi/test_parse.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/queue/test_broker.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/queue/test_consumer.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/queue/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/reviews/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/reviews/test_reviews.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/schemas/test_base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/schemas/test_cursor_pagination.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/schemas/test_errors.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/schemas/test_link_headers.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/schemas/test_pagination.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/schemas/test_response.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/services/test_base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/services/test_file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/sessions/test_sessions.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/settings/test_base.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/settings/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/sse/test_broker.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/sse/test_event_stream.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/ssr/test_attributes.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/ssr/test_integration.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/ssr/test_page.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/ssr/test_response.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/ssr/test_webapp.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/storage/test_minio_client.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/test_cron.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/test_dead_letter.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/test_observability.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/test_oop.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/test_queue.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/tasks/test_scheduler.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/test_docs_api_guard.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/test_llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/test_reference_coverage.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/testing/test_database.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/testing/test_factories.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_client_ip.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_datetime.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_dict.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_download.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_email.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_fields.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_file_store.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_http_client.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_jwt.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_lazy_extras.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_locations.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_log.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_metrics.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_password.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_regex.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_throttle.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/utils/test_upload.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/vision/test_router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/vision/test_vision.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/webpush/test_dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/webpush/test_router.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/webpush/test_schemas.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/webpush/test_service.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.166.1 → tempest_fastapi_sdk-0.167.1}/tests/websockets/test_hub_and_router.py +0 -0
|
@@ -5,6 +5,89 @@ 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.167.1] — 2026-07-26
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- **`BaseController` now accepts services typed over a concrete update
|
|
13
|
+
schema.** `ServiceT`'s bound was written `BaseService[Any, Any]`, which is not
|
|
14
|
+
a partial application: PEP 696 fills the omitted `UpdateT` with its
|
|
15
|
+
`BaseSchema` default, and since that parameter is invariant the bound admitted
|
|
16
|
+
only services whose update schema was exactly `BaseSchema`. Every service
|
|
17
|
+
written the documented way — `BaseService[Repo, Resp, MyUpdateSchema]` — was
|
|
18
|
+
rejected by the type checker with `Type parameter "UpdateT@BaseService" is
|
|
19
|
+
invariant, but "MyUpdateSchema" is not the same as "BaseSchema"`, forcing a
|
|
20
|
+
`# type: ignore[type-var]` on the controller declaration. The bound is now
|
|
21
|
+
`BaseService[Any, Any, Any]`, which leaves the invariant parameter open while
|
|
22
|
+
keeping the `BaseSchema` constraint. Type-check only — runtime behavior is
|
|
23
|
+
unchanged, and the `# type: ignore[type-var]` workarounds can be dropped.
|
|
24
|
+
- **The suite can now see this class of bug.** `mypy` runs over the package, not
|
|
25
|
+
over `tests/`, so `tests/controllers/test_base.py` already declared exactly
|
|
26
|
+
this service/controller pair and stayed green. New
|
|
27
|
+
`tests/controllers/test_generic_bounds.py` inspects `ServiceT.__bound__`
|
|
28
|
+
directly and runs `mypy --strict` over a downstream-shaped snippet, asserting
|
|
29
|
+
no `[type-var]` diagnostic.
|
|
30
|
+
|
|
31
|
+
### Documentation
|
|
32
|
+
|
|
33
|
+
- `docs/architecture.md` / `docs/architecture.en.md` — the controllers & services
|
|
34
|
+
section now shows the 3rd generic parameter on both layers and notes that the
|
|
35
|
+
pair requires 0.167.1+.
|
|
36
|
+
|
|
37
|
+
## [0.167.0] — 2026-07-26
|
|
38
|
+
|
|
39
|
+
Permission guards: a decorator that runs plain `(user) -> user | None`
|
|
40
|
+
functions before a function body, plus the two-layer misuse check the user
|
|
41
|
+
asked for — fail-fast at import time, static gate in CI.
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- **`@requires(*guards, user_param=None)`** (`tempest_fastapi_sdk.authz`,
|
|
46
|
+
re-exported at the package root). Runs each guard on the user before the
|
|
47
|
+
decorated body, left to right, on a route handler, a controller or a service
|
|
48
|
+
method, sync or `async`. A guard receives the user, denies by raising an
|
|
49
|
+
`AppException` subclass (so the status, the error `code` and the
|
|
50
|
+
`{detail, code, details}` envelope come from `register_exception_handlers`),
|
|
51
|
+
and returns the user or `None`; a non-`None` return replaces the user the next
|
|
52
|
+
guard and the body see, which is how `require_authenticated` /
|
|
53
|
+
`require_active` / `require_admin` narrow `UserT | None` to `UserT`.
|
|
54
|
+
The user parameter is resolved from the annotations — the single parameter
|
|
55
|
+
typed as a `BaseModel` / `BaseUserModel` subclass — with `user_param=` to
|
|
56
|
+
name it explicitly or disambiguate two user models. The wrapper keeps the
|
|
57
|
+
decorated signature (with annotations already evaluated, so FastAPI resolves
|
|
58
|
+
them against the right module), leaving dependency injection and the OpenAPI
|
|
59
|
+
schema untouched.
|
|
60
|
+
- **`TempestPermissionError`** — raised at decoration time (import time) for
|
|
61
|
+
`@requires()` with no guard, a non-callable guard, a guard that does not take
|
|
62
|
+
exactly one fillable parameter, an `async` guard under a synchronous function,
|
|
63
|
+
or a decorated function whose user parameter cannot be resolved. The
|
|
64
|
+
application refuses to start instead of running a check that never fires.
|
|
65
|
+
- **`GuardContractWarning`** — warned at call time when a guard raises outside
|
|
66
|
+
the `AppException` hierarchy (the API layer would answer HTTP 500 with no
|
|
67
|
+
error code) or returns a non-user value such as `False` (a predicate-style
|
|
68
|
+
check whose denial cannot be honored). The original exception still
|
|
69
|
+
propagates; the warning names the guard.
|
|
70
|
+
- **`declared_guards(fn)` / `guarded_user_param(fn)`** — read a function's
|
|
71
|
+
guards and its user parameter without calling it, for a router audit or a
|
|
72
|
+
test asserting every write route carries a guard.
|
|
73
|
+
- **`tempest permissions [--check] [--strict] [--path]`** — static contract
|
|
74
|
+
check over the project source (`ast`, without importing the application), for
|
|
75
|
+
what runtime validation cannot see: a guard whose `raise` no test exercises, a
|
|
76
|
+
guard never wired. Errors: `no-guards`, `user-param-missing`,
|
|
77
|
+
`user-param-ambiguous`, `guard-arity`, `guard-async-in-sync`,
|
|
78
|
+
`guard-returns-bool`, `guard-foreign-exception`. Warnings:
|
|
79
|
+
`guard-never-denies`, `guard-missing-annotation`, `guard-return-type`,
|
|
80
|
+
`guard-unresolved`. `--check` exits non-zero on errors, `--strict` on warnings
|
|
81
|
+
too. Guards resolve by name; an ambiguous or out-of-scope name is reported as
|
|
82
|
+
`guard-unresolved` rather than checked against the wrong definition.
|
|
83
|
+
|
|
84
|
+
### Changed
|
|
85
|
+
|
|
86
|
+
- **`tempest openapi-errors` now follows `@requires` guards.** A guard denies by
|
|
87
|
+
raising, so its exceptions are as reachable from the route as those of any
|
|
88
|
+
function the body calls; they now show up as `undocumented` until the route
|
|
89
|
+
declares them, and `--fix` writes them like any other.
|
|
90
|
+
|
|
8
91
|
## [0.166.1] — 2026-07-25
|
|
9
92
|
|
|
10
93
|
Post-release validation of `--fix` against the published wheel, in a project
|
|
@@ -75,6 +75,24 @@ The SDK currently covers (Sep 2025+, post-v0.31.x):
|
|
|
75
75
|
`refresh_token_model=` on `UserAuthService`) with rotation,
|
|
76
76
|
family-wide reuse detection and `POST /auth/logout`
|
|
77
77
|
(`LogoutSchema`).
|
|
78
|
+
- **Permission guards (v0.167.0)** — `@requires(*guards, user_param=None)`
|
|
79
|
+
(`tempest_fastapi_sdk.authz`, re-exported at the root) runs plain
|
|
80
|
+
`(user) -> user | None` guards before a function body, at any layer, sync or
|
|
81
|
+
async; guards deny by raising an `AppException`, and a non-`None` return
|
|
82
|
+
replaces the user the body sees (how `require_active` narrows `UserT | None`).
|
|
83
|
+
The user param resolves from the annotations (`BaseModel`/`BaseUserModel`
|
|
84
|
+
subclass), `user_param=` disambiguates. Misuse caught in three places:
|
|
85
|
+
`TempestPermissionError` at import (no guard, wrong arity, async guard on a
|
|
86
|
+
sync fn, unresolvable user param), `GuardContractWarning` at call time
|
|
87
|
+
(foreign exception, `return False`), and
|
|
88
|
+
`tempest permissions [--check|--strict|--path]` statically (`ast`) — errors
|
|
89
|
+
`no-guards`/`user-param-missing`/`user-param-ambiguous`/`guard-arity`/
|
|
90
|
+
`guard-async-in-sync`/`guard-returns-bool`/`guard-foreign-exception`,
|
|
91
|
+
warnings `guard-never-denies`/`guard-missing-annotation`/`guard-return-type`/
|
|
92
|
+
`guard-unresolved` (ambiguous or out-of-scope guard reported, never guessed).
|
|
93
|
+
`openapi-errors` follows the guards, so their exceptions land in
|
|
94
|
+
`error_responses(...)`. `declared_guards`/`guarded_user_param` introspect a
|
|
95
|
+
route. Recipe: `docs/recipes/permission-guards.md`.
|
|
78
96
|
- **DB** — `AsyncDatabaseManager`, `BaseRepository[T]` with
|
|
79
97
|
bulk ops (`bulk_create_values`, `bulk_upsert`, `bulk_update`,
|
|
80
98
|
`add_all`, etc.), `AlembicHelper`, `BaseModel`, audit /
|
|
@@ -377,7 +395,7 @@ The SDK currently covers (Sep 2025+, post-v0.31.x):
|
|
|
377
395
|
`tempest db init/revision/upgrade/downgrade/current/history/seed`,
|
|
378
396
|
`tempest user create [--admin] / list`, `tempest secrets rotate`,
|
|
379
397
|
plus quality gates (`lint`, `fix`, `format`, `fmt-check`, `type`,
|
|
380
|
-
`test`, `check`), `openapi-errors`, `openapi-client`.
|
|
398
|
+
`test`, `check`), `openapi-errors`, `openapi-client`, `permissions`.
|
|
381
399
|
|
|
382
400
|
The whole Tier S / Tier A / Tier B backlog that used to live here is
|
|
383
401
|
**shipped**, and so is the five-item next-version plan that followed it
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tempest-fastapi-sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.167.1
|
|
4
4
|
Summary: Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects.
|
|
5
5
|
Project-URL: Homepage, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
|
|
@@ -237,7 +237,7 @@ Via `pyproject.toml`:
|
|
|
237
237
|
|
|
238
238
|
```toml
|
|
239
239
|
dependencies = [
|
|
240
|
-
"tempest-fastapi-sdk>=0.
|
|
240
|
+
"tempest-fastapi-sdk>=0.167.0",
|
|
241
241
|
]
|
|
242
242
|
```
|
|
243
243
|
|
|
@@ -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` |
|
|
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` |
|
|
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` |
|
|
@@ -4147,6 +4147,39 @@ tempest openapi-errors --fix # write them (needs a clean git tree)
|
|
|
4147
4147
|
|
|
4148
4148
|
---
|
|
4149
4149
|
|
|
4150
|
+
### Permission guards
|
|
4151
|
+
|
|
4152
|
+
`@requires` runs plain `(user) -> user | None` guards before a function body — on a route, a controller or a service, sync or `async`. A guard denies by raising an `AppException`, so the HTTP status, the error `code` and the `{detail, code, details}` envelope come from the SDK handlers.
|
|
4153
|
+
|
|
4154
|
+
```python
|
|
4155
|
+
from fastapi import Depends
|
|
4156
|
+
from tempest_fastapi_sdk import error_responses, requires
|
|
4157
|
+
from tempest_fastapi_sdk.auth import require_active
|
|
4158
|
+
|
|
4159
|
+
|
|
4160
|
+
@router.delete("/orders/{order_id}", responses=error_responses(NotOrderOwnerException))
|
|
4161
|
+
@requires(require_active, order_owner)
|
|
4162
|
+
async def delete_order(
|
|
4163
|
+
order_id: UUID,
|
|
4164
|
+
user: UserModel = Depends(get_current_user),
|
|
4165
|
+
) -> None:
|
|
4166
|
+
"""The body runs only for an active user who owns the order."""
|
|
4167
|
+
await controller.delete(order_id)
|
|
4168
|
+
```
|
|
4169
|
+
|
|
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
|
+
|
|
4172
|
+
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
|
+
|
|
4174
|
+
```bash
|
|
4175
|
+
tempest permissions --check # exit 1 on any error
|
|
4176
|
+
tempest permissions --check --strict # fail on warnings too
|
|
4177
|
+
```
|
|
4178
|
+
|
|
4179
|
+
`tempest openapi-errors` reads the `@requires` guards too, so a guard's exception shows up as `undocumented` on the route until it is declared. Full walkthrough: [Permission guards](https://mauriciobenjamin700.github.io/tempest-fastapi-sdk/en/recipes/permission-guards/).
|
|
4180
|
+
|
|
4181
|
+
---
|
|
4182
|
+
|
|
4150
4183
|
## Conventions
|
|
4151
4184
|
|
|
4152
4185
|
- **Layered architecture**: routers → controllers → services → repositories. Never skip layers.
|
|
@@ -91,7 +91,7 @@ Via `pyproject.toml`:
|
|
|
91
91
|
|
|
92
92
|
```toml
|
|
93
93
|
dependencies = [
|
|
94
|
-
"tempest-fastapi-sdk>=0.
|
|
94
|
+
"tempest-fastapi-sdk>=0.167.0",
|
|
95
95
|
]
|
|
96
96
|
```
|
|
97
97
|
|
|
@@ -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` |
|
|
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` |
|
|
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` |
|
|
@@ -4001,6 +4001,39 @@ tempest openapi-errors --fix # write them (needs a clean git tree)
|
|
|
4001
4001
|
|
|
4002
4002
|
---
|
|
4003
4003
|
|
|
4004
|
+
### Permission guards
|
|
4005
|
+
|
|
4006
|
+
`@requires` runs plain `(user) -> user | None` guards before a function body — on a route, a controller or a service, sync or `async`. A guard denies by raising an `AppException`, so the HTTP status, the error `code` and the `{detail, code, details}` envelope come from the SDK handlers.
|
|
4007
|
+
|
|
4008
|
+
```python
|
|
4009
|
+
from fastapi import Depends
|
|
4010
|
+
from tempest_fastapi_sdk import error_responses, requires
|
|
4011
|
+
from tempest_fastapi_sdk.auth import require_active
|
|
4012
|
+
|
|
4013
|
+
|
|
4014
|
+
@router.delete("/orders/{order_id}", responses=error_responses(NotOrderOwnerException))
|
|
4015
|
+
@requires(require_active, order_owner)
|
|
4016
|
+
async def delete_order(
|
|
4017
|
+
order_id: UUID,
|
|
4018
|
+
user: UserModel = Depends(get_current_user),
|
|
4019
|
+
) -> None:
|
|
4020
|
+
"""The body runs only for an active user who owns the order."""
|
|
4021
|
+
await controller.delete(order_id)
|
|
4022
|
+
```
|
|
4023
|
+
|
|
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
|
+
|
|
4026
|
+
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
|
+
|
|
4028
|
+
```bash
|
|
4029
|
+
tempest permissions --check # exit 1 on any error
|
|
4030
|
+
tempest permissions --check --strict # fail on warnings too
|
|
4031
|
+
```
|
|
4032
|
+
|
|
4033
|
+
`tempest openapi-errors` reads the `@requires` guards too, so a guard's exception shows up as `undocumented` on the route until it is declared. Full walkthrough: [Permission guards](https://mauriciobenjamin700.github.io/tempest-fastapi-sdk/en/recipes/permission-guards/).
|
|
4034
|
+
|
|
4035
|
+
---
|
|
4036
|
+
|
|
4004
4037
|
## Conventions
|
|
4005
4038
|
|
|
4006
4039
|
- **Layered architecture**: routers → controllers → services → repositories. Never skip layers.
|
|
@@ -163,6 +163,31 @@ What you inherit by subclassing `BaseController[ServiceT, ResponseT]`:
|
|
|
163
163
|
| `update(id, data)` | `service.update` | Same. |
|
|
164
164
|
| `delete(id)` | `service.delete` | Same. |
|
|
165
165
|
|
|
166
|
+
!!! tip "Typing the `update` payload end to end"
|
|
167
|
+
The 3rd generic parameter is the update schema, and it must be the **same** on both layers: a service declared as `BaseService[Repo, Resp, MyUpdateSchema]` fits `BaseController[MyService, Resp, MyUpdateSchema]`. Omit the 3rd parameter on either one and it falls back to the `BaseSchema` default, leaving `update`'s `data` loosely typed.
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from tempest_fastapi_sdk import BaseController, BaseService
|
|
171
|
+
|
|
172
|
+
from src.db.repositories import CoinPackRepository
|
|
173
|
+
from src.schemas import CoinPackResponseSchema, CoinPackUpdateSchema
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class CoinPackService(
|
|
177
|
+
BaseService[CoinPackRepository, CoinPackResponseSchema, CoinPackUpdateSchema]
|
|
178
|
+
):
|
|
179
|
+
"""Service typed over the concrete update schema."""
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class CoinPackController(
|
|
183
|
+
BaseController[CoinPackService, CoinPackResponseSchema, CoinPackUpdateSchema]
|
|
184
|
+
):
|
|
185
|
+
"""Controller repeating the same update schema."""
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
!!! warning "Requires 0.167.1+"
|
|
189
|
+
On earlier versions this pair failed type checking with `Type parameter "UpdateT@BaseService" is invariant, but "CoinPackUpdateSchema" is not the same as "BaseSchema"` — `ServiceT`'s bound pinned that invariant parameter to `BaseSchema`. Fixed in 0.167.1; nothing changes at runtime.
|
|
190
|
+
|
|
166
191
|
When a use case needs domain rules, override the inherited method in the service. When a use case needs to coordinate more than one service, override the inherited method (or add a new one) in the controller. The router never grows — it only depends on the controller.
|
|
167
192
|
|
|
168
193
|
```python
|
|
@@ -163,6 +163,31 @@ O que você herda ao subclassear `BaseController[ServiceT, ResponseT]`:
|
|
|
163
163
|
| `update(id, data)` | `service.update` | Igual. |
|
|
164
164
|
| `delete(id)` | `service.delete` | Igual. |
|
|
165
165
|
|
|
166
|
+
!!! tip "Tipando o payload de `update` ponta a ponta"
|
|
167
|
+
O 3º parâmetro genérico é o schema de update, e ele precisa ser o **mesmo** nas duas camadas: um service declarado como `BaseService[Repo, Resp, MeuUpdateSchema]` encaixa em `BaseController[MeuService, Resp, MeuUpdateSchema]`. Omitir o 3º parâmetro em qualquer uma delas cai no default `BaseSchema`, e o `data` de `update` chega sem tipo preciso.
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
from tempest_fastapi_sdk import BaseController, BaseService
|
|
171
|
+
|
|
172
|
+
from src.db.repositories import CoinPackRepository
|
|
173
|
+
from src.schemas import CoinPackResponseSchema, CoinPackUpdateSchema
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class CoinPackService(
|
|
177
|
+
BaseService[CoinPackRepository, CoinPackResponseSchema, CoinPackUpdateSchema]
|
|
178
|
+
):
|
|
179
|
+
"""Service tipado sobre o schema de update concreto."""
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class CoinPackController(
|
|
183
|
+
BaseController[CoinPackService, CoinPackResponseSchema, CoinPackUpdateSchema]
|
|
184
|
+
):
|
|
185
|
+
"""Controller que repete o mesmo schema de update."""
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
!!! warning "Requer 0.167.1+"
|
|
189
|
+
Em versões anteriores esse par falhava no type check com `Type parameter "UpdateT@BaseService" is invariant, but "CoinPackUpdateSchema" is not the same as "BaseSchema"` — o bound de `ServiceT` deixava o parâmetro invariante fixado em `BaseSchema`. Corrigido em 0.167.1; nada muda em runtime.
|
|
190
|
+
|
|
166
191
|
Quando um caso de uso precisa de regras de domínio, sobrescreva o método herdado no service. Quando um caso de uso precisa coordenar mais de um service, sobrescreva o método herdado (ou adicione um novo) no controller. O router nunca cresce — ele só depende do controller.
|
|
167
192
|
|
|
168
193
|
```python
|
|
@@ -183,3 +183,10 @@ The mixin delegates to the global registry (`default_registry`).
|
|
|
183
183
|
- Superuser and static set are injectable via `PermissionRegistry`.
|
|
184
184
|
- Rules match by exact string or wildcard (`order.*`, `*`).
|
|
185
185
|
- `PermissionMixin` gives you `await user.has_perm(...)`.
|
|
186
|
+
|
|
187
|
+
!!! tip "Already holding the user?"
|
|
188
|
+
When the check is an invariant on the user itself (active, admin, owner of
|
|
189
|
+
the resource) rather than a question for the registry,
|
|
190
|
+
[`@requires`](permission-guards.md) runs `(user) -> user | None` guards at
|
|
191
|
+
any layer — and a guard may call `check_permission(...)` to combine both
|
|
192
|
+
approaches.
|
|
@@ -182,3 +182,10 @@ O mixin delega ao registry global (`default_registry`).
|
|
|
182
182
|
- Superusuário e conjunto estático são injetáveis via `PermissionRegistry`.
|
|
183
183
|
- Regras batem por string exata ou wildcard (`order.*`, `*`).
|
|
184
184
|
- `PermissionMixin` dá o `await user.has_perm(...)`.
|
|
185
|
+
|
|
186
|
+
!!! tip "Já tem o usuário na mão?"
|
|
187
|
+
Quando a checagem é uma invariante sobre o próprio usuário (ativo, admin,
|
|
188
|
+
dono do recurso) e não uma pergunta ao registry, o
|
|
189
|
+
[`@requires`](permission-guards.md) roda guards `(user) -> user | None` em
|
|
190
|
+
qualquer camada — e um guard pode chamar `check_permission(...)` para
|
|
191
|
+
combinar as duas abordagens.
|
|
@@ -504,6 +504,37 @@ Details and limitations in the [Errors in OpenAPI »](openapi-errors.md) recipe.
|
|
|
504
504
|
|
|
505
505
|
---
|
|
506
506
|
|
|
507
|
+
### Permission guards — `tempest permissions`
|
|
508
|
+
|
|
509
|
+
Reads the `@requires` guard contract straight off the source (`ast`, without
|
|
510
|
+
importing the application) and reports what the decorator cannot see at import
|
|
511
|
+
time:
|
|
512
|
+
|
|
513
|
+
```bash
|
|
514
|
+
tempest permissions # informative report (exit 0)
|
|
515
|
+
tempest permissions --check # exit 1 on any error (CI gate)
|
|
516
|
+
tempest permissions --check --strict # fail on warnings too
|
|
517
|
+
tempest permissions --path src --path libs
|
|
518
|
+
```
|
|
519
|
+
|
|
520
|
+
```text
|
|
521
|
+
src/api/routers/orders.py:41 delete_order
|
|
522
|
+
error: guard-foreign-exception: guard 'order_owner' raises ValueError, which is
|
|
523
|
+
not an AppException subclass; the API layer answers it as HTTP 500 without an
|
|
524
|
+
error code
|
|
525
|
+
2 finding(s), 1 error(s).
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
Errors: a guard raising outside the `AppException` hierarchy, a predicate-style
|
|
529
|
+
guard (`-> bool`), wrong arity, an `async` guard on a sync function, a route with
|
|
530
|
+
no user parameter. Warnings: a guard that never denies, a missing annotation, a
|
|
531
|
+
guard the checker could not resolve (lambda, duplicated name, definition outside
|
|
532
|
+
the scanned paths).
|
|
533
|
+
|
|
534
|
+
Details in the [Permission guards (`@requires`) »](permission-guards.md) recipe.
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
507
538
|
### Integration client — `tempest openapi-client`
|
|
508
539
|
|
|
509
540
|
Generates Pydantic schemas + a typed HTTP client from a third party's OpenAPI
|
|
@@ -502,6 +502,36 @@ Detalhes e limitações na receita [Erros no OpenAPI »](openapi-errors.md).
|
|
|
502
502
|
|
|
503
503
|
---
|
|
504
504
|
|
|
505
|
+
### Guards de permissão — `tempest permissions`
|
|
506
|
+
|
|
507
|
+
Lê o contrato dos guards do `@requires` direto do código-fonte (`ast`, sem
|
|
508
|
+
importar a aplicação) e reporta o que o decorator não consegue ver em tempo de
|
|
509
|
+
import:
|
|
510
|
+
|
|
511
|
+
```bash
|
|
512
|
+
tempest permissions # relatório informativo (exit 0)
|
|
513
|
+
tempest permissions --check # exit 1 se houver erro (gate de CI)
|
|
514
|
+
tempest permissions --check --strict # falha também nos warnings
|
|
515
|
+
tempest permissions --path src --path libs
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
```text
|
|
519
|
+
src/api/routers/orders.py:41 delete_order
|
|
520
|
+
error: guard-foreign-exception: guard 'order_owner' raises ValueError, which is
|
|
521
|
+
not an AppException subclass; the API layer answers it as HTTP 500 without an
|
|
522
|
+
error code
|
|
523
|
+
2 finding(s), 1 error(s).
|
|
524
|
+
```
|
|
525
|
+
|
|
526
|
+
Erros: guard que levanta fora da hierarquia `AppException`, guard-predicado
|
|
527
|
+
(`-> bool`), aridade errada, guard `async` em função sync, rota sem parâmetro de
|
|
528
|
+
usuário. Warnings: guard que nunca nega, anotação faltando, guard que o checker
|
|
529
|
+
não conseguiu resolver (lambda, nome duplicado, definição fora do escopo).
|
|
530
|
+
|
|
531
|
+
Detalhes na receita [Guards de permissão (`@requires`) »](permission-guards.md).
|
|
532
|
+
|
|
533
|
+
---
|
|
534
|
+
|
|
505
535
|
### Cliente de integração — `tempest openapi-client`
|
|
506
536
|
|
|
507
537
|
Gera schemas Pydantic + um cliente HTTP tipado a partir da especificação OpenAPI
|