tempest-fastapi-sdk 0.92.0__tar.gz → 0.93.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/CHANGELOG.md +39 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/CLAUDE.md +9 -1
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/PKG-INFO +33 -49
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/README.md +32 -48
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/migration.en.md +1 -1
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/migration.md +1 -1
- tempest_fastapi_sdk-0.93.0/docs/recipes/queue-tasks.en.md +234 -0
- tempest_fastapi_sdk-0.93.0/docs/recipes/queue-tasks.md +234 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/pyproject.toml +3 -1
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/__init__.py +1 -1
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/queue/__init__.py +7 -1
- tempest_fastapi_sdk-0.93.0/tempest_fastapi_sdk/queue/broker.py +336 -0
- tempest_fastapi_sdk-0.93.0/tempest_fastapi_sdk/tasks/__init__.py +23 -0
- tempest_fastapi_sdk-0.93.0/tempest_fastapi_sdk/tasks/queue.py +459 -0
- tempest_fastapi_sdk-0.93.0/tests/queue/test_broker.py +95 -0
- tempest_fastapi_sdk-0.93.0/tests/tasks/test_queue.py +114 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/uv.lock +1 -1
- tempest_fastapi_sdk-0.92.0/docs/recipes/queue-tasks.en.md +0 -326
- tempest_fastapi_sdk-0.92.0/docs/recipes/queue-tasks.md +0 -325
- tempest_fastapi_sdk-0.92.0/tempest_fastapi_sdk/tasks/__init__.py +0 -13
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/.github/workflows/ci.yml +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/.github/workflows/docs.yml +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/.github/workflows/release-pypi.yml +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/.gitignore +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/.python-version +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/Makefile +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/architecture.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/architecture.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/changelog.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/changelog.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/contributing.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/contributing.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/index.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/index.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/installation.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/installation.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/index.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/index.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/api.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/api.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/business-rules.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/business-rules.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/domain.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/domain.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/flows.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/flows.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/index.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/learning/marketplace/index.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/admin.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/admin.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/audit-trail.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/audit-trail.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/auth-flow.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/auth-flow.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/br-helpers.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/br-helpers.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/cache.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/cache.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/cli.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/cli.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/database.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/database.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/deploy-safety.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/deploy-safety.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/downloads.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/downloads.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/email.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/email.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/feature-flags.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/feature-flags.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/fields.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/fields.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/file-store.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/file-store.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/http-client.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/http-client.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/http.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/http.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/idempotency.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/idempotency.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/index.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/index.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/logging.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/logging.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/metrics.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/metrics.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/mfa.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/mfa.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/multi-tenant.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/multi-tenant.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/observability.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/observability.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/offline-sync.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/offline-sync.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/outbox.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/outbox.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/realtime.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/realtime.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/refresh-tokens.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/refresh-tokens.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/security.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/security.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/sessions.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/sessions.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/sse.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/sse.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/storage.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/storage.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/stored-files.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/stored-files.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/testing.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/testing.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/typing.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/typing.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/uploads.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/uploads.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/utilities.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/utilities.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/vision.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/vision.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/webpush.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/webpush.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/websocket.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/recipes/websocket.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/reference.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/reference.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/roadmap.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/roadmap.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/ssr.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/ssr.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/tutorial.en.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/docs/tutorial.md +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/mkdocs.yml +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/mkdocs_hooks/llmstxt.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/scripts/extract_recipe.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/actions.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/auth.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/config.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/discovery.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/forms.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/session.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/site.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/static/admin.css +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/base.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/dashboard.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/detail.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/form.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/list.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/login.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/logs.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/templates/mfa.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/admin/theme.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/cookies.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/dependencies/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/dependencies/auth.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/handlers.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/body_size.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/cors.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/csrf.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/graceful.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/idempotency.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/middlewares/request_id.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/oauth.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/routers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/routers/health.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/routers/logs.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/routers/metrics.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/routers/tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/server.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/static.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/tracing.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/api/webhooks.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/guards.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/locale.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/page_renderer.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/schemas.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/service.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/activation.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/en-US/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/activation_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_change_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_changed_notice.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/email_verification_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_error.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_form.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/templates/pt-BR/password_reset_success.html +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/auth/token_delivery.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cache/decorator.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cache/invalidation.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cache/redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/Dockerfile.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/README.md.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/dockerignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/env.example.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/gitignore.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/main.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/pyproject.toml.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/api/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/api/app.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/auth.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/api/dependencies/resources.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/api/routers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/controllers/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/core/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/core/exceptions.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/core/settings.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/db/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/db/models/user.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/db/repositories/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/schemas/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/server.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/services/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/src/utils/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/tests/__init__.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/_templates/tests/test_smoke.py.tmpl +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/config.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/db.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/generate.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/lint.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/main.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/new.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/secrets.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/src_layers.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/cli/user.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/controllers/base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/core/context.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/core/enums.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/core/logging.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/core/typed.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/_alembic_templates/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/_alembic_templates/env.py.template +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/audit.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/backup.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/connection.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/migrations.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/mixins.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/outbox.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/repository.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/slow_query.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/tenant.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/user_model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/user_recovery_code_model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/user_refresh_token_model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/user_token_model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/db/webpush_subscription_model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/conflict.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/forbidden.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/i18n.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/jwt.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/not_found.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/too_many_requests.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/unauthorized.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/upload.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/exceptions/validation.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/flags/backends.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/flags/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/flags/service.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/py.typed +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/queue/manager.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/schemas/base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/schemas/link_headers.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/schemas/logs.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/schemas/pagination.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/schemas/response.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/services/base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/services/file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sessions/dependencies.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sessions/middleware.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sessions/router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sessions/schemas.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sessions/service.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sessions/store.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/settings/base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/settings/mixins.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sse/broker.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/sse/event_stream.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/ssr/_static/htmx.min.js +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/ssr/assets.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/ssr/page.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/ssr/response.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/storage/minio_client.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/tasks/manager.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/tasks/scheduler.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/testing/database.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/client_ip.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/data/br_locations.json +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/datetime.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/dict.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/download.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/email.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/fields.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/file_store.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/http_client.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/jwt.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/locations.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/log.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/metrics.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/password.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/regex.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/throttle.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/totp.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/utils/upload.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/vision/mapping.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/vision/schemas.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/webpush/dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/webpush/router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/webpush/schemas.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/webpush/service.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/websockets/hub.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/websockets/router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tempest_fastapi_sdk/websockets/schemas.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_actions.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_auth.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_discovery.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_forms.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_logs_nav.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_rich_filters.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_site.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_theme.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_upload_field.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/admin/test_user_model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_body_size.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_cookies.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_cors.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_csrf.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_dependencies_auth.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_graceful.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_handlers.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_health_router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_idempotency.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_jwt_dependency.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_logs_router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_oauth.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_prometheus.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_rate_limit.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_rate_limit_extras.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_request_id_middleware.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_role_dependency.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_server.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_static.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_tool_spec.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_tracing.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_webhooks.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/api/test_webhooks_rsa.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_cookie_delivery.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_email_change.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_guards.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_locale.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_mfa.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_refresh.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_refresh_db.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/auth/test_service.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cache/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cache/test_decorator.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cache/test_invalidation.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cache/test_redis_manager.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_config.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_db.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_db_seed.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_docker_compose.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_generate.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_lint_strictness.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_main.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_secrets.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/cli/test_user.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/conftest.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/controllers/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/controllers/test_base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/core/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/core/test_context.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/core/test_enums.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/core/test_logging.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/core/test_typed.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_alembic_hooks.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_audit.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_backup.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_bulk_ops.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_connection.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_migrations.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_model.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_outbox.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_repository.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_safe_upgrade.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_slow_query.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/db/test_tenant.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/exceptions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/exceptions/test_exceptions.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/exceptions/test_i18n.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/flags/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/flags/test_flags.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/queue/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/queue/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/schemas/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/schemas/test_base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/schemas/test_cursor_pagination.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/schemas/test_link_headers.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/schemas/test_pagination.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/schemas/test_response.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/services/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/services/test_base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/services/test_file_mixin.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/sessions/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/sessions/test_sessions.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/settings/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/settings/test_base.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/settings/test_mixins.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/sse/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/sse/test_broker.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/sse/test_event_stream.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/ssr/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/ssr/test_integration.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/ssr/test_page.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/ssr/test_response.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/storage/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/storage/test_minio_client.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/tasks/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/tasks/test_manager.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/tasks/test_scheduler.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/testing/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/testing/test_database.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_client_ip.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_datetime.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_dict.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_download.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_email.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_fields.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_file_store.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_http_client.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_jwt.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_lazy_extras.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_locations.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_log.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_metrics.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_opaque_token.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_password.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_regex.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_storage_backends.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_throttle.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/utils/test_upload.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/vision/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/vision/test_vision.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/webpush/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/webpush/test_dispatcher.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/webpush/test_router.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/webpush/test_schemas.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/webpush/test_service.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/websockets/__init__.py +0 -0
- {tempest_fastapi_sdk-0.92.0 → tempest_fastapi_sdk-0.93.0}/tests/websockets/test_hub_and_router.py +0 -0
|
@@ -5,6 +5,45 @@ 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.93.0] — 2026-07-05
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Typed facades over FastStream and TaskIQ** — application code no
|
|
13
|
+
longer imports `faststream` or `taskiq`.
|
|
14
|
+
- **`MessageBroker`** (`tempest_fastapi_sdk.queue`) — transport-agnostic
|
|
15
|
+
pub/sub over FastStream behind a single **channel** concept. Pick the
|
|
16
|
+
transport with a constructor (`MessageBroker.rabbitmq(url)` / `.redis`
|
|
17
|
+
/ `.kafka` / `.nats`), declare consumers with `@mq.on("channel")`
|
|
18
|
+
(the handler's Pydantic type hint validates the message), and publish
|
|
19
|
+
channel-first with `await mq.publish("channel", model)`. `.broker`
|
|
20
|
+
stays as the escape hatch.
|
|
21
|
+
- **`TaskQueue`** (`tempest_fastapi_sdk.tasks`) — TaskIQ broker +
|
|
22
|
+
scheduler folded into one object. `TaskQueue.rabbitmq(url)` / `.redis`
|
|
23
|
+
/ `.memory()`; `@tq.task` returns a typed **`Task`** with
|
|
24
|
+
`await task.enqueue(...)` (to a worker) and `await task.run(...)`
|
|
25
|
+
(inline, no broker); periodic tasks via `@tq.cron(...)` /
|
|
26
|
+
`@tq.interval(...)`; `start_scheduler()` / `stop_scheduler()` for
|
|
27
|
+
dev, with `tq.broker` / `tq.scheduler` exposed for the standalone
|
|
28
|
+
`taskiq worker` / `taskiq scheduler` CLIs.
|
|
29
|
+
- Both facades keep the SDK-standard lifecycle (`connect` / `disconnect`
|
|
30
|
+
/ `lifespan` / `health_check` / `is_connected`).
|
|
31
|
+
- The `OutboxRelay` `publish` callable plugs straight into
|
|
32
|
+
`MessageBroker.publish` (channel-first).
|
|
33
|
+
|
|
34
|
+
### Changed
|
|
35
|
+
|
|
36
|
+
- The **Queue & Tasks** recipe was rewritten in the tiangolo didactic
|
|
37
|
+
style around the new facades, and its stale claim that the SDK ships no
|
|
38
|
+
outbox primitive was corrected (it ships `BaseOutboxModel` /
|
|
39
|
+
`OutboxRelay` / `save_with_outbox`).
|
|
40
|
+
|
|
41
|
+
### Deprecated
|
|
42
|
+
|
|
43
|
+
- `AsyncBrokerManager`, `AsyncTaskBrokerManager` and `AsyncTaskScheduler`
|
|
44
|
+
remain fully functional but are superseded by `MessageBroker` /
|
|
45
|
+
`TaskQueue`; new code should prefer the facades.
|
|
46
|
+
|
|
8
47
|
## [0.92.0] — 2026-07-05
|
|
9
48
|
|
|
10
49
|
### Added
|
|
@@ -157,7 +157,15 @@ The SDK currently covers (Sep 2025+, post-v0.31.x):
|
|
|
157
157
|
`/subscribe` + `/unsubscribe`, aligned with `tempest-react-sdk`);
|
|
158
158
|
webhook signatures.
|
|
159
159
|
- **Cache** — Redis manager + `@cached`.
|
|
160
|
-
- **Queue / tasks** — FastStream + TaskIQ
|
|
160
|
+
- **Queue / tasks** — typed facades hiding FastStream + TaskIQ:
|
|
161
|
+
`MessageBroker` (`.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`
|
|
162
|
+
consumer, channel-first `publish(channel, message)`, `.broker` escape
|
|
163
|
+
hatch) and `TaskQueue` (`.rabbitmq`/`.redis`/`.memory`, `@tq.task` →
|
|
164
|
+
`Task.enqueue`/`.run`, folded `@tq.cron`/`@tq.interval` +
|
|
165
|
+
`start_scheduler`, `tq.broker`/`tq.scheduler` for the CLIs). Legacy
|
|
166
|
+
`AsyncBrokerManager`/`AsyncTaskBrokerManager`/`AsyncTaskScheduler` kept
|
|
167
|
+
as working aliases. Outbox (`BaseOutboxModel`/`OutboxRelay`/
|
|
168
|
+
`save_with_outbox`) plugs its `publish` into `MessageBroker.publish`.
|
|
161
169
|
- **BR validators** — CPF/CNPJ/CEP/phone, with `*Field` Pydantic types
|
|
162
170
|
(`CPFField`/`CNPJField`/`CPFOrCNPJField`/`PhoneBRField`/`CEPField`;
|
|
163
171
|
pre-0.76 unsuffixed names kept as deprecated aliases).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tempest-fastapi-sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.93.0
|
|
4
4
|
Summary: Shared FastAPI building blocks: base schemas, ORM model, async repository, exceptions, pagination and settings — the conventions used across Tempest projects.
|
|
5
5
|
Project-URL: Homepage, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
|
|
6
6
|
Project-URL: Repository, https://github.com/mauriciobenjamin700/tempest-fastapi-sdk
|
|
@@ -160,8 +160,8 @@ The goal is to start every new backend with the same opinionated foundation alre
|
|
|
160
160
|
- [Redis cache (`AsyncRedisManager`)](#redis-cache-recipe)
|
|
161
161
|
- [Server-Sent Events (SSE)](#server-sent-events-recipe)
|
|
162
162
|
- [Web Push notifications](#web-push-notifications-recipe)
|
|
163
|
-
- [Message queues — FastStream (`
|
|
164
|
-
- [Background tasks — TaskIQ (`
|
|
163
|
+
- [Message queues — FastStream (`MessageBroker`)](#message-queues--faststream-recipe)
|
|
164
|
+
- [Background tasks — TaskIQ (`TaskQueue`)](#background-tasks--taskiq-recipe)
|
|
165
165
|
- [Periodic tasks scheduler (`AsyncTaskScheduler`)](#periodic-tasks-scheduler-recipe)
|
|
166
166
|
- [System metrics (`MetricsUtils`)](#system-metrics-recipe)
|
|
167
167
|
- [Programmatic server entry point (`run_server`)](#programmatic-server-entry-point-recipe)
|
|
@@ -218,8 +218,8 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
|
|
|
218
218
|
| `[cache]` | `redis` | `AsyncRedisManager` |
|
|
219
219
|
| `[webpush]` | `pywebpush`, `cryptography` | `WebPushDispatcher`, `WebPushSubscriptionService`, `BaseWebPushSubscriptionModel`, `make_web_push_router` |
|
|
220
220
|
| `[metrics]` | `psutil`, `nvidia-ml-py` | `MetricsUtils` |
|
|
221
|
-
| `[queue]` | `faststream[rabbit]` | `
|
|
222
|
-
| `[tasks]` | `taskiq`, `taskiq-aio-pika` | `
|
|
221
|
+
| `[queue]` | `faststream[rabbit]` | `MessageBroker` (typed FastStream facade) |
|
|
222
|
+
| `[tasks]` | `taskiq`, `taskiq-aio-pika` | `TaskQueue` (typed TaskIQ facade) |
|
|
223
223
|
| `[admin]` | `jinja2`, `itsdangerous` | `AdminSite`, `AdminModel`, `make_admin_router` |
|
|
224
224
|
| `[minio]` | `minio` | `AsyncMinIOClient`, `ObjectStat`, `MinIOSettings` |
|
|
225
225
|
| `[http]` | `httpx` | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, OAuth2 / OIDC providers |
|
|
@@ -262,17 +262,17 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
|
|
|
262
262
|
| `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
|
|
263
263
|
| `tempest_fastapi_sdk.flags` | `FeatureFlags`, `FeatureFlagBackend`, `MemoryFeatureFlagBackend`, `EnvFeatureFlagBackend`, `RedisFeatureFlagBackend`, `CompositeFeatureFlagBackend`, `make_flag_dependency`, `coerce_flag` |
|
|
264
264
|
| `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
|
|
265
|
-
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `
|
|
265
|
+
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); `AsyncBrokerManager` (legacy lifecycle wrapper) |
|
|
266
266
|
| `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient`, `ObjectStat` — async MinIO/S3 facade |
|
|
267
267
|
| `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
|
|
268
268
|
| `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
|
|
269
|
-
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `
|
|
269
|
+
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
|
|
270
270
|
| `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas` |
|
|
271
271
|
| `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN) |
|
|
272
272
|
| `tempest_fastapi_sdk.utils` | `to_utc`, `utcnow`, `modify_dict`, `LogUtils`, `AttemptThrottle`/`ThrottleBackend`/`ThrottleStatus`, `generate_opaque_token`/`hash_opaque_token`/`verify_opaque_token`, `get_client_ip`/`get_client_ip_from_scope`, `PasswordUtils` *(extra: `[auth]`)*, `JWTUtils` *(extra: `[auth]`)*, `TOTPHelper` *(extra: `[mfa]`)*, `EmailUtils` *(extra: `[email]`)*, `UploadUtils`/`sniff_mime` *(extra: `[upload]`)*, `DownloadUtils`/`build_content_disposition` *(no extra)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
|
|
273
273
|
| `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `version` / `--version` |
|
|
274
274
|
|
|
275
|
-
Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import
|
|
275
|
+
Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
|
|
276
276
|
|
|
277
277
|
---
|
|
278
278
|
|
|
@@ -2524,92 +2524,76 @@ async def broadcast(subs: list[WebPushSubscriptionSchema], payload: WebPushPaylo
|
|
|
2524
2524
|
|
|
2525
2525
|
### Message queues — FastStream recipe
|
|
2526
2526
|
|
|
2527
|
-
`
|
|
2527
|
+
`MessageBroker` is a typed, transport-agnostic facade over FastStream — you never import `faststream` in application code. Pick the transport with a constructor and address everything by a single **channel** string.
|
|
2528
2528
|
|
|
2529
|
-
Install with `[queue]` (pulls `faststream[rabbit]`).
|
|
2529
|
+
Install with `[queue]` (pulls `faststream[rabbit]`).
|
|
2530
2530
|
|
|
2531
2531
|
```python
|
|
2532
2532
|
# src/queue/__init__.py
|
|
2533
|
-
from faststream.rabbit import RabbitBroker
|
|
2534
2533
|
from pydantic import BaseModel
|
|
2535
2534
|
|
|
2536
|
-
from tempest_fastapi_sdk.queue import
|
|
2535
|
+
from tempest_fastapi_sdk.queue import MessageBroker
|
|
2537
2536
|
|
|
2538
2537
|
from src.core.settings import settings
|
|
2539
2538
|
|
|
2540
2539
|
|
|
2541
|
-
|
|
2542
|
-
queue = AsyncBrokerManager(broker)
|
|
2540
|
+
mq = MessageBroker.rabbitmq(settings.RABBITMQ_URL) # or .redis / .kafka / .nats
|
|
2543
2541
|
|
|
2544
2542
|
|
|
2545
|
-
class
|
|
2543
|
+
class OrderPaid(BaseModel):
|
|
2546
2544
|
order_id: str
|
|
2547
2545
|
user_id: str
|
|
2548
2546
|
|
|
2549
2547
|
|
|
2550
|
-
@
|
|
2551
|
-
async def handle_order_paid(
|
|
2552
|
-
await mark_order_paid(
|
|
2548
|
+
@mq.on("orders.paid") # consumer; type hint validates the message
|
|
2549
|
+
async def handle_order_paid(event: OrderPaid) -> None:
|
|
2550
|
+
await mark_order_paid(event.order_id, event.user_id)
|
|
2553
2551
|
|
|
2554
2552
|
|
|
2555
2553
|
# src/api/app.py lifespan
|
|
2556
|
-
await
|
|
2554
|
+
await mq.connect()
|
|
2557
2555
|
...
|
|
2558
|
-
await
|
|
2556
|
+
await mq.disconnect()
|
|
2559
2557
|
|
|
2560
2558
|
|
|
2561
|
-
# Publish from anywhere
|
|
2562
|
-
await
|
|
2559
|
+
# Publish from anywhere — channel first, message second
|
|
2560
|
+
await mq.publish("orders.paid", OrderPaid(order_id="abc", user_id="x"))
|
|
2563
2561
|
```
|
|
2564
2562
|
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
- `connect()` / `disconnect()` — idempotent; safe to call from FastAPI lifespan.
|
|
2568
|
-
- `publish(message, *args, **kwargs)` — passthrough to `broker.publish` with a `RuntimeError` guard when the broker isn't started.
|
|
2569
|
-
- `lifespan()` — async context manager handling start/stop, handy for short scripts.
|
|
2570
|
-
- `broker_dependency` — FastAPI `Depends` that yields the live broker.
|
|
2571
|
-
- `health_check()` / `is_connected` — true while the broker is started.
|
|
2572
|
-
|
|
2573
|
-
Wire it on the health router with `make_health_router(checks={"queue": queue.health_check})`.
|
|
2563
|
+
`@mq.on(channel)` declares a consumer (the handler's Pydantic type hint validates each message); `publish(channel, message)` sends it. Lifecycle is `connect()` / `disconnect()` / `lifespan()` / `health_check()` / `is_connected`; the raw broker stays at `mq.broker`. Wire it on the health router with `make_health_router(checks={"queue": mq.health_check})`. See the [Queues and Tasks recipe](https://mauriciobenjamin700.github.io/tempest-fastapi-sdk/recipes/queue-tasks/) for the full guide.
|
|
2574
2564
|
|
|
2575
2565
|
### Background tasks — TaskIQ recipe
|
|
2576
2566
|
|
|
2577
|
-
`
|
|
2567
|
+
`TaskQueue` is a typed facade over TaskIQ (broker + scheduler in one object) — no `taskiq` import in application code. Install with `[tasks]` (pulls `taskiq` + `taskiq-aio-pika`).
|
|
2578
2568
|
|
|
2579
2569
|
```python
|
|
2580
2570
|
# src/tasks/__init__.py
|
|
2581
|
-
from
|
|
2582
|
-
|
|
2583
|
-
from tempest_fastapi_sdk.tasks import AsyncTaskBrokerManager
|
|
2571
|
+
from tempest_fastapi_sdk.tasks import TaskQueue
|
|
2584
2572
|
|
|
2585
2573
|
from src.core.settings import settings
|
|
2586
2574
|
|
|
2587
2575
|
|
|
2588
|
-
|
|
2576
|
+
tq = TaskQueue.rabbitmq(settings.TASKIQ_BROKER_URL) # or .redis / .memory (tests)
|
|
2589
2577
|
|
|
2590
2578
|
|
|
2591
|
-
@
|
|
2579
|
+
@tq.task
|
|
2592
2580
|
async def send_welcome_email(to: str, name: str) -> None:
|
|
2593
|
-
await email_utils.send(
|
|
2594
|
-
to=to,
|
|
2595
|
-
subject="Bem-vindo!",
|
|
2596
|
-
body=f"Olá, {name} — sua conta foi criada.",
|
|
2597
|
-
)
|
|
2581
|
+
await email_utils.send(to=to, subject="Welcome!", body=f"Hi, {name}.")
|
|
2598
2582
|
|
|
2599
2583
|
|
|
2600
2584
|
# src/api/app.py lifespan
|
|
2601
|
-
await
|
|
2585
|
+
await tq.connect()
|
|
2602
2586
|
...
|
|
2603
|
-
await
|
|
2587
|
+
await tq.disconnect()
|
|
2604
2588
|
|
|
2605
2589
|
|
|
2606
|
-
#
|
|
2607
|
-
await send_welcome_email.
|
|
2590
|
+
# From a request handler: hand it to a worker and return immediately
|
|
2591
|
+
await send_welcome_email.enqueue(to=user.email, name=user.name)
|
|
2592
|
+
# In tests / reuse: run the body inline and get the real value back
|
|
2593
|
+
await send_welcome_email.run(to="a@b.com", name="Ana")
|
|
2608
2594
|
```
|
|
2609
2595
|
|
|
2610
|
-
`
|
|
2611
|
-
|
|
2612
|
-
The same lifespan guard rails as the queue manager apply: `connect()`/`disconnect()`/`lifespan()`/`broker_dependency`/`health_check()`/`is_connected`.
|
|
2596
|
+
`@tq.task` returns a typed `Task` with `enqueue()` (to a worker) and `run()` (inline, no broker). Periodic tasks live on the same object via `@tq.cron(...)` / `@tq.interval(...)`; `tq.broker` / `tq.scheduler` feed the standalone `taskiq worker` / `taskiq scheduler` CLIs. `TaskQueue.memory()` runs tasks synchronously in-process for tests.
|
|
2613
2597
|
|
|
2614
2598
|
### Periodic tasks scheduler recipe
|
|
2615
2599
|
|
|
@@ -51,8 +51,8 @@ The goal is to start every new backend with the same opinionated foundation alre
|
|
|
51
51
|
- [Redis cache (`AsyncRedisManager`)](#redis-cache-recipe)
|
|
52
52
|
- [Server-Sent Events (SSE)](#server-sent-events-recipe)
|
|
53
53
|
- [Web Push notifications](#web-push-notifications-recipe)
|
|
54
|
-
- [Message queues — FastStream (`
|
|
55
|
-
- [Background tasks — TaskIQ (`
|
|
54
|
+
- [Message queues — FastStream (`MessageBroker`)](#message-queues--faststream-recipe)
|
|
55
|
+
- [Background tasks — TaskIQ (`TaskQueue`)](#background-tasks--taskiq-recipe)
|
|
56
56
|
- [Periodic tasks scheduler (`AsyncTaskScheduler`)](#periodic-tasks-scheduler-recipe)
|
|
57
57
|
- [System metrics (`MetricsUtils`)](#system-metrics-recipe)
|
|
58
58
|
- [Programmatic server entry point (`run_server`)](#programmatic-server-entry-point-recipe)
|
|
@@ -109,8 +109,8 @@ Feature-rich helpers pull in third-party dependencies that you only need when yo
|
|
|
109
109
|
| `[cache]` | `redis` | `AsyncRedisManager` |
|
|
110
110
|
| `[webpush]` | `pywebpush`, `cryptography` | `WebPushDispatcher`, `WebPushSubscriptionService`, `BaseWebPushSubscriptionModel`, `make_web_push_router` |
|
|
111
111
|
| `[metrics]` | `psutil`, `nvidia-ml-py` | `MetricsUtils` |
|
|
112
|
-
| `[queue]` | `faststream[rabbit]` | `
|
|
113
|
-
| `[tasks]` | `taskiq`, `taskiq-aio-pika` | `
|
|
112
|
+
| `[queue]` | `faststream[rabbit]` | `MessageBroker` (typed FastStream facade) |
|
|
113
|
+
| `[tasks]` | `taskiq`, `taskiq-aio-pika` | `TaskQueue` (typed TaskIQ facade) |
|
|
114
114
|
| `[admin]` | `jinja2`, `itsdangerous` | `AdminSite`, `AdminModel`, `make_admin_router` |
|
|
115
115
|
| `[minio]` | `minio` | `AsyncMinIOClient`, `ObjectStat`, `MinIOSettings` |
|
|
116
116
|
| `[http]` | `httpx` | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, OAuth2 / OIDC providers |
|
|
@@ -153,17 +153,17 @@ Since `0.7.1` every optional dependency is imported lazily at first instantiatio
|
|
|
153
153
|
| `tempest_fastapi_sdk.cache` *(extra: `[cache]`)* | `AsyncRedisManager`, `cached` (with `namespace` / `tags`), `CacheInvalidator`, `namespace_registry_key`, `tag_registry_key` |
|
|
154
154
|
| `tempest_fastapi_sdk.flags` | `FeatureFlags`, `FeatureFlagBackend`, `MemoryFeatureFlagBackend`, `EnvFeatureFlagBackend`, `RedisFeatureFlagBackend`, `CompositeFeatureFlagBackend`, `make_flag_dependency`, `coerce_flag` |
|
|
155
155
|
| `tempest_fastapi_sdk.webpush` *(extra: `[webpush]`)* | `WebPushDispatcher`, `WebPushSubscriptionService`, `make_web_push_router`, `WebPushError`, `WebPushGoneError`, `WebPushSubscriptionSchema`, `WebPushKeysSchema`, `WebPushPayloadSchema` |
|
|
156
|
-
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `
|
|
156
|
+
| `tempest_fastapi_sdk.queue` *(extra: `[queue]`)* | `MessageBroker` (typed, transport-agnostic FastStream facade — `.rabbitmq`/`.redis`/`.kafka`/`.nats`, `@mq.on(channel)`, channel-first `publish`); `AsyncBrokerManager` (legacy lifecycle wrapper) |
|
|
157
157
|
| `tempest_fastapi_sdk.storage` *(extra: `[minio]`)* | `AsyncMinIOClient`, `ObjectStat` — async MinIO/S3 facade |
|
|
158
158
|
| `tempest_fastapi_sdk.utils.http_client` *(extra: `[http]`)* | `HTTPClient`, `RetryPolicy`, `CircuitOpenError`, `REQUEST_ID_HEADER` — typed httpx wrapper |
|
|
159
159
|
| `tempest_fastapi_sdk.utils.storage_backends` *(extra: `[upload]`)* | `UploadStorage` protocol, `LocalUploadStorage`, `MinIOUploadStorage`, `UploadResult`, `ContentValidator` |
|
|
160
|
-
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `
|
|
160
|
+
| `tempest_fastapi_sdk.tasks` *(extra: `[tasks]`)* | `TaskQueue` (typed TaskIQ facade — `.rabbitmq`/`.redis`/`.memory`, `@tq.task` → `Task.enqueue`/`.run`, `@tq.cron`/`@tq.interval`, `start_scheduler`), `Task`; `AsyncTaskBrokerManager` / `AsyncTaskScheduler` (legacy wrappers) |
|
|
161
161
|
| `tempest_fastapi_sdk.vision` *(extra: `[vision]`)* | `Detector`, `Classifier`, `Segmenter` (ONNX, lazy), `DetectionSchema`/`ClassificationSchema`/`SegmentationSchema`/`BoundingBoxSchema`/`ClassProbabilitySchema`, `to_detection_schemas`/`to_classification_schema`/`to_segmentation_schemas` |
|
|
162
162
|
| `tempest_fastapi_sdk.ssr` *(extra: `[ssr]`)* | `Page` (typed component base), `html_response` (widget tree → `HTMLResponse`, full document or HTMX fragment), `make_htmx_router` (serves bundled HTMX locally, no CDN) |
|
|
163
163
|
| `tempest_fastapi_sdk.utils` | `to_utc`, `utcnow`, `modify_dict`, `LogUtils`, `AttemptThrottle`/`ThrottleBackend`/`ThrottleStatus`, `generate_opaque_token`/`hash_opaque_token`/`verify_opaque_token`, `get_client_ip`/`get_client_ip_from_scope`, `PasswordUtils` *(extra: `[auth]`)*, `JWTUtils` *(extra: `[auth]`)*, `TOTPHelper` *(extra: `[mfa]`)*, `EmailUtils` *(extra: `[email]`)*, `UploadUtils`/`sniff_mime` *(extra: `[upload]`)*, `DownloadUtils`/`build_content_disposition` *(no extra)*, `FileStoreUtils` — unified upload+download+presign facade *(extra: `[upload]` local / `[minio]` MinIO)*, `MetricsUtils`/`CPUMetrics`/`MemoryMetrics`/`DiskMetrics`/`GPUMetrics`/`SystemMetrics` *(extra: `[metrics]`)*, validated field types (`PositiveIntField`, `NonNegativeIntField`, `CentsField`, `PortField`, `PositiveFloatField`, `NonNegativeFloatField`, `PercentField`, `RatioField`, `LatitudeField`, `LongitudeField`, `PriceField`, `NonEmptyStrField`, `SlugField`, `HexColorField`), BR regex helpers (`CPFField`, `CNPJField`, `CPFOrCNPJField`, `PhoneBRField`, `CEPField` — old names without the suffix kept as deprecated aliases — `is_valid_*`, `normalize_*`, `only_digits`, `*_PATTERN`), BR states/cities (`UF`, `Region`, `StateBR`, `CityBR`, `ChoiceBR`, `UFField`, `CityNameField`, `list_states`, `get_state`, `cities_by_uf`, `states_by_region`, `uf_choices`/`region_choices`/`city_choices`, `is_valid_uf`/`normalize_uf`, `is_valid_city`/`normalize_city`) |
|
|
164
164
|
| `tempest_fastapi_sdk.cli` | `tempest` console script — `new <name>` (scaffold layered service), `lint` / `format` / `fmt-check` / `type` / `test` / `check` (run preferred quality gates), `version` / `--version` |
|
|
165
165
|
|
|
166
|
-
Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import
|
|
166
|
+
Core primitives are re-exported from `tempest_fastapi_sdk` at the top level — `from tempest_fastapi_sdk import BaseModel, BaseRepository, AppException` always works. The extras-gated managers in `tempest_fastapi_sdk.cache`, `tempest_fastapi_sdk.queue`, `tempest_fastapi_sdk.tasks`, `tempest_fastapi_sdk.vision` and `tempest_fastapi_sdk.ssr` must be imported from their own submodule (`from tempest_fastapi_sdk.queue import MessageBroker`).
|
|
167
167
|
|
|
168
168
|
---
|
|
169
169
|
|
|
@@ -2415,92 +2415,76 @@ async def broadcast(subs: list[WebPushSubscriptionSchema], payload: WebPushPaylo
|
|
|
2415
2415
|
|
|
2416
2416
|
### Message queues — FastStream recipe
|
|
2417
2417
|
|
|
2418
|
-
`
|
|
2418
|
+
`MessageBroker` is a typed, transport-agnostic facade over FastStream — you never import `faststream` in application code. Pick the transport with a constructor and address everything by a single **channel** string.
|
|
2419
2419
|
|
|
2420
|
-
Install with `[queue]` (pulls `faststream[rabbit]`).
|
|
2420
|
+
Install with `[queue]` (pulls `faststream[rabbit]`).
|
|
2421
2421
|
|
|
2422
2422
|
```python
|
|
2423
2423
|
# src/queue/__init__.py
|
|
2424
|
-
from faststream.rabbit import RabbitBroker
|
|
2425
2424
|
from pydantic import BaseModel
|
|
2426
2425
|
|
|
2427
|
-
from tempest_fastapi_sdk.queue import
|
|
2426
|
+
from tempest_fastapi_sdk.queue import MessageBroker
|
|
2428
2427
|
|
|
2429
2428
|
from src.core.settings import settings
|
|
2430
2429
|
|
|
2431
2430
|
|
|
2432
|
-
|
|
2433
|
-
queue = AsyncBrokerManager(broker)
|
|
2431
|
+
mq = MessageBroker.rabbitmq(settings.RABBITMQ_URL) # or .redis / .kafka / .nats
|
|
2434
2432
|
|
|
2435
2433
|
|
|
2436
|
-
class
|
|
2434
|
+
class OrderPaid(BaseModel):
|
|
2437
2435
|
order_id: str
|
|
2438
2436
|
user_id: str
|
|
2439
2437
|
|
|
2440
2438
|
|
|
2441
|
-
@
|
|
2442
|
-
async def handle_order_paid(
|
|
2443
|
-
await mark_order_paid(
|
|
2439
|
+
@mq.on("orders.paid") # consumer; type hint validates the message
|
|
2440
|
+
async def handle_order_paid(event: OrderPaid) -> None:
|
|
2441
|
+
await mark_order_paid(event.order_id, event.user_id)
|
|
2444
2442
|
|
|
2445
2443
|
|
|
2446
2444
|
# src/api/app.py lifespan
|
|
2447
|
-
await
|
|
2445
|
+
await mq.connect()
|
|
2448
2446
|
...
|
|
2449
|
-
await
|
|
2447
|
+
await mq.disconnect()
|
|
2450
2448
|
|
|
2451
2449
|
|
|
2452
|
-
# Publish from anywhere
|
|
2453
|
-
await
|
|
2450
|
+
# Publish from anywhere — channel first, message second
|
|
2451
|
+
await mq.publish("orders.paid", OrderPaid(order_id="abc", user_id="x"))
|
|
2454
2452
|
```
|
|
2455
2453
|
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
- `connect()` / `disconnect()` — idempotent; safe to call from FastAPI lifespan.
|
|
2459
|
-
- `publish(message, *args, **kwargs)` — passthrough to `broker.publish` with a `RuntimeError` guard when the broker isn't started.
|
|
2460
|
-
- `lifespan()` — async context manager handling start/stop, handy for short scripts.
|
|
2461
|
-
- `broker_dependency` — FastAPI `Depends` that yields the live broker.
|
|
2462
|
-
- `health_check()` / `is_connected` — true while the broker is started.
|
|
2463
|
-
|
|
2464
|
-
Wire it on the health router with `make_health_router(checks={"queue": queue.health_check})`.
|
|
2454
|
+
`@mq.on(channel)` declares a consumer (the handler's Pydantic type hint validates each message); `publish(channel, message)` sends it. Lifecycle is `connect()` / `disconnect()` / `lifespan()` / `health_check()` / `is_connected`; the raw broker stays at `mq.broker`. Wire it on the health router with `make_health_router(checks={"queue": mq.health_check})`. See the [Queues and Tasks recipe](https://mauriciobenjamin700.github.io/tempest-fastapi-sdk/recipes/queue-tasks/) for the full guide.
|
|
2465
2455
|
|
|
2466
2456
|
### Background tasks — TaskIQ recipe
|
|
2467
2457
|
|
|
2468
|
-
`
|
|
2458
|
+
`TaskQueue` is a typed facade over TaskIQ (broker + scheduler in one object) — no `taskiq` import in application code. Install with `[tasks]` (pulls `taskiq` + `taskiq-aio-pika`).
|
|
2469
2459
|
|
|
2470
2460
|
```python
|
|
2471
2461
|
# src/tasks/__init__.py
|
|
2472
|
-
from
|
|
2473
|
-
|
|
2474
|
-
from tempest_fastapi_sdk.tasks import AsyncTaskBrokerManager
|
|
2462
|
+
from tempest_fastapi_sdk.tasks import TaskQueue
|
|
2475
2463
|
|
|
2476
2464
|
from src.core.settings import settings
|
|
2477
2465
|
|
|
2478
2466
|
|
|
2479
|
-
|
|
2467
|
+
tq = TaskQueue.rabbitmq(settings.TASKIQ_BROKER_URL) # or .redis / .memory (tests)
|
|
2480
2468
|
|
|
2481
2469
|
|
|
2482
|
-
@
|
|
2470
|
+
@tq.task
|
|
2483
2471
|
async def send_welcome_email(to: str, name: str) -> None:
|
|
2484
|
-
await email_utils.send(
|
|
2485
|
-
to=to,
|
|
2486
|
-
subject="Bem-vindo!",
|
|
2487
|
-
body=f"Olá, {name} — sua conta foi criada.",
|
|
2488
|
-
)
|
|
2472
|
+
await email_utils.send(to=to, subject="Welcome!", body=f"Hi, {name}.")
|
|
2489
2473
|
|
|
2490
2474
|
|
|
2491
2475
|
# src/api/app.py lifespan
|
|
2492
|
-
await
|
|
2476
|
+
await tq.connect()
|
|
2493
2477
|
...
|
|
2494
|
-
await
|
|
2478
|
+
await tq.disconnect()
|
|
2495
2479
|
|
|
2496
2480
|
|
|
2497
|
-
#
|
|
2498
|
-
await send_welcome_email.
|
|
2481
|
+
# From a request handler: hand it to a worker and return immediately
|
|
2482
|
+
await send_welcome_email.enqueue(to=user.email, name=user.name)
|
|
2483
|
+
# In tests / reuse: run the body inline and get the real value back
|
|
2484
|
+
await send_welcome_email.run(to="a@b.com", name="Ana")
|
|
2499
2485
|
```
|
|
2500
2486
|
|
|
2501
|
-
`
|
|
2502
|
-
|
|
2503
|
-
The same lifespan guard rails as the queue manager apply: `connect()`/`disconnect()`/`lifespan()`/`broker_dependency`/`health_check()`/`is_connected`.
|
|
2487
|
+
`@tq.task` returns a typed `Task` with `enqueue()` (to a worker) and `run()` (inline, no broker). Periodic tasks live on the same object via `@tq.cron(...)` / `@tq.interval(...)`; `tq.broker` / `tq.scheduler` feed the standalone `taskiq worker` / `taskiq scheduler` CLIs. `TaskQueue.memory()` runs tasks synchronously in-process for tests.
|
|
2504
2488
|
|
|
2505
2489
|
### Periodic tasks scheduler recipe
|
|
2506
2490
|
|
|
@@ -144,7 +144,7 @@ Pick what fits. None of these are required.
|
|
|
144
144
|
`TASKIQ_*` fields out of the project's `Settings` and onto the
|
|
145
145
|
matching SDK mixin ([Settings mixins composition](recipes/http.md#settings-mixins-composition)).
|
|
146
146
|
- Adopt the
|
|
147
|
-
[`Outbox
|
|
147
|
+
[`Outbox`](recipes/outbox.md) if
|
|
148
148
|
you already write side-effects from the same transaction as your
|
|
149
149
|
domain rows.
|
|
150
150
|
|
|
@@ -144,7 +144,7 @@ Escolha o que se encaixa. Nenhum deles é obrigatório.
|
|
|
144
144
|
`TASKIQ_*` do `Settings` do projeto para o mixin correspondente do
|
|
145
145
|
SDK ([Composição de mixins de settings](recipes/http.md#composicao-de-mixins-de-settings)).
|
|
146
146
|
- Adote o
|
|
147
|
-
[`
|
|
147
|
+
[`Outbox`](recipes/outbox.md) se
|
|
148
148
|
você já escreve efeitos colaterais a partir da mesma transação que
|
|
149
149
|
grava as linhas de domínio.
|
|
150
150
|
|